commit aacfffbbc102ea7fa9646db60c3a2d17963c200a Author: wzgaoyn Date: Tue Mar 18 17:23:25 2025 +0800 出事提交 diff --git a/db/2023-08-23.sql b/db/2023-08-23.sql new file mode 100644 index 0000000..ae5c3e2 --- /dev/null +++ b/db/2023-08-23.sql @@ -0,0 +1,3 @@ +USE mall4cloud_job; +insert into `xxl_job_info` (`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, `trigger_last_time`, `trigger_next_time`) +values(11,'解锁sku库存','2023-08-18 14:30:19','2023-08-23 11:03:25','admin','','CRON','0 5 0 * * ?','DO_NOTHING','FIRST','unLockOrderSkuStock','','SERIAL_EXECUTION','0','0','BEAN','','GLUE代码初始化','2023-08-18 14:30:19','','1','0','1692806700000'); diff --git a/db/2023-09-04 电子面单.sql b/db/2023-09-04 电子面单.sql new file mode 100644 index 0000000..6c608cb --- /dev/null +++ b/db/2023-09-04 电子面单.sql @@ -0,0 +1,96 @@ +#电子面单新建表 +USE `mall4cloud_order`; + +/*Table structure for table `outlet_config` */ + +DROP TABLE IF EXISTS `outlet_config`; + +CREATE TABLE `outlet_config` ( + `outlet_config_id` bigint NOT NULL AUTO_INCREMENT COMMENT '网点配置id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `supplier_id` bigint DEFAULT NULL COMMENT '供应商id', + `delivery_company_type` tinyint NOT NULL COMMENT '快递公司类型', + `shop_addr_id` bigint DEFAULT NULL COMMENT '发货地址id', + `shipper` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发货人', + `mobile` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发货人电话', + `partner_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '电子面单客户账户或月结账号', + `partner_key` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '电子面单密码', + `net` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '收件网点名称', + `paper_size` tinyint DEFAULT '1' COMMENT '纸张规格 1.一联面单 2.二联面单', + `is_default` tinyint NOT NULL DEFAULT '0' COMMENT '是否默认 0否1是', + PRIMARY KEY (`outlet_config_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网点配置'; + + +/*Table structure for table `printer` */ + +DROP TABLE IF EXISTS `printer`; + +CREATE TABLE `printer` ( + `printer_id` bigint NOT NULL AUTO_INCREMENT COMMENT '打印机id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `shop_id` bigint DEFAULT NULL COMMENT '店铺id', + `supplier_id` bigint DEFAULT NULL COMMENT '供应商id', + `printer_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '打印机名称', + `siid` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '设备码', + `printer_remark` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '打印机备注', + `is_default` tinyint DEFAULT '0' COMMENT '是否默认 0否1是', + PRIMARY KEY (`printer_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='打印机'; + +USE mall4cloud_admin; +# 快递100增加secret, isPrint, printReqUrl配置 +UPDATE sys_config SET param_value = REPLACE(param_value,'","key":','","secret":"","isPrint":false,"mock":false,"printReqUrl":"https://api.kuaidi100.com/label/order","key":') +WHERE param_key = 'QUICK100_CONFIG'; + +USE mall4cloud_auth; +-- 菜单SQL +# 371为商家端系统菜单id +insert into `menu`(`menu_id`,`create_time`,`update_time`,`parent_id`,`biz_type`,`permission`,`path`,`component`,`redirect`,`always_show`,`hidden`,`name`,`title`,`icon`,`no_cache`,`breadcrumb`,`affix`,`active_menu`,`seq`) values +(647,'2023-08-28 14:36:57','2023-08-28 14:36:57',371,1,NULL,'/system/delivery-manager','system/delivery-manager',NULL,NULL,0,'发货管理','发货管理','',NULL,NULL,NULL,NULL,4), +(648,'2023-08-28 14:37:51','2023-08-28 14:37:51',647,1,NULL,'outlet-config/index','system/delivery-manager/outlet-config/index',NULL,NULL,0,'网点管理','网点管理','',NULL,NULL,NULL,NULL,0), +(649,'2023-08-28 14:38:33','2023-08-28 14:38:33',647,1,NULL,'printer/index','system/delivery-manager/printer/index',NULL,NULL,0,'硬件设备','硬件设备','',NULL,NULL,NULL,NULL,1), +(650,'2023-08-29 15:28:06','2023-08-29 15:28:06',255,2,NULL,'addr','platform/addr',NULL,NULL,0,'发货地址','发货地址','',NULL,NULL,NULL,NULL,7), +(651,'2023-08-29 15:29:38','2023-08-29 15:29:38',166,2,NULL,'/system/delivery-manager','system/delivery-manager',NULL,NULL,0,'发货管理','发货管理','',NULL,NULL,NULL,NULL,4), +(652,'2023-08-29 15:30:10','2023-08-29 16:14:37',651,2,NULL,'outlet-config/index','system/delivery-manager/outlet-config/index',NULL,NULL,0,'网点管理','网点管理','',NULL,NULL,NULL,NULL,0), +(653,'2023-08-29 15:31:35','2023-08-29 16:16:32',651,2,NULL,'printer/index','system/delivery-manager/printer/index',NULL,NULL,0,'硬件设备','硬件设备','',NULL,NULL,NULL,NULL,1), +(654,'2023-08-29 15:33:24','2023-08-29 15:33:24',461,3,NULL,'/setting/delivery-manager','setting/delivery-manager',NULL,NULL,0,'发货管理','发货管理','',NULL,NULL,NULL,NULL,4), +(655,'2023-08-29 15:34:04','2023-08-30 17:22:24',654,3,NULL,'outlet-config/index','setting/delivery-manager/outlet-config/index',NULL,NULL,0,'网点管理','网点管理','',NULL,NULL,NULL,NULL,0), +(656,'2023-08-29 15:34:35','2023-08-30 17:22:09',654,3,NULL,'printer/index','setting/delivery-manager/printer/index',NULL,NULL,0,'硬件设备','硬件设备','',NULL,NULL,NULL,NULL,1); + +update `menu` set `name` = '商家地址库', `title` = '商家地址库' where `component` = 'shop/refund-addr'; + +insert into `menu_permission` (`menu_permission_id`, `create_time`, `update_time`, `menu_id`, `biz_type`, `permission`, `name`, `uri`, `method`) values +(635,'2023-08-29 15:59:11','2023-08-29 15:59:11',648,1,'shop:outletConfig:save','新增','/mp/outlet_config',2), +(636,'2023-08-29 15:59:36','2023-08-29 15:59:36',648,1,'shop:outletConfig:update','编辑','/mp/outlet_config',3), +(637,'2023-08-29 15:59:53','2023-08-29 15:59:53',648,1,'shop:outletConfig:delete','删除','/mp/outlet_config',4), +(638,'2023-08-29 16:00:30','2023-08-29 16:00:30',648,1,'shop:outletConfig:paperSize','纸张规格','/mp/outlet_config',3), +(639,'2023-08-29 16:01:09','2023-08-29 16:01:09',648,1,'shop:outletConfig:setDefault','设为默认','/mp/outlet_config/set_default',3), +(640,'2023-08-29 16:01:38','2023-08-29 16:01:38',649,1,'shop:printer:save','新增','/mp/printer',2), +(641,'2023-08-29 16:01:57','2023-08-29 16:01:57',649,1,'shop:printer:update','编辑','/mp/printer',3), +(642,'2023-08-29 16:02:10','2023-08-29 16:02:10',649,1,'shop:printer:delete','删除','/mp/printer',4), +(643,'2023-08-29 16:02:39','2023-08-29 16:02:39',649,1,'shop:printer:setDefault','设为默认','/mp/printer/set_default',3), +(653,'2023-08-29 15:59:11','2023-08-29 16:06:24',652,2,'platform:outletConfig:save','新增','/mp/outlet_config',2), +(654,'2023-08-29 15:59:36','2023-08-29 16:06:26',652,2,'platform:outletConfig:update','编辑','/mp/outlet_config',3), +(655,'2023-08-29 15:59:53','2023-08-29 16:06:28',652,2,'platform:outletConfig:delete','删除','/mp/outlet_config',4), +(656,'2023-08-29 16:00:30','2023-08-29 16:06:31',652,2,'platform:outletConfig:paperSize','纸张规格','/mp/outlet_config',3), +(657,'2023-08-29 16:01:09','2023-08-29 16:06:34',652,2,'platform:outletConfig:setDefault','设为默认','/mp/outlet_config/set_default',3), +(658,'2023-08-29 16:01:38','2023-08-29 16:06:37',653,2,'platform:printer:save','新增','/mp/printer',2), +(659,'2023-08-29 16:01:57','2023-08-29 16:06:38',653,2,'platform:printer:update','编辑','/mp/printer',3), +(660,'2023-08-29 16:02:10','2023-08-29 16:06:41',653,2,'platform:printer:delete','删除','/mp/printer',4), +(661,'2023-08-29 16:02:39','2023-08-29 16:06:43',653,2,'platform:printer:setDefault','设为默认','/mp/printer/set_default',3), +(662,'2023-08-29 15:59:11','2023-08-29 16:06:50',655,3,'supplier:outletConfig:save','新增','/s/outlet_config',2), +(663,'2023-08-29 15:59:36','2023-08-29 16:06:51',655,3,'supplier:outletConfig:update','编辑','/s/outlet_config',3), +(664,'2023-08-29 15:59:53','2023-08-29 16:06:53',655,3,'supplier:outletConfig:delete','删除','/s/outlet_config',4), +(665,'2023-08-29 16:00:30','2023-08-29 16:06:55',655,3,'supplier:outletConfig:paperSize','纸张规格','/s/outlet_config',3), +(666,'2023-08-29 16:01:09','2023-08-29 16:06:57',655,3,'supplier:outletConfig:setDefault','设为默认','/s/outlet_config/set_default',3), +(667,'2023-08-29 16:01:38','2023-08-29 16:06:59',656,3,'supplier:printer:save','新增','/s/printer',2), +(668,'2023-08-29 16:01:57','2023-08-29 16:07:01',656,3,'supplier:printer:update','编辑','/s/printer',3), +(669,'2023-08-29 16:02:10','2023-08-29 16:07:02',656,3,'supplier:printer:delete','删除','/s/printer',4), +(670,'2023-08-29 16:02:39','2023-08-29 16:07:03',656,3,'supplier:printer:setDefault','设为默认','/s/printer/set_default',3), +(671,'2022-08-05 11:35:13','2022-08-05 11:35:13',650,2,'platform:shopAddr:delete','删除','/mp/shop_refund_addr',4), +(672,'2022-08-05 11:35:46','2022-08-05 11:35:46',650,2,'platform:shopAddr:update','编辑','/mp/shop_refund_addr',3), +(673,'2022-08-05 11:36:28','2022-08-05 11:36:28',650,2,'platform:shopAddr:save','新建','/mp/shop_refund_addr',2); \ No newline at end of file diff --git a/db/2023-09-05 订单退款详情菜单修改.sql b/db/2023-09-05 订单退款详情菜单修改.sql new file mode 100644 index 0000000..d6c9dce --- /dev/null +++ b/db/2023-09-05 订单退款详情菜单修改.sql @@ -0,0 +1,5 @@ +# 其中372是店铺订单管理,475是供应商订单管理,170是平台订单管理 +insert into `menu`(`menu_id`,`create_time`,`update_time`,`parent_id`,`biz_type`,`permission`,`path`,`component`,`redirect`,`always_show`,`hidden`,`name`,`title`,`icon`,`no_cache`,`breadcrumb`,`affix`,`active_menu`,`seq`) values +(662,'2023-08-31 17:36:13','2023-08-31 17:36:13','372','1',NULL,'refund-order-info','order/order-manage/refund-order-info',NULL,NULL,'1','refund-info','退款详情','',NULL,NULL,NULL,NULL,'5'), +(661,'2023-08-31 17:22:42','2023-08-31 17:23:56','475','3',NULL,'refund-order-info','order/order-manage/refund-order-info',NULL,NULL,'1','refund-info','退款详情','',NULL,NULL,NULL,NULL,'5'), +(660,'2023-08-31 13:33:30','2023-08-31 13:33:30','170','2',NULL,'refund-order-info','order/refund-order-info',NULL,NULL,'1','order-refund-info','退款详情','',NULL,NULL,NULL,NULL,'0'); diff --git a/db/2023-09-11 支付宝退款回调,发放退款定时任务.sql b/db/2023-09-11 支付宝退款回调,发放退款定时任务.sql new file mode 100644 index 0000000..49a5c74 --- /dev/null +++ b/db/2023-09-11 支付宝退款回调,发放退款定时任务.sql @@ -0,0 +1,256 @@ +USE mall4cloud_job; +INSERT INTO `xxl_job_info`(`job_group`,`job_desc`,`add_time`,`update_time`,`author`,`alarm_email`,`schedule_type`,`schedule_conf`,`misfire_strategy`,`executor_route_strategy`,`executor_handler`,`executor_param`,`executor_block_strategy`,`executor_timeout`,`executor_fail_retry_count`,`glue_type`,`glue_source`,`glue_remark`,`glue_updatetime`,`child_jobid`,`trigger_status`,`trigger_last_time`,`trigger_next_time`) VALUES +(2,'发放退款','2023-09-07 09:16:24','2023-09-07 11:35:33','admin','','CRON','0 0/1 * * * ?','DO_NOTHING','FIRST','refundRequest','','SERIAL_EXECUTION',0,0,'BEAN','','GLUE代码初始化','2023-09-07 09:16:24','',1,1694068500000,1694068560000), +(2,'支付宝退款订单查单','2023-09-07 09:16:50','2023-09-07 11:15:16','admin','','CRON','0 0/1 * * * ?','DO_NOTHING','FIRST','updateAliPayRefundStatus','','SERIAL_EXECUTION',0,0,'BEAN','','GLUE代码初始化','2023-09-07 09:16:50','',1,1694068500000,1694068560000); + + + +# 订单支付记录添加支付的系统类型字段 + +USE mall4cloud_payment_0; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +USE mall4cloud_payment_1; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +USE mall4cloud_payment_2; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +USE mall4cloud_payment_3; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +USE mall4cloud_payment_4; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +USE mall4cloud_payment_5; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +USE mall4cloud_payment_6; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +USE mall4cloud_payment_7; + +DELIMITER // +DROP PROCEDURE + IF + EXISTS createTable // CREATE PROCEDURE createTable () BEGIN + DECLARE +i INT; + + SET i = 0; + WHILE +i < 64 DO + + SET @set_pay_info_id = CONCAT( 'ALTER TABLE pay_info_', i, " ADD COLUMN `system_model` tinyint DEFAULT NULL COMMENT '支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios' + " ); +PREPARE set_pay_info_id + FROM + @set_pay_info_id; +EXECUTE set_pay_info_id; + +SET i = i + 1; + +END WHILE; + +END // CALL createTable ()// + +DELIMITER; + +# 添加微信发货配置 +USE mall4cloud_admin; + +INSERT INTO `sys_config`(`create_time`, `update_time`, `param_key`, `param_value`, `remark`) VALUES ('2023-01-31 09:16:47', '2023-09-08 15:51:23', 'WECHAT_SHIPPING_CONFIG', '{\"wechatShippingAudit\":false}', '微信发货配置'); + + +USE `mall4cloud_leaf`; +INSERT INTO leaf_alloc ( biz_tag, max_id, step, update_time, description, random_step ) +VALUE ( 'mall4cloud-purchase-amount-log', 1, 1000, NOW(), '采购金额日志id', 10 ); + +# 采购金额日志菜单补充 +USE `mall4cloud_auth`; +# menu_id=322, 464分别为商家和供应的'店铺结算' +DELETE FROM `menu` WHERE `menu_id` IN (322, 464); + +INSERT INTO `menu`(`menu_id`, `create_time`, `update_time`, `parent_id`, `biz_type`, `permission`, `path`, `component`, `redirect`, `always_show`, `hidden`, `name`, `title`, `icon`, `no_cache`, `breadcrumb`, `affix`, `active_menu`, `seq`) +VALUES + (663, '2023-08-31 16:36:36', '2023-09-01 15:30:48', 0, 1, NULL, '/finance', 'Layout', NULL, NULL, 0, '财务', '财务', 'financial', NULL, NULL, NULL, NULL, 10), + (664, '2023-08-31 16:37:06', '2023-09-01 15:29:32', 663, 1, NULL, 'finance-purchase-settlement', 'finance/purchase-settlement', NULL, NULL, 0, '采购结算', '采购结算', '', NULL, NULL, NULL, NULL, 1), + (665, '2023-09-01 14:42:53', '2023-09-01 14:42:53', 663, 1, NULL, 'wallet-log', 'shop/wallet-log', NULL, NULL, 0, '财务结算', '财务结算', '', NULL, NULL, NULL, NULL, 0), + (666, '2023-09-01 13:50:25', '2023-09-01 15:31:06', 0, 3, NULL, '/finance', 'Layout', NULL, NULL, 0, '财务', '财务', 'financial', NULL, NULL, NULL, NULL, 4), + (667, '2023-09-01 13:52:09', '2023-09-01 15:29:15', 666, 3, NULL, 'supplier-walletLog', 'shop/wallet-log', NULL, NULL, 0, 'shop-walletLog', '财务结算', '', NULL, NULL, NULL, NULL, 0), + (668, '2023-09-01 13:53:38', '2023-09-01 13:53:38', 666, 3, NULL, 'finance-purchase-settlement', 'finance/purchase-settlement', NULL, NULL, 0, '采购结算', '采购结算', '', NULL, NULL, NULL, NULL, 1); \ No newline at end of file diff --git a/db/2023-10-07-去除商家钱包分片.sql b/db/2023-10-07-去除商家钱包分片.sql new file mode 100644 index 0000000..78958c1 --- /dev/null +++ b/db/2023-10-07-去除商家钱包分片.sql @@ -0,0 +1,36 @@ +USE mall4cloud_admin; +ALTER TABLE shop_wallet DROP COLUMN zone_num; +ALTER TABLE supplier_wallet DROP COLUMN zone_num; +# 把钱包分片的内容整合到总钱包中 +UPDATE shop_wallet sw + JOIN (SELECT SUM(unsettled_amount) AS unsettled_amount, SUM(settled_amount) AS settled_amount, + SUM(total_settled_amount) AS total_settled_amount,shop_id, pay_sys_type + FROM shop_wallet_zone + GROUP BY shop_id) zone ON zone.shop_id = sw.`shop_id` AND zone.pay_sys_type = sw.`pay_sys_type` +SET sw.unsettled_amount = zone.unsettled_amount + sw.`unsettled_amount`, + sw.`settled_amount` = zone.settled_amount + sw.`settled_amount`, + sw.`total_settled_amount` = zone.total_settled_amount + sw.`total_settled_amount`; +UPDATE supplier_wallet sw + JOIN (SELECT SUM(unsettled_amount) AS unsettled_amount, SUM(settled_amount) AS settled_amount, + SUM(total_settled_amount) AS total_settled_amount,supplier_id, pay_sys_type + FROM supplier_wallet_zone + GROUP BY supplier_id) zone ON zone.supplier_id = sw.`supplier_id` AND zone.pay_sys_type = sw.`pay_sys_type` +SET sw.unsettled_amount = zone.unsettled_amount + sw.`unsettled_amount`, + sw.`settled_amount` = zone.settled_amount + sw.`settled_amount`, + sw.`total_settled_amount` = zone.total_settled_amount + sw.`total_settled_amount`; +DROP TABLE IF EXISTS `shop_wallet_zone`; +DROP TABLE IF EXISTS `supplier_wallet_zone`; +DROP TABLE IF EXISTS `supplier_wallet_log`; + +USE mall4cloud_job; +DELETE FROM xxl_job_info + WHERE executor_handler IN ('zoneShopWalletToTenIfNecessary', 'zoneSupplierWalletToTenIfNecessary'); + +# 变更商家端公告位置 +USE mall4cloud_auth; +# menu_id = 253, 375都是'公告' +DELETE FROM `menu` WHERE `menu_id` IN (253, 375); +# parent_id = 145 为'店铺管理' +INSERT INTO `menu`(`menu_id`,`create_time`, `update_time`, `parent_id`, `biz_type`, `permission`, `path`, `component`, `redirect`, `always_show`, `hidden`, `name`, `title`, `icon`, `no_cache`, `breadcrumb`, `affix`, `active_menu`, `seq`) +VALUES + (669, NOW(), NOW(), 145, 1, NULL, 'notice', 'shop/notice', NULL, NULL, 0, '店铺公告', '店铺公告', '', NULL, NULL, NULL, NULL, 1); diff --git a/db/2023-10-16 退款添加平台介入、电子面单优化.sql b/db/2023-10-16 退款添加平台介入、电子面单优化.sql new file mode 100644 index 0000000..60941db --- /dev/null +++ b/db/2023-10-16 退款添加平台介入、电子面单优化.sql @@ -0,0 +1,525 @@ +#添加订单分库分表的平台介入配置 +USE mall4cloud_nacos; +UPDATE config_info +set content = '# 数据源\nspring:\n data:\n mongodb:\n host: 192.168.193.128\n port: 27017\n database: mall4cloud\n username: mall4cloud\n password: mall4cloud\n authentication-database: mall4cloud\n shardingsphere:\n database:\n default:\n size: 8\n table:\n default:\n size: 64\n refund:\n size: 32\n purchase:\n size: 2\n city:\n size: 64\n props:\n sql:\n show: true\n # 数据源配置\n datasource:\n names: ds,ds0,ds1,ds2,ds3,ds4,ds5,ds6,ds7\n ds:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds0:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_0?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds1:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_1?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds2:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_2?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds3:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_3?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds4:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_4?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds5:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_5?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds6:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_6?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n ds7:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_order}_7?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:123456}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n # 分片配置\n sharding:\n default-data-source-name: ds\n # 分表配置\n tables:\n # 正向订单业务表\n order:\n actual-data-nodes: ds$->{0..7}.order_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_item_lang_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_item_lang_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_item:\n actual-data-nodes: ds$->{0..7}.order_item_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_item_lang_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_item_lang_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_item_lang:\n actual-data-nodes: ds$->{0..7}.order_item_lang_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_item_lang_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_item_lang_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_settlement:\n actual-data-nodes: ds$->{0..7}.order_settlement_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,settlement_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,settlement_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_pre_sale_info:\n actual-data-nodes: ds$->{0..7}.order_pre_sale_info_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,order_pre_sale_info_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,order_pre_sale_info_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_addr:\n actual-data-nodes: ds$->{0..7}.order_addr_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_addr_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_addr_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_invoice:\n actual-data-nodes: ds$->{0..7}.order_invoice_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_invoice_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id,order_invoice_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_self_station:\n actual-data-nodes: ds$->{0..7}.order_self_station_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_virtual_info:\n actual-data-nodes: ds$->{0..7}.order_virtual_info_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: order_id,order_virtual_info_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,order_virtual_info_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n# 退款业务表\n order_refund:\n actual-data-nodes: ds$->{0..7}.order_refund_$->{0..31}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_refund_addr:\n actual-data-nodes: ds$->{0..7}.order_refund_addr_$->{0..31}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_refund_intervention:\n actual-data-nodes: ds$->{0..7}.order_refund_intervention_$->{0..31}\n database-strategy:\n complex:\n sharding-columns: refund_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: refund_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n order_refund_settlement:\n actual-data-nodes: ds$->{0..7}.order_refund_settlement_$->{0..31}\n database-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: order_id,user_id,refund_id,order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n # 采购订单业务表\n purchase_order:\n actual-data-nodes: ds$->{0..7}.purchase_order_$->{0..1}\n database-strategy:\n complex:\n sharding-columns: purchase_order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: purchase_order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n purchase_order_item:\n actual-data-nodes: ds$->{0..7}.purchase_order_item_$->{0..1}\n database-strategy:\n complex:\n sharding-columns: purchase_item_id,purchase_order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: purchase_item_id,purchase_order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n purchase_order_item_lang:\n actual-data-nodes: ds$->{0..7}.purchase_order_item_lang_$->{0..1}\n database-strategy:\n complex:\n sharding-columns: purchase_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: purchase_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n purchase_order_lang:\n actual-data-nodes: ds$->{0..7}.purchase_order_lang_$->{0..1}\n database-strategy:\n complex:\n sharding-columns: purchase_order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: purchase_order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n purchase_order_addr:\n actual-data-nodes: ds$->{0..7}.purchase_order_addr_$->{0..1}\n database-strategy:\n complex:\n sharding-columns: purchase_order_addr_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: purchase_order_addr_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n delivery_order:\n actual-data-nodes: ds$->{0..7}.delivery_order_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: delivery_order_id,order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: delivery_order_id,order_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n delivery_order_item:\n actual-data-nodes: ds$->{0..7}.delivery_order_item_$->{0..63}\n database-strategy:\n complex:\n sharding-columns: delivery_order_id,delivery_order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomDatabaseComplexKeysShardingAlgorithm\n table-strategy:\n complex:\n sharding-columns: delivery_order_id,delivery_order_item_id\n algorithm-class-name: com.tmerclub.cloud.config.sharding.CustomTableComplexKeysShardingAlgorithm\n # 绑定表配置\n binding-tables:\n - order,order_item,order_addr,order_item_lang,order_settlement,order_invoice,order_refund,order_refund_addr,order_refund_intervention,order_refund_settlement,order_pre_sale_info,purchase_order,purchase_order_item,purchase_order_item_lang,purchase_order_lang,purchase_order_addr,order_self_station,order_virtual_info,delivery_order,delivery_order_item\nmall4cloud:\n order:\n thread:\n coreSize: 0\n maxSize: 200\n keepAliveTime: 60\n\nmanagement:\n health:\n db:\n enabled: false' +where data_id = "mall4cloud-order.yml"; + +USE mall4cloud_job; +insert into `xxl_job_info` ( `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, `trigger_last_time`, `trigger_next_time`) values +(2,'执行平台介入超时处理,超时默认平台拒绝退款','2023-10-09 16:20:28','2023-10-09 16:20:28','admin','','CRON','0 0/1 * * * ?','DO_NOTHING','FIRST','refundInterventionTimeOut','','SERIAL_EXECUTION','0','0','BEAN','','GLUE代码初始化','2023-10-09 16:20:28','',1, 0, 0); + +# 修改订单退款表 +USE `mall4cloud_order_0`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +USE `mall4cloud_order_1`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 修改订单退款表 +USE `mall4cloud_order_1`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 修改订单退款表 +USE `mall4cloud_order_2`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 修改订单退款表 +USE `mall4cloud_order_3`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 修改订单退款表 +USE `mall4cloud_order_4`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 修改订单退款表 +USE `mall4cloud_order_5`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 修改订单退款表 +USE `mall4cloud_order_6`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 修改订单退款表 +USE `mall4cloud_order_7`; + +DELIMITER // +DROP PROCEDURE IF EXISTS createTable// +CREATE PROCEDURE createTable() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i<32 DO + + SET @create_order_refund_intervention_table = CONCAT( + 'CREATE TABLE IF NOT EXISTS order_refund_intervention_', i, + " + ( + `refund_intervertion_id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `refund_id` bigint NOT NULL COMMENT '退款id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `biz_id` bigint DEFAULT '0' COMMENT '商家/供应商/用户id', + `sys_type` tinyint COMMENT '系统类型,0.普通用户 1.商家端 2.平台端 3.供应商端', + `voucher_desc` varchar(200) DEFAULT NULL COMMENT '凭证说明', + `img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件凭证(逗号隔开)', + PRIMARY KEY (`refund_intervertion_id`), + KEY `idx_biz_id` (`biz_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单退款介入记录' + " + ); +PREPARE create_order_refund_intervention_table FROM @create_order_refund_intervention_table; +EXECUTE create_order_refund_intervention_table; + +SET @update_order_refund_table = CONCAT( + 'ALTER TABLE order_refund_', i, + " + ADD COLUMN `shop_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商家/供应商文件凭证(逗号隔开)' AFTER `img_urls`, + ADD COLUMN `platform_intervention_status` TINYINT NOT NULL DEFAULT '-1' COMMENT '平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功', + ADD COLUMN `apply_intervention_reason` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户申请介入理由' AFTER `platform_intervention_status`, + ADD COLUMN `apply_intervention_img_urls` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '申请介入的文件凭证(逗号隔开)' AFTER `apply_intervention_reason`, + ADD COLUMN `intervention_refund_type` TINYINT DEFAULT NULL COMMENT '平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款' AFTER `apply_intervention_img_urls`, + ADD COLUMN `after_intervention_refund_amount` BIGINT DEFAULT NULL COMMENT '平台介入前的退款金额' AFTER `intervention_refund_type`, + ADD COLUMN `platform_message` VARCHAR(300) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '平台留言' AFTER `after_intervention_refund_amount`, + ADD COLUMN `apply_intervention_time` DATETIME DEFAULT NULL COMMENT '申请介入时间' AFTER `platform_message`, + ADD COLUMN `intervention_finish_time` DATETIME DEFAULT NULL COMMENT '介入完成时间' AFTER `apply_intervention_time`; + "); +PREPARE update_order_refund_table FROM @update_order_refund_table; +EXECUTE update_order_refund_table; + +SET i = i+1; +END WHILE; + +END// +CALL createTable()// +DELIMITER ; + +# 电子面单优化 +USE mall4cloud_order; +# 添加网点配置地址字段 +ALTER TABLE outlet_config + ADD COLUMN `print_addr` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发货地址' AFTER `is_default`; +# 更新商家地址信息至网点配置 +UPDATE mall4cloud_order.outlet_config oc + JOIN mall4cloud_admin.`shop_refund_addr` sra ON oc.`shop_addr_id` = sra.`shop_refund_addr_id` +SET oc.`print_addr` = CONCAT(sra.`province`, sra.`city`, sra.`area`, sra.`addr`) +WHERE oc.`shop_id` IS NOT NULL; +# 更新供应商地址信息至网点配置 +UPDATE mall4cloud_order.outlet_config oc + JOIN mall4cloud_admin.`supplier_refund_addr` sra ON oc.`shop_addr_id` = sra.`supplier_refund_addr_id` +SET oc.`print_addr` = CONCAT(sra.`province`, sra.`city`, sra.`area`, sra.`addr`) +WHERE oc.`supplier_id` IS NOT NULL; +# 删除网点配置地址关联字段 +USE mall4cloud_order; +ALTER TABLE outlet_config DROP COLUMN shop_addr_id; + +# 结算明细菜单变更 +# parent_id = 325 465分别是商家和供应商的'结算明细'; +# parent_id = 663 666分别是商家和供应商的'财务'; +USE mall4cloud_auth; +UPDATE `menu` +SET `parent_id` = 663 +WHERE `menu_id` = 325; + +UPDATE `menu` +SET `parent_id` = 666 +WHERE `menu_id` = 465; diff --git a/db/2023-10-23 平台发货菜单地址修改.sql b/db/2023-10-23 平台发货菜单地址修改.sql new file mode 100644 index 0000000..edfd1d8 --- /dev/null +++ b/db/2023-10-23 平台发货菜单地址修改.sql @@ -0,0 +1,149 @@ +USE mall4cloud_auth; + +# 修改平台发货地址菜单 651为发货管理菜单 +update menu set parent_id = 651, component = 'system/delivery-manager/addr/index', seq = 2 where menu_id = 650 and name = '发货地址'; + +# 订单发票新增供应商id字段 +USE mall4cloud_order_0; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; + +USE mall4cloud_order_1; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; + +USE mall4cloud_order_2; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; + +USE mall4cloud_order_3; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; + +USE mall4cloud_order_4; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; + +USE mall4cloud_order_5; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; + +USE mall4cloud_order_6; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; + +USE mall4cloud_order_7; +DELIMITER // +DROP PROCEDURE IF EXISTS updateInvoiceColumn // +CREATE PROCEDURE updateInvoiceColumn() +BEGIN + DECLARE i INT; + SET i = 0; + WHILE i < 64 DO + SET @add_column = CONCAT( 'ALTER TABLE order_invoice_', i, " ADD COLUMN `supplier_id` bigint(0) NULL COMMENT '供应商id' AFTER `shop_id`" ); + PREPARE add_column FROM @add_column; + EXECUTE add_column; + SET i = i + 1; + END WHILE; +END // +CALL updateInvoiceColumn() // +DROP PROCEDURE updateInvoiceColumn // +DELIMITER; \ No newline at end of file diff --git a/db/2023-11-13 积分、余额记录搬迁到mongodb(看注释).sql b/db/2023-11-13 积分、余额记录搬迁到mongodb(看注释).sql new file mode 100644 index 0000000..239ca7f --- /dev/null +++ b/db/2023-11-13 积分、余额记录搬迁到mongodb(看注释).sql @@ -0,0 +1,109 @@ +# 看注释!!!!!!!! + +# 1.执行 2023-11-13 整合leaf模块.sql ,新增的分布式id数据要导入 + +# 2.给用户服务添加mongodb连接 +# 积分、余额的数据放入mongodb。在mall4cloud-user.yml加入以下配置(连接数据注意检查更换), +# data: +# mongodb: +# host: 192.168.193.128 +# port: 27017 +# database: mall4cloud +# username: mall4cloud +# password: mall4cloud +# authentication-database: mall4cloud + +# 3.给支付模块增加一个数据库配置 +# 在mall4cloud-payment.yml替换以下配置 +# 将: +# +# datasource: +# names: ds,ds0,ds1,ds2,ds3,ds4,ds5,ds6,ds7 +# +# 替换成: +# datasource: +# names: ds,ds0,ds1,ds2,ds3,ds4,ds5,ds6,ds7 +# ds: +# type: com.zaxxer.hikari.HikariDataSource +# driver-class-name: com.mysql.cj.jdbc.Driver +# jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_payment}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true +# username: ${MYSQL_USERNAME:root} +# password: ${MYSQL_PASSWORD:hn02le.34lkdLKD} +# minimum-idle: 0 +# maximum-pool-size: 20 +# idle-timeout: 25000 +# auto-commit: true +# connection-test-query: SELECT 1 +# +# 将: +# sharding: +# +# 替换成: +# sharding: +# default-data-source-name: ds +# +# +# 或者执行以下两条sql后,重启nacos(二选一) +use mall4cloud_nacos; +update config_info set content = REPLACE(content, 'names: ds0,ds1,ds2,ds3,ds4,ds5,ds6,ds7\n', 'names: ds,ds0,ds1,ds2,ds3,ds4,ds5,ds6,ds7\n ds:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n jdbc-url: jdbc:mysql://${MYSQL_HOST:192.168.193.128}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:mall4cloud_payment}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true&useAffectedRows=true\n username: ${MYSQL_USERNAME:root}\n password: ${MYSQL_PASSWORD:hn02le.34lkdLKD}\n minimum-idle: 0\n maximum-pool-size: 20\n idle-timeout: 25000\n auto-commit: true\n connection-test-query: SELECT 1\n') where data_id = 'mall4cloud-payment.yml'; +update config_info set content = REPLACE(content, 'sharding:\n', 'sharding:\n default-data-source-name: ds\n') where data_id = 'mall4cloud-payment.yml'; + + + +# 4.search模块增加一个mongodb配置 +# 在mall4cloud-search.yml替换以下配置 +# 将: +# +# spring: +# +# 替换成: +# spring: +# data: +# mongodb: +# host: 192.168.193.128 +# port: 27017 +# database: mall4cloud +# username: mall4cloud +# password: 'mall4cloud' +# authentication-database: mall4cloud +# +# 或者执行以下两条sql后,重启nacos(二选一) +use mall4cloud_nacos; +update config_info set content = REPLACE(content, 'spring:\n', 'spring:\n data:\n mongodb:\n host: 192.168.193.128\n port: 27017\n database: mall4cloud\n username: mall4cloud\n password: mall4cloud\n authentication-database: mall4cloud\n') where data_id = 'mall4cloud-search.yml'; + + + + +# 5.initScoreAndBalanceLogToMongodb这个定时任务只对2023-11-13更新前将积分日志(user_score_log)和余额日志(user_balance_log)存入mysql之后,将数据搬迁到mongodb +# 需要重启用户服务,使该定时任务正常执行*成功*一次后(数据已经完全搬迁到mongodb)就可以置为停止或删除,随后可以将mysql中user_score_log和user_balance_log删除 +# 并且可以将UserScoreLogMapper、UserBalanceLogMapper以及相关定时任务代码从代码中删去 +USE `mall4cloud_job`; +insert into `xxl_job_info`(`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, + `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, + `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, + `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, + `trigger_status`, `trigger_last_time`, `trigger_next_time`) +values (12, '初始化原有数据库记录至mongodb', '2023-11-02 10:07:30', '2023-11-02 10:07:30', 'admin', '', 'CRON', + '0 0 0 1 1 ? *', 'DO_NOTHING', 'FIRST', 'initScoreAndBalanceLogToMongodb', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', + '', 'GLUE代码初始化', '2023-11-02 10:07:30', '', 0, 0, 0); + +# 6.优化通联会员注册 +USE `mall4cloud_user`; +ALTER TABLE `user_extension` + ADD COLUMN `allinpay_create` tinyint(1) DEFAULT 0 COMMENT '是否创建通联会员(0:否,1:是)' AFTER `allinpay_actual_balance`; + +USE mall4cloud_job; +INSERT INTO `xxl_job`.`xxl_job_info`(`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, `trigger_last_time`, `trigger_next_time`) +VALUES + (12, '用户创建通联会员', '2023-11-10 14:30:03', '2023-11-10 14:51:03', 'admin', '', 'CRON', '0 0/10 * * * ? *', 'DO_NOTHING', 'FIRST', 'createAllinpayMember', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2023-11-10 14:30:03', '', 1, 0, 1699599600000); + + + + +# 7. 上面步骤执行完毕后,重启所有服务 + +# 8. 重启服务后,导入初始化的定时任务并执行 +# 只需要执行一次就可以删除掉,不要重复执行 +USE `mall4cloud_job`; +insert into `xxl_job_info` (`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, `trigger_last_time`, `trigger_next_time`) values +('612','11','初始化库存','2023-07-10 09:51:23','2023-11-10 16:38:00','admin','','CRON','0 0 0 1 10 ?','DO_NOTHING','FIRST','intiStock','','SERIAL_EXECUTION','0','0','BEAN','','GLUE代码初始化','2023-07-10 09:51:23','','0','0','0'); diff --git a/db/2024-01-08 4.弹窗广告.sql b/db/2024-01-08 4.弹窗广告.sql new file mode 100644 index 0000000..f5acdd5 --- /dev/null +++ b/db/2024-01-08 4.弹窗广告.sql @@ -0,0 +1,37 @@ +USE mall4cloud_user; +DROP TABLE IF EXISTS `cost_per_popup`; +CREATE TABLE `cost_per_popup` ( + `popup_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '弹窗广告id', + `shop_id` bigint NOT NULL COMMENT '店铺id', + `popup_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '弹窗名称', + `status` tinyint NOT NULL COMMENT '状态 1.未开始 2.投放中 3.已结束', + `page_type` tinyint NOT NULL COMMENT '触发页面类型 1.平台首页 2.会员中心 3.支付成功 4.店铺首页 5.商品详情', + `popup_pic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '弹窗图片', + `jump_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '跳转页面', + `user_type` tinyint NOT NULL DEFAULT '0' COMMENT '推送用户类型 0.所有用户 1.免费会员 2.付费会员 3.店铺客户', + `start_time` datetime NOT NULL COMMENT '推送开始时间', + `end_time` datetime NOT NULL COMMENT '推送结束时间', + `push_frequency` tinyint NOT NULL DEFAULT '0' COMMENT '推送频次 0.永久一次 1.每次进入 2.自定义频次', + `day_frequency` tinyint DEFAULT NULL COMMENT '按x天推送', + `week_frequency` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '按周推送 eg. 1,2', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`popup_id`), + KEY `shop_id` (`popup_id`,`shop_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='弹窗广告'; + +DROP TABLE IF EXISTS `popup_relate`; +CREATE TABLE `popup_relate` ( + `relate_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '关联id', + `popup_id` bigint NOT NULL COMMENT '弹窗广告id', + `spu_id` bigint DEFAULT NULL COMMENT '商品id', + `user_level_id` bigint DEFAULT NULL COMMENT '会员等级id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`relate_id`), + KEY `popup_id` (`popup_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='弹窗广告关联'; + + + + diff --git a/db/2024-01-15 弹窗广告菜单&签名密钥访问增加权限.sql b/db/2024-01-15 弹窗广告菜单&签名密钥访问增加权限.sql new file mode 100644 index 0000000..785e4c9 --- /dev/null +++ b/db/2024-01-15 弹窗广告菜单&签名密钥访问增加权限.sql @@ -0,0 +1,80 @@ +# 弹窗广告菜单 +USE `mall4cloud_job`; +insert into `xxl_job_info`(`job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, + `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, + `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, + `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, + `trigger_status`, `trigger_last_time`, `trigger_next_time`) +values (12, '改变弹窗广告状态', '2023-12-25 10:07:30', '2023-12-25 10:07:30', 'admin', '', 'CRON', + '0 0/30 * * * ?', 'DO_NOTHING', 'FIRST', 'changePopup', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', + '', 'GLUE代码初始化', '2023-12-25 10:07:30', '', 0, 0, 0); + +USE `mall4cloud_auth`; +INSERT INTO `menu`(`menu_id`,`create_time`,`update_time`,`parent_id`,`biz_type`,`permission`,`path`,`component`,`redirect`,`always_show`,`hidden`,`name`,`title`,`icon`,`no_cache`,`breadcrumb`,`affix`,`active_menu`,`seq`) values +(698,'2023-12-25 15:23:38','2023-12-25 15:23:54',532,2,NULL,'feature-popup-ad','platform/feature/popup-ad',NULL,NULL,0,'弹窗广告','弹窗广告','',NULL,NULL,NULL,NULL,3), +(699,'2023-12-25 15:24:34','2023-12-25 15:24:34',532,2,NULL,'feature-popup-ad/add-or-update','platform/feature/popup-ad/add-or-update',NULL,NULL,1,'新增弹窗广告','新增弹窗广告','',NULL,NULL,NULL,NULL,4), +(700,'2023-12-25 15:25:16','2023-12-25 15:25:16',542,1,NULL,'feature-popup-ad','multishop/feature/popup-ad',NULL,NULL,0,'弹窗广告','弹窗广告','',NULL,NULL,NULL,NULL,3), +(701,'2023-12-25 15:25:50','2023-12-25 15:38:13',542,1,NULL,'feature-popup-ad/add-or-update','multishop/feature/popup-ad/add-or-update',NULL,NULL,1,'新增弹窗广告','新增弹窗广告','',NULL,NULL,NULL,NULL,4); + +insert into `menu_permission`(`menu_permission_id`,`create_time`,`update_time`,`menu_id`,`biz_type`,`permission`,`name`,`uri`,`method`) values +(1184,'2023-12-26 13:44:29','2023-12-26 13:55:10',698,2,'platform:popup:page','列表','/p/cost_per_popup/page',1), +(1185,'2023-12-26 13:48:12','2023-12-26 13:55:16',698,2,'platform:popup:view','查看','/p/cost_per_popup',1), +(1186,'2023-12-26 13:50:38','2023-12-26 13:55:02',698,2,'platform:popup:save','新增','/p/cost_per_popup',2), +(1187,'2023-12-26 13:51:16','2023-12-26 13:54:46',698,2,'platform:popup:update','编辑','/p/cost_per_popup',3), +(1188,'2023-12-26 13:52:12','2023-12-26 13:54:36',698,2,'platform:popup:delete','删除','/p/cost_per_popup',4), +(1189,'2023-12-26 13:53:59','2023-12-26 13:53:59',698,2,'platform:popup:invalid','失效活动','/p/cost_per_popup/invalid',3), +(1190,'2023-12-26 13:58:03','2023-12-26 13:58:03',700,1,'multishop:popup:page','列表','/m/cost_per_popup/page',1), +(1191,'2023-12-26 13:58:30','2023-12-26 13:58:30',700,1,'multishop:popup:view','查看','/m/cost_per_popup',1), +(1192,'2023-12-26 13:59:37','2023-12-26 13:59:37',700,1,'multishop:popup:save','新增','/m/cost_per_popup',2), +(1193,'2023-12-26 14:00:11','2023-12-26 14:00:11',700,1,'multishop:popup:update','编辑','/m/cost_per_popup',3), +(1194,'2023-12-26 14:00:47','2023-12-26 14:00:47',700,1,'multishop:popup:delete','删除','/m/cost_per_popup',4), +(1195,'2023-12-26 14:01:18','2023-12-26 14:01:18',700,1,'multishop:popup:invalid','失效活动','/m/cost_per_popup/invalid',3); + + +# 前面密钥访问增加权限 +USE mall4cloud_admin; +ALTER TABLE `sys_access_key` + ADD COLUMN `prem_type` TINYINT(0) NOT NULL DEFAULT '0' COMMENT '密钥权限类型 0.全部权限 1.指定权限', + ADD COLUMN `usability_shop_id` tinyint(0) NOT NULL DEFAULT '0' COMMENT '密钥可用店铺/供应商id,如果为0则为所有店铺/供应商', + ADD COLUMN `sys_type` tinyint(0) NOT NULL COMMENT '系统类型 0.c端用户 1.商家端 2.平台端 3.供应商端'; + +CREATE TABLE `sys_access_menu` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `sys_access_key_id` BIGINT DEFAULT NULL COMMENT '密钥id', + `menu_id` BIGINT DEFAULT NULL COMMENT '菜单ID', + PRIMARY KEY (`id`), + KEY `sys_access_key_idx` (`sys_access_key_id`,`menu_id`) USING BTREE +) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='密钥对应可用菜单'; + +CREATE TABLE `sys_access_menu_permission` ( + `id` int NOT NULL AUTO_INCREMENT, + `sys_access_key_id` bigint DEFAULT NULL COMMENT '密钥id', + `menu_permission_id` bigint DEFAULT NULL COMMENT '菜单资源id', + PRIMARY KEY (`id`), + KEY `sys_access_key_idx` (`sys_access_key_id`,`menu_permission_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='密钥对应菜单资源'; + + +# 补充默认的服务条款和隐私策略,如果需要默认的服务条款和隐私策略可以删除sys_config之前的对应的四行,在执行这插入 +insert into `sys_config` (`param_key`, `param_value`, `remark`) values +('PRIVACY_PROTOCOL_CN','{\"content\":\"

隐私政策

\\n

 ,

\\n

本站(以下亦称&ldquo,我们&rdquo,)深知个人信息对您的重要性,我们尊重并保护所有使用我们平台服务的用户的个人信息,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。同时,我们承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。请在使用我们的产品(或服务)前,仔细阅读并了解本《我们隐私政策》(下称&ldquo,本隐私政策&rdquo,)。

\\n

 ,

\\n

一、我们处理个人信息的法律依据

\\n

本隐私政策制定的法律依据为《中华人民共和国消费者权益保护法》、《中华人民共和国网络安全法》、《中华人民共和国电子商务法》、《信息安全技术个人信息安全规范》以及其他涉及公民个人信息的相关法律法规。通常,我们会基于本隐私政策提示的功能收集您的个人信息。某些情况下,如果涉及其他信息的收集我们会单独向您出示个人信息保护说明条款。

\\n

二、本隐私政策的适用范围

\\n

本隐私政策适用于您使用本平台的产品或服务时使用。

\\n

三、我们如何收集和使用您的个人信息

\\n

个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。

\\n

个人敏感信息是指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息。在您向我们提供任何属于敏感信息的个人信息前,请您清楚考虑提供是恰当的并且同意您的个人敏感信息可按本隐私政策所述的目的和方式进行处理。我们会在得到您的同意后收集和使用您的敏感信息以实现与我们业务相关的功能,并允许您对这些敏感信息的收集与使用做出不同意的选择,但是拒绝使用这些信息会影响您使用相关功能。

\\n

原则上,我们仅会出于本隐私政策所述的以下目的,收集和使用您的个人信息,如果超过以下目的收集和使用您的个人信息时我们会单独向您提示并征得您的同意。

\\n

(一)帮助您成为我们的注册\\\\登录用户

\\n

您自行注册成为我们的用户

\\n

您在使用我们提供的服务时,首先需要成为我们的注册\\\\登录用户。当您注册我们账户时,您需要向我们提供您准备使用的用户名及您本人的手机号码,当您的账户密码遗失时,可以通过注册手机号码发送的链接重置密码。

\\n

您可自行创建用户名,用户名的命名及使用应遵守相关法律法规并符合网络道德。用户名中不能含有任何侮辱、威胁、淫秽、谩骂等侵害他人合法权益的文字。用户名将作为您在平台上活动的标识,用以区别平台上其他用户。

\\n

您提供的上述信息,将在您使用我们服务期间持续授权我们使用。在您注销账号时,我们将停止使用并删除上述信息。

\\n

(二)客户服务

\\n

当您向我们申诉或进行咨询时,为了方便与您联系或帮助您解决问题,我们可能需要您提供用户名、手机号码信息。如您拒绝提供上述信息,可能部分功能无法使用,同时无法向您及时反馈申诉或咨询结果。

\\n

会员在本平台删除账号或后期不继续使用,注销账号时会员可以通过个人中心-系统设置-注销账号。

\\n

(三)征得授权同意的例外

\\n

根据相关法律法规的规定,在以下情形中,我们可以在不征得您的授权同意的情况下收集、使用一些必要的个人信息:

\\n

1. ,与公共安全、公共卫生、重大公共利益直接相关的;

\\n

2. ,出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;

\\n

3. ,法律法规规定的其他情形。

\\n

四、我们如何保护您的个人信息

\\n

为保障您的信息安全,我们努力采取各种合理的物理、电子和管理方面的安全措施来保护您的信息,使您的信息不会被泄漏、毁损或者丢失,包括但不限于SSL、信息加密存储、数据中心的访问控制。

\\n

数据加密:我们对于用户的用户名、手机号进行加密存储,保证用户基本信息不会被恶意获取;

\\n

身份鉴别:我们通过校验账号密码或者账号绑定手机号码,进行用户身份合法性鉴别,防止非经授权的介入;

\\n

1. ,账号保护:您的账户均有安全保护功能,请妥善保管您的账户及密码信息。对用户密码进行加密等安全措施确保您的信息不丢失,不被滥用和变造。尽管有前述安全措施,但同时也请您理解,由于技术的限制以及可能存在的各种恶意手段,即便竭尽所能加强安全措施,在信息网络上也不存在&ldquo,完善的安全措施&rdquo,。如因您自己的原因导致账户及密码信息泄露而造成的任何法律后果需由您本人负责。

\\n

2. ,互联网环境并非百分之百安全,我们将尽力确保或担保您发送给我们的任何信息的安全性。在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以手机短信的方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。

\\n

五、我们如何处理未成年人的个人信息

\\n

1. ,我们的服务主要面向成年人(原则上18周岁以上为成年人,16周岁以上且以自己的劳动收入为主要生活来源的我们亦视为成年人)。若您是未成年人,在使用我们的产品和/或服务前,您应在监护人的陪同下阅读本隐私政策,并应确保已征得您的监护人同意后使用我们的服务并向我们提供您的信息。 我们会根据国家相关法律法规的规定着重保护未成年人的个人信息。

\\n

2. ,如您的监护人不同意您按照本隐私政策使用我们的服务或向我们提供信息,请您立即终止使用我们的服务并及时通知我们。

\\n

3. ,若您是未成年人的监护人,当您对您所监护的未成年人使用我们的服务或其向我们提供的用户信息有任何疑问时,请您及时与我们联系。我们将根据国家相关法律法规及本隐私政策的规定保护未成年人用户信息的保密性及安全性。如果我们发现自己在未事先获得可证实的父母或法定监护人同意的情况下收集了未成年人的个人信息,则会设法尽快删除相关数据。

\\n

六、本隐私政策的更新和通知

\\n

我们的隐私政策可能变更未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利我们会在本页面上发布对本隐私政策所做的任何变更。

\\n

对于重大变更,我们还会提供更为显著的通知(包括对于某些服务, ,我们会通过手机短信发送通知,说明隐私政策的具体变更内容)。

\\n

本隐私政策所指的重大变更包括但不限于:

\\n

1. ,我们的服务模式发生重大变化如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;

\\n

2. ,我们在所有权结构、组织架构等方面发生重大变化如业务调整、破产并购等引起的所有者变更等;

\\n

3. ,个人信息共享、转让或公开披露的主要对象发生变化;

\\n

4. ,您参与个人信息处理方面的权利及其行使方式发生重大变化;

\\n

5. ,我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时。

\\n

 ,

\"}','隐私策略中文配置'), +('PRIVACY_PROTOCOL_EN','{\"content\":\"

Privacy Policy ,

\\n

This site (hereinafter also referred to as \\\"we\\\") is well aware of the importance of personal information to you, we respect and protect the personal information of all users who use our platform services, and will do our best to protect your personal information safe and reliable. We are committed to maintaining your trust in us and abide by the following principles to protect your personal information: the principle of consistency of rights and responsibilities, the principle of clear purpose, the principle of consent, the principle of minimum sufficient, the principle of ensuring security, the principle of subject participation, the principle of openness and transparency. At the same time, we promise that we will take appropriate security measures to protect your personal information according to the industry\'s mature security standards. Please read and understand this Privacy Policy (hereinafter referred to as the \\\"Privacy Policy\\\") carefully before using our products (or services).

\\n

The legal basis on which we process personal information

\\n

The legal basis for the formulation of this privacy policy is the Law of the People\'s Republic of China on the Protection of Consumer Rights and Interests, the Cybersecurity Law of the People\'s Republic of China, the E-commerce Law of the People\'s Republic of China, the Code for the Security of Personal Information in Information Security Technology and other relevant laws and regulations involving

\\n

citizens\' personal information. In general, we collect your personal information based on the functions indicated in this Privacy Policy. In some cases, if the collection involves other information, we will show you the terms of the Personal Information Protection Statement separately.

\\n

The scope of application of this Privacy Policy

\\n

This Privacy Policy applies to your use of the products or services of this platform.

\\n

How do we collect and use your Personal information

\\n

Personal information refers to all kinds of information recorded by electronic or other means that can identify a specific natural person or reflect the activities of a specific natural person alone or in combination with other information.

\\n

Sensitive personal information refers to personal information that, if leaked, illegally provided or abused, may endanger personal and property safety, easily lead to damage to personal reputation, physical and mental health, or discriminatory treatment. Before you provide us with any personal information that is sensitive information, please clearly consider that it is appropriate to provide and agree that your personal sensitive information may be processed in accordance with the purposes and methods described in this Privacy Policy. After obtaining your consent, we will collect and use your sensitive personal information to achieve functions related to our business, and allow you to choose not to consent to the collection and use of such sensitive information, but refusing to use such information will affect your use of relevant functions.

\\n

In principle, we will only collect and use your personal information for the following purposes as described in this Privacy Policy. If we collect and use your personal information for more than the following purposes, we will inform you separately and obtain your consent.

\\n

1. ,To help you become our registered/logged in user

\\n

You register yourself as our user

\\n

When you use the services we provide, you first need to become our registered/logged in user. When you register our account, you need to provide us with the user name you intend to use and your own mobile phone number, when your account password is lost, you can reset the password through the link sent by the registered mobile phone number.

\\n

You can create your own user name. The name and use of the user name should comply with relevant laws and regulations and conform to network ethics. The user name shall not contain any insulting, threatening, obscene, abusive words that infringe upon the legitimate rights and interests of others. The username will be used to identify your activities on the platform and to distinguish other users on the platform.

\\n

The above information you provide will continue to authorize us to use it during your use of our services. When you cancel your account, we will stop using and delete the above information.

\\n

2. Customer Service

\\n

When you complain or consult us, in order to contact you or help you solve the problem, we may require you to provide user name and mobile phone number information. If you refuse to provide the above information, some functions may not be available, and we will not be able to timely feedback to you about the complaint or consultation results.

\\n

When a member deletes an account on this platform or does not continue to use it later, the member can cancel the account through Personal Center - System Settings - cancel the account.

\\n

3.Exceptions to the consent of authorization

\\n

According to the provisions of relevant laws and regulations, in the following circumstances, we can collect and use some necessary personal information without your authorization and consent:

\\n

l ,Directly related to public safety, public health and major public interests,

\\n

l ,Out of safeguarding your or other individuals\' life, property and other major legitimate rights and interests, but it is difficult to obtain the consent of the person,

\\n

l ,Other circumstances stipulated by laws and regulations.

\\n

 ,

\\n

How do we protect your personal information

\\n

In order to protect the security of your information, we strive to take a variety of reasonable physical, electronic and management security measures to protect your

\\n

information, so that your information will not be leaked, damaged or lost, including but not limited to SSL, encrypted information storage, data center access control.

\\n

Data encryption: We encrypt and store the user\'s user name and mobile phone number to ensure that the user\'s basic information will not be maliciously obtained,

\\n

Identity authentication: we verify the legitimacy of user identity by verifying the account password or the mobile phone number bound to the account to prevent unauthorized intervention,

\\n

1. Account protection: Your account has a security protection function, please properly keep your account and password information. Encrypt the user password and other security measures to ensure that your information is not lost, not abused and altered. Despite the aforementioned security measures, please understand that due to technical limitations and possible malicious means, even if we do our best to strengthen security measures, there is no \\\"perfect security measures\\\" on the information network. You shall be responsible for any legal consequences caused by the disclosure of your account and password information due to your own reasons.

\\n

2. The Internet environment is not 100% secure and we will do our best to ensure or guarantee the security of any information you send us. In the event of an unfortunate personal information security incident, we will inform you in a timely manner in accordance with the requirements of laws and regulations: the basic situation and possible impact of the security incident, the disposal measures we

\\n

 ,

\\n

 ,

\\n

have taken or will take, the suggestions you can independently prevent and reduce risks, and the remedial measures for you. We will promptly inform you of the incident by mobile phone SMS. When it is difficult to inform the subject of personal information one by one, we will take a reasonable and effective way to issue an announcement.

\\n

 ,

\\n

How do we handle minors\' personal information

\\n

1. Our services are mainly aimed at adults (in principle, adults over the age of 18, and we also consider adults over the age of 16 who rely on their own labor income as their main source of living). If you are a minor, you should read this Privacy Policy with a guardian before using our products and/or services, and you should ensure that you have obtained the consent of your guardian to use our services and provide us with your information. We will focus on protecting minors\' personal information in accordance with relevant national laws and regulations.

\\n

2. If your guardian does not agree with your use of our services or the provision of information to us in accordance with this Privacy Policy, please terminate your use of our Services immediately and notify us in time.

\\n

3. If you are the guardian of a minor, if you have any questions about the minor under your custody\'s use of our Services or the user information that he or she provides to us, please contact us in time. We will protect the confidentiality and security of minor user information in accordance with relevant national laws and regulations and this privacy policy. If we discover that we have collected personal information from minors without prior verifiable parental or legal guardian consent, we will try to delete the data as soon as possible.

\\n

 ,

\\n

Updates and notices to this Privacy Policy

\\n

Our Privacy Policy may change, and we will not reduce your rights under this Privacy Policy without your express consent. We will post any changes to this Privacy Policy on this page.

\\n

For significant changes, we may also provide more prominent notice (including for some services, we may send a notification via SMS stating the specific changes to our Privacy Policy).

\\n

Material changes referred to in this Privacy Policy include but are not limited to:

\\n

l ,Significant changes in our service model, such as the purpose of processing personal information, the type of personal information processed, the use of personal information, etc.,

\\n

l ,Major changes in our ownership structure and organizational structure, such as changes in owners caused by business adjustments, bankruptcy and mergers and acquisitions,

\\n

l ,Changes in the main targets for sharing, transferring or publicly disclosing personal information,

\\n

l ,Significant changes in your rights to participate in the processing of personal information and the way in which they are exercised,

\\n

 ,

\\n

 ,

\\n

When the department responsible for handling the security of personal information, contact methods and complaint channels change.

\"}','隐私策略英文配置'), +('SERVICE_PROTOCOL_CN','{\"content\":\"

服务条款
 , ,

\\n

一、定义

\\n

平台,是指您当前所浏览的网站平台。

\\n

用户,包含注册用户和非注册用户,以下亦称为&ldquo,您&rdquo,。注册用户是指通过我们平台完成全部注册程序后,使用我们平台服务或我们网站资料的用户。非注册用户是指未进行注册、直接登录我们平台或通过其他网站进入我们平台直接或间接地使用我们平台服务或我们网站资料的用户。

\\n

协议方,本协议中协议双方合称&ldquo,协议方&rdquo,。

\\n

二、协议的效力

\\n

1. ,在您按照注册页面提示填写信息、阅读并同意本协议完成全部注册程序后,您即受本协议的约束。

\\n

2. ,本协议内容包括本协议正文《隐私政策》,所有我们已经发布的或将来可能发布的规则为本协议不可分割的组成部分,与本协议具有同等法律效力。除另行明确声明外,任何我司网站提供的服务(以下称为&ldquo,我们平台服务&rdquo,)均受本协议约束。您承诺接受并遵守本协议的约定。如果您不同意本协议的约定,您应立即停止注册程序或停止使用我们平台服务;如您继续访问和使用我们平台服务,即视为您已确知并完全同意本协议各项内容。

\\n

3. ,我们有权根据国家法律法规的更新、产品和服务规则的调整需要不时地制订、修改本协议或各类规则,并提前以网站公示的方式进行公示。如您继续使用我们平台服务的,即表示您接受经修订的协议和规则。如发生有关争议时,以我们最新的相关协议和规则为准。

\\n

三、注册

\\n

1. ,在您完成注册程序使用我们平台服务,您应当是具备相应民事行为能力的自然人(十六周岁以上的未成年人,以自己的劳动收入为主要生活来源的,视为完全民事行为能力人)、法人或其他组织。若您不具备前述主体资格,则您及您的家长或法定监护人(以下统称\\\"监护人\\\")应承担因此而导致的一切后果,且我们有权注销您的账户,并向您及您的监护人索偿。

\\n

2. ,我们非常重视对青少年个人信息搜集和使用的安全性的保护。我们建议,任何未满18周岁的未成年人参加网上活动应事先取得其监护人可经查证的同意并遵守《全国青少年网络文明公约》。监护人应承担未成年人网络活动风险及保护未成年人相关网络隐私的首要责任。

\\n

3. ,在您签署本协议,完成注册程序后,您应对您的用户名、登录密码的安全,以及对通过您的账户和密码实施的行为负责因此所衍生的任何损失或损害,我们无法也不承担任何责任。除非有法律规定或行政司法机关的指令,且征得我们的同意,否则您的用户名、登录密码不得以任何方式转让、借用、赠与、继承(与账户相关的财产权益除外)<,或>,在第三方平台上进行展示或售卖。否则,由此给您(或我们、任何第三方)造成的一切损失,概由您自行承担(或者负责赔偿)。

\\n

4. ,您在注册帐号或使用我们平台服务的过程中,应提供合法、真实、准确的个人资料,您填写的个人资料有变动的,应及时进行更新。如果因您提供的个人资料不合法、不真实、不准确的,您需承担因此引起的相应责任及后果,并且我们保留终止您使用我们各项服务的权利。

\\n

5. ,您了解并同意遵守本协议条款,在通过我们平台完成注册程序之后,即可成为我们平台注册用户。

\\n

6. ,您不得通过任何手段恶意注册我们网站帐号,包括但不限于以牟利、炒作、套现等为目的多个账号注册您亦不得盗用其他用户帐号。

\\n

四、我们平台服务使用规范

\\n

1. ,通过我们平台,您可以按照我们的规则销售各种相关的商品。但所发布之信息不得含有如下内容:

\\n

1) 反对宪法所确定的基本原则,煽动抗拒、破坏宪法和法律、行政法规实施的;

\\n

2)煽动危害国家安全、泄露国家秘密、颠覆国家政权,推翻社会主义制度的;

\\n

3)煽动分裂国家、破坏国家统一、损害国家荣誉和民族利益的;

\\n

4)煽动民族仇恨、民族歧视,破坏民族团结的;

\\n

5)捏造或者歪曲事实,散布谣言,扰乱社会秩序的;

\\n

6)进行政治宣传或破坏国家宗教政策、宣扬封建迷信、淫秽、色情、赌博、暴力、凶杀、恐怖、教唆犯罪的;

\\n

7)公然侮辱他人或者捏造事实诽谤他人的,或者进行其他恶意攻击的;

\\n

8)损害国家机关信誉的;

\\n

9)其他违反宪法和法律法规的;

\\n

2. ,在接受我们服务的过程中,您不得从事下列行为:

\\n

1) ,在使用我们平台服务过程中实施的所有行为均遵守国家法律、法规等规范文件及我们平台各项规则的规定和要求,不违背社会公共利益或公共道德,不损害他人的合法权益,不违反本协议及相关规则。您如果违反前述承诺,产生任何法律后果的,您应以自己的名义独立承担所有的法律责任,并确保我们免于因此产生任何损失或增加费用。

\\n

2) ,不发布国家禁止发布的信息,不发布涉嫌侵犯他人知识产权或其它合法权益的信息,不发布违背社会公共利益或公共道德、公序良俗的信息,不发布其它涉嫌违法或违反本协议及各类规则的信息。

\\n

3) ,不对我们平台上的任何数据作商业性利用,包括但不限于在未经我们事先书面同意的情况下,以复制、传播等任何方式使用我们平台上展示的资料。

\\n

4) ,不使用任何装置、软件或例行程序干预或试图干预我们平台的正常运作或正在我们平台上进行的任何活动。您不得采取任何将导致不合理的庞大数据负载加诸我们平台网络设备的行动。

\\n

3. ,您同意,在发现本网站任何内容不符合法律规定,或不符合本用户协议规定的,您有义务及时通知我们。如果您发现您的个人信息被盗用、您的版权或者其他权利被侵害,请将此情况告知我们并同时提供如下信息和材料:

\\n

1)侵犯您权利的信息的网址,编号或其他可以找到该信息的细节;

\\n

2)您是所述的版权或者其他权利的合法拥有者的权利证明;

\\n

3)您的联系方式,包括联系人用户名,地址,电话号码和电子邮件;

\\n

五、终止协议

\\n

1. ,我们将在本平台公布并不时修订隐私权条款,隐私权条款构成本协议的有效组成部分。

\\n

2. ,在您注销本平台账号时或后期不继续使用,我们将停止使用并删除您的信息。

\"}','服务条款中文配置'), +('SERVICE_PROTOCOL_EN','{\"content\":\"

Terms of service

\\n

Definitions

\\n

l ,Platform ,refers to the platform of the website you are currently browsing.

\\n

l ,Users, including registered users and non-registered users, are also referred to as \\\"you\\\". Registered user refers to the user who uses the services of our platform or materials on our website after completing all registration procedures through our platform. Non-registered user refers to the user who does not register, directly logs in to our platform or accesses our platform through other websites to use our Platform services or materials directly or indirectly.

\\n

l ,Parties hereto ,are collectively referred to as \\\"Parties\\\".

\\n

Validity of the Agreement

\\n

1. After you fill in the information according to the prompts on the registration page, read and agree to this Agreement to complete all registration procedures, you will be bound by this Agreement.

\\n

2. The content of this Agreement includes the text of this Agreement \\\"Privacy Policy\\\", all the rules we have published or may publish in the future are an integral part of this Agreement, and have the same legal effect as this Agreement. Unless otherwise expressly stated, any services provided by our website (hereinafter referred to as \\\"our Platform Services\\\") are subject to this Agreement. You undertake to accept and abide by the terms of this Agreement. If you do not agree to the terms of this Agreement, you should immediately stop the registration process or stop using our platform services, If you continue to access and use our platform services, it is deemed that you have confirmed and fully agreed to the contents of this Agreement.

\\n

3. We have the right to formulate and modify this Agreement or various rules from time to time according to the update of national laws and regulations and the adjustment of product and service rules, and publicize it in advance by way of website publicity. If you continue to use our platform services, it means that you accept the revised agreement and rules. In the event of any dispute, our latest agreement and rules shall prevail.

\\n

 ,

\\n

Registration

\\n

1. After you complete the registration procedure to use our platform services, you should be a natural person with the corresponding capacity for civil conduct (minors over the age of 16, whose main source of living is their own labor income, regarded as a person with full capacity for civil conduct), legal person or other organization. If you do not have the above-mentioned subject qualifications, you and your parents or legal guardian (hereinafter collectively referred to as the \\\"guardian\\\") shall bear all the consequences caused by this, and we have the right to cancel your account and claim compensation from you and your guardian.

\\n

2. We attach great importance to the protection of the security of the collection and use of young people\'s personal information. We recommend that any minors under the age of 18 who participate in online activities should obtain the prior verifiable consent of their guardians and comply with the National Convention on Youth Internet Civility. Guardians should bear the primary responsibility for the risks of minors\' online activities and the protection of minors\' online privacy.

\\n

3. After you sign this Agreement and complete the registration process, you are responsible for the security of your user name and login password, as well as for the actions carried out through your account and password, and we cannot and will not be liable for any loss or damage arising therefrom. Your user name and login password shall not be transferred, borrowed, donated, inherited (except for the property rights related to the account) in any way or displayed or sold on the third party platform, unless there is a law or the order of the administrative and judicial authorities, and with our consent. Otherwise, all losses caused to you (or us, any third party) shall be borne by you (or be liable for compensation).

\\n

4. In the process of registering an account or using our platform services, you should provide legitimate, true and accurate personal information. If there is any change in the personal information you fill in, you should update it in time. If the personal information you provide is illegal, untrue and inaccurate, you shall bear the corresponding responsibilities and consequences caused by it, and we reserve the right to terminate your use of our services.

\\n

5.You understand and agree to abide by the terms of this agreement, aftercompleting the registration process through our platform, you can become a registered user of our platform.

\\n

6.You shall not maliciously register our website account by any means, including butnot limited to the registration of multiple accounts for the purpose of profit, speculation, cash out, etc., and you shall not steal other users\' accounts.

\\n

 ,

\\n

 ,Our platform service usage specifications ,

\\n

1.Through our platform, you can sell all kinds of related goods according to our rules.However, the information posted shall not contain the following content:

\\n

l ,opposing the basic principles set forth in the Constitution, inciting resistance to,or undermining the implementation of the Constitution, laws, and administrative regulations,

\\n

l , ,Inciting subversion of state power, endangering national security, leaking state secrets, and overthrowing the socialist system.

\\n

l ,incitement to split the country, undermine national unity, or harm nationalhonor and national interests,

\\n

l ,inciting ethnic hatred, ethnic discrimination and undermining ethnic unity,

\\n

l ,fabricating or distorting facts, spreading rumors and disturbing social order,

\\n

l ,Conducting political propaganda or undermining the state\'s religious policies, propagating feudal superstition, obscenity, pornography, gambling, violence, murder, terror, or instigating crimes,

\\n

l ,Openly insulting others or fabricating facts to slander others, or carrying out other malicious attacks,

\\n

l ,damaging the reputation of state organs,

\\n

l ,other activities that violate the Constitution, laws and regulations,

\\n

2. In the process of receiving our services, you shall not engage in the following acts:

\\n

l ,All acts carried out in the process of using our platform services shall comply with the provisions and requirements of national laws, regulations and other normative documents and the rules of our platform, and shall not violate the public interest or public morality, harm the legitimate rights and interests of others, and violate this Agreement and relevant rules. If you violate the above commitments, resulting in any legal consequences, you shall independently bear all legal responsibilities in your own name, and ensure that we are free from any loss or increase in costs.

\\n

l ,Do not publish information prohibited by the State, do not publish information suspected of infringing others\' intellectual property rights or other legitimate rights and interests, do not publish information contrary to social public interests or public morality, public order and good customs, do not publish other information suspected of violating the law or in violation of this Agreement and various rules.

\\n

l ,Not to make commercial use of any data on our platform, including but not limited to using the materials displayed on our platform by any means such as copying, disseminating or otherwise without our prior written consent.

\\n

l ,Not use any device, software or routine to interfere or attempt to interfere with the proper operation of our Platform or any activity being conducted on our Platform. You may not take any action that would result in an unreasonably large data load being placed on the equipment on our Platform network.

\\n

3. You agree that you are obligated to notify us in a timely manner if you find any content on this Site that does not comply with the law or the provisions of this User Agreement. If you find that your personal information has been used, your copyright or other rights have been infringed, please inform us of this situation and provide the following information and materials:

\\n

l ,the web address, serial number or other details of the information that infringes your rights,

\\n

l ,proof of rights that you are the legal owner of said copyright or other rights,

\\n

l ,your contact information, including contact username, address, phone number and email,

\\n

Termination of the agreement

\\n

1. We will revise the Privacy Policy from time to time when it is published on this platform, and the Privacy policy forms an effective part of this Agreement.

\\n

2. If you do not continue to use this platform when you cancel your account or later, we will stop using it and delete your information.

\"}','服务条款英文配置'); + +# 修改积分成长值配置名称,645为原本的成长值配置 +USE mall4cloud_auth; +update menu set name = '积分成长值',title = '积分成长值' where menu_id = 645; + +# 菜单资源修改 +# 257, 264为旧轮播图,旧分组管理的菜单id +# 677, 678为新轮播图,新分组管理的菜单id +UPDATE menu_permission +SET menu_id = 677 +WHERE + menu_id = 257; + +UPDATE menu_permission +SET menu_id = 678 +WHERE + menu_id = 264; diff --git a/db/23-09-05-application.sql b/db/23-09-05-application.sql new file mode 100644 index 0000000..0bdf505 --- /dev/null +++ b/db/23-09-05-application.sql @@ -0,0 +1,6 @@ +# 增加分布式id的wordId +# 如果测试环境、开发环境、生产环境用的都是同一套支付系统,那么会面临一个问题: +# 测试环境中的支付单号1,会与生产环境中的支付单号1重复。所以需要在不同的环境增加一个需要,比如加多个序号测试环境的1会变成11,开发环境的1会变成21 +# 需要在`mall4cloud-leaf.yml` 修改这个配置,请配置10-99。请手动在不同的环境加上不同的id +application: + workerId: 10 diff --git a/es/2023-08-14-订单用户地址字段.md b/es/2023-08-14-订单用户地址字段.md new file mode 100644 index 0000000..00d4b27 --- /dev/null +++ b/es/2023-08-14-订单用户地址字段.md @@ -0,0 +1,12 @@ +# 增加订单用户地址字段 + +``` +PUT order/_mapping/_doc?include_type_name=true +{ + "properties": { + "receivingAddr": { + "type": "text" + } + } +} +``` diff --git a/es/2024-01-08 新增订单组合商品字段.md b/es/2024-01-08 新增订单组合商品字段.md new file mode 100644 index 0000000..36db422 --- /dev/null +++ b/es/2024-01-08 新增订单组合商品字段.md @@ -0,0 +1,135 @@ +# 新增订单组合商品字段 + +``` +PUT order/_mapping/_doc?include_type_name=true +{ + "properties": { + "mainOrderId": { + "type": "long" + }, + "orderItems": { + "type": "nested", + "properties": { + "writeOffNum": { + "type": "integer" + }, + "spuMold": { + "type": "integer" + }, + "writeOffMultipleCount": { + "type": "integer" + }, + "writeOffStart": { + "type": "date" + }, + "writeOffEnd": { + "type": "date" + } + } + } + } +} +``` + +# 新增调拨订单ES数据 +PUT allot-order +```json +{ + "mappings": { + "properties": { + "allotOrderId": { + "type": "long" + }, + "outWarehouseId": { + "type": "long" + }, + "outStockPointType": { + "type": "integer" + }, + "inWarehouseId": { + "type": "long" + }, + "inStockPointType": { + "type": "integer" + }, + "dvyCompanyId": { + "type": "long" + }, + "dvyType": { + "type": "integer" + }, + "dvyOrderNumber": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "status": { + "type": "integer" + }, + "totalAllotCount": { + "type": "integer" + }, + "remark": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "shopId": { + "type": "long" + }, + "sysType": { + "type": "integer" + }, + "createTime": { + "type": "date" + }, + "updateTime": { + "type": "date" + }, + "allotOrderItems": { + "type": "nested", + "properties": { + "allotOrderItemId": { + "type": "long" + }, + "spuId": { + "type": "long" + }, + "skuId": { + "type": "long" + }, + "allotCount": { + "type": "integer" + }, + "allotInCount": { + "type": "integer" + } + } + } + } + } +} +``` + +# 新增商品配送方式字段 +PUT product/_mapping/_doc?include_type_name=true +```json +{ + "properties": { + "deliveryMode": { + "type": "nested", + "properties": { + "hasUserPickUp": { + "type": "boolean" + }, + "hasShopDelivery": { + "type": "boolean" + }, + "hasCityDelivery": { + "type": "boolean" + } + } + } + } +} +``` diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/CategoryApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/CategoryApi.java new file mode 100644 index 0000000..da8104c --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/CategoryApi.java @@ -0,0 +1,126 @@ +package com.tmerclub.cloud.systemtest.api.amount; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + + +/** + * @author Tu + * 分类数据 + * + */ +public class CategoryApi { + + /** + * 获取店铺签约的可用分类列表(发布商品时使用) + */ + public static List listShopCategory(Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_product/mp/category/enable_categories"; + if(isMainShop) { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SHOP)), CategoryAppVO.class); + } else { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SHOP_OTHER)), CategoryAppVO.class); + } + } + + public static List listSigningCategory(Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_product/m/apply_shop/category/list_signing_category?status=1"; + if(isMainShop) { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SHOP)), CategoryAppVO.class); + } else { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SHOP_OTHER)), CategoryAppVO.class); + } + } + + /** + * 新增平台分类 + */ + public static Long save(CategoryDTO categoryDTO) { + String url = Constant.API_URL + "/mall4cloud_product/mp/category"; + return HttpUtil.post(url, categoryDTO, UrlEnum.PLATFORM, Long.class); + } + + + /** + * 根据分类id查找分类信息 + */ + public static CategoryVO getCategoryInfo(Long categoryId){ + String url = Constant.API_URL + "/mall4cloud_product/mp/category?categoryId=" + categoryId; + return HttpUtil.get(url, CategoryVO.class, UrlEnum.PLATFORM); + + } + + /** + * 修改分类信息 + */ + public static void update(CategoryDTO categoryDTO){ + String url = Constant.API_URL + "/mall4cloud_product/mp/category"; + HttpUtil.put(url, categoryDTO, UrlEnum.PLATFORM); + } + + /** + * 删除平台分类 + */ + public static void delete(Long categoryId) { + String url = Constant.API_URL + "/mall4cloud_product/mp/category?categoryId=" + categoryId; + HttpUtil.delete(url, UrlEnum.PLATFORM); + } + + /** + * 店铺增加签约分类 + */ + public static void addSigningCategory(List categoryShopDTOList, Boolean isMainShop){ + String url = Constant.API_URL + "/mall4cloud_product/m/apply_shop/category/add_signing_category"; + if(isMainShop) { + HttpUtil.post(url, categoryShopDTOList,UrlEnum.SHOP); + } else { + HttpUtil.post(url, categoryShopDTOList,UrlEnum.SHOP_OTHER); + } + } + + + /** + * 查询供应商签约类目(发布商品时使用) + * */ + public static List listSupplierCategory(Boolean isMainSupplier) { + String url = Constant.API_URL + "/mall4cloud_product/s/apply_supplier/category/list_signing_category"; + if(isMainSupplier) { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SUPPLIER)), CategoryAppVO.class); + } else { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SUPPLIER_OTHER)), CategoryAppVO.class); + } + } + + + /** + * 供应商 增加签约分类 + */ + public static void addSupplierCategory(List categoryShopDTOList, Boolean isMainSupplier){ + String url = Constant.API_URL + "/mall4cloud_product/s/apply_supplier/category/add_signing_category"; + if(isMainSupplier) { + HttpUtil.post(url, categoryShopDTOList,UrlEnum.SUPPLIER); + } else { + HttpUtil.post(url, categoryShopDTOList,UrlEnum.SUPPLIER_OTHER); + } + } + + /** + * 查询供应商可签约类目(需要签约类目,查询平台类目时使用) + * */ + public static List listSupplierApplyCategory(Boolean isMainSupplier) { + String url = Constant.API_URL + "/mall4cloud_product/s/apply_supplier/category/list_apply_signing_category"; + if(isMainSupplier) { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SUPPLIER)), CategoryVO.class); + } else { + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url, List.class,UrlEnum.SUPPLIER_OTHER)), CategoryVO.class); + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/CouponApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/CouponApi.java new file mode 100644 index 0000000..6afa24f --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/CouponApi.java @@ -0,0 +1,155 @@ +//package com.tmerclub.cloud.systemtest.api.amount; +// +//import cn.hutool.http.HttpRequest; +//import cn.hutool.http.HttpResponse; +//import com.alibaba.fastjson2.JSON; +//import com.alibaba.fastjson2.JSONObject; +//import com.yami.shop.bean.app.dto.CouponDto; +//import com.yami.shop.bean.model.OfflineHandleEvent; +//import com.yami.shop.bean.param.OfflineHandleEventAuditParam; +//import com.yami.shop.common.util.Json; +//import com.yami.shop.coupon.common.model.Coupon; +//import com.yami.shop.coupon.common.model.CouponUser; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.CheckUtil; +//import com.yami.shop.systemtest.util.HttpUtil; +// +//import java.util.List; +// +///** +// * @author lh +// */ +//public class CouponApi { +// +// public static Long save(Coupon coupon){ +// String url = Constant.SHOP_URL+"/admin/coupon"; +// return HttpUtil.post(url,coupon,Long.class,true); +// } +// +// public static Long platformSave(Coupon coupon){ +// String url = Constant.PLATFORM_URL+"/platform/coupon"; +// return HttpUtil.post(url,coupon,Long.class,true); +// } +// +// public static String receive(Long couponId){ +// String url = Constant.API_URL+"/p/myCoupon/receive"; +// HttpRequest post = HttpRequest.post(url); +// post.header("authorization", Constant.API_TOKEN); +// post.header("content-type","application/json; charset=UTF-8"); +// HttpResponse response = post.body(Json.toJsonString(couponId)).execute(); +// return CheckUtil.checkAndGetObject(response,String.class); +// } +// +// +// public static List list(){ +// String url = Constant.API_URL+"/p/myCoupon/listCouponIds"; +// List list = HttpUtil.get(url, List.class); +// return JSON.parseArray(JSONObject.toJSONString(list), CouponDto.class); +// } +// +// /** +// * 用户删除优惠券 +// */ +// public static void userDelete(Long couponId) { +// String url = Constant.API_URL + "/p/myCoupon/delCoupon/" + couponId; +// HttpUtil.delete(url); +// } +// +// public static Coupon getCouponById(Long couponId){ +// String url = Constant.SHOP_URL+"/admin/coupon/info/"+couponId; +// return HttpUtil.get(url,Coupon.class); +// } +// +// /** +// * 修改优惠券 +// */ +// public static void update(Coupon coupon) { +// String url = Constant.SHOP_URL + "/admin/coupon"; +// HttpUtil.put(url, coupon); +// } +// +// /** +// * 店铺删除优惠券 +// */ +// public static void delete(Long couponId) { +// String url = Constant.SHOP_URL + "/admin/coupon"; +// HttpUtil.delete(url, couponId); +// } +// +// /** +// * 平台违规下架优惠券 +// */ +// public static void offline(OfflineHandleEvent offlineHandleEvent) { +// String url = Constant.PLATFORM_URL + "/platform/coupon/offline"; +// HttpUtil.post(url, offlineHandleEvent); +// } +// +// /** +// * 商家根据优惠券ID获取下架信息 +// */ +// public static OfflineHandleEvent getOfflineHandleEvent(Long couponId) { +// String url = Constant.SHOP_URL + "/admin/coupon/getOfflineHandleEventByCouponId/" + couponId; +// return HttpUtil.get(url, OfflineHandleEvent.class); +// } +// +// /** +// * 商家根据下架信息申请上架 +// */ +// public static void applyOnline(OfflineHandleEventAuditParam offlineHandleEventAuditParam) { +// String url = Constant.SHOP_URL + "/admin/coupon/auditApply"; +// HttpUtil.post(url, offlineHandleEventAuditParam); +// } +// +// /** +// * 平台根据优惠券ID获取下架信息 +// */ +// public static OfflineHandleEvent getOfflineHandleEventByPlatform(Long couponId) { +// String url = Constant.PLATFORM_URL + "/platform/coupon/getOfflineHandleEventByCouponId/" + couponId; +// return HttpUtil.get(url, OfflineHandleEvent.class); +// } +// +// /** +// * 平台根据下架信息审核 +// */ +// public static void audit(OfflineHandleEventAuditParam offlineHandleEventAuditParam) { +// String url = Constant.PLATFORM_URL + "/platform/coupon/auditCoupon"; +// HttpUtil.post(url, offlineHandleEventAuditParam); +// } +// +// /** +// * 根据用户id获取优惠券信息 +// * @param userId +// * @return +// */ +// public static List getCouponUserByUserId(String userId){ +// String url = Constant.SHOP_URL+"/admin/couponUser/info/"+userId; +// Object result = HttpUtil.get(url, Object.class); +// List couponUsers = JSON.parseArray(result.toString(), CouponUser.class); +// return couponUsers; +// } +// +// /** +// * 根据优惠券ID获取平台优惠券信息 +// */ +// public static Coupon getPlatformCouponById(Long couponId) { +// String url = Constant.PLATFORM_URL + "/platform/coupon/info/" + couponId; +// return HttpUtil.get(url, Coupon.class); +// } +// +// /** +// * 修改平台优惠券 +// */ +// public static void updatePlatformCoupon(Coupon coupon) { +// String url = Constant.PLATFORM_URL + "/platform/coupon"; +// HttpUtil.put(url, coupon); +// } +// +// /** +// * 删除平台优惠券 +// */ +// public static void deletePlatformCoupon(Long couponId) { +// String url = Constant.PLATFORM_URL + "/platform/coupon"; +// HttpUtil.delete(url, couponId); +// } +// +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/DeliverApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/DeliverApi.java new file mode 100644 index 0000000..b502c19 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/DeliverApi.java @@ -0,0 +1,32 @@ +//package com.tmerclub.cloud.systemtest.api.amount; +// +//import com.yami.shop.bean.model.Order; +//import com.yami.shop.delivery.common.param.DeliveryOrderItemParam; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.HttpUtil; +// +///** +// * @author lanhai +// */ +//public class DeliverApi { +// /** +// * 发货 +// * +// */ +// public static void orderItemsDelivery(DeliveryOrderItemParam deliveryOrderItemParam){ +// String uri = Constant.SHOP_URL+"/order/delivery/orderItemsDelivery"; +// HttpUtil.put(uri,deliveryOrderItemParam); +// } +// +// /** +// * 根据订单号获取未发货 +// * @param orderNumber +// * @return +// */ +// public static Order getOrderItemUnDelivery(String orderNumber){ +// String uri = Constant.SHOP_URL+"/order/delivery/getOrderItemUnDelivery/"+orderNumber; +// return HttpUtil.get(uri, Order.class); +// } +// +// +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/SeckillApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/SeckillApi.java new file mode 100644 index 0000000..7aceb9d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/amount/SeckillApi.java @@ -0,0 +1,130 @@ +//package com.tmerclub.cloud.systemtest.api.amount; +// +//import com.alibaba.fastjson2.JSON; +//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import com.yami.shop.bean.app.dto.OrderNumbersDto; +//import com.yami.shop.bean.app.param.SubmitSeckillOrderParam; +//import com.yami.shop.bean.model.OfflineHandleEvent; +//import com.yami.shop.bean.param.OfflineHandleEventAuditParam; +//import com.yami.shop.common.util.Json; +//import com.yami.shop.seckill.api.param.SeckillOrderParam; +//import com.yami.shop.seckill.common.model.Seckill; +//import com.yami.shop.seckill.multishop.param.SeckillParam; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.HttpUtil; +// +//import java.util.List; +// +///** +// * @author lanhai +// */ +//public class SeckillApi { +// /** +// * 新建秒杀活动 +// * @param seckillParam +// */ +// public static void createSeckill(SeckillParam seckillParam){ +// String url = Constant.SHOP_URL+"/seckill/seckill"; +// HttpUtil.post(url,seckillParam); +// } +// +// /** +// * 获取秒杀活动列表 +// */ +// public static List listSeckill() { +// String url = Constant.SHOP_URL + "/seckill/seckill/page"; +// return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, Page.class)), Page.class).getRecords()), Seckill.class); +// } +// +// /** +// * 平台违规下架秒杀活动 +// */ +// public static void offine(OfflineHandleEvent offlineHandleEvent) { +// String url = Constant.PLATFORM_URL + "/platform/seckill/offline"; +// HttpUtil.post(url, offlineHandleEvent); +// } +// +// /** +// * 商家根据活动ID获取下架信息 +// */ +// public static OfflineHandleEvent getOfflineHandleEvent(Long seckillId) { +// String url = Constant.SHOP_URL + "/seckill/seckill/getOfflineHandleEventBySeckillId/" + seckillId; +// return HttpUtil.get(url, OfflineHandleEvent.class); +// } +// +// /** +// * 商家根据活动下架信息申请上架 +// */ +// public static void applyOnline(OfflineHandleEventAuditParam offlineHandleEventAuditParam) { +// String url = Constant.SHOP_URL + "/seckill/seckill/auditApply"; +// HttpUtil.post(url, offlineHandleEventAuditParam); +// } +// +// /** +// * 平台根据活动ID获取下架信息 +// */ +// public static OfflineHandleEvent getOfflineHandleEventBySeckillId(Long seckillId) { +// String url = Constant.PLATFORM_URL + "/platform/seckill/getOfflineHandleEventBySeckillId/" + seckillId; +// return HttpUtil.get(url, OfflineHandleEvent.class); +// } +// +// /** +// * 平台根据活动下架信息审核 +// */ +// public static void audit(OfflineHandleEventAuditParam offlineHandleEventAuditParam) { +// String url = Constant.PLATFORM_URL + "/platform/seckill/auditSeckill"; +// HttpUtil.post(url, offlineHandleEventAuditParam); +// } +// +// +// /** +// * 店铺关闭秒杀活动 +// */ +// public static void closeSeckill(Long seckillId) { +// String url = Constant.SHOP_URL + "/seckill/seckill/invalid/" + seckillId; +// HttpUtil.put(url, seckillId); +// } +// +// /** +// * 店铺删除秒杀活动 +// * @param seckillId +// */ +// public static void shopDeleteSeckill(Long seckillId){ +// String url = Constant.SHOP_URL+"/seckill/seckill/"+seckillId; +// HttpUtil.delete(url); +// } +// +// /** +// * 平台删除秒杀活动 +// * @param seckllId +// */ +// public static void deleteSeckill(Long seckllId){ +// String url = Constant.PLATFORM_URL+"/seckill/seckill/"+seckllId; +// HttpUtil.delete(url); +// } +// +// +// /** +// * 用户根据商品ID获取秒杀订单路径 +// */ +// public static String getSeckillPath(Long productId) { +// String url = Constant.API_URL + "/p/seckill/orderPath?prodId=" + productId; +// return HttpUtil.get(url, String.class); +// } +// +// /** +// * 用户根据商品ID购买秒杀商品 +// */ +// public static void buySeckill(SeckillOrderParam seckillOrderParam, String path) { +// String url = Constant.API_URL + "/p/seckill/" + path + "/confirm"; +// HttpUtil.post(url, seckillOrderParam); +// } +// +// /** +// * 提交秒杀订单 +// */ +// public static OrderNumbersDto submitSeckillOrder(String path, SubmitSeckillOrderParam submitSeckillOrderParam) { +// String url = Constant.API_URL + "/p/seckill/" + path + "/submit"; +// return HttpUtil.post(url, submitSeckillOrderParam, OrderNumbersDto.class); +// } +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/LoginApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/LoginApi.java new file mode 100644 index 0000000..614dc54 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/LoginApi.java @@ -0,0 +1,16 @@ +//package com.tmerclub.cloud.systemtest.api.login; +// +//import com.yami.shop.security.common.dto.AuthenticationDTO; +//import com.yami.shop.security.common.vo.TokenInfoVO; +//import com.yami.shop.systemtest.constants.Constant; +//import com.yami.shop.systemtest.util.HttpUtil; +// +///** +// * @author lanhai +// */ +//public class LoginApi { +// public static TokenInfoVO login(AuthenticationDTO authenticationDTO){ +// String url = Constant.API_URL + "/login"; +// return HttpUtil.post(url,authenticationDTO, TokenInfoVO.class,true); +// } +//} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/UserApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/UserApi.java new file mode 100644 index 0000000..ec42c36 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/login/UserApi.java @@ -0,0 +1,19 @@ +package com.tmerclub.cloud.systemtest.api.login; + +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author lpj + */ +public class UserApi { + /** + * 获取用户信息 + */ + public static UserApiVO getUserInfo() { + String url = Constant.API_URL + "/mall4cloud_user/user/ma/user_detail_info"; + return HttpUtil.get(url, UserApiVO.class, UrlEnum.API); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/CouponApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/CouponApi.java new file mode 100644 index 0000000..814b41e --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/CouponApi.java @@ -0,0 +1,164 @@ +package com.tmerclub.cloud.systemtest.api.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class CouponApi { + /** + * 商家获取优惠券列表 + */ + public static List getShopCouponPage() { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon/page?pageSize=10&pageNum=1&couponName=&couponType=&getWay="; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), CouponVO.class); + } + + /** + * 商家新建店铺优惠券 + */ + public static void saveShopCoupon(CouponDTO couponDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon"; + HttpUtil.post(url, couponDTO, UrlEnum.SHOP); + } + + /** + * 商家获取优惠券信息 + */ + public static CouponVO getShopCouponInfo(Long couponId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon?couponId=" + couponId; + return HttpUtil.get(url, CouponVO.class, UrlEnum.SHOP); + } + + /** + * 商家修改优惠券信息 + */ + public static void updateShopCoupon(CouponDTO couponDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon"; + HttpUtil.put(url, couponDTO, UrlEnum.SHOP); + } + + /** + * 商家删除优惠券 + */ + public static void deleteShopCoupon(Long couponId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon?couponId=" + couponId; + HttpUtil.delete(url, UrlEnum.SHOP); + } + + /** + * 平台违规下架活动 + */ + public static void offline(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon/offline"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 商家获取最新下架信息 + */ + public static OfflineHandleEventVO shopGetOfflineHandleEvent(Long couponId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon/get_offline_handle_event/" + couponId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.SHOP); + } + + /** + * 商家申请上架,提交审核 + */ + public static void apply(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon/audit_apply"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.SHOP); + } + + /** + * 平台获取最新下架信息 + */ + public static OfflineHandleEventVO platformGetOfflineHandleEvent(Long couponId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon/get_offline_handle_event/" + couponId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.PLATFORM); + } + + /** + * 平台审核平台活动 + */ + public static void audit(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon/audit"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 平台获取平台优惠券列表 + */ + public static List getPlatformCouponPage() { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon/page?pageSize=10&pageNum=1&couponName=&couponType=&getWay="; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.PLATFORM)), PageVO.class).getList()), CouponVO.class); + } + + /** + * 平台新建平台优惠券 + */ + public static void savePlatformCoupon(CouponDTO couponDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon"; + HttpUtil.post(url, couponDTO, UrlEnum.PLATFORM); + } + + /** + * 平台获取平台优惠券信息 + */ + public static CouponVO getPlatformCouponInfo(Long couponId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon?couponId=" + couponId; + return HttpUtil.get(url, CouponVO.class, UrlEnum.PLATFORM); + } + + /** + * 平台修改平台优惠券信息 + */ + public static void updatePlatformCoupon(CouponDTO couponDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon"; + HttpUtil.put(url, couponDTO, UrlEnum.PLATFORM); + } + + /** + * 平台删除平台优惠券 + */ + public static void deletePlatformCoupon(Long couponId) { + String url = Constant.API_URL + "/mall4cloud_marketing/mp/coupon?couponId=" + couponId; + HttpUtil.delete(url, UrlEnum.PLATFORM); + } + + /** + * 用户领取优惠券 + */ + public static void receive(Long couponId) { + String url = Constant.API_URL + "/mall4cloud_marketing/my_coupon/receive"; + HttpUtil.post(url, couponId, UrlEnum.API); + } + + /** + * 用户获取优惠券列表 + */ + public static List getUserCouponPage() { + String url = Constant.API_URL + "/mall4cloud_marketing/my_coupon/get_page?pageSize=10&pageNum=1&status=1&type=0"; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.API)), PageVO.class).getList()), CouponAppVO.class); + } + + /** + * 用户删除优惠券 + */ + public static void deleteUserCoupon(Long couponUserId) { + String url = Constant.API_URL + "/mall4cloud_marketing/my_coupon/delete_coupon/" + couponUserId; + HttpUtil.delete(url, UrlEnum.API); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/DistributionProdApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/DistributionProdApi.java new file mode 100644 index 0000000..8549982 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/DistributionProdApi.java @@ -0,0 +1,103 @@ +package com.tmerclub.cloud.systemtest.api.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.distribution.dto.DistributionSpuDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class DistributionProdApi { + /** + * 获取分销商品列表 + */ + public static List getDistributionProdPage(Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_search/mp/search/page_distribution_spu?pageSize=10&pageNum=1&distributionSpu=true&spuName=&distributionState="; + if(isMainShop) { + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, EsPageVO.class, UrlEnum.SHOP)), EsPageVO.class).getList()), SpuAdminVO.class); + } else { + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, EsPageVO.class, UrlEnum.SHOP_OTHER)), EsPageVO.class).getList()), SpuAdminVO.class); + } + } + + /** + * 新增分销商品 + */ + public static void save(DistributionSpuDTO distributionSpuDTO, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/distribution_spu"; + if(isMainShop) { + HttpUtil.post(url, distributionSpuDTO, UrlEnum.SHOP); + } else { + HttpUtil.post(url, distributionSpuDTO, UrlEnum.SHOP_OTHER); + } + } + + /** + * 修改分销商品 + */ + public static void update(DistributionSpuDTO distributionSpuDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/distribution_spu"; + HttpUtil.put(url, distributionSpuDTO, UrlEnum.SHOP); + } + + /** + * 删除分销商品 + */ + public static void delete(Long distributionSpuId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/distribution_spu?distributionSpuId=" + distributionSpuId; + if(isMainShop) { + HttpUtil.delete(url, UrlEnum.SHOP); + } else { + HttpUtil.delete(url, UrlEnum.SHOP_OTHER); + } + } + + /** + * 平台违规下架活动 + */ + public static void offline(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/p/distribution_spu/offline"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 商家获取最新下架信息 + */ + public static OfflineHandleEventVO shopGetOfflineHandleEvent(Long distributionSpuId) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/distribution_spu/get_offline_handle_event?distributionSpuId=" + distributionSpuId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.SHOP); + } + + /** + * 商家申请上架,提交审核 + */ + public static void apply(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/m/distribution_spu/audit_apply"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.SHOP); + } + + /** + * 平台获取最新下架信息 + */ + public static OfflineHandleEventVO platformGetOfflineHandleEvent(Long distributionSpuId) { + String url = Constant.API_URL + "/mall4cloud_marketing/p/distribution_spu/get_offline_handle_event?distributionSpuId=" + distributionSpuId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.PLATFORM); + } + + /** + * 平台审核平台活动 + */ + public static void audit(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_marketing/p/distribution_spu/audit"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/SeckillApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/SeckillApi.java new file mode 100644 index 0000000..61c7ddf --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/marketing/SeckillApi.java @@ -0,0 +1,118 @@ +package com.tmerclub.cloud.systemtest.api.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.seckill.dto.SeckillCategoryDTO; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.model.SeckillCategory; +import com.tmerclub.cloud.seckill.vo.SeckillAdminVO; +import com.tmerclub.cloud.seckill.vo.SeckillSpuVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class SeckillApi { + /** + * 平台新建秒杀分类 + */ + public static void saveSeckillCategory(SeckillCategoryDTO seckillCategoryDTO) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill_category"; + HttpUtil.post(url, seckillCategoryDTO, UrlEnum.PLATFORM); + } + + /** + * 获取秒杀分类列表 + */ + public static List getSeckillCategoryList() { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill_category/list"; + return HttpUtil.get(url, List.class, UrlEnum.PLATFORM); + } + + /** + * 删除秒杀分类 + */ + public static void deleteSeckillCategory(Long categoryId) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill_category?categoryId=" + categoryId; + HttpUtil.delete(url, UrlEnum.PLATFORM); + } + + /** + * 获取可参加的秒杀列表 + */ + public static List getSeckillList() { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/list_seckill?pageSize=10&pageNum=1&name=&type=0"; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), SeckillAdminVO.class); + } + + /** + * 新增秒杀活动 + */ + public static void saveSeckill(SeckillDTO seckillDTO) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill"; + HttpUtil.post(url, seckillDTO, UrlEnum.SHOP); + } + + /** + * 根据时间获取秒杀活动列表 + */ + public static List getSeckillSpuList(Long startTimestamps) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/list_seckill_spu_by_time?pageSize=10&pageNum=1&name=&startTimestamp=" + startTimestamps; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, PageVO.class, UrlEnum.SHOP)), PageVO.class).getList()), SeckillSpuVO.class); + } + + /** + * 失效秒杀活动 + */ + public static void invalidSeckill(Long seckillId) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/invalid/" + seckillId; + HttpUtil.put(url, UrlEnum.SHOP); + } + + /** + * 平台违规下架活动 + */ + public static void offline(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/offline"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 商家获取最新下架信息 + */ + public static OfflineHandleEventVO shopGetOfflineHandleEvent(Long seckillId) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/get_offline_handle_event/" + seckillId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.SHOP); + } + + /** + * 商家申请上架,提交审核 + */ + public static void apply(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/audit_apply"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.SHOP); + } + + /** + * 平台获取最新下架信息 + */ + public static OfflineHandleEventVO platformGetOfflineHandleEvent(Long seckillId) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/get_offline_handle_event/" + seckillId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.PLATFORM); + } + + /** + * 平台审核活动 + */ + public static void audit(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_seckill/mp/seckill/audit"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/CommentApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/CommentApi.java new file mode 100644 index 0000000..b32cbba --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/CommentApi.java @@ -0,0 +1,16 @@ +package com.tmerclub.cloud.systemtest.api.order; + +import com.tmerclub.cloud.product.dto.SpuCommDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author Tu + */ +public class CommentApi { + public static void addComment(SpuCommDTO spuCommDto) { + String url = Constant.API_URL+"/mall4cloud_product/spu_comm/comment"; + HttpUtil.post(url,spuCommDto,UrlEnum.API); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopOrderRefundApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopOrderRefundApi.java new file mode 100644 index 0000000..a88e924 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopOrderRefundApi.java @@ -0,0 +1,52 @@ +package com.tmerclub.cloud.systemtest.api.order; + + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + + +/** + * @author Tu + */ +public class ShopOrderRefundApi { + /** + * 商家查询退款详情 + */ + public static OrderRefundVO infoByRefundSn(Long refundId) { + String url = Constant.API_URL+"/mall4cloud_order/m/order_refund/info/"+refundId; + return HttpUtil.get(url,OrderRefundVO.class, UrlEnum.SHOP); + } + + /** + * 商家处理退款订单 + */ + public static void processRefundOrder(OrderRefundDTO orderRefundParam){ + String url = Constant.API_URL+"/mall4cloud_order/m/order_refund/return_and_refund_audit"; + HttpUtil.put(url,orderRefundParam,UrlEnum.SHOP); + } + /** + * 商家处理退货退款订单 + */ + public static void returnMoney(OrderRefundDTO orderRefundParam){ + String url = Constant.API_URL+"/mall4cloud_order/m/order_refund/return_money"; + HttpUtil.put(url, orderRefundParam, UrlEnum.SHOP); + + } + + /** + * 根据订单号查询退款记录 + */ + public static List getEsOrderRefundVO(Long orderId) { + String url = Constant.API_URL + "/mall4cloud_search/mp/search/order_refund/page?pageSize=10&pageNum=1&orderId=" + orderId + "&returnMoneySts=&refundId=&orderType=&applyType=&refundType=&beginTime=&endTime="; + return JSON.parseArray(JSON.toJSONString(Json.parseObject(JSON.toJSONString(HttpUtil.get(url, EsPageVO.class, UrlEnum.SHOP)), EsPageVO.class).getList()), EsOrderRefundVO.class); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopStationApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopStationApi.java new file mode 100644 index 0000000..2330790 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/order/ShopStationApi.java @@ -0,0 +1,16 @@ +package com.tmerclub.cloud.systemtest.api.order; + +import com.moyuer.cloud.delivery.dto.StationDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author Tu + */ +public class ShopStationApi { + public static void addStation(StationDTO stationDTO){ + String url = Constant.API_URL+"/mall4cloud_order/m/station"; + HttpUtil.post(url,stationDTO, UrlEnum.SHOP); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformProductApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformProductApi.java new file mode 100644 index 0000000..ebc3e6d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/PlatformProductApi.java @@ -0,0 +1,52 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author lpj + */ +public class PlatformProductApi { + /** + * 平台违规下架商品 + */ + public static void offline(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/batch_offline"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 平台获取最新下架信息 + */ + public static OfflineHandleEventVO platformGetOfflineHandleEvent(Long productId) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/get_offline_handle_event/" + productId; + return HttpUtil.get(url, OfflineHandleEventVO.class, UrlEnum.PLATFORM); + } + + /** + * 平台审核平台活动 + */ + public static void audit(OfflineHandleEventDTO offlineHandleEventDTO) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu/audit"; + HttpUtil.post(url, offlineHandleEventDTO, UrlEnum.PLATFORM); + } + + /** + * 平台置顶商品 + */ + public static void toTop(Long productId) { + String url = Constant.API_URL + "/mall4cloud_product/p/spu/to_top?spuId=" + productId; + HttpUtil.put(url, UrlEnum.PLATFORM); + } + + /** + * 平台删除商品 + */ + public static void platformDeleteProduct(Long productId) { + String url = Constant.API_URL + "/mall4cloud_product/mp/spu?spuId=" + productId; + HttpUtil.delete(url, UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreConfigApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreConfigApi.java new file mode 100644 index 0000000..62500c6 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreConfigApi.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.tmerclub.cloud.platform.dto.ScoreConfigDTO; +import com.tmerclub.cloud.platform.vo.ScoreConfigVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author lpj + */ +public class ScoreConfigApi { + /** + * 获取积分配置详情 + */ + public static ScoreConfigVO info() { + String url = Constant.API_URL + "/mall4cloud_admin/p/score_config/info/SCORE_CONFIG"; + return HttpUtil.get(url, ScoreConfigVO.class, UrlEnum.PLATFORM); + } + + /** + * 更新积分配置 + */ + public static void update(ScoreConfigDTO scoreConfigDTO) { + String url = Constant.API_URL + "/mall4cloud_admin/p/score_config"; + HttpUtil.post(url, scoreConfigDTO, UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreOrderApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreOrderApi.java new file mode 100644 index 0000000..4a9e1c4 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/platform/ScoreOrderApi.java @@ -0,0 +1,36 @@ +package com.tmerclub.cloud.systemtest.api.platform; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author lpj + */ +public class ScoreOrderApi { + public static OrderVO getScoreOrderItemAndAddress(Long orderNumber){ + String url = Constant.API_URL+"/mall4cloud_order/mp/order/order_item_and_address/"+orderNumber; + return HttpUtil.get(url, OrderVO.class, UrlEnum.PLATFORM); + } + + public static void scoreOrderDelivery(DeliveryOrderDTO deliveryOrderParam){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order/delivery"; + HttpUtil.post(url,deliveryOrderParam,UrlEnum.PLATFORM); + } + + public static List infoOrderDelivery(Long orderNumber){ + String url = Constant.API_URL+"/mall4cloud_order/mp/order_delivery/info?orderId="+orderNumber; + List deliveryOrderFeignVos = HttpUtil.get(url, List.class,UrlEnum.PLATFORM); + return deliveryOrderFeignVos; + } + + public static void updateOrderDelivery(List list){ + String url = Constant.API_URL + "/mall4cloud_order/mp/order_delivery/update"; + HttpUtil.put(url,list,UrlEnum.PLATFORM); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopApi.java new file mode 100644 index 0000000..245417e --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopApi.java @@ -0,0 +1,12 @@ +package com.tmerclub.cloud.systemtest.api.store; + + +/** + * @author lanhai + */ +public class ShopApi { +// public static ShopDetail info(Boolean useMainShop){ +// String url = Constant.SHOP_URL + "/shop/shopDetail/info"; +// return HttpUtil.get(url, ShopDetail.class, useMainShop); +// } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopRefundAddrApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopRefundAddrApi.java new file mode 100644 index 0000000..0312245 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopRefundAddrApi.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.systemtest.api.store; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.multishop.dto.ShopRefundAddrDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class ShopRefundAddrApi { + public static Long addShopRefundAddr(ShopRefundAddrDTO shopRefundAddrDTO){ + String url = Constant.API_URL +"/mall4cloud_admin/mp/shop_refund_addr"; + return JSON.parseArray(JSON.toJSONString(HttpUtil.post(url,shopRefundAddrDTO, UrlEnum.SHOP,Long.class)),Long.class).get(0); + } + + public static List listShopRefundAddr(){ + String url = Constant.API_URL +"/mall4cloud_admin/mp/shop_refund_addr/list"; + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url,List.class, UrlEnum.SHOP)),ShopRefundAddrVO.class); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopSubstituteSalesApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopSubstituteSalesApi.java new file mode 100644 index 0000000..14d2562 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/ShopSubstituteSalesApi.java @@ -0,0 +1,32 @@ +package com.tmerclub.cloud.systemtest.api.store; + +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.dto.ShopSubstituteSalesDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author lpj + */ +public class ShopSubstituteSalesApi { + /** + * 获取代销设置详情 + */ + public static ShopSubstituteSalesVO getShopSubstituteSales() { + String url = Constant.API_URL + "/mall4cloud_admin/m/shop_substitute_sales"; + return HttpUtil.get(url, ShopSubstituteSalesVO.class, UrlEnum.SHOP); + } + + /** + * 修改代销设置 + */ + public static void updateShopSubstituteSales(ShopSubstituteSalesDTO shopSubstituteSalesDTO, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_admin/m/shop_substitute_sales"; + if(isMainShop) { + HttpUtil.put(url, shopSubstituteSalesDTO, UrlEnum.SHOP); + } else { + HttpUtil.put(url, shopSubstituteSalesDTO, UrlEnum.SHOP_OTHER); + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/SkuApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/SkuApi.java new file mode 100644 index 0000000..cc19ef7 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/SkuApi.java @@ -0,0 +1,22 @@ +package com.tmerclub.cloud.systemtest.api.store; + + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class SkuApi { + public static List getAllSkuList(Long prodId){ + String url = Constant.API_URL + "/mall4cloud_product/m/sku/get_all_skuList?prodId="+prodId; + List list = HttpUtil.get(url, List.class, UrlEnum.SHOP); + List skuList = JSON.parseArray(JSON.toJSONString(list), SkuVO.class); + return skuList; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/TransportApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/TransportApi.java new file mode 100644 index 0000000..e40d2e9 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/store/TransportApi.java @@ -0,0 +1,106 @@ +package com.tmerclub.cloud.systemtest.api.store; + + +import com.alibaba.fastjson2.JSON; +import com.moyuer.cloud.delivery.dto.TransportDTO; +import com.moyuer.cloud.delivery.vo.TransportVO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class TransportApi { + public static void addTransport(TransportDTO transportDTO, Boolean isMainShop){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport"; + if(isMainShop) { + HttpUtil.post(url, transportDTO, UrlEnum.SHOP); + } else { + HttpUtil.post(url, transportDTO, UrlEnum.SHOP_OTHER); + } + } + + public static List infoTransport(Boolean isMainShop){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport/page?pageSize=50&pageNum=1&transName="; + if(isMainShop) { + return JSON.parseArray(HttpUtil.gets(url, UrlEnum.SHOP), TransportVO.class); + } else { + return JSON.parseArray(HttpUtil.gets(url, UrlEnum.SHOP_OTHER), TransportVO.class); + } + } + + public static TransportVO info(Long transportId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_order/mp/transport?transportId=" + transportId; + if(isMainShop) { + return HttpUtil.get(url, TransportVO.class, UrlEnum.SHOP); + } else { + return HttpUtil.get(url, TransportVO.class, UrlEnum.SHOP_OTHER); + } + } + + public static void update(TransportDTO transportDTO, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_order/mp/transport"; + if(isMainShop) { + HttpUtil.put(url, transportDTO, UrlEnum.SHOP); + } else { + HttpUtil.put(url, transportDTO, UrlEnum.SHOP_OTHER); + } + } + + public static void deleteTransport(Long transportId, Boolean isMainShop){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport?transportIds="+transportId; + if(isMainShop) { + HttpUtil.delete(url,UrlEnum.SHOP); + } else { + HttpUtil.delete(url,UrlEnum.SHOP_OTHER); + } + } + + public static List supplierTransportPage(Boolean isMainSupplier){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport/page?pageSize=50&pageNum=1&transName="; + if(isMainSupplier) { + return JSON.parseArray(HttpUtil.gets(url,UrlEnum.SUPPLIER), TransportVO.class); + } else { + return JSON.parseArray(HttpUtil.gets(url,UrlEnum.SUPPLIER_OTHER), TransportVO.class); + } + } + + public static void addSupplierTransport(TransportDTO transportDTO, Boolean isMainSupplier){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport"; + if(isMainSupplier) { + HttpUtil.post(url,transportDTO, UrlEnum.SUPPLIER); + } else { + HttpUtil.post(url,transportDTO, UrlEnum.SUPPLIER_OTHER); + } + } + + public static TransportVO infoSupplierTransport(Long transportId, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_order/mp/transport?transportId=" + transportId; + if(isMainShop) { + return HttpUtil.get(url, TransportVO.class, UrlEnum.SHOP); + } else { + return HttpUtil.get(url, TransportVO.class, UrlEnum.SHOP_OTHER); + } + } + + public static void updateSupplierTransport(TransportDTO transportDTO, Boolean isMainShop) { + String url = Constant.API_URL + "/mall4cloud_order/mp/transport"; + if(isMainShop) { + HttpUtil.put(url, transportDTO, UrlEnum.SHOP); + } else { + HttpUtil.put(url, transportDTO, UrlEnum.SHOP_OTHER); + } + } + + public static void deleteSupplierTransport(Long transportId, Boolean isMainSupplier){ + String url = Constant.API_URL + "/mall4cloud_order/mp/transport?transportIds="+transportId; + if(isMainSupplier) { + HttpUtil.delete(url,UrlEnum.SUPPLIER); + } else { + HttpUtil.delete(url,UrlEnum.SUPPLIER_OTHER); + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierRefundAddrApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierRefundAddrApi.java new file mode 100644 index 0000000..8245398 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierRefundAddrApi.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.systemtest.api.supplier; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.supplier.dto.SupplierRefundAddrDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +import java.util.List; + +/** + * @author Tu + */ +public class SupplierRefundAddrApi { + public static Long addSupplierRefundAddr(SupplierRefundAddrDTO supplierRefundAddrDTO){ + String url = Constant.API_URL +"/mall4cloud_admin/mp/supplier_refund_addr"; + return JSON.parseArray(JSON.toJSONString(HttpUtil.post(url,supplierRefundAddrDTO, UrlEnum.SUPPLIER,Long.class)),Long.class).get(0); + } + + public static List listSupplierRefundAddr(){ + String url = Constant.API_URL +"/mall4cloud_admin/mp/supplier_refund_addr/list"; + return JSON.parseArray(JSON.toJSONString(HttpUtil.get(url,List.class, UrlEnum.SUPPLIER)),SupplierApiRefundAddrVO.class); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierRefundApi.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierRefundApi.java new file mode 100644 index 0000000..80a7fe0 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/api/supplier/SupplierRefundApi.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.systemtest.api.supplier; + +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.moyuer.cloud.systemtest.constants.Constant; +import com.moyuer.cloud.systemtest.util.HttpUtil; +import com.moyuer.cloud.systemtest.util.UrlEnum; + +/** + * @author Tu + */ +public class SupplierRefundApi { + public static void processRefundOrder(OrderRefundDTO orderRefundParam){ + String url = Constant.API_URL+"/mall4cloud_order/s/order_refund/return_and_refund_audit"; + HttpUtil.put(url,orderRefundParam, UrlEnum.SUPPLIER); + } + + /** + * 拒绝退货退款 + * */ + public static void returnMoneyRefundOrder(OrderRefundDTO orderRefundParam){ + String url = Constant.API_URL+"/mall4cloud_order/s/order_refund/return_money"; + HttpUtil.put(url,orderRefundParam, UrlEnum.SUPPLIER); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/constants/Constant.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/constants/Constant.java new file mode 100644 index 0000000..9f9ff19 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/constants/Constant.java @@ -0,0 +1,22 @@ +package com.tmerclub.cloud.systemtest.constants; + +/** + * @author Tu + */ +public class Constant { + + public static final String API_URL = "https://192.0.0.27:8080"; + + public static final String PLATFORM_TOKEN = "b5ed912d-fdc9-4527-bea0-99946e2095cc"; + public static final String SUPPLIER_TOKEN = "54134940-57b6-4068-a180-5a27d23a4adf"; + public static final String OTHER_SUPPLIER_TOKEN = "e6a331c0-75b6-42af-813c-fdfca9605efd"; + public static final String SHOP_TOKEN = "4ff287e9-cc42-4313-a50e-3136e6f12c84"; + public static final String OTHER_SHOP_TOKEN = "5f975b86-c89a-4dba-8425-0e5ddf3479a4"; + public static String API_TOKEN = "42567b93-292e-40a0-b0a3-ac143e354889"; + public static String OTHER_API_TOKEN = "8d8479b1-7db6-4b14-99d7-7bd04e151eab"; + public static String STATION_TOKEN = "d831dfda-201d-4210-afb1-6c16038f8428"; + + + + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/SpuData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/SpuData.java new file mode 100644 index 0000000..a320f9d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/SpuData.java @@ -0,0 +1,145 @@ +package com.tmerclub.cloud.systemtest.data.amount; + +import com.tmerclub.cloud.common.order.bo.DeliveryModeBO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.SpuLangDTO; +import com.tmerclub.cloud.common.util.Json; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Tu + */ +public class SpuData { + public static SpuDTO getRealSpu(Long categoryId,Long shopCategoryId,Long deliveryTemplateId,Long priceFee){ + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setCategoryId(categoryId); + spuDTO.setShopCategoryId(shopCategoryId); + spuDTO.setName("接口自动化实物商品"); + spuDTO.setSellingPoint("商品卖点"); + spuDTO.setDetail("测试商品详情"); + spuDTO.setDeliveryTemplateId(deliveryTemplateId); + spuDTO.setMainImgUrl("/test.png"); + spuDTO.setImgUrls("/test.png"); + spuDTO.setMarketPriceFee(88L); + spuDTO.setPriceFee(priceFee); + spuDTO.setHasSkuImg(0); + spuDTO.setSkuList(getSkuList(priceFee)); + spuDTO.setSupplierSpuType(0); + + List spuLangDTOList = new ArrayList<>(); + SpuLangDTO spuLangDTO = new SpuLangDTO(); + spuLangDTO.setLang(1); + spuLangDTO.setSpuName("接口自动化实物商品"); + spuLangDTOList.add(spuLangDTO); + spuDTO.setSpuLangList(spuLangDTOList); + + spuDTO.setTotalStock(100); + DeliveryModeBO deliveryModeBO = new DeliveryModeBO(); + deliveryModeBO.setHasShopDelivery(true); + deliveryModeBO.setHasUserPickUp(true); + deliveryModeBO.setHasCityDelivery(true); + spuDTO.setDeliveryMode(Json.toJsonString(deliveryModeBO)); + + spuDTO.setSpuMold(0); + spuDTO.setPreSaleType(-1); + spuDTO.setSpuOrigin(0); + + return spuDTO; + } + public static SpuDTO getUnRealSpu(Long categoryId,Long shopCategoryId,Long priceFee,Integer writeOffNum){ + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setCategoryId(categoryId); + spuDTO.setShopCategoryId(shopCategoryId); + spuDTO.setName("接口自动化虚拟商品"); + spuDTO.setSellingPoint("虚拟商品卖点"); + spuDTO.setDetail("虚拟测试商品详情"); + spuDTO.setMainImgUrl("/test.png"); + spuDTO.setImgUrls("/test.png"); + spuDTO.setMarketPriceFee(88L); + spuDTO.setPriceFee(priceFee); + spuDTO.setHasSkuImg(0); + spuDTO.setSkuList(getSkuList(priceFee)); + + spuDTO.setSpuMold(1); + spuDTO.setIsRefund(1); + spuDTO.setPreSaleType(-1); + spuDTO.setSpuOrigin(0); + + + List spuLangDTOList = new ArrayList<>(); + SpuLangDTO spuLangDTO = new SpuLangDTO(); + spuLangDTO.setLang(1); + spuLangDTO.setSpuName("接口自动化虚拟商品"); + spuLangDTOList.add(spuLangDTO); + spuDTO.setSpuLangList(spuLangDTOList); + spuDTO.setSkuList(getSkuList(priceFee)); + + spuDTO.setTotalStock(100); + DeliveryModeBO deliveryModeBO = new DeliveryModeBO(); + deliveryModeBO.setHasShopDelivery(false); + deliveryModeBO.setHasUserPickUp(false); + deliveryModeBO.setHasCityDelivery(false); + spuDTO.setDeliveryMode(Json.toJsonString(deliveryModeBO)); + spuDTO.setDeliveryTemplateId(null); + + spuDTO.setWriteOffNum(writeOffNum); + int writeOffMultipleCount = 3; + if(writeOffNum == -1){spuDTO.setWriteOffMultipleCount(writeOffMultipleCount);} + if(writeOffNum != 0){spuDTO.setWriteOffTime(-1);} + return spuDTO; + } + + + + public static SpuDTO getSupplierSpu(Long categoryId,Long deliveryTemplateId,Long priceFee){ + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setCategoryId(categoryId); + spuDTO.setName("供应商商品-接口自动化"); + spuDTO.setSellingPoint("商品卖点"); + spuDTO.setDetail("测试商品详情-供应商"); + spuDTO.setDeliveryTemplateId(deliveryTemplateId); + spuDTO.setMainImgUrl("/test.png"); + spuDTO.setImgUrls("/test.png"); + spuDTO.setMarketPriceFee(88L); + spuDTO.setPriceFee(priceFee); + spuDTO.setHasSkuImg(0); + spuDTO.setSkuList(getSkuList(priceFee)); + spuDTO.setSupplierSpuType(0); + + List spuLangDTOList = new ArrayList<>(); + SpuLangDTO spuLangDTO = new SpuLangDTO(); + spuLangDTO.setLang(1); + spuLangDTO.setSpuName("供应商商品-接口自动化"); + spuLangDTOList.add(spuLangDTO); + spuDTO.setSpuLangList(spuLangDTOList); + + spuDTO.setTotalStock(100); + DeliveryModeBO deliveryModeBO = new DeliveryModeBO(); + deliveryModeBO.setHasShopDelivery(true); + deliveryModeBO.setHasUserPickUp(true); + deliveryModeBO.setHasCityDelivery(true); + spuDTO.setDeliveryMode(Json.toJsonString(deliveryModeBO)); + + spuDTO.setSpuMold(0); + spuDTO.setPreSaleType(-1); + spuDTO.setSpuOrigin(0); + + return spuDTO; + } + public static List getSkuList(Long priceFee){ + List skuList = new ArrayList<>(); + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setChangeStock(100); + skuDTO.setPriceFee(priceFee); + skuDTO.setMarketPriceFee(88L); + skuDTO.setStock(100); + skuDTO.setStatus(1); + skuDTO.setWeight(1.0); + skuDTO.setVolume(1.0); + skuList.add(skuDTO); + return skuList; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/UserAddrDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/UserAddrDtoData.java new file mode 100644 index 0000000..07ee3bf --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/amount/UserAddrDtoData.java @@ -0,0 +1,64 @@ +package com.tmerclub.cloud.systemtest.data.amount; + +import com.moyuer.cloud.systemtest.api.amount.AddrApi; +import com.tmerclub.cloud.user.dto.UserAddrDTO; + +/** + * @author lpj + */ +public class UserAddrDtoData { + public static UserAddrDTO getUserAddrDTO() { + UserAddrDTO userAddrDTO = new UserAddrDTO(); + userAddrDTO.setAddr("清河东路319号"); + userAddrDTO.setAddrId(0L); + userAddrDTO.setArea("荔湾区"); + userAddrDTO.setAreaId(440103L); + userAddrDTO.setCity("广州市"); + userAddrDTO.setCityId(4401L); + userAddrDTO.setConsignee("用户"); + userAddrDTO.setIsDefault(1); + userAddrDTO.setLat(22.93772); + userAddrDTO.setLng(113.39424); + userAddrDTO.setMobile("19800000001"); + userAddrDTO.setProvince("广东省"); + userAddrDTO.setProvinceId(44L); + + return userAddrDTO; + } + + public static UserAddrDTO getUpdateUserAddrDTO(Long addrId) { + UserAddrDTO userAddrDTO = new UserAddrDTO(); + userAddrDTO.setAddr("清河东路319号"); + userAddrDTO.setAddrId(addrId); + userAddrDTO.setArea("荔湾区"); + userAddrDTO.setAreaId(440103L); + userAddrDTO.setCity("广州市"); + userAddrDTO.setCityId(4401L); + userAddrDTO.setConsignee("用户"); + userAddrDTO.setIsDefault(1); + userAddrDTO.setLat(22.93772); + userAddrDTO.setLng(113.39424); + userAddrDTO.setMobile("19800000001"); + userAddrDTO.setProvince("广东省"); + userAddrDTO.setProvinceId(44L); + + return userAddrDTO; + } + public static UserAddrDTO getUpdataUserAddrDTO() { + UserAddrDTO userAddrDTO = new UserAddrDTO(); + userAddrDTO.setAddr("修改后的地址"); + userAddrDTO.setAddrId(AddrApi.dvyList().get(0).getAddrId()); + userAddrDTO.setArea("荔湾区"); + userAddrDTO.setAreaId(440103L); + userAddrDTO.setIsDefault(1); + userAddrDTO.setLat(22.93772); + userAddrDTO.setLng(113.39424); + userAddrDTO.setMobile("19800000001"); + userAddrDTO.setProvince("广东省"); + userAddrDTO.setCity("广州市"); + userAddrDTO.setCityId(4401L); + userAddrDTO.setConsignee("用户"); + userAddrDTO.setProvinceId(44L); + return userAddrDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/ComboData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/ComboData.java new file mode 100644 index 0000000..efa7c66 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/ComboData.java @@ -0,0 +1,156 @@ +package com.tmerclub.cloud.systemtest.data.marketing; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.combo.vo.ComboVO; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.ShopCartItemDTO; +import com.tmerclub.cloud.common.product.dto.CartComboMatchSpuDTO; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.util.Arith; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.ComboApi; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class ComboData { + /** + * 新增套餐数据 + */ + public static ComboDTO getComboDTO(Long mainSpuId, List matchingSpuIds) { + ComboDTO comboDTO = new ComboDTO(); + comboDTO.setName("测试套餐"); + comboDTO.setStartTime(DateUtil.parse("2023-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + comboDTO.setEndTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + comboDTO.setMainSpu(getComboMainSpu(mainSpuId)); + comboDTO.setMatchingSpus(getMatchingComboSpu(matchingSpuIds)); + + return comboDTO; + } + + private static ComboSpuVO getComboMainSpu(Long mainSpuId) { + ComboSpuVO mainSpu = new ComboSpuVO(); + SpuVO spu = ProductApi.info(mainSpuId, true); + mainSpu.setSpuId(spu.getSpuId()); + mainSpu.setComboPrice(6600L); + mainSpu.setSpuName(spu.getName()); + mainSpu.setSpuStatus(spu.getStatus()); + mainSpu.setLeastNum(2); + mainSpu.setPic("/test.png"); + mainSpu.setRequired(0); + + List skuList = spu.getSkus(); + List comboSpuSkuVOList = skuList.stream().map(i -> BeanUtil.copyProperties(i, ComboSpuSkuVO.class)).collect(Collectors.toList()); + comboSpuSkuVOList.forEach(i->i.setMatchingPrice(6600L)); + mainSpu.setSkuList(comboSpuSkuVOList); + + return mainSpu; + } + + private static List getMatchingComboSpu(List matchingSpuIds) { + List matchingSpus = new ArrayList<>(); + for (Long matchingSpuId : matchingSpuIds) { + ComboSpuVO matchingSpu = new ComboSpuVO(); + SpuVO spu = ProductApi.info(matchingSpuId, true); + matchingSpu.setSpuId(spu.getSpuId()); + matchingSpu.setComboPrice(6600L); + matchingSpu.setSpuName(spu.getName()); + matchingSpu.setSpuStatus(spu.getStatus()); + matchingSpu.setLeastNum(2); + matchingSpu.setPic("/test.png"); + matchingSpu.setRequired(0); + + List skuList = spu.getSkus(); + List comboSpuSkuVOList = skuList.stream().map(i -> BeanUtil.copyProperties(i, ComboSpuSkuVO.class)).collect(Collectors.toList()); + comboSpuSkuVOList.forEach(i->i.setMatchingPrice(6600L)); + matchingSpu.setSkuList(comboSpuSkuVOList); + matchingSpus.add(matchingSpu); + } + + return matchingSpus; + } + + /** + * 修改套餐状态数据 + */ + public static ComboDTO getUpdateStatusData(Long comboId, Integer status) { + ComboDTO comboDTO = new ComboDTO(); + comboDTO.setComboId(comboId); + comboDTO.setStatus(status); + + return comboDTO; + } + + /** + * 修改套餐数据 + */ + public static ComboDTO getUpdateComboDTO(ComboVO comboVO) { + ComboDTO comboDTO = new ComboDTO(); + BeanUtils.copyProperties(comboVO, comboDTO); + + ComboSpuVO mainSpu = new ComboSpuVO(); + BeanUtils.copyProperties(comboVO.getMainSpu(), mainSpu); + + List comboSpuSkuVOList = comboVO.getMainSpu().getSkuList().stream().map(i -> BeanUtil.copyProperties(i, ComboSpuSkuVO.class)).collect(Collectors.toList()); + mainSpu.setSkuList(comboSpuSkuVOList); + comboDTO.setMainSpu(mainSpu); + + comboDTO.setMatchingSpus(new ArrayList<>()); + return comboDTO; + } + + /** + * 套餐下单数据 + */ + public static OrderDTO getComboOrderDTO(Long comboId,Integer comboCount) { + OrderDTO orderDTO = new OrderDTO(); + ComboVO combo = ComboApi.getComboInfo(comboId); + orderDTO.setAddrId(0L); + orderDTO.setCouponIds(new ArrayList<>()); + + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(1); + dvyTypeDTO.setShopId(combo.getShopId()); + ArrayList dvyTypeDTOList = new ArrayList<>(); + dvyTypeDTOList.add(dvyTypeDTO); + orderDTO.setDvyTypes(dvyTypeDTOList); + + orderDTO.setIsScorePay(0); + orderDTO.setUserChangeCoupon(0); + orderDTO.setUserUseScore(0L); + + ShopCartItemDTO shopCartItemDTO = new ShopCartItemDTO(); + shopCartItemDTO.setComboId(comboId); + shopCartItemDTO.setComboMainLeastNum(combo.getMainSpu().getLeastNum()); + shopCartItemDTO.setComboCount(comboCount); + shopCartItemDTO.setCount(comboCount); + shopCartItemDTO.setShopId(combo.getShopId()); + shopCartItemDTO.setSkuId(combo.getMainSpu().getSkuList().get(0).getSkuId()); + shopCartItemDTO.setSpuId(combo.getMainSpuId()); + + List cartComboMatchSpuDTOList = new ArrayList<>(); + for (com.tmerclub.cloud.combo.vo.ComboSpuVO comboSpuVO: combo.getMatchingSpus()) { + CartComboMatchSpuDTO cartComboMatchSpuDTO = new CartComboMatchSpuDTO(); + cartComboMatchSpuDTO.setCount((int) Arith.mul(comboSpuVO.getLeastNum(), comboCount)); + cartComboMatchSpuDTO.setSkuId(comboSpuVO.getSkuList().get(0).getSkuId()); + cartComboMatchSpuDTO.setSpuId(comboSpuVO.getSpuId()); + cartComboMatchSpuDTOList.add(cartComboMatchSpuDTO); + } + shopCartItemDTO.setCartComboMatchSpuDTOS(cartComboMatchSpuDTOList); + + orderDTO.setShopCartItem(shopCartItemDTO); + + return orderDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/DiscountData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/DiscountData.java new file mode 100644 index 0000000..54e07a5 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/DiscountData.java @@ -0,0 +1,66 @@ +package com.tmerclub.cloud.systemtest.data.marketing; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.discount.dto.DiscountDTO; +import com.tmerclub.cloud.discount.dto.DiscountItemDTO; +import com.tmerclub.cloud.discount.vo.DiscountItemVO; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import org.springframework.beans.BeanUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class DiscountData { + /** + * 满减数据 + */ + public static DiscountDTO getDiscount(Integer discountRule, Integer discountType, List discountItemDTOList, Long maxReduceAmount, Integer suitableSpuType, List spuIds, Integer status) { + DiscountDTO discountDTO = new DiscountDTO(); + discountDTO.setDiscountId(0L); + discountDTO.setDiscountName("测试满减活动"); + discountDTO.setDiscountRule(discountRule); + discountDTO.setDiscountType(discountType); + discountDTO.setStartTime(DateUtil.parse("2023-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + discountDTO.setEndTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + discountDTO.setDiscountItemList(discountItemDTOList); + discountDTO.setMaxReduceAmount(maxReduceAmount); + discountDTO.setMobilePic("test.png"); + discountDTO.setPcBackgroundPic("test.png"); + discountDTO.setPcPic("test.png"); + discountDTO.setShopId(null); + discountDTO.setSuitableSpuType(suitableSpuType); + discountDTO.setSpuIds(spuIds); + discountDTO.setStatus(status); + + return discountDTO; + } + + /** + * 满减层级数据 + */ + public static DiscountItemDTO getDiscountItemDTO(Long needAmount, Long discount) { + DiscountItemDTO discountItemDTO = new DiscountItemDTO(); + discountItemDTO.setNeedAmount(needAmount); + discountItemDTO.setDiscount(discount); + + return discountItemDTO; + } + + /** + * 修改后的满减数据 + */ + public static DiscountDTO getUpdateDiscountDTO(DiscountVO discountVO) { + DiscountDTO discountDTO = new DiscountDTO(); + BeanUtils.copyProperties(discountVO, discountDTO); + List discountItemVOList = discountVO.getDiscountItemList(); + List discountItemDTOList = discountItemVOList.stream().map(i -> BeanUtil.copyProperties(i, DiscountItemDTO.class)).collect(Collectors.toList()); + discountDTO.setDiscountItemList(discountItemDTOList); + discountDTO.setDiscountName("修改后的满减活动"); + + return discountDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/DistributionProdData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/DistributionProdData.java new file mode 100644 index 0000000..a2d01f8 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/DistributionProdData.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.systemtest.data.marketing; + +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.distribution.dto.DistributionSpuDTO; +import org.springframework.beans.BeanUtils; + +/** + * @author lpj + */ +public class DistributionProdData { + /** + * 新增分销商品数据 + */ + public static DistributionSpuDTO getDistributionSpuDTO(Long productId, Integer awardMode, Long awardNumbers, Integer parentAwardSet, Long parentAwardNumbers, Integer state) { + DistributionSpuDTO distributionSpuDTO = new DistributionSpuDTO(); + distributionSpuDTO.setDistributionSpuId(0L); + distributionSpuDTO.setSpuId(productId); + distributionSpuDTO.setAwardMode(awardMode); + distributionSpuDTO.setAwardNumbers(awardNumbers); + distributionSpuDTO.setParentAwardSet(parentAwardSet); + distributionSpuDTO.setParentAwardNumbers(parentAwardNumbers); + distributionSpuDTO.setState(state); + + return distributionSpuDTO; + } + + /** + * 修改分销商品数据 + */ + public static DistributionSpuDTO getUpdateDistributionSpuDTO(DistributionSpuVO distributionSpuVO) { + DistributionSpuDTO distributionSpuDTO = new DistributionSpuDTO(); + BeanUtils.copyProperties(distributionSpuVO, distributionSpuDTO); + //切换为按固定数值奖励 + distributionSpuDTO.setAwardMode(1); + return distributionSpuDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/GiveawayData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/GiveawayData.java new file mode 100644 index 0000000..5f56b80 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/GiveawayData.java @@ -0,0 +1,68 @@ +package com.tmerclub.cloud.systemtest.data.marketing; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.product.dto.GiveawayDTO; +import com.tmerclub.cloud.product.dto.GiveawaySpuDTO; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class GiveawayData { + /** + * 新增赠品数据 + */ + public static GiveawayDTO getGiveawayDTO(Long mainProductId, List matchingProductIds) { + GiveawayDTO giveawayDTO = new GiveawayDTO(); + giveawayDTO.setName("测试赠品活动"); + giveawayDTO.setStartTime(DateUtil.parse("2023-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + giveawayDTO.setEndTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + giveawayDTO.setStatus(1); + giveawayDTO.setSpuId(mainProductId); + giveawayDTO.setBuyNum(3); + giveawayDTO.setGiveawaySpuDTOs(getGiveawaySpuDTO(matchingProductIds)); + + return giveawayDTO; + } + + private static List getGiveawaySpuDTO(List matchingProductIds) { + List giveawaySpuDTOList = new ArrayList<>(); + for (Long matchingProductId : matchingProductIds) { + GiveawaySpuDTO giveawaySpuDTO = new GiveawaySpuDTO(); + SpuVO spu = ProductApi.info(matchingProductId, true); + giveawaySpuDTO.setSpuId(spu.getSpuId()); + giveawaySpuDTO.setSpuName(spu.getName()); + giveawaySpuDTO.setRefundPrice(1100L); + giveawaySpuDTO.setGiveawayNum(1); + for (int i=0; i giveawaySpuDTOList = giveawayVO.getGiveawaySpus().stream().map(i -> BeanUtil.copyProperties(i, GiveawaySpuDTO.class)).collect(Collectors.toList()); + giveawayDTO.setGiveawaySpuDTOs(giveawaySpuDTOList); + + return giveawayDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/GroupData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/GroupData.java new file mode 100644 index 0000000..df64f01 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/marketing/GroupData.java @@ -0,0 +1,127 @@ +package com.tmerclub.cloud.systemtest.data.marketing; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderSelfStationDTO; +import com.tmerclub.cloud.common.order.dto.OrderShopDTO; +import com.tmerclub.cloud.common.order.dto.ShopCartItemDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.moyuer.cloud.group.dto.GroupActivityDTO; +import com.moyuer.cloud.group.dto.GroupOrderDTO; +import com.moyuer.cloud.group.dto.GroupSkuDTO; +import com.moyuer.cloud.group.dto.SubmitGroupOrderDTO; +import com.moyuer.cloud.group.vo.GroupActivityVO; +import com.moyuer.cloud.group.vo.GroupSkuVO; +import com.moyuer.cloud.group.vo.app.AppGroupActivityVO; +import com.moyuer.cloud.systemtest.api.marketing.GroupApi; +import com.moyuer.cloud.systemtest.api.store.SkuApi; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class GroupData { + + /** + * 拼团活动数据 + * @param prodId 商品id + */ + public static GroupActivityDTO getGroupActivityDTO(Long prodId){ + GroupActivityDTO groupActivityDTO = new GroupActivityDTO(); + groupActivityDTO.setActivityName("测试拼团活动"); + groupActivityDTO.setGroupActivityId(0L); + groupActivityDTO.setStartTime(DateUtil.parse("2023-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + groupActivityDTO.setEndTime(DateUtil.parse("2026-1-1 00:00:00","yyyy-MM-dd HH:mm:ss")); + groupActivityDTO.setHasRobot(1); + groupActivityDTO.setGroupNumber(2); + groupActivityDTO.setHasMaxNum(0); + groupActivityDTO.setHasGroupTip(1); + groupActivityDTO.setIsPreheat(0); + groupActivityDTO.setMaxNum(null); + groupActivityDTO.setShopId(null); + groupActivityDTO.setStatus(null); + groupActivityDTO.setSpuId(prodId); + + List skuList = SkuApi.getAllSkuList(prodId); + List skuDtos = skuList.stream().map(i -> BeanUtil.copyProperties(i, GroupSkuDTO.class)).collect(Collectors.toList()); + skuDtos.forEach(i->i.setActPrice(6600L)); + groupActivityDTO.setGroupSkuList(skuDtos); + + return groupActivityDTO; + } + + /** + * 修改拼团活动信息 + */ + public static GroupActivityDTO getUpdateGroupActivityDTO(GroupActivityVO groupActivityVO) { + GroupActivityDTO groupActivityDTO = new GroupActivityDTO(); + BeanUtils.copyProperties(groupActivityVO, groupActivityDTO); + List groupSkuVOList = groupActivityVO.getGroupSkuList(); + List skuDtos = groupSkuVOList.stream().map(i -> BeanUtil.copyProperties(i, GroupSkuDTO.class)).collect(Collectors.toList()); + groupActivityDTO.setGroupSkuList(skuDtos); + groupActivityDTO.setActivityName("修改后的拼团活动名称"); + + return groupActivityDTO; + } + + /** + * 团购商品确认订单数据 + */ + public static GroupOrderDTO getGroupOrderDTO(Long productId, Integer count) { + GroupOrderDTO groupOrderDTO = new GroupOrderDTO(); + AppGroupActivityVO appGroupActivityVO = GroupApi.getGroupActivityInfo(productId); + Long shopId = appGroupActivityVO.getShopId(); + groupOrderDTO.setAddrId(0L); + groupOrderDTO.setCouponIds(new ArrayList<>()); + + List dvyTypeDTOList = new ArrayList<>(); + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(1); + dvyTypeDTO.setShopId(shopId); + dvyTypeDTOList.add(dvyTypeDTO); + groupOrderDTO.setDvyTypes(dvyTypeDTOList); + + groupOrderDTO.setGroupSkuId(appGroupActivityVO.getGroupSkuList().get(0).getGroupSkuId()); + groupOrderDTO.setIsScorePay(0); + + ShopCartItemDTO shopCartItemDTO = new ShopCartItemDTO(); + shopCartItemDTO.setCount(count); + shopCartItemDTO.setDistributionUserId(0L); + shopCartItemDTO.setShopId(shopId); + shopCartItemDTO.setSkuId(appGroupActivityVO.getGroupSkuList().get(0).getSkuId()); + shopCartItemDTO.setSpuId(appGroupActivityVO.getSpuId()); + groupOrderDTO.setShopCartItem(shopCartItemDTO); + + groupOrderDTO.setUserChangeCoupon(0); + groupOrderDTO.setUserUseScore(0L); + + return groupOrderDTO; + } + + /** + * 团购订单提交订单数据 + */ + public static SubmitGroupOrderDTO getSubmitGroupOrderDTO(Long groupTeamId, Long shopId) { + SubmitGroupOrderDTO submitGroupOrderDTO = new SubmitGroupOrderDTO(); + submitGroupOrderDTO.setGroupTeamId(groupTeamId); + submitGroupOrderDTO.setOrderInvoiceList(null); + submitGroupOrderDTO.setOrderSelfStationDto(new OrderSelfStationDTO()); + + List orderShopDTOList = new ArrayList<>(); + OrderShopDTO orderShopDTO = new OrderShopDTO(); + orderShopDTO.setShopId(shopId); + orderShopDTO.setRemarks(null); + orderShopDTOList.add(orderShopDTO); + submitGroupOrderDTO.setOrderShopParam(orderShopDTOList); + + submitGroupOrderDTO.setVirtualRemarkList(new ArrayList<>()); + + return submitGroupOrderDTO; + } + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/DeliveryOrderDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/DeliveryOrderDtoData.java new file mode 100644 index 0000000..425754d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/DeliveryOrderDtoData.java @@ -0,0 +1,75 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.moyuer.cloud.systemtest.api.order.OrderApi; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Tu + */ +public class DeliveryOrderDtoData { + public static DeliveryOrderDTO getDeliveryOrderDtoData(Long orderNum) { + DeliveryOrderDTO deliveryOrderDTO = new DeliveryOrderDTO(); + OrderVO orderVO = OrderApi.getOrderItemAndAddress(orderNum); + deliveryOrderDTO.setOrderId(orderVO.getOrderId()); + deliveryOrderDTO.setOrderAddrId(orderVO.getOrderAddrId()); + deliveryOrderDTO.setDeliveryType(1); + deliveryOrderDTO.setDeliveryCompanyId(33L); + deliveryOrderDTO.setDeliveryNo("123456789"); + + List deliveryOrderItemDTOList = new ArrayList<>(); + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + DeliveryOrderItemDTO deliveryOrderItemDTO = new DeliveryOrderItemDTO(); + deliveryOrderItemDTO.setDeliveryOrderId(orderNum); + deliveryOrderItemDTO.setOrderItemId(orderItem.getOrderItemId()); + deliveryOrderItemDTO.setChangeNum(orderItem.getChangeNum()); + deliveryOrderItemDTOList.add(deliveryOrderItemDTO); + } + deliveryOrderDTO.setSelectOrderItems(deliveryOrderItemDTOList); + return deliveryOrderDTO; + } + public static DeliveryOrderDTO getNoDeliveryOrderDtoData(Long orderNum) { + DeliveryOrderDTO deliveryOrderDTO = new DeliveryOrderDTO(); + OrderVO orderVO = OrderApi.getOrderItemAndAddress(orderNum); + deliveryOrderDTO.setOrderId(orderVO.getOrderId()); + deliveryOrderDTO.setOrderAddrId(orderVO.getOrderAddrId()); + deliveryOrderDTO.setDeliveryType(3); + + List deliveryOrderItemDTOList = new ArrayList<>(); + for (int i=0; i deliveryOrderItemDTOList = new ArrayList<>(); + for (int i=0; i giveawayItemIds = new ArrayList<>(); + for (OrderItemVO orderItemVO : MyOrderApi.orderDetail(orderNum).getOrderItems().get(0).getGiveawayList()) { + giveawayItemIds.add(orderItemVO.getOrderItemId()); + } + orderRefundDTO.setGiveawayItemIds(giveawayItemIds); + } + //需核销的虚拟订单,设置可退款数量和退款金额 + if (MyOrderApi.orderDetail(orderNum).getOrderMold().equals(1) && !MyOrderApi.orderDetail(orderNum).getWriteOffNum().equals(0)) { + Integer count = 0; + for (OrderVirtualInfoVO orderVirtualInfoVO : MyOrderApi.orderDetail(orderNum).getVirtualInfoList()) { + if (orderVirtualInfoVO.getIsWriteOff().equals(0)) { + count++; + } + } + orderRefundDTO.setRefundCount(count); + orderRefundDTO.setRefundAmount(getVirtualOrderRefundAmount(orderNum, count)); + } + + return orderRefundDTO; + } + public static OrderRefundDTO getAllOrderRefundDTO(Long orderNum) {// + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setOrderId(orderNum); + orderRefundDTO.setOrderItemId(0L); + orderRefundDTO.setApplyType(1); + orderRefundDTO.setRefundType(1); + orderRefundDTO.setBuyerReason(0); + orderRefundDTO.setBuyerDesc("整单仅退款自动化执行"); + orderRefundDTO.setBuyerMobile("12345678910"); + orderRefundDTO.setImgUrls(""); + orderRefundDTO.setReceived(0); + orderRefundDTO.setRefundAmount(getRefundAmount(orderNum)); + orderRefundDTO.setRefundCount(0); + return orderRefundDTO; + } + public static OrderRefundDTO getAllOrderRefundDeliveryDTO(Long orderNum) { + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setOrderId(orderNum); + orderRefundDTO.setOrderItemId(0L); + orderRefundDTO.setApplyType(2); + orderRefundDTO.setRefundType(1); + orderRefundDTO.setBuyerReason(0); + orderRefundDTO.setBuyerDesc("整单退货退款自动化执行"); + orderRefundDTO.setBuyerMobile("12345678910"); + orderRefundDTO.setImgUrls(""); + orderRefundDTO.setReceived(1); + orderRefundDTO.setRefundAmount(getRefundAmount(orderNum)); + orderRefundDTO.setRefundCount(0); + return orderRefundDTO; + } + + public static Long getRefundAmount(Long orderNum) { + Long refundAmount; + Integer status = 2; + if(MyOrderApi.orderDetail(orderNum).getStatus().equals(status)){ + refundAmount = MyOrderApi.orderDetail(orderNum).getCanRefundAmount(); + }else { + refundAmount = MyOrderApi.orderDetail(orderNum).getCanRefundAmount() - MyOrderApi.orderDetail(orderNum).getTransfee(); + } + return refundAmount; + } + /** + * 部分退款-移除赠品,退货退款 + */ + public static OrderRefundDTO getOrderRefundDtoRemoveGiveaway(Long orderNum) { + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setOrderId(orderNum); + orderRefundDTO.setOrderItemId(MyOrderApi.orderDetail(orderNum).getOrderItems().get(0).getOrderItemId()); + orderRefundDTO.setApplyType(2); + orderRefundDTO.setRefundType(2); + orderRefundDTO.setBuyerDesc("部分退款移除赠品自动化执行"); + orderRefundDTO.setBuyerReason(0); + orderRefundDTO.setBuyerMobile("12345678910"); + orderRefundDTO.setImgUrls(""); + orderRefundDTO.setReceived(0); + orderRefundDTO.setRefundAmount((long) Arith.sub(MyOrderApi.orderDetail(orderNum).getOrderItems().get(0).getActualTotal(), MyOrderApi.orderDetail(orderNum).getOrderItems().get(0).getGiveawayList().get(0).getGiveawayAmount())); + orderRefundDTO.setRefundCount(0); + orderRefundDTO.setGiveawayItemIds(new ArrayList<>()); + + return orderRefundDTO; + } + public static OrderRefundDTO getOrderRefundDeliveryDTO(Long orderNum,Long refundAmount) { + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setOrderId(orderNum); + orderRefundDTO.setOrderItemId(MyOrderApi.orderDetail(orderNum).getOrderItems().get(0).getOrderItemId()); + orderRefundDTO.setApplyType(2); + orderRefundDTO.setRefundType(2); + orderRefundDTO.setBuyerReason(0); + orderRefundDTO.setBuyerDesc("部分退货退款自动化执行"); + orderRefundDTO.setBuyerMobile("12345678910"); + orderRefundDTO.setImgUrls(""); + orderRefundDTO.setReceived(1); + if (refundAmount == 0){ + orderRefundDTO.setRefundAmount(getRefundAmount(orderNum)); + }else { + orderRefundDTO.setRefundAmount(refundAmount); + } + orderRefundDTO.setRefundCount(1); + return orderRefundDTO; + } + + private static Long getVirtualOrderRefundAmount(Long orderNum, Integer count) { + Integer prodNum = MyOrderApi.orderDetail(orderNum).getTotalNum(); + Long actualTotal = MyOrderApi.orderDetail(orderNum).getOrderItems().get(0).getActualTotal(); + return (long) Arith.mul(Arith.div(count, prodNum), actualTotal); + } + + public static OrderRefundDTO getOrderRefundApartAmountDTO(Long orderNum,Long refundAmount) { + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setOrderId(orderNum); + orderRefundDTO.setOrderItemId(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId()); + orderRefundDTO.setApplyType(1); + orderRefundDTO.setRefundType(2); + orderRefundDTO.setBuyerDesc("部分退款自动化执行"); + orderRefundDTO.setBuyerReason(0); + orderRefundDTO.setBuyerMobile("12345678910"); + orderRefundDTO.setImgUrls(""); + orderRefundDTO.setReceived(0); + orderRefundDTO.setRefundAmount(refundAmount); + orderRefundDTO.setRefundCount(0); + return orderRefundDTO; + } + + public static OrderRefundDTO getRefundDeliveryApartAmountDTO(Long orderNum,Long refundAmount) { + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setOrderId(orderNum); + orderRefundDTO.setOrderItemId(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId()); + orderRefundDTO.setApplyType(2); + orderRefundDTO.setRefundType(2); + orderRefundDTO.setBuyerDesc("退货退款退部分金额"); + orderRefundDTO.setBuyerReason(0); + orderRefundDTO.setBuyerMobile("12345678910"); + orderRefundDTO.setImgUrls(""); + orderRefundDTO.setReceived(1); + orderRefundDTO.setRefundAmount(refundAmount); + orderRefundDTO.setRefundCount(1); + return orderRefundDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderVirtualInfoDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderVirtualInfoDtoData.java new file mode 100644 index 0000000..11cec24 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/OrderVirtualInfoDtoData.java @@ -0,0 +1,18 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; + +/** + * @author lpj + */ +public class OrderVirtualInfoDtoData { + /** + * 门店核销虚拟订单数据 + */ + public static OrderVirtualInfoDTO getOrderVirtualInfoDTO(Long orderId, String writeOffCode) { + OrderVirtualInfoDTO orderVirtualInfoDTO = new OrderVirtualInfoDTO(); + orderVirtualInfoDTO.setOrderId(orderId); + orderVirtualInfoDTO.setWriteOffCode(writeOffCode); + return orderVirtualInfoDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/PayParamData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/PayParamData.java new file mode 100644 index 0000000..91fc07c --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/PayParamData.java @@ -0,0 +1,32 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.payment.dto.PayInfoDTO; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Tu + */ +public class PayParamData { + public static PayInfoDTO getPayParamData(Long orderId){ + PayInfoDTO payInfoDTO = new PayInfoDTO(); + ArrayList orderIds = new ArrayList<>(); + orderIds.add(orderId); + + payInfoDTO.setOrderIds(orderIds); + payInfoDTO.setPayType(9); + payInfoDTO.setReturnUrl("https://h5.mall4j.com/cloud-test/package-user/pages/order/order?orderStatus=0"); + return payInfoDTO; + } + + /** + * 需拆分订单的订单支付 + */ + public static PayInfoDTO getPayParamData(List orderIds) { + PayInfoDTO payInfoDTO = new PayInfoDTO(); + payInfoDTO.setOrderIds(orderIds); + payInfoDTO.setPayType(9); + return payInfoDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/ShopCartData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/ShopCartData.java new file mode 100644 index 0000000..796503b --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/order/ShopCartData.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.systemtest.data.order; + +import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO; +import com.moyuer.cloud.systemtest.api.store.SkuApi; + +/** + * @author Tu + */ +public class ShopCartData { + public static ChangeShopCartItemDTO getShopCartItem(Long spuId) { + ChangeShopCartItemDTO changeShopCartItemDTO = new ChangeShopCartItemDTO(); + changeShopCartItemDTO.setCount(1); + changeShopCartItemDTO.setSkuId(SkuApi.getAllSkuList(spuId).get(0).getSkuId()); + changeShopCartItemDTO.setSpuId(spuId); + return changeShopCartItemDTO; + } + + public static ChangeShopCartItemDTO getShopCartItem(Long spuId, Integer count) { + ChangeShopCartItemDTO changeShopCartItemDTO = new ChangeShopCartItemDTO(); + changeShopCartItemDTO.setCount(count); + changeShopCartItemDTO.setSkuId(SkuApi.getAllSkuList(spuId).get(0).getSkuId()); + changeShopCartItemDTO.setSpuId(spuId); + return changeShopCartItemDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/CategoryDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/CategoryDtoData.java new file mode 100644 index 0000000..9a07e2e --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/CategoryDtoData.java @@ -0,0 +1,86 @@ +package com.tmerclub.cloud.systemtest.data.platform; + + +import cn.hutool.core.bean.BeanUtil; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.common.product.vo.CategoryLangVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.tmerclub.cloud.product.dto.CategoryLangDTO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class CategoryDtoData { + /** + * 平台分类新增数据 + * @param level 等级 + * @param parentId 上级分类id + * @param deductionRate 平台扣率 + */ + public static CategoryDTO getCategoryDTO(Integer level, Long parentId, Double deductionRate) { + CategoryDTO categoryDTO = new CategoryDTO(); + categoryDTO.setCategoryId(0L); + String name = "自动化测试分类" + System.currentTimeMillis(); + categoryDTO.setName(name); + categoryDTO.setImgUrl("/test.png"); + categoryDTO.setLevel(level); + categoryDTO.setParentId(parentId); + categoryDTO.setDeductionRate(deductionRate); + categoryDTO.setCategoryLangList(getCategoryLangDTOList(name)); + categoryDTO.setStatus(1); + categoryDTO.setSeq(1); + + return categoryDTO; + } + + /** + * 修改平台分类数据 + */ + public static CategoryDTO getCategoryDTO(Long categoryId) { + CategoryVO categoryVO = CategoryApi.getCategoryInfo(categoryId); + CategoryDTO categoryDTO = new CategoryDTO(); + BeanUtils.copyProperties(categoryVO, categoryDTO); + + List categoryLangVOList = categoryVO.getCategoryLangList(); + List categoryLangDTOList = categoryLangVOList.stream().map(i -> BeanUtil.copyProperties(i, CategoryLangDTO.class)).collect(Collectors.toList()); + categoryDTO.setCategoryLangList(categoryLangDTOList); + + categoryDTO.setDeductionRate(1.99); + + return categoryDTO; + } + + /** + * 店铺签约分类列表 + */ + public static List getCategoryShopDtoList(List categoryIds) { + List categoryShopDTOList= new ArrayList<>(); + for(Long categoryId : categoryIds) { + CategoryShopDTO categoryShopDTO = new CategoryShopDTO(); + categoryShopDTO.setCategoryId(categoryId); + categoryShopDTO.setQualifications(null); + categoryShopDTOList.add(categoryShopDTO); + } + return categoryShopDTOList; + } + + private static List getCategoryLangDTOList(String name) { + List categoryLangDTOList = new ArrayList<>(); + CategoryLangDTO categoryLangDtoA = new CategoryLangDTO(); + categoryLangDtoA.setLang(1); + categoryLangDtoA.setName(name); + categoryLangDTOList.add(categoryLangDtoA); + CategoryLangDTO categoryLangDtoB = new CategoryLangDTO(); + categoryLangDtoB.setLang(2); + categoryLangDtoB.setName(null); + categoryLangDTOList.add(categoryLangDtoB); + return categoryLangDTOList; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/PlatformDeliveryData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/PlatformDeliveryData.java new file mode 100644 index 0000000..bba165a --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/PlatformDeliveryData.java @@ -0,0 +1,62 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import com.moyuer.cloud.delivery.dto.AreaDTO; +import com.moyuer.cloud.delivery.dto.TransfeeDTO; +import com.moyuer.cloud.delivery.dto.TransportDTO; +import com.moyuer.cloud.delivery.vo.TransportVO; +import com.moyuer.cloud.systemtest.api.platform.PlatformTransportApi; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author lpj + */ +public class PlatformDeliveryData { + /** + * 平台端获取包邮模板ID + */ + public static Long getPlatformFreeFeeDelivery() { + List transportVOList = PlatformTransportApi.platformInfoTransport(); + long count = transportVOList.stream().filter(t -> Objects.equals(t.getIsFreeFee(), 1)).count(); + + if (count == 0 ||transportVOList.size() == 0) { + PlatformTransportApi.platformAddTransport(getFreeTransportDTO()); + return PlatformTransportApi.platformInfoTransport().get(0).getTransportId(); + } + for (TransportVO transportVO : transportVOList) { + if (transportVO.getIsFreeFee() == 1) { + return transportVO.getTransportId(); + } + } + return null; + } + + /** + *新增包邮模板 + * */ + public static TransportDTO getFreeTransportDTO() { + TransportDTO transportDTO = new TransportDTO(); + transportDTO.setTransName("包邮模板"); + transportDTO.setChargeType(0); + transportDTO.setIsFreeFee(1); + transportDTO.setHasFreeCondition(0); + + TransfeeDTO transfeeDTO = new TransfeeDTO(); + transfeeDTO.setFirstFee(0L); + transfeeDTO.setFirstPiece(1D); + transfeeDTO.setContinuousFee(0L); + transfeeDTO.setContinuousPiece(1D); + + ArrayList cityList = new ArrayList<>(); + AreaDTO areaDTO = new AreaDTO(); + cityList.add(areaDTO); + transfeeDTO.setCityList(cityList); + + List transfeeDTOList = new ArrayList<>(); + transfeeDTOList.add(transfeeDTO); + transportDTO.setTransFees(transfeeDTOList); + return transportDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreConfigDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreConfigDtoData.java new file mode 100644 index 0000000..ba75340 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreConfigDtoData.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import com.tmerclub.cloud.platform.dto.ScoreConfigDTO; +import com.tmerclub.cloud.platform.vo.ScoreConfigVO; +import com.moyuer.cloud.systemtest.api.platform.ScoreConfigApi; +import org.springframework.beans.BeanUtils; + +import java.util.List; + +/** + * @author lpj + */ +public class ScoreConfigDtoData { + public static ScoreConfigDTO getScoreConfigDTO(Long shoppingUseScoreRatio, Double userRatioLimit) { + ScoreConfigVO scoreConfigVO = ScoreConfigApi.info(); + ScoreConfigDTO scoreConfigDTO = new ScoreConfigDTO(); + BeanUtils.copyProperties(scoreConfigVO, scoreConfigDTO); + + List signInScore = scoreConfigVO.getSignInScore(); + scoreConfigDTO.setSignInScore(signInScore); + + scoreConfigDTO.setShoppingUseScoreRatio(shoppingUseScoreRatio); + scoreConfigDTO.setUseRatioLimit(userRatioLimit); + scoreConfigDTO.setShoppingScoreSwitch(true); + + return scoreConfigDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreOrderDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreOrderDtoData.java new file mode 100644 index 0000000..5133d95 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreOrderDtoData.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.dto.ShopCartItemDTO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.moyuer.cloud.systemtest.api.login.UserApi; +import com.moyuer.cloud.systemtest.api.platform.ScoreProductApi; + +import java.util.ArrayList; + +/** + * @author lpj + */ +public class ScoreOrderDtoData { + /** + * 立即购买积分商品 + */ + public static OrderDTO getScoreOrderDtoData(Long spuId, Integer count) { + OrderDTO orderDTO = new OrderDTO(); + Long userId = UserApi.getUserInfo().getUserId(); + SpuAppVO product = ScoreProductApi.getScoreProductInfo(spuId, userId); + orderDTO.setAddrId(0L); + orderDTO.setCouponIds(new ArrayList<>()); + + DvyTypeDTO dvyTypeDTO = new DvyTypeDTO(); + dvyTypeDTO.setDvyType(1); + dvyTypeDTO.setShopId(product.getShopId()); + ArrayList dvyTypeDTOList = new ArrayList<>(); + dvyTypeDTOList.add(dvyTypeDTO); + orderDTO.setDvyTypes(dvyTypeDTOList); + + orderDTO.setIsScorePay(1); + orderDTO.setUserChangeCoupon(0); + orderDTO.setUserUseScore(0L); + + ShopCartItemDTO shopCartItemDTO = new ShopCartItemDTO(); + shopCartItemDTO.setCount(count); + shopCartItemDTO.setDistributionUserId(0L); + shopCartItemDTO.setShopId(product.getShopId()); + shopCartItemDTO.setSkuId(product.getSkus().get(0).getSkuId()); + shopCartItemDTO.setSpuId(spuId); + + orderDTO.setShopCartItem(shopCartItemDTO); + + return orderDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreSpuData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreSpuData.java new file mode 100644 index 0000000..1044a4d --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/ScoreSpuData.java @@ -0,0 +1,66 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import com.tmerclub.cloud.common.order.bo.DeliveryModeBO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.SpuLangDTO; +import com.tmerclub.cloud.common.util.Json; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lpj + */ +public class ScoreSpuData { + public static SpuDTO getScoreSpu(Long deliveryTemplateId, Long priceFee, Long scorePriceFee) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setName("接口自动化积分商品"); + spuDTO.setSellingPoint("商品卖点"); + spuDTO.setDetail("测试商品详情"); + spuDTO.setDeliveryTemplateId(deliveryTemplateId); + spuDTO.setMainImgUrl("/test.png"); + spuDTO.setImgUrls("/test.png"); + spuDTO.setMarketPriceFee(88L); + spuDTO.setPriceFee(priceFee); + spuDTO.setScoreFee(scorePriceFee); + spuDTO.setHasSkuImg(0); + spuDTO.setSkuList(getSkuList(priceFee, scorePriceFee)); + spuDTO.setSupplierSpuType(0); + + List spuLangDTOList = new ArrayList<>(); + SpuLangDTO spuLangDTO = new SpuLangDTO(); + spuLangDTO.setLang(1); + spuLangDTO.setSpuName("接口自动化积分商品"); + spuLangDTOList.add(spuLangDTO); + spuDTO.setSpuLangList(spuLangDTOList); + + spuDTO.setTotalStock(100); + DeliveryModeBO deliveryModeBO = new DeliveryModeBO(); + deliveryModeBO.setHasShopDelivery(true); + deliveryModeBO.setHasUserPickUp(true); + deliveryModeBO.setHasCityDelivery(false); + spuDTO.setDeliveryMode(Json.toJsonString(deliveryModeBO)); + + spuDTO.setSpuMold(0); + spuDTO.setPreSaleType(-1); + spuDTO.setSpuOrigin(0); + + return spuDTO; + } + + + public static List getSkuList(Long priceFee, Long scorePriceFee){ + List skuList = new ArrayList<>(); + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setChangeStock(100); + skuDTO.setPriceFee(priceFee); + skuDTO.setScoreFee(scorePriceFee); + skuDTO.setMarketPriceFee(88L); + skuDTO.setStock(100); + skuDTO.setStatus(1); + skuList.add(skuDTO); + return skuList; + } + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/SubmitScoreOrderDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/SubmitScoreOrderDtoData.java new file mode 100644 index 0000000..66a3bf8 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/platform/SubmitScoreOrderDtoData.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.systemtest.data.platform; + +import com.tmerclub.cloud.common.order.dto.OrderSelfStationDTO; +import com.tmerclub.cloud.common.order.dto.OrderShopDTO; +import com.tmerclub.cloud.common.order.dto.SubmitOrderDTO; + +import java.util.ArrayList; + +/** + * @author lpj + */ +public class SubmitScoreOrderDtoData { + public static SubmitOrderDTO getSubmitScoreOrderDtoData() { + SubmitOrderDTO submitOrderDTO = new SubmitOrderDTO(); + + OrderShopDTO orderShopParam = new OrderShopDTO(); + orderShopParam.setShopId(0L); + orderShopParam.setRemarks(""); + ArrayList orderShopDTOList = new ArrayList<>(); + orderShopDTOList.add(orderShopParam); + + submitOrderDTO.setOrderInvoiceList(null); + submitOrderDTO.setOrderSelfStationDto(new OrderSelfStationDTO()); + submitOrderDTO.setVirtualRemarkList(new ArrayList<>()); + submitOrderDTO.setOrderShopParam(orderShopDTOList); + return submitOrderDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/DeliveryData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/DeliveryData.java new file mode 100644 index 0000000..92a00d4 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/DeliveryData.java @@ -0,0 +1,162 @@ +package com.tmerclub.cloud.systemtest.data.store; + +import com.moyuer.cloud.delivery.dto.AreaDTO; +import com.moyuer.cloud.delivery.dto.TransfeeDTO; +import com.moyuer.cloud.delivery.dto.TransfeeFreeDTO; +import com.moyuer.cloud.delivery.dto.TransportDTO; +import com.moyuer.cloud.delivery.vo.TransportVO; +import com.moyuer.cloud.systemtest.api.store.TransportApi; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author Tu + */ +public class DeliveryData { + + /** + * 获取包邮模板ID + * @param isMainShop true 使用shop_token + */ + public static Long getFreeFeeDelivery(Boolean isMainShop) { + List transportVOList = TransportApi.infoTransport(isMainShop); + long count = transportVOList.stream().filter(t -> Objects.equals(t.getIsFreeFee(), 1)).count(); + + if (count == 0 ||transportVOList.size() == 0) { + TransportApi.addTransport(DeliveryData.getFreeTransportDTO(), isMainShop); + return TransportApi.infoTransport(isMainShop).get(0).getTransportId(); + } + for (TransportVO transportVO : transportVOList) { + if (transportVO.getIsFreeFee() == 1) { + return transportVO.getTransportId(); + } + } + return null; + } + + /** + * 供应商包邮ID + * @param isMainSupplier true 使用supplier_token + */ + public static Long getSupplierFreeFeeDelivery(Boolean isMainSupplier) { + List transportVOList = TransportApi.supplierTransportPage(isMainSupplier); + long count = transportVOList.stream().filter(t -> Objects.equals(t.getIsFreeFee(), 1)).count(); + + if (count == 0 ||transportVOList.size() == 0) { + TransportApi.addSupplierTransport(DeliveryData.getFreeTransportDTO(), isMainSupplier); + return TransportApi.supplierTransportPage(isMainSupplier).get(0).getTransportId(); + } + for (TransportVO transportVO : transportVOList) { + if (transportVO.getIsFreeFee() == 1) { + return transportVO.getTransportId(); + } + } + return null; + } + + /** + *新增包邮模板 + * */ + public static TransportDTO getFreeTransportDTO() { + TransportDTO transportDTO = new TransportDTO(); + transportDTO.setTransName("包邮模板"); + transportDTO.setChargeType(0); + transportDTO.setIsFreeFee(1); + transportDTO.setHasFreeCondition(0); + + TransfeeDTO transfeeDTO = new TransfeeDTO(); + transfeeDTO.setFirstFee(0L); + transfeeDTO.setFirstPiece(1D); + transfeeDTO.setContinuousFee(0L); + transfeeDTO.setContinuousPiece(1D); + + ArrayList cityList = new ArrayList<>(); + AreaDTO areaDTO = new AreaDTO(); + cityList.add(areaDTO); + transfeeDTO.setCityList(cityList); + + List transfeeDTOList = new ArrayList<>(); + transfeeDTOList.add(transfeeDTO); + transportDTO.setTransFees(transfeeDTOList); + return transportDTO; + } + /** + * 广东可送,运费8 + * */ + public static TransportDTO getTransportDTO() { + TransportDTO transportDTO = new TransportDTO(); + transportDTO.setTransName("广东可配送-自动化添加" + System.currentTimeMillis()); + transportDTO.setChargeType(0); + transportDTO.setIsFreeFee(0); + transportDTO.setHasFreeCondition(0); + + TransfeeDTO transfeeDTO = new TransfeeDTO(); + transfeeDTO.setFirstFee(800L); + transfeeDTO.setFirstPiece(1D); + transfeeDTO.setContinuousFee(800L); + transfeeDTO.setContinuousPiece(1D); + + List cityList = new ArrayList<>(); + AreaDTO areaDTO = new AreaDTO(); + areaDTO.setAreaName("荔湾区"); + areaDTO.setAreaId(440103L); + areaDTO.setParentId(4401L); + areaDTO.setLevel(3); + cityList.add(areaDTO); + transfeeDTO.setCityList(cityList); + + List transfeeDTOList = new ArrayList<>(); + transfeeDTOList.add(transfeeDTO); + transportDTO.setTransFees(transfeeDTOList); + + return transportDTO; + } + + /** + * 满条件包邮 + * @param chargeType 收费方式 件数 0, 重量 1, 体积 2 + * @param freeType 包邮条件 件数/重量/体积 0, 金额 1, 件数/重量/体积+金额2 + * @param price 满件数/重量/体积的条件 + * @param amount 满金额的条件 + */ + public static TransportDTO getTransportDTO(Integer chargeType, Double firstPiece, Long firstFee, Double continuousPiece, Long continuousFee, Integer hasFreeCondition, Integer freeType, Double price, Long amount) { + TransportDTO transportDTO = new TransportDTO(); + transportDTO.setTransName("可送荔湾-自动化-满条件包邮" + System.currentTimeMillis()); + transportDTO.setChargeType(chargeType); + transportDTO.setIsFreeFee(0); + transportDTO.setHasFreeCondition(hasFreeCondition); + + TransfeeDTO transfeeDTO = new TransfeeDTO(); + transfeeDTO.setFirstFee(firstFee); + transfeeDTO.setFirstPiece(firstPiece); + transfeeDTO.setContinuousFee(continuousFee); + transfeeDTO.setContinuousPiece(continuousPiece); + + List cityList = new ArrayList<>(); + AreaDTO areaDTO = new AreaDTO(); + areaDTO.setAreaName("荔湾区"); + areaDTO.setAreaId(440103L); + areaDTO.setParentId(4401L); + areaDTO.setLevel(3); + cityList.add(areaDTO); + transfeeDTO.setCityList(cityList); + + List transfeeDTOList = new ArrayList<>(); + transfeeDTOList.add(transfeeDTO); + transportDTO.setTransFees(transfeeDTOList); + + List transfeeFreeDtoList = new ArrayList<>(); + TransfeeFreeDTO transfeeFreeDto = new TransfeeFreeDTO(); + transfeeFreeDto.setFreeType(freeType); + transfeeFreeDto.setPiece(price); + transfeeFreeDto.setAmount(amount); + transfeeFreeDto.setFreeCityList(cityList); + + transfeeFreeDtoList.add(transfeeFreeDto); + transportDTO.setTransFeeFrees(transfeeFreeDtoList); + + return transportDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopRefundAddrDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopRefundAddrDtoData.java new file mode 100644 index 0000000..97b6c99 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopRefundAddrDtoData.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.systemtest.data.store; + +import com.tmerclub.cloud.multishop.dto.ShopRefundAddrDTO; + +/** + * @author Tu + */ +public class ShopRefundAddrDtoData { + public static ShopRefundAddrDTO getShopRefundAddrDTO(){ + ShopRefundAddrDTO shopRefundAddrDTO = new ShopRefundAddrDTO(); + shopRefundAddrDTO.setAddr("自动化测试地址"); + shopRefundAddrDTO.setArea("荔湾区"); + shopRefundAddrDTO.setCity("广州市"); + shopRefundAddrDTO.setIsDefault(0); + shopRefundAddrDTO.setMobile("12345678901"); + shopRefundAddrDTO.setAreaId(440103L); + shopRefundAddrDTO.setProvince("广东省"); + shopRefundAddrDTO.setProvinceId(44L); + shopRefundAddrDTO.setConsignee("自动化测试收货人"); + shopRefundAddrDTO.setShopRefundAddrId(0L); + return shopRefundAddrDTO; + } + +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopSubstituteSalesDtoData.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopSubstituteSalesDtoData.java new file mode 100644 index 0000000..6297c91 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/data/store/ShopSubstituteSalesDtoData.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.systemtest.data.store; + +import com.tmerclub.cloud.multishop.dto.ShopSubstituteSalesDTO; +import com.moyuer.cloud.systemtest.api.store.ShopSubstituteSalesApi; + +/** + * @author lpj + */ +public class ShopSubstituteSalesDtoData { + /** + * 代销设置数据 + * @param salesType 设置价格方式 0 智能设价 1 手动设价 + * @param salesPriceType 加价类型 0 按比例 1 固定金额 + * @param salesPrice 代销价格 + * @param orderShape 待采购方式 0 直接转为待采购 1 自动采购 + */ + public static ShopSubstituteSalesDTO getShopSubstituteSalesDTO(Integer salesType, Integer salesPriceType, Long salesPrice, Integer orderShape) { + ShopSubstituteSalesDTO shopSubstituteSalesDTO = new ShopSubstituteSalesDTO(); + shopSubstituteSalesDTO.setSalesType(salesType); + shopSubstituteSalesDTO.setSalesPriceType(salesPriceType); + shopSubstituteSalesDTO.setSalesPrice(salesPrice); + shopSubstituteSalesDTO.setOrderShape(orderShape); + shopSubstituteSalesDTO.setShopId(ShopSubstituteSalesApi.getShopSubstituteSales().getShopId()); + shopSubstituteSalesDTO.setShopSubstituteSalesId(ShopSubstituteSalesApi.getShopSubstituteSales().getShopSubstituteSalesId()); + return shopSubstituteSalesDTO; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/CouponAmountTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/CouponAmountTest.java new file mode 100644 index 0000000..601ca63 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/amount/CouponAmountTest.java @@ -0,0 +1,196 @@ +package com.tmerclub.cloud.systemtest.test.amount; + +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.CouponApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.order.ShopCartApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.CouponData; +import com.moyuer.cloud.systemtest.data.order.OrderDtoData; +import com.moyuer.cloud.systemtest.data.order.ShopCartData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.order.WalletAssert; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class CouponAmountTest { + private static List getCategoryId(Boolean isMainShop) { + List categoryAppVOList = CategoryApi.listShopCategory(isMainShop); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @Test(description = "商品金额为小数额,使用店铺优惠券优惠金额计算是否正确") + public void minPriceShopCouponAmountTest() { + Long transportId = DeliveryData.getFreeFeeDelivery(true); + + List categoryIds = getCategoryId(true); + //新建店铺折扣券-满0.01打5折 + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 1L), true); + List productIds = Collections.singletonList(productId); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 2, 1L, null, 5.0, 2, 10, 100, 1, productIds)); + Long couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + + CouponApi.deleteShopCoupon(couponId); + ProductApi.delete(productId, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 1L, 1L, 0L, 0L, 0L, 0L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1.99, 0L, + 0L, 0L, 0L, 0L, 0L, null, null, 0L, null, 1, null); + } + + @Test(description = "商品金额为小数额,使用平台优惠券优惠金额计算是否正确") + public void minPricePlatformCouponAmountTest() { + Long transportId = DeliveryData.getFreeFeeDelivery(true); + + List categoryIds = getCategoryId(true); + //新建店铺折扣券-满0.01打5折 + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 1L), true); + List productIds = Collections.singletonList(productId); + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 2, 1L, null, 5.0, 2, 10, 100, 1, productIds)); + Long couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + + CouponApi.deletePlatformCoupon(couponId); + ProductApi.delete(productId, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 1L, 1L, 0L, 0L, 0L, 0L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1.99, 0L, + 0L, 0L, 0L, 0L, 0L, null, null, 0L, null, 1, null); + } + + @Test(description = "多个商品,其中一个商品不参与店铺优惠券,使用店铺优惠券金额计算是否正确") + public void differentProductShopCouponAmountTest() { + Long transportId = DeliveryData.getFreeFeeDelivery(true); + + List categoryIds = getCategoryId(true); + //新建店铺代金券-满20减5 + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 2000L), true); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 1700L), true); + Long productIdC = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 300L), true); + List productIds = Arrays.asList(productIdB, productIdC); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 2000L, 500L, null, 2, 10, 100, 1, productIds)); + Long couponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdC, 1)); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productIdA); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + CouponApi.deleteShopCoupon(couponId); + ProductApi.delete(productIdC, true); + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 3431L, 3500L, 0L, 500L, 0L, 69L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + for (int i=0; i categoryIds = getCategoryId(true); + //新建店铺代金券-满20减5 + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 2000L), true); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 1700L), true); + Long productIdC = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 300L), true); + List productIds = Arrays.asList(productIdB, productIdC); + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 2000L, 500L, null, 2, 10, 100, 1, productIds)); + Long couponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + + //用户领取优惠券 + CouponApi.receive(couponId); + //用户使用优惠券购买商品 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdC, 1)); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productIdA); + orderDTO.setCouponIds(Collections.singletonList(CouponApi.getUserCouponPage().get(0).getCouponUserId())); + MyOrderApi.confirm(orderDTO); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + CouponApi.deletePlatformCoupon(couponId); + ProductApi.delete(productIdC, true); + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 3920L, 3500L, 500L, 0L, 0L, 80L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + for (int i=0; i getCategoryId(Boolean isMainShop) { + List categoryAppVOList = CategoryApi.listShopCategory(isMainShop); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(isMainShop).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @Test(description = "使用多个活动下单各个活动优惠金额是否正确") + public void differentDiscountAmountTest() { + Long transportId = DeliveryData.getFreeFeeDelivery(true); + + List categoryIds = getCategoryId(true); + //新建满减活动A-满20减8 + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 7310L), true); + List discountItemDtoListA = List.of(DiscountData.getDiscountItemDTO(2000L, 800L)); + List productIdsA = Collections.singletonList(productIdA); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDtoListA, 800L, 1, productIdsA, 1), true); + Long discountIdA = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建满减活动B-满1件打3.9折 + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 633L), true); + List discountItemDtoListB = List.of(DiscountData.getDiscountItemDTO(100L, 390L)); + List productIdsB = Collections.singletonList(productIdB); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListB, 50000L, 1, productIdsB, 1), true); + Long discountIdB = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建满减活动A-满2件打3折 + Long productIdC = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 270L), true); + List discountItemDtoListC = List.of(DiscountData.getDiscountItemDTO(200L, 300L)); + List productIdsC = Collections.singletonList(productIdC); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListC, 50000L, 1, productIdsC, 1), true); + Long discountIdC = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建满减活动A-满1件打3折,上限20 + Long productIdD = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 7347L), true); + List discountItemDtoListD = List.of(DiscountData.getDiscountItemDTO(100L, 300L)); + List productIdsD = Collections.singletonList(productIdD); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListD, 2000L, 1, productIdsD, 1), true); + Long discountIdD = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdC, 3)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdD, 1)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + DiscountApi.delete(discountIdD, true); + DiscountApi.delete(discountIdC, true); + DiscountApi.delete(discountIdB, true); + DiscountApi.delete(discountIdA, true); + ProductApi.delete(productIdD, true); + ProductApi.delete(productIdC, true); + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 12101L, 12347L, 0L, 3753L, 0L, 246L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + for (int i=0; i categoryIds = getCategoryId(true); + //新建满减活动A-每满10减1 + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 7000L), true); + List discountItemDtoListA = List.of(DiscountData.getDiscountItemDTO(1000L, 100L)); + List productIdsA = Collections.singletonList(productIdA); + DiscountApi.save(DiscountData.getDiscount(0, 1, discountItemDtoListA, 500L, 1, productIdsA, 1), true); + Long discountIdA = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建满减活动B-满1件打7折 + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 7000L), true); + List discountItemDtoListB = List.of(DiscountData.getDiscountItemDTO(100L, 700L)); + List productIdsB = Collections.singletonList(productIdB); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListB, 500L, 1, productIdsB, 1), true); + Long discountIdB = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 1)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + DiscountApi.delete(discountIdB, true); + DiscountApi.delete(discountIdA, true); + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 12742L, 13000L, 0L, 1000L, 0L, 258L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 7000L, 6500L, 0L, 500L, 0L, 0L, 0L, 1.99, 129L, + 0L, 0L, 0L, 0L, 500L, null, null, 0L, null, 1, null); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(1), 7000L, 6500L, 0L, 500L, 0L, 0L, 0L, 1.99, 129L, + 0L, 0L, 0L, 0L, 500L, null, null, 0L, null, 1, null); + } + + @Test(description = "满足满多层级减折活动,优惠金额是否正确") + public void discountItemsAmountTest() { + Long transportId = DeliveryData.getFreeFeeDelivery(true); + + List categoryIds = getCategoryId(true); + //新建满减活动B-满1件打7折,满2件打3.7折 + Long productIdA = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 10000L), true); + Long productIdB = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 7347L), true); + List discountItemDtoList = List.of(DiscountData.getDiscountItemDTO(100L, 700L), DiscountData.getDiscountItemDTO(200L, 370L)); + List productIds = Arrays.asList(productIdA, productIdB); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoList, 50000L, 1, productIds, 1), true); + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB, 2)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productIdA)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA)).get(0); + PayApi.orderPay(orderNum); + + DiscountApi.delete(discountId, true); + ProductApi.delete(productIdB, true); + ProductApi.delete(productIdA, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 8955L, 9137L, 0L, 15557L, 0L, 182L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + for (int i=0; i getCategoryIdA() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + private static List getCategoryIdB() { + List categoryAppVOList = CategoryApi.listShopCategory(false); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(false).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @Test(description = "单店铺下使用多种优惠,优惠金额、付款金额是否正确") + public void sameShopMultipleDiscountsAmountTest() { + Long transportId = DeliveryData.getFreeFeeDelivery(true); + List categoryIdsA = getCategoryIdA(); + Long categoryIdA = categoryIdsA.get(0); + Long shopCategoryIdA = categoryIdsA.get(1); + Long productIdA1 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportId, 6912L), true); + Long productIdA2 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportId, 7222L), true); + Long productIdA3 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportId, 3070L), true); + Long productIdA4 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportId, 2000L), true); + + //商品a1, a4参与满减活动A-每满7减5.33 + List discountItemDtoListA = List.of(DiscountData.getDiscountItemDTO(700L, 533L)); + List discountProductIdsA = Arrays.asList(productIdA1, productIdA4); + DiscountApi.save(DiscountData.getDiscount(0, 1, discountItemDtoListA, 50000L, 1, discountProductIdsA, 1), true); + Long discountIdA = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //商品a2, a3参与满减活动B-满2件打8.5折,满3件打7.7折 + List discountItemDtoListB = List.of(DiscountData.getDiscountItemDTO(200L, 850L), DiscountData.getDiscountItemDTO(300L, 770L)); + List discountProductIdsB = Arrays.asList(productIdA2, productIdA3); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListB, 50000L, 1, discountProductIdsB, 1), true); + Long discountIdB = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //商品a1, a2, a4参与店铺优惠券,满50打3.7折 + List shopCouponProductIds = Arrays.asList(productIdA1, productIdA2, productIdA4); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 2, 5000L, null, 3.7, 2, 10, 100, 1, shopCouponProductIds)); + Long shopCouponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + CouponApi.receive(shopCouponId); + + //商品a1, a2参与平台优惠券,满7.2减5.02 + List platformCouponProductIds = Arrays.asList(productIdA1, productIdA2, productIdA4); + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 720L, 502L, null, 2, 10, 100, 1, platformCouponProductIds)); + Long platformCouponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + CouponApi.receive(platformCouponId); + + //修改积分配置,每15积分抵扣一元,最大使用积分比例33.7% + ScoreConfigApi.update(ScoreConfigDtoData.getScoreConfigDTO(15L ,33.7)); + + //将商品加入购物车 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA1, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA2, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA3, 3)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA4, 1)); + + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productIdA1); + //使用优惠券 + orderDTO.setCouponIds(Arrays.asList(CouponApi.getUserCouponPage().get(0).getCouponUserId(), CouponApi.getUserCouponPage().get(1).getCouponUserId())); + //使用最大可使用积分 + orderDTO.setIsScorePay(1); + orderDTO.setUserUseScore(MyOrderApi.confirm(orderDTO).getMaxUsableScore()); + //确认订单 + MyOrderApi.confirm(orderDTO); + //提交订单 + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA1)).get(0); + //支付订单 + PayApi.orderPay(orderNum); + + CouponApi.deletePlatformCoupon(platformCouponId); + CouponApi.deleteShopCoupon(shopCouponId); + DiscountApi.delete(discountIdB, true); + DiscountApi.delete(discountIdA, true); + ProductApi.delete(productIdA4, true); + ProductApi.delete(productIdA3, true); + ProductApi.delete(productIdA2, true); + ProductApi.delete(productIdA1, true); + + //验证数据 + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 9880L, 6351L, 3729L, 15264L, 0L, 200L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + for (int i=0; i categoryIdsA = getCategoryIdA(); + Long categoryIdA = categoryIdsA.get(0); + Long shopCategoryIdA = categoryIdsA.get(1); + Long productIdA1 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportIdA, 6912L), true); + Long productIdA2 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportIdA, 7222L), true); + Long productIdA3 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportIdA, 3070L), true); + Long productIdA4 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportIdA, 2000L), true); + + //商品a1, a4参与满减活动A-每满7减5.33 + List discountItemDtoListA = List.of(DiscountData.getDiscountItemDTO(700L, 533L)); + List discountProductIdsA = Arrays.asList(productIdA1, productIdA4); + DiscountApi.save(DiscountData.getDiscount(0, 1, discountItemDtoListA, 50000L, 1, discountProductIdsA, 1), true); + Long discountIdA = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //商品a2, a3参与满减活动B-满2件打8.5折,满3件打7.7折 + List discountItemDtoListB = List.of(DiscountData.getDiscountItemDTO(200L, 850L), DiscountData.getDiscountItemDTO(300L, 770L)); + List discountProductIdsB = Arrays.asList(productIdA2, productIdA3); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListB, 50000L, 1, discountProductIdsB, 1), true); + Long discountIdB = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //商品a1, a2, a4参与店铺优惠券,满50打3.7折 + List shopCouponProductIds = Arrays.asList(productIdA1, productIdA2, productIdA4); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 2, 5000L, null, 3.7, 2, 10, 100, 1, shopCouponProductIds)); + Long shopCouponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + CouponApi.receive(shopCouponId); + + //B店铺,商品b1, b2, b3 + Long transportIdB = DeliveryData.getFreeFeeDelivery(false); + List categoryIdsB = getCategoryIdB(); + Long categoryIdB = categoryIdsB.get(0); + Long shopCategoryIdB = categoryIdsB.get(1); + Long productIdB1 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdB, shopCategoryIdB, transportIdB, 16912L), false); + Long productIdB2 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdB, shopCategoryIdB, transportIdB, 7222L), false); + Long productIdB3 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdB, shopCategoryIdB, transportIdB, 3070L), false); + + //商品a2, a3参与满减活动B-满1件打8.5折,满2件打7.5折 + List discountItemDtoListC = List.of(DiscountData.getDiscountItemDTO(100L, 850L), DiscountData.getDiscountItemDTO(200L, 750L)); + List discountProductIdsC = Arrays.asList(productIdB1, productIdB3); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListC, 50000L, 1, discountProductIdsC, 1), false); + Long discountIdC = DiscountApi.getDiscountPage(false).get(0).getDiscountId(); + + //商品a1, a2, b3参与平台优惠券,满50减7.2 + List platformCouponProductIds = Arrays.asList(productIdA1, productIdA2, productIdB3); + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 5000L, 720L, null, 2, 10, 100, 1, platformCouponProductIds)); + Long platformCouponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + CouponApi.receive(platformCouponId); + + //修改积分配置,每15积分抵扣一元,最大使用积分比例30.7% + ScoreConfigApi.update(ScoreConfigDtoData.getScoreConfigDTO(15L ,30.7)); + + //新增打9.1折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(91)); + //用户会员等级添加打9.1折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(discountUserRightsId))); + + //将商品加入购物车 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA1, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA2, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA3, 3)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA4, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB1, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB2, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB3, 1)); + + //确认订单数据 + Long shopIdA = ProductApi.getProductInfo(productIdA1).getShopId(); + Long shopIdB = ProductApi.getProductInfo(productIdB1).getShopId(); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(Arrays.asList(shopIdA, shopIdB)); + //使用优惠券 + orderDTO.setCouponIds(Arrays.asList(CouponApi.getUserCouponPage().get(0).getCouponUserId(), CouponApi.getUserCouponPage().get(1).getCouponUserId())); + //使用最大可使用积分 + orderDTO.setIsScorePay(1); + orderDTO.setUserUseScore(MyOrderApi.confirm(orderDTO).getMaxUsableScore()); + //确认订单 + MyOrderApi.confirm(orderDTO); + //提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productIdA1)); + //支付订单 + PayApi.orderPay(orderNumberList); + + UserRightsApi.delete(discountUserRightsId); + CouponApi.deletePlatformCoupon(platformCouponId); + CouponApi.deleteShopCoupon(shopCouponId); + DiscountApi.delete(discountIdC, false); + DiscountApi.delete(discountIdB, true); + DiscountApi.delete(discountIdA, true); + ProductApi.delete(productIdB3, false); + ProductApi.delete(productIdB2, false); + ProductApi.delete(productIdB1, false); + ProductApi.delete(productIdA4, true); + ProductApi.delete(productIdA3, true); + ProductApi.delete(productIdA2, true); + ProductApi.delete(productIdA1, true); + + //验证数据 + for(Long orderNum : orderNumberList) { + if(MyOrderApi.orderDetail(orderNum).getShopId().equals(shopIdA)) { + WalletAssert.shopWalletLogAssert(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).get(0), 0, 1, 9880L, 6109L, 3971L, 15264L, 0L, 200L, 0); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + for (int i=0; i categoryAppVoListA = CategoryApi.listShopCategory(true); + Long shopCategoryIdA = categoryAppVoListA.get(categoryAppVoListA.size() - 1).getCategoryId(); + + //A店铺商品a1, a2, a3, a4 + Long transportIdA = DeliveryData.getFreeFeeDelivery(true); + Long productIdA1 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportIdA, 6912L), true); + Long productIdA2 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdA, transportIdA, 7222L), true); + Long productIdA3 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdC, shopCategoryIdA, transportIdA, 3070L), true); + Long productIdA4 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdC, shopCategoryIdA, transportIdA, 2000L), true); + + //商品a1, a4参与满减活动A-每满7减5.33 + List discountItemDtoListA = List.of(DiscountData.getDiscountItemDTO(700L, 533L)); + List discountProductIdsA = Arrays.asList(productIdA1, productIdA4); + DiscountApi.save(DiscountData.getDiscount(0, 1, discountItemDtoListA, 50000L, 1, discountProductIdsA, 1), true); + Long discountIdA = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //商品a2, a3参与满减活动B-满2件打8.5折,满3件打7.7折 + List discountItemDtoListB = List.of(DiscountData.getDiscountItemDTO(200L, 850L), DiscountData.getDiscountItemDTO(300L, 770L)); + List discountProductIdsB = Arrays.asList(productIdA2, productIdA3); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListB, 50000L, 1, discountProductIdsB, 1), true); + Long discountIdB = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //商品a1, a2, a4参与店铺优惠券,满50打3.7折 + List shopCouponProductIds = Arrays.asList(productIdA1, productIdA2, productIdA4); + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 2, 5000L, null, 3.7, 2, 10, 100, 1, shopCouponProductIds)); + Long shopCouponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + CouponApi.receive(shopCouponId); + + //商品a1为分销商品,直推奖励1%,间推奖励为1.21% + DistributionProdApi.save(DistributionProdData.getDistributionSpuDTO(productIdA1, 0, 100L, 1, 121L, 1), true); + //等待保存 + TimeUnit.SECONDS.sleep(2L); + //获取分销商品id + Long distributionProdIdA1 = DistributionProdApi.getDistributionProdPage(true).get(0).getDistributionInfo().getDistributionSpuId(); + + //B店铺签约分类A、B、C + CategoryApi.addSigningCategory(CategoryDtoData.getCategoryShopDtoList(Arrays.asList(categoryIdA, categoryIdB, categoryIdC)), false); + //B店铺获取店铺分类IdB + List categoryAppVoListB = CategoryApi.listShopCategory(false); + Long shopCategoryIdB = categoryAppVoListB.get(categoryAppVoListB.size() - 1).getCategoryId(); + //B店铺,商品b1, b2, b3 + Long transportIdB = DeliveryData.getFreeFeeDelivery(false); + + Long productIdB1 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdB, shopCategoryIdB, transportIdB, 16912L), false); + Long productIdB2 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdA, shopCategoryIdB, transportIdB, 7222L), false); + Long productIdB3 = ProductApi.createProduct(SpuData.getRealSpu(categoryIdC, shopCategoryIdB, transportIdB, 3070L), false); + + //商品a2, a3参与满减活动B-满1件打8.5折,满2件打7.5折 + List discountItemDtoListC = List.of(DiscountData.getDiscountItemDTO(100L, 850L), DiscountData.getDiscountItemDTO(200L, 750L)); + List discountProductIdsC = Arrays.asList(productIdB1, productIdB3); + DiscountApi.save(DiscountData.getDiscount(3, 0, discountItemDtoListC, 50000L, 1, discountProductIdsC, 1), false); + Long discountIdC = DiscountApi.getDiscountPage(false).get(0).getDiscountId(); + + //商品b1为分销商品,直推奖励2,间推奖励为2.1 + DistributionProdApi.save(DistributionProdData.getDistributionSpuDTO(productIdB1, 1, 200L, 1, 210L, 1), false); + //等待保存 + TimeUnit.SECONDS.sleep(2L); + //获取分销商品id + Long distributionProdIdB1 = DistributionProdApi.getDistributionProdPage(false).get(0).getDistributionInfo().getDistributionSpuId(); + + //商品a1, a2, b3参与平台优惠券,满50减7.2 + List platformCouponProductIds = Arrays.asList(productIdA1, productIdA2, productIdB3); + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 5000L, 720L, null, 2, 10, 100, 1, platformCouponProductIds)); + Long platformCouponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + CouponApi.receive(platformCouponId); + + //修改积分配置,每15积分抵扣一元,最大使用积分比例30.7% + ScoreConfigApi.update(ScoreConfigDtoData.getScoreConfigDTO(15L ,30.7)); + + //新增打9.1折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(91)); + //用户会员等级添加打9.1折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Collections.singletonList(discountUserRightsId))); + + //将商品加入购物车 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA1, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA2, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA3, 3)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdA4, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB1, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB2, 1)); + ShopCartApi.addItem(ShopCartData.getShopCartItem(productIdB3, 1)); + + //确认订单数据 + Long shopIdA = ProductApi.getProductInfo(productIdA1).getShopId(); + Long shopIdB = ProductApi.getProductInfo(productIdB1).getShopId(); + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(Arrays.asList(shopIdA, shopIdB)); + //使用优惠券 + orderDTO.setCouponIds(Arrays.asList(CouponApi.getUserCouponPage().get(0).getCouponUserId(), CouponApi.getUserCouponPage().get(1).getCouponUserId())); + //使用积分700 + orderDTO.setIsScorePay(1); + orderDTO.setUserUseScore(700L); + //确认订单 + MyOrderApi.confirm(orderDTO); + //提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(Arrays.asList(shopIdA, shopIdB))); + //支付订单 + PayApi.orderPay(orderNumberList); + + DistributionProdApi.delete(distributionProdIdB1, false); + DistributionProdApi.delete(distributionProdIdA1, true); + UserRightsApi.delete(discountUserRightsId); + CouponApi.deletePlatformCoupon(platformCouponId); + CouponApi.deleteShopCoupon(shopCouponId); + DiscountApi.delete(discountIdC, false); + DiscountApi.delete(discountIdB, true); + DiscountApi.delete(discountIdA, true); + ProductApi.delete(productIdB3, false); + ProductApi.delete(productIdB2, false); + ProductApi.delete(productIdB1, false); + ProductApi.delete(productIdA4, true); + ProductApi.delete(productIdA3, true); + ProductApi.delete(productIdA2, true); + ProductApi.delete(productIdA1, true); + CategoryApi.delete(categoryIdC); + CategoryApi.delete(categoryIdB); + CategoryApi.delete(categoryIdA); + CategoryApi.delete(categoryIdSec); + CategoryApi.delete(categoryIdFirst); + + //验证数据 + for(Long orderNum : orderNumberList) { + if(MyOrderApi.orderDetail(orderNum).getShopId().equals(shopIdA)) { + List mongoShopWalletLogBOList = ShopWalletApi.getMongoShopWalletLogBO(orderNum, true); + for(MongoShopWalletLogBO mongoShopWalletLogBO : mongoShopWalletLogBOList) { + if(mongoShopWalletLogBO.getReason().equals(0)) { + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBO, 0, 1, 9827L, 7382L, 2698L, 15264L, 9L, 253L, 0); + } + } + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, true); + for (int i=0; i mongoShopWalletLogBOList = ShopWalletApi.getMongoShopWalletLogBO(orderNum, false); + for(MongoShopWalletLogBO mongoShopWalletLogBO : mongoShopWalletLogBOList) { + if(mongoShopWalletLogBO.getReason().equals(0)) { + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBO, 0, 1, 21538L, 16678L, 5530L, 4996L, 410L, 670L, 0); + } + } + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, false); + for (int i = 0; i < orderDetailVO.getOrderItemDetailList().size(); i++) { + //商品b1结算明细验证 + if (orderDetailVO.getOrderItemDetailList().get(i).getSpuTotalAmount().equals(16912L)) { + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(i), 16912L, 9668L, 0L, 4228L, 3016L, 410L, 281L, 0.1, 13L, + 1874L, 1141L, 1L, 0L, 4228L, null, null, 0L, null, 1, null); + } + //商品b2结算明细验证 + if (orderDetailVO.getOrderItemDetailList().get(i).getSpuTotalAmount().equals(7222L)) { + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(i), 7222L, 5505L, 0L, 0L, 1717L, 0L, 160L, 9.1, 657L, + 1067L, 650L, 0L, 0L, 0L, null, null, 0L, null, 1, null); + } + //商品b3结算明细验证 + if (orderDetailVO.getOrderItemDetailList().get(i).getSpuTotalAmount().equals(3070L)) { + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(i), 3070L, 1505L, 0L, 768L, 797L, 0L, 44L, 0.0, 0L, + 293L, 178L, 326L, 0L, 768L, null, null, 0L, null, 1, null); + } + } + } + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DiscountAmountTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DiscountAmountTest.java new file mode 100644 index 0000000..59bf33c --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DiscountAmountTest.java @@ -0,0 +1,449 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import com.tmerclub.cloud.discount.dto.DiscountItemDTO; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.login.UserApi; +import com.moyuer.cloud.systemtest.api.marketing.CouponApi; +import com.moyuer.cloud.systemtest.api.marketing.DiscountApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.order.OrderApi; +import com.moyuer.cloud.systemtest.api.platform.ScoreConfigApi; +import com.moyuer.cloud.systemtest.api.platform.UserLevelApi; +import com.moyuer.cloud.systemtest.api.platform.UserRightsApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.store.TransportApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.CouponData; +import com.moyuer.cloud.systemtest.data.marketing.DiscountData; +import com.moyuer.cloud.systemtest.data.order.OrderAdminDtoData; +import com.moyuer.cloud.systemtest.data.order.OrderDtoData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.order.WalletAssert; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.platform.ScoreConfigDtoData; +import com.moyuer.cloud.systemtest.data.platform.UserLevelDtoData; +import com.moyuer.cloud.systemtest.data.platform.UserRightsDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class DiscountAmountTest { + private List getCategoryId() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + /** + * 广州荔湾区可配送,8元运费商品 + * */ + @DataProvider(name = "realProductDelivery") + private Object[][] realProductDeliveryNoFree() { + TransportApi.addTransport(DeliveryData.getTransportDTO(), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(getCategoryId().get(0), getCategoryId().get(1), transportId, 18800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "virtualProduct") + private Object[][] virtualProduct() { + Long shopCategoryId = CategoryApi.listShopCategory(true).get(CategoryApi.listShopCategory(true).size()-1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryId, shopCategoryId, 18800L, 1), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "depositPreSaleProduct") + private Object[][] depositPreSaleProduct() { + TransportApi.addTransport(DeliveryData.getTransportDTO(), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getDepositPreSaleSpu(getCategoryId().get(0), getCategoryId().get(1), transportId, 18800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "supplierProduct") + private Object[][] supplierProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 18800L, 1, null, true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @Test(description = "多优惠金额叠加实物订单", dataProvider = "realProductDelivery") + public void discountAmountTestWithRealProduct(Long productId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建店铺代金券 + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取店铺优惠券id + Long shopCouponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取店铺优惠券 + CouponApi.receive(shopCouponId); + + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long platformCouponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(platformCouponId); + + //新增打8折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(80)); + //新增包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + //用户会员等级添加包邮和打8折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Arrays.asList(discountUserRightsId, freeFeeUserRightsId))); + + //修改积分配置,每15积分抵扣一元,最大使用积分比例100% + ScoreConfigApi.update(ScoreConfigDtoData.getScoreConfigDTO(15L, 100D)); + + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + //用户使用优惠券 + orderDTO.setCouponIds(Arrays.asList(CouponApi.getUserCouponPage().get(0).getCouponUserId(), CouponApi.getUserCouponPage().get(1).getCouponUserId())); + //使用150积分 + orderDTO.setIsScorePay(1); + orderDTO.setUserUseScore(150L); + //确认订单 + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + + //商家修改订单金额为50元 + TimeUnit.SECONDS.sleep(2L); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumberList.get(0), 5000L, 0L)); + + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + TimeUnit.SECONDS.sleep(2L); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(2L); + + //删除会员权益 + UserRightsApi.delete(discountUserRightsId); + UserRightsApi.delete(freeFeeUserRightsId); + + //用户删除领取的店铺优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + + //根据平台优惠券id获取优惠券信息 + CouponVO platformCouponVO = CouponApi.getPlatformCouponInfo(platformCouponId); + //修改平台优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(platformCouponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(platformCouponId); + + //根据店铺优惠券id获取店铺优惠券信息 + CouponVO shopCouponVO = CouponApi.getShopCouponInfo(shopCouponId); + //修改店铺优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(shopCouponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(shopCouponId); + + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + //删除运费模板 + TransportApi.deleteTransport(TransportApi.infoTransport(true).get(0).getTransportId(), true); + + //运行后验证数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 3); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 18800L, 5000L, 0L, 10816L, 2984L, 0L, 150L, 1.99, 159L, + 1000L, 2640L, 300L, 300L, 5000L, null, null, -4560L, 5000L, 1, 1); + WalletAssert.shopOrderFreightAssert(orderDetailVO, 800L, 0L, 800L); + } + + @Test(description = "多优惠金额叠加虚拟订单", dataProvider = "virtualProduct") + public void discountAmountTestWithVirtualProduct(Long productId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建店铺代金券 + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取店铺优惠券id + Long shopCouponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取店铺优惠券 + CouponApi.receive(shopCouponId); + + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long platformCouponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(platformCouponId); + + //新增打8折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(80)); + //新增包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + //用户会员等级添加包邮和打8折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Arrays.asList(discountUserRightsId, freeFeeUserRightsId))); + + //修改积分配置,每15积分抵扣一元,最大使用积分比例100% + ScoreConfigApi.update(ScoreConfigDtoData.getScoreConfigDTO(15L, 100D)); + + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + //用户使用优惠券 + orderDTO.setCouponIds(Arrays.asList(CouponApi.getUserCouponPage().get(0).getCouponUserId(), CouponApi.getUserCouponPage().get(1).getCouponUserId())); + //使用150积分 + orderDTO.setIsScorePay(1); + orderDTO.setUserUseScore(150L); + //确认订单 + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + + //商家修改订单金额为50元 + TimeUnit.SECONDS.sleep(2L); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumberList.get(0), 5000L, 0L)); + + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + TimeUnit.SECONDS.sleep(2L); + //对订单进行退款 + Long refundId = OrderRefund.virtualOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(2L); + + //删除会员权益 + UserRightsApi.delete(discountUserRightsId); + UserRightsApi.delete(freeFeeUserRightsId); + + //用户删除领取的店铺优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + + //根据平台优惠券id获取优惠券信息 + CouponVO platformCouponVO = CouponApi.getPlatformCouponInfo(platformCouponId); + //修改平台优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(platformCouponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(platformCouponId); + + //根据店铺优惠券id获取店铺优惠券信息 + CouponVO shopCouponVO = CouponApi.getShopCouponInfo(shopCouponId); + //修改店铺优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(shopCouponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(shopCouponId); + + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + + //运行后验证数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 18800L, 5000L, 0L, 10816L, 2984L, 0L, 150L, 1.99, 159L, + 1000L, 2640L, 300L, 300L, 5000L, null, null, -4560L, 5000L, 1, 1); + WalletAssert.shopOrderFreightAssert(orderDetailVO, 0L, 0L, 0L); + } + + @Test(description = "多优惠金额叠加预售订单", dataProvider = "depositPreSaleProduct") + public void discountAmountTestWithDepositPreSaleProduct(Long productId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建店铺代金券 + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取店铺优惠券id + Long shopCouponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取店铺优惠券 + CouponApi.receive(shopCouponId); + + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long platformCouponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(platformCouponId); + + //新增打8折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(80)); + //新增包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + //用户会员等级添加包邮和打8折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Arrays.asList(discountUserRightsId, freeFeeUserRightsId))); + + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + //用户使用优惠券 + orderDTO.setCouponIds(Arrays.asList(CouponApi.getUserCouponPage().get(0).getCouponUserId(), CouponApi.getUserCouponPage().get(1).getCouponUserId())); + //确认订单 + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + + //商家修改订单金额为50元 + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumberList.get(0), 5000L, 0L)); + + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNumberList.get(0)); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(2L); + + //删除会员权益 + UserRightsApi.delete(discountUserRightsId); + UserRightsApi.delete(freeFeeUserRightsId); + + //用户删除领取的店铺优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + + //根据平台优惠券id获取优惠券信息 + CouponVO platformCouponVO = CouponApi.getPlatformCouponInfo(platformCouponId); + //修改平台优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(platformCouponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(platformCouponId); + + //根据店铺优惠券id获取店铺优惠券信息 + CouponVO shopCouponVO = CouponApi.getShopCouponInfo(shopCouponId); + //修改店铺优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(shopCouponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(shopCouponId); + + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + //删除运费模板 + TransportApi.deleteTransport(TransportApi.infoTransport(true).get(0).getTransportId(), true); + + //运行后验证数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 3); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 18800L, 5800L, 0L, 12802L, 198L, 0L, 0L, 1.99, 119L, + 0L, 0L, 300L, 300L, 5000L, null, null, -6400L, 5800L, 1, 1); + WalletAssert.shopOrderFreightAssert(orderDetailVO, 800L, 0L, 800L); + } + + @Test(description = "多优惠金额叠加供应商订单", dataProvider = "supplierProduct") + public void discountAmountTestWithSupplierProduct(Long productId, Long supplierProductId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + + //新建店铺代金券 + CouponApi.saveShopCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 1, productIds)); + //获取店铺优惠券id + Long shopCouponId = CouponApi.getShopCouponPage().get(0).getCouponId(); + //用户领取店铺优惠券 + CouponApi.receive(shopCouponId); + + //新建平台代金券 + CouponApi.savePlatformCoupon(CouponData.getCouponDTO(1, 0, 1, 1000L, 300L, null, 2, 10, 100, 0, productIds)); + //获取优惠券id + Long platformCouponId = CouponApi.getPlatformCouponPage().get(0).getCouponId(); + //用户领取优惠券 + CouponApi.receive(platformCouponId); + + //新增打8折权益 + Long discountUserRightsId = UserRightsApi.save(UserRightsDtoData.getDiscounttUserRightsDTO(80)); + //新增包邮权益 + Long freeFeeUserRightsId = UserRightsApi.save(UserRightsDtoData.getFreeFeeUserRightsDTO()); + //用户会员等级添加包邮和打8折权益 + UserLevelApi.update(UserLevelDtoData.getUserLevelDTO(UserApi.getUserInfo().getUserLevelId(), Arrays.asList(discountUserRightsId, freeFeeUserRightsId))); + + //修改积分配置,每15积分抵扣一元,最大使用积分比例100% + ScoreConfigApi.update(ScoreConfigDtoData.getScoreConfigDTO(15L ,100D)); + + OrderDTO orderDTO = OrderDtoData.getOrderDtoData(productId, 1); + //用户使用优惠券 + orderDTO.setCouponIds(Arrays.asList(CouponApi.getUserCouponPage().get(0).getCouponUserId(), CouponApi.getUserCouponPage().get(1).getCouponUserId())); + //使用150积分 + orderDTO.setIsScorePay(1); + orderDTO.setUserUseScore(150L); + //确认订单 + MyOrderApi.confirm(orderDTO); + //用户提交订单 + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + + //商家修改订单金额为50元 + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNumberList.get(0), 5000L, 0L)); + + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + TimeUnit.SECONDS.sleep(2L); + //对订单进行退款 + Long refundId = OrderRefund.supplierOrderRefund(orderNumberList.get(0)); + TimeUnit.SECONDS.sleep(2L); + + //删除会员权益 + UserRightsApi.delete(discountUserRightsId); + UserRightsApi.delete(freeFeeUserRightsId); + + //用户删除领取的店铺优惠券 + CouponApi.deleteUserCoupon(CouponApi.getUserCouponPage().get(0).getCouponUserId()); + + //根据平台优惠券id获取优惠券信息 + CouponVO platformCouponVO = CouponApi.getPlatformCouponInfo(platformCouponId); + //修改平台优惠券为暂不投放 + CouponApi.updatePlatformCoupon(CouponData.getUpdateCouponDTO(platformCouponVO)); + //删除平台代金券券 + CouponApi.deletePlatformCoupon(platformCouponId); + + //根据店铺优惠券id获取店铺优惠券信息 + CouponVO shopCouponVO = CouponApi.getShopCouponInfo(shopCouponId); + //修改店铺优惠券为暂不投放 + CouponApi.updateShopCoupon(CouponData.getUpdateCouponDTO(shopCouponVO)); + //删除店铺代金券 + CouponApi.deleteShopCoupon(shopCouponId); + + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + + //运行后验证数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true); + WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 18800L, 5000L, 6600L, 10816L, 2984L, 0L, 150L, 1.99, 28L, + 1000L, 2640L, 300L, 300L, 5000L, null, null, -4560L, 5000L, 1, 1); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DiscountTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DiscountTest.java new file mode 100644 index 0000000..65ace46 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/DiscountTest.java @@ -0,0 +1,253 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.discount.dto.DiscountItemDTO; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.DiscountApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.OfflineHandleEventDtoData; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.DiscountData; +import com.moyuer.cloud.systemtest.data.order.OrderDtoData; +import com.moyuer.cloud.systemtest.data.order.SubmitOrderDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class DiscountTest { + @DataProvider(name = "realProduct") + private Object[][] realProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "virtualProduct") + private Object[][] virtualProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryId, shopCategoryId, 8800L, 1), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "fullPreSaleProduct") + private Object[][] fullPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "depositPreSaleProduct") + private Object[][] depositPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getDepositPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "supplierProduct") + private Object[][] supplierProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @Test(description = "满减基本流程", dataProvider = "realProduct") + public void discountFlow(Long productId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + //根据id获取满减活动信息 + DiscountVO discountVO = DiscountApi.getDiscountInfo(discountId); + //修改信息后,更新满减活动 + DiscountApi.update(DiscountData.getUpdateDiscountDTO(discountVO)); + //用户购买商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 2)); + //提交订单,获取订单id + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + //平台违规下架活动 + DiscountApi.offline(OfflineHandleEventDtoData.getOfflineHandleEventDTO(null, discountId, "违规下架原因", null, null, null)); + //申请上架,审核失败 + //商家根据活动id获取下架信息 + OfflineHandleEventVO offlineHandleEventVO = DiscountApi.shopGetOfflineHandleEvent(discountId); + //商家申请上架 + DiscountApi.applyDiscount(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = DiscountApi.platformGetOfflineHandleEvent(discountId); + //平台审核失败 + DiscountApi.auditDiscount(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, "审核失败原因", 4)); + //申请上架,审核成功 + //商家根据活动id获取下架信息 + offlineHandleEventVO = DiscountApi.shopGetOfflineHandleEvent(discountId); + //商家申请上架 + DiscountApi.applyDiscount(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = DiscountApi.platformGetOfflineHandleEvent(discountId); + //平台审核成功 + DiscountApi.auditDiscount(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, null, 3)); + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getDiscountAmount(), 5000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 12600); + } + + @Test(description = "虚拟商品参与满减基本流程", dataProvider = "virtualProduct") + public void discountFlowWithVirtualProduct(Long productId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + //根据id获取满减活动信息 + DiscountVO discountVO = DiscountApi.getDiscountInfo(discountId); + //修改信息后,更新满减活动 + DiscountApi.update(DiscountData.getUpdateDiscountDTO(discountVO)); + //用户购买商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 2)); + //提交订单,获取订单id + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.virtualOrderRefund(orderNumberList.get(0)); + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getDiscountAmount(), 5000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 12600); + } + + @Test(description = "全款预售商品参与满减基本流程", dataProvider = "fullPreSaleProduct") + public void discountFlowWithFullPreSaleProduct(Long productId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + //根据id获取满减活动信息 + DiscountVO discountVO = DiscountApi.getDiscountInfo(discountId); + //修改信息后,更新满减活动 + DiscountApi.update(DiscountData.getUpdateDiscountDTO(discountVO)); + //用户购买商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 2)); + //提交订单,获取订单id + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getDiscountAmount(), 5000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 12600); + } + + @Test(description = "定金预售商品参与满减基本流程", dataProvider = "depositPreSaleProduct") + public void discountFlowWithDepositPreSaleProduct(Long productId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 5000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + //根据id获取满减活动信息 + DiscountVO discountVO = DiscountApi.getDiscountInfo(discountId); + //修改信息后,更新满减活动 + DiscountApi.update(DiscountData.getUpdateDiscountDTO(discountVO)); + //用户购买商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 2)); + //提交订单,获取订单id + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //根据订单id支付尾款 + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNumberList.get(0)); + //对订单进行退款 + Long refundId = OrderRefund.realOrderRefund(orderNumberList.get(0)); + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getDiscountAmount(), 5000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 10600); + } + + @Test(description = "供应商发货的供应商商品参与满减基本流程", dataProvider = "supplierProduct") + public void discountFlowWithSupplierProduct(Long productId, Long supplierProductId) throws InterruptedException { + //新建满减活动 + List discountItemDTOList = Arrays.asList(DiscountData.getDiscountItemDTO(10000L,1000L), DiscountData.getDiscountItemDTO(10100L, 4000L)); + List productIds = Collections.singletonList(productId); + DiscountApi.save(DiscountData.getDiscount(0, 0, discountItemDTOList, 50000L, 1, productIds, 1), true); + //获取满减活动id + Long discountId = DiscountApi.getDiscountPage(true).get(0).getDiscountId(); + //根据id获取满减活动信息 + DiscountVO discountVO = DiscountApi.getDiscountInfo(discountId); + //修改信息后,更新满减活动 + DiscountApi.update(DiscountData.getUpdateDiscountDTO(discountVO)); + //用户购买商品 + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 2)); + //提交订单,获取订单id + TimeUnit.SECONDS.sleep(2L); + List orderNumberList = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)); + //根据订单id支付订单 + PayApi.orderPay(orderNumberList); + //对订单进行退款 + Long refundId = OrderRefund.supplierOrderRefund(orderNumberList.get(0)); + //商家删除满减 + DiscountApi.delete(discountId, true); + //删除商品 + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumberList.get(0), true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), true).getOrderItemDetailList().get(0).getDiscountAmount(), 4000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumberList.get(0), refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 13600); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/SeckillTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/SeckillTest.java new file mode 100644 index 0000000..39e70a5 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/marketing/SeckillTest.java @@ -0,0 +1,169 @@ +package com.tmerclub.cloud.systemtest.test.marketing; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.seckill.model.SeckillCategory; +import com.tmerclub.cloud.seckill.vo.SeckillSpuVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.marketing.SeckillApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.OfflineHandleEventDtoData; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.marketing.SeckillData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.List; + +/** + * @author lpj + */ +public class SeckillTest { + @DataProvider(name = "realProduct") + private Object[][] realProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "virtualProduct") + private Object[][] virtualProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(SpuData.getUnRealSpu(categoryId, shopCategoryId, 8800L, 1), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "fullPreSaleProduct") + private Object[][] fullPreSaleProduct() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + Long productId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryId,shopCategoryId, DeliveryData.getFreeFeeDelivery(true),8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "supplierProduct") + private Object[][] supplierProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @Test(description = "实物秒杀活动基本流程", dataProvider = "realProduct") + public void secKillFlowWithRealProduct(Long productId) { + //新增秒杀分类 + SeckillApi.saveSeckillCategory(SeckillData.getSeckillCategoryDTO()); + //获取秒杀分类id + List seckillCategoryList = JSON.parseArray(SeckillApi.getSeckillCategoryList().toString(), SeckillCategory.class); + Long seckillCategoryId = seckillCategoryList.get(seckillCategoryList.size()-1).getCategoryId(); + //参与秒杀的时间戳 + Long startTimestamps = SeckillApi.getSeckillList().get(1).getStartTime().getTime(); + //新建秒杀活动 + SeckillApi.saveSeckill(SeckillData.getSeckillDTO(productId,seckillCategoryId, startTimestamps)); + //获取秒杀活动id + List seckillSpuVOList = SeckillApi.getSeckillSpuList(startTimestamps); + Long seckillId = seckillSpuVOList.get(seckillSpuVOList.size()-1).getSeckillId(); + //平台违规下架活动 + SeckillApi.offline(OfflineHandleEventDtoData.getOfflineHandleEventDTO(null, seckillId, "违规下架原因", null, null, null)); + //申请上架,审核失败 + //商家根据活动id获取下架信息 + OfflineHandleEventVO offlineHandleEventVO = SeckillApi.shopGetOfflineHandleEvent(seckillId); + //商家申请上架 + SeckillApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = SeckillApi.platformGetOfflineHandleEvent(seckillId); + //平台审核失败 + SeckillApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, "审核失败原因", 4)); + //申请上架,审核成功 + //商家根据活动id获取下架信息 + offlineHandleEventVO = SeckillApi.shopGetOfflineHandleEvent(seckillId); + //商家申请上架 + SeckillApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = SeckillApi.platformGetOfflineHandleEvent(seckillId); + //平台审核成功 + SeckillApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, null, 3)); + //失效秒杀活动 + SeckillApi.invalidSeckill(seckillId); + //删除商品 + ProductApi.delete(productId, true); + //删除秒杀分类 + SeckillApi.deleteSeckillCategory(seckillCategoryId); + } + + @Test(description = "虚拟秒杀活动基本流程", dataProvider = "virtualProduct") + public void secKillFlowWithVirtualProduct(Long productId) { + //新增秒杀分类 + SeckillApi.saveSeckillCategory(SeckillData.getSeckillCategoryDTO()); + //获取秒杀分类id + List seckillCategoryList = JSON.parseArray(SeckillApi.getSeckillCategoryList().toString(), SeckillCategory.class); + Long seckillCategoryId = seckillCategoryList.get(seckillCategoryList.size()-1).getCategoryId(); + //参与秒杀的时间戳 + Long startTimestamps = SeckillApi.getSeckillList().get(1).getStartTime().getTime(); + //新建秒杀活动 + SeckillApi.saveSeckill(SeckillData.getSeckillDTO(productId,seckillCategoryId, startTimestamps)); + //获取秒杀活动id + List seckillSpuVOList = SeckillApi.getSeckillSpuList(startTimestamps); + Long seckillId = seckillSpuVOList.get(seckillSpuVOList.size()-1).getSeckillId(); + //失效秒杀活动 + SeckillApi.invalidSeckill(seckillId); + //删除商品 + ProductApi.delete(productId, true); + //删除秒杀分类 + SeckillApi.deleteSeckillCategory(seckillCategoryId); + } + + @Test(description = "全款预售秒杀活动基本流程", dataProvider = "fullPreSaleProduct") + public void secKillFlowWithFullPreSaleProduct(Long productId) { + //新增秒杀分类 + SeckillApi.saveSeckillCategory(SeckillData.getSeckillCategoryDTO()); + //获取秒杀分类id + List seckillCategoryList = JSON.parseArray(SeckillApi.getSeckillCategoryList().toString(), SeckillCategory.class); + Long seckillCategoryId = seckillCategoryList.get(seckillCategoryList.size()-1).getCategoryId(); + //参与秒杀的时间戳 + Long startTimestamps = SeckillApi.getSeckillList().get(1).getStartTime().getTime(); + //新建秒杀活动 + SeckillApi.saveSeckill(SeckillData.getSeckillDTO(productId,seckillCategoryId, startTimestamps)); + //获取秒杀活动id + List seckillSpuVOList = SeckillApi.getSeckillSpuList(startTimestamps); + Long seckillId = seckillSpuVOList.get(seckillSpuVOList.size()-1).getSeckillId(); + //失效秒杀活动 + SeckillApi.invalidSeckill(seckillId); + //删除商品 + ProductApi.delete(productId, true); + //删除秒杀分类 + SeckillApi.deleteSeckillCategory(seckillCategoryId); + } + + @Test(description = "供应商发货的供应商商品秒杀活动基本流程", dataProvider = "supplierProduct") + private void secKillFlowWithSupplierProduct(Long productId, Long supplierProductId) { + //新增秒杀分类 + SeckillApi.saveSeckillCategory(SeckillData.getSeckillCategoryDTO()); + //获取秒杀分类id + List seckillCategoryList = JSON.parseArray(SeckillApi.getSeckillCategoryList().toString(), SeckillCategory.class); + Long seckillCategoryId = seckillCategoryList.get(seckillCategoryList.size()-1).getCategoryId(); + //参与秒杀的时间戳 + Long startTimestamps = SeckillApi.getSeckillList().get(1).getStartTime().getTime(); + //新建秒杀活动 + SeckillApi.saveSeckill(SeckillData.getSeckillDTO(productId,seckillCategoryId, startTimestamps)); + //获取秒杀活动id + List seckillSpuVOList = SeckillApi.getSeckillSpuList(startTimestamps); + Long seckillId = seckillSpuVOList.get(seckillSpuVOList.size()-1).getSeckillId(); + //失效秒杀活动 + SeckillApi.invalidSeckill(seckillId); + //删除商品 + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + //删除秒杀分类 + SeckillApi.deleteSeckillCategory(seckillCategoryId); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/OrderTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/OrderTest.java new file mode 100644 index 0000000..b0c49cc --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/OrderTest.java @@ -0,0 +1,653 @@ +package com.tmerclub.cloud.systemtest.test.order; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.order.dto.OrderStationDTO; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.order.*; +import com.moyuer.cloud.systemtest.api.store.SameCityApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.api.store.TransportApi; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.order.*; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.store.SameCityDtoData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author Tu + */ +public class OrderTest { + + private List getCategoryId() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + /** + * 无运费商品 + * */ + @DataProvider(name = "realProductDeliveryFree") + private Object[][] realProductDeliveryFree() { + List categoryIds = getCategoryId(); + Long transportId = DeliveryData.getFreeFeeDelivery(true); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 1000L), true); + return new Object[][]{{productId}}; + } + /** + * 广东可配送,8元运费商品 + * */ + @DataProvider(name = "realProductDelivery") + private Object[][] realProductDeliveryNoFree() { + List categoryIds = getCategoryId(); + TransportApi.addTransport(DeliveryData.getTransportDTO(), true); + Long transportId = TransportApi.infoTransport(true).get(0).getTransportId(); + Long productId = ProductApi.createProduct(SpuData.getRealSpu(categoryIds.get(0), categoryIds.get(1), transportId, 8800L), true); + return new Object[][]{{productId}}; + } + + @Test(description = "JK_01,实物商品订单取消删除", dataProvider = "realProductDeliveryFree") + public void realOrderCancel(Long productId) { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + MyOrderApi.cancel(orderNum); + ProductApi.delete(productId, true); + MyOrderApi.delete(orderNum); + } + + @Test(description = "JK_02,实物商品订单发货完整流程", dataProvider = "realProductDeliveryFree") + public void realProductDeliveryOrderTestCase(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + List mongoShopWalletLogBOList = ShopWalletApi.getMongoShopWalletLogBO(orderNum, true); + Assert.assertEquals(mongoShopWalletLogBOList.size(), 1); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOList.get(0), 0, 1, 980L, 1000L, 0L, 0L, 0L, 20L, 0); + } + + @Test(description = "JK_03,修改订单金额、用户收货信息和物流信息完整流程", dataProvider = "realProductDeliveryFree") + public void orderChangeAmountDeliveryTestCase(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + + OrderApi.infoOrder(orderNum); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNum)); + + OrderApi.infoOrderAddr(orderNum); + OrderApi.changeOrderAddrCheck(orderNum); + OrderApi.changeOrderAddr(OrderAddrDtoData.getChangeOrderAddrDTO(orderNum)); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + List delivery = OrderApi.infoOrderDelivery(orderNum); + + List deliveryOrderDtos = JSON.parseArray(JSON.toJSONString(delivery), DeliveryOrderDTO.class); + deliveryOrderDtos.forEach(s -> s.setDeliveryNo("xgh123123123123")); + OrderApi.updateOrderDelivery(deliveryOrderDtos); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + List mongoShopWalletLogBOList = ShopWalletApi.getMongoShopWalletLogBO(orderNum, true); + Assert.assertEquals(mongoShopWalletLogBOList.size(), 1); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOList.get(0), 0, 1, 4999L, 5100L, 0L, 0L, 0L, 101L, 0); + } + + @Test(description = "JK_04,无需快递发货订单完整流程", dataProvider = "realProductDeliveryFree") + public void noDeliveryOrderTestCase(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + List mongoShopWalletLogBOList = ShopWalletApi.getMongoShopWalletLogBO(orderNum, true); + Assert.assertEquals(mongoShopWalletLogBOList.size(), 1); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOList.get(0), 0, 1, 980L, 1000L, 0L, 0L, 0L, 20L, 0); + } + + @Test(description = "JK_05,多次退款失败,退货成功订单", dataProvider = "realProductDeliveryFree") + public void multiRefundOrderTestCase(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + //申请第一次退款,部分退款 等待保存 + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirst)); + + //申请第二次退款,整单退款 + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdSec)); + //发货后对订单进行部分退款仅退款 & 整单退货退款:先同意退款申请,发货后拒绝退款 + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + Long refundIdTir= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdTir); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdTir)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFourth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdFourth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdFourth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFourth)); + TimeUnit.SECONDS.sleep(1L); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getRefuseDeliveryRefundDTO(refundIdFourth)); + //确认收货后,对订单进行部分退款仅退款 & 整单退货退款且同意 + MyOrderApi.receipt(orderNum); + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirth= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirth)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdSixth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSixth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdSixth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdSixth)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSixth)); + + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNum).size(), 6); + List mongoShopWalletLogBOList = ShopWalletApi.getMongoShopWalletLogBO(orderNum, true); + Assert.assertEquals(mongoShopWalletLogBOList.size(), 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOList.get(0), 0, 0, 980L, 1000L, 0L, 0L, 0L, 20L, 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOList.get(1), 0, 1, 980L, 1000L, 0L, 0L, 0L, 20L, 0); + + OrderDetailVO orderDetailVO = ShopWalletApi.getOrderDetailVO(orderNum, refundIdSixth, true); +// WalletAssert.shopOrderDetailAssert(orderDetailVO.getOrderItemDetailList().get(0), 100); + } + @Test(description = "JK_06,未发货订单申请退款成功", dataProvider = "realProductDeliveryFree") + public void unDeliveryRefundTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + //部分退款成功 + Long orderNumFirst = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst = OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNumFirst,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirst)); + //整单退款成功 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNumSec = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec = OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNumSec)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSec)); + + ProductApi.delete(productId, true); + + //第一个下单验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumFirst).size(), 1); + List mongoShopWalletLogBOListFirst = ShopWalletApi.getMongoShopWalletLogBO(orderNumFirst, true); + Assert.assertEquals(mongoShopWalletLogBOListFirst.size(), 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListFirst.get(0), 0, 0, 980L, 1000L, 0L, 0L, 0L, 20L, 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListFirst.get(1), 0, 1, 980L, 1000L, 0L, 0L, 0L, 20L, 0); + + OrderDetailVO orderDetailVOFirst = ShopWalletApi.getOrderDetailVO(orderNumFirst, refundIdFirst, true); +// WalletAssert.shopOrderDetailAssert(orderDetailVOFirst, 1000L, 1, 0L, 0L, 0L); + + //第二个下单验证运行后数据是否正确 + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumSec).size(), 1); + List mongoShopWalletLogBOListSec = ShopWalletApi.getMongoShopWalletLogBO(orderNumSec, true); + Assert.assertEquals(mongoShopWalletLogBOListSec.size(), 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListSec.get(0), 0, 0, 980L, 1000L, 0L, 0L, 0L, 20L, 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListSec.get(1), 0, 1, 980L, 1000L, 0L, 0L, 0L, 20L, 0); + + OrderDetailVO orderDetailVOSec = ShopWalletApi.getOrderDetailVO(orderNumSec, refundIdSec, true); +// WalletAssert.shopOrderDetailAssert(orderDetailVOSec, 1000L, 1, 0L, 0L, 0L); + } + + @Test(description = "JK_07,已发货订单申请仅退款成功", dataProvider = "realProductDeliveryFree") + public void deliveryRefundTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + + //部分退款成功 + Long orderNumFirst = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumFirst); + + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNumFirst)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNumFirst,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirst)); + //整单退款成功 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNumSec = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumSec); + + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNumSec)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSec)); + + ProductApi.delete(productId, true); + + //第一个下单验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumFirst).size(), 1); + List mongoShopWalletLogBOListFirst = ShopWalletApi.getMongoShopWalletLogBO(orderNumFirst, true); + Assert.assertEquals(mongoShopWalletLogBOListFirst.size(), 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListFirst.get(0), 0, 0, 980L, 1000L, 0L, 0L, 0L, 20L, 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListFirst.get(1), 0, 1, 980L, 1000L, 0L, 0L, 0L, 20L, 0); + + OrderDetailVO orderDetailVOFirst = ShopWalletApi.getOrderDetailVO(orderNumFirst, refundIdFirst, true); +// WalletAssert.shopOrderDetailAssert(orderDetailVOFirst, 1000L, 1, 0L, 0L, 0L); + + //第二个下单验证运行后数据是否正确 + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumSec).size(), 1); + List mongoShopWalletLogBOListSec = ShopWalletApi.getMongoShopWalletLogBO(orderNumSec, true); + Assert.assertEquals(mongoShopWalletLogBOListSec.size(), 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListSec.get(0), 0, 0, 980L, 1000L, 0L, 0L, 0L, 20L, 2); + WalletAssert.shopWalletLogAssert(mongoShopWalletLogBOListSec.get(1), 0, 1, 980L, 1000L, 0L, 0L, 0L, 20L, 0); + + OrderDetailVO orderDetailVOSec = ShopWalletApi.getOrderDetailVO(orderNumSec, refundIdSec, true); +// WalletAssert.shopOrderDetailAssert(orderDetailVOSec, 1000L, 1, 0L, 0L, 0L); + } + + @Test(description = "JK_08,已收货订单申请仅退款成功", dataProvider = "realProductDeliveryFree") + public void receiveRefundTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + + //部分退款成功 + Long orderNumFirst = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNumFirst)); + MyOrderApi.receipt(orderNumFirst); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNumFirst,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirst)); + //整单退款成功 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNumSec = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + MyOrderApi.receipt(orderNumSec); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNumSec)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSec)); + + ProductApi.delete(productId, true); + + //第一个下单验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumFirst).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumFirst, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, refundIdFirst, true).getOrderItemDetailList().get(0).getRefundAmount(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + + //第二个下单验证运行后数据是否正确 + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumSec).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumSec, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, refundIdSec, true).getOrderItemDetailList().get(0).getRefundAmount(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } + + @Test(description = "JK_09,已发货订单申请退货退款成功", dataProvider = "realProductDeliveryFree") + public void unReceiveRefundDeLiveryTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + + //部分退货退款成功 + Long orderNumFirst = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumFirst); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNumFirst)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDeliveryDTO(orderNumFirst,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirst)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFirst)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirst)); + + //整单退货退款成功 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNumSec = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumSec); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNumSec)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSec)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdSec)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSec)); + + ProductApi.delete(productId, true); + + //第一个下单验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumFirst).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumFirst, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, refundIdFirst, true).getOrderItemDetailList().get(0).getRefundAmount(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + + //第二个下单验证运行后数据是否正确 + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumSec).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumSec, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, refundIdSec, true).getOrderItemDetailList().get(0).getRefundAmount(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } + + @Test(description = "JK_10,已收货订单申请退货退款成功", dataProvider = "realProductDeliveryFree") + public void receivedRefundDeLiveryTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + + //部分退货退款成功 + Long orderNumFirst = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumFirst); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNumFirst)); + MyOrderApi.receipt(orderNumFirst); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDeliveryDTO(orderNumFirst,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirst)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFirst)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdFirst)); + //整单退货退款成功 + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNumSec = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNumSec); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNumSec)); + MyOrderApi.receipt(orderNumSec); + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNumSec)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSec)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdSec)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSec)); + + ProductApi.delete(productId, true); + + //第一个下单验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumFirst).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumFirst, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, refundIdFirst, true).getOrderItemDetailList().get(0).getRefundAmount(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumFirst, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + + //第二个下单验证运行后数据是否正确 + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNumSec).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNumSec, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, refundIdSec, true).getOrderItemDetailList().get(0).getRefundAmount(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNumSec, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } + + @Test(description = "JK_11,已完成有运费订单部分金额仅退款", dataProvider = "realProductDelivery") + public void receivedRefundTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + + //部分退款仅退部分金额 + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + + TimeUnit.SECONDS.sleep(2L); + Long refundId= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundApartAmountDTO(orderNum,1099L)); + ShopOrderRefundApi.infoByRefundSn(refundId); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + ProductApi.delete(productId, true); + TransportApi.deleteTransport(TransportApi.infoTransport(true).get(0).getTransportId(), true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNum).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 3); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 8800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 1099); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 175); + } + + @Test(description = "JK_12,已完成有运费订单部分金额退货退款", dataProvider = "realProductDelivery") + public void receivedRefundDeliveryTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + + //部分退货退款仅退部分金额 + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + + TimeUnit.SECONDS.sleep(2L); + Long refundId= OrderRefundApi.apply(OrderRefundDtoData.getRefundDeliveryApartAmountDTO(orderNum,1099L)); + ShopOrderRefundApi.infoByRefundSn(refundId); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundId)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + + ProductApi.delete(productId, true); + TransportApi.deleteTransport(TransportApi.infoTransport(true).get(0).getTransportId(), true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNum).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 3); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 8800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 1099); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 175); + } + + @Test(description = "JK_13,未发货有运费订单部分退款", dataProvider = "realProductDelivery") + public void unDeliveryRefundTransFeeTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + //部分退款仅退部分金额 + TimeUnit.SECONDS.sleep(2L); + Long refundId= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundApartAmountDTO(orderNum,1099L)); + ShopOrderRefundApi.infoByRefundSn(refundId); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundId)); + + ProductApi.delete(productId, true); + TransportApi.deleteTransport(TransportApi.infoTransport(true).get(0).getTransportId(), true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNum).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 3); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 8800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 1899); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 175); + } + + @Test(description = "JK_14,未发货有运费订单整单退款", dataProvider = "realProductDelivery") + public void unDeliveryRefundAllTransFeeTest(Long productId) throws InterruptedException { + ShopCartApi.addItem(ShopCartData.getShopCartItem(productId)); + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + + TimeUnit.SECONDS.sleep(2L); + Long refundId= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundId); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundId)); + + ProductApi.delete(productId, true); + TransportApi.deleteTransport(TransportApi.infoTransport(true).get(0).getTransportId(), true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNum).size(), 1); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 8800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 8800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getFreightAmount(), 800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 175); + } + + @Test(description = "JK_15, 自提订单通过自提码后台提货", dataProvider = "realProductDeliveryFree") + public static void pickUpAdminProductOrderByStationCode(Long productId)throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getPickUpOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getPickUpSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + Assert.assertEquals(OrderApi.getOrderItemAndStationInfo(orderNum).getStationCode(), MyOrderApi.stationOrderDetail(orderNum).getStationCode()); + OrderApi.changeStatusAndOrderStation(OrderSelfStationDtoData.getOrderSelfStationDTO(orderNum, MyOrderApi.stationOrderDetail(orderNum).getStationId())); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + TimeUnit.SECONDS.sleep(2L); + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } + + @Test(description = "JK_16, 自提订单无需自提码后台提货", dataProvider = "realProductDeliveryFree") + public static void pickUpAdminProductOrder(Long productId) { + MyOrderApi.confirm(OrderDtoData.getPickUpOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getPickUpSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + OrderApi.changeStatusAndOrderStation(OrderSelfStationDtoData.getOrderSelfStationDTO(orderNum, MyOrderApi.stationOrderDetail(orderNum).getStationId())); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } + + @Test(description = "JK_17, 门店提货自提订单", dataProvider = "realProductDeliveryFree") + public static void stationPickUpAdminProductOrder(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getPickUpOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getPickUpSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + StationApi.getStationOrderByCode(MyOrderApi.stationOrderDetail(orderNum).getStationCode()); + StationApi.orderStationById(orderNum.toString()); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } + + @Test(description = "JK_18, 用户扫商家码核销订单", dataProvider = "realProductDeliveryFree") + public static void userPickUpAdminProductOrder(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getPickUpOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getPickUpSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderStationDTO orderStationDTO = new OrderStationDTO(); + orderStationDTO.setOrderIds(Collections.singletonList(orderNum)); + orderStationDTO.setStationId(MyOrderApi.stationOrderDetail(orderNum).getStationId()); + MyOrderApi.orderStationByOrderId(orderStationDTO); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } + + @Test(description = "JK_19, 同城配送订单流程", dataProvider = "realProductDeliveryFree") + public static void sameCityOrder(Long productId) throws InterruptedException { + SameCityApi.saveSameCity(SameCityDtoData.getSameCityDTO()); + MyOrderApi.confirm(OrderDtoData.getSameCityOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getSameCityDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 1000); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getFreightAmount(), 100); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 20); + } +} + diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/PreSaleOrderTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/PreSaleOrderTest.java new file mode 100644 index 0000000..560a788 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/PreSaleOrderTest.java @@ -0,0 +1,304 @@ +package com.tmerclub.cloud.systemtest.test.order; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.order.*; +import com.moyuer.cloud.systemtest.api.store.SameCityApi; +import com.moyuer.cloud.systemtest.api.store.ShopWalletApi; +import com.moyuer.cloud.systemtest.data.amount.PreSaleSpuData; +import com.moyuer.cloud.systemtest.data.order.*; +import com.moyuer.cloud.systemtest.data.platform.CategoryDtoData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.store.SameCityDtoData; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lpj + */ +public class PreSaleOrderTest { + private List getCategoryId() { + List categoryAppVOList = CategoryApi.listShopCategory(true); + Long shopCategoryId = categoryAppVOList.get(categoryAppVOList.size() - 1).getCategoryId(); + Long categoryId = CategoryApi.listSigningCategory(true).get(0).getCategoryId(); + CategoryApi.update(CategoryDtoData.getCategoryDTO(categoryId)); + return Stream.of(categoryId, shopCategoryId).collect(Collectors.toList()); + } + + @DataProvider(name = "depositPreSaleProduct") + private Object[][] depositPreSaleProduct() { + List categoryIds = getCategoryId(); + Long transportId = DeliveryData.getFreeFeeDelivery(true); + Long productId = ProductApi.createProduct(PreSaleSpuData.getDepositPreSaleSpu(categoryIds.get(0), categoryIds.get(1), transportId, 8800L), true); + return new Object[][]{{productId}}; + } + + @DataProvider(name = "fullPreSaleProduct") + private Object[][] fullPreSaleProduct() { + List categoryIds = getCategoryId(); + Long transportId = DeliveryData.getFreeFeeDelivery(true); + Long productId = ProductApi.createProduct(PreSaleSpuData.getFullPreSaleSpu(categoryIds.get(0), categoryIds.get(1), transportId, 8800L), true); + return new Object[][]{{productId}}; + } + + @Test(description = "JK_59,定金预售订单取消删除", dataProvider = "depositPreSaleProduct") + public void preSaleOrderCancel(Long productId) { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + MyOrderApi.cancel(orderNum); + ProductApi.delete(productId, true); + MyOrderApi.delete(orderNum); + } + + @Test(description = "JK_60,定金预售订单发货完整流程", dataProvider = "depositPreSaleProduct") + public void depositPreSaleOrderDeliveryTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 155); + } + + @Test(description = "JK_61,修改定金预售订单金额、用户收货信息和物流信息完整流程", dataProvider = "depositPreSaleProduct") + public void depositPreSaleOrderChangeAmountDeliveryTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + + OrderApi.infoOrder(orderNum); + OrderApi.changeOrderAmount(OrderAdminDtoData.getOrderAdminDto(orderNum, 50L, 0L)); + + OrderApi.infoOrderAddr(orderNum); + OrderApi.changeOrderAddrCheck(orderNum); + OrderApi.changeOrderAddr(OrderAddrDtoData.getChangeOrderAddrDTO(orderNum)); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getDeliveryOrderDtoData(orderNum)); + List delivery = OrderApi.infoOrderDelivery(orderNum); + + List deliveryOrderDtos = JSON.parseArray(JSON.toJSONString(delivery), DeliveryOrderDTO.class); + deliveryOrderDtos.forEach(s -> s.setDeliveryNo("xgh123123123123")); + OrderApi.updateOrderDelivery(deliveryOrderDtos); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 850); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 17); + } + + @Test(description = "JK_62,无需快递发货定金预售订单完整流程", dataProvider = "depositPreSaleProduct") + public void noDeliveryDepositPreSaleOrderTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNum); + TimeUnit.SECONDS.sleep(2L); + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 155); + } + + @Test(description = "JK_63,未发货退货成功定金预售订单", dataProvider = "depositPreSaleProduct") + public void refundDepositPreSaleOrderTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNum); + //申请第一次退款,部分退款 等待保存 + TimeUnit.SECONDS.sleep(2L); + Long refundId = OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundId); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundId)); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundId, true).getOrderItemDetailList().get(0).getRefundAmount(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 155); + } + + @Test(description = "JK_64,多次退款失败,退货成功定金预售订单", dataProvider = "depositPreSaleProduct") + public void multiRefundDepositPreSaleOrderTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNum); + //申请第一次退款,部分退款 等待保存 + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirst)); + + //申请第二次退款,整单退款 + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdSec)); + //发货后对订单进行部分退款仅退款 & 整单退货退款:先同意退款申请,发货后拒绝退款 + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + Long refundIdTir= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdTir); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdTir)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFourth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdFourth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdFourth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFourth)); + TimeUnit.SECONDS.sleep(1L); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getRefuseDeliveryRefundDTO(refundIdFourth)); + //确认收货后,对订单进行部分退款仅退款 & 整单退货退款且同意 + MyOrderApi.receipt(orderNum); + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirth= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirth)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdSixth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSixth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdSixth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdSixth)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSixth)); + + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNum).size(), 6); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundIdSixth, true).getOrderItemDetailList().get(0).getRefundAmount(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 155); + } + + @Test(description = "JK_65, 门店提货自提定金预售订单", dataProvider = "depositPreSaleProduct") + public static void stationPickUpAdminDepositPreSaleOrder(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getPickUpOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getPickUpSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNum); + TimeUnit.SECONDS.sleep(2L); + StationApi.getStationOrderByCode(MyOrderApi.stationOrderDetail(orderNum).getStationCode()); + StationApi.orderStationById(orderNum.toString()); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 155); + } + + @Test(description = "JK_66, 同城配送定金预售订单流程", dataProvider = "depositPreSaleProduct") + public static void sameCityDepositPreSaleOrder(Long productId) throws InterruptedException { + SameCityApi.saveSameCity(SameCityDtoData.getSameCityDTO()); + MyOrderApi.confirm(OrderDtoData.getSameCityOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + PayApi.orderPayBalance(orderNum); + OrderApi.delivery(DeliveryOrderDtoData.getSameCityDeliveryOrderDtoData(orderNum)); + MyOrderApi.receipt(orderNum); + CommentApi.addComment(SpuCommDtoData.getSpuCommDtoData(OrderApi.getOrderItemAndAddress(orderNum).getOrderItems().get(0).getOrderItemId())); + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 1); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 7800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 155); + } + + @Test(description = "JK_67,多次退款失败,退货成功全款预售订单", dataProvider = "fullPreSaleProduct") + public void multiRefundFullPreSaleOrderTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirm(OrderDtoData.getOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitOrderDtoData.getSubmitOrderDtoData(productId)).get(0); + PayApi.orderPay(orderNum); + //申请第一次退款,部分退款 等待保存 + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirst= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirst); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirst)); + + //申请第二次退款,整单退款 + TimeUnit.SECONDS.sleep(2L); + Long refundIdSec= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSec); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdSec)); + //发货后对订单进行部分退款仅退款 & 整单退货退款:先同意退款申请,发货后拒绝退款 + OrderApi.delivery(DeliveryOrderDtoData.getNoDeliveryOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + Long refundIdTir= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdTir); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdTir)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdFourth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdFourth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdFourth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdFourth)); + TimeUnit.SECONDS.sleep(1L); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getRefuseDeliveryRefundDTO(refundIdFourth)); + //确认收货后,对订单进行部分退款仅退款 & 整单退货退款且同意 + MyOrderApi.receipt(orderNum); + TimeUnit.SECONDS.sleep(2L); + Long refundIdFirth= OrderRefundApi.apply(OrderRefundDtoData.getOrderRefundDTO(orderNum,0L)); + ShopOrderRefundApi.infoByRefundSn(refundIdFirth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getRufuseOrderRefundDTO(refundIdFirth)); + + TimeUnit.SECONDS.sleep(2L); + Long refundIdSixth= OrderRefundApi.apply(OrderRefundDtoData.getAllOrderRefundDeliveryDTO(orderNum)); + ShopOrderRefundApi.infoByRefundSn(refundIdSixth); + ShopOrderRefundApi.processRefundOrder(ShopOrderRefundDtoData.getReceiveRefundDTO(refundIdSixth)); + OrderRefundApi.submitExpress(OrderRefundDeliveryDtoData.getOrderRefundDeliveryDTO(refundIdSixth)); + ShopOrderRefundApi.returnMoney(ShopOrderRefundDtoData.getReceiveDeliveryRefundDTO(refundIdSixth)); + + ProductApi.delete(productId, true); + + //验证运行后数据是否正确 + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ShopOrderRefundApi.getEsOrderRefundVO(orderNum).size(), 6); + Assert.assertEquals(ShopWalletApi.getMongoShopWalletLogBO(orderNum, true).size(), 2); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getActualTotal(), 8800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, refundIdSixth, true).getOrderItemDetailList().get(0).getRefundAmount(), 8800); + Assert.assertEquals(ShopWalletApi.getOrderDetailVO(orderNum, true).getOrderItemDetailList().get(0).getPlatformCommission(), 175); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/ScoreOrderTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/ScoreOrderTest.java new file mode 100644 index 0000000..0ad87c9 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/order/ScoreOrderTest.java @@ -0,0 +1,67 @@ +package com.tmerclub.cloud.systemtest.test.order; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.moyuer.cloud.systemtest.api.amount.PayApi; +import com.moyuer.cloud.systemtest.api.order.MyOrderApi; +import com.moyuer.cloud.systemtest.api.platform.ScoreOrderApi; +import com.moyuer.cloud.systemtest.api.platform.ScoreProductApi; +import com.moyuer.cloud.systemtest.data.platform.*; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author lpj + */ +public class ScoreOrderTest { + @DataProvider(name = "scoreProductDeliveryFree") + private Object[][] scoreProductDeliveryFree() { + Long transportId = PlatformDeliveryData.getPlatformFreeFeeDelivery(); + Long productId = ScoreProductApi.createScoreProduct(ScoreSpuData.getScoreSpu(transportId, 100L, 100L)); + return new Object[][]{{productId}}; + } + + @Test(description = "JK_52,积分商品订单取消删除", dataProvider = "scoreProductDeliveryFree") + public void scoreOrderCancel(Long productId) { + MyOrderApi.confirmScoreOrder(ScoreOrderDtoData.getScoreOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitScoreOrderDtoData.getSubmitScoreOrderDtoData()).get(0); + MyOrderApi.cancel(orderNum); + ScoreProductApi.deleteScoreProduct(productId); + MyOrderApi.delete(orderNum); + } + + @Test(description = "JK_53,积分商品订单发货完整流程", dataProvider = "scoreProductDeliveryFree") + public void scoreOrderDeliveryOrderTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirmScoreOrder(ScoreOrderDtoData.getScoreOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitScoreOrderDtoData.getSubmitScoreOrderDtoData()).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + ScoreOrderApi.scoreOrderDelivery(DeliveryScoreOrderDtoData.getDeliveryScoreOrderDtoData(orderNum)); + + TimeUnit.SECONDS.sleep(2L); + List delivery = ScoreOrderApi.infoOrderDelivery(orderNum); + List deliveryOrderDtos = JSON.parseArray(JSON.toJSONString(delivery), DeliveryOrderDTO.class); + deliveryOrderDtos.forEach(s -> s.setDeliveryNo("xgh123123123123")); + ScoreOrderApi.updateOrderDelivery(deliveryOrderDtos); + + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + ScoreProductApi.deleteScoreProduct(productId); + } + + @Test(description = "JK_54,积分商品无需快递发货完成流程", dataProvider = "scoreProductDeliveryFree") + public void scoreOrderNoDeliveryOrderTestCase(Long productId) throws InterruptedException { + MyOrderApi.confirmScoreOrder(ScoreOrderDtoData.getScoreOrderDtoData(productId, 1)); + Long orderNum = MyOrderApi.submit(SubmitScoreOrderDtoData.getSubmitScoreOrderDtoData()).get(0); + PayApi.orderPay(orderNum); + TimeUnit.SECONDS.sleep(2L); + ScoreOrderApi.scoreOrderDelivery(DeliveryScoreOrderDtoData.getNoDeliveryScoreOrderDtoData(orderNum)); + TimeUnit.SECONDS.sleep(2L); + MyOrderApi.receipt(orderNum); + ScoreProductApi.deleteScoreProduct(productId); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/SupplierChangeSpuTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/SupplierChangeSpuTest.java new file mode 100644 index 0000000..d27db9f --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/SupplierChangeSpuTest.java @@ -0,0 +1,341 @@ +package com.tmerclub.cloud.systemtest.test.store; + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.product.dto.*; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.moyuer.cloud.systemtest.api.amount.ProductApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.store.SpuPageSearchDtoData; +import com.moyuer.cloud.systemtest.data.supplier.SupplierProductData; +import org.springframework.beans.BeanUtils; +import org.testng.Assert; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class SupplierChangeSpuTest { + @DataProvider(name = "supplierDeliveryProduct") + private Object[][] supplierDeliveryProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 1, null, true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @DataProvider(name = "shopDeliveryProduct") + private Object[][] shopDeliveryProduct() { + Long supplierProductId = SupplierProductData.getSupplierProductId(6600L, DeliveryData.getSupplierFreeFeeDelivery(true), true); + Long productId = SupplierProductData.getProductId(supplierProductId, 8800L, 2, DeliveryData.getFreeFeeDelivery(true), true, true); + return new Object[][]{{productId, supplierProductId}}; + } + + @Test(description = "供应商删除商品,供应商发货的代销商品状态是否正确", dataProvider = "supplierDeliveryProduct") + public void supplierDeleteSupplierDeliveryProduct(Long productId, Long supplierProductId) { + SupplierProductApi.delete(supplierProductId, true); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 0); + ProductApi.delete(productId, true); + } + + @Test(description = "供应商删除商品,商家发货的代销商品状态是否正确", dataProvider = "shopDeliveryProduct") + public void supplierDeleteShopDeliveryProduct(Long productId, Long supplierProductId) { + SupplierProductApi.delete(supplierProductId, true); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + ProductApi.delete(productId, true); + } + + @Test(description = "供应商修改供货价,供应商发货的代销商品状态是否正确", dataProvider = "supplierDeliveryProduct") + public void supplierChangeSupplierDeliveryProductPrice(Long productId, Long supplierProductId) throws InterruptedException { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(supplierProductId); + List skuVOList = SupplierProductApi.info(supplierProductId, true).getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + skuDTOList.forEach(i->i.setPriceFee(2000L)); + spuDTO.setSkuList(skuDTOList); + SupplierProductApi.updateProductData(spuDTO); + + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 0); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "供应商修改供货价,商家发货的代销商品状态是否正确", dataProvider = "shopDeliveryProduct") + public void supplierChangeShopDeliveryProductPrice(Long productId, Long supplierProductId) throws InterruptedException { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(supplierProductId); + List skuVOList = SupplierProductApi.info(supplierProductId, true).getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + skuDTOList.forEach(i->i.setPriceFee(2000L)); + spuDTO.setSkuList(skuDTOList); + SupplierProductApi.updateProductData(spuDTO); + + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "供应商修改重量,供应商发货的代销商品状态是否正确", dataProvider = "supplierDeliveryProduct") + public void supplierChangeSupplierDeliveryProductWeight(Long productId, Long supplierProductId) throws InterruptedException { + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = new SpuDTO(); + BeanUtils.copyProperties(spuVO, spuDTO); + List skuVOList = spuVO.getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + spuDTO.setSkuList(skuDTOList); + skuDTOList.forEach(i->i.setWeight(1.1)); + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuDTO.setSpuLangList(spuLangDTOList); + SupplierProductApi.update(spuDTO, true); + + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "供应商修改重量,商家发货的代销商品状态是否正确", dataProvider = "shopDeliveryProduct") + public void supplierChangeShopDeliveryProductWeight(Long productId, Long supplierProductId) throws InterruptedException { + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = new SpuDTO(); + BeanUtils.copyProperties(spuVO, spuDTO); + List skuVOList = spuVO.getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + spuDTO.setSkuList(skuDTOList); + skuDTOList.forEach(i->i.setWeight(1.1)); + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuDTO.setSpuLangList(spuLangDTOList); + SupplierProductApi.update(spuDTO, true); + + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 0); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "供应商修改体积,供应商发货的代销商品状态是否正确", dataProvider = "supplierDeliveryProduct") + public void supplierChangeSupplierDeliveryProductVolume(Long productId, Long supplierProductId) throws InterruptedException { + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = new SpuDTO(); + BeanUtils.copyProperties(spuVO, spuDTO); + List skuVOList = spuVO.getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + spuDTO.setSkuList(skuDTOList); + skuDTOList.forEach(i->i.setVolume(1.1)); + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuDTO.setSpuLangList(spuLangDTOList); + SupplierProductApi.update(spuDTO, true); + + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "供应商修改体积,商家发货的代销商品状态是否正确", dataProvider = "shopDeliveryProduct") + public void supplierChangeShopDeliveryProductVolume(Long productId, Long supplierProductId) throws InterruptedException { + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = new SpuDTO(); + BeanUtils.copyProperties(spuVO, spuDTO); + List skuVOList = spuVO.getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + spuDTO.setSkuList(skuDTOList); + skuDTOList.forEach(i->i.setVolume(1.1)); + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuDTO.setSpuLangList(spuLangDTOList); + SupplierProductApi.update(spuDTO, true); + + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 0); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "供应商修改sku信息,供应商发货的代销商品状态是否正确", dataProvider = "supplierDeliveryProduct") + public void supplierChangeSupplierDeliveryProductSku(Long productId, Long supplierProductId) throws InterruptedException { + //供应商增加sku,供应商发货的代销商品状态是否正确 + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = new SpuDTO(); + BeanUtils.copyProperties(spuVO, spuDTO); + spuDTO.setSkuList(getSkuList(6600L)); + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuDTO.setSpuLangList(spuLangDTOList); + SupplierProductApi.update(spuDTO, true); + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 0); + + //供应商禁用sku,供应商发货的代销商品状态是否正确 + updateProduct(productId); + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(productId, null, 1)); + disableSku(supplierProductId); + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + + //供应商启用sku,供应商发货的代销商品状态是否正确 + updateProduct(productId); + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(productId, null, 1)); + enableSku(supplierProductId); + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "供应商修改sku信息,商家发货的代销商品状态是否正确", dataProvider = "shopDeliveryProduct") + public void supplierChangeShopDeliveryProductSku(Long productId, Long supplierProductId) throws InterruptedException { + //供应商增加sku,商家发货的代销商品状态是否正确 + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = new SpuDTO(); + BeanUtils.copyProperties(spuVO, spuDTO); + spuDTO.setSkuList(getSkuList(6600L)); + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuDTO.setSpuLangList(spuLangDTOList); + SupplierProductApi.update(spuDTO, true); + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 0); + + //供应商禁用sku,商家发货的代销商品状态是否正确 + updateProduct(productId); + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(productId, null, 1)); + disableSku(supplierProductId); + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + + //供应商启用sku,商家发货的代销商品状态是否正确 + updateProduct(productId); + ProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(productId, null, 1)); + enableSku(supplierProductId); + TimeUnit.SECONDS.sleep(2L); + Assert.assertEquals(ProductApi.info(productId, true).getStatus(), 1); + + ProductApi.delete(productId, true); + SupplierProductApi.delete(supplierProductId, true); + } + + /** + * 商家更新代销商品 + */ + public static void updateProduct(Long productId) { + SpuVO spuVO = ProductApi.info(productId, true); + SpuDTO spuDTO = JSON.parseObject(JSON.toJSONString(spuVO), SpuDTO.class); + List skuDTOList = JSON.parseArray(JSON.toJSONString(spuVO.getSkus()), SkuDTO.class); + spuDTO.setSkuList(skuDTOList); + ProductApi.update(spuDTO, true); + } + + /** + * 供应商禁用sku + */ + public static void disableSku(Long supplierProductId) { + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = JSON.parseObject(JSON.toJSONString(spuVO), SpuDTO.class); + List skuDTOList = JSON.parseArray(JSON.toJSONString(spuVO.getSkus()), SkuDTO.class); + skuDTOList.get(0).setStatus(0); + spuDTO.setSkuList(skuDTOList); + SupplierProductApi.update(spuDTO, true); + } + + /** + * 供应商启用sku + */ + public static void enableSku(Long supplierProductId) { + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = JSON.parseObject(JSON.toJSONString(spuVO), SpuDTO.class); + List skuDTOList = JSON.parseArray(JSON.toJSONString(spuVO.getSkus()), SkuDTO.class); + skuDTOList.get(0).setStatus(1); + spuDTO.setSkuList(skuDTOList); + SupplierProductApi.update(spuDTO, true); + } + + public static List getSkuList(Long priceFee){ + List skuList = new ArrayList<>(); + SkuDTO skuDtoA = new SkuDTO(); + skuDtoA.setChangeStock(100); + skuDtoA.setPriceFee(priceFee); + skuDtoA.setMarketPriceFee(88L); + skuDtoA.setStock(100); + skuDtoA.setStatus(1); + skuDtoA.setWeight(0.0); + skuDtoA.setVolume(0.0); + + List skuLangDtoListA = new ArrayList<>(); + SkuLangDTO skuLangDtoA = new SkuLangDTO(); + skuLangDtoA.setAttrs("test"); + skuLangDtoA.setLang(1); + skuLangDtoA.setSkuName("test1"); + skuLangDtoListA.add(skuLangDtoA); + + SkuLangDTO skuLangDtoB = new SkuLangDTO(); + skuLangDtoB.setAttrs("test"); + skuLangDtoB.setLang(2); + skuLangDtoB.setSkuName("test1"); + skuLangDtoListA.add(skuLangDtoB); + skuDtoA.setSkuLangList(skuLangDtoListA); + + List spuSkuAttrValueDtoListA = new ArrayList<>(); + SpuSkuAttrValueDTO spuSkuAttrValueDtoA = new SpuSkuAttrValueDTO(); + spuSkuAttrValueDtoA.setAttrName("test"); + spuSkuAttrValueDtoA.setAttrValueName("test1"); + spuSkuAttrValueDtoListA.add(spuSkuAttrValueDtoA); + skuDtoA.setSpuSkuAttrValues(spuSkuAttrValueDtoListA); + + skuList.add(skuDtoA); + + SkuDTO skuDtoB = new SkuDTO(); + skuDtoB.setChangeStock(100); + skuDtoB.setPriceFee(priceFee); + skuDtoB.setMarketPriceFee(88L); + skuDtoB.setStock(100); + skuDtoB.setStatus(1); + skuDtoB.setWeight(0.0); + skuDtoB.setVolume(0.0); + + List skuLangDtoListB = new ArrayList<>(); + SkuLangDTO skuLangDtoC = new SkuLangDTO(); + skuLangDtoC.setAttrs("test"); + skuLangDtoC.setLang(1); + skuLangDtoC.setSkuName("test2"); + skuLangDtoListB.add(skuLangDtoC); + + SkuLangDTO skuLangDtoD = new SkuLangDTO(); + skuLangDtoD.setAttrs("test"); + skuLangDtoD.setLang(2); + skuLangDtoD.setSkuName("test2"); + skuLangDtoListB.add(skuLangDtoD); + skuDtoB.setSkuLangList(skuLangDtoListB); + + List spuSkuAttrValueDtoListB = new ArrayList<>(); + SpuSkuAttrValueDTO spuSkuAttrValueDtoB = new SpuSkuAttrValueDTO(); + spuSkuAttrValueDtoB.setAttrName("test"); + spuSkuAttrValueDtoB.setAttrValueName("test2"); + spuSkuAttrValueDtoListB.add(spuSkuAttrValueDtoB); + skuDtoB.setSpuSkuAttrValues(spuSkuAttrValueDtoListB); + + skuList.add(skuDtoB); + + return skuList; + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/SupplierProductTest.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/SupplierProductTest.java new file mode 100644 index 0000000..f822400 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/test/store/SupplierProductTest.java @@ -0,0 +1,149 @@ +package com.tmerclub.cloud.systemtest.test.store; + +import cn.hutool.core.bean.BeanUtil; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.SpuLangDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.moyuer.cloud.systemtest.api.amount.CategoryApi; +import com.moyuer.cloud.systemtest.api.platform.PlatformProductApi; +import com.moyuer.cloud.systemtest.api.supplier.SupplierProductApi; +import com.moyuer.cloud.systemtest.data.amount.OfflineHandleEventDtoData; +import com.moyuer.cloud.systemtest.data.amount.SpuData; +import com.moyuer.cloud.systemtest.data.store.DeliveryData; +import com.moyuer.cloud.systemtest.data.store.SpuPageSearchDtoData; +import org.springframework.beans.BeanUtils; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author lpj + */ +public class SupplierProductTest { + @DataProvider(name = "supplierProduct") + private Object[][] supplierProduct() { + Long transportId = DeliveryData.getSupplierFreeFeeDelivery(true); + Long categoryId = CategoryApi.listSupplierCategory(true).get(0).getCategoryId(); + Long supplierProductId = SupplierProductApi.createProduct(SpuData.getSupplierSpu(categoryId, transportId, 8800L), true); + return new Object[][]{{supplierProductId}}; + } + + @Test(description = "商品管理基本流程", dataProvider = "supplierProduct") + public void productFlow(Long supplierProductId) throws InterruptedException { + //下架 + SupplierProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(supplierProductId, null, 0)); + //上架 + SupplierProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(supplierProductId, null, 1)); + //批量下架 + SupplierProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(null, Collections.singletonList(supplierProductId), 0)); + //批量上架 + SupplierProductApi.changeProductStatus(SpuPageSearchDtoData.getSpuPageSearchDTO(null, Collections.singletonList(supplierProductId), 1)); + + //平台置顶商品 + PlatformProductApi.toTop(supplierProductId); + //平台取消置顶商品 + PlatformProductApi.toTop(supplierProductId); + + //平台违规下架商品 + OfflineHandleEventDTO offlineHandleEventDTO = OfflineHandleEventDtoData.getOfflineHandleEventDTO(null, supplierProductId, "违规下架原因", null, null, null); + offlineHandleEventDTO.setHandleIds(Collections.singletonList(supplierProductId)); + PlatformProductApi.offline(offlineHandleEventDTO); + //申请上架,审核失败 + //商家根据活动id获取下架信息 + OfflineHandleEventVO offlineHandleEventVO = SupplierProductApi.getOfflineHandleEvent(supplierProductId); + //商家申请上架 + SupplierProductApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = PlatformProductApi.platformGetOfflineHandleEvent(supplierProductId); + //平台审核失败 + TimeUnit.SECONDS.sleep(2L); + PlatformProductApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, "审核失败原因", 4)); + //申请上架,审核成功 + //商家根据活动id获取下架信息 + offlineHandleEventVO = SupplierProductApi.getOfflineHandleEvent(supplierProductId); + //商家申请上架 + SupplierProductApi.apply(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, "申请上架原因", null, null)); + //平台根据活动id获取下架信息 + offlineHandleEventVO = PlatformProductApi.platformGetOfflineHandleEvent(supplierProductId); + //平台审核成功 + TimeUnit.SECONDS.sleep(2L); + PlatformProductApi.audit(OfflineHandleEventDtoData.getOfflineHandleEventDTO(offlineHandleEventVO.getEventId(), offlineHandleEventVO.getHandleId(), null, null, null, 3)); + + //平台删除商品 + PlatformProductApi.platformDeleteProduct(supplierProductId); + } + + @Test(description = "修改商品信息", dataProvider = "supplierProduct") + public void updateProduct(Long supplierProductId) { + SpuVO spuVO = SupplierProductApi.info(supplierProductId, true); + SpuDTO spuDTO = new SpuDTO(); + + BeanUtils.copyProperties(spuVO, spuDTO); + + List skuVOList = spuVO.getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + spuDTO.setSkuList(skuDTOList); + + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuLangDTOList.forEach(i->i.setSpuName("修改后的商品名称")); + spuDTO.setSpuLangList(spuLangDTOList); + + SupplierProductApi.update(spuDTO, true); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "商品列表修改商品名称", dataProvider = "supplierProduct") + public void updateProductName(Long supplierProductId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(supplierProductId); + List spuLangVOList = SupplierProductApi.info(supplierProductId, true).getSpuLangList(); + List spuLangDTOList = spuLangVOList.stream().map(i -> BeanUtil.copyProperties(i, SpuLangDTO.class)).collect(Collectors.toList()); + spuLangDTOList.forEach(i->i.setSpuName("修改后的商品名称")); + spuDTO.setSpuLangList(spuLangDTOList); + SupplierProductApi.updateProductData(spuDTO); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "商品列表修改商品价格", dataProvider = "supplierProduct") + public void updateProductPrice(Long supplierProductId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(supplierProductId); + List skuVOList = SupplierProductApi.info(supplierProductId, true).getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + skuDTOList.forEach(i->i.setPriceFee(2000L)); + spuDTO.setSkuList(skuDTOList); + SupplierProductApi.updateProductData(spuDTO); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "商品列表修改商品库存", dataProvider = "supplierProduct") + public void updateProductStock(Long supplierProductId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(supplierProductId); + List skuVOList = SupplierProductApi.info(supplierProductId, true).getSkus(); + List skuDTOList = skuVOList.stream().map(i -> BeanUtil.copyProperties(i, SkuDTO.class)).collect(Collectors.toList()); + skuDTOList.forEach(i->i.setChangeStock(1)); + spuDTO.setSkuList(skuDTOList); + SupplierProductApi.updateProductData(spuDTO); + SupplierProductApi.delete(supplierProductId, true); + } + + @Test(description = "商品列表修改商品序号", dataProvider = "supplierProduct") + public void updateProductSeq(Long supplierProductId) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(supplierProductId); + spuDTO.setSeq(1); + SupplierProductApi.updateProductData(spuDTO); + SupplierProductApi.delete(supplierProductId, true); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/util/CheckUtil.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/util/CheckUtil.java new file mode 100644 index 0000000..72ac1a3 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/util/CheckUtil.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.systemtest.util; + +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; + +import java.util.List; + +/** + * @author lanhai + */ +public class CheckUtil { + + + + + public static void check(HttpResponse response) { + String body = getBody(response); + ServerResponseEntity serverResponseEntity = Json.parseObject(body, ServerResponseEntity.class); + if (!serverResponseEntity.isSuccess()) { + throw new RuntimeException(serverResponseEntity.getMsg()); + } + } + + public static T checkAndGetObject(HttpResponse response, Class clazz) { + String body = getBody(response); + TypeReference> typeReference = new TypeReference>(clazz) {}; + ServerResponseEntity serverResponseEntity = JSON.parseObject(body, typeReference); + if (!serverResponseEntity.isSuccess()) { + throw new RuntimeException(serverResponseEntity.getMsg()); + } + return serverResponseEntity.getData(); + } + + public static List checkAndGetArray(HttpResponse response, Class clazz) { + String body = getBody(response); + ServerResponseEntity serverResponseEntity = Json.parseObject(body, ServerResponseEntity.class); + if (!serverResponseEntity.isSuccess()) { + throw new RuntimeException(serverResponseEntity.getMsg()); + } + return Json.parseArray(Json.toJsonString(serverResponseEntity.getData()), clazz); + } + + public static String checkAndGetObjects(HttpResponse response) { + String body = getBody(response); + JSONObject jsonObject = JSON.parseObject(body); + JSONObject data = JSON.parseObject(jsonObject.get("data").toString()); + if(data.containsKey("records")){ + return data.get("records").toString(); + }else { + return data.get("list").toString(); + } + } + + private static String getBody(HttpResponse response){ + if (!response.isOk()) { + throw new RuntimeException("请求异常"); + } + System.out.println(response.body()); + return response.body(); + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/util/HttpUtil.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/util/HttpUtil.java new file mode 100644 index 0000000..2f5f575 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/util/HttpUtil.java @@ -0,0 +1,147 @@ +package com.tmerclub.cloud.systemtest.util; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; + +import java.util.List; +import java.util.Objects; + +/** + * @author lanhai + */ +public class HttpUtil { + + public static void get(String url, UrlEnum urlEnum) { + HttpResponse response = doGet(url, urlEnum); + CheckUtil.check(response); + } + + public static T get(String url, Class clazz, UrlEnum urlEnum) { + HttpResponse response = doGet(url, urlEnum); + return CheckUtil.checkAndGetObject(response,clazz); + } + + public static String gets(String url, UrlEnum urlEnum) { + HttpResponse response = doGet(url, urlEnum); + return CheckUtil.checkAndGetObjects(response); + } + + + public static void post(String url, Object obj, UrlEnum urlEnum) { + HttpResponse response = doPost(url, obj, urlEnum); + CheckUtil.check(response); + } + public static T post(String url, Object obj, UrlEnum urlEnum ,Class clazz) { + HttpResponse response = doPost(url, obj, urlEnum); + return CheckUtil.checkAndGetObject(response,clazz); + } + + + public static void put(String url, Object obj, UrlEnum urlEnum) { + HttpResponse response = doPut(url, obj, urlEnum); + CheckUtil.check(response); + } + + public static void put(String url, UrlEnum urlEnum) { + HttpResponse response = doPut(url,null, urlEnum); + CheckUtil.check(response); + } + public static ServerResponseEntity puts(String url, Object obj, UrlEnum urlEnum) { + HttpResponse response = doPut(url, obj, urlEnum); + String body = response.body(); + TypeReference> typeReference = new TypeReference>(ServerResponseEntity.class) {}; + ServerResponseEntity serverResponseEntity = JSON.parseObject(body, typeReference); + return serverResponseEntity; + } + + public static List putResultArray(String url, Object obj, Class clazz, UrlEnum urlEnum) { + HttpResponse response = doPut(url, obj, urlEnum); + return CheckUtil.checkAndGetArray(response,clazz); + } + + + public static void delete(String url, UrlEnum urlEnum) { + HttpResponse response = doDelete(url, urlEnum); + CheckUtil.check(response); + } + + public static void delete(String url, Object obj, UrlEnum urlEnum) { + HttpResponse response = doDelete(url, obj, urlEnum); + CheckUtil.check(response); + } + + public static T delete(String url, Class clazz, UrlEnum urlEnum) { + HttpResponse response = doDelete(url, urlEnum); + return CheckUtil.checkAndGetObject(response,clazz); + } + + public static List deleteResultArray(String url, Class clazz, UrlEnum urlEnum) { + HttpResponse response = doDelete(url, urlEnum); + return CheckUtil.checkAndGetArray(response,clazz); + } + + private static HttpResponse doGet(String url, UrlEnum urlEnum) { + HttpRequest postRequest = HttpRequest.get(url); + setHeader(postRequest, urlEnum); + return postRequest.execute(); + } + + private static HttpResponse doPost(String url, Object obj, UrlEnum urlEnum) { + HttpRequest postRequest = HttpRequest.post(url); + setHeader(postRequest, urlEnum); + // 如果是String类型,直接发送, 通过json转换成String发送会多出双引号 + if (obj instanceof String) { + return postRequest.body(obj.toString()).execute(); + } + return postRequest + .body(JSON.toJSONString(obj)) + .execute(); + } + + /** + * 需要权限校验的put请求 + * @param url + * @param obj + * @param urlEnum com.yami.shop.systemtest.util.UrlEnum + * @return + */ + private static HttpResponse doPut(String url, Object obj, UrlEnum urlEnum) { + HttpRequest postRequest = HttpRequest.put(url); + setHeader(postRequest, urlEnum); + // 如果是String类型,直接发送, 通过json转换成String发送会多出双引号 + if (obj instanceof String) { + return postRequest.body(obj.toString()).execute(); + } + return postRequest + .body(JSON.toJSONString(obj)) + .execute(); + } + + private static HttpResponse doDelete(String url, UrlEnum urlEnum) { + HttpRequest postRequest = HttpRequest.delete(url); + setHeader(postRequest, urlEnum); + return postRequest.execute(); + } + + private static HttpResponse doDelete(String url, Object obj, UrlEnum urlEnum) { + HttpRequest postRequest = HttpRequest.delete(url); + setHeader(postRequest, urlEnum); + return postRequest + .body(Json.toJsonString(obj)) + .contentType("application/json") + .execute(); + } + + private static void setHeader(HttpRequest httpRequest, UrlEnum urlEnum) { + httpRequest.header("content-type", "application/json"); + httpRequest.header("Accept", "*/*"); + // 自定义token + if (Objects.nonNull(urlEnum)) { + httpRequest.header("authorization", urlEnum.token()); + } + } +} diff --git a/system-test/src/main/java/com/mall4j/cloud/systemtest/util/UrlEnum.java b/system-test/src/main/java/com/mall4j/cloud/systemtest/util/UrlEnum.java new file mode 100644 index 0000000..3e08e89 --- /dev/null +++ b/system-test/src/main/java/com/mall4j/cloud/systemtest/util/UrlEnum.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.systemtest.util; + +import com.moyuer.cloud.systemtest.constants.Constant; + +/** + * url枚举 + * @author yxf + */ +public enum UrlEnum { + + /** + * 用户端 + */ + API(1, Constant.API_TOKEN), + API_OTHER(2, Constant.OTHER_API_TOKEN), + /** + * 门店端 + */ + STATION(3, Constant.STATION_TOKEN), + + /** + * 商家端 + */ + SHOP(4, Constant.SHOP_TOKEN), + SHOP_OTHER(5, Constant.OTHER_SHOP_TOKEN), + + /** + * 平台端 + */ + PLATFORM(6, Constant.PLATFORM_TOKEN), + /** + * 供应商 + * */ + SUPPLIER(7, Constant.SUPPLIER_TOKEN), + SUPPLIER_OTHER(8, Constant.OTHER_SUPPLIER_TOKEN) + ; + private final Integer value; + + private final String token; + + public Integer value() { + return value; + } + + public String token() { + return token; + } + + UrlEnum(Integer value, String token) { + this.value = value; + this.token = token; + } + + public static UrlEnum instance(Integer value) { + UrlEnum[] enums = values(); + for (UrlEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + +} diff --git a/system-test/src/main/resources/OrderTest.xml b/system-test/src/main/resources/OrderTest.xml new file mode 100644 index 0000000..34b352a --- /dev/null +++ b/system-test/src/main/resources/OrderTest.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system-test/src/main/resources/SmokeTesting.xml b/system-test/src/main/resources/SmokeTesting.xml new file mode 100644 index 0000000..3e54c9d --- /dev/null +++ b/system-test/src/main/resources/SmokeTesting.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/AdminApplication.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/AdminApplication.java new file mode 100644 index 0000000..cfbabc0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/AdminApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author lhd + * @date 2020/12/22 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class AdminApplication { + + public static void main(String[] args) { + SpringApplication.run(AdminApplication.class, args); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java new file mode 100644 index 0000000..6c34318 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java new file mode 100644 index 0000000..8812410 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.constant; + +import com.tmerclub.cloud.common.leaf.constant.GlobalDistributedIdKey; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + + /** + * 平台用户id + */ + String MALL4CLOUD_PLATFORM_USER = "mall4cloud-platform-user"; + + /** + * 商家用户id + */ + String MALL4CLOUD_MULTISHOP_USER = "mall4cloud-multishop-user"; + + /** + * 供应商用户id + */ + String MALL4CLOUD_SUPPLIER_USER = "mall4cloud-supplier-user"; + + /** + * 钱包日志id + */ + String MALL4CLOUD_SHOP_WALLET_LOG = GlobalDistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG.value(); + + /** + * 系统权限 + */ + String MALL4CLOUD_AUTHORIZATION = "mall4cloud-authorization"; + + /** + * 采购金额日志 + */ + String PURCHASE_AMOUNT_LOG = "mall4cloud-purchase-amount-log"; +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/AuditStatus.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/AuditStatus.java new file mode 100644 index 0000000..533b803 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/AuditStatus.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 审核状态 + * + * @author YXF + */ +public enum AuditStatus { + + /** + * 未审核 + */ + WAITAUDIT(0), + /** + * 已通过 + */ + SUCCESSAUDIT(1), + + /** + * 未通过 + */ + FAILAUDIT(-1), + + /** + * 平台下线 + */ + OFFLINE(2); + + private final Integer num; + + public Integer value() { + return num; + } + + AuditStatus(Integer num) { + this.num = num; + } + + public static AuditStatus instance(Integer value) { + AuditStatus[] enums = values(); + for (AuditStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/IsPreferred.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/IsPreferred.java new file mode 100644 index 0000000..8d371ff --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/IsPreferred.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * @Author lth + * @Date 2021/5/20 20:34 + */ +public enum IsPreferred { + /** + * 是优选好店 + */ + YES(1), + /** + * 不是优选好店 + */ + NO(0); + + private final Integer num; + + public Integer value() { + return num; + } + + IsPreferred(Integer num) { + this.num = num; + } + + public static IsPreferred instance(Integer value) { + IsPreferred[] enums = values(); + for (IsPreferred statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/NoticeType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/NoticeType.java new file mode 100644 index 0000000..ebd11a7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/NoticeType.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 店铺钱包金额类型 + * 金额类型 0 未结算金额 1可提现金额 2冻结金额 + * + * @author FrozenWatermelon + */ +public enum NoticeType { + + /** + * 平台公告 + */ + TO_MULTISHOP(1, "商家端展示"), + + /** + * 商城公告 + */ + TO_USER(2, "用户端展示"), + + /** + * 在供应商端展示 + */ + TO_SUPPLIER(3, "供应商端展示"); + + private final Integer num; + + private final String shopWalletAmountType; + + public Integer value() { + return num; + } + + public String getShopWalletAmountType() { + return shopWalletAmountType; + } + + NoticeType(Integer num, String shopWalletAmountType) { + this.num = num; + this.shopWalletAmountType = shopWalletAmountType; + } + + public static NoticeType instance(Integer value) { + NoticeType[] enums = values(); + for (NoticeType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/RenovationType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/RenovationType.java new file mode 100644 index 0000000..1fe9617 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/RenovationType.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 装修页面类型 + * @author lhd + */ +public enum RenovationType { + + /** + * pc端 + */ + PC(1), + /** + * 移动端 + */ + H5(2), + + ; + private final Integer num; + + + public Integer value() { + return num; + } + + + RenovationType(Integer num) { + this.num = num; + } + + public static RenovationType instance(Integer value) { + RenovationType[] enums = values(); + for (RenovationType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletChangeReason.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletChangeReason.java new file mode 100644 index 0000000..5285562 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWalletChangeReason.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + + +/** + * 店铺钱包金额发生改变的原因 + * 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝 + * + * @author FrozenWatermelon + */ +public enum ShopWalletChangeReason { + + /** + * 用户支付 + */ + PAY(0, "用户支付"), + + /** + * 订单结算 + */ + SETTLED(1, "订单结算"), + + /** + * 用户退款申请成功 + */ + ORDER_REFUND(2, "用户退款申请成功"), + + /** + * 提现申请 + */ + APPLY_CASH(4, "提现申请"), + + /** + * 提现申请被拒绝 + */ + REFUSE_CASH(5, "提现申请被拒绝"), + + /** + * 通过提现申请 + */ + PASS_CASH(6, "提现申请通过"), + + /** + * 系统发放成功 + */ + SUCCESS_CASH(7, "系统发放成功"), + /** + * 提现发放失败 + */ + FAIL_CASH(8, "系统发放失败"), + + /** + * 系统扣除订单中需要颁发给用户的分销金额 + */ + DISTRIBUTION_AMOUNT(9, "扣除订单分销金额"), + + /** + * 余额充值订单 + */ + APPLY_RECHARGE(10, "提交充值订单"), + + /** + * 余额充值成功 + */ + SUCCESS_RECHARGE(11, "充值成功"), + + /** + * 订单采购价差 + */ + PURCHASE_SPREAD_AMOUNT(12, "扣除订单采购价差"), + + /** + * 商家自行处理采购价差(退款采购价差) + */ + REFUND_SPREAD_AMOUNT(13, "商家自行处理采购价差"), + + /** + * 预售失败结算(超时未支付尾款) + */ + PRE_SALE_FAIL(14, "预售失败结算(超时未支付尾款)"); + + private final Integer num; + + private final String shopWalletChangeReason; + + public Integer value() { + return num; + } + + public String getShopWalletChangeReason() { + return shopWalletChangeReason; + } + + ShopWalletChangeReason(Integer num, String shopWalletChangeReason) { + this.num = num; + this.shopWalletChangeReason = shopWalletChangeReason; + } + + public static ShopWalletChangeReason instance(Integer value) { + ShopWalletChangeReason[] enums = values(); + for (ShopWalletChangeReason statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getReason(Integer value) { + ShopWalletChangeReason[] enums = values(); + for (ShopWalletChangeReason statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.shopWalletChangeReason; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWithdrawCashStatus.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWithdrawCashStatus.java new file mode 100644 index 0000000..d20e1d0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/ShopWithdrawCashStatus.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 商家提现申请信息状态 + * + * @author lth + */ + +public enum ShopWithdrawCashStatus { + + /** + * 未通过 + */ + FAILAUDIT(-1), + + /** + * 未审核 + */ + WAITAUDIT(0), + /** + * 已通过 + */ + SUCCESSAUDIT(1), + + /** + * 发放成功 + */ + SUCCESS(2), + + /** + * 发放失败 + */ + FAIL(3); + + private final Integer num; + + public Integer value() { + return num; + } + + ShopWithdrawCashStatus(Integer num) { + this.num = num; + } + + public static ShopWithdrawCashStatus instance(Integer value) { + ShopWithdrawCashStatus[] enums = values(); + for (ShopWithdrawCashStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/TemplateType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/TemplateType.java new file mode 100644 index 0000000..92eca9b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/TemplateType.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.constant; + +/** + * 装修模板类型 + * @author lhd + */ +public enum TemplateType { + + /** + * pc端 + */ + PC(1), + /** + * 移动端 + */ + H5(2), + + ; + private final Integer num; + + + public Integer value() { + return num; + } + + + TemplateType(Integer num) { + this.num = num; + } + + public static TemplateType instance(Integer value) { + TemplateType[] enums = values(); + for (TemplateType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/WithdrawCashType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/WithdrawCashType.java new file mode 100644 index 0000000..9e13cca --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/constant/WithdrawCashType.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.multishop.constant; +/** + * @author lanhai + */ +public enum WithdrawCashType { + /** + * 周 + */ + WEEKEND(1, "每周"), + + /** + * 月 + */ + MONTH(2, "每月"), + + /** + * 年 + */ + YEAR(3, "每年"); + + private final Integer value; + + private final String date; + + public Integer value() { + return value; + } + + public String date() { + return date; + } + + WithdrawCashType(Integer value, String date) { + this.value = value; + this.date = date; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/CompanyAuditingController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/CompanyAuditingController.java new file mode 100644 index 0000000..476680d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/CompanyAuditingController.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.service.CompanyAuditingService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.Objects; + +/** + * @author chiley + * @date 2022/9/13 14:06 + */ +@RestController("adminCompanyAuditingController") +@RequestMapping("/mp/shop_company_auditing") +@Tag(name = "admin-工商信息审核情况") +public class CompanyAuditingController { + + @Autowired + private CompanyAuditingService companyAuditingService; + + + @GetMapping("/auditInfo") + @Operation(summary = "查看申请审核情况", description = "查看申请审核情况") + public ServerResponseEntity auditInfo(@RequestParam(value = "shopId", required = false) Long shopId) { + Long tenantId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(tenantId, Constant.PLATFORM_SHOP_ID)) { + shopId = tenantId; + } + ShopCompanyAuditingVO auditInfo = companyAuditingService.getAuditInfo(shopId); + if (Objects.nonNull(auditInfo) && Objects.nonNull(auditInfo.getShopCompanyVO()) && StrUtil.isNotBlank(auditInfo.getShopCompanyVO().getLegalPhone())) { + auditInfo.getShopCompanyVO().setLegalPhone(PhoneUtil.hideBetween(auditInfo.getShopCompanyVO().getLegalPhone()).toString()); + } + return ServerResponseEntity.success(auditInfo); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/HotSearchController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/HotSearchController.java new file mode 100644 index 0000000..9e99f42 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/HotSearchController.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.HotSearchType; +import com.tmerclub.cloud.multishop.dto.HotSearchDTO; +import com.tmerclub.cloud.multishop.model.HotSearch; +import com.tmerclub.cloud.multishop.service.HotSearchService; +import com.tmerclub.cloud.multishop.vo.HotSearchVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 热搜 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +@RestController("adminHotSearchController") +@RequestMapping("/mp/hot_search") +@Tag(name = "admin-热搜") +public class HotSearchController { + private static final Logger log = LoggerFactory.getLogger(HotSearchController.class); + + + @Autowired + private HotSearchService hotSearchService; + + + @GetMapping("/page") + @Operation(summary = "分页获取热搜列表", description = "分页获取热搜列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, HotSearchDTO hotSearchDTO) { + hotSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO hotSearchPage = hotSearchService.page(pageDTO, hotSearchDTO); + return ServerResponseEntity.success(hotSearchPage); + } + + @GetMapping + @Operation(summary = "获取热搜", description = "根据hotSearchId获取热搜") + public ServerResponseEntity getByHotSearchId(@RequestParam Long hotSearchId) { + return ServerResponseEntity.success(hotSearchService.getByHotSearchId(hotSearchId)); + } + + @PostMapping + @Operation(summary = "保存热搜", description = "保存热搜") + public ServerResponseEntity save(@Valid @RequestBody HotSearchDTO hotSearchDTO) { + HotSearch hotSearch = BeanUtil.map(hotSearchDTO, HotSearch.class); + hotSearch.setShopId(AuthUserContext.get().getTenantId()); + if (Objects.isNull(hotSearch.getType())) { + hotSearch.setType(HotSearchType.PROD.value()); + } + // 热搜标题不能重复 + if (hotSearchService.checkExist(hotSearch.getShopId(), hotSearch.getTitle(), hotSearch.getType())) { + log.error("热搜标题不能重复"); + throw new LuckException("热搜标题不能重复"); + } + hotSearchService.save(hotSearch); + hotSearchService.removeHotSearchListCache(hotSearch.getShopId(), hotSearch.getType()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新热搜", description = "更新热搜") + public ServerResponseEntity update(@Valid @RequestBody HotSearchDTO hotSearchDTO) { + HotSearch hotSearch = BeanUtil.map(hotSearchDTO, HotSearch.class); + HotSearchVO dbHotSearch = hotSearchService.getByHotSearchId(hotSearchDTO.getHotSearchId()); + if (Objects.isNull(dbHotSearch)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + hotSearch.setShopId(AuthUserContext.get().getTenantId()); + if (!Objects.equals(dbHotSearch.getShopId(), hotSearch.getShopId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + hotSearchService.update(hotSearch); + hotSearchService.removeHotSearchListCache(hotSearch.getShopId(), dbHotSearch.getType()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除热搜", description = "根据热搜id删除热搜") + public ServerResponseEntity delete(@RequestParam Long hotSearchId) { + HotSearchVO dbHotSearch = hotSearchService.getByHotSearchId(hotSearchId); + if (Objects.isNull(dbHotSearch)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + if (!Objects.equals(dbHotSearch.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + Long shopId = AuthUserContext.get().getTenantId(); + hotSearchService.deleteById(hotSearchId, shopId); + hotSearchService.removeHotSearchListCache(shopId, dbHotSearch.getType()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRechargeController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRechargeController.java new file mode 100644 index 0000000..9ad8cb3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRechargeController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 chiley + * @Date 2022/6/30 17:23 + */ +@RestController("adminShopRechargeController") +@RequestMapping("/mp/shop_recharge") +@Tag(name = "admin-商家充值记录信息") +public class ShopRechargeController { + + @Autowired + private ShopWalletLogService shopWalletLogService; + + @GetMapping("/page") + @Operation(summary = "分页获取商家充值记录信息", description = "分页获取商家充值记录信息") + public ServerResponseEntity> page(PageDTO pageDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + + PageVO pageVO = shopWalletLogService.getRechargePageByShopId(pageDTO, shopId); + return ServerResponseEntity.success(pageVO); + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRefundAddrController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRefundAddrController.java new file mode 100644 index 0000000..c7ee0a8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRefundAddrController.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.dto.ShopRefundAddrDTO; +import com.tmerclub.cloud.multishop.model.ShopRefundAddr; +import com.tmerclub.cloud.multishop.service.ShopRefundAddrService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 退货地址 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +@RestController("adminShopRefundAddrController") +@RequestMapping("/mp/shop_refund_addr") +@Tag(name = "admin-退货地址") +public class ShopRefundAddrController { + + @Autowired + private ShopRefundAddrService shopRefundAddrService; + + + @GetMapping("/page") + @Operation(summary = "分页获取退货地址列表", description = "分页获取退货地址列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ShopRefundAddrDTO shopRefundAddrDTO) { + shopRefundAddrDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO refundAddrPage = shopRefundAddrService.page(pageDTO, shopRefundAddrDTO); + for (ShopRefundAddrVO shopRefundAddrVO : refundAddrPage.getList()) { + if (StrUtil.isNotBlank(shopRefundAddrVO.getMobile())) { + shopRefundAddrVO.setMobile(PhoneUtil.hideBetween(shopRefundAddrVO.getMobile()).toString()); + } + } + return ServerResponseEntity.success(refundAddrPage); + } + + @GetMapping + @Operation(summary = "获取退货地址", description = "根据shopRefundAddrId获取退货地址") + public ServerResponseEntity getByShopRefundAddrId(@RequestParam Long shopRefundAddrId) { + Long shopId = AuthUserContext.get().getTenantId(); + ShopRefundAddrVO byShopRefund = shopRefundAddrService.getByShopRefundAddrId(shopRefundAddrId, shopId); + if (StrUtil.isNotBlank(byShopRefund.getMobile())) { + byShopRefund.setMobile(PhoneUtil.hideBetween(byShopRefund.getMobile()).toString()); + } + return ServerResponseEntity.success(byShopRefund); + } + + @PostMapping + @Operation(summary = "保存退货地址", description = "保存退货地址") + public ServerResponseEntity save(@Valid @RequestBody ShopRefundAddrDTO shopRefundAddrDTO) { + ShopRefundAddr shopRefundAddr = BeanUtil.map(shopRefundAddrDTO, ShopRefundAddr.class); + Long shopId = AuthUserContext.get().getTenantId(); + shopRefundAddr.setShopId(shopId); + shopRefundAddrService.save(shopRefundAddr); + shopRefundAddrService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(shopRefundAddr.getShopRefundAddrId()); + } + + @PutMapping + @Operation(summary = "更新退货地址", description = "更新退货地址") + public ServerResponseEntity update(@Valid @RequestBody ShopRefundAddrDTO shopRefundAddrDTO) { + ShopRefundAddr shopRefundAddr = BeanUtil.map(shopRefundAddrDTO, ShopRefundAddr.class); + Long shopId = AuthUserContext.get().getTenantId(); + shopRefundAddr.setShopId(AuthUserContext.get().getTenantId()); + shopRefundAddrService.update(shopRefundAddr); + shopRefundAddrService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除退货地址", description = "根据退货地址id删除退货地址") + public ServerResponseEntity delete(@RequestParam Long shopRefundAddrId) { + Long shopId = AuthUserContext.get().getTenantId(); + shopRefundAddrService.deleteById(shopRefundAddrId, shopId); + shopRefundAddrService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + @GetMapping("/list") + @Operation(summary = "获取退货地址列表", description = "获取退货地址列表") + public ServerResponseEntity> list() { + return ServerResponseEntity.success(shopRefundAddrService.listByShopId(AuthUserContext.get().getTenantId())); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRenovationController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRenovationController.java new file mode 100644 index 0000000..bd8b9e4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopRenovationController.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.RenovationType; +import com.tmerclub.cloud.multishop.dto.ShopRenovationDTO; +import com.tmerclub.cloud.multishop.model.ShopRenovation; +import com.tmerclub.cloud.multishop.service.ShopRenovationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 店铺装修信息 + * @author Orange + */ +@RestController("adminShopRenovationController") +@RequestMapping("/mp/shop_renovation") +@Tag(name = "店铺装修信息") +public class ShopRenovationController { + + @Autowired + private ShopRenovationService shopRenovationService; + + + @GetMapping("/page") + @Operation(summary = "根据类型分页获取店铺装修信息列表", description = "分页获取店铺装修信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ShopRenovationDTO shopRenovation) { + shopRenovation.setShopId(AuthUserContext.get().getTenantId()); + PageVO shopRenovationPage = shopRenovationService.page(pageDTO, BeanUtil.map(shopRenovation, ShopRenovation.class)); + return ServerResponseEntity.success(shopRenovationPage); + } + + @GetMapping("/page_h5") + @Operation(summary = "根据类型分页获取店铺装修信息列表", description = "分页获取店铺装修信息列表") + public ServerResponseEntity> pageH5(@Valid PageDTO pageDTO, ShopRenovationDTO shopRenovation) { + shopRenovation.setShopId(AuthUserContext.get().getTenantId()); + PageVO shopRenovationPage = shopRenovationService.page(pageDTO, BeanUtil.map(shopRenovation, ShopRenovation.class)); + return ServerResponseEntity.success(shopRenovationPage); + } + + @GetMapping + @Operation(summary = "获取店铺装修信息", description = "根据renovationId获取店铺装修信息") + public ServerResponseEntity getByRenovationId(@RequestParam Long renovationId) { + ShopRenovation shopRenovation = shopRenovationService.getByRenovationId(renovationId); + if (!Objects.equals(shopRenovation.getShopId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(shopRenovation); + } + + @GetMapping("/get_h5") + @Operation(summary = "获取店铺装修信息", description = "根据renovationId获取店铺装修信息") + public ServerResponseEntity getH5ByRenovationId(@RequestParam Long renovationId) { + ShopRenovation shopRenovation = shopRenovationService.getByRenovationId(renovationId); + if (!Objects.equals(shopRenovation.getShopId(), AuthUserContext.get().getTenantId())) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(shopRenovation); + } + + @PostMapping("/save_pc") + @Operation(summary = "保存店铺pc端装修信息", description = "保存店铺装修信息") + public ServerResponseEntity save(@Valid @RequestBody ShopRenovationDTO shopRenovationDTO) { + ShopRenovation shopRenovation = BeanUtil.map(shopRenovationDTO, ShopRenovation.class); + shopRenovation.setShopId(AuthUserContext.get().getTenantId()); + shopRenovation.setRenovationId(null); + shopRenovation.setRenovationType(RenovationType.PC.value()); + shopRenovationService.save(shopRenovation); + return ServerResponseEntity.success(shopRenovation.getRenovationId()); + } + + @PostMapping("/save_h5") + @Operation(summary = "保存店铺移动端装修信息", description = "保存店铺装修信息") + public ServerResponseEntity saveH5(@Valid @RequestBody ShopRenovationDTO shopRenovationDTO) { + ShopRenovation shopRenovation = BeanUtil.map(shopRenovationDTO, ShopRenovation.class); + shopRenovation.setShopId(AuthUserContext.get().getTenantId()); + shopRenovation.setRenovationId(null); + shopRenovation.setRenovationType(RenovationType.H5.value()); + shopRenovationService.save(shopRenovation); + return ServerResponseEntity.success(shopRenovation.getRenovationId()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopTemplateUpDelController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopTemplateUpDelController.java new file mode 100644 index 0000000..84d4267 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopTemplateUpDelController.java @@ -0,0 +1,100 @@ +package com.tmerclub.cloud.multishop.controller.admin; + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.dto.ShopTemplateDTO; +import com.tmerclub.cloud.multishop.model.ShopTemplate; +import com.tmerclub.cloud.multishop.service.ShopTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author 菠萝凤梨 + */ +@RestController("adminShopTemplateUpDelController") +@RequestMapping("/mp/shop_template") +@Tag(name = "店铺装修模板-修改、删除、设为主页") +public class ShopTemplateUpDelController { + + @Autowired + private ShopTemplateService shopTemplateService; + + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @PutMapping("/update_pc") + @Operation(summary = "更新商品PC装修模板表", description = "更新商品PC装修模板表") + public ServerResponseEntity update(@Valid @RequestBody ShopTemplateDTO shopTemplateDTO) { + if (BooleanUtil.isFalse(permission)) { + throw new LuckException("没有权限进行操作"); + } + updateTemplate(shopTemplateDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_h5") + @Operation(summary = "更新商品H5装修模板表", description = "更新商品H5装修模板表") + public ServerResponseEntity updateH5(@Valid @RequestBody ShopTemplateDTO shopTemplateDTO) { + if (BooleanUtil.isFalse(permission)) { + throw new LuckException("没有权限进行操作"); + } + updateTemplate(shopTemplateDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping("delete_pc") + @Operation(summary = "删除商品PC装修模板表", description = "根据商品装修模板表id删除商品PC装修模板表") + public ServerResponseEntity delete(@RequestParam Long templateId) { + if (BooleanUtil.isFalse(permission)) { + throw new LuckException("没有权限进行操作"); + } + deleteTemplate(templateId); + return ServerResponseEntity.success(); + } + + @DeleteMapping("delete_h5") + @Operation(summary = "删除商品H5装修模板表", description = "根据商品装修模板表id删除商品H5装修模板表") + public ServerResponseEntity deleteH5(@RequestParam Long templateId) { + if (BooleanUtil.isFalse(permission)) { + throw new LuckException("没有权限进行操作"); + } + deleteTemplate(templateId); + return ServerResponseEntity.success(); + } + + private void deleteTemplate(Long templateId) { + ShopTemplate shopTemplateDb = shopTemplateService.getByTemplateId(templateId); + if (Objects.isNull(shopTemplateDb)) { + throw new LuckException("模板不存在,请刷新页面重试"); + } + if (!Objects.equals(shopTemplateDb.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + shopTemplateService.deleteById(templateId); + shopTemplateService.removeCache(templateId); + } + + private void updateTemplate(ShopTemplateDTO shopTemplateDTO) { + ShopTemplate shopTemplate = BeanUtil.map(shopTemplateDTO, ShopTemplate.class); + ShopTemplate shopTemplateDb = shopTemplateService.getByTemplateId(shopTemplate.getTemplateId()); + if (Objects.isNull(shopTemplateDb)) { + throw new LuckException("模板不存在,请刷新页面重试"); + } + if (!Objects.equals(shopTemplateDb.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + shopTemplateService.update(shopTemplate); + shopTemplateService.removeCache(shopTemplate.getTemplateId()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopWalletController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopWalletController.java new file mode 100644 index 0000000..d4198de --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/admin/ShopWalletController.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.admin; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import com.tmerclub.cloud.multishop.vo.ShopWalletLogExcelVO; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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 Pineapple + * @date 2021/6/8 19:46 + */ +@RestController("adminShopWalletController") +@RequestMapping("/mp/shop_wallet") +@Tag(name = "admin-店铺钱包") +public class ShopWalletController { + + @Autowired + private ShopWalletLogService shopWalletLogService; + + @Autowired + private ShopWalletService shopWalletService; + + @GetMapping("/page") + @Operation(summary = "分页查询钱包记录信息", description = "分页查询") + public ServerResponseEntity> getShopWalletLogPage(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + shopWalletLogSearchDTO.setShopId(shopId); + } + PageVO page = shopWalletLogService.pageByParam(pageDTO, shopWalletLogSearchDTO); + return ServerResponseEntity.success(page); + } + + @GetMapping("/get_all_shop_wallet") + @Operation(summary = "查看所有店铺钱包总信息") + public ServerResponseEntity getAllShopWalletVoByShopId(ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + ShopWalletVO shopWallet = shopWalletService.getAllShop(shopWalletLogSearchDTO); + return ServerResponseEntity.success(shopWallet); + } + + @GetMapping("/page_shop_wallet_by_time") + @Operation(summary = "分页查看店铺钱包总信息") + public ServerResponseEntity> pageShopWalletByTime(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + PageVO pageShopWalletByTime = shopWalletService.pageShopWalletByTime(pageDTO, shopWalletLogSearchDTO); + return ServerResponseEntity.success(pageShopWalletByTime); + } + + @GetMapping("/page_all_shop") + @Operation(summary = "查看所有店铺的日志") + public ServerResponseEntity> getAllShopWalletLogPage(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + PageVO page = shopWalletLogService.pageAllShop(pageDTO, shopWalletLogSearchDTO); + return ServerResponseEntity.success(page); + } + + @GetMapping("/get_shop_wallet_log_form") + @Operation(summary = "导出店铺结算报表", description = "导出店铺结算报表") + public ServerResponseEntity getShopWalletLogForm(HttpServletResponse response, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + List list = shopWalletLogService.listShopWalletLogExcel(shopWalletLogSearchDTO); + ExcelUtil.soleExcel(response, list, ShopWalletLogExcelVO.EXCEL_NAME, ShopWalletLogExcelVO.MERGE_ROW_INDEX, ShopWalletLogExcelVO.MERGE_COLUMN_INDEX, ShopWalletLogExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_shop_wallet") + @Operation(summary = "查看店铺钱包信息", description = "根据店铺id查看店铺钱包信息") + public ServerResponseEntity getShopWalletVoByShopId() { + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + return ServerResponseEntity.success(shopWalletLogService.getPlatformWallet()); + } + ShopWalletVO shopWallet = shopWalletService.getByShopId(shopId); + return ServerResponseEntity.success(shopWallet); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/HotSearchController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/HotSearchController.java new file mode 100644 index 0000000..ab59c54 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/HotSearchController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.app; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.service.HotSearchService; +import com.tmerclub.cloud.multishop.vo.HotSearchVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.List; + +/** + * 热搜 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +@RestController("appHotSearchController") +@RequestMapping("/ua/app/hot_search") +@Tag(name = "app-热搜") +public class HotSearchController { + + @Autowired + private HotSearchService hotSearchService; + + @GetMapping("/list") + @Operation(summary = "获取热搜列表", description = "获取热搜列表") + @Parameters({ + @Parameter(name = "shopId", description = "店铺id"), + @Parameter(name = "type", description = "1:商品热搜 2:店铺热搜") + }) + public ServerResponseEntity> listByShopId(@RequestParam("shopId") Long shopId, @RequestParam("type") Integer type) { + List hotSearches = hotSearchService.listByShopId(shopId, type); + return ServerResponseEntity.success(hotSearches); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopCollectionController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopCollectionController.java new file mode 100644 index 0000000..576100d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopCollectionController.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.app; + +import com.alibaba.nacos.client.naming.utils.CollectionUtils; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.service.ShopCollectionService; +import com.tmerclub.cloud.multishop.vo.ShopCollectionVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户店铺收藏记录 + * + * @author lhd + * @date 2021-02-23 14:41:42 + */ +@RestController("appUserCollectionShopController") +@RequestMapping("/user_collection_shop") +@Tag(name = "app-用户店铺收藏记录") +public class ShopCollectionController { + + @Autowired + private ShopCollectionService shopCollectionService; + + @GetMapping("/page") + @Operation(summary = "分页返回收藏数据", description = "根据用户id获取") + public ServerResponseEntity> getUserCollectionDtoPageByUserId(@Valid PageDTO pageDTO, String shopName) { + Long userId = AuthUserContext.get().getUserId(); + PageVO shopCollectionPage = shopCollectionService.getUserCollectionShopPageByUserIdAndShopName(pageDTO, userId, shopName); + return ServerResponseEntity.success(shopCollectionPage); + } + + @GetMapping("/ma/is_collection") + @Operation(summary = "根据店铺id获取该店铺是否在收藏夹中", description = "传入收藏店铺id") + public ServerResponseEntity isCollection(Long shopId) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + // 没有登陆就返回false (未收藏店铺) + if (uidInfoBO == null) { + return ServerResponseEntity.success(Boolean.FALSE); + } + return ServerResponseEntity.success(shopCollectionService.countByShopIdAndUserId(shopId, uidInfoBO.getUserId()) > 0); + } + + @PostMapping("/add_or_cancel") + @Operation(summary = "添加/取消收藏", description = "传入收藏店铺id,如果店铺未收藏则收藏店铺,已收藏则取消收藏") + @Parameter(name = "shopId", description = "店铺id", required = true) + public ServerResponseEntity addOrCancel(@RequestBody Long shopId) { + Long userId = AuthUserContext.get().getUserId(); + Boolean isAdd = shopCollectionService.addOrCancel(shopId, userId); + return ServerResponseEntity.success(isAdd); + } + + @PostMapping("/batch_cancel") + @Operation(summary = "批量取消收藏", description = "传入收藏店铺id") + @Parameter(name = "shopIds", description = "店铺Id", required = true) + public ServerResponseEntity batchCancel(@RequestBody List shopIds) { + Long userId = AuthUserContext.get().getUserId(); + if (CollectionUtils.isEmpty(shopIds)) { + return ServerResponseEntity.success(false); + } + return ServerResponseEntity.success(shopCollectionService.batchCancel(shopIds, userId)); + } + + /** + * 查询用户收藏店铺数量 + */ + @GetMapping("count") + @Operation(summary = "查询用户收藏店铺数量", description = "查询用户收藏店铺数量") + public int findUserCollectionCount() { + Long userId = AuthUserContext.get().getUserId(); + return shopCollectionService.countByShopIdAndUserId(null, userId); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopDetailController.java new file mode 100644 index 0000000..e517ef2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopDetailController.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.app; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.constant.RenovationType; +import com.tmerclub.cloud.multishop.dto.ShopDetailDTO; +import com.tmerclub.cloud.multishop.dto.ShopSearchDTO; +import com.tmerclub.cloud.multishop.model.ShopRenovation; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.service.ShopRenovationService; +import com.tmerclub.cloud.multishop.vo.ShopDetailAppVO; +import com.tmerclub.cloud.multishop.vo.ShopHeadInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +@RestController("appShopDetailController") +@RequestMapping("/ua/shop_detail") +@Tag(name = "app-店铺详情") +public class ShopDetailController { + + @Autowired + private ShopDetailService shopDetailService; + + @Autowired + private ShopRenovationService shopRenovationService; + + @GetMapping("/page") + @Operation(summary = "搜索店铺列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ShopDetailDTO shopDetailDTO) { + return ServerResponseEntity.success(shopDetailService.shopSearchPage(pageDTO, shopDetailDTO)); + } + + @GetMapping("/head_info") + @Operation(summary = "店铺头部信息", description = "获取的店铺头部信息") + public ServerResponseEntity getShopHeadInfo(Long shopId) { + ShopHeadInfoVO shopHeadInfoDto = new ShopHeadInfoVO(); + ShopDetailVO shopDetail = shopDetailService.getShoExtensionsByShopId(shopId); + if (Objects.isNull(shopDetail)) { + return ServerResponseEntity.showFailMsg("店铺不存在!"); + } + shopHeadInfoDto.setShopStatus(shopDetail.getShopStatus()); + shopHeadInfoDto.setContractStartTime(shopDetail.getContractStartTime()); + shopHeadInfoDto.setContractEndTime(shopDetail.getContractEndTime()); + if (!Objects.equals(shopDetail.getShopStatus(), 1)) { + return ServerResponseEntity.success(shopHeadInfoDto); + } + ShopRenovation shopHomeRenovation = shopRenovationService.getShopHomeRenovation(shopId, RenovationType.H5.value()); + shopHeadInfoDto.setRenovationId(Objects.nonNull(shopHomeRenovation) ? shopHomeRenovation.getRenovationId() : null); + shopHeadInfoDto.setShopId(shopId); + shopHeadInfoDto.setType(shopDetail.getType()); + shopHeadInfoDto.setIntro(shopDetail.getIntro()); + shopHeadInfoDto.setShopLogo(shopDetail.getShopLogo()); + shopHeadInfoDto.setShopName(shopDetail.getShopName()); + shopHeadInfoDto.setIsPreferred(shopDetail.getIsPreferred()); + shopHeadInfoDto.setCollectionNum(shopDetail.getCollectionNum()); + shopHeadInfoDto.setPcBackgroundPic(shopDetail.getPcBackgroundPic()); + shopHeadInfoDto.setMobileBackgroundPic(shopDetail.getMobileBackgroundPic()); + return ServerResponseEntity.success(shopHeadInfoDto); + } + + @GetMapping("/search_shops") + @Operation(summary = "app搜索店铺", description = "根据店铺名称搜索店铺") + public ServerResponseEntity> searchShops(PageDTO pageDTO, ShopSearchDTO shopSearchDTO) { + PageVO shopPage = shopDetailService.renovationShopPage(pageDTO, shopSearchDTO, SysTypeEnum.ORDINARY.value()); + return ServerResponseEntity.success(shopPage); + } + + @GetMapping("/list_renovation_shop") + @Operation(summary = "获取装修店铺列表信息", description = "获取装修店铺列表信息") + public ServerResponseEntity> listRenovationShop(ShopSearchDTO shopSearchDTO) { + List shopList = shopDetailService.listRenovationShop(shopSearchDTO); + return ServerResponseEntity.success(shopList); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopRenovationController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopRenovationController.java new file mode 100644 index 0000000..f876b7f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/app/ShopRenovationController.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.app; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.model.ShopRenovation; +import com.tmerclub.cloud.multishop.service.ShopRenovationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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 java.util.Objects; + +/** + * 店铺装修信息 + * @author Orange + * @date 2022-08-12 11:27:18 + */ +@RestController("appShopRenovationController") +@RequestMapping("/ua/shop_renovation") +@Tag(name = "app-店铺装修信息") +public class ShopRenovationController { + private static final Logger logger = LoggerFactory.getLogger(ShopRenovationController.class); + + @Autowired + private ShopRenovationService shopRenovationService; + + @GetMapping("/get_home_page") + @Operation(summary = "获取店铺主页装修信息", description = "根据店铺id,装修类型获取店铺装修信息") + @Parameters({ + @Parameter(name = "shopId", description = "店铺id", required = true), + @Parameter(name = "renovationType", description = "装修类型 1.pc 2.移动端", required = true) + }) + public ServerResponseEntity getHomePage(@RequestParam("shopId") Long shopId, + @RequestParam("renovationType") Integer renovationType) { + ShopRenovation shopHomeRenovation = shopRenovationService.getShopHomeRenovation(shopId, renovationType); + return ServerResponseEntity.success(shopHomeRenovation); + } + + @GetMapping("/get_home") + @Operation(summary = "获取店铺主页装修信息(内容为空)", description = "根据店铺id,装修类型获取店铺装修信息(内容为空)") + @Parameters({ + @Parameter(name = "shopId", description = "店铺id", required = true), + @Parameter(name = "renovationType", description = "装修类型 1.pc 2.移动端", required = true) + }) + public ServerResponseEntity getHome(@RequestParam("shopId") Long shopId, + @RequestParam("renovationType") Integer renovationType) { + ShopRenovation shopHomeRenovation = shopRenovationService.getShopHomeRenovation(shopId, renovationType); + if (Objects.nonNull(shopHomeRenovation)) { + logger.info("判断店铺装修信息是否为空,不为空则设置内容为空"); + shopHomeRenovation.setContent(null); + } + return ServerResponseEntity.success(shopHomeRenovation); + } + + @GetMapping("/get_renovation_by_id") + @Operation(summary = "根据装修id获取店铺装修信息", description = "根据装修id获取店铺装修信息") + @Parameter(name = "renovationId", description = "装修id", required = true) + public ServerResponseEntity getRenovationById(@RequestParam("renovationId") Long renovationId) { + ShopRenovation shopRenovation = shopRenovationService.getByRenovationId(renovationId); + return ServerResponseEntity.success(shopRenovation); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/CompanyAuditingController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/CompanyAuditingController.java new file mode 100644 index 0000000..c3ecbca --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/CompanyAuditingController.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.service.CompanyAuditingService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author chiley + * @date 2022/9/13 14:06 + */ +@RestController("multishopCompanyAuditingController") +@RequestMapping("/m/shop_company_auditing") +@Tag(name = "multishop-店铺变更工商信息") +public class CompanyAuditingController { + + @Autowired + private CompanyAuditingService companyAuditingService; + @Autowired + private ShopDetailService shopDetailService; + + @PostMapping("/apply_change_company_info") + @Operation(summary = "申请变更工商信息", description = "申请变更工商信息") + public ServerResponseEntity applyChangeCompanyInfo(@RequestBody @Valid ShopCompanyDTO shopCompanyDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + // 校验是否已经存在申请中记录 + ShopCompanyAuditingVO shopCompanyAuditingVO = companyAuditingService.getLatestAuditingByShopId(shopId); + if (Objects.nonNull(shopCompanyAuditingVO) && Objects.equals(shopCompanyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("不能同时提交多次签约申请,请耐心等候平台审核,或者把上次提交申请撤销后重新申请"); + } + shopCompanyDTO.setShopId(shopId); + companyAuditingService.applyChangeCompanyInfo(shopCompanyDTO); + shopDetailService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + @PutMapping("/revoke") + @Operation(summary = "撤销申请", description = "撤销申请") + public ServerResponseEntity revoke() { + Long shopId = AuthUserContext.get().getTenantId(); + companyAuditingService.revoke(shopId); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopBankCardController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopBankCardController.java new file mode 100644 index 0000000..3d3672f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopBankCardController.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.CompanyInfoProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.AllinpayShopBankCardDTO; +import com.tmerclub.cloud.multishop.dto.ShopBankCardDTO; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopBankCardService; +import com.tmerclub.cloud.multishop.service.ShopCompanyService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author lth + */ +@RestController("multishopShopBankCardController") +@RequestMapping("/m/apply_shop/shop_bank_card") +@Tag(name = "multishop-店铺银行卡信息") +public class ShopBankCardController { + + private final Logger LOGGER = LoggerFactory.getLogger(ShopBankCardController.class); + + @Autowired + private ShopBankCardService shopBankCardService; + @Autowired + private ShopCompanyService shopCompanyService; + @Autowired + private ShopAllinpayService shopAllinpayService; + @Autowired + private ShopDetailService shopDetailService; + + @PostMapping("/save_and_apply_shop") + @Operation(summary = "批量保存店铺银行卡信息并提交店铺审核信息", description = "批量保存店铺银行卡信息并提交店铺审核信息") + public ServerResponseEntity saveAndApplyShop(@Valid @RequestBody List shopBankCardDTOList) { + Long shopId = AuthUserContext.get().getTenantId(); + if (shopAllinpayService.getIsAllinpay()) { + LOGGER.info("通联支付--批量保存店铺银行卡信息并提交店铺审核信息"); + throw new LuckException("开店所需要提交的信息有所变更,请重新填写"); + } + shopBankCardService.insertBatchAndSubmitApply(shopBankCardDTOList, shopId); + return ServerResponseEntity.success(); + } + + @PostMapping("/allinpay_save_and_apply_shop") + @Operation(summary = "通联支付--批量保存店铺银行卡信息并提交店铺审核信息", description = "批量保存店铺银行卡信息并提交店铺审核信息") + public ServerResponseEntity allinpaySaveAndApplyShop(@Valid @RequestBody AllinpayShopBankCardDTO allinpayShopBankCardDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + // 查找工商信息 + ShopCompanyVO shopCompany = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(shopCompany)) { + LOGGER.info("店铺工商信息为空,请刷新页面重新填写"); + throw new LuckException("店铺工商信息为空,请刷新页面重新填写"); + } + checkAllinpay(shopCompany); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.equals(shopDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + // 已经审核成功就不必要多次设置企业信息了 + throw new LuckException("店铺已经审核通过"); + } + + shopBankCardService.insertAndSetCompanyInfo(allinpayShopBankCardDTO, shopId, shopCompany); + shopDetailService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + private void checkAllinpay(ShopCompanyVO shopCompany) { + boolean needInfo = Objects.isNull(shopCompany.getLegalIds()) || Objects.isNull(shopCompany.getLegalPhone()); + if (shopAllinpayService.getIsAllinpay() && needInfo) { + throw new LuckException("工商信息需要提交的内容有所变更,请重新填写"); + } + } + + @GetMapping + @Operation(summary = "根据银行卡id获取银行卡信息", description = "根据银行卡id获取银行卡信息") + public ServerResponseEntity getById(@RequestParam("shopBankCardId") Long shopBankCardId) { + Long shopId = AuthUserContext.get().getTenantId(); + ShopBankCardVO shopBankCardVO = shopBankCardService.getByShopBankCardIdAndShopId(shopBankCardId, shopId); + return ServerResponseEntity.success(shopBankCardVO); + } + + @GetMapping("/list_by_shopId") + @Operation(summary = "获取店铺下的银行卡列表", description = "获取店铺下的银行卡列表") + public ServerResponseEntity> listByShopId() { + Long shopId = AuthUserContext.get().getTenantId(); + List shopBankCardVOList = shopBankCardService.listByShopId(shopId); + return ServerResponseEntity.success(shopBankCardVOList); + } + + @PostMapping + @Operation(summary = "添加单个银行卡信息", description = "添加单个银行卡信息") + public ServerResponseEntity insert(@RequestBody @Valid ShopBankCardDTO shopBankCardDTO) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持该接口添加银行卡"); + } + Long shopId = AuthUserContext.get().getTenantId(); + shopBankCardService.insertByShopId(shopBankCardDTO, shopId); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "根据银行卡id删除银行卡信息", description = "根据银行卡id删除银行卡信息") + public ServerResponseEntity deleteById(@RequestParam("shopBankCardId") Long shopBankCardId) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持该接口删除银行卡"); + } + shopBankCardService.deleteByShopBankCardId(shopBankCardId, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新银行卡信息", description = "更新银行卡信息") + public ServerResponseEntity update(@RequestBody @Valid ShopBankCardDTO shopBankCardDTO) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持该接口更新银行卡"); + } + shopBankCardService.updateByShopId(shopBankCardDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_primary") + @Operation(summary = "设置为主账号", description = "设置为主账号") + public ServerResponseEntity setPrimary(@RequestParam("shopBankCardId") Long shopBankCardId) { + shopBankCardService.setPrimaryByShopId(shopBankCardId, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_not_primary") + @Operation(summary = "取消主账号", description = "取消主账号") + public ServerResponseEntity setNotPrimary(@RequestParam("shopBankCardId") Long shopBankCardId) { + shopBankCardService.setNotPrimaryByShopId(shopBankCardId, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/refresh") + @Operation(summary = "刷新银行卡列表", description = "通联独有,防止有银行卡没有同步到数据库") + public ServerResponseEntity refresh() { + Long shopId = AuthUserContext.get().getTenantId(); + shopBankCardService.refresh(shopId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopDetailController.java new file mode 100644 index 0000000..728de2e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopDetailController.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.dto.ShopDetailDTO; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopStatusInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author lth + */ +@RestController("multishopShopDetailController") +@RequestMapping("/m/apply_shop/shop_detail") +@Tag(name = "multishop-店铺信息") +public class ShopDetailController { + + @Autowired + private ShopDetailService shopDetailService; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @Autowired + private ShopAllinpayService shopAllinpayService; + + @PostMapping + @Operation(summary = "创建店铺", description = "创建店铺") + public ServerResponseEntity createShop(@RequestBody @Valid ShopDetailDTO shopDetailDTO) { + if (!Objects.equals(AuthUserContext.get().getTenantId(), Constant.DEFAULT_SHOP_ID)) { + throw new LuckException("店铺已存在,不能重复创建"); + } + this.dealWithUpdateOrCreateInfo(shopDetailDTO); + shopDetailService.createShop(shopDetailDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新店铺基本信息", description = "更新店铺基本信息") + public ServerResponseEntity update(@RequestBody @Valid ShopDetailDTO shopDetailDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.equals(shopId, Constant.DEFAULT_SHOP_ID)) { + throw new LuckException("店铺不存在,无法更新"); + } + shopDetailDTO.setShopId(shopId); + this.dealWithUpdateOrCreateInfo(shopDetailDTO); + shopDetailService.update(shopDetailDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/storage") + @Operation(summary = "存储店铺基本信息", description = "存储店铺基本信息,不存在则新增,已存在则更新") + public ServerResponseEntity storage(@RequestBody @Valid ShopDetailDTO shopDetailDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + this.dealWithUpdateOrCreateInfo(shopDetailDTO); + if (Objects.equals(shopId, Constant.DEFAULT_SHOP_ID)) { + // 店铺不存在,新增 + shopDetailService.createShop(shopDetailDTO); + } else { + // 店铺已存在,更新 + shopDetailDTO.setShopId(shopId); + shopDetailService.update(shopDetailDTO); + } + return ServerResponseEntity.success(); + } + + @GetMapping + @Operation(summary = "获取店铺基本信息", description = "获取店铺基本信息") + public ServerResponseEntity get() { + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.equals(shopId, Constant.DEFAULT_SHOP_ID)) { + // 店铺未创建 + return ServerResponseEntity.success(null); + } + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.nonNull(shopDetailVO) && StrUtil.isNotBlank(shopDetailVO.getContactPhone())) { + shopDetailVO.setContactPhone(PhoneUtil.hideBetween(shopDetailVO.getContactPhone()).toString()); + } + return ServerResponseEntity.success(shopDetailVO); + } + + @GetMapping("/get_status_info") + @Operation(summary = "获取店铺状态信息", description = "获取店铺状态信息") + public ServerResponseEntity getShopStatusInfo() { + Long shopId = AuthUserContext.get().getTenantId(); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.isNull(shopDetailVO)) { + throw new LuckException("店铺不存在"); + } + ShopStatusInfoVO shopStatusInfoVO = new ShopStatusInfoVO(); + shopStatusInfoVO.setShopStatus(shopDetailVO.getShopStatus()); + shopStatusInfoVO.setContractStartTime(shopDetailVO.getContractStartTime()); + shopStatusInfoVO.setContractEndTime(shopDetailVO.getContractEndTime()); + if (Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OFFLINE.value())) { + ServerResponseEntity offlineHandleEventRes = offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), shopId, null); + if (!offlineHandleEventRes.isSuccess()) { + throw new LuckException(offlineHandleEventRes.getMsg()); + } + OfflineHandleEventVO offlineHandleEventVO = offlineHandleEventRes.getData(); + if (Objects.nonNull(offlineHandleEventVO)) { + shopStatusInfoVO.setOfflineReason(offlineHandleEventVO.getOfflineReason()); + shopStatusInfoVO.setOfflineStatus(offlineHandleEventVO.getStatus()); + } else if (shopAllinpayService.getIsAllinpay()) { + shopStatusInfoVO.setOfflineReason("平台开启通联支付,请重新提交工商信息与财务信息"); + } + } + return ServerResponseEntity.success(shopStatusInfoVO); + } + + @PostMapping("/create_allinpay_member") + @Operation(summary = "给还没有创建通联账户的商家创建一个", description = "给还没有创建通联账户的商家创建一个") + public ServerResponseEntity createAllinpayMemberByShopId() { + shopDetailService.createAllinpayMemberByShopId(AuthUserContext.get().getTenantId()); + shopDetailService.removeCacheByShopId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "店铺重新申请上线", description = "店铺重新申请上线") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + offlineHandleEventDTO.setHandleId(shopId); + shopDetailService.auditApply(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + /** + * 处理店铺信息,这些信息商家无法直接修改 + * @param shopDetailDTO + */ + private void dealWithUpdateOrCreateInfo(ShopDetailDTO shopDetailDTO) { + if (Objects.isNull(shopDetailDTO)) { + return; + } + shopDetailDTO.setContractEndTime(null); + shopDetailDTO.setContractStartTime(null); + shopDetailDTO.setShopStatus(null); + shopDetailDTO.setType(null); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopRechargeController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopRechargeController.java new file mode 100644 index 0000000..1ea094a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopRechargeController.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.constant.ShopWalletAmountType; +import com.tmerclub.cloud.multishop.constant.ShopWalletChangeReason; +import com.tmerclub.cloud.multishop.constant.ShopWalletIoType; +import com.tmerclub.cloud.multishop.dto.AllinpayRechargeDTO; +import com.tmerclub.cloud.multishop.dto.ShopRechargeInfoDTO; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.*; +import com.tmerclub.cloud.multishop.vo.ShopRechargeVO; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; +import java.util.Objects; + +/** + * 商家店铺余额充值 + * @author chiley + */ +@RestController("multishopRechargeController") +@RequestMapping("/m/shop_recharge") +@Tag(name = "multishop-商家余额充值") +public class ShopRechargeController { + + @Autowired + private ShopWalletLogService shopWalletLogService; + @Autowired + private ShopWalletService shopWalletService; + @Autowired + private ShopAllinpayService shopAllinpayService; + @Autowired + private ShopDetailService shopDetailService; + @Autowired + private ShopRechargeService shopRechargeService; + + @PostMapping("/recharge") + @Operation(summary = "充值订单", description = "生成余额充值订单,保存充值记录") + public ServerResponseEntity save(@Valid @RequestBody ShopRechargeInfoDTO shopRechargeInfoDTO) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("通联充值暂不支持该接口"); + } + Long shopId = AuthUserContext.get().getTenantId(); + Long amount = checkAndGetAmount(shopRechargeInfoDTO, shopId); + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setShopId(shopId); + shopWalletLog.setShopChangeAmount(amount); + shopWalletLog.setUserAmount(amount); + shopWalletLog.setShopIoType(ShopWalletIoType.INCOME.value()); + shopWalletLog.setReason(ShopWalletChangeReason.APPLY_RECHARGE.value()); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setPaySysType(PaySysType.DEFAULT.value()); + shopWalletLogService.saveMongo(shopWalletLog); + return ServerResponseEntity.success(shopWalletLog.getWalletLogId()); + } + + /** + * @param shopRechargeInfoDTO + * @return + */ + @PostMapping("/allinpay_recharge") + @Operation(summary = "通联充值订单", description = "生成余额充值订单,保存充值记录--通联独有") + public ServerResponseEntity allinpayRecharge(@Valid @RequestBody ShopRechargeInfoDTO shopRechargeInfoDTO) { + if (!shopAllinpayService.getIsAllinpay()) { + throw new LuckException("通联支付未开启"); + } + Long shopId = AuthUserContext.get().getTenantId(); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.equals(shopDetailVO.getIsBindPhone(), 0)) { + throw new LuckException("店铺还未绑定手机号码,无法进行充值"); + } + + Long amount = checkAndGetAmount(shopRechargeInfoDTO, shopId); + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setShopId(shopId); + shopWalletLog.setUserAmount(amount); + shopWalletLog.setShopChangeAmount(amount); + shopWalletLog.setShopIoType(ShopWalletIoType.INCOME.value()); + shopWalletLog.setReason(ShopWalletChangeReason.APPLY_RECHARGE.value()); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLog.setCreateTime(new Date()); + // 补充支付类型(默认支付/通联支付) + shopWalletLog.setPaySysType(PaySysType.ALLINPAY.value()); + ShopRechargeVO shopRecharge = shopRechargeService.shopRecharge(shopWalletLog, shopRechargeInfoDTO.getReturnUrl()); + return ServerResponseEntity.success(shopRecharge); + } + + private Long checkAndGetAmount(ShopRechargeInfoDTO shopRechargeInfoDTO, Long shopId) { + Long amount = shopRechargeInfoDTO.getRechargeAmount().longValue(); + if (amount < 1) { + throw new LuckException("充值金额有误"); + } + ShopWalletVO shopWallet = shopWalletService.getByShopId(shopId); + long userBalance = shopWallet.getSettledAmount() + amount; + + if (userBalance > Constant.MAX_USER_BALANCE) { + throw new LuckException("此次充值会导致余额超出最大限制,故无法进行此操作,请减少充值金额后重试"); + } + return amount; + } + + @Operation(summary = "充值确认支付--暂不调用,采用微信正扫不需要该接口", description = "通联独有") + @PostMapping("/confirm_recharge_pay") + public ServerResponseEntity confirmRechargePay(@RequestBody AllinpayRechargeDTO rechargeDTO) { + if (Objects.isNull(rechargeDTO.getBizOrderNo()) || Objects.isNull(rechargeDTO.getVerificationCode())) { + throw new LuckException("短信验证码和订单号不能为空"); + } + shopRechargeService.confirmRechargePay(rechargeDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @Operation(summary = "重新发送充值支付验证码--暂不调用,采用微信正扫不需要该接口", description = "通联独有") + @PostMapping("/resend_pay_sms") + public ServerResponseEntity resendPaySms(@RequestBody AllinpayRechargeDTO rechargeDTO) { + if (Objects.isNull(rechargeDTO.getBizOrderNo())) { + throw new LuckException("充值订单号不能为空"); + } + shopRechargeService.resendPaySms(rechargeDTO.getBizOrderNo(), AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopSubstituteSalesController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopSubstituteSalesController.java new file mode 100644 index 0000000..eb0d592 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopSubstituteSalesController.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.dto.ShopSubstituteSalesDTO; +import com.tmerclub.cloud.multishop.model.ShopSubstituteSales; +import com.tmerclub.cloud.multishop.service.ShopSubstituteSalesService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 代销设置表 + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +@RestController("multishopShopSubstituteSalesController") +@RequestMapping("/m/shop_substitute_sales") +@Tag(name = "代销设置表") +public class ShopSubstituteSalesController { + + @Autowired + private ShopSubstituteSalesService shopSubstituteSalesService; + + @GetMapping + @Operation(summary = "获取代销设置表", description = "获取代销设置表") + public ServerResponseEntity getByShopSubstituteSalesId() { + Long shopId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(shopSubstituteSalesService.getByShopSubstituteSalesId(shopId)); + } + + @PostMapping + @Operation(summary = "保存代销设置表", description = "保存代销设置表") + public ServerResponseEntity save(@Valid @RequestBody ShopSubstituteSalesDTO shopSubstituteSalesDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + shopSubstituteSalesDTO.setShopId(shopId); + ShopSubstituteSales shopSubstituteSales = BeanUtil.map(shopSubstituteSalesDTO, ShopSubstituteSales.class); + //获取代销设置 + ShopSubstituteSalesVO shopSubstituteSalesId = shopSubstituteSalesService.getByShopSubstituteSalesId(shopId); + if (Objects.isNull(shopSubstituteSalesId)) { + shopSubstituteSales.setShopSubstituteSalesId(null); + shopSubstituteSalesService.save(shopSubstituteSales); + } else { + shopSubstituteSalesService.update(shopSubstituteSales); + } + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopUserRegisterController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopUserRegisterController.java new file mode 100644 index 0000000..3d0592e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopUserRegisterController.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.dto.ShopUserRegisterDTO; +import com.tmerclub.cloud.multishop.service.ShopUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author lth + */ +@RestController("multishopShopUserRegisterController") +@RequestMapping("/ua/shop_user_register") +@Tag(name = "multishop-商家注册") +public class ShopUserRegisterController { + + @Autowired + private ShopUserService shopUserService; + + @DubboReference + private ConfigFeignClient configFeignClient; + + @Operation(summary = "注册") + @PostMapping + public ServerResponseEntity register(@Valid @RequestBody ShopUserRegisterDTO shopUserRegisterDTO) { + // 创建并保存用户信息 + shopUserService.register(shopUserRegisterDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "获取商家注册协议") + @GetMapping("/get_merchant_register_protocol") + public ServerResponseEntity getMerchantRegisterProtocol() { + Integer dbLang = I18nMessage.getLang(); + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), dbLang)) { + return configFeignClient.getConfig(ConfigNameConstant.MERCHANT_REGISTER_PROTOCOL_CN); + } else { + return configFeignClient.getConfig(ConfigNameConstant.MERCHANT_REGISTER_PROTOCOL_EN); + } + } + + @Operation(summary = "获取开店协议") + @GetMapping("/get_shop_protocol") + public ServerResponseEntity getShopProtocol() { + Integer dbLang = I18nMessage.getLang(); + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), dbLang)) { + return configFeignClient.getConfig(ConfigNameConstant.SHOP_PROTOCOL_CN); + } else { + return configFeignClient.getConfig(ConfigNameConstant.SHOP_PROTOCOL_EN); + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopWithdrawCashController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopWithdrawCashController.java new file mode 100644 index 0000000..9d8237f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/multishop/ShopWithdrawCashController.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.multishop; + + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.dto.AllinpayShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashConfigDto; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.service.ShopWithdrawCashService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 商家提现申请信息 + * @author FrozenWatermelon + */ +@RestController("multishopShopWithdrawCashController") +@RequestMapping("/m/shop_withdraw_cash") +@Tag(name = "multishop-商家提现申请信息") +public class ShopWithdrawCashController { + + @Autowired + private ShopWithdrawCashService shopWithdrawCashService; + + @GetMapping("/getWithdrawCash") + public ServerResponseEntity getWithdrawCashConfig() { + return ServerResponseEntity.success(shopWithdrawCashService.getConfig()); + } + + @PostMapping("/apply/normal") + @Operation(summary = "商家提交申请提现", description = "商家提交申请提现") + public ServerResponseEntity apply(@RequestBody ShopWithdrawCashDTO shopWithdrawCashDTO) { + shopWithdrawCashService.apply(shopWithdrawCashDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/apply/allinpay_apply") + @Operation(summary = "商家提交通联申请提现", description = "通联独有") + public ServerResponseEntity allinpayApply(@RequestBody AllinpayShopWithdrawCashDTO allinpayShopWithdrawCashDTO) { + if (Objects.isNull(allinpayShopWithdrawCashDTO.getAmount()) || Objects.isNull(allinpayShopWithdrawCashDTO.getBankCardNo())) { + throw new LuckException("提现金额和银行卡号不能为空"); + } + String bizOrderNo = shopWithdrawCashService.allinpayApply(allinpayShopWithdrawCashDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(bizOrderNo); + } + + @Operation(summary = "提现确认支付", description = "通联独有") + @PostMapping("/confirm_withdraw_pay") + public ServerResponseEntity confirmWithdrawPay(@RequestBody AllinpayShopWithdrawCashDTO allinpayShopWithdrawCashDTO) { + if (Objects.isNull(allinpayShopWithdrawCashDTO.getBizOrderNo()) || Objects.isNull(allinpayShopWithdrawCashDTO.getVerificationCode())) { + throw new LuckException("短信验证码和订单号不能为空"); + } + shopWithdrawCashService.confirmWithdrawPay(allinpayShopWithdrawCashDTO, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/check_draw_cash_amount") + @Operation(summary = "提现金额检查") + public ServerResponseEntity checkDrawCashAmount(Long amount) { + shopWithdrawCashService.checkDrawCashAmount(amount); + return ServerResponseEntity.success(true); + } + + @Operation(summary = "重新发送提现支付验证码", description = "通联独有") + @PostMapping("/resend_pay_sms") + public ServerResponseEntity resendPaySms(@RequestBody AllinpayShopWithdrawCashDTO allinpayShopWithdrawCashDTO) { + if (Objects.isNull(allinpayShopWithdrawCashDTO.getBizOrderNo())) { + throw new LuckException("提现订单号不能为空"); + } + shopWithdrawCashService.resendPaySms(allinpayShopWithdrawCashDTO.getBizOrderNo(), AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopAuditingController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopAuditingController.java new file mode 100644 index 0000000..1d72b39 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopAuditingController.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.platform; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.AuditingInfoDTO; +import com.tmerclub.cloud.multishop.dto.ShopAuditingDTO; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopAuditingService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopAuditingInfoVO; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 商家审核信息 + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +@RestController("platformShopAuditingController") +@RequestMapping("/p/shop_auditing") +@Tag(name = "platform-平台审核信息") +public class ShopAuditingController { + + @Autowired + private ShopAuditingService shopAuditingService; + + @Autowired + private ShopDetailService shopDetailService; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @Autowired + private ShopAllinpayService shopAllinpayService; + + @GetMapping("/page") + @Operation(summary = "分页查询" , description = "分页查询") + public ServerResponseEntity> getShopAuditingPage(PageDTO pageDTO, AuditingInfoDTO auditingInfoDTO) { + checkAuthorized(); + return ServerResponseEntity.success(shopAuditingService.auditingInfoPage(pageDTO, auditingInfoDTO)); + } + + @GetMapping("/{shopId}") + @Operation(summary = "根据店铺id查询详情信息" , description = "根据店铺id查询详情信息") + public ServerResponseEntity getShopAuditing(@PathVariable Long shopId) { + checkAuthorized(); + ShopAuditingVO shopAuditing = shopAuditingService.getByshopId(shopId); + if (Objects.isNull(shopAuditing)){ + shopAuditing = new ShopAuditingVO(); + } + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (StrUtil.isNotBlank(shopDetailVO.getContactPhone())) { + shopDetailVO.setContactPhone(PhoneUtil.hideBetween(shopDetailVO.getContactPhone()).toString()); + } + if (PrincipalUtil.isMobile(shopDetailVO.getMerchantAccount())){ + shopDetailVO.setMerchantAccount(PhoneUtil.hideBetween(shopDetailVO.getMerchantAccount()).toString()); + } + if (Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OFFLINE.value())) { + shopAuditing.setStatus(AuditStatus.OFFLINE.value()); + } else if (Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OFFLINE_AWAIT_AUDIT.value()) || Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OPEN_AWAIT_AUDIT.value())) { + shopAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + } + ServerResponseEntity responseEntity = accountFeignClient.getAccountInfoByTenantId(shopId, SysTypeEnum.MULTISHOP.value()); + if (responseEntity.isSuccess() && Objects.nonNull(responseEntity.getData())) { + AuthAccountVO authAccountVO = responseEntity.getData(); + shopDetailVO.setMerchantAccount(authAccountVO.getPhone()); + shopDetailVO.setAccountStatus(authAccountVO.getStatus()); + } + shopAuditing.setShopDetail(shopDetailVO); + return ServerResponseEntity.success(shopAuditing); + } + + @PutMapping("/audit") + @Operation(summary = "审核信息(审核商家)" , description = "审核信息(审核商家)") + public ServerResponseEntity audit(@Valid @RequestBody ShopAuditingDTO shopAuditingDTO) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("开启通联后,平台无需审核商家"); + } + checkAuthorized(); + shopDetailService.audit(shopAuditingDTO); + shopDetailService.removeCacheByShopId(shopAuditingDTO.getShopId()); + + return ServerResponseEntity.success(); + } + + /** + * 校验权限 + */ + private void checkAuthorized () { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopBankCardController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopBankCardController.java new file mode 100644 index 0000000..968f681 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopBankCardController.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.platform; + +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.CompanyInfoProcessStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.AllinpayShopBankCardDTO; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopBankCardService; +import com.tmerclub.cloud.multishop.service.ShopCompanyService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/26 10:09 + */ +@RestController +@RequestMapping("/p/shop_bank_card") +@Tag(name = "platform-店铺银行卡信息") +public class ShopBankCardController { + + @Autowired + private ShopBankCardService shopBankCardService; + @Autowired + private ShopCompanyService shopCompanyService; + @Autowired + private ShopDetailService shopDetailService; + @Autowired + private ShopAllinpayService shopAllinpayService; + + @GetMapping("/list_by_shop_id") + @Operation(summary = "根据店铺id批量获取银行卡信息") + public ServerResponseEntity> listByShopId(@RequestParam("shopId") Long shopId) { + List shopBankCardVOList = shopBankCardService.listByShopId(shopId); + return ServerResponseEntity.success(shopBankCardVOList); + } + + @PostMapping("/allinpay_save_and_apply_shop") + @Operation(summary = "通联支付--批量保存店铺银行卡信息并提交店铺审核信息", description = "批量保存店铺银行卡信息并提交店铺审核信息") + public ServerResponseEntity allinpaySaveAndApplyShop(@Valid @RequestBody AllinpayShopBankCardDTO allinpayShopBankCardDTO) { + Long shopId = allinpayShopBankCardDTO.getShopId(); + if (Objects.isNull(shopId)) { + throw new LuckException("店铺id不能为空"); + } + // 查找工商信息 + ShopCompanyVO shopCompany = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(shopCompany)) { + throw new LuckException("该店铺工商信息为空,请刷新页面重新填写"); + } + checkAllinpay(shopCompany); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.equals(shopDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + // 已经审核成功就不必要多次设置企业信息了 + throw new LuckException("该店铺已经审核通过"); + } + + shopBankCardService.insertAndSetCompanyInfo(allinpayShopBankCardDTO, shopId, shopCompany); + shopDetailService.removeCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + private void checkAllinpay(ShopCompanyVO shopCompany) { + boolean needInfo = Objects.isNull(shopCompany.getLegalIds()) || Objects.isNull(shopCompany.getLegalPhone()); + if (shopAllinpayService.getIsAllinpay() && needInfo) { + throw new LuckException("工商信息需要提交的内容有所变更,请重新填写"); + } + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopDetailController.java new file mode 100644 index 0000000..f8265a1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopDetailController.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.IsPreferred; +import com.tmerclub.cloud.multishop.dto.*; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.vo.ShopHeadInfoVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 店铺详情 + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +@RestController("platformShopDetailController") +@RequestMapping("/p/shop_detail") +@Tag(name = "platform-店铺信息") +public class ShopDetailController { + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @Autowired + private ShopDetailService shopDetailService; + @DubboReference + private AccountFeignClient accountFeignClient; + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "分页查询") + public ServerResponseEntity> getShopAuditingPage(PageDTO pageDTO, ShopDetailDTO shopDetailDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(shopDetailService.page(pageDTO, shopDetailDTO)); + } + + @GetMapping("/info") + @Operation(summary = "获取店铺基本信息", description = "获取店铺基本信息") + public ServerResponseEntity getInfo(@RequestParam Long shopId) { + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + shopDetailVO.setContactPhone(PhoneUtil.hideBetween(shopDetailVO.getContactPhone()).toString()); + ServerResponseEntity responseEntity = accountFeignClient.getAccountInfoByTenantId(shopId, SysTypeEnum.MULTISHOP.value()); + if (responseEntity.isSuccess() && Objects.nonNull(responseEntity.getData())) { + AuthAccountVO authAccountVO = responseEntity.getData(); + shopDetailVO.setMerchantAccount(PhoneUtil.hideBetween(authAccountVO.getPhone()).toString()); + shopDetailVO.setAccountStatus(authAccountVO.getStatus()); + } + return ServerResponseEntity.success(shopDetailVO); + } + + /** + * 新建店铺 + */ + @PostMapping("/create_shop") + @Operation(summary = "新建店铺", description = "新建店铺") + public ServerResponseEntity createShop(@RequestBody ShopCreateInfoDTO shopCreateInfoDTO) { + shopDetailService.platformCreateShop(shopCreateInfoDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "编辑店铺基本信息", description = "编辑店铺基本信息") + public ServerResponseEntity editShop(@RequestBody ShopDetailDTO shopDetailDTO) { + if (Objects.isNull(shopDetailDTO.getShopId())) { + throw new LuckException("店铺id不能为空"); + } + shopDetailService.update(shopDetailDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_signing_info") + @Operation(summary = "更新店铺签约信息", description = "更新店铺签约信息") + public ServerResponseEntity updateSigningInfo(@RequestBody @Valid ShopSigningInfoDTO shopSigningInfoDTO) { + if (Objects.isNull(shopSigningInfoDTO.getShopId())) { + throw new LuckException("店铺id不能为空"); + } + shopDetailService.updateSigningInfo(shopSigningInfoDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_shop_preferred") + @Operation(summary = "当前店铺为优选,则取消优选;不是优选,则设置为优选", description = "当前店铺为优选,则取消优选;不是优选,则设置为优选") + public ServerResponseEntity updateShopPreferred(@RequestParam("shopId") Long shopId) { + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + shopDetailVO.setIsPreferred(Objects.equals(shopDetailVO.getIsPreferred(), IsPreferred.YES.value()) ? IsPreferred.NO.value() : IsPreferred.YES.value()); + shopDetailService.update(BeanUtil.map(shopDetailVO, ShopDetailDTO.class)); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_password") + @Operation(summary = "更新店铺商家的登陆密码", description = "更新店铺商家的登陆密码") + public ServerResponseEntity updatePassword(@RequestBody ShopAccountDTO shopAccountDTO) { + // 暂时的home的店铺id + Long home = 4L; + if (Objects.equals(shopAccountDTO.getShopId(), home) && BooleanUtil.isFalse(permission)) { + throw new LuckException("暂无权限修改该用户账号信息"); + } + ServerResponseEntity merchantInfoByTenantId = accountFeignClient.getAccountInfoByTenantId(shopAccountDTO.getShopId(), SysTypeEnum.MULTISHOP.value()); + if (!merchantInfoByTenantId.isSuccess()) { + throw new LuckException("服务异常"); + } + AuthAccountVO authAccountVO = merchantInfoByTenantId.getData(); + authAccountVO.setPassword(shopAccountDTO.getPassword()); + accountFeignClient.update(BeanUtil.map(authAccountVO, AuthAccountDTO.class)); + return ServerResponseEntity.success(); + } + + @PutMapping("/offline") + @Operation(summary = "下线店铺", description = "下线店铺") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + Long sysUserId = AuthUserContext.get().getUserId(); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(shopDetailVO)) { + throw new LuckException("未找到该店铺信息"); + } + if (!Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OPEN.value()) && !Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.STOP.value())) { + throw new LuckException("店铺不处于营业或者停业状态,不能进行下线"); + } + shopDetailService.offline(shopDetailVO, offlineHandleEventDTO.getOfflineReason(), sysUserId); + return ServerResponseEntity.success(); + } + + @GetMapping("/count_by_shop_status") + @Operation(summary = "根据店铺状态查询店铺数量", description = "根据店铺状态查询店铺数量") + public ServerResponseEntity countByShopStatus(@RequestParam(value = "shopStatus", required = false, defaultValue = "3") Integer shopStatus) { + Long countByShopStatus = shopDetailService.countByShopStatus(shopStatus); + return ServerResponseEntity.success(countByShopStatus); + } + + @PostMapping("/online_audit") + @Operation(summary = "店铺违规下线,重新申请上线审核", description = "店铺违规下线,重新申请上线审核") + public ServerResponseEntity onlineAudit(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + shopDetailService.onlineAudit(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/online_open_shop") + @Operation(summary = "店铺违规下线,平台直接上线店铺", description = "开通通联支付可用") + public ServerResponseEntity onlineOpenShop(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + offlineHandleEventDTO.setStatus(OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue()); + shopDetailService.onlineOpenShop(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/search_shops") + @Operation(summary = "platform搜索店铺", description = "根据店铺名称搜索店铺") + public ServerResponseEntity> searchShops(PageDTO pageDTO, ShopSearchDTO shopSearchDTO) { + PageVO shopPage = shopDetailService.renovationShopPage(pageDTO, shopSearchDTO, SysTypeEnum.PLATFORM.value()); + return ServerResponseEntity.success(shopPage); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopWithdrawCashController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopWithdrawCashController.java new file mode 100644 index 0000000..ad0c8d2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/controller/platform/ShopWithdrawCashController.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.controller.platform; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashConfigDto; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.service.ShopWithdrawCashService; +import com.tmerclub.cloud.multishop.vo.ShopWithdrawCashVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Author lth + * @Date 2021/6/11 9:28 + */ +@RestController("platformShopWithdrawCashController") +@RequestMapping("/p/shop_withdraw_cash") +@Tag(name = "platform-商家提现申请信息") +public class ShopWithdrawCashController { + + @Autowired + private ShopWithdrawCashService shopWithdrawCashService; + + @GetMapping("/info") + @Operation(summary = "根据提现记录id查看提现记录", description = "根据提现记录id查看提现记录") + public ServerResponseEntity getById(@RequestParam("cashId") Long cashId) { + ShopWithdrawCashVO shopWithdrawCashVO = shopWithdrawCashService.getDetailByCashId(cashId); + return ServerResponseEntity.success(shopWithdrawCashVO); + } + + @PutMapping("/audit") + @Operation(summary = "审核商家提现信息", description = "审核商家提现信息") + public ServerResponseEntity audit(@RequestBody ShopWithdrawCashDTO shopWithdrawCashDTO) { + shopWithdrawCashService.auditWithdrawCash(shopWithdrawCashDTO, AuthUserContext.get().getUserId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/save") + @Operation(summary = "设置提现金额", description = "设置提现金额") + public ServerResponseEntity saveWithdrawCashConfig(@RequestBody ShopWithdrawCashConfigDto shopWithdrawCashDto) { + shopWithdrawCashService.saveConfig(shopWithdrawCashDto); + return ServerResponseEntity.success(); + } + + @GetMapping("/getWithdrawCash") + public ServerResponseEntity getWithdrawCashConfig() { + return ServerResponseEntity.success(shopWithdrawCashService.getConfig()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayShopBankCardDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayShopBankCardDTO.java new file mode 100644 index 0000000..e4356bc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayShopBankCardDTO.java @@ -0,0 +1,128 @@ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 企业会员绑定对公户 + * @author LGH + */ +public class AllinpayShopBankCardDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id,平台修改时必选") + private Long shopId; + + @Schema(description = "企业对公账户 AES加密", requiredMode = Schema.RequiredMode.REQUIRED) + private String accountNo; + + @Schema(description = "开户银行名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String parentBankName; + + @Schema(description = "开户行地区代码 非必填") + private String bankCityNo; + + @Schema(description = "开户支行名称 \t如:“中国工商银行股份有限公司北京樱桃园支行”", requiredMode = Schema.RequiredMode.REQUIRED) + private String bankName; + + @Schema(description = "支付行号 12位数字", requiredMode = Schema.RequiredMode.REQUIRED) + private String unionBank; + + @Schema(description = "开户行所在省 开户行所在市必须同时上送 非必填") + private String province; + + @Schema(description = "开户行所在市 开户行所在省必须同时上送 非必填") + private String city; + + @Schema(description = "银行卡属性 0法人 1企业对公") + private Integer bankCardPro; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getAccountNo() { + return accountNo; + } + + public void setAccountNo(String accountNo) { + this.accountNo = accountNo; + } + + public String getParentBankName() { + return parentBankName; + } + + public void setParentBankName(String parentBankName) { + this.parentBankName = parentBankName; + } + + public String getBankCityNo() { + return bankCityNo; + } + + public void setBankCityNo(String bankCityNo) { + this.bankCityNo = bankCityNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + @Override + public String toString() { + return "AllinpayShopBankCardDTO{" + + "shopId=" + shopId + + ", accountNo='" + accountNo + '\'' + + ", parentBankName='" + parentBankName + '\'' + + ", bankCityNo='" + bankCityNo + '\'' + + ", bankName='" + bankName + '\'' + + ", unionBank='" + unionBank + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", bankCardPro=" + bankCardPro + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayShopWithdrawCashDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayShopWithdrawCashDTO.java new file mode 100644 index 0000000..d4446a7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AllinpayShopWithdrawCashDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 通联商家提现申请 + * @author TRACK + */ +public class AllinpayShopWithdrawCashDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "绑定银行卡号") + private String bankCardNo; + + @Schema(description = "提现金额") + private Long amount; + + @Schema(description = "提现订单号") + private String bizOrderNo; + + @Schema(description = "短信验证码") + private String verificationCode; + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "AllinpayShopWithdrawCashDTO{" + + "bankCardNo='" + bankCardNo + '\'' + + ", amount=" + amount + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AuditingInfoDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AuditingInfoDTO.java new file mode 100644 index 0000000..fd90f8e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/AuditingInfoDTO.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺审核参数 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +@Schema(description = "店铺审核列表参数") +public class AuditingInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "审核id)") + private Long shopAuditingId; + + @Schema(description = "审核状态(0 未审核 1已通过 -1未通过)") + private Integer status; + + @Schema(description = "店铺名字") + private String shopName; + + @Schema(description = "用户名字") + private String userName; + + @Schema(description = "店铺简介") + private String intro; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "店铺状态 (-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:店铺申请中 5:上线申请待审核)") + private Integer shopStatus; + + public Long getShopAuditingId() { + return shopAuditingId; + } + + public void setShopAuditingId(Long shopAuditingId) { + this.shopAuditingId = shopAuditingId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public Date getBeginTime() { + return beginTime; + } + + public void setBeginTime(Date beginTime) { + this.beginTime = beginTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + @Override + public String toString() { + return "AuditingInfoDTO{" + + "shopAuditingId=" + shopAuditingId + + ", status=" + status + + ", shopName='" + shopName + '\'' + + ", userName='" + userName + '\'' + + ", intro='" + intro + '\'' + + ", beginTime=" + beginTime + + ", endTime=" + endTime + + ", shopStatus=" + shopStatus + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ChangeAccountDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ChangeAccountDTO.java new file mode 100644 index 0000000..9bf42ab --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ChangeAccountDTO.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +public class ChangeAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "用户id不能为空") + @Schema(description = "用户id") + private Long userId; + + @NotBlank(message = "用户名不能为空") + @Schema(description = "用户名") + private String username; + + @Schema(description = "密码") + private String password; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Override + public String toString() { + return "ChangeAccountDTO{" + + "userId=" + userId + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", status=" + status + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/HotSearchDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/HotSearchDTO.java new file mode 100644 index 0000000..90de5c8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/HotSearchDTO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 热搜DTO + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +public class HotSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long hotSearchId; + + @Schema(description = "店铺ID 0为全局热搜") + private Long shopId; + + @Schema(description = "内容") + private String content; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "状态 0下线 1上线") + private Integer status; + + @Schema(description = "热搜标题") + private String title; + + @Schema(description = "1:商品热搜 2:店铺热搜") + private Integer type; + + public Long getHotSearchId() { + return hotSearchId; + } + + public void setHotSearchId(Long hotSearchId) { + this.hotSearchId = hotSearchId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "HotSearchDTO{" + + "hotSearchId=" + hotSearchId + + ",shopId=" + shopId + + ",content=" + content + + ",seq=" + seq + + ",status=" + status + + ",title=" + title + + ",type=" + type + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopAccountDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopAccountDTO.java new file mode 100644 index 0000000..35bdb61 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopAccountDTO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/5/21 14:07 + */ +public class ShopAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "密码") + private String password; + + @Schema(description = "店铺id") + private Long shopId; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "ShopAccountDTO{" + + "password='" + password + '\'' + + ", shopId='" + shopId + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopBankCardDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopBankCardDTO.java new file mode 100644 index 0000000..6343220 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopBankCardDTO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/4/25 16:44 + */ +public class ShopBankCardDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键id") + private Long shopBankCardId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "银行名称") + @NotBlank(message = "银行名称不能为空") + private String bankName; + + @Schema(description = "银行开户行") + private String openingBank; + + @Schema(description = "账户名") + @NotBlank(message = "账户名不能为空") + private String recipientName; + + @Schema(description = "账号") + @NotBlank(message = "账号不能为空") + private String cardNo; + + @Schema(description = "支行名称") + @NotBlank(message = "支行名称不能为空") + private String branchName; + + @Schema(description = "是否默认 1:默认 0:非默认") + private Integer isDefault; + + @Schema(description = "银行卡号") + private String bankCardNo; + + @Schema(description = "银行卡/账户属性 0个人银行卡 1企业对公账户") + private Integer bankCardPro; + + @Schema(description = "支付行号") + private String unionBank; + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public String getOpeningBank() { + return openingBank; + } + + public void setOpeningBank(String openingBank) { + this.openingBank = openingBank; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + @Override + public String toString() { + return "ShopBankCardDTO{" + + "shopBankCardId=" + shopBankCardId + + ", shopId=" + shopId + + ", bankName='" + bankName + '\'' + + ", openingBank='" + openingBank + '\'' + + ", recipientName='" + recipientName + '\'' + + ", cardNo='" + cardNo + '\'' + + ", branchName='" + branchName + '\'' + + ", isDefault=" + isDefault + + ", bankCardNo='" + bankCardNo + '\'' + + ", bankCardPro=" + bankCardPro + + ", unionBank=" + unionBank + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCollectionDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCollectionDTO.java new file mode 100644 index 0000000..12f6ad7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCollectionDTO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户店铺收藏记录DTO + * + * @author lhd + * @date 2021-02-23 14:41:42 + */ +public class ShopCollectionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收藏自增id") + private Long collectionId; + + @Schema(description = "店铺id") + private Long shopId; + + public Long getCollectionId() { + return collectionId; + } + + public void setCollectionId(Long collectionId) { + this.collectionId = collectionId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "UserCollectionShopVO{" + + "collectionId=" + collectionId + + ",shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCompanyAuditingDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCompanyAuditingDTO.java new file mode 100644 index 0000000..8d5f5f4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCompanyAuditingDTO.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 工商信息审核记录 + * + * @author chiley + * @date 2022/9/1 16:15 + */ + +public class ShopCompanyAuditingDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 工商信息审核id + */ + private Long companyAuditingId; + + /** + * 申请人id + */ + @Schema(description = "申请人id") + private Long userId; + + /** + * 店铺id + */ + @Schema(description = "店铺id") + private Long shopId; + + + /** + * 工商信息id + */ + @Schema(description = "工商信息id") + private Long shopCompanyId; + + /** + * 店铺名称 + */ + @Schema(description = "店铺名称") + private String shopName; + + /** + * 审核人id + */ + @Schema(description = "审核人id") + private Long auditorId; + + /** + * 0 未审核 1已通过 -1未通过 + */ + @Schema(description = "0 未审核 1已通过 -1未通过") + @Max(value = 1, message = "最大为1") + @Min(value = -1, message = "最小为-1") + private Integer status; + + @Schema(description = "申请起始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + + @Schema(description = "申请结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "备注") + private String remarks; + + public ShopCompanyAuditingDTO() { + + } + + public ShopCompanyAuditingDTO(Long companyAuditingId, Integer status, String remarks) { + this.companyAuditingId = companyAuditingId; + this.status = status; + this.remarks = remarks; + } + + public Long getCompanyAuditingId() { + return companyAuditingId; + } + + public void setCompanyAuditingId(Long companyAuditingId) { + this.companyAuditingId = companyAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopCompanyId() { + return shopCompanyId; + } + + public void setShopCompanyId(Long shopCompanyId) { + this.shopCompanyId = shopCompanyId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBeginTime() { + return beginTime; + } + + public void setBeginTime(Date beginTime) { + this.beginTime = beginTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "ShopCompanyAuditingDTO{" + + "companyAuditingId=" + companyAuditingId + + ", userId='" + userId + '\'' + + ", shopId=" + shopId + + ", shopCompanyId=" + shopCompanyId + + ", shopName='" + shopName + '\'' + + ", auditorId=" + auditorId + + ", status=" + status + + ", beginTime=" + beginTime + + ", endTime=" + endTime + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCreateInfoDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCreateInfoDTO.java new file mode 100644 index 0000000..ed7e09a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopCreateInfoDTO.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/7/9 15:23 + */ +public class ShopCreateInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商家注册信息") + private ShopUserRegisterDTO shopUserRegisterInfo; + + @Schema(description = "店铺基本信息") + private ShopDetailDTO shopDetail; + + @Schema(description = "店铺工商信息") + private ShopCompanyDTO shopCompany; + + @Schema(description = "签约分类列表") + private List categorySigningList; + + @Schema(description = "签约品牌列表") + private List brandSigningList; + + @Schema(description = "店铺银行卡列表") + private List shopBankCardList; + + @Schema(description = "通联店铺银行卡") + private AllinpayShopBankCardDTO allinpayShopBankCardDTO; + + public ShopUserRegisterDTO getShopUserRegisterInfo() { + return shopUserRegisterInfo; + } + + public void setShopUserRegisterInfo(ShopUserRegisterDTO shopUserRegisterInfo) { + this.shopUserRegisterInfo = shopUserRegisterInfo; + } + + public ShopDetailDTO getShopDetail() { + return shopDetail; + } + + public void setShopDetail(ShopDetailDTO shopDetail) { + this.shopDetail = shopDetail; + } + + public ShopCompanyDTO getShopCompany() { + return shopCompany; + } + + public void setShopCompany(ShopCompanyDTO shopCompany) { + this.shopCompany = shopCompany; + } + + public List getCategorySigningList() { + return categorySigningList; + } + + public void setCategorySigningList(List categorySigningList) { + this.categorySigningList = categorySigningList; + } + + public List getBrandSigningList() { + return brandSigningList; + } + + public void setBrandSigningList(List brandSigningList) { + this.brandSigningList = brandSigningList; + } + + public List getShopBankCardList() { + return shopBankCardList; + } + + public void setShopBankCardList(List shopBankCardList) { + this.shopBankCardList = shopBankCardList; + } + + public AllinpayShopBankCardDTO getAllinpayShopBankCardDTO() { + return allinpayShopBankCardDTO; + } + + public void setAllinpayShopBankCardDTO(AllinpayShopBankCardDTO allinpayShopBankCardDTO) { + this.allinpayShopBankCardDTO = allinpayShopBankCardDTO; + } + + @Override + public String toString() { + return "ShopCreateInfoDTO{" + + "shopUserRegisterInfo=" + shopUserRegisterInfo + + ", shopDetail=" + shopDetail + + ", shopCompany=" + shopCompany + + ", categorySigningList=" + categorySigningList + + ", brandSigningList=" + brandSigningList + + ", shopBankCardList=" + shopBankCardList + + ", allinpayShopBankCardDTO=" + allinpayShopBankCardDTO + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopExtensionDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopExtensionDTO.java new file mode 100644 index 0000000..0a1220a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopExtensionDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 店铺扩张信息DTO + * + * @author YXF + * @date 2021-02-05 15:36:12 + */ +public class ShopExtensionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long shopExtensionId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺商品总销量") + private Integer saleNum; + + @Schema(description = "店铺收藏数量") + private Long collectionNum; + + public Long getShopExtensionId() { + return shopExtensionId; + } + + public void setShopExtensionId(Long shopExtensionId) { + this.shopExtensionId = shopExtensionId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + @Override + public String toString() { + return "ShopExtensionDTO{" + + "shopExtensionId=" + shopExtensionId + + ",shopId=" + shopId + + ",saleNum=" + saleNum + + ",collectionNum=" + collectionNum + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRefundAddrDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRefundAddrDTO.java new file mode 100644 index 0000000..7f7878f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRefundAddrDTO.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家退货地址DTO + * + * @author FrozenWatermelon + * @date 2021-03-09 15:03:18 + */ +public class ShopRefundAddrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商家退货地址id") + private Long shopRefundAddrId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "是否默认地址 1是") + private Integer isDefault; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getShopRefundAddrId() { + return shopRefundAddrId; + } + + public void setShopRefundAddrId(Long shopRefundAddrId) { + this.shopRefundAddrId = shopRefundAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "ShopRefundAddrDTO{" + + "shopRefundAddrId=" + shopRefundAddrId + + ",shopId=" + shopId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",postCode=" + postCode + + ",addr=" + addr + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRenovationDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRenovationDTO.java new file mode 100644 index 0000000..48d3f4a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopRenovationDTO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 店铺装修信息DTO + * + * @author Orange + * @date 2022-08-12 11:27:18 + */ +public class ShopRenovationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺装修id") + private Long renovationId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "装修名称") + private String name; + + @Schema(description = "装修内容") + private String content; + + @Schema(description = "是否主页 1.是 0.不是") + private Integer homeStatus; + + @Schema(description = "装修类型 1.pc 2.移动端") + private Integer renovationType; + + public Long getRenovationId() { + return renovationId; + } + + public void setRenovationId(Long renovationId) { + this.renovationId = renovationId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(Integer homeStatus) { + this.homeStatus = homeStatus; + } + + public Integer getRenovationType() { + return renovationType; + } + + public void setRenovationType(Integer renovationType) { + this.renovationType = renovationType; + } + + @Override + public String toString() { + return "ShopRenovationDTO{" + + "renovationId=" + renovationId + + ",shopId=" + shopId + + ",name=" + name + + ",content=" + content + + ",homeStatus=" + homeStatus + + ",renovationType=" + renovationType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSearchDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSearchDTO.java new file mode 100644 index 0000000..bb3a384 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSearchDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/8 + */ +public class ShopSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺id列表-根据店铺id获取店铺列表") + private List shopIds; + + @Schema(description = "是否优选好店 1.是 0.不是") + private Integer isPreferred; + + @Schema(description = "支付系统类型") + private Integer paySysType; + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "ShopSearchDTO{" + + "shopName='" + shopName + '\'' + + ", shopIds=" + shopIds + + ", isPreferred=" + isPreferred + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSubstituteSalesDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSubstituteSalesDTO.java new file mode 100644 index 0000000..71ea96a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopSubstituteSalesDTO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 代销设置表DTO + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +public class ShopSubstituteSalesDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "代销设置id") + private Long shopSubstituteSalesId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "代销设置类型 0.智能设价 1.手动设价") + private Integer salesType; + + @Schema(description = "默认加价比例 0.按比例加价 1.按固定数值加价") + private Integer salesPriceType; + + @Schema(description = "默认加价比例为0时,代表百分比*100,为1时代表实际奖励金额*100") + private Long salesPrice; + + @Schema(description = "商家收入低于供货价订单形式默认0 0.直接转换为待采购订单 1.通过商家已结算金额扣除差价") + private Integer orderShape; + + @Schema(description = "操作人id") + private Long modifier; + + @Schema(description = "代销设置类型为1才有:供货价高于代销价时是否自动下架:1.是,0.否") + private Integer automaticOff; + + public Integer getAutomaticOff() { + return automaticOff; + } + + public void setAutomaticOff(Integer automaticOff) { + this.automaticOff = automaticOff; + } + + public Integer getOrderShape() { + return orderShape; + } + + public void setOrderShape(Integer orderShape) { + this.orderShape = orderShape; + } + + public Long getShopSubstituteSalesId() { + return shopSubstituteSalesId; + } + + public void setShopSubstituteSalesId(Long shopSubstituteSalesId) { + this.shopSubstituteSalesId = shopSubstituteSalesId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSalesType() { + return salesType; + } + + public void setSalesType(Integer salesType) { + this.salesType = salesType; + } + + public Integer getSalesPriceType() { + return salesPriceType; + } + + public void setSalesPriceType(Integer salesPriceType) { + this.salesPriceType = salesPriceType; + } + + public Long getSalesPrice() { + return salesPrice; + } + + public void setSalesPrice(Long salesPrice) { + this.salesPrice = salesPrice; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "ShopSubstituteSalesDTO{" + + "shopSubstituteSalesId=" + shopSubstituteSalesId + + ", shopId=" + shopId + + ", salesType=" + salesType + + ", salesPriceType=" + salesPriceType + + ", salesPrice=" + salesPrice + + ", orderShape=" + orderShape + + ", modifier=" + modifier + + ", automaticOff=" + automaticOff + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopTemplateDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopTemplateDTO.java new file mode 100644 index 0000000..d272527 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopTemplateDTO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品装修模板表DTO + * + * @author Orange + * @date 2022-08-12 14:04:57 + */ +public class ShopTemplateDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺模板表") + private Long templateId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "装修内容") + private String content; + + @Schema(description = "图片") + private String image; + + @Schema(description = "类型 1.pc 2.移动端") + private Integer type; + + @Schema(description = "备注") + private String remark; + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "ShopTemplateDTO{" + + "templateId=" + templateId + + ",shopId=" + shopId + + ",name=" + name + + ",content=" + content + + ",image=" + image + + ",type=" + type + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletLogSearchDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletLogSearchDTO.java new file mode 100644 index 0000000..2ac2d6c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletLogSearchDTO.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author Pineapple + * @date 2021/6/8 19:56 + */ +public class ShopWalletLogSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺收支类型 0支出 1收入") + private Integer shopIoType; + + @Schema(description = "平台收支类型 0支出 1收入") + private Integer platformIoType; + + @Schema(description = "金额类型 0 未结算金额 1可提现金额 2冻结金额") + private Integer amountType; + + @Schema(description = "原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝") + private Integer reason; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "店铺id列表,勾选导出") + private List shopIds; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + @Schema(description = "通联充值单号") + private Long bizOrderNo; + + @Schema(description = "通联充值状态 0.待支付 1.申请成功(还没确认) 2.充值成功 3.充值失败") + private Integer allinpayStatus; + + public Integer getShopIoType() { + return shopIoType; + } + + public void setShopIoType(Integer shopIoType) { + this.shopIoType = shopIoType; + } + + public Integer getPlatformIoType() { + return platformIoType; + } + + public void setPlatformIoType(Integer platformIoType) { + this.platformIoType = platformIoType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Integer getSortType() { + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + public Long getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(Long bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public Integer getAllinpayStatus() { + return allinpayStatus; + } + + public void setAllinpayStatus(Integer allinpayStatus) { + this.allinpayStatus = allinpayStatus; + } + + @Override + public String toString() { + return "ShopWalletLogSearchDTO{" + + "shopIoType=" + shopIoType + + ", platformIoType=" + platformIoType + + ", amountType=" + amountType + + ", reason=" + reason + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", shopIds=" + shopIds + + ", sortType=" + sortType + + ", bizOrderNo=" + bizOrderNo + + ", allinpayStatus=" + allinpayStatus + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletRechargeOrderDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletRechargeOrderDTO.java new file mode 100644 index 0000000..e32a005 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWalletRechargeOrderDTO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商家店铺余额充值记录 + * + * @author chiley + */ +public class ShopWalletRechargeOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值金额id") + private Long rechargeId; + @Schema(description = "充值金额") + private BigDecimal amount; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "ShopWalletRechargeOrderDTO{" + + "rechargeId=" + rechargeId + + ", amount=" + amount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWithdrawCashConfigDto.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWithdrawCashConfigDto.java new file mode 100644 index 0000000..5f04dd9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWithdrawCashConfigDto.java @@ -0,0 +1,53 @@ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class ShopWithdrawCashConfigDto implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "最少提现金额") + private Double withdrawCashLeast; + @Schema(description = "最多提现金额") + private Double withdrawCashMax; + @Schema(description = "提现金额频率") + private Integer frequency; + @Schema(description = "提现金额次数") + private Integer number; + + public Double getWithdrawCashLeast() { + return withdrawCashLeast; + } + + public void setWithdrawCashLeast(Double withdrawCashLeast) { + this.withdrawCashLeast = withdrawCashLeast; + } + + public Double getWithdrawCashMax() { + return withdrawCashMax; + } + + public void setWithdrawCashMax(Double withdrawCashMax) { + this.withdrawCashMax = withdrawCashMax; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWithdrawCashDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWithdrawCashDTO.java new file mode 100644 index 0000000..1765639 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/dto/ShopWithdrawCashDTO.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家提现申请信息DTO + * @author FrozenWatermelon + */ +public class ShopWithdrawCashDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现id") + private Long cashId; + + @Schema(description = "支付系统类型0默认1通联") + private Integer paySysType; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "提现金额") + private Long amount; + + @Schema(description = "审核时间") + private Date auditingTime; + + @Schema(description = "状态(0:未审核、1:已通过 -1:未通过 2:发放成功 3:发放失败)") + private Integer status; + + @Schema(description = "平台备注") + private String remarks; + + @Schema(description = "店铺备注") + private String shopRemarks; + + @Schema(description = "付款户名") + private String payingAccount; + + @Schema(description = "汇款账户") + private String payingCardNo; + + @Schema(description = "汇款时间") + private Date payingTime; + + @Schema(description = "收款银行卡id") + private Long shopBankCardId; + + @Schema(description = "验证码") + private String validCode; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "通联提现状态 0.待支付 1.申请成功(还没确认) 2.提现成功 3.提现失败") + private Integer allinpayStatus; + + @Schema(description = "通联提现订单号") + private String bizOrderNo; + + @Schema(description = "提现失败原因") + private String payFailMessage; + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public String getPayingAccount() { + return payingAccount; + } + + public void setPayingAccount(String payingAccount) { + this.payingAccount = payingAccount; + } + + public String getPayingCardNo() { + return payingCardNo; + } + + public void setPayingCardNo(String payingCardNo) { + this.payingCardNo = payingCardNo; + } + + public Date getPayingTime() { + return payingTime; + } + + public void setPayingTime(Date payingTime) { + this.payingTime = payingTime; + } + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + public Integer getAllinpayStatus() { + return allinpayStatus; + } + + public void setAllinpayStatus(Integer allinpayStatus) { + this.allinpayStatus = allinpayStatus; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + @Override + public String toString() { + return "ShopWithdrawCashDTO{" + + "cashId=" + cashId + + ", paySysType=" + paySysType + + ", shopId=" + shopId + + ", auditorId=" + auditorId + + ", amount=" + amount + + ", auditingTime=" + auditingTime + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", shopRemarks='" + shopRemarks + '\'' + + ", payingAccount='" + payingAccount + '\'' + + ", payingCardNo='" + payingCardNo + '\'' + + ", payingTime=" + payingTime + + ", shopBankCardId=" + shopBankCardId + + ", validCode='" + validCode + '\'' + + ", shopName='" + shopName + '\'' + + ", allinpayStatus=" + allinpayStatus + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/OrderShopDetailFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/OrderShopDetailFeignController.java new file mode 100644 index 0000000..6b545e4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/OrderShopDetailFeignController.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.order.constant.ShopType; +import com.tmerclub.cloud.common.order.feign.OrderShopDetailFeignClient; +import com.tmerclub.cloud.common.order.vo.ShopInfoInOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +@DubboService +public class OrderShopDetailFeignController implements OrderShopDetailFeignClient { + @Autowired + private ShopDetailService shopDetailService; + + @Override + public ServerResponseEntity getShopInfoInOrderByShopId(Long shopId) { + ShopDetailVO shopDetail = shopDetailService.getByShopId(shopId); + ShopInfoInOrderVO shopInfoInOrderVO = new ShopInfoInOrderVO(); + if (Objects.isNull(shopDetail)) { + shopInfoInOrderVO.setShopName(""); + // 普通店 + shopInfoInOrderVO.setType(ShopType.STOP.value()); + return ServerResponseEntity.success(shopInfoInOrderVO); + } + shopInfoInOrderVO.setShopName(shopDetail.getShopName()); + shopInfoInOrderVO.setType(shopDetail.getType()); + return ServerResponseEntity.success(shopInfoInOrderVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopBankCardFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopBankCardFeignController.java new file mode 100644 index 0000000..9673e43 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopBankCardFeignController.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.ShopBankCardFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.mapper.ShopBankCardMapper; +import com.tmerclub.cloud.multishop.model.ShopBankCard; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Objects; + +/** + * @author track + */ +@DubboService +public class ShopBankCardFeignController implements ShopBankCardFeignClient { + + @Autowired + private ShopBankCardMapper shopBankCardMapper; + + @Override + public void saveBandCardByAllinpay(String tenantId, ShopBankCardVO shopBankCardVO) { + ShopBankCard shopBankCard = new ShopBankCard(); + BeanUtils.copyProperties(shopBankCardVO, shopBankCard); + shopBankCard.setShopId(Long.valueOf(tenantId.substring(AllinpayConstant.SHOP_LENGTH))); + shopBankCard.setStatus(StatusEnum.ENABLE.value()); + shopBankCardMapper.save(shopBankCard); + } + + @Override + public ServerResponseEntity deleteLegalBankCard(Long shopBankCardId) { + ShopBankCardVO shopBankCardVO = shopBankCardMapper.getByShopBankCardId(shopBankCardId); + if (Objects.nonNull(shopBankCardVO) && Objects.equals(shopBankCardVO.getBankCardPro(), 1)) { + throw new LuckException("企业对公户不支持解绑"); + } + shopBankCardMapper.deleteById(shopBankCardId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopRenovationFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopRenovationFeignController.java new file mode 100644 index 0000000..29973e2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopRenovationFeignController.java @@ -0,0 +1,32 @@ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.ShopRenovationFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopRenovationVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.model.ShopRenovation; +import com.tmerclub.cloud.multishop.service.ShopRenovationService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Objects; + +/** + * @author TRACK + */ +@DubboService +public class ShopRenovationFeignController implements ShopRenovationFeignClient { + + @Autowired + private ShopRenovationService shopRenovationService; + + @Override + public ServerResponseEntity getbyRenovationId(Long renovationId) { + ShopRenovation shopRenovation = shopRenovationService.getByRenovationId(renovationId); + if (Objects.isNull(shopRenovation)) { + return ServerResponseEntity.success(null); + } + ShopRenovationVO shopRenovationVO = BeanUtil.map(shopRenovation, ShopRenovationVO.class); + return ServerResponseEntity.success(shopRenovationVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopUserFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopUserFeignController.java new file mode 100644 index 0000000..86953a0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopUserFeignController.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.service.ShopUserService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +/** + * @author lanhai + */ +@DubboService +public class ShopUserFeignController implements ShopUserFeignClient { + @Autowired + private ShopUserService shopUserService; + + + @Override + public ServerResponseEntity getByUserId(Long userId) { + ShopUserVO shopUserVO = BeanUtil.map(shopUserService.getByUserId(userId), ShopUserVO.class); + return ServerResponseEntity.success(shopUserVO); + } + + + @Override + public ShopUserVO getSimpleByUserId(Long userId) { + ShopUserVO shopUserVO = BeanUtil.map(shopUserService.getSimpleByUserId(userId), ShopUserVO.class); + return shopUserVO; + } + + @Override + public List getImShopUserList(List userIds) { + return BeanUtil.mapAsList(shopUserService.listShopUserByUserIds(userIds), ShopUserVO.class); + } + + @Override + public ServerResponseEntity countAccoutByMobile(String mobile) { + return ServerResponseEntity.success(shopUserService.countAccoutByMobile(mobile)); + } + + @Override + public ServerResponseEntity getShopUserIdByShopId(Long shopId) { + return ServerResponseEntity.success(shopUserService.getUserIdByShopId(shopId)); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWalletFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWalletFeignController.java new file mode 100644 index 0000000..f06d405 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWalletFeignController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.service.ShopRechargeService; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author chiley + * @date 2022/6/30 16:55 + */ +@DubboService +public class ShopWalletFeignController implements ShopWalletFeignClient { + + @Autowired + private ShopWalletService shopWalletService; + @Autowired + private ShopRechargeService shopRechargeService; + + @Override + public ServerResponseEntity getSettlementAmountByShopId(Long shopId, Integer paySysType) { + return ServerResponseEntity.success(shopWalletService.getSettlementAmountByShopId(shopId, paySysType)); + } + + @Override + public void subSettlementAmount(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + shopWalletService.subSettlementAmount(orderChangeShopWalletAmountBO.getActualTotal(), orderChangeShopWalletAmountBO, null, false); + } + + @Override + public ServerResponseEntity rechargeBack(String bizOrderNo, String payStatus, String bizUserId) { + shopRechargeService.rechargeBack(bizOrderNo, payStatus, bizUserId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWithdrawCashFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWithdrawCashFeignController.java new file mode 100644 index 0000000..937f297 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/feign/ShopWithdrawCashFeignController.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.feign; + +import com.tmerclub.cloud.api.multishop.feign.ShopWithdrawCashFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.service.ShopWithdrawCashService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author track + */ +@DubboService +public class ShopWithdrawCashFeignController implements ShopWithdrawCashFeignClient { + + @Autowired + private ShopWithdrawCashService shopWithdrawCashService; + + @Override + public ServerResponseEntity withdrawBack(String bizOrderNo, String payStatus, String bizUserId, String payFailMessage) { + shopWithdrawCashService.withdrawBack(bizOrderNo, payStatus, bizUserId, payFailMessage); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/AddShopWalletLogConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/AddShopWalletLogConsumer.java new file mode 100644 index 0000000..62e9581 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/AddShopWalletLogConsumer.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 添加店铺钱包日志至MongoDB + * @author 菠萝凤梨 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, consumerGroup = RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC) +public class AddShopWalletLogConsumer implements RocketMQListener> { + private static final Logger LOG = LoggerFactory.getLogger(AddShopWalletLogConsumer.class); + + @Autowired + private ShopWalletLogService shopWalletLogService; + + @Override + public void onMessage(List message) { + LOG.info("通知添加店铺钱包日志至MongoDB开始... message: {}", Json.toJsonString(message)); + shopWalletLogService.saveMongoBatch(message); + LOG.info("添加店铺钱包日志结束"); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/DistributionNotifyShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/DistributionNotifyShopConsumer.java new file mode 100644 index 0000000..b1e8e1f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/DistributionNotifyShopConsumer.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.distribution.bo.DistributionNotifyOrderAndShopBO; +import com.tmerclub.cloud.api.multishop.bo.ShopWalletBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 分销通知修改店铺钱包 + * @author cl + * @date 2021-08-19 13:29:55 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.DISTRIBUTION_NOTIFY_ORDER_SHOP_TOPIC, consumerGroup = RocketMqConstant.DISTRIBUTION_NOTIFY_SHOP_GROUP) +public class DistributionNotifyShopConsumer implements RocketMQListener { + private static final Logger LOG = LoggerFactory.getLogger(DistributionNotifyShopConsumer.class); + + @Autowired + private ShopWalletService shopWalletService; + + @Override + public void onMessage(DistributionNotifyOrderAndShopBO message) { + List shopWalletBOList = message.getShopWalletBOList(); + if (CollUtil.isEmpty(shopWalletBOList)) { + return; + } + LOG.info("分销金额计算完成后,分销通知修改店铺钱包回调开始... message: {}", Json.toJsonString(shopWalletBOList)); + shopWalletService.updateByDistributionAmount(shopWalletBOList); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderNotifyShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderNotifyShopConsumer.java new file mode 100644 index 0000000..1542ce7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderNotifyShopConsumer.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.service.ShopSubstituteSalesService; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_SHOP_GROUP) +public class OrderNotifyShopConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifyShopConsumer.class); + + @Autowired + private ShopWalletService shopWalletService; + + @Autowired + private ShopSubstituteSalesService shopSubstituteSalesService; + + @DubboReference + private OrderFeignClient orderFeignClient; + + + /** + * 订单支付成功 分账 + */ + @Override + public void onMessage(PayNotifyBO message) { + // 定金预售订单付定金时不用全部分账 + boolean isPreSale = Objects.nonNull(message.getPreSaleType()) && Objects.equals(message.getPreSaleType(), PreSaleType.DEPOSIT.value()) + && Objects.equals(message.getOrderStatus(), OrderStatus.UNPAY.value()); + if (isPreSale) { + return; + } + LOG.info("订单支付成功,分账... message:{} ", Json.toJsonString(message)); + + ServerResponseEntity> ordersShopWalletInfoResponse = orderFeignClient.getOrdersSimpleAmountInfo(message.getOrderIds()); + if (!ordersShopWalletInfoResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + List orderShopWalletInfos = ordersShopWalletInfoResponse.getData(); + List shopIds = orderShopWalletInfos.stream().map(OrderSimpleAmountInfoBO::getShopId).collect(Collectors.toList()); + List defaultShopIds = orderShopWalletInfos.stream().filter(o -> Objects.equals(o.getPaySysType(), PaySysType.DEFAULT.value())).map(OrderSimpleAmountInfoBO::getShopId).collect(Collectors.toList()); + List allinpayShopIds = orderShopWalletInfos.stream().filter(o -> Objects.equals(o.getPaySysType(), PaySysType.ALLINPAY.value())).map(OrderSimpleAmountInfoBO::getShopId).collect(Collectors.toList()); + // 获取店铺已结算金额map + Map settledAmountMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(allinpayShopIds)) { + List allinpayList = shopWalletService.listByShopIds(allinpayShopIds, PaySysType.ALLINPAY.value()); + for (ShopWalletVO shopWalletVO : allinpayList) { + settledAmountMap.put(shopWalletVO.getShopId() + ":" + PaySysType.ALLINPAY.value(), shopWalletVO.getSettledAmount()); + } + } + if (CollUtil.isNotEmpty(defaultShopIds)) { + List shopWalletList = shopWalletService.listByShopIds(defaultShopIds, PaySysType.DEFAULT.value()); + for (ShopWalletVO shopWalletVO : shopWalletList) { + settledAmountMap.put(shopWalletVO.getShopId() + ":" + PaySysType.DEFAULT.value(), shopWalletVO.getSettledAmount()); + } + } + // 根据shopIds获取商家的代销配置 + List shopSubstituteSalesList = shopSubstituteSalesService.listByShopIds(shopIds); + Map salesMap = shopSubstituteSalesList.stream().collect(Collectors.toMap(ShopSubstituteSalesVO::getShopId, ShopSubstituteSalesVO::getOrderShape)); + // 筛选掉需要采购和采购完成的 + orderShopWalletInfos = orderShopWalletInfos.stream().filter(orderSimpleAmountInfoBO -> Objects.equals(orderSimpleAmountInfoBO.getWaitPurchase(), 0)).collect(Collectors.toList()); + shopWalletService.addAmountByOrder(orderShopWalletInfos, message, settledAmountMap, salesMap); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderPurchaseNotifyShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderPurchaseNotifyShopConsumer.java new file mode 100644 index 0000000..6d2a5ca --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderPurchaseNotifyShopConsumer.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.service.ShopSubstituteSalesService; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import org.apache.dubbo.config.annotation.DubboReference; +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.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_PURCHASE_NOTIFY_SHOP_TOPIC, consumerGroup = RocketMqConstant.ORDER_PURCHASE_NOTIFY_SHOP_TOPIC) +public class OrderPurchaseNotifyShopConsumer implements RocketMQListener { + + @Autowired + private ShopWalletService shopWalletService; + + @Autowired + private ShopSubstituteSalesService shopSubstituteSalesService; + + @DubboReference + private OrderFeignClient orderFeignClient; + + + /** + * 订单支付成功 分账 + */ + @Override + public void onMessage(PayNotifyBO message) { + + ServerResponseEntity> ordersShopWalletInfoResponse = orderFeignClient.getOrdersSimpleAmountInfo(message.getOrderIds()); + if (!ordersShopWalletInfoResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + List orderShopWalletInfos = ordersShopWalletInfoResponse.getData(); + List shopIds = orderShopWalletInfos.stream().map(OrderSimpleAmountInfoBO::getShopId).collect(Collectors.toList()); + List allinpayShopIds = orderShopWalletInfos.stream().filter(o -> Objects.equals(o.getPaySysType(), PaySysType.ALLINPAY.value())).map(OrderSimpleAmountInfoBO::getShopId).collect(Collectors.toList()); + List defaultShopIds = orderShopWalletInfos.stream().filter(o -> Objects.equals(o.getPaySysType(), PaySysType.DEFAULT.value())).map(OrderSimpleAmountInfoBO::getShopId).collect(Collectors.toList()); + // 获取店铺已结算金额map + Map settledAmountMap = new HashMap<>(1); + if (CollUtil.isNotEmpty(defaultShopIds)) { + List shopWalletList = shopWalletService.listByShopIds(defaultShopIds, PaySysType.DEFAULT.value()); + for (ShopWalletVO shopWalletVO : shopWalletList) { + settledAmountMap.put(shopWalletVO.getShopId() + ":" + PaySysType.DEFAULT.value(), shopWalletVO.getSettledAmount()); + } + } + if (CollUtil.isNotEmpty(allinpayShopIds)) { + List allinpayList = shopWalletService.listByShopIds(allinpayShopIds, PaySysType.ALLINPAY.value()); + for (ShopWalletVO shopWalletVO : allinpayList) { + settledAmountMap.put(shopWalletVO.getShopId() + ":" + PaySysType.ALLINPAY.value(), shopWalletVO.getSettledAmount()); + } + } + // 根据shopIds获取商家的代销配置 + List shopSubstituteSalesList = shopSubstituteSalesService.listByShopIds(shopIds); + Map salesMap = shopSubstituteSalesList.stream().collect(Collectors.toMap(ShopSubstituteSalesVO::getShopId, ShopSubstituteSalesVO::getOrderShape)); + shopWalletService.addAmountByOrder(orderShopWalletInfos, message, settledAmountMap, salesMap); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderReceiptShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderReceiptShopConsumer.java new file mode 100644 index 0000000..7a83ac6 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderReceiptShopConsumer.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +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 FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_SETTLED_SHOP_TOPIC, consumerGroup = RocketMqConstant.ORDER_SETTLED_SHOP_TOPIC) +public class OrderReceiptShopConsumer implements RocketMQListener> { + + @Autowired + private ShopWalletService shopWalletService; + + /** + * 结束周期完成,结算给商家 + */ + @Override + public void onMessage(List changeShopWalletAmountList) { + for (OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO : changeShopWalletAmountList) { + shopWalletService.addAmountBySettledOrder(orderChangeShopWalletAmountBO); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderRefundSettlementShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderRefundSettlementShopConsumer.java new file mode 100644 index 0000000..f50fb7d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderRefundSettlementShopConsumer.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_TOPIC) +public class OrderRefundSettlementShopConsumer implements RocketMQListener { + private static final Logger LOGGER = LoggerFactory.getLogger(OrderRefundSettlementShopConsumer.class); + + @Autowired + private ShopWalletService shopWalletService; + + /** + * 订单部分退款导致订单关闭 商家结算操作 + */ + @Override + public void onMessage(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + // 如果是待采购,则使用待采购金额计算 + if (Objects.equals(orderChangeShopWalletAmountBO.getWaitPurchase(), 1)) { + LOGGER.info("待采购订单退款导致订单关闭,商家结算{}", orderChangeShopWalletAmountBO); + shopWalletService.settlementShopAmountByRefundAndWaitPur(orderChangeShopWalletAmountBO); + } else { + LOGGER.info("普通订单退款导致订单关闭,商家结算{}", orderChangeShopWalletAmountBO); + shopWalletService.settlementShopAmountByRefund(orderChangeShopWalletAmountBO); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderRefundShopConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderRefundShopConsumer.java new file mode 100644 index 0000000..70863b0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/OrderRefundShopConsumer.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SHOP_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SHOP_TOPIC) +public class OrderRefundShopConsumer implements RocketMQListener { + private static final Logger LOGGER = LoggerFactory.getLogger(OrderRefundShopConsumer.class); + + @Autowired + private ShopWalletService shopWalletService; + + /** + * 订单退款 商家减少余额 + */ + @Override + public void onMessage(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + // 如果是待采购,则使用待采购金额计算 + if (Objects.equals(orderChangeShopWalletAmountBO.getWaitPurchase(), 1)) { + LOGGER.info("待采购订单退款,商家减少余额{}", orderChangeShopWalletAmountBO); + shopWalletService.refundShopAmountByRefundAndWaitPur(orderChangeShopWalletAmountBO); + } else { + LOGGER.info("普通订单退款,商家减少余额{}", orderChangeShopWalletAmountBO); + shopWalletService.refundShopAmountByRefund(orderChangeShopWalletAmountBO); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/ShopRechargeSuccessConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/ShopRechargeSuccessConsumer.java new file mode 100644 index 0000000..c09d0e9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/listener/ShopRechargeSuccessConsumer.java @@ -0,0 +1,31 @@ +package com.tmerclub.cloud.multishop.listener; + +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 添加店铺钱包日志至MongoDB + * @author 菠萝凤梨 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.UPDATE_SHOP_RECHARGE_SUCCESS_TOPIC, consumerGroup = RocketMqConstant.UPDATE_SHOP_RECHARGE_SUCCESS_TOPIC) +public class ShopRechargeSuccessConsumer implements RocketMQListener { + private static final Logger LOG = LoggerFactory.getLogger(ShopRechargeSuccessConsumer.class); + + @Autowired + private ShopWalletLogService shopWalletLogService; + + @Override + public void onMessage(RechargeNotifyBO message) { + LOG.info("店铺余额支付成功更新店铺钱包日志回调开始... message: {}", Json.toJsonString(message)); + shopWalletLogService.updateRechargeSuccess(message.getBalanceLogId(), message.getPayId()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/NoticeMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/NoticeMapper.java new file mode 100644 index 0000000..a73d58b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/NoticeMapper.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.NoticeDTO; +import com.tmerclub.cloud.multishop.model.Notice; +import com.tmerclub.cloud.multishop.vo.NoticeVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 公告 + * + * @author YXF + * @date 2020-11-25 17:57:56 + */ +public interface NoticeMapper { + + /** + * 获取公告列表 + * * @param noticeDTO 搜索参数 + * @return 公告列表 + */ + List list(@Param("notice") NoticeDTO noticeDTO); + + /** + * 根据公告id获取公告 + * + * @param id 公告id + * @return 公告 + */ + NoticeVO getById(@Param("id") Long id); + + /** + * 根据公告id改变公告已读状态 + * + * @param id + */ + void updateIsLearning(@Param("id") Long id); + + /** + * 保存公告 + * + * @param notice 公告 + */ + void save(@Param("notice") Notice notice); + + /** + * 更新公告 + * + * @param notice 公告 + */ + void update(@Param("notice") Notice notice); + + /** + * 根据公告id删除公告 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 批量保存公告 + * @param noticeList + */ + void saveBatch(@Param("noticeList") List noticeList); + + /** + * 根据信息获取 + * @param noticeDTO + * @return + */ + List listAllByTypeAndShopId(@Param("notice") NoticeDTO noticeDTO); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopCompanyMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopCompanyMapper.java new file mode 100644 index 0000000..0cbc3f3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopCompanyMapper.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.model.ShopCompany; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/4/25 15:52 + */ +public interface ShopCompanyMapper { + /** + * 根据店铺id获取店铺工商信息 + * @param shopId + * @param status + * @return + */ + ShopCompanyVO getShopCompanyByShopIdAndStatus(@Param("shopId") Long shopId, @Param("status") Integer status); + + /** + * 根据店铺工商信息id获取店铺工商信息 + * + * @param shopCompanyId 店铺工商信息id + * @return 店铺工商信息 + */ + ShopCompany getByShopCompanyId(@Param("shopCompanyId") Long shopCompanyId); + + /** + * 保存店铺工商信息 + * @param shopCompany 店铺工商信息 + */ + void save(@Param("shopCompany") ShopCompany shopCompany); + + /** + * 更新店铺工商信息 + * @param shopCompany 店铺工商信息 + */ + void update(@Param("shopCompany") ShopCompany shopCompany); + + /** + * 根据店铺id更新店铺工商信息 + * @param shopCompany + * @param shopId + * @param temp 0代表通过审核,1代表平台修改 + */ + void updateByShopId(@Param("shopCompany") ShopCompany shopCompany, @Param("shopId") Long shopId, @Param("temp") Integer temp); + + /** + * 根据店铺id更改店铺工商信息状态 + * @param shopId + * @param status + * @param dbStatus 数据库原状态 + */ + void batchUpdateStatus(@Param("shopId") Long shopId, @Param("status") Integer status, @Param("dbStatus") Integer dbStatus); + + /** + * 根据信用编码查询对应的店铺Id + * @param creditCode + * @return + */ + List getShopIdByCreditCode(@Param("creditCode") String creditCode); + /** + * 根据店铺id和审核状态删除店铺工商信息 + * @param shopId + * @param status 审核状态 + * @return + */ + void deleteByShopIdAndStatus(@Param("shopId") Long shopId, @Param("status") Integer status); + + /** + * 查询店铺最近创建的工商信息状态 + * @param shopId + * @return + */ + Integer getLatestRecord(Long shopId); + + /** + * 根据店铺id更新店铺工商信息 + * @param shopCompany 店铺工商信息 + */ + void updateById(@Param("shopCompany") ShopCompany shopCompany); + + /** + * 更新工商信息的影印件信息 + * @param shopCompanyVO + */ + void updateIdCardById(@Param("shopCompany") ShopCompanyVO shopCompanyVO); + + /** + * 更新正常的商家工商信息为待审核 + */ + void updateStatusToWaitAudit(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopDetailMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopDetailMapper.java new file mode 100644 index 0000000..66e5949 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopDetailMapper.java @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.multishop.dto.ShopDetailDTO; +import com.tmerclub.cloud.multishop.dto.ShopSearchDTO; +import com.tmerclub.cloud.multishop.model.ShopDetail; +import com.tmerclub.cloud.multishop.vo.ShopDetailAppVO; +import com.tmerclub.cloud.multishop.vo.ShopHeadInfoVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 店铺详情 + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public interface ShopDetailMapper { + + /** + * 获取店铺详情列表 + * + * @param shopDetailDTO 店铺搜索数据 + * @return 店铺详情列表 + */ + List list(@Param("shopDetail") ShopDetailDTO shopDetailDTO); + + /** + * 根据店铺详情id获取店铺详情 + * + * @param shopId 店铺详情id + * @return 店铺详情 + */ + ShopDetailVO getByShopId(@Param("shopId") Long shopId); + + /** + * 保存店铺详情 + * + * @param shopDetail 店铺详情 + */ + void save(@Param("shopDetail") ShopDetail shopDetail); + + /** + * 更新店铺详情 + * + * @param shopDetail 店铺详情 + */ + void update(@Param("shopDetail") ShopDetail shopDetail); + + /** + * 根据店铺详情id删除店铺详情 + * + * @param shopId + */ + void deleteById(@Param("shopId") Long shopId); + + /** + * 根据店铺id列表,获取店铺信息 + * @param shopIds 店铺id列表 + * @return 店铺列表 + */ + List listByShopIds(@Param("shopIds") List shopIds); + + /** + * 根据店铺id获取店铺详情 + * + * @param shopId 店铺详情id + * @return 店铺详情 + */ + ShopDetailVO getShopByShopId(Long shopId); + + /** + * 店铺搜索列表 + * + * @param shopDetailDTO + * @return + */ + List shopSearchList(@Param("shopDetail") ShopDetailDTO shopDetailDTO); + + /** + * 统计该店铺名被其他用户使用的数量 + * + * @param shopName + * @param shopId + * @return + */ + int countShopName(@Param("shopName") String shopName, @Param("shopId") Long shopId); + + /** + * 改变店铺状态 + * + * @param shopId + * @param shopStatus + */ + void changeShopStatus(@Param("shopId") Long shopId, @Param("shopStatus") Integer shopStatus); + + /** + * 获取店铺信息及扩展信息 + * + * @param shopId + * @return + */ + EsShopDetailBO shopExtensionData(@Param("shopId") Long shopId); + + /** + * 获取店铺信息及扩展信息 + * @param shopIds 店铺ids + * @param shopName 店铺名称 + * @return 店铺信息列表 + */ + List getShopDetailByShopIdsShopName(@Param("shopIds") List shopIds, @Param("shopName") String shopName); + + /** + * 根据店铺id获取店铺扩展信息 + * @param shopId 店铺id + * @return 店铺扩展信息 + */ + ShopDetailVO getShopExtensionsByShopId(Long shopId); + + /** + * 根据手机号获取存在店铺的数量 + * @param mobile 手机号 + * @return 数量 + */ + Integer countByMobile(String mobile); + + /** + * 根据店铺状态查询店铺数量 + * @param shopStatus + * @return + */ + Long countByShopStatus(@Param("shopStatus") Integer shopStatus); + + /** + * 根据签约时间修改店铺状态 + * @param now + */ + void changeShopStatusByContractTime(@Param("now") Date now); + + /** + * 根据当前时间获取状态需要改变为停业状态的店铺id列表 + * @param now + * @return + */ + List listShopIdsOfStatusChangeToStopByContractTime(@Param("now") Date now); + + /** + * 根据当前时间获取状态需要改变为营业状态的店铺id列表 + * @param now + * @return + */ + List listShopIdsOfStatusChangeToOpenByContractTime(@Param("now") Date now); + + + /** + * 根据参数获取店铺id列表 + * @param shopSimpleBO + * @return + */ + List listSimple(@Param("shopSimpleBO") ShopSimpleBO shopSimpleBO); + + /** + * 根据店铺状态获取店铺id列表 + * @param shopStatus + * @return + */ + List getShopIdsByShopStatus(@Param("shopStatus") Integer shopStatus); + + /** + * 根据店铺名称模糊查询id + * @param name + * @return + */ + List selectShopIdsLikeName(@Param("name") String name); + + /** + * 平台分页获取装修的店铺信息 + * @param shopSearchDTO + * @return + */ + List searchShops(@Param("shopSearchDTO") ShopSearchDTO shopSearchDTO); + + /** + * 用户分页获取装修的店铺信息 + * @param shopSearchDTO + * @return + */ + List apiSearchShops(@Param("shopSearchDTO") ShopSearchDTO shopSearchDTO); + + /** + * 店铺列表(营业、停业状态) + * + * @param shopSearchDTO + * @return + */ + List listRenovationShop(@Param("shopSearchDTO") ShopSearchDTO shopSearchDTO); + + /** + * 获取还没创建会员的商家id列表 + * @return + */ + List listUnCreateMemberShopIds(); + + /** + * 更新商家为停业状态,并且更新为已经创建会员 + * @param shopIds + */ + void updateShopToStop(@Param("shopIds") List shopIds); + + /** + * 更新商家为开店申请中,并且更新为已经创建会员 + * @param shopIds + */ + void updateShopToApplying(@Param("shopIds") List shopIds); + + /** + * 更新商家已经创建通联会员账号 + * @param shopIds + */ + void updateShopIsCreate(@Param("shopIds") List shopIds); + + /** + * 更新通联店铺状态 + * @param shopId + * @param status + */ + void updateAllinpayShopStatus(@Param("shopId") Long shopId, @Param("status") Integer status); + + /** + * 更新店铺为通联审核通过 + * @param shopId + */ + void updateShopAuditSuccess(@Param("shopId") Long shopId); + + /** + * 更新店铺为通联审核失败 + * @param shopId + */ + void updateShopAuditFail(@Param("shopId") Long shopId); + + /** + * 更新商家影印件采集状态 + * @param shopId + * @param status + */ + void updateAllinpayIdCardStatus(@Param("shopId") Long shopId, @Param("status") Integer status); + + /** + * 更新店铺为通联开业 + * @param shopId + */ + void updateShopToOpen(@Param("shopId") Long shopId); + + /** + * 更新店铺为通联上线待审核 + * @param shopId + */ + void updateShopToWaitAudit(@Param("shopId") Long shopId); + + /** + * 更新店铺绑定通联手机号码状态 + * @param shopId + * @param status 0否1是 + */ + void updateShopBindPhone(@Param("shopId") Long shopId, @Param("status") Integer status); + + /** + * 保存编号 + * @param shopId + * @param signAcctType + * @param acctProtocolNo + */ + void updateAcctProtocolNoByType(@Param("shopId") Long shopId, @Param("type") Integer signAcctType, @Param("acctProtocolNo") String acctProtocolNo); + + /** + * 获取所有未删除的店铺id + * @return + */ + List listShopIds(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopRenovationMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopRenovationMapper.java new file mode 100644 index 0000000..8e8df36 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopRenovationMapper.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.model.ShopRenovation; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 店铺装修信息 + * + * @author Orange + * @date 2022-08-12 11:27:18 + */ +public interface ShopRenovationMapper { + + /** + * 获取店铺装修信息列表 + * @param shopRenovation + * @return 店铺装修信息列表 + */ + List list(@Param("shopRenovation") ShopRenovation shopRenovation); + + /** + * 根据店铺装修信息id获取店铺装修信息 + * + * @param renovationId 店铺装修信息id + * @return 店铺装修信息 + */ + ShopRenovation getByRenovationId(@Param("renovationId") Long renovationId); + + /** + * 根据店铺id和装修类型获取装修信息 + * @param shopId + * @param renovationType + * @return + */ + ShopRenovation getByShopIdAndRenovationType(@Param("shopId") Long shopId, @Param("renovationType") Integer renovationType); + + /** + * 保存店铺装修信息 + * @param shopRenovation 店铺装修信息 + */ + void save(@Param("shopRenovation") ShopRenovation shopRenovation); + + /** + * 更新店铺装修信息 + * @param shopRenovation 店铺装修信息 + */ + void update(@Param("shopRenovation") ShopRenovation shopRenovation); + + /** + * 根据店铺装修信息id删除店铺装修信息 + * @param renovationId + */ + void deleteById(@Param("renovationId") Long renovationId); + + /** + * 更新主页状态 + * @param shopId + * @param renovationType + */ + void updateHomeStatus(@Param("shopId") Long shopId, @Param("renovationType") Integer renovationType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopSubstituteSalesMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopSubstituteSalesMapper.java new file mode 100644 index 0000000..bcaf45d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopSubstituteSalesMapper.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.model.ShopSubstituteSales; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 代销设置表 + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +public interface ShopSubstituteSalesMapper { + + /** + * 获取代销设置表列表 + * @return 代销设置表列表 + */ + List list(); + + /** + * 根据店铺id获取代销设置表 + * + * @param shopId 店铺设置表id + * @return 代销设置表 + */ + ShopSubstituteSalesVO getByShopSubstituteSalesId(@Param("shopId") Long shopId); + + /** + * 保存代销设置表 + * @param shopSubstituteSales 代销设置表 + */ + void save(@Param("shopSubstituteSales") ShopSubstituteSales shopSubstituteSales); + + /** + * 更新代销设置表 + * @return + * @param shopSubstituteSales 代销设置表 + */ + int update(@Param("shopSubstituteSales") ShopSubstituteSales shopSubstituteSales); + + /** + * 根据代销设置表id删除代销设置表 + * @param shopSubstituteSalesId + */ + void deleteById(@Param("shopSubstituteSalesId") Long shopSubstituteSalesId); + + /** + * 根据shopIds获取商家的代销配置 + * @param shopIds + * @return 代销配置 + */ + List listByShopIds(@Param("shopIds") List shopIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopTemplateMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopTemplateMapper.java new file mode 100644 index 0000000..b4b08cf --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopTemplateMapper.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.model.ShopTemplate; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品装修模板表 + * + * @author Orange + * @date 2022-08-12 14:04:57 + */ +public interface ShopTemplateMapper { + + /** + * 获取商品装修模板表列表 + * @param shopTemplate + * @return 商品装修模板表列表 + */ + List list(@Param("shopTemplate") ShopTemplate shopTemplate); + + /** + * 根据商品装修模板表id获取商品装修模板表 + * + * @param templateId 商品装修模板表id + * @return 商品装修模板表 + */ + ShopTemplate getByTemplateId(@Param("templateId") Long templateId); + + /** + * 保存商品装修模板表 + * @param shopTemplate 商品装修模板表 + */ + void save(@Param("shopTemplate") ShopTemplate shopTemplate); + + /** + * 更新商品装修模板表 + * @param shopTemplate 商品装修模板表 + */ + void update(@Param("shopTemplate") ShopTemplate shopTemplate); + + /** + * 根据商品装修模板表id删除商品装修模板表 + * @param templateId + */ + void deleteById(@Param("templateId") Long templateId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopUserMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopUserMapper.java new file mode 100644 index 0000000..24e987b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopUserMapper.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.ShopUserDTO; +import com.tmerclub.cloud.multishop.model.ShopUser; +import com.tmerclub.cloud.multishop.vo.ShopUserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +public interface ShopUserMapper { + + /** + * 获取店铺用户列表 + * + * @param shopUserDTO 搜索参数 + * @return 店铺用户列表 + */ + List listByShopId(@Param("shopUser") ShopUserDTO shopUserDTO); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + ShopUserVO getByUserId(@Param("userId") Long userId); + + /** + * 保存商家用户信息 + * + * @param shopUser + */ + void save(@Param("shopUser") ShopUser shopUser); + + /** + * 更新店铺用户信息 + * + * @param shopUser + */ + void update(@Param("shopUser") ShopUser shopUser); + + /** + * 根据店铺用户id删除店铺用户 + * + * @param shopUserId + */ + void deleteById(@Param("shopUserId") Long shopUserId); + + /** + * 获取店主账号的用户id-第一个创建的账号(仅用于审核店铺) + * + * @param shopId + * @return + */ + Long getUserIdByShopId(@Param("shopId") Long shopId); + + /** + * 根据用户id更新店铺id + * + * @param shopId + * @param shopUserId + * @return + */ + int updateShopIdByShopUserId(@Param("shopId") Long shopId, @Param("shopUserId") Long shopUserId); + + /** + * 获取指定的用户的信息列表 + * + * @param userIds + * @return + */ + List listShopUserByUserIds(@Param("userIds") List userIds); + + /** + * 根据手机号码查用户数量 + * @param mobile 手机号码 + * @return 数量 + */ + int countAccoutByMobile(@Param("mobile") String mobile); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopWithdrawCashMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopWithdrawCashMapper.java new file mode 100644 index 0000000..60ee832 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mapper/ShopWithdrawCashMapper.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.mapper; + +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.model.ShopWithdrawCash; +import com.tmerclub.cloud.multishop.vo.ShopWithdrawCashVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 商家提现申请信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public interface ShopWithdrawCashMapper { + + /** + * 根据提现单号查询 + * + * @param bizOrderNo + * @return + */ + ShopWithdrawCash getByBizOrderNo(@Param("bizOrderNo") String bizOrderNo); + + /** + * 保存商家提现申请信息 + * + * @param shopWithdrawCash 商家提现申请信息 + */ + void save(@Param("shopWithdrawCash") ShopWithdrawCash shopWithdrawCash); + + /** + * 更新商家提现申请信息 + * + * @param shopWithdrawCash 商家提现申请信息 + */ + void update(@Param("shopWithdrawCash") ShopWithdrawCash shopWithdrawCash); + + /** + * 根据银行卡id与商家提现申请状态获取商家提现申请数量 + * + * @param shopBankCardId 银行卡id + * @param status 提现申请状态 + * @return + */ + int countByShopBandCardIdAndStatus(@Param("shopBankCardId") Long shopBankCardId, @Param("status") Integer status); + + /** + * 根据参数获取提现记录列表 + * + * @param shopWithdrawCashDTO 搜索筛选参数 + * @return 提现记录列表 + */ + List listByParam(@Param("shopWithdrawCash") ShopWithdrawCashDTO shopWithdrawCashDTO); + + /** + * 根据id获取提现申请详情信息 + * + * @param cashId + * @return + */ + ShopWithdrawCashVO getDetailByCashId(@Param("cashId") Long cashId); + + /** + * 根据id与状态更新提现申请信息 + * + * @param shopWithdrawCash + * @param cashId + * @param status + * @return + */ + int updateByIdAndStatus(@Param("shopWithdrawCash") ShopWithdrawCash shopWithdrawCash, @Param("cashId") Long cashId, @Param("status") Integer status); + + /** + * 计算提现频率 + * + * @param startTimes + * @param endTimes + * @param shopWithdrawCash + * @return + */ + int getWithdrawCashCount(@Param("startTimes") Date startTimes, @Param("endTimes") Date endTimes, @Param("shopWithdrawCash") ShopWithdrawCash shopWithdrawCash); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/IndexImg.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/IndexImg.java new file mode 100644 index 0000000..2800f22 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/IndexImg.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 轮播图 + * + * @author YXF + * @date 2020-11-24 16:38:32 + */ +public class IndexImg extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long imgId; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 图片 + */ + private String imgUrl; + + /** + * 状态 + */ + private Integer status; + + /** + * 顺序 + */ + private Integer seq; + + /** + * 关联商品id + */ + private Long spuId; + + /** + * 图片类型 0:小程序 1:pc + */ + private Integer imgType; + + public Long getImgId() { + return imgId; + } + + public void setImgId(Long imgId) { + this.imgId = imgId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getImgType() { + return imgType; + } + + public void setImgType(Integer imgType) { + this.imgType = imgType; + } + + @Override + public String toString() { + return "IndexImg{" + + "imgId=" + imgId + + ",shopId=" + shopId + + ",imgUrl=" + imgUrl + + ",status=" + status + + ",seq=" + seq + + ",spuId=" + spuId + + ",imgType=" + imgType + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/Notice.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/Notice.java new file mode 100644 index 0000000..b97c72c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/Notice.java @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 公告 + * + * @author YXF + * @date 2020-11-25 17:57:56 + */ +public class Notice extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 公告id + */ + private Long id; + + /** + * 店铺id(0为平台端发布的公告 其他为商家端发布的公告) + */ + private Long shopId; + + /** + * 类型(平台端同时创建多类型公告)(1:在商家端展示 2:在用户端展示 3:在供应商端展示) + */ + private String types; + + /** + * 商家可见范围 (为空则全部可见) + */ + private String multiShopIds; + + /** + * 用户可见范围 (为空则全部可见) + */ + private String userIds; + + /** + * 供应商可见范围 (为空则全部可见) + */ + private String supplierIds; + + /** + * 公告标题 + */ + private String title; + + /** + * 公告内容 + */ + private String content; + + /** + * 状态(1:公布 0:撤回) + */ + private Integer status; + + /** + * 是否置顶 + */ + private Integer isTop; + + /** + * 发布时间 + */ + private Date publishTime; + + /** + * 是否已读(1:已读 0:未读) + */ + private Integer isLearning; + + + /** + * 是否立即发送 1:立即发送 0:定时发送 + * @return + */ + private Integer immediatelySend; + + /** + * 发送时间 + */ + private Date sendTime; + + public Integer getImmediatelySend() { + return immediatelySend; + } + + public void setImmediatelySend(Integer immediatelySend) { + this.immediatelySend = immediatelySend; + } + + public Date getSendTime() { + return sendTime; + } + + public void setSendTime(Date sendTime) { + this.sendTime = sendTime; + } + + public Integer getIsLearning() { + return isLearning; + } + + public void setIsLearning(Integer isLearning) { + this.isLearning = isLearning; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Date getPublishTime() { + return publishTime; + } + + public void setPublishTime(Date publishTime) { + this.publishTime = publishTime; + } + + public String getTypes() { + return types; + } + + public void setTypes(String types) { + this.types = types; + } + + public String getMultiShopIds() { + return multiShopIds; + } + + public void setMultiShopIds(String multiShopIds) { + this.multiShopIds = multiShopIds; + } + + public String getUserIds() { + return userIds; + } + + public void setUserIds(String userIds) { + this.userIds = userIds; + } + + public String getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(String supplierIds) { + this.supplierIds = supplierIds; + } + + @Override + public String toString() { + return "Notice{" + + "id=" + id + + ", shopId=" + shopId + + ", types='" + types + '\'' + + ", multiShopIds='" + multiShopIds + '\'' + + ", userIds='" + userIds + '\'' + + ", supplierIds='" + supplierIds + '\'' + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", status=" + status + + ", isTop=" + isTop + + ", publishTime=" + publishTime + + ", isLearning=" + isLearning + + ", immediatelySend=" + immediatelySend + + ", sendTime=" + sendTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopAuditing.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopAuditing.java new file mode 100644 index 0000000..66bb785 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopAuditing.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商家审核信息 + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +public class ShopAuditing extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺审核id + */ + private Long shopAuditingId; + + /** + * 申请人id + */ + private Long userId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 审核人id + */ + private Long auditorId; + + /** + * 0 未审核 1已通过 -1未通过 2平台下线 3 平台下线待审核 + */ + private Integer status; + + /** + * 店铺类型1自营店 2普通店 + */ + private Integer shopType; + + /** + * 备注 + */ + private String remarks; + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Long getShopAuditingId() { + return shopAuditingId; + } + + public void setShopAuditingId(Long shopAuditingId) { + this.shopAuditingId = shopAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "ShopAuditing{" + + "shopAuditingId=" + shopAuditingId + + ", userId=" + userId + + ", shopId=" + shopId + + ", auditorId=" + auditorId + + ", status=" + status + + ", shopType=" + shopType + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCollection.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCollection.java new file mode 100644 index 0000000..970eec3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCollection.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户店铺收藏记录 + * + * @author lhd + * @date 2021-02-23 14:41:42 + */ +public class ShopCollection extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 收藏自增id + */ + private Long collectionId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户id + */ + private Long userId; + + public Long getCollectionId() { + return collectionId; + } + + public void setCollectionId(Long collectionId) { + this.collectionId = collectionId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "UserCollectionShopVO{" + + "collectionId=" + collectionId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCompanyAuditing.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCompanyAuditing.java new file mode 100644 index 0000000..ea8bd2b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopCompanyAuditing.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 工商信息审核记录 + * + * @author chiley + * @date 2022/9/1 15:52 + */ +public class ShopCompanyAuditing extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 工商信息审核id + */ + private Long companyAuditingId; + + /** + * 申请人id + */ + private Long userId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 工商信息id + */ + private Long shopCompanyId; + /** + * 审核人id + */ + private Long auditorId; + + /** + * 0 未审核 1已通过 -1未通过 + */ + private Integer status; + + /** + * 备注 + */ + private String remarks; + + public Long getCompanyAuditingId() { + return companyAuditingId; + } + + public void setCompanyAuditingId(Long companyAuditingId) { + this.companyAuditingId = companyAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopCompanyId() { + return shopCompanyId; + } + + public void setShopCompanyId(Long shopCompanyId) { + this.shopCompanyId = shopCompanyId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "ShopCompanyAuditing{" + + "companyAuditingId=" + companyAuditingId + + ", userId='" + userId + '\'' + + ", shopId=" + shopId + + ", shopCompanyId=" + shopCompanyId + + ", auditorId=" + auditorId + + ", status=" + status + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopDetail.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopDetail.java new file mode 100644 index 0000000..5e5b621 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopDetail.java @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.constant.CompanyInfoProcessStatus; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺详情 + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public class ShopDetail extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺类型1自营店 2普通店 + */ + private Integer type; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 店铺简介 + */ + private String intro; + + /** + * 接收短信号码 + */ + private String noticeMobile; + + /** + * 店铺logo(可修改) + */ + private String shopLogo; + + /** + * 店铺状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:店铺申请中 5:上线申请待审核) + */ + private Integer shopStatus; + + /** + * 是否优选好店 1.是 0.不是 + */ + private Integer isPreferred; + + /** + * 移动端背景图 + */ + private String mobileBackgroundPic; + + /** + * pc背景图 + */ + private String pcBackgroundPic; + + /** + * 联系人姓名 + */ + private String contactName; + + /** + * 商家名称 + */ + private String merchantName; + + /** + * 联系方式 + */ + private String contactPhone; + + /** + * 签约起始时间 + */ + private Date contractStartTime; + + /** + * 签约终止时间 + */ + private Date contractEndTime; + + /** + * 是否在通联创建了企业会员 0否1是 + */ + private Integer isCreateMember; + + /** + * 是否在通联绑定了手机号 0否1是 + */ + private Integer isBindPhone; + + /** + * 企业信息审核状态 0.未提交 1.待审核 2.审核成功 3.审核失败 + * @see CompanyInfoProcessStatus + */ + private Integer companyInfoProcessStatus; + + /** + * 影印件采集审核状态 0.未上传 1.待审核 2.只有工商认证通过 3.只有法人信息通过 4.均审核通过 + * @see IdCardCollectProcessStatus + */ + private Integer idCardCollectProcessStatus; + + /** + * 通联店铺状态 0未开通 1营业中 2平台下线 3上线待审核 4开店待审核 + * @see com.tmerclub.cloud.common.constant.AllinpayShopStatus + */ + private Integer allinpayShopStatus; + + /** + * 企业账户提现协议编号 + */ + private String companyAcctProtocolNo; + + /** + * 法人账户提现协议编号 + */ + private String legalAcctProtocolNo; + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public String getMerchantName() { + return merchantName; + } + + public void setMerchantName(String merchantName) { + this.merchantName = merchantName; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Integer getIsCreateMember() { + return isCreateMember; + } + + public void setIsCreateMember(Integer isCreateMember) { + this.isCreateMember = isCreateMember; + } + + public Integer getIsBindPhone() { + return isBindPhone; + } + + public void setIsBindPhone(Integer isBindPhone) { + this.isBindPhone = isBindPhone; + } + + public Integer getCompanyInfoProcessStatus() { + return companyInfoProcessStatus; + } + + public void setCompanyInfoProcessStatus(Integer companyInfoProcessStatus) { + this.companyInfoProcessStatus = companyInfoProcessStatus; + } + + public Integer getIdCardCollectProcessStatus() { + return idCardCollectProcessStatus; + } + + public void setIdCardCollectProcessStatus(Integer idCardCollectProcessStatus) { + this.idCardCollectProcessStatus = idCardCollectProcessStatus; + } + + public Integer getAllinpayShopStatus() { + return allinpayShopStatus; + } + + public void setAllinpayShopStatus(Integer allinpayShopStatus) { + this.allinpayShopStatus = allinpayShopStatus; + } + + public String getCompanyAcctProtocolNo() { + return companyAcctProtocolNo; + } + + public void setCompanyAcctProtocolNo(String companyAcctProtocolNo) { + this.companyAcctProtocolNo = companyAcctProtocolNo; + } + + public String getLegalAcctProtocolNo() { + return legalAcctProtocolNo; + } + + public void setLegalAcctProtocolNo(String legalAcctProtocolNo) { + this.legalAcctProtocolNo = legalAcctProtocolNo; + } + + @Override + public String toString() { + return "ShopDetail{" + + "shopId=" + shopId + + ", type=" + type + + ", shopName='" + shopName + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", shopStatus=" + shopStatus + + ", isPreferred=" + isPreferred + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", contactName='" + contactName + '\'' + + ", merchantName='" + merchantName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", isCreateMember=" + isCreateMember + + ", isBindPhone=" + isBindPhone + + ", companyInfoProcessStatus=" + companyInfoProcessStatus + + ", idCardCollectProcessStatus=" + idCardCollectProcessStatus + + ", allinpayShopStatus=" + allinpayShopStatus + + ", companyAcctProtocolNo='" + companyAcctProtocolNo + '\'' + + ", legalAcctProtocolNo='" + legalAcctProtocolNo + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopExtension.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopExtension.java new file mode 100644 index 0000000..d75c8b9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopExtension.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 店铺扩张信息 + * + * @author YXF + * @date 2021-02-05 15:36:12 + */ +public class ShopExtension extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long shopExtensionId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺商品总销量 + */ + private Integer saleNum; + + /** + * 店铺收藏数量 + */ + private Long collectionNum; + + public Long getShopExtensionId() { + return shopExtensionId; + } + + public void setShopExtensionId(Long shopExtensionId) { + this.shopExtensionId = shopExtensionId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + @Override + public String toString() { + return "ShopExtension{" + + "shopExtensionId=" + shopExtensionId + + ",shopId=" + shopId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",saleNum=" + saleNum + + ",collectionNum=" + collectionNum + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWallet.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWallet.java new file mode 100644 index 0000000..63664b0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/model/ShopWallet.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.api.payment.constant.PaySysType; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商家钱包信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public class ShopWallet extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺钱包id + */ + private Long shopWalletId; + + /** + * 支付系统类型 + * @see PaySysType + */ + private Integer paySysType; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 未结算金额(用户支付) + */ + private Long unsettledAmount; + + /** + * 已结算金额(用户确认收货后,可以提现) + */ + private Long settledAmount; + + /** + * 冻结金额(用户确认收货) + */ + private Long freezeAmount; + + /** + * 累积结算金额 + */ + private Long totalSettledAmount; + + /** + * 可用短信数量 + */ + private Integer smsNum; + + /** + * 乐观锁 + */ + private Long version; + + public Long getShopWalletId() { + return shopWalletId; + } + + public void setShopWalletId(Long shopWalletId) { + this.shopWalletId = shopWalletId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + public Integer getSmsNum() { + return smsNum; + } + + public void setSmsNum(Integer smsNum) { + this.smsNum = smsNum; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + @Override + public String toString() { + return "ShopWallet{" + + "shopWalletId=" + shopWalletId + + ", paySysType=" + paySysType + + ", shopId=" + shopId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", freezeAmount=" + freezeAmount + + ", totalSettledAmount=" + totalSettledAmount + + ", smsNum=" + smsNum + + ", version=" + version + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mongo/MongoShopWalletLogBO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mongo/MongoShopWalletLogBO.java new file mode 100644 index 0000000..d547927 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/mongo/MongoShopWalletLogBO.java @@ -0,0 +1,307 @@ +package com.tmerclub.cloud.multishop.mongo; + +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.Date; + +/** + * 对应MongoDB存储商家余额日志emp + * @author 菠萝凤梨 + */ +@Document("shop_wallet_log") +@CompoundIndexes({ + @CompoundIndex(name = "shopId_reason_idx", def = "{'shopId':1, 'reason':1}") +}) +public class MongoShopWalletLogBO { + + @Id + @Schema(description = "店铺钱包id") + private Long walletLogId; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + /** + * 支付系统类型 + * @see PaySysType + */ + @Schema(description = "支付系统类型", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer paySysType; + + @Schema(description = "关联订单id") + private Long orderId; + + @Schema(description = "关联退款单id") + private Long refundId; + + @Schema(description = "商家收支类型 0支出 1收入") + private Integer shopIoType; + + @Schema(description = "平台收支类型 0支出 1收入") + private Integer platformIoType; + + @Schema(description = "金额类型 0 未结算金额 1可提现金额 2冻结金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer amountType; + + @Schema(description = "商家改变金额") + private Long shopChangeAmount; + + @Schema(description = "平台改变金额") + private Long platformChangeAmount; + + @Schema(description = "原因 ShopWalletChangeReason", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer reason; + + @Schema(description = "用户金额(支付实付金额,退款实际申请金额)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userAmount; + + @Schema(description = "平台补贴金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformAmount; + + @Schema(description = "分销占用金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long distributionAmount; + + @Schema(description = "商家的平台佣金", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopPlatformCommission; + + @Schema(description = "平台佣金", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformCommission; + + @Schema(description = "商家优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopReduceAmount; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "通联充值单号") + private Long bizOrderNo; + + @Schema(description = "通联充值状态 0.待支付 1.申请成功(还没确认) 2.充值成功 3.充值失败") + private Integer allinpayStatus; + + @Schema(description = "通联支付失败原因") + private String payFailMessage; + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getShopIoType() { + return shopIoType; + } + + public void setShopIoType(Integer shopIoType) { + this.shopIoType = shopIoType; + } + + public Integer getPlatformIoType() { + return platformIoType; + } + + public void setPlatformIoType(Integer platformIoType) { + this.platformIoType = platformIoType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Long getShopChangeAmount() { + return shopChangeAmount; + } + + public void setShopChangeAmount(Long shopChangeAmount) { + this.shopChangeAmount = shopChangeAmount; + } + + public Long getPlatformChangeAmount() { + return platformChangeAmount; + } + + public void setPlatformChangeAmount(Long platformChangeAmount) { + this.platformChangeAmount = platformChangeAmount; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getUserAmount() { + return userAmount; + } + + public void setUserAmount(Long userAmount) { + this.userAmount = userAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getShopPlatformCommission() { + return shopPlatformCommission; + } + + public void setShopPlatformCommission(Long shopPlatformCommission) { + this.shopPlatformCommission = shopPlatformCommission; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getShopReduceAmount() { + return shopReduceAmount; + } + + public void setShopReduceAmount(Long shopReduceAmount) { + this.shopReduceAmount = shopReduceAmount; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(Long bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public Integer getAllinpayStatus() { + return allinpayStatus; + } + + public void setAllinpayStatus(Integer allinpayStatus) { + this.allinpayStatus = allinpayStatus; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + @Override + public String toString() { + return "MongoShopWalletLogBO{" + + "walletLogId=" + walletLogId + + ", shopId=" + shopId + + ", paySysType=" + paySysType + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", shopIoType=" + shopIoType + + ", platformIoType=" + platformIoType + + ", amountType=" + amountType + + ", shopChangeAmount=" + shopChangeAmount + + ", platformChangeAmount=" + platformChangeAmount + + ", reason=" + reason + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", distributionAmount=" + distributionAmount + + ", shopPlatformCommission=" + shopPlatformCommission + + ", platformCommission=" + platformCommission + + ", shopReduceAmount=" + shopReduceAmount + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", shopName='" + shopName + '\'' + + ", bizOrderNo=" + bizOrderNo + + ", allinpayStatus=" + allinpayStatus + + ", payFailMessage='" + payFailMessage + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/CompanyAuditingService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/CompanyAuditingService.java new file mode 100644 index 0000000..0056c66 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/CompanyAuditingService.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.ShopCompanyAuditingDTO; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.vo.ShopCompanyAuditingVO; + +/** + * @author chiley + * @date 2022/9/13 14:39 + */ +public interface CompanyAuditingService { + + /** + * 更新备注 + * @param shopCompanyAuditingDTO + */ + void updateRemark(ShopCompanyAuditingDTO shopCompanyAuditingDTO); + + /** + * 商家申请变更工商信息 + * + * @param shopCompanyDTO + */ + void applyChangeCompanyInfo(ShopCompanyDTO shopCompanyDTO); + + + /** + * 企业信息更新回调 + * @param bizUserId + * @param status + * @param result + * @param failReason + */ + void updateCompanyInfoResult(String bizUserId, Integer status, Integer result, String failReason); + + /** + * 根据店铺id获取最近一条工商审核信息 + * + * @param shopId + * @return + */ + ShopCompanyAuditingVO getLatestAuditingByShopId(Long shopId); + + + /** + * 撤销申请 + * + * @param shopId + */ + void revoke(Long shopId); + + /** + * 分页获取待审核的工商信息 + * + * @param pageDTO 分页参数 + * @param shopCompanyAuditingDTO 搜索参数 + * @return + */ + PageVO page(PageDTO pageDTO, ShopCompanyAuditingDTO shopCompanyAuditingDTO); + + /** + * 审核公司信息 + * @param shopCompanyAuditingDTO + */ + void audit(ShopCompanyAuditingDTO shopCompanyAuditingDTO); + + /** + * 获取工商信息审核信息 + * @param shopId + * @return + */ + ShopCompanyAuditingVO getAuditInfo(Long shopId); + + /** + * 回调更新通联状态 + * @param bizUserId + * @param status + * @param failReason + * @param isPassShop + */ + void updateAllinpayShopStatus(String bizUserId, Integer status, String failReason, Integer isPassShop); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/HotSearchService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/HotSearchService.java new file mode 100644 index 0000000..ccb82df --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/HotSearchService.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.HotSearchDTO; +import com.tmerclub.cloud.multishop.model.HotSearch; +import com.tmerclub.cloud.multishop.vo.HotSearchVO; + +import java.util.List; + +/** + * 热搜 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +public interface HotSearchService { + + /** + * 分页获取热搜列表 + * @param pageDTO 分页参数 + * @param hotSearchDTO 搜索参数 + * @return 热搜列表分页数据 + */ + PageVO page(PageDTO pageDTO, HotSearchDTO hotSearchDTO); + + /** + * 根据热搜id获取热搜 + * + * @param hotSearchId 热搜id + * @return 热搜 + */ + HotSearchVO getByHotSearchId(Long hotSearchId); + + /** + * 保存热搜 + * @param hotSearch 热搜 + */ + void save(HotSearch hotSearch); + + /** + * 更新热搜 + * @param hotSearch 热搜 + */ + void update(HotSearch hotSearch); + + /** + * 根据热搜id删除热搜 + * @param hotSearchId 热搜id + * @param shopId 店铺id + */ + void deleteById(Long hotSearchId, Long shopId); + + /** + * 获取热搜列表 + * @param shopId + * @param type + * @return + */ + List listByShopId(Long shopId, Integer type); + + /** + * 清除热搜列表缓存 + * @param shopId + * @param type + */ + void removeHotSearchListCache(Long shopId, Integer type); + + /** + * 检查热搜是否存在 + * @param shopId + * @param title + * @param type + * @return + */ + boolean checkExist(Long shopId, String title, Integer type); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/NoticeService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/NoticeService.java new file mode 100644 index 0000000..d92cb40 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/NoticeService.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.NoticeDTO; +import com.tmerclub.cloud.multishop.model.Notice; +import com.tmerclub.cloud.multishop.vo.NoticeVO; + +import java.util.List; + +/** + * 公告 + * + * @author YXF + * @date 2020-11-25 17:57:56 + */ +public interface NoticeService { + + /** + * 分页获取公告列表 + * @param pageDTO 分页参数 + * @param noticeDTO 搜索参数 + * @return 公告列表分页数据 + */ + PageVO page(PageDTO pageDTO, NoticeDTO noticeDTO); + + /** + * 根据公告id获取公告 + * + * @param id 公告id + * @return 公告 + */ + NoticeVO getById(Long id); + + /** + * 根据公告id改变公告已读状态 + * + * @param id + */ + void updateIsLearning(Long id); + + /** + * 保存公告 + * @param notice 公告 + */ + void save(Notice notice); + + /** + * 更新公告 + * @param notice 公告 + */ + void update(Notice notice); + + /** + * 根据公告id删除公告 + * @param id + */ + void deleteById(Long id); + + /** + * 根据shopId和公告类型,清除缓存 + * @param shopId + * @param type 1:平台公告 2:商城公告 + */ + void removeCacheByShopIdAndType(Long shopId, Integer type); + + /** + * 根据店铺id和公告类型,获取公告列表 + * @param shopId 店铺id + * @param type 1:平台公告 2:商城公告 + * @return + */ + List getlistByShopId(Long shopId, Integer type); + + /** + * 获取公告分页列表 + * @param pageDTO + * @param noticeDTO + * @return + */ + PageVO pagePlatformNotice(PageDTO pageDTO, NoticeDTO noticeDTO); + + /** + * 批量保存公告 + * @param noticeList + */ + void saveBatch(List noticeList); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopAllinpayService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopAllinpayService.java new file mode 100644 index 0000000..bc7e3fc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopAllinpayService.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.multishop.service; + +/** + * @author TRACK + */ +public interface ShopAllinpayService { + + /** + * 获取通联支付是否开启 + * @return + */ + boolean getIsAllinpay(); + + /** + * 删除通联支付缓存 + */ + void deleteAllinpayCache(); + + /** + * 创建通联会员 + * @param shopId + */ + void createAllinpayCompanyMember(Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopBankCardService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopBankCardService.java new file mode 100644 index 0000000..1d68821 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopBankCardService.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.multishop.dto.AllinpayShopBankCardDTO; +import com.tmerclub.cloud.multishop.dto.ShopBankCardDTO; +import com.tmerclub.cloud.multishop.model.ShopBankCard; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/4/25 17:02 + */ +public interface ShopBankCardService { + + /** + * 保存 + * @param shopBankCard + */ + void save(ShopBankCard shopBankCard); + + /** + * 批量新增结算银行账户 + * @param shopBankCardDTOList + * @param shopId + */ + void insertBatch(List shopBankCardDTOList, Long shopId); + + /** + * 根据店铺id获取银行卡列表 + * @param shopId + * @return + */ + List listByShopId(Long shopId); + + /** + * 根据银行卡id删除银行卡信息 + * @param shopBankCardId + * @param shopId + */ + void deleteByShopBankCardId(Long shopBankCardId, Long shopId); + + /** + * 批量新增结算银行账户并提交开店申请 + * @param shopBankCardDTOList + * @param shopId + */ + void insertBatchAndSubmitApply(List shopBankCardDTOList, Long shopId); + + /** + * 将对公户信息和之前提交的工商信息一起交给通联去审核 + * @param allinpayShopBankCardDTO + * @param shopId + * @param shopCompany + */ + void insertAndSetCompanyInfo(AllinpayShopBankCardDTO allinpayShopBankCardDTO, Long shopId, + ShopCompanyVO shopCompany); + + /** + * 通联设置企业信息 + * @param allinpayShopBankCardDTO + * @param shopId + * @param shopCompany + * @param shopDetailVO + */ + void allinpaySetCompanyInfo(AllinpayShopBankCardDTO allinpayShopBankCardDTO, Long shopId, + ShopCompanyVO shopCompany, ShopDetailVO shopDetailVO); + + /** + * 更新通联店铺状态为成功 + * @param shopId + */ + void updateShopAllinpayStatusToSuccess(Long shopId); + + /** + * 更新店铺银行卡信息 + * @param shopBankCardDTO 银行卡信息 + * @param shopId 店铺id + */ + void updateByShopId(ShopBankCardDTO shopBankCardDTO, Long shopId); + + /** + * 设置银行卡为主账号 + * @param shopBankCardId + * @param shopId + */ + void setPrimaryByShopId(Long shopBankCardId, Long shopId); + + /** + * 设置银行卡不为主账号 + * @param shopBankCardId + * @param shopId + */ + void setNotPrimaryByShopId(Long shopBankCardId, Long shopId); + + /** + * 保存单个银行卡信息 + * @param shopBankCardDTO + * @param shopId + */ + void insertByShopId(ShopBankCardDTO shopBankCardDTO, Long shopId); + + /** + * 根据银行卡id获取银行卡信息 + * @param shopBankCardId + * @return + */ + ShopBankCardVO getByShopBankCardId(Long shopBankCardId); + + /** + * 根据银行卡id与店铺id获取银行卡信息 + * @param shopBankCardId + * @param shopId + * @return + */ + ShopBankCardVO getByShopBankCardIdAndShopId(Long shopBankCardId, Long shopId); + + /** + * 根据店铺id删除银行卡信息 + * @param shopId + */ + void deleteByShopId(Long shopId); + + /** + * 刷新银行卡 + * @param shopId + */ + void refresh(Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopCollectionService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopCollectionService.java new file mode 100644 index 0000000..390edc5 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopCollectionService.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.model.ShopCollection; +import com.tmerclub.cloud.multishop.vo.ShopCollectionVO; + +import java.util.List; + +/** + * 用户店铺收藏记录 + * + * @author lhd + * @date 2021-02-23 14:41:42 + */ +public interface ShopCollectionService { + + /** + * 根据用户店铺收藏记录id获取用户店铺收藏记录 + * + * @param collectionId 用户店铺收藏记录id + * @return 用户店铺收藏记录 + */ + ShopCollectionVO getByCollectionId(Long collectionId); + + /** + * 保存用户店铺收藏记录 + * @param userCollectionShop 用户店铺收藏记录 + */ + void save(ShopCollection userCollectionShop); + + /** + * 更新用户店铺收藏记录 + * @param userCollectionShop 用户店铺收藏记录 + */ + void update(ShopCollection userCollectionShop); + + /** + * 根据用户id和店铺名称获取收藏店铺分页列表 + * @param pageDTO 分页数据 + * @param userId 用户id + * @param shopName 店铺名称 + * @return 分页收藏列表 + */ + PageVO getUserCollectionShopPageByUserIdAndShopName(PageDTO pageDTO, Long userId, String shopName); + + /** + * 根据用户id和店铺id获取收藏数量 + * @param userId 用户id + * @param shopId 店铺id + * @return 收藏数量 + */ + int countByShopIdAndUserId(Long shopId, Long userId); + + /** + * 根据店铺id 添加/取消收藏 + * @param shopId 店铺id + * @param userId 用户id + * @return 添加or取消收藏 + */ + Boolean addOrCancel(Long shopId, Long userId); + + /** + * 批量取消收藏 + * @param shopIds 店铺ids + * @param userId 用户id + * @return 批量添加结果 + */ + boolean batchCancel(List shopIds, Long userId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopCompanyService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopCompanyService.java new file mode 100644 index 0000000..4a6c36a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopCompanyService.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.model.ShopCompany; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; + +/** + * @Author lth + * @Date 2021/4/25 15:44 + */ +public interface ShopCompanyService { + /** + * 根据店铺id更新店铺工商信息 + * @param shopCompany + * @param shopId + * @param temp 0代表通过审核,1代表平台修改 + */ + void updateByShopId(ShopCompany shopCompany, Long shopId, Integer temp); + + /** + * 平台更新商家工商信息 + * @param shopCompany + * @param shopId + */ + void platformUpdateShopCompany(ShopCompany shopCompany, Long shopId); + + /** + * 根据供应商工商信息id获取供应商工商信息 + * + * @param shopCompanyId 店铺工商信息id + * @return 供应商工商信息 + */ + ShopCompanyVO getById(Long shopCompanyId); + + /** + * 根据店铺id获取店铺工商信息 + * @param shopId + * @param status + * @return + */ + ShopCompanyVO getShopCompanyByShopIdAndStatus(Long shopId, Integer status); + + /** + * 保存店铺工商信息 + * @param shopCompany + * @param isCreate 校验店铺工商信息,true代表首次新增时校验信息 + */ + void save(ShopCompany shopCompany, boolean isCreate); + + /** + * 更新店铺工商信息 + * @param shopCompany 店铺工商信息 + */ + void update(ShopCompany shopCompany); + + /** + * 检查统一信息码是否已经存在 + * @param creditCode + * @param shopId + * @return + */ + Boolean checkCreditCode(String creditCode, Long shopId); + + /** + * 根据店铺id和审核状态删除店铺工商信息 + * @param shopId + * @param status 审核状态 + * @return + */ + void deleteByShopIdAndStatus(Long shopId, Integer status); + + /** + * 根据店铺id更改店铺工商信息状态 + * @param shopId + * @param status + * @param dbStatus + */ + void batchUpdateStatus(Long shopId, Integer status, Integer dbStatus); + + /** + * 校验店铺工商信息,isCreate为true代表校验新增时的信息,false代表校验更新时的信息 + * @param shopCompany + * @param isCreate + * @param temp 0代表通过审核,1代表平台修改 + */ + void checkInfo(ShopCompany shopCompany, Boolean isCreate, Integer temp); + + + /** + * 根据店铺工商id修改信息 + * @param shopCompany 店铺工商信息 + */ + void updateById(ShopCompany shopCompany); + + /** + * 影印件采集 + * @param shopCompany + * @param shopId + * @return + */ + String idCardCollect(ShopCompanyVO shopCompany, Long shopId); + + /** + * 重新单独上传影印件 + * @param shopCompanyDTO + * @param shopDetailVO + * @param status + * @return + */ + String uploadIdCard(ShopCompanyDTO shopCompanyDTO, ShopDetailVO shopDetailVO, Integer status); + + /** + * 更新正常的商家工商信息为待审核 + */ + void updateStatusToWaitAudit(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopDetailService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopDetailService.java new file mode 100644 index 0000000..cdfebdb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopDetailService.java @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.*; +import com.tmerclub.cloud.multishop.model.ShopDetail; +import com.tmerclub.cloud.multishop.vo.ShopDetailAppVO; +import com.tmerclub.cloud.multishop.vo.ShopHeadInfoVO; + +import java.util.Date; +import java.util.List; + +/** + * 店铺详情 + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public interface ShopDetailService { + + /** + * 分页获取店铺详情列表 + * + * @param pageDTO 分页参数 + * @param shopDetailDTO 店铺搜索数据 + * @return 店铺详情列表分页数据 + */ + PageVO page(PageDTO pageDTO, ShopDetailDTO shopDetailDTO); + + /** + * 根据店铺详情id获取店铺详情 + * + * @param shopId 店铺详情id + * @return 店铺详情 + */ + ShopDetailVO getByShopId(Long shopId); + + /** + * 更新店铺详情 + * + * @param shopDetailDTO 店铺详情 + */ + void update(ShopDetailDTO shopDetailDTO); + + /** + * 根据店铺详情id删除店铺详情 + * + * @param shopId + */ + void deleteById(Long shopId); + + /** + * 获取店铺列表信息 + * + * @param shopIds + * @return + */ + List listByShopIds(List shopIds); + + /** + * 根据店铺详情id获取店铺详情以及剩余短信额度 + * + * @param shopId 店铺详情id + * @return 店铺详情 + */ + ShopDetailVO getShopByShopId(Long shopId); + + /** + * 申请开店 + * + * @param shopDetailDTO 申请开店信息 + */ + void applyShop(ShopDetailDTO shopDetailDTO); + + /** + * 店铺搜索分页 + * + * @param pageDTO 分页参数 + * @param shopDetailDTO 店铺信息 + * @return 店铺信息列表 + */ + PageVO shopSearchPage(PageDTO pageDTO, ShopDetailDTO shopDetailDTO); + + /** + * 审核商家信息 + * + * @param shopAuditingDTO 审核信息 + */ + void audit(ShopAuditingDTO shopAuditingDTO); + + /** + * 改变店铺状态 + * + * @param shopId + * @param shopStatus + */ + void changeSpuStatus(Long shopId, Integer shopStatus); + + /** + * 删除店铺缓存 + * + * @param shopId + */ + void removeCacheByShopId(Long shopId); + + /** + * 获取店铺信息及扩展信息 + * + * @param shopId + * @return + */ + EsShopDetailBO shopExtensionData(Long shopId); + + /** + * 创建店铺 + * + * @param shopDetailDTO + */ + void createShop(ShopDetailDTO shopDetailDTO); + + /** + * 获取店铺信息及扩展信息 + * + * @param shopIds 店铺ids + * @param shopName 店铺名称 + * @return 店铺信息列表 + */ + List getShopDetailByShopIdsShopName(List shopIds, String shopName); + + /** + * 根据店铺id获取店铺扩展信息 + * + * @param shopId 店铺id + * @return 店铺扩展信息 + */ + ShopDetailVO getShoExtensionsByShopId(Long shopId); + + /** + * 根据手机号获取存在店铺的数量 + * + * @param mobile 手机号 + * @return 数量 + */ + Integer countByMobile(String mobile); + + /** + * 平台 --下线活动商品 + * + * @param shopDetailVO 店铺信息 + * @param offlineReason 下线原因 + * @param sysUserId 系统用户id + */ + void offline(ShopDetailVO shopDetailVO, String offlineReason, Long sysUserId); + + /** + * 根据店铺状态查询店铺数量 + * + * @param shopStatus + * @return + */ + Long countByShopStatus(Integer shopStatus); + + /** + * 平台创建店铺 + * + * @param shopCreateInfoDTO + */ + void platformCreateShop(ShopCreateInfoDTO shopCreateInfoDTO); + + /** + * 根据签约时间修改店铺状态 + * + * @param now + */ + void changeShopStatusByContractTime(Date now); + + /** + * 更新店铺签约信息 + * + * @param shopSigningInfoDTO + */ + void updateSigningInfo(ShopSigningInfoDTO shopSigningInfoDTO); + + /** + * 店铺重新申请上线 + * + * @param offlineHandleEventDTO + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 店铺违规下线,重新申请上线审核 + * + * @param offlineHandleEventDTO + */ + void onlineAudit(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 店铺违规下线,无需店铺申请,平台直接上线店铺 + * + * @param offlineHandleEventDTO + */ + void onlineOpenShop(OfflineHandleEventDTO offlineHandleEventDTO); + + + /** + * 根据参数获取店铺id + * + * @param shopSimpleBO + * @return + */ + List listSimple(ShopSimpleBO shopSimpleBO); + + /** + * 检查店铺名称是否已存在 + * + * @param shopName + * @return + */ + Boolean checkShopName(String shopName); + + /** + * 根据店铺状态查询店铺id列表 + * + * @param shopStatus + * @return + */ + List getShopIdByShopStatus(Integer shopStatus); + + /** + * 店铺下线时满减,优惠券活动下架 + * + * @param shopIds + * @param shopStatus + */ + void offlineShopActivity(List shopIds, Integer shopStatus); + + + /** + * 根据名字模糊查询店铺id + * + * @param name + * @return + */ + List getShopIdsLikeName(String name); + + + /** + * 平台分页获取装修的店铺信息 + * + * @param pageDTO + * @param shopSearchDTO + * @param sysType com.tmerclub.cloud.api.auth.constant.SysTypeEnum + * @return + */ + PageVO renovationShopPage(PageDTO pageDTO, ShopSearchDTO shopSearchDTO, Integer sysType); + + /** + * 店铺列表(营业、停业状态) + * + * @param shopSearchDTO + * @return + */ + List listRenovationShop(ShopSearchDTO shopSearchDTO); + + /** + * 给还没创建通联会员的商家创建会员账号 + * 适用于平台开通通联支付前注册的商家 + */ + void createAllinpayMember(); + + /** + * 根据店铺id创建通联会员账户 + * @param shopId + */ + void createAllinpayMemberByShopId(Long shopId); + + /** + * 更新商家影印件采集状态 + * + * @param bizUserId + * @param status + */ + void updateAllinpayIdCardStatus(String bizUserId, Integer status); + + /** + * 获取所有未删除的店铺 + * @return + */ + List listShopIds(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopExtensionService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopExtensionService.java new file mode 100644 index 0000000..07a4eae --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopExtensionService.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.multishop.model.ShopExtension; +import com.tmerclub.cloud.multishop.vo.ShopExtensionVO; + +/** + * 店铺扩张信息 + * + * @author YXF + * @date 2021-02-05 15:36:12 + */ +public interface ShopExtensionService { + + /** + * 保存店铺扩张信息 + * @param shopExtension 店铺扩张信息 + */ + void save(ShopExtension shopExtension); + + /** + * 更新店铺扩张信息 + * @param shopExtension 店铺扩张信息 + */ + void update(ShopExtensionVO shopExtension); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRefundAddrService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRefundAddrService.java new file mode 100644 index 0000000..bbdad8a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopRefundAddrService.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.ShopRefundAddrDTO; +import com.tmerclub.cloud.multishop.model.ShopRefundAddr; + +import java.util.List; + +/** + * 商家退货地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 15:03:18 + */ +public interface ShopRefundAddrService { + + /** + * 分页获取商家退货地址列表 + * @param pageDTO 分页参数 + * @param shopRefundAddrDTO 店铺退款地址 + * @return 商家退货地址列表分页数据 + */ + PageVO page(PageDTO pageDTO, ShopRefundAddrDTO shopRefundAddrDTO); + + /** + * 根据商家退货地址id获取商家退货地址 + * + * @param shopRefundAddrId 商家退货地址id + * @param shopId + * @return 商家退货地址 + */ + ShopRefundAddrVO getByShopRefundAddrId(Long shopRefundAddrId, Long shopId); + + /** + * 保存商家退货地址 + * @param shopRefundAddr 商家退货地址 + */ + void save(ShopRefundAddr shopRefundAddr); + + /** + * 更新商家退货地址 + * @param shopRefundAddr 商家退货地址 + */ + void update(ShopRefundAddr shopRefundAddr); + + /** + * 根据商家退货地址id删除商家退货地址 + * @param shopRefundAddrId 商家退货地址id + * @param shopId 店铺id + */ + void deleteById(Long shopRefundAddrId, Long shopId); + + /** + * 获取店铺退货地址 + * @param shopId 店铺id + * @return 店铺退货地址 + */ + List listByShopId(Long shopId); + + /** + * 清除店铺缓存 + * @param shopId + */ + void removeCacheByShopId(Long shopId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopSubstituteSalesService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopSubstituteSalesService.java new file mode 100644 index 0000000..aba7995 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopSubstituteSalesService.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.multishop.model.ShopSubstituteSales; + +import java.util.List; + +/** + * 代销设置表 + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +public interface ShopSubstituteSalesService { + + /** + * 分页获取代销设置表列表 + * @param pageDTO 分页参数 + * @return 代销设置表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据店铺id获取代销设置表 + * + * @param shopId 店铺id + * @return 代销设置表 + */ + ShopSubstituteSalesVO getByShopSubstituteSalesId(Long shopId); + + /** + * 保存代销设置表 + * @param shopSubstituteSales 代销设置表 + */ + void save(ShopSubstituteSales shopSubstituteSales); + + /** + * 更新代销设置表 + * @param shopSubstituteSales 代销设置表 + */ + void update(ShopSubstituteSales shopSubstituteSales); + + /** + * 根据代销设置表id删除代销设置表 + * @param shopSubstituteSalesId 代销设置表id + */ + void deleteById(Long shopSubstituteSalesId); + + /** + * 根据shopIds获取商家的代销配置 + * @param shopIds + * @return + */ + List listByShopIds(List shopIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopUserAccountService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopUserAccountService.java new file mode 100644 index 0000000..5fc24b9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopUserAccountService.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.dto.ChangeAccountDTO; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +public interface ShopUserAccountService { + + /** + * 添加账户 + * @param changeAccountDTO 账户信息 + * @return void + */ + ServerResponseEntity save(ChangeAccountDTO changeAccountDTO); + + /** + * 更新账户 + * @param changeAccountDTO 账户信息 + * @return + */ + ServerResponseEntity update(ChangeAccountDTO changeAccountDTO); + + /** + * 根据用户id和系统类型获取用户信息 + * @param userId 用户id + * @param sysType 系统类型 + * @return void + */ + ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopUserService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopUserService.java new file mode 100644 index 0000000..48f7ce4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopUserService.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.multishop.dto.ShopUserDTO; +import com.tmerclub.cloud.multishop.dto.ShopUserRegisterDTO; +import com.tmerclub.cloud.multishop.model.ShopUser; +import com.tmerclub.cloud.multishop.vo.ShopUserVO; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +public interface ShopUserService { + + /** + * 分页获取店铺用户列表 + * @param pageDTO 分页参数 + * @param shopUserDTO 搜索参数 + * @return 店铺用户列表 + */ + PageVO pageByShopId(PageDTO pageDTO, ShopUserDTO shopUserDTO); + + /** + * 获取店铺用户列表 + * @param shopUserDTO 店铺用户dto + * @return 店铺用户列表 + */ + List listShopUser(ShopUserDTO shopUserDTO); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + ShopUserVO getByUserId(Long userId); + + /** + * 根据用户id获取商家用户信息 + * + * @param userId 用户id + * @return 商家用户信息 + */ + ShopUserVO getSimpleByUserId(Long userId); + + /** + * 保存店铺用户信息 + * @param shopUser 店铺用户id + * @param roleIds 角色id列表 + */ + void save(ShopUser shopUser, List roleIds); + + /** + * 更新店铺用户信息 + * @param shopUser 店铺用户id + * @param roleIds 角色id列表 + */ + void update(ShopUser shopUser, List roleIds); + + /** + * 根据店铺用户id删除店铺用户信息 + * @param shopUserId 店铺用户id + */ + void deleteById(Long shopUserId); + + /** + * 获取店主账号的用户id-第一个创建的账号(仅用于审核店铺) + * @param shopId + * @return + */ + Long getUserIdByShopId(Long shopId); + + /** + * 商家注册 + * @param shopUserRegisterDTO + */ + void register(ShopUserRegisterDTO shopUserRegisterDTO); + + /** + * 验证店铺的职工手机号/邮箱/用户名是否存在 + * @param shopUserDTO 店铺职工信息参数 + * @return Boolean true验证通过,该账号不存在 false验证不通过,该账号存在 + */ + ServerResponseEntity verifyShopUserAccount(ShopUserDTO shopUserDTO); + + /** + * 新增店铺职工信息,以及账号 + * @param shopUserDTO 店铺职工参数 + */ + void saveAccount(ShopUserDTO shopUserDTO); + + /** + * 修改店铺职工信息,以及账号 + * @param shopUserDTO 店铺职工参数 + */ + void updateAccount(ShopUserDTO shopUserDTO); + + /** + * 获取员工列表 + * @param shopUserDTO + * @return + */ + List listByShopId(ShopUserDTO shopUserDTO); + + /** + * 根据用户id列表获取 + * @param userIds + * @return + */ + List listShopUserByUserIds(List userIds); + + /** + * 根据用户手机号查询用户数量 + * + * @param mobile 手机号码 + * @return 用户数量 + */ + Integer countAccoutByMobile(String mobile); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWalletService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWalletService.java new file mode 100644 index 0000000..c2cc5c3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWalletService.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.multishop.bo.ShopWalletBO; +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.model.ShopWallet; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; + +import java.util.List; +import java.util.Map; + +/** + * 商家钱包信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public interface ShopWalletService { + + /** + * 保存商家钱包信息 + * @param shopWallet 商家钱包信息 + */ + void save(ShopWallet shopWallet); + + /** + * 更新商家钱包信息 + * @param shopWallet 商家钱包信息 + */ + void update(ShopWallet shopWallet); + + /** + * 通过下单添加商家待结算金额,确认收货后进行结算 + * @param orderSimpleAmountInfos 订单id和店铺id关联信息 + * @param message 订单id和店铺id关联信息 + * @param settledAmountMap 店铺已结算金额map + * @param salesMap 商家的代销配置 + */ + void addAmountByOrder(List orderSimpleAmountInfos, PayNotifyBO message, Map settledAmountMap, Map salesMap); + + /** + * 结算给商家增加结算金额 + * @param orderId 订单id + */ + void addAmountBySettledOrder(OrderChangeShopWalletAmountBO orderId); + + /** + * 通联结算给商家 + * @param orderChangeShopWalletAmountBO 订单 + */ + void addAmountSettlementOrderByAllinPay(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 通过退款,锁定商家钱包金额 + * @param orderChangeShopWalletAmountBO 金额相关信息 + * @return + */ + void refundShopAmountByRefund(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 通过退款,锁定商家钱包金额,待采购 + * @param orderChangeShopWalletAmountBO 金额相关信息 + * @return + */ + void refundShopAmountByRefundAndWaitPur(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 根据店铺id查询店铺钱包信息 + * @param shopId 店铺id + * @return 店铺钱包信息 + */ + ShopWalletVO getByShopId(Long shopId); + + /** + * 获取所有店铺的钱包信息 + * @param shopWalletLogSearchDTO + * @return 钱包信息 + */ + ShopWalletVO getAllShop(ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 分页获取店铺钱包信息 + * @param pageDTO + * @param shopWalletLogSearchDTO + * @return + */ + PageVO pageShopWalletByTime(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO); + + /** + * 订单部分退款导致订单关闭 商家结算操作 + * @param orderChangeShopWalletAmountBO 金额相关信息 + */ + void settlementShopAmountByRefund(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 订单超时未支付尾款 商家结算操作 + * @param orderChangeShopWalletAmountBO 金额相关信息 + */ + void settlementShopAmountByPreSaleFail(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 订单部分退款导致订单关闭 商家结算操作,待采购时的金额处理 + * @param orderChangeShopWalletAmountBO 金额相关信息 + */ + void settlementShopAmountByRefundAndWaitPur(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 修改店铺钱包的待结算金额 + * @param message 分销产生的待结算金额 + */ + void updateByDistributionAmount(List message); + + /** + * 根据店铺ids获取商家钱包信息列表 + * @param shopIds 店铺ids + * @param paySysType 支付系统类型0默认1通联 + * @return 商家钱包信息列表 + */ + List listByShopIds(List shopIds, Integer paySysType); + + /** + * 获取店铺余额 + * @param shopId 店铺id + * @param paySysType 支付系统类型0默认1通联 + * @return + */ + Long getSettlementAmountByShopId(Long shopId, Integer paySysType); + + /** + * 充值成功 + * @param message + */ + void rechargeSuccess(RechargeNotifyBO message); + + /** + * 商家减少结算金额 + * @param shopId + * @param changeAmount + * @param paySysType + * @return + */ + boolean subSettledAmount(Long shopId, Long changeAmount, Integer paySysType); + + /** + * 商家自行处理供应商订单,减少商家结算金额 + * @param supplierRealRefundAmount 减少金额 + * @param orderChangeShopWalletAmountBO 退款信息 + * @param shopWalletLogList 退款信息 + * @param isNowSave 是否立即保存 + */ + void subSettlementAmount(Long supplierRealRefundAmount, OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO, List shopWalletLogList, Boolean isNowSave); + + /** + * 订单部分退款导致订单关闭 商家结算操作(通联支付结算) + * @param orderChangeShopWalletAmountBO 金额相关信息 + */ + void settlementByRefundAndWaitPurAndAllinpay(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWithdrawCashService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWithdrawCashService.java new file mode 100644 index 0000000..c0e6213 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/ShopWithdrawCashService.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.AllinpayShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashConfigDto; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.vo.ShopWithdrawCashVO; + +/** + * 商家提现申请信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public interface ShopWithdrawCashService { + + /** + * 根据店铺id提交提现申请 + * @param shopWithdrawCashDTO + * @param shopId + */ + void apply(ShopWithdrawCashDTO shopWithdrawCashDTO, Long shopId); + + /** + * 通联店铺提现 + * @param shopWithdrawCashDTO + * @param shopId + * @return + */ + String allinpayApply(AllinpayShopWithdrawCashDTO shopWithdrawCashDTO, Long shopId); + + /** + * 确认支付提现订单 + * @param shopWithdrawCashDTO + * @param shopId + */ + void confirmWithdrawPay(AllinpayShopWithdrawCashDTO shopWithdrawCashDTO, Long shopId); + + /** + * 重新发送验证码 + * @param bizOrderNo + * @param shopId + */ + void resendPaySms(String bizOrderNo, Long shopId); + + /** + * 提现回调 + * @param bizOrderNo + * @param payStatus + * @param bizUserId + * @param payFailMessage + */ + void withdrawBack(String bizOrderNo, String payStatus, String bizUserId, String payFailMessage); + + /** + * 根据参数分页获取商家提现记录信息 + * @param pageDTO + * @param shopWithdrawCashDTO + * @return + */ + PageVO pageByParam(PageDTO pageDTO, ShopWithdrawCashDTO shopWithdrawCashDTO); + + /** + * 根据id获取提现申请详情信息 + * @param cashId + * @return + */ + ShopWithdrawCashVO getDetailByCashId(Long cashId); + + /** + * 审核商家提现信息 + * @param shopWithdrawCashDTO + * @param userId + */ + void auditWithdrawCash(ShopWithdrawCashDTO shopWithdrawCashDTO, Long userId); + + /** + * 保存提现配置 + * @param shopWithdrawCashDto + */ + void saveConfig(ShopWithdrawCashConfigDto shopWithdrawCashDto); + + /** + * 获取提现配置 + * @return + */ + ShopWithdrawCashConfigDto getConfig(); + + /** + * 检验提现金额 + * @param amount + */ + void checkDrawCashAmount(Long amount); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/WalletLogOperationService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/WalletLogOperationService.java new file mode 100644 index 0000000..08c58d8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/WalletLogOperationService.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service; + + +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; + +import java.util.List; +import java.util.Map; + +/** + * 商家钱包信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +public interface WalletLogOperationService { + + /** + * 通过下单添加商家待结算金额,确认收货后进行结算 + * @param orderSimpleAmountInfos 订单id和店铺id关联信息 + * @param message 订单id和店铺id关联信息 + * @param settledAmountMap 店铺已结算金额map + * @param salesMap 商家的代销配置 + */ + void addAmountByOrder(List orderSimpleAmountInfos, PayNotifyBO message, Map settledAmountMap, Map salesMap); + + /** + * 结算给商家增加结算金额 + * @param orderId 订单id + */ + void addAmountBySettledOrder(Long orderId); + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/CompanyAuditingServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/CompanyAuditingServiceImpl.java new file mode 100644 index 0000000..1152859 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/CompanyAuditingServiceImpl.java @@ -0,0 +1,457 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.UpdateCompanyInfoResp; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.ShopAuditingDTO; +import com.tmerclub.cloud.multishop.dto.ShopCompanyAuditingDTO; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.mapper.CompanyAuditingMapper; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.model.ShopCompany; +import com.tmerclub.cloud.multishop.model.ShopCompanyAuditing; +import com.tmerclub.cloud.multishop.service.*; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import com.tmerclub.cloud.multishop.vo.ShopCompanyAuditingVO; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * @author chiley + */ +@Service +public class CompanyAuditingServiceImpl implements CompanyAuditingService { + + private static final Logger logger = LoggerFactory.getLogger(CompanyAuditingServiceImpl.class); + + @Autowired + private CompanyAuditingMapper companyAuditingMapper; + @Autowired + private ShopCompanyService shopCompanyService; + @Autowired + private ShopAllinpayService shopAllinpayService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private ShopDetailMapper shopDetailMapper; + @Autowired + private ShopDetailService shopDetailService; + @Autowired + private ShopBankCardService shopBankCardService; + @Autowired + private ShopAuditingService shopAuditingService; + + @Override + public void updateRemark(ShopCompanyAuditingDTO shopCompanyAuditingDTO) { + companyAuditingMapper.update(BeanUtil.map(shopCompanyAuditingDTO, ShopCompanyAuditing.class)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void applyChangeCompanyInfo(ShopCompanyDTO shopCompanyDTO) { + ShopDetailVO shopDetailVO = shopDetailMapper.getByShopId(shopCompanyDTO.getShopId()); + ShopCompanyVO shopCompanyVO = new ShopCompanyVO(); + if (shopAllinpayService.getIsAllinpay()) { + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("获取影印件还未通过的商家{}工商信息,状态为待审核", shopCompanyDTO.getShopId()); + shopCompanyVO = shopCompanyService.getShopCompanyByShopIdAndStatus(shopCompanyDTO.getShopId(), AuditStatus.WAITAUDIT.value()); + } else { + logger.info("获取影印件已经通过的商家{}工商信息,状态为审核成功", shopCompanyDTO.getShopId()); + shopCompanyVO = shopCompanyService.getShopCompanyByShopIdAndStatus(shopCompanyDTO.getShopId(), AuditStatus.SUCCESSAUDIT.value()); + } + } + if (StrUtil.isNotBlank(shopCompanyDTO.getLegalPhone())) { + if (!PrincipalUtil.isDbPhone(shopCompanyDTO.getLegalPhone(), shopCompanyVO.getLegalPhone(), true)) { + throw new LuckException("请输入正确的手机号"); + } + if (shopCompanyDTO.getLegalPhone().contains(Constant.ASTERISK)) { + shopCompanyDTO.setLegalPhone(shopCompanyVO.getLegalPhone()); + } + } + // 把之前审核不通过的工商信息删除 + shopCompanyService.deleteByShopIdAndStatus(shopCompanyDTO.getShopId(), AuditStatus.FAILAUDIT.value()); + // 保存变更工商信息 + ShopCompany shopCompany = BeanUtil.map(shopCompanyDTO, ShopCompany.class); + shopCompany.setStatus(AuditStatus.WAITAUDIT.value()); + shopCompanyService.save(shopCompany, false); + // 生成审核信息 + Long companyAuditingId = generateAuditInformation(shopCompany); + if (shopAllinpayService.getIsAllinpay()) { + if (Objects.equals(shopDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + logger.info("商家{}工商信息已经通过审核,更新工商信息内容和状态和后续处理", shopCompanyDTO.getShopId()); + // 审核成功的要进行更改的 + updateCompany(shopCompanyDTO, companyAuditingId, shopCompanyVO, shopDetailVO); + } + } + } + + private void updateCompany(ShopCompanyDTO shopCompanyDTO, Long companyAuditingId, ShopCompanyVO shopCompanyVO, ShopDetailVO shopDetailVO) { + Long shopId = shopCompanyDTO.getShopId(); + ServerResponseEntity idCardStatus = allinpayFeignClient.getIdCardStatus(AllinpayConstant.SHOP + shopId); + if (!idCardStatus.isSuccess()) { + throw new LuckException(idCardStatus.getMsg()); + } + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData())) { + logger.info("商家{}影印件信息状态{}和通联影印件信息状态{}不一致,处理影印件状态", shopCompanyDTO.getShopId(), + shopDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData()); + // 不一致先更新 + shopDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SHOP + shopId, idCardStatus.getData()); + } + // 改了基本信息 + boolean isChangeInfo = getIsChangeInfo(shopCompanyDTO, shopCompanyVO); + // 改了关键信息 + boolean isChangeKeyInfo = getIsChangeKeyInfo(shopCompanyDTO, shopCompanyVO); + // 改了影印件 + boolean isChangeIdCard = getIsChangeIdCard(shopCompanyDTO, shopCompanyVO); + if (!isChangeInfo && !isChangeKeyInfo && !isChangeIdCard) { + // 没有改通联有关信息直接审核成功 + logger.info("没有修改通联有关信息,店铺{}工商信息审核通过", shopId); + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.SUCCESSAUDIT.value(), "")); + return; + } + + if (isChangeInfo || isChangeKeyInfo) { + logger.info("商家修改了基本信息{}或关键信息{},交给通联审核", isChangeInfo, isChangeKeyInfo); + // 对于信息修改操作,上送所有需修改信息均认证成功才操作修改,否则信息均不修改; + UpdateCompanyInfoDTO updateCompanyInfoDTO = new UpdateCompanyInfoDTO(AllinpayConstant.SHOP + shopId); + updateCompanyInfoDTO.setCompanyName(shopCompanyDTO.getFirmName()); + updateCompanyInfoDTO.setCompanyAddress(shopCompanyDTO.getResidence()); + updateCompanyInfoDTO.setLegalPhone(shopCompanyDTO.getLegalPhone()); + updateCompanyInfoDTO.setLegalIds(shopCompanyDTO.getLegalIds()); + updateCompanyInfoDTO.setLegalName(shopCompanyDTO.getRepresentative()); + // 通联审核 + ServerResponseEntity response = allinpayFeignClient.updateCompanyInfo(updateCompanyInfoDTO); + if (!response.isSuccess()) { + logger.info("通联审核店铺{}修改的工商信息失败,拒绝更新,原因为{}", shopId, response.getMsg()); + // 审核失败不会更新影印件审核,只需要拒绝更新就可以了 + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), response.getMsg())); + return; + } + UpdateCompanyInfoResp updateCompanyInfoResp = response.getData(); + if (Objects.equals(updateCompanyInfoResp.getResult(), com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode())) { + logger.info("通联审核店铺{}修改的工商信息成功", shopId); + if (isChangeKeyInfo) { + logger.info("店铺{}修改了关键信息,并且审核通过,更新店铺为通联上线待审核,等待影印件重新审核通过", shopId); + // 修改了会触发ocr的 + //审核成功 通联更新了企业信息 更新会触发ocr,店铺需要下线等待影印件审核通过 + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.SUCCESSAUDIT.value(), "")); + // 更新店铺为通联上线待审核,影印件审核通过即可营业 + shopDetailMapper.updateShopToWaitAudit(shopCompanyDTO.getShopId()); + } else if (!isChangeIdCard) { + logger.info("店铺{}没有修改了关键信息,也没有影印件要上传,直接审核成功", shopId); + // 没有修改关键信息,没有上传影印件可以直接成功 + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.SUCCESSAUDIT.value(), "")); + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("店铺{}影印件状态异常,更新影印件", shopId); + shopDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SHOP + shopId, idCardStatus.getData()); + } + return; + } + } else if (Objects.equals(updateCompanyInfoResp.getResult(), com.tmerclub.cloud.api.payment.constant.AuditStatus.FAIL.getCode())) { + logger.info("通联审核店铺{}修改的工商信息失败,拒绝更新", shopId); + // 审核失败不会更新影印件审核,只需要拒绝更新就可以了 + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), updateCompanyInfoResp.getFailReason())); + return; + } + } + + // 如果有改变影印件,没有改变别的信息,在这里影印件需要重新上传,上传失败拒绝更新 + onlyChangeIdCard(shopCompanyDTO, companyAuditingId, shopDetailVO, shopId, idCardStatus, isChangeInfo, isChangeKeyInfo); + } + + private void onlyChangeIdCard(ShopCompanyDTO shopCompanyDTO, Long companyAuditingId, ShopDetailVO shopDetailVO, Long shopId, ServerResponseEntity idCardStatus, boolean isChangeInfo, boolean isChangeKeyInfo) { + if (!isChangeInfo && !isChangeKeyInfo) { + logger.info("店铺{}只修改影印件,影印件上传", shopId); + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData()) && Objects.equals(idCardStatus.getData(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("店铺{}影印件已经通过审核,但是店铺影印件状态没更新,更新状态并且拒绝影印件上传审核", shopId); + // 如果影印件上传成功但是这里没有更新的话要更新一下 + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), "店铺影印件已经审核通过,无需更新")); + shopDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SHOP + shopId, idCardStatus.getData()); + return; + } else if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData())) { + logger.info("店铺{}影印件状态没更新,更新状态", shopId); + shopDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SHOP + shopId, idCardStatus.getData()); + } else if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("店铺{}影印件已经通过审核,拒绝影印件上传审核", shopId); + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), "店铺影印件已经审核通过,无需更新")); + return; + } + String result = shopCompanyService.idCardCollect(BeanUtil.map(shopCompanyDTO, ShopCompanyVO.class), shopId); + if (!Objects.equals(result, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + logger.info("店铺{}影印件上传失败,拒绝影印件更新", shopId); + audit(new ShopCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), "店铺影印件上传失败,请重新上传")); + return; + } + // 更新店铺为通联上线待审核,影印件审核通过即可营业 + shopDetailMapper.updateShopToWaitAudit(shopCompanyDTO.getShopId()); + // 更新店铺影印件采集状态 + shopDetailMapper.updateAllinpayIdCardStatus(shopCompanyDTO.getShopId(), IdCardCollectProcessStatus.WAIT_AUDIT.value()); + } + } + + private boolean getIsChangeIdCard(ShopCompanyDTO shopCompanyDTO, ShopCompanyVO shopCompany) { + if (Objects.isNull(shopCompany)) { + return true; + } + if (!Objects.equals(shopCompany.getIdentityCardFront(), shopCompanyDTO.getIdentityCardFront())) { + return true; + } + if (!Objects.equals(shopCompany.getBusinessLicense(), shopCompanyDTO.getBusinessLicense())) { + return true; + } + return !Objects.equals(shopCompany.getIdentityCardLater(), shopCompanyDTO.getIdentityCardLater()); + } + + private boolean getIsChangeInfo(ShopCompanyDTO shopCompanyDTO, ShopCompanyVO shopCompanyVO) { + if (Objects.isNull(shopCompanyVO)) { + return true; + } + if (!Objects.equals(shopCompanyDTO.getResidence(), shopCompanyVO.getResidence())) { + return true; + } + return !Objects.equals(shopCompanyDTO.getLegalPhone(), shopCompanyVO.getLegalPhone()); + } + + private boolean getIsChangeKeyInfo(ShopCompanyDTO shopCompanyDTO, ShopCompanyVO shopCompanyVO) { + if (Objects.isNull(shopCompanyVO)) { + return true; + } + if (!Objects.equals(shopCompanyDTO.getRepresentative(), shopCompanyVO.getRepresentative())) { + return true; + } + if (!Objects.equals(shopCompanyDTO.getFirmName(), shopCompanyVO.getFirmName())) { + return true; + } + return !Objects.equals(shopCompanyDTO.getLegalIds(), shopCompanyVO.getLegalIds()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCompanyInfoResult(String bizUserId, Integer status, Integer result, String failReason) { + Long shopId = Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH)); + ShopCompanyVO waitAuditShopCompany = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + ShopCompanyVO successShopCompany = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.SUCCESSAUDIT.value()); + ShopCompanyAuditingVO shopCompanyAuditingVO = getLatestAuditingByShopId(shopId); + // 更新失败 + if (Objects.equals(result, com.tmerclub.cloud.api.payment.constant.AuditStatus.FAIL.getCode())) { + logger.info("通联回调审核店铺{}修改的工商信息失败,拒绝更新,原因为{}", shopId, failReason); + audit(new ShopCompanyAuditingDTO(shopCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } + // 更新成功 + else if (Objects.equals(result, com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode())) { + // 如果有改变企业名称,法人名称,需要重新签约提现协议 + checkChangeName(waitAuditShopCompany, successShopCompany, shopId); + if (getIsChangeIdCard(BeanUtil.map(waitAuditShopCompany, ShopCompanyDTO.class), successShopCompany)) { + logger.info("通联回调审核店铺{}修改的工商信息成功,修改了影印件,重新上传影印件", shopId); + // 修改了影印件 + String idCardCollectResult = shopCompanyService.idCardCollect(waitAuditShopCompany, shopId); + if (!Objects.equals(idCardCollectResult, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + logger.info("通联回调审核店铺{}修改的工商信息成功,影印件上传异常,拒绝申请", shopId); + audit(new ShopCompanyAuditingDTO(shopCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), "影印件上传异常,请重试")); + return; + } + // 更新店铺为通联上线待审核,影印件审核通过即可营业 + shopDetailMapper.updateShopToWaitAudit(shopId); + // 更新店铺影印件采集状态 + shopDetailMapper.updateAllinpayIdCardStatus(shopId, IdCardCollectProcessStatus.WAIT_AUDIT.value()); + } else { + logger.info("通联回调审核店铺{}修改的工商信息成功,没有修改影印件", shopId); + if (!Objects.equals(status, IdCardCollectProcessStatus.ALL.value())) { + logger.info("通联回调审核店铺{}修改的工商信息成功,没有修改影印件,影印件ocr失败", shopId); + // 影印件ocr失败了,对店铺进行状态更新 + // 更新店铺为通联上线待审核,影印件审核通过即可营业 + shopDetailMapper.updateShopToWaitAudit(shopId); + // 更新店铺影印件采集状态 + shopDetailMapper.updateAllinpayIdCardStatus(shopId, status); + return; + } + // 审核成功,影印件也成功 + audit(new ShopCompanyAuditingDTO(shopCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.SUCCESSAUDIT.value(), "")); + } + } + } + + + private void checkChangeName(ShopCompanyVO shopCompanyDTO, ShopCompanyVO shopCompany, Long shopId) { + if (!Objects.equals(shopCompany.getFirmName(), shopCompanyDTO.getFirmName())) { + logger.info("通联回调审核店铺{}修改的工商信息成功,修改了企业名称,需要重新签约对公提现协议", shopId); + shopDetailMapper.updateAcctProtocolNoByType(shopId, SignAcctType.COMPANY.getValue(), null); + } + if (!Objects.equals(shopCompany.getRepresentative(), shopCompanyDTO.getRepresentative())) { + logger.info("通联回调审核店铺{}修改的工商信息成功,修改了法人姓名,需要重新签约法人提现协议", shopId); + shopDetailMapper.updateAcctProtocolNoByType(shopId, SignAcctType.LEGAL_PERSON.getValue(), null); + } + } + + @Override + public ShopCompanyAuditingVO getLatestAuditingByShopId(Long shopId) { + return companyAuditingMapper.getLatestAuditingByShopId(shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void revoke(Long shopId) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("当前无法撤销申请"); + } + ShopCompanyAuditingVO shopCompanyAuditingVO = getLatestAuditingByShopId(shopId); + if (Objects.isNull(shopCompanyAuditingVO) || !Objects.equals(shopCompanyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("申请信息未能找到,请刷新页面"); + } + // 删除申请变更的工商信息 + shopCompanyService.deleteByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + // 删除申请审核信息 + companyAuditingMapper.deleteById(shopCompanyAuditingVO.getCompanyAuditingId()); + } + + @Override + public PageVO page(PageDTO pageDTO, ShopCompanyAuditingDTO shopCompanyAuditingDTO) { + return PageUtil.doPage(pageDTO, () -> companyAuditingMapper.list(shopCompanyAuditingDTO)); + } + + @Override + public ShopCompanyAuditingVO getAuditInfo(Long shopId) { + ShopCompanyAuditingVO shopCompanyAuditingVO = getLatestAuditingByShopId(shopId); + if (Objects.isNull(shopCompanyAuditingVO)) { + if (shopAllinpayService.getIsAllinpay()) { + ShopCompanyVO shopCompanyVO = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + ShopCompanyAuditingVO shopCompanyAuditing = new ShopCompanyAuditingVO(); + shopCompanyAuditing.setShopCompanyVO(shopCompanyVO); + return shopCompanyAuditing; + } + return null; + } + ShopCompanyVO shopCompanyVO = shopCompanyService.getById(shopCompanyAuditingVO.getShopCompanyId()); + shopCompanyAuditingVO.setShopCompanyVO(shopCompanyVO); + return shopCompanyAuditingVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void audit(ShopCompanyAuditingDTO shopCompanyAuditingDTO) { + boolean isAllinpay = shopAllinpayService.getIsAllinpay(); + ShopCompanyAuditing companyAuditing = companyAuditingMapper.getById(shopCompanyAuditingDTO.getCompanyAuditingId()); + if (Objects.isNull(companyAuditing) || !Objects.equals(companyAuditing.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("申请信息未能找到,请刷新页面"); + } + companyAuditing.setAuditorId(isAllinpay ? null : AuthUserContext.get().getUserId()); + // 审核不通过 + if (Objects.equals(shopCompanyAuditingDTO.getStatus(), AuditStatus.FAILAUDIT.value())) { + companyAuditing.setStatus(AuditStatus.FAILAUDIT.value()); + companyAuditing.setRemarks(shopCompanyAuditingDTO.getRemarks()); + companyAuditingMapper.update(companyAuditing); + // 把对应的工商信息设置为审核未通过状态 + ShopCompany shopCompany = new ShopCompany(); + shopCompany.setShopCompanyId(companyAuditing.getShopCompanyId()); + shopCompany.setStatus(AuditStatus.FAILAUDIT.value()); + shopCompanyService.updateById(shopCompany); + return; + } + // 审核通过(if不能省略,防止传入非法参数) + if (Objects.equals(shopCompanyAuditingDTO.getStatus(), AuditStatus.SUCCESSAUDIT.value())) { + companyAuditing.setStatus(AuditStatus.SUCCESSAUDIT.value()); + companyAuditingMapper.update(companyAuditing); + + shopCompanyService.batchUpdateStatus(companyAuditing.getShopId(), AuditStatus.FAILAUDIT.value(), null); + // 把对应的工商信息设置为启用状态 + ShopCompany shopCompany = new ShopCompany(); + shopCompany.setShopCompanyId(companyAuditing.getShopCompanyId()); + shopCompany.setStatus(AuditStatus.SUCCESSAUDIT.value()); + shopCompanyService.updateById(shopCompany); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAllinpayShopStatus(String bizUserId, Integer status, String failReason, Integer isPassShop) { + Long shopId = Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH)); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.equals(status, com.tmerclub.cloud.api.payment.constant.AuditStatus.FAIL.getCode())) { + logger.info("通联审核商家企业信息失败"); + if (Objects.equals(shopDetailVO.getAllinpayShopStatus(), AllinpayShopStatus.OFFLINE.value()) && Objects.equals(shopDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.FAIL.value())) { + logger.info("店铺{}状态已经处理过,无需下线处理", shopDetailVO.getShopName()); + return; + } + auditFail(bizUserId, failReason, shopId); + } else if (Objects.equals(status, com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode())) { + logger.info("通联审核商家企业信息成功"); + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value()) && Objects.equals(shopDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + return; + } + ShopCompanyVO shopCompany = shopCompanyService.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.WAITAUDIT.value()); + // 审核成功 更新店铺状态 + shopBankCardService.updateShopAllinpayStatusToSuccess(shopId); + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + // 调用影印件上传接口 + String idCardResult = shopCompanyService.idCardCollect(shopCompany, shopId); + if (!Objects.equals(idCardResult, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + logger.error("店铺设置企业信息回调,影印件上传审核失败:{}", idCardResult); + } + } + } + shopDetailService.removeCacheByShopId(shopId); + } + + private void auditFail(String bizUserId, String failReason, Long shopId) { + ShopCompanyAuditingVO shopCompanyAuditingVO = getLatestAuditingByShopId(shopId); + if (Objects.nonNull(shopCompanyAuditingVO) && Objects.equals(shopCompanyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + logger.info("店铺Id{}已经开店,通联审核失败,拒绝店铺的工商申请", shopId); + // 如果是已经开店来审核的话要把审核拒绝通过 + audit(new ShopCompanyAuditingDTO(shopCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } else { + logger.info("店铺Id{}还未开店,通联审核失败,拒绝店铺的开店申请", shopId); + // 还未开店,审核失败 + ShopAuditingVO shopAuditing = shopAuditingService.getByshopId(shopId); + ShopAuditingDTO shopAuditingDTO = BeanUtil.map(shopAuditing, ShopAuditingDTO.class); + shopAuditingDTO.setStatus(AuditStatus.FAILAUDIT.value()); + shopAuditingDTO.setRemarks(failReason); + shopDetailService.audit(shopAuditingDTO); + } + // 更新审核失败——平台下线 + shopDetailMapper.updateShopAuditFail(shopId); + logger.info("店铺id为{}通联审核失败原因:{}", bizUserId, failReason); + } + + /** + * 生成店铺申请记录 + * + * @param shopCompany + */ + private Long generateAuditInformation(ShopCompany shopCompany) { + ShopCompanyAuditing shopCompanyAuditing = new ShopCompanyAuditing(); + shopCompanyAuditing.setShopId(shopCompany.getShopId()); + shopCompanyAuditing.setShopCompanyId(shopCompany.getShopCompanyId()); + shopCompanyAuditing.setUserId(AuthUserContext.get().getUserId()); + shopCompanyAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + companyAuditingMapper.insert(shopCompanyAuditing); + return shopCompanyAuditing.getCompanyAuditingId(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/HotSearchServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/HotSearchServiceImpl.java new file mode 100644 index 0000000..6714a81 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/HotSearchServiceImpl.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.HotSearchDTO; +import com.tmerclub.cloud.multishop.mapper.HotSearchMapper; +import com.tmerclub.cloud.multishop.model.HotSearch; +import com.tmerclub.cloud.multishop.service.HotSearchService; +import com.tmerclub.cloud.multishop.vo.HotSearchVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 热搜 + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +@Service +public class HotSearchServiceImpl implements HotSearchService { + + @Autowired + private HotSearchMapper hotSearchMapper; + + @Override + public PageVO page(PageDTO pageDTO, HotSearchDTO hotSearchDTO) { + return PageUtil.doPage(pageDTO, () -> hotSearchMapper.list(hotSearchDTO)); + } + + @Override + public HotSearchVO getByHotSearchId(Long hotSearchId) { + return hotSearchMapper.getByHotSearchId(hotSearchId); + } + + @Override + public void save(HotSearch hotSearch) { + hotSearchMapper.save(hotSearch); + } + + @Override + public void update(HotSearch hotSearch) { + hotSearchMapper.update(hotSearch); + } + + @Override + public void deleteById(Long hotSearchId, Long shopId) { + hotSearchMapper.deleteById(hotSearchId, shopId); + } + + @Override + @Cacheable(cacheNames = CacheNames.HOT_SEARCH_LIST_KEY, key = "#shopId + ':' + #type") + public List listByShopId(Long shopId, Integer type) { + return hotSearchMapper.listByShopId(shopId, type); + } + + @Override + @CacheEvict(cacheNames = CacheNames.HOT_SEARCH_LIST_KEY, key = "#shopId + ':' + #type") + public void removeHotSearchListCache(Long shopId, Integer type) { + } + + @Override + public boolean checkExist(Long shopId, String title, Integer type) { + return hotSearchMapper.countExist(shopId, title, type) > 0; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopAuditingServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopAuditingServiceImpl.java new file mode 100644 index 0000000..5e34474 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopAuditingServiceImpl.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.multishop.dto.AuditingInfoDTO; +import com.tmerclub.cloud.multishop.mapper.ShopAuditingMapper; +import com.tmerclub.cloud.multishop.model.ShopAuditing; +import com.tmerclub.cloud.multishop.service.ShopAuditingService; +import com.tmerclub.cloud.multishop.vo.ShopAuditingInfoVO; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 商家审核信息 + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +@Service +public class ShopAuditingServiceImpl implements ShopAuditingService { + + @Autowired + private ShopAuditingMapper shopAuditingMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> shopAuditingMapper.list()); + } + + @Override + public ShopAuditingVO getByShopAuditingId(Long shopAuditingId) { + return shopAuditingMapper.getByShopAuditingId(shopAuditingId); + } + + @Override + public void save(ShopAuditing shopAuditing) { + shopAuditingMapper.save(shopAuditing); + } + + @Override + public void update(ShopAuditing shopAuditing) { + shopAuditingMapper.update(shopAuditing); + } + + @Override + public void deleteById(Long shopAuditingId) { + shopAuditingMapper.deleteById(shopAuditingId); + } + + @Override + public ShopAuditingVO getByshopId(Long shopId) { + return shopAuditingMapper.getByshopId(shopId); + } + + @Override + public PageVO auditingInfoPage(PageDTO pageDTO, AuditingInfoDTO auditingInfoDTO) { + return PageUtil.doPage(pageDTO, () -> shopAuditingMapper.auditingInfoList(auditingInfoDTO)); + } + + @Override + public void updateToFail(List shopIds) { + shopAuditingMapper.updateToFail(shopIds); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopBankCardServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopBankCardServiceImpl.java new file mode 100644 index 0000000..a70f530 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopBankCardServiceImpl.java @@ -0,0 +1,453 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.SetCompanyInfoResp; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.constant.IsDefault; +import com.tmerclub.cloud.multishop.constant.ShopWithdrawCashStatus; +import com.tmerclub.cloud.multishop.dto.AllinpayShopBankCardDTO; +import com.tmerclub.cloud.multishop.dto.ShopAuditingDTO; +import com.tmerclub.cloud.multishop.dto.ShopBankCardDTO; +import com.tmerclub.cloud.multishop.dto.ShopCompanyAuditingDTO; +import com.tmerclub.cloud.multishop.mapper.ShopBankCardMapper; +import com.tmerclub.cloud.multishop.mapper.ShopCompanyMapper; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.mapper.ShopWithdrawCashMapper; +import com.tmerclub.cloud.multishop.model.ShopAuditing; +import com.tmerclub.cloud.multishop.model.ShopBankCard; +import com.tmerclub.cloud.multishop.service.*; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import com.tmerclub.cloud.multishop.vo.ShopCompanyAuditingVO; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author lth + * @Date 2021/4/25 17:02 + */ +@Service +public class ShopBankCardServiceImpl implements ShopBankCardService { + private static final Logger LOGGER = LoggerFactory.getLogger(ShopBankCardServiceImpl.class); + + @Autowired + private ShopBankCardMapper shopBankCardMapper; + @Autowired + private ShopWithdrawCashMapper shopWithdrawCashMapper; + @Autowired + private ShopApplyService shopApplyService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private ShopDetailMapper shopDetailMapper; + @Autowired + private ShopUserService shopUserService; + @DubboReference + private AccountFeignClient accountFeignClient; + @Autowired + private ShopCompanyMapper shopCompanyMapper; + @Autowired + @Lazy + private CompanyAuditingService companyAuditingService; + @Autowired + @Lazy + private ShopDetailService shopDetailService; + @Autowired + private ShopAuditingService shopAuditingService; + + + @Override + public void save(ShopBankCard shopBankCard) { + shopBankCardMapper.save(shopBankCard); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertBatch(List shopBankCardDTOList, Long shopId) { + if (CollUtil.isEmpty(shopBankCardDTOList)) { + return; + } + List shopBankCardVos = shopBankCardMapper.listByShopId(shopId); + if (CollUtil.isEmpty(shopBankCardVos)) { + shopBankCardVos = new ArrayList<>(0); + } + // 检查银行卡信息 + this.checkSaveBankCardList(shopBankCardVos, shopBankCardDTOList, shopId); + shopBankCardMapper.insertBatch(shopBankCardDTOList, shopId); + } + + @Override + public List listByShopId(Long shopId) { + return shopBankCardMapper.listByShopId(shopId); + } + + @Override + public void deleteByShopBankCardId(Long shopBankCardId, Long shopId) { + ShopBankCardVO shopBankCard = shopBankCardMapper.getByShopBankCardId(shopBankCardId); + if (Objects.equals(shopBankCard.getIsDefault(), 1)) { + // 不能删除默认银行卡 + throw new LuckException("不能删除默认银行卡"); + } + // 检查是否为最后一张银行卡 + if (shopBankCardMapper.countByShopId(shopId) == 1) { + throw new LuckException("至少保留一张银行卡"); + } + // 检查是否属于当前店铺 + this.checkIsCurrentShop(shopId, shopBankCardId); + // 检查是否处于提现状态 + this.checkIsWithdraw(shopBankCardId); + // 进行删除 + shopBankCardMapper.deleteById(shopBankCardId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertBatchAndSubmitApply(List shopBankCardDTOList, Long shopId) { + if (Objects.equals(AuthUserContext.get().getIsPassShop(), IsPassShopEnum.YES.value())) { + // 店铺已入驻不能调用该方法 + throw new LuckException("接口调用错误"); + } + if (shopBankCardDTOList == null || shopBankCardDTOList.size() == 0) { + throw new LuckException("至少要添加一个银行卡"); + } + // 先删除已保存的银行卡信息 + shopBankCardMapper.deleteByShopId(AuthUserContext.get().getTenantId()); + // 检查银行卡信息 + this.checkSaveBankCardList(new ArrayList<>(Constant.INITIAL_CAPACITY), shopBankCardDTOList, shopId); + // 保存银行卡信息 + shopBankCardMapper.insertBatch(shopBankCardDTOList, shopId); + // 提交开店申请 + shopApplyService.apply(shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertAndSetCompanyInfo(AllinpayShopBankCardDTO allinpayShopBankCardDTO, Long shopId, ShopCompanyVO shopCompany) { + // 保存数据到数据库 + shopBankCardMapper.deleteByShopId(shopId); + ShopBankCard shopBankCard = new ShopBankCard(); + shopBankCard.setShopId(shopId); + shopBankCard.setBankName(allinpayShopBankCardDTO.getParentBankName()); + shopBankCard.setBranchName(allinpayShopBankCardDTO.getBankName()); + shopBankCard.setOpeningBank(allinpayShopBankCardDTO.getParentBankName()); + shopBankCard.setRecipientName(shopCompany.getFirmName()); + shopBankCard.setCardNo(allinpayShopBankCardDTO.getAccountNo()); + shopBankCard.setStatus(StatusEnum.ENABLE.value()); + shopBankCard.setUnionBank(allinpayShopBankCardDTO.getUnionBank()); + shopBankCard.setBankCardPro(1); + shopBankCard.setBankCardNo(allinpayShopBankCardDTO.getAccountNo()); + shopBankCardMapper.save(shopBankCard); + ShopDetailVO shopDetailVO = shopDetailMapper.getByShopId(shopId); + if (Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.APPLYING.value())) { + LOGGER.info("店铺{}提交开店申请", shopId + "shopName:" + shopDetailVO.getShopName()); + // 提交开店申请 + shopApplyService.apply(shopId); + } + // 通联设置企业信息及后续处理 + allinpaySetCompanyInfo(allinpayShopBankCardDTO, shopId, shopCompany, shopDetailVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void allinpaySetCompanyInfo(AllinpayShopBankCardDTO allinpayShopBankCardDTO, Long shopId, ShopCompanyVO shopCompany, ShopDetailVO shopDetailVO) { + SetCompanyInfoDTO setCompanyInfoDTO = BeanUtil.map(allinpayShopBankCardDTO, SetCompanyInfoDTO.class); + setCompanyInfoDTO.setCompanyName(shopCompany.getFirmName()); + setCompanyInfoDTO.setCompanyAddress(shopCompany.getResidence()); + setCompanyInfoDTO.setUniCredit(shopCompany.getCreditCode()); + setCompanyInfoDTO.setLegalName(shopCompany.getRepresentative()); + setCompanyInfoDTO.setLegalPhone(shopCompany.getLegalPhone()); + setCompanyInfoDTO.setLegalIds(shopCompany.getLegalIds()); + setCompanyInfoDTO.setBizUserId(AllinpayConstant.SHOP + shopId); + // 设置完企业信息——店铺变为上线待审核(已开店)/开店待审核(未开店)——回调假如成功更改为营业,失败则为审核失败,重新填写,平台开店也一样 + ServerResponseEntity response = allinpayFeignClient.setCompanyInfo(setCompanyInfoDTO); + LOGGER.info("店铺{}设置企业信息结果:{}", shopId + "shopName:" + shopDetailVO.getShopName(), response); + ShopCompanyAuditingVO shopCompanyAuditingVO = companyAuditingService.getLatestAuditingByShopId(shopId); + ServerResponseEntity accountInfoByTenantId = accountFeignClient.getAccountInfoByTenantId(shopId, SysTypeEnum.MULTISHOP.value()); + String failReason = response.getMsg(); + if (!response.isSuccess()) { + if (Objects.equals(failReason, AllinpayConstant.SET_COMPANY_INFO_RESULT)) { + LOGGER.info("当前商家在通联已审核通过,无法设置企业信息。更新店铺状态,上传影印件,等待影印件通过审核。"); + // 审核成功 更新店铺企业信息审核状态为审核通过,待影印件通过后即可将通联店铺状态更改为营业中,并且把工商信息修改为成功 + updateShopStatusToWaitAudit(shopId, shopDetailVO, shopCompanyAuditingVO); + companyAuditingService.updateAllinpayShopStatus(AllinpayConstant.SHOP + shopId, com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode(), + "", accountInfoByTenantId.getData().getIsPassShop()); + return; + } + // 更新审核失败 + if (Objects.nonNull(shopCompanyAuditingVO)) { + // 如果是已经开店来审核的话要把审核拒绝通过 + if (Objects.equals(shopCompanyAuditingVO.getStatus(), AuditStatus.FAILAUDIT.value())) { + LOGGER.info("已开店商家:{}审核失败,更新失败原因:{}", shopId + "shopName:" + shopDetailVO.getShopName(), failReason); + companyAuditingService.updateRemark(new ShopCompanyAuditingDTO(shopCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } else { + LOGGER.info("已开店商家:{}审核失败,开店拒绝通过,原因为:{}", shopId + "shopName:" + shopDetailVO.getShopName(), failReason); + companyAuditingService.audit(new ShopCompanyAuditingDTO(shopCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } + } + if (Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.APPLYING.value()) || Objects.equals(accountInfoByTenantId.getData().getIsPassShop(), 0)) { + // 申请拒绝 + ShopAuditingVO shopAuditing = shopAuditingService.getByshopId(shopId); + ShopAuditingDTO shopAuditingDTO = BeanUtil.map(shopAuditing, ShopAuditingDTO.class); + shopAuditingDTO.setStatus(AuditStatus.FAILAUDIT.value()); + shopAuditingDTO.setRemarks(failReason); + if (Objects.equals(shopAuditing.getStatus(), AuditStatus.FAILAUDIT.value())) { + LOGGER.info("申请开店商家:{}审核失败,更新失败原因:{}", shopId + "shopName:" + shopDetailVO.getShopName(), failReason); + shopAuditingService.update(BeanUtil.map(shopAuditingDTO, ShopAuditing.class)); + } else { + LOGGER.info("申请开店商家:{}审核失败,开店拒绝通过,原因为:{}", shopId + "shopName:" + shopDetailVO.getShopName(), failReason); + shopDetailService.audit(shopAuditingDTO); + } + } + shopDetailMapper.updateShopAuditFail(shopId); + return; + } + SetCompanyInfoResp setCompanyInfoResp = response.getData(); + updateShopStatusToWaitAudit(shopId, shopDetailVO, shopCompanyAuditingVO); + if (Objects.nonNull(setCompanyInfoResp.getResult())) { + LOGGER.info("通联回调不为空,进行店铺审核后续处理"); + companyAuditingService.updateAllinpayShopStatus(setCompanyInfoResp.getBizUserId(), setCompanyInfoResp.getResult(), "", accountInfoByTenantId.getData().getIsPassShop()); + } + } + + private void updateShopStatusToWaitAudit(Long shopId, ShopDetailVO shopDetailVO, ShopCompanyAuditingVO shopCompanyAuditingVO) { + if (Objects.nonNull(shopCompanyAuditingVO) && Objects.equals(shopCompanyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + LOGGER.info("已开店商家:{}审核失败,更新店铺状态为上线待审核", shopId + "shopName:" + shopDetailVO.getShopName()); + // 已经开店来审核更改为上线待审核 + shopDetailMapper.updateAllinpayShopStatus(shopId, AllinpayShopStatus.WAIT_AUDIT.value()); + } else { + LOGGER.info("申请开店商家:{}审核失败,更新店铺状态为开店待审核", shopId + "shopName:" + shopDetailVO.getShopName()); + // 未开店更改为开店待审核 + shopDetailMapper.updateAllinpayShopStatus(shopId, AllinpayShopStatus.OPEN_WAIT_AUDIT.value()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateShopAllinpayStatusToSuccess(Long shopId) { + ShopDetailVO shopDetailVO = shopDetailMapper.getByShopId(shopId); + if (Objects.isNull(shopDetailVO)) { + return; + } + if (Objects.equals(shopDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + return; + } + shopDetailMapper.updateShopAuditSuccess(shopId); + boolean shouldUpdate = Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.APPLYING.value()) || Objects.equals(shopDetailVO.getShopStatus(), ShopStatus.OPEN_AWAIT_AUDIT.value()); + ServerResponseEntity accountInfoByTenantId = accountFeignClient.getAccountInfoByTenantId(shopId, SysTypeEnum.MULTISHOP.value()); + if (shouldUpdate && Objects.equals(accountInfoByTenantId.getData().getIsPassShop(), 0)) { + Long userId = shopUserService.getUserIdByShopId(shopId); + UidInfoBO uidInfoBO = new UidInfoBO(); + uidInfoBO.setUserId(userId); + uidInfoBO.setSysType(SysTypeEnum.MULTISHOP.value()); + uidInfoBO.setTenantId(shopId); + uidInfoBO.setIsAdmin(UserAdminType.ADMIN.value()); + uidInfoBO.setIsPassShop(IsPassShopEnum.YES.value()); + ServerResponseEntity updateTenantIdRes = accountFeignClient.updateUserInfoByUserIdAndSysType(uidInfoBO, userId, SysTypeEnum.MULTISHOP.value()); + if (!updateTenantIdRes.isSuccess()) { + throw new LuckException("审核失败"); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateByShopId(ShopBankCardDTO shopBankCardDTO, Long shopId) { + if (Objects.isNull(shopBankCardDTO.getShopBankCardId())) { + throw new LuckException("银行卡信息错误"); + } + List shopBankCardVOList = this.listByShopId(shopId); + // 检查银行卡是否属于当前店铺 + this.checkIsCurrentShop(shopId, shopBankCardDTO.getShopBankCardId()); + // 检查是否处于提现状态 + this.checkIsWithdraw(shopBankCardDTO.getShopBankCardId()); + // 检查银行卡信息 + this.checkSaveBankCardList(shopBankCardVOList, Collections.singletonList(shopBankCardDTO), shopId); + shopBankCardMapper.update(BeanUtil.map(shopBankCardDTO, ShopBankCard.class)); + if (Objects.equals(shopBankCardDTO.getIsDefault(), IsDefault.YES.value())) { + shopBankCardMapper.setPrimary(shopBankCardDTO.getShopBankCardId(), shopId); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void setPrimaryByShopId(Long shopBankCardId, Long shopId) { + this.checkIsCurrentShop(shopId, shopBankCardId); + shopBankCardMapper.setPrimary(shopBankCardId, shopId); + } + + @Override + public void setNotPrimaryByShopId(Long shopBankCardId, Long shopId) { + this.checkIsCurrentShop(shopId, shopBankCardId); + shopBankCardMapper.setNotPrimary(shopBankCardId, shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertByShopId(ShopBankCardDTO shopBankCardDTO, Long shopId) { + if (Objects.isNull(shopBankCardDTO)) { + return; + } + List shopBankCardVOList = this.listByShopId(shopId); + if (CollUtil.isEmpty(shopBankCardVOList)) { + shopBankCardVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + // 检查银行卡信息 + this.checkSaveBankCardList(shopBankCardVOList, Collections.singletonList(shopBankCardDTO), shopId); + ShopBankCard shopBankCard = BeanUtil.map(shopBankCardDTO, ShopBankCard.class); + shopBankCard.setShopId(shopId); + shopBankCard.setStatus(StatusEnum.ENABLE.value()); + shopBankCardMapper.save(shopBankCard); + if (Objects.equals(shopBankCardDTO.getIsDefault(), 1)) { + shopBankCardMapper.setPrimary(shopBankCard.getShopBankCardId(), shopId); + } + } + + @Override + public ShopBankCardVO getByShopBankCardId(Long shopBankCardId) { + return shopBankCardMapper.getByShopBankCardId(shopBankCardId); + } + + @Override + public ShopBankCardVO getByShopBankCardIdAndShopId(Long shopBankCardId, Long shopId) { + ShopBankCardVO shopBankCardVO = shopBankCardMapper.getByShopBankCardId(shopBankCardId); + if (!Objects.equals(shopBankCardVO.getShopId(), shopId)) { + throw new LuckException("当前银行卡不属于该店铺"); + } + return shopBankCardVO; + } + + @Override + public void deleteByShopId(Long shopId) { + shopBankCardMapper.deleteByShopId(shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void refresh(Long shopId) { + ServerResponseEntity> response = allinpayFeignClient.listBindCard(AllinpayConstant.SHOP + shopId, null); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + LOGGER.info("店铺:{}在通联的银行卡列表信息查询结果:{}", shopId, response); + List bindCardList = response.getData().stream().filter(card -> Objects.equals(card.getBindState(), 1)).collect(Collectors.toList()); + List dbCardList = shopBankCardMapper.listByShopId(shopId); + LOGGER.info("店铺:{}在数据库的银行卡列表信息查询结果:{}", shopId, dbCardList); + if (Objects.equals(bindCardList.size(), dbCardList.size())) { + return; + } + // 获取主账号卡号 + List collect = dbCardList.stream().filter(card -> Objects.equals(card.getIsDefault(), 1)).collect(Collectors.toList()); + String cardNo = null; + if (CollUtil.isNotEmpty(collect)) { + cardNo = collect.get(0).getCardNo(); + } + // 删除原有的 + shopBankCardMapper.deleteByShopId(shopId); + // 更新 + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + ShopCompanyVO shopCompanyVO = shopCompanyMapper.getShopCompanyByShopIdAndStatus(shopId, AuditStatus.SUCCESSAUDIT.value()); + for (BindCard bindCard : bindCardList) { + ShopBankCardDTO shopBankCardDTO = new ShopBankCardDTO(); + shopBankCardDTO.setBankName(bindCard.getBankName()); + shopBankCardDTO.setShopId(shopId); + shopBankCardDTO.setBranchName(bindCard.getBranchBankName()); + shopBankCardDTO.setOpeningBank(bindCard.getBankName()); + shopBankCardDTO.setUnionBank(bindCard.getUnionBank()); + shopBankCardDTO.setBankCardPro(bindCard.getBankCardPro()); + shopBankCardDTO.setBankCardNo(bindCard.getBankCardNo()); + if (Objects.equals(bindCard.getBankCardPro(), 0)) { + shopBankCardDTO.setCardNo(bindCard.getBankCardNo()); + shopBankCardDTO.setRecipientName(shopCompanyVO.getRepresentative()); + } else if (Objects.equals(bindCard.getBankCardPro(), 1)) { + shopBankCardDTO.setCardNo(bindCard.getAccountNo()); + shopBankCardDTO.setRecipientName(shopCompanyVO.getFirmName()); + } + boolean isDefault = Objects.nonNull(cardNo) && (Objects.equals(cardNo, bindCard.getBankCardNo()) || Objects.equals(cardNo, bindCard.getUnionBank())); + if (isDefault) { + shopBankCardDTO.setIsDefault(1); + } + saveList.add(shopBankCardDTO); + } + shopBankCardMapper.insertBatch(saveList, shopId); + } + + /** + * 检查银行卡列表信息 + * @param savedBankCardList 已保存的银行卡列表 + * @param newBankCardList 新增的银行卡列表 + * @param shopId 用于保存银行卡的店铺id + */ + private void checkSaveBankCardList(List savedBankCardList, List newBankCardList, Long shopId) { + List insertList = newBankCardList.stream().filter(item -> Objects.isNull(item.getShopBankCardId())).collect(Collectors.toList()); + if (savedBankCardList.size() + insertList.size() > Constant.SHOP_BANK_CARD_LIMIT_NUM) { + throw new LuckException("银行卡数量不能超过" + Constant.SHOP_BANK_CARD_LIMIT_NUM); + } + Map savedBankCardMap = savedBankCardList.stream().collect(Collectors.toMap(ShopBankCardVO::getCardNo, item -> item)); + newBankCardList.forEach(item -> { + //新增的需要校验 + if (savedBankCardMap.containsKey(item.getCardNo()) && !Objects.equals(savedBankCardMap.get(item.getCardNo()).getShopBankCardId(), item.getShopBankCardId())) { + throw new LuckException("银行卡账号" + item.getCardNo() + "重复"); + } + }); + } + + /** + * 检查是否处于提现状态 + * @param shopBankCardId 银行卡id + */ + private void checkIsWithdraw(Long shopBankCardId) { + int count = shopWithdrawCashMapper.countByShopBandCardIdAndStatus(shopBankCardId, ShopWithdrawCashStatus.WAITAUDIT.value()); + if (count > 0) { + // 正在用于提现的银行卡不能删除 + throw new LuckException("正在用于提现的银行卡账号不能修改或删除"); + } + } + + /** + * 检查银行卡是否属于当前店铺 + * @param shopId + * @param shopBankCardId + */ + private void checkIsCurrentShop(Long shopId, Long shopBankCardId) { + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + // 平台端操作 + return; + } + ShopBankCardVO shopBankCard = this.shopBankCardMapper.getByShopBankCardId(shopBankCardId); + if (!Objects.equals(shopBankCard.getShopId(), shopId)) { + throw new LuckException("当前银行卡不属于你的店铺"); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopCompanyServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopCompanyServiceImpl.java new file mode 100644 index 0000000..0bb1684 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopCompanyServiceImpl.java @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.biz.feign.AttachFileFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.IdCardCollectByFileUploadResp; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.UploadFile; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.constant.PicType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.multishop.constant.AuditStatus; +import com.tmerclub.cloud.multishop.dto.AllinpayShopBankCardDTO; +import com.tmerclub.cloud.multishop.dto.ShopCompanyDTO; +import com.tmerclub.cloud.multishop.mapper.ShopCompanyMapper; +import com.tmerclub.cloud.multishop.mapper.ShopDetailMapper; +import com.tmerclub.cloud.multishop.model.ShopAuditing; +import com.tmerclub.cloud.multishop.model.ShopCompany; +import com.tmerclub.cloud.multishop.service.*; +import com.tmerclub.cloud.multishop.vo.ShopAuditingVO; +import com.tmerclub.cloud.multishop.vo.ShopCompanyVO; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/25 15:45 + */ +@Service +public class ShopCompanyServiceImpl implements ShopCompanyService { + private static final Logger LOGGER = LoggerFactory.getLogger(ShopCompanyServiceImpl.class); + + @Autowired + private ShopCompanyMapper shopCompanyMapper; + @Autowired + private ShopAuditingService shopAuditingService; + @DubboReference + private AttachFileFeignClient attachFileFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private ShopDetailMapper shopDetailMapper; + @Autowired + private ShopAllinpayService shopAllinpayService; + @Autowired + @Lazy + private ShopDetailService shopDetailService; + @Autowired + private ShopBankCardService shopBankCardService; + @Autowired + private FeignShopConfig feignShopConfig; + + private static final String JPG = "jpg"; + private static final String PNG = "png"; + private static final String HTTP = "http"; + private static final Integer ID_CARD_FAIL_RESULT = 2; + + @Transactional(rollbackFor = Exception.class) + @Override + public void updateByShopId(ShopCompany shopCompany, Long shopId, Integer temp) { + this.checkInfo(shopCompany, false, temp); + shopCompanyMapper.updateByShopId(shopCompany, shopId, temp); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void platformUpdateShopCompany(ShopCompany shopCompany, Long shopId) { + this.checkInfo(shopCompany, false, null); + // 通联开启后,平台更新商家的工商信息也需要通过通联审核 + // 且只有平台开店审核失败的店铺才能更改工商信息,所以这里只需要设置企业信息,同步返回 + ShopCompanyVO shopCompanyVO = getShopCompanyByShopIdAndStatus(shopId, AuditStatus.SUCCESSAUDIT.value()); + if (Objects.nonNull(shopCompanyVO)) { + throw new LuckException("工商信息已通过,无需修改"); + } + List shopBankCardList = shopBankCardService.listByShopId(shopId); + if (CollUtil.isEmpty(shopBankCardList)) { + throw new LuckException("店铺银行卡为空,请补充"); + } + updateByShopId(shopCompany, shopCompany.getShopId(), 0); + // 更新开店为待审核状态,影印件才可以回调 + ShopAuditingVO shopAuditingVO = shopAuditingService.getByshopId(shopId); + ShopAuditing shopAuditing = BeanUtil.map(shopAuditingVO, ShopAuditing.class); + shopAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + shopAuditing.setRemarks("平台提交申请"); + if (Objects.equals(shopAuditingVO.getStatus(), AuditStatus.FAILAUDIT.value())) { + shopAuditingService.update(shopAuditing); + } + // 通联审核 + ShopBankCardVO shopBankCardVO = shopBankCardList.get(0); + AllinpayShopBankCardDTO allinpayShopBankCardDTO = new AllinpayShopBankCardDTO(); + allinpayShopBankCardDTO.setAccountNo(shopBankCardVO.getCardNo()); + allinpayShopBankCardDTO.setParentBankName(shopBankCardVO.getBankName()); + allinpayShopBankCardDTO.setBankName(shopBankCardVO.getBranchName()); + allinpayShopBankCardDTO.setUnionBank(shopBankCardVO.getUnionBank()); + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + shopBankCardService.allinpaySetCompanyInfo(allinpayShopBankCardDTO, shopId, BeanUtil.map(shopCompany, ShopCompanyVO.class), shopDetailVO); + } + + @Override + public void batchUpdateStatus(Long shopId, Integer status, Integer dbStatus) { + shopCompanyMapper.batchUpdateStatus(shopId, status, dbStatus); + } + + @Override + public ShopCompanyVO getById(Long shopCompanyId) { + ShopCompany shopCompany = shopCompanyMapper.getByShopCompanyId(shopCompanyId); + return BeanUtil.map(shopCompany, ShopCompanyVO.class); + } + + @Override + public ShopCompanyVO getShopCompanyByShopIdAndStatus(Long shopId, Integer status) { + ShopCompanyVO shopCompanyVO = shopCompanyMapper.getShopCompanyByShopIdAndStatus(shopId, status); + // 检查工商信息是否有更新记录,若存在更新记录则发请求 查询审核信息 (逻辑上或许可以修改为存在多条工商信息记录) + if (Objects.nonNull(shopCompanyVO)) { + Integer recordStatus = shopCompanyMapper.getLatestRecord(shopId); + if (!Objects.equals(AuditStatus.SUCCESSAUDIT.value(), recordStatus)) { + shopCompanyVO.setEdit(true); + shopCompanyVO.setNewStatus(recordStatus); + } + } + return shopCompanyVO; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(ShopCompany shopCompany, boolean isCreate) { + this.checkInfo(shopCompany, isCreate, null); + shopCompanyMapper.save(shopCompany); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ShopCompany shopCompany) { + shopCompanyMapper.update(shopCompany); + } + + @Override + public Boolean checkCreditCode(String creditCode, Long shopId) { + List shopIds = shopCompanyMapper.getShopIdByCreditCode(creditCode); + if (CollUtil.isNotEmpty(shopIds)) { + boolean isSame = true; + for (Long creditShopId : shopIds) { + if (!Objects.equals(creditShopId, shopId)) { + LOGGER.info("店铺信用代码重复"); + isSame = false; + break; + } + } + return !isSame; + } + return false; + } + + @Override + public void deleteByShopIdAndStatus(Long shopId, Integer status) { + shopCompanyMapper.deleteByShopIdAndStatus(shopId, status); + } + + @Override + public void checkInfo(ShopCompany shopCompany, Boolean isCreate, Integer temp) { + if (isCreate) { + ShopCompanyVO oldCompany = shopCompanyMapper.getShopCompanyByShopIdAndStatus(shopCompany.getShopId(), AuditStatus.SUCCESSAUDIT.value()); + if (Objects.nonNull(oldCompany)) { + throw new LuckException("店铺工商信息已存在,不能重复新增"); + } + } else { + ShopAuditingVO shopAuditingVO = shopAuditingService.getByshopId(shopCompany.getShopId()); + if (Objects.nonNull(shopAuditingVO) && Objects.equals(shopAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value()) + && !shopAllinpayService.getIsAllinpay() && !Objects.equals(temp, 0)) { + throw new LuckException("店铺处于待审核状态,无法修改店铺信息"); + } + } + if (checkCreditCode(shopCompany.getCreditCode(), shopCompany.getShopId())) { + throw new LuckException("统一信用码重复"); + } + if (shopCompany.getEndTime() != null && !shopCompany.getStartTime().before(shopCompany.getEndTime())) { + throw new LuckException("营业起始日期不能大于营业终止时间"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateById(ShopCompany shopCompany) { + shopCompanyMapper.updateById(shopCompany); + } + + @Override + public String idCardCollect(ShopCompanyVO shopCompany, Long shopId) { + // 该方法会上传营业执照和身份证 + String businessLicense = getImgUrl(shopCompany.getBusinessLicense(), PicType.BUSINESS_LICENSE.getCode()); + if (!businessLicense.contains(HTTP)) { + LOGGER.info("店铺营业执照获取文件路径失败,原因{}", businessLicense); + return businessLicense; + } + ServerResponseEntity businessFileUpload = allinpayFeignClient.idCardCollectByFileUpload(null, + null, PicType.BUSINESS_LICENSE.getCode(), businessLicense, AllinpayConstant.SHOP + shopId); + if (!businessFileUpload.isSuccess() || Objects.equals(businessFileUpload.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "店铺审核通过,影印件-营业执照上传失败,原因为:" + (Objects.isNull(businessFileUpload.getMsg()) ? businessFileUpload.getData().getFailReason() : businessFileUpload.getMsg()); + } + // 人面像 + String legalPicFaceToken = getImgUrl(shopCompany.getIdentityCardFront(), PicType.FRONT_OF_ID_CARD.getCode()); + if (!legalPicFaceToken.contains(HTTP)) { + LOGGER.info("店铺身份证-人面像获取文件路径失败,原因{}", legalPicFaceToken); + return legalPicFaceToken; + } + // 国徽面 + String legalPicEmblemToken = getImgUrl(shopCompany.getIdentityCardLater(), PicType.REVERSE_SIDE_OF_ID_CARD.getCode()); + if (!legalPicEmblemToken.contains(HTTP)) { + LOGGER.info("店铺身份证-国徽像获取文件路径失败,原因{}", legalPicEmblemToken); + return legalPicEmblemToken; + } + ServerResponseEntity fileUpload = allinpayFeignClient.idCardCollectByFileUpload(legalPicFaceToken, + legalPicEmblemToken, null, null, AllinpayConstant.SHOP + shopId); + if (!fileUpload.isSuccess() || Objects.equals(fileUpload.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "店铺审核通过,影印件上传失败,原因为:" + (Objects.isNull(fileUpload.getMsg()) ? fileUpload.getData().getFailReason() : fileUpload.getMsg()); + } + // 所有都上传成功,改变店铺影印件状态 + shopDetailMapper.updateAllinpayIdCardStatus(shopId, IdCardCollectProcessStatus.WAIT_AUDIT.value()); + return AllinpayConstant.ALLINPAY_AUDIT_SUCCESS; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String uploadIdCard(ShopCompanyDTO shopCompanyDTO, ShopDetailVO shopDetailVO, Integer status) { + Long shopId = shopDetailVO.getShopId(); + if (!Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), status)) { + // 状态不同先更新状态 + shopDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SHOP + shopId, status); + shopDetailVO.setIdCardCollectProcessStatus(status); + } + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + return "影印件已审核通过,请刷新页面"; + } + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.WAIT_AUDIT.value())) { + return "影印件待审核中,请刷新影印件"; + } + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.UN_COMMITTED.value())) { + LOGGER.info("店铺{}影印件上传失败,尝试重新上传", shopId); + // 还没提交上传 + ShopCompanyVO shopCompanyVO = BeanUtil.map(shopCompanyDTO, ShopCompanyVO.class); + String result = idCardCollect(shopCompanyVO, shopId); + if (Objects.equals(result, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + shopCompanyMapper.updateIdCardById(shopCompanyVO); + } + return result; + } + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.REG.value())) { + LOGGER.info("店铺{}影印件只有工商信息审核通过了,尝试重新上传身份证信息", shopId); + // 只有工商信息审核通过了,重新提交下身份证信息 + // 国徽面 + String legalPicEmblemToken = getImgUrl(shopCompanyDTO.getIdentityCardLater(), PicType.REVERSE_SIDE_OF_ID_CARD.getCode()); + if (!legalPicEmblemToken.contains(HTTP)) { + LOGGER.info("店铺身份证-国徽像获取文件路径失败,原因{}", legalPicEmblemToken); + return legalPicEmblemToken; + } + // 人面像 + String legalPicFaceToken = getImgUrl(shopCompanyDTO.getIdentityCardFront(), PicType.FRONT_OF_ID_CARD.getCode()); + if (!legalPicFaceToken.contains(HTTP)) { + LOGGER.info("店铺身份证-人面像获取文件路径失败,原因{}", legalPicFaceToken); + return legalPicFaceToken; + } + ServerResponseEntity fileUpload = allinpayFeignClient.idCardCollectByFileUpload(legalPicFaceToken, + legalPicEmblemToken, null, null, AllinpayConstant.SHOP + shopId); + if (!fileUpload.isSuccess() || Objects.equals(fileUpload.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "店铺审核通过,影印件-身份证信息上传失败,原因为:" + (Objects.isNull(fileUpload.getMsg()) ? fileUpload.getData().getFailReason() : fileUpload.getMsg()); + } + shopCompanyMapper.updateIdCardById(BeanUtil.map(shopCompanyDTO, ShopCompanyVO.class)); + } + if (Objects.equals(shopDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ID_CARD.value())) { + LOGGER.info("店铺{}影印件只有法人信息通过,尝试重新上传工商信息", shopId); + // 只有法人信息通过,重新提交下工商信息 + String businessLicense = getImgUrl(shopCompanyDTO.getBusinessLicense(), PicType.BUSINESS_LICENSE.getCode()); + if (!businessLicense.contains(HTTP)) { + LOGGER.info("店铺营业执照重新上传获取文件路径失败,原因{}", businessLicense); + return businessLicense; + } + ServerResponseEntity fileUpload = allinpayFeignClient.idCardCollectByFileUpload(null, + null, PicType.BUSINESS_LICENSE.getCode(), businessLicense, AllinpayConstant.SHOP + shopId); + if (!fileUpload.isSuccess() || Objects.equals(fileUpload.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "店铺审核通过,影印件-营业执照信息上传失败,原因为:" + (Objects.isNull(fileUpload.getMsg()) ? fileUpload.getData().getFailReason() : fileUpload.getMsg()); + } + shopCompanyMapper.updateIdCardById(BeanUtil.map(shopCompanyDTO, ShopCompanyVO.class)); + } + return "影印件更新成功"; + } + + @Override + public void updateStatusToWaitAudit() { + shopCompanyMapper.updateStatusToWaitAudit(); + } + + private String getImgUrl(String imageUrl, Integer picType) { + if (Objects.isNull(imageUrl)) { + return "店铺审核通过," + PicType.getPicTypeName(picType) + "为空,请重新上传"; + } + ServerResponseEntity responseEntity = attachFileFeignClient.getfileTypeByfilePath(imageUrl); + String fileType = responseEntity.getData(); + if (Objects.isNull(fileType)) { + return "店铺审核通过," + PicType.getPicTypeName(picType) + "该图片类型为空"; + } + UploadFile uploadFile = feignShopConfig.getUploadFile(); + String imgDomain = uploadFile.getResourceUrl(); + if (!imageUrl.contains(HTTP)) { + // 给imageUrl 加上文件全路径 + if (Objects.isNull(imgDomain)) { + // 未配置文件域名,无法上传成功图片 + return "店铺审核通过," + "未配置文件域名,无法上传成功图片"; + } + imageUrl = StringUtils.join(imgDomain, imageUrl); + } + return imageUrl; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRechargeServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRechargeServiceImpl.java new file mode 100644 index 0000000..79ac92e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRechargeServiceImpl.java @@ -0,0 +1,183 @@ +package com.tmerclub.cloud.multishop.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.DepositApplyResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.AllinpayPayStatus; +import com.tmerclub.cloud.common.constant.AllinpayRechargeStatusType; +import com.tmerclub.cloud.common.constant.AllinpayWithdrawCashStatusType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.multishop.constant.ShopWalletAmountType; +import com.tmerclub.cloud.multishop.constant.ShopWalletChangeReason; +import com.tmerclub.cloud.multishop.constant.ShopWalletIoType; +import com.tmerclub.cloud.multishop.dto.AllinpayRechargeDTO; +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.mapper.ShopWalletMapper; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopRechargeService; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import com.tmerclub.cloud.multishop.vo.ShopRechargeVO; +import com.mongodb.client.result.UpdateResult; +import org.apache.dubbo.config.annotation.DubboReference; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.mongodb.core.query.Update; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collections; +import java.util.Objects; + +/** + * 商家充值 + * @author TRACK + */ +@Service +public class ShopRechargeServiceImpl implements ShopRechargeService { + private static final Logger logger = LoggerFactory.getLogger(ShopRechargeServiceImpl.class); + + @Autowired + private ShopWalletLogService shopWalletLogService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private RedissonClient redissonClient; + @Autowired + private ShopWalletMapper shopWalletMapper; + @Autowired + private SegmentManager segmentManager; + + @Override + @Transactional(rollbackFor = Exception.class) + public ShopRechargeVO shopRecharge(MongoShopWalletLogBO shopWalletLog, String returnUrl) { + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setWalletLogId(walletLogId); + // 通联申请 + ServerResponseEntity rechargeApplyResponse = allinpayFeignClient.rechargeApply( + shopWalletLog.getShopChangeAmount(), shopWalletLog.getShopId(), walletLogId, returnUrl); + if (!rechargeApplyResponse.isSuccess()) { + throw new LuckException(rechargeApplyResponse.getMsg()); + } + DepositApplyResp depositApplyResp = JSON.parseObject(JSON.toJSONString(rechargeApplyResponse.getData()), DepositApplyResp.class); + shopWalletLog.setBizOrderNo(Long.parseLong(depositApplyResp.getBizOrderNo())); + // 保存申请日志 + shopWalletLog.setAllinpayStatus(AllinpayRechargeStatusType.APPLY_SUCCESS.value()); + shopWalletLogService.saveMongoBatch(Collections.singletonList(shopWalletLog)); + return new ShopRechargeVO(depositApplyResp.getPayInfo(), walletLogId); + } + + @Override + public void confirmRechargePay(AllinpayRechargeDTO rechargeDTO, Long shopId) { + // 申请充值记录 + ShopWalletLogSearchDTO shopWalletLogQuery = new ShopWalletLogSearchDTO(); + shopWalletLogQuery.setBizOrderNo(Long.valueOf(rechargeDTO.getBizOrderNo())); + shopWalletLogQuery.setReason(ShopWalletChangeReason.APPLY_RECHARGE.value()); + shopWalletLogQuery.setShopId(shopId); + shopWalletLogQuery.setShopIoType(ShopWalletIoType.INCOME.value()); + shopWalletLogQuery.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + MongoShopWalletLogBO rechargeLog = shopWalletLogService.listByParam(shopWalletLogQuery).get(0); + if (Objects.isNull(rechargeLog)) { + throw new LuckException("申请充值日志不存在"); + } + if (!Objects.equals(rechargeLog.getAllinpayStatus(), AllinpayRechargeStatusType.APPLY_SUCCESS.value()) + && !Objects.equals(rechargeLog.getAllinpayStatus(), AllinpayRechargeStatusType.WAIT_PAY.value())) { + throw new LuckException("申请充值状态异常,请刷新重试"); + } + ServerResponseEntity payResponse = allinpayFeignClient.payByBackSms(AllinpayConstant.SHOP + shopId, rechargeDTO.getBizOrderNo(), rechargeDTO.getVerificationCode()); + if (!payResponse.isSuccess()) { + throw new LuckException(payResponse.getMsg()); + } + + PayByBackSmsResp payByBackSmsResp = payResponse.getData(); + String payFailMessage = payByBackSmsResp.getPayFailMessage(); + if (Objects.equals(payByBackSmsResp.getPayStatus(), AllinpayPayStatus.UNPAY.value())) { + // 修改申请日志 + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(rechargeLog.getWalletLogId())); + Update update = new Update(); + update.set("allinpayStatus", AllinpayWithdrawCashStatusType.WAIT_PAY.value()); + update.set("payFailMessage", payFailMessage); + mongoTemplate.updateFirst(query, update, MongoShopWalletLogBO.class); + // 收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + logger.error("充值订单{}充值失败,原因为:{}", payByBackSmsResp.getBizOrderNo(), payFailMessage); + } + } + + @Override + public void resendPaySms(String bizOrderNo, Long shopId) { + // 申请充值记录 + ShopWalletLogSearchDTO shopWalletLogQuery = new ShopWalletLogSearchDTO(); + shopWalletLogQuery.setBizOrderNo(Long.valueOf(bizOrderNo)); + shopWalletLogQuery.setShopId(shopId); + shopWalletLogQuery.setReason(ShopWalletChangeReason.APPLY_RECHARGE.value()); + shopWalletLogQuery.setShopIoType(ShopWalletIoType.INCOME.value()); + shopWalletLogQuery.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLogQuery.setAllinpayStatus(AllinpayWithdrawCashStatusType.WAIT_PAY.value()); + MongoShopWalletLogBO rechargeLog = shopWalletLogService.listByParam(shopWalletLogQuery).get(0); + if (Objects.isNull(rechargeLog)) { + throw new LuckException("申请充值日志不存在"); + } + if (!Objects.equals(rechargeLog.getAllinpayStatus(), AllinpayRechargeStatusType.WAIT_PAY.value())) { + throw new LuckException("充值申请不在未支付状态,请刷新重试"); + } + ServerResponseEntity response = allinpayFeignClient.resendPaySms(bizOrderNo); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void rechargeBack(String bizOrderNo, String payStatus, String bizUserId) { + // 申请充值记录 + ShopWalletLogSearchDTO shopWalletLogQuery = new ShopWalletLogSearchDTO(); + shopWalletLogQuery.setBizOrderNo(Long.valueOf(bizOrderNo)); + shopWalletLogQuery.setReason(ShopWalletChangeReason.APPLY_RECHARGE.value()); + shopWalletLogQuery.setShopId(Long.valueOf(bizUserId.substring(AllinpayConstant.SHOP_LENGTH))); + shopWalletLogQuery.setShopIoType(ShopWalletIoType.INCOME.value()); + shopWalletLogQuery.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + MongoShopWalletLogBO rechargeLog = shopWalletLogService.listByParam(shopWalletLogQuery).get(0); + if (Objects.isNull(rechargeLog)) { + throw new LuckException("申请充值日志不存在"); + } + if (Objects.equals(rechargeLog.getAllinpayStatus(), AllinpayRechargeStatusType.RECHARGE_SUCCESS.value())) { + return; + } + if (Objects.equals(rechargeLog.getReason(), ShopWalletChangeReason.SUCCESS_RECHARGE.value())) { + return; + } + + Long shopId = rechargeLog.getShopId(); + Long amount = rechargeLog.getShopChangeAmount(); + allinpaySuccess(shopId, rechargeLog, amount); + } + + private void allinpaySuccess(Long shopId, MongoShopWalletLogBO rechargeLog, Long amount) { + shopWalletMapper.addSettledAmount(shopId, amount, rechargeLog.getPaySysType(), true); + + // 更新支付状态 + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(rechargeLog.getWalletLogId()).and("reason").is(ShopWalletChangeReason.APPLY_RECHARGE.value())); + Update update = new Update(); + update.set("reason", ShopWalletChangeReason.SUCCESS_RECHARGE.value()); + update.set("allinpayStatus", AllinpayRechargeStatusType.RECHARGE_SUCCESS.value()); + update.set("payFailMessage", ""); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoShopWalletLogBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRefundAddrServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRefundAddrServiceImpl.java new file mode 100644 index 0000000..86109c8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopRefundAddrServiceImpl.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.multishop.dto.ShopRefundAddrDTO; +import com.tmerclub.cloud.multishop.mapper.ShopRefundAddrMapper; +import com.tmerclub.cloud.multishop.model.ShopRefundAddr; +import com.tmerclub.cloud.multishop.service.ShopRefundAddrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; + +/** + * 商家退货地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 15:03:18 + */ +@Service +public class ShopRefundAddrServiceImpl implements ShopRefundAddrService { + + @Autowired + private ShopRefundAddrMapper shopRefundAddrMapper; + + @Override + public PageVO page(PageDTO pageDTO, ShopRefundAddrDTO shopRefundAddrDTO) { + return PageUtil.doPage(pageDTO, () -> shopRefundAddrMapper.list(shopRefundAddrDTO)); + } + + @Override + public ShopRefundAddrVO getByShopRefundAddrId(Long shopRefundAddrId, Long shopId) { + return shopRefundAddrMapper.getByShopRefundAddrId(shopRefundAddrId, shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(ShopRefundAddr shopRefundAddr) { + if (Objects.equals(shopRefundAddr.getIsDefault(), 1)) { + shopRefundAddrMapper.cancelDefaultAddr(shopRefundAddr.getShopId()); + } else { + // 第一个地址自动为默认地址 + List refundAddrs = this.listByShopId(shopRefundAddr.getShopId()); + if (CollectionUtils.isEmpty(refundAddrs)) { + shopRefundAddr.setIsDefault(1); + } + } + shopRefundAddrMapper.save(shopRefundAddr); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ShopRefundAddr shopRefundAddr) { + ShopRefundAddrVO dbShopRefund = getByShopRefundAddrId(shopRefundAddr.getShopRefundAddrId(), shopRefundAddr.getShopId()); + if (Objects.isNull(dbShopRefund)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } else if (!Objects.equals(shopRefundAddr.getShopId(), dbShopRefund.getShopId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!PrincipalUtil.isDbPhone(shopRefundAddr.getMobile(), dbShopRefund.getMobile(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (shopRefundAddr.getMobile().contains(Constant.ASTERISK)) { + shopRefundAddr.setMobile(dbShopRefund.getMobile()); + } + // 取消默认 + if (Objects.equals(shopRefundAddr.getIsDefault(), 0) + && Objects.equals(dbShopRefund.getIsDefault(), 1)) { + throw new LuckException("默认地址禁止取消"); + } + // 设置默认 + if (Objects.equals(shopRefundAddr.getIsDefault(), 1) && Objects.equals(dbShopRefund.getIsDefault(), 0)) { + shopRefundAddrMapper.cancelDefaultAddr(shopRefundAddr.getShopId()); + } + shopRefundAddrMapper.update(shopRefundAddr); + } + + @Override + public void deleteById(Long shopRefundAddrId, Long shopId) { + ShopRefundAddrVO dbShopRefund = getByShopRefundAddrId(shopRefundAddrId, shopId); + if (Objects.isNull(dbShopRefund)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } else if (!Objects.equals(dbShopRefund.getShopId(), shopId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (Objects.equals(dbShopRefund.getIsDefault(), 1)) { + throw new LuckException("默认地址禁止删除"); + } + shopRefundAddrMapper.deleteById(shopRefundAddrId); + } + + @Override + @Cacheable(cacheNames = CacheNames.SHOP_REFUND_ADDR, key = "#shopId", sync = true) + public List listByShopId(Long shopId) { + return shopRefundAddrMapper.listByShopId(shopId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SHOP_REFUND_ADDR, key = "#shopId") + public void removeCacheByShopId(Long shopId) { + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopUserServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopUserServiceImpl.java new file mode 100644 index 0000000..cb28813 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopUserServiceImpl.java @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.rbac.dto.UserRoleDTO; +import com.tmerclub.cloud.api.rbac.feign.UserRoleFeignClient; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.multishop.dto.ShopUserDTO; +import com.tmerclub.cloud.multishop.dto.ShopUserRegisterDTO; +import com.tmerclub.cloud.multishop.mapper.ShopUserMapper; +import com.tmerclub.cloud.multishop.model.ShopUser; +import com.tmerclub.cloud.multishop.service.ShopUserService; +import com.tmerclub.cloud.multishop.vo.ShopUserVO; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +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.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +@Service +public class ShopUserServiceImpl implements ShopUserService { + + @Resource + private ShopUserMapper shopUserMapper; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private UserRoleFeignClient userRoleFeignClient; + @DubboReference + private NotifyFeignClient notifyFeignClient; + + @Override + public PageVO pageByShopId(PageDTO pageDTO, ShopUserDTO shopUserDTO) { + PageVO page = PageUtil.doPage(pageDTO, () -> shopUserMapper.listByShopId(shopUserDTO)); + List userIds = page.getList().stream().map(ShopUserVO::getShopUserId).collect(Collectors.toList()); + Integer sysType = Objects.equals(shopUserDTO.getShopId(), Constant.PLATFORM_SHOP_ID) ? SysTypeEnum.PLATFORM.value() : SysTypeEnum.MULTISHOP.value(); + ServerResponseEntity> responseEntity = accountFeignClient.listUserByUserIdsAndType(userIds, sysType); + Map authAccountMap = responseEntity.getData().stream().collect(Collectors.toMap(AuthAccountVO::getUserId, a -> a)); + for (ShopUserVO shopUserVO : page.getList()) { + AuthAccountVO authAccountVO = authAccountMap.get(shopUserVO.getShopUserId()); + if (Objects.isNull(authAccountVO)) { + continue; + } + shopUserVO.setStatus(authAccountVO.getStatus()); + shopUserVO.setIsAdmin(authAccountVO.getIsAdmin()); + shopUserVO.setUsername(authAccountVO.getUsername()); + if (StrUtil.isNotBlank(shopUserVO.getPhoneNum())) { + shopUserVO.setPhoneNum(PhoneUtil.hideBetween(shopUserVO.getPhoneNum()).toString()); + } + } + return page; + } + + @Override + public List listShopUser(ShopUserDTO shopUserDTO) { + return shopUserMapper.listByShopId(shopUserDTO); + } + + @Override + public ShopUserVO getByUserId(Long userId) { + ShopUserVO shopUser = shopUserMapper.getByUserId(userId); + ServerResponseEntity> roleIds = userRoleFeignClient.getRoleIds(shopUser.getShopUserId()); + shopUser.setRoleIds(roleIds.getData()); + ServerResponseEntity accountResponse = accountFeignClient.getByUserIdAndSysType(userId, AuthUserContext.get().getSysType()); + if (!accountResponse.isSuccess()) { + throw new LuckException(accountResponse.getMsg()); + } + AuthAccountVO data = accountResponse.getData(); + if (Objects.nonNull(data)) { + shopUser.setEmail(data.getEmail()); + shopUser.setPhone(data.getPhone()); + shopUser.setIsAdmin(data.getIsAdmin()); + shopUser.setStatus(data.getStatus()); + shopUser.setUsername(data.getUsername()); + shopUser.setPassword(data.getPassword()); + } + return shopUser; + } + + @Override + public ShopUserVO getSimpleByUserId(Long userId) { + return shopUserMapper.getByUserId(userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(ShopUser shopUser, List roleIds) { + shopUser.setShopUserId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_MULTISHOP_USER)); + shopUserMapper.save(shopUser); + if (CollUtil.isEmpty(roleIds)) { + return; + } + UserRoleDTO userRoleDTO = new UserRoleDTO(); + userRoleDTO.setRoleIds(roleIds); + userRoleDTO.setUserId(shopUser.getShopUserId()); + userRoleFeignClient.saveByUserIdAndSysType(userRoleDTO); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void update(ShopUser shopUser, List roleIds) { + UserRoleDTO userRoleDTO = new UserRoleDTO(); + userRoleDTO.setRoleIds(roleIds); + userRoleDTO.setUserId(shopUser.getShopUserId()); + userRoleDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + shopUserMapper.update(shopUser); + userRoleFeignClient.updateByUserIdAndSysType(userRoleDTO); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long shopUserId) { + ServerResponseEntity responseEntity = accountFeignClient.deleteByUserIdAndSysType(shopUserId); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + userRoleFeignClient.deleteByUserIdAndSysType(shopUserId); + shopUserMapper.deleteById(shopUserId); + } + + @Override + public Long getUserIdByShopId(Long shopId) { + return shopUserMapper.getUserIdByShopId(shopId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void register(ShopUserRegisterDTO shopUserRegisterDTO) { + // 校验注册信息 + this.checkRegisterInfo(shopUserRegisterDTO); + // 商家端用户表保存商家信息 + ShopUser shopUser = new ShopUser(); + shopUser.setShopUserId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_MULTISHOP_USER)); + shopUser.setNickName(shopUserRegisterDTO.getUsername()); + shopUser.setPhoneNum(shopUserRegisterDTO.getMobile()); + shopUser.setHasAccount(1); + shopUser.setShopId(Constant.DEFAULT_SHOP_ID); + shopUserMapper.save(shopUser); + // 账号表保存商家信息 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(shopUserRegisterDTO.getMobile()); + authAccountDTO.setPassword(shopUserRegisterDTO.getPassword().trim()); + authAccountDTO.setStatus(StatusEnum.ENABLE.value()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + authAccountDTO.setUserId(shopUser.getShopUserId()); + authAccountDTO.setTenantId(Constant.DEFAULT_SHOP_ID); + authAccountDTO.setIsAdmin(UserAdminType.ADMIN.value()); + authAccountDTO.setIsPassShop(IsPassShopEnum.NO.value()); + authAccountDTO.setUsername(shopUserRegisterDTO.getUsername()); + ServerResponseEntity saveAccountRes = accountFeignClient.save(authAccountDTO); + if (!saveAccountRes.isSuccess()) { + throw new LuckException(saveAccountRes.getMsg()); + } + } + + @Override + public ServerResponseEntity verifyShopUserAccount(ShopUserDTO shopUserDTO) { + // 账号表商家信息 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setPhone(shopUserDTO.getPhone()); + authAccountDTO.setEmail(shopUserDTO.getEmail()); + authAccountDTO.setUsername(shopUserDTO.getUsername()); + authAccountDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + authAccountDTO.setUserId(shopUserDTO.getShopUserId()); + return accountFeignClient.verifyAccount(authAccountDTO); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void saveAccount(ShopUserDTO shopUserDTO) { + ShopUser shopUser = BeanUtil.map(shopUserDTO, ShopUser.class); + shopUser.setShopUserId(null); + shopUser.setShopId(shopUserDTO.getShopId()); + shopUser.setHasAccount(1); + shopUser.setPhoneNum(shopUserDTO.getPhone()); + // 保存店铺职工信息 + this.save(shopUser, shopUserDTO.getRoleIds()); + Long shopUserId = shopUser.getShopUserId(); + // 账号表商家职工信息 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setEmail(shopUserDTO.getEmail()); + authAccountDTO.setUsername(shopUserDTO.getUsername()); + authAccountDTO.setPhone(shopUserDTO.getPhone()); + authAccountDTO.setSysType(AuthUserContext.get().getSysType()); + authAccountDTO.setUserId(shopUserId); + authAccountDTO.setTenantId(shopUser.getShopId()); + authAccountDTO.setStatus(shopUserDTO.getStatus()); + authAccountDTO.setIsPassShop(IsPassShopEnum.YES.value()); + authAccountDTO.setIsAdmin(0); + authAccountDTO.setPassword(shopUserDTO.getPassword()); + ServerResponseEntity accountResponseEntity = accountFeignClient.save(authAccountDTO); + if (!accountResponseEntity.isSuccess()) { + throw new LuckException(accountResponseEntity.getMsg()); + } + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public void updateAccount(ShopUserDTO shopUserDTO) { + // 修改店铺职工信息 + ShopUser shopUser = BeanUtil.map(shopUserDTO, ShopUser.class); + shopUser.setPhoneNum(shopUserDTO.getPhone()); + shopUser.setHasAccount(null); + // 修改店铺account信息 + AuthAccountDTO authAccountDTO = BeanUtil.map(shopUserDTO, AuthAccountDTO.class); + UidInfoBO uidInfoBO = AuthUserContext.get(); + authAccountDTO.setTenantId(uidInfoBO.getTenantId()); + authAccountDTO.setSysType(uidInfoBO.getSysType()); + authAccountDTO.setUserId(shopUserDTO.getShopUserId()); + ServerResponseEntity serverResponseEntity = accountFeignClient.update(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + this.update(shopUser, shopUserDTO.getRoleIds()); + + } + + @Override + public List listByShopId(ShopUserDTO shopUserDTO) { + return shopUserMapper.listByShopId(shopUserDTO); + } + + @Override + public List listShopUserByUserIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return new ArrayList<>(0); + } + return shopUserMapper.listShopUserByUserIds(userIds); + } + + /** + * 校验注册信息 + * @param shopUserRegisterDTO + * @return + */ + public void checkRegisterInfo(ShopUserRegisterDTO shopUserRegisterDTO) { + // 用户名 + ServerResponseEntity usernameRes = accountFeignClient.countByUserNameAndSysType(shopUserRegisterDTO.getUsername(), SysTypeEnum.MULTISHOP.value()); + if (!usernameRes.isSuccess()) { + throw new LuckException("服务器繁忙!"); + } + if (usernameRes.getData() > 0) { + throw new LuckException("用户名已经存在"); + } + // 手机号验证码 + ServerResponseEntity mobileRes = accountFeignClient.countByMobileAndSysType(shopUserRegisterDTO.getMobile(), SysTypeEnum.MULTISHOP.value()); + if (!mobileRes.isSuccess()) { + throw new LuckException("服务器繁忙!"); + } + if (mobileRes.getData() > 0) { + throw new LuckException("该手机号已经被注册!"); + } + ServerResponseEntity sendNotifyResponse = notifyFeignClient.checkValidCode(shopUserRegisterDTO.getMobile(), shopUserRegisterDTO.getValidCode(), SendTypeEnum.VALID); + if (Objects.equals(sendNotifyResponse.getCode(), ResponseEnum.OK.value()) && Objects.nonNull(sendNotifyResponse.getData()) && !sendNotifyResponse.getData()) { + throw new LuckException("验证码有误或已过期"); + } + } + + @Override + public Integer countAccoutByMobile(String mobile) { + return shopUserMapper.countAccoutByMobile(mobile); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWalletLogServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWalletLogServiceImpl.java new file mode 100644 index 0000000..37de324 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWalletLogServiceImpl.java @@ -0,0 +1,543 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.bo.ShopSimpleBO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.multishop.constant.ShopWalletAmountType; +import com.tmerclub.cloud.multishop.constant.ShopWalletChangeReason; +import com.tmerclub.cloud.multishop.constant.ShopWalletIoType; +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.mapper.ShopWalletMapper; +import com.tmerclub.cloud.multishop.model.ShopDetail; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import com.tmerclub.cloud.multishop.vo.ShopWalletLogExcelVO; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import com.tmerclub.cloud.multishop.vo.mongo.MongoShopWalletLogVO; +import com.tmerclub.cloud.multishop.vo.mongo.MongoShopWalletVO; +import com.mongodb.client.result.UpdateResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 商家钱包记录 + * @author FrozenWatermelon + */ +@Service +public class ShopWalletLogServiceImpl implements ShopWalletLogService { + + private static final Logger logger = LoggerFactory.getLogger(ShopWalletLogServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private ShopDetailService shopDetailService; + @Autowired + private MongoPageUtil mongoPageUtil; + @Autowired + private ShopWalletMapper shopWalletMapper; + @Autowired + private ShopAllinpayService shopAllinpayService; + + @Override + public PageVO pageByParam(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Criteria criteria = getCriteria(shopWalletLogSearchDTO); + if (Objects.isNull(shopWalletLogSearchDTO.getReason()) && Objects.nonNull(shopWalletLogSearchDTO.getShopId())) { + criteria.and("reason").ne(ShopWalletChangeReason.APPLY_RECHARGE.value()); + } + // 平台搜索 + if (Objects.isNull(shopWalletLogSearchDTO.getShopId())) { + if (Objects.isNull(shopWalletLogSearchDTO.getAmountType())) { + // 平台搜索只需要查待结算金额和结算金额的记录 + criteria.and("amountType").in(ShopWalletAmountType.UNSETTLED_AMOUNT.value(), ShopWalletAmountType.SETTLED_AMOUNT.value()); + } + if (Objects.isNull(shopWalletLogSearchDTO.getReason())) { + // 平台搜索只需要查订单支付,订单结算,用户退款, 预售失败结算(超时未支付尾款)的记录 + criteria.and("reason") + .in(ShopWalletChangeReason.PAY.value(), ShopWalletChangeReason.SETTLED.value(), ShopWalletChangeReason.ORDER_REFUND.value(), ShopWalletChangeReason.PRE_SALE_FAIL.value()); + } + Criteria platformCriteria = new Criteria(); + // 筛选掉,用户退款且为平台收入金额的记录,因为只是退款不会导致平台收入金额的变化 + platformCriteria.and("reason").is(ShopWalletChangeReason.ORDER_REFUND.value()).and("amountType").is(ShopWalletAmountType.SETTLED_AMOUNT.value()); + criteria.norOperator(platformCriteria); + } + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return mongoPageUtil.doPage(MongoShopWalletLogBO.class, pageDTO, query); + } + + @Override + public MongoShopWalletLogBO getByWalletLogId(Long walletLogId) { + MongoShopWalletLogBO shopWalletLogDb = mongoTemplate.findById(walletLogId, MongoShopWalletLogBO.class); + if (Objects.isNull(shopWalletLogDb)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return shopWalletLogDb; + } + + @Override + public List listByOrderIdAndReason(Long orderId, Integer shopWalletChangeReason) { + Criteria criteria = new Criteria(); + criteria.and("orderId").is(orderId); + if (Objects.nonNull(shopWalletChangeReason)) { + criteria.and("reason").is(shopWalletChangeReason); + } + Query query = new Query(criteria); + return mongoTemplate.find(query, MongoShopWalletLogBO.class); + } + + @Override + public List listByParam(ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Criteria criteria = getCriteria(shopWalletLogSearchDTO); + setShopIdAndReason(shopWalletLogSearchDTO, criteria); + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return mongoTemplate.find(query, MongoShopWalletLogBO.class); + } + + private static void setShopIdAndReason(ShopWalletLogSearchDTO shopWalletLogSearchDTO, Criteria criteria) { + if (Objects.isNull(shopWalletLogSearchDTO.getShopId()) && StrUtil.isBlank(shopWalletLogSearchDTO.getShopName())) { + criteria.and("shopId").ne(Constant.PLATFORM_SHOP_ID); + } + if (Objects.isNull(shopWalletLogSearchDTO.getReason())) { + criteria.and("reason").ne(ShopWalletChangeReason.APPLY_RECHARGE.value()); + } + } + + @Override + public void saveMongo(MongoShopWalletLogBO mongoShopWalletLogBO) { + logger.info("插入日志:{}", mongoShopWalletLogBO); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + mongoShopWalletLogBO.setWalletLogId(walletLogId); + mongoTemplate.insert(mongoShopWalletLogBO); + } + + @Override + public void saveMongoBatch(List list) { + logger.info("插入日志:{}", Json.toJsonString(list)); + if (CollUtil.isEmpty(list)) { + return; + } + // 批量操作 + try { + mongoTemplate.insert(list, MongoShopWalletLogBO.class); + } catch (DuplicateKeyException e) { + logger.info("重复数据插入异常:{}", Json.toJsonString(list)); + } + } + + @Override + public PageVO pageAllShop(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Criteria criteria = getCriteria(shopWalletLogSearchDTO); + setShopIdAndReason(shopWalletLogSearchDTO, criteria); + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + + PageVO page = mongoPageUtil.doPage(MongoShopWalletLogBO.class, pageDTO, query); + // 店铺名称 + Map shopMap = getShopMap(page.getList().stream().map(MongoShopWalletLogBO::getShopId)); + + for (MongoShopWalletLogBO mongoShopWalletLogVO : page.getList()) { + if (shopMap.containsKey(mongoShopWalletLogVO.getShopId())) { + mongoShopWalletLogVO.setShopName(shopMap.get(mongoShopWalletLogVO.getShopId())); + } + } + return page; + } + + @Override + public List listShopWalletLogExcel(ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Criteria criteria; + if (CollUtil.isNotEmpty(shopWalletLogSearchDTO.getShopIds())) { + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + criteria = Criteria.where("shopId").in(shopWalletLogSearchDTO.getShopIds()).and("paySysType").is(paySysType); + } else { + criteria = getCriteria(shopWalletLogSearchDTO); + } + criteria.and("reason").ne(ShopWalletChangeReason.APPLY_RECHARGE.value()); + criteria.and("shopId").ne(Constant.PLATFORM_SHOP_ID); + ProjectionOperation project = Aggregation.project("shopId", "orderId", "refundId", "amountType", "shopIoType", "shopChangeAmount", "reason", + "userAmount", "platformAmount", "distributionAmount", "shopPlatformCommission", "platformCommission", "shopReduceAmount", "createTime"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "shopId").and(Sort.Direction.DESC, "createTime"); + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoShopWalletLogBO.class, + Aggregation.match(criteria), + project, + sortOperation + ); + + logger.info("listShopWalletLogExcel()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoShopWalletLogBO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(0); + } + Map shopMap = getShopMap(list.stream().map(MongoShopWalletLogBO::getShopId)); + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + int index = 1; + for (MongoShopWalletLogBO mongoShopWalletLogBO : list) { + ShopWalletLogExcelVO shopWalletLogExcel = new ShopWalletLogExcelVO(); + shopWalletLogExcel.setSeq(String.valueOf(index)); + shopWalletLogExcel.setShopName(shopMap.get(mongoShopWalletLogBO.getShopId())); + shopWalletLogExcel.setAmountType(ShopWalletAmountType.getAmountTypeName(mongoShopWalletLogBO.getAmountType())); + shopWalletLogExcel.setIoType(ShopWalletIoType.getIoName(mongoShopWalletLogBO.getShopIoType())); + shopWalletLogExcel.setChangeAmount(PriceUtil.toDecimalPrice(mongoShopWalletLogBO.getShopChangeAmount()).toString()); + shopWalletLogExcel.setOrderId(Objects.isNull(mongoShopWalletLogBO.getOrderId()) ? "" : mongoShopWalletLogBO.getOrderId().toString()); + shopWalletLogExcel.setRefundId(Objects.isNull(mongoShopWalletLogBO.getRefundId()) ? "" : mongoShopWalletLogBO.getRefundId().toString()); + shopWalletLogExcel.setUserAmount(PriceUtil.toDecimalPrice(mongoShopWalletLogBO.getUserAmount()).toString()); + shopWalletLogExcel.setShopReduceAmount(PriceUtil.toDecimalPrice(mongoShopWalletLogBO.getShopReduceAmount()).toString()); + shopWalletLogExcel.setPlatformAmount(PriceUtil.toDecimalPrice(mongoShopWalletLogBO.getPlatformAmount()).toString()); + shopWalletLogExcel.setDistributionAmount(PriceUtil.toDecimalPrice(mongoShopWalletLogBO.getDistributionAmount()).toString()); + shopWalletLogExcel.setPlatformCommission(PriceUtil.toDecimalPrice(mongoShopWalletLogBO.getPlatformCommission()).toString()); + shopWalletLogExcel.setShopPlatformCommission(PriceUtil.toDecimalPrice(mongoShopWalletLogBO.getShopPlatformCommission()).toString()); + shopWalletLogExcel.setReasonStr(ShopWalletChangeReason.getReason(mongoShopWalletLogBO.getReason())); + shopWalletLogExcel.setCreateTime(mongoShopWalletLogBO.getCreateTime()); + result.add(shopWalletLogExcel); + index++; + } + return result; + } + + private Map getShopMap(Stream list) { + List shopIds = list.collect(Collectors.toList()); + List shopDetails = shopDetailService.listByShopIds(shopIds); + return shopDetails.stream().collect(Collectors.toMap(ShopDetail::getShopId, ShopDetail::getShopName)); + } + + @Override + public PageVO getRechargePageByShopId(PageDTO pageDTO, Long shopId) { + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + Query query = new Query(); + query.addCriteria(Criteria.where("shopId").is(shopId) + .and("paySysType").is(paySysType) + .and("reason").is(ShopWalletChangeReason.SUCCESS_RECHARGE.value())); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + return mongoPageUtil.doPage(MongoShopWalletLogBO.class, pageDTO, query); + } + + @Override + public long countInAmountByOrderId(Long orderId, Integer shopWalletChangeReason) { + return countInAmountByOrderIds(Collections.singletonList(orderId), shopWalletChangeReason); + } + + @Override + public Long countInAmountByOrderIds(List orderIds, Integer shopWalletChangeReason) { + Criteria criteria = Criteria.where("orderId").in(orderIds).and("reason").is(shopWalletChangeReason); + return countByMongoDb(criteria); + } + + @Override + public long countOutAmountByRefundId(Long refundId, Integer shopWalletChangeReason) { + Criteria criteria = Criteria.where("refundId").is(refundId).and("reason").is(shopWalletChangeReason); + return countByMongoDb(criteria); + } + + @Override + public void updateRechargeSuccess(Long shopWalletLogId, Long orderId) { + MongoShopWalletLogBO shopWalletLogDb = mongoTemplate.findById(shopWalletLogId, MongoShopWalletLogBO.class); + if (Objects.isNull(shopWalletLogDb)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 幂等 + if (Objects.equals(shopWalletLogDb.getReason(), ShopWalletChangeReason.SUCCESS_RECHARGE.value())) { + return; + } + + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(shopWalletLogId).and("reason").is(ShopWalletChangeReason.APPLY_RECHARGE.value())); + Update update = new Update(); + update.set("orderId", orderId); + update.set("reason", ShopWalletChangeReason.SUCCESS_RECHARGE.value()); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoShopWalletLogBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public ShopWalletVO getShopWalletByTime(ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Criteria criteria = getCriteria(shopWalletLogSearchDTO); + criteria.and("shopId").ne(Constant.PLATFORM_SHOP_ID); + ProjectionOperation projectionOperation = Aggregation.project() + // 待结算金额收入: 用户支付 拒绝用户退款 + .and(ConditionalOperators.when(Criteria.where("reason").in(0, 3)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("inUnsettleAmount") + // 待结算金额支出: 用户退款成功 系统扣除订单中需要颁发给用户的分销金额 + .and(ConditionalOperators.when(Criteria.where("reason").in(2, 9)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("outUnsettleAmount") + // 总结算金额:订单结算 余额充值成功 预售失败结算(超时未支付尾款) + .and(ConditionalOperators.when(Criteria.where("reason").in(1, 11, 14)).then(ConditionalOperators.when(Criteria.where("amountType").is(1)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("totalSettleAmount") + // 冻结金额收入:提现申请 + .and(ConditionalOperators.when(Criteria.where("reason").in(4)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("inFreezeAmount") + // 冻结金额支出:提现申请被拒绝 提现申请通过 + .and(ConditionalOperators.when(Criteria.where("reason").in(5, 6)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("outFreezeAmount"); + // 分组 + GroupOperation groupOperation = Aggregation.group() + .sum("inUnsettleAmount").as("inUnsettleAmount") + .sum("outUnsettleAmount").as("outUnsettleAmount") + .sum("totalSettleAmount").as("totalSettleAmount") + .sum("inFreezeAmount").as("inFreezeAmount") + .sum("outFreezeAmount").as("outFreezeAmount"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoShopWalletVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + logger.info("getShopWalletByTime()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoShopWalletVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + ShopWalletVO shopWalletVO = new ShopWalletVO(); + if (CollUtil.isEmpty(list)) { + return shopWalletVO; + } + MongoShopWalletVO mongoShopWalletVO = list.get(0); + shopWalletVO.setUnsettledAmount(mongoShopWalletVO.getInUnsettleAmount() - mongoShopWalletVO.getOutUnsettleAmount()); + shopWalletVO.setTotalSettledAmount(mongoShopWalletVO.getTotalSettleAmount()); + shopWalletVO.setFreezeAmount(mongoShopWalletVO.getInFreezeAmount() - mongoShopWalletVO.getOutFreezeAmount()); + return shopWalletVO; + } + + @Override + public PageVO pageShopWalletByTime(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Criteria criteria = getCriteria(shopWalletLogSearchDTO); + criteria.and("shopId").ne(Constant.PLATFORM_SHOP_ID); + ProjectionOperation projectionOperation = Aggregation.project("shopId") + // 待结算金额收入: 用户支付 拒绝用户退款 + .and(ConditionalOperators.when(Criteria.where("reason").in(0, 3)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("inUnsettleAmount") + // 待结算金额支出: 用户退款成功 系统扣除订单中需要颁发给用户的分销金额 + .and(ConditionalOperators.when(Criteria.where("reason").in(2, 9)).then(ConditionalOperators.when(Criteria.where("amountType").is(0)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("outUnsettleAmount") + // 总结算金额:订单结算 余额充值成功 预售失败结算(超时未支付尾款) + .and(ConditionalOperators.when(Criteria.where("reason").in(1, 11, 14)).then(ConditionalOperators.when(Criteria.where("amountType").is(1)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("totalSettleAmount") + // 冻结金额收入:提现申请 + .and(ConditionalOperators.when(Criteria.where("reason").in(4)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("inFreezeAmount") + // 冻结金额支出:提现申请被拒绝 提现申请通过 + .and(ConditionalOperators.when(Criteria.where("reason").in(5, 6)).then(ConditionalOperators.when(Criteria.where("amountType").is(2)).then("$shopChangeAmount").otherwise(0)).otherwise(0)).as("outFreezeAmount"); + // 分组 + GroupOperation groupOperation = Aggregation.group("shopId") + .first("shopId").as("shopId") + .sum("inUnsettleAmount").as("inUnsettleAmount") + .sum("outUnsettleAmount").as("outUnsettleAmount") + .sum("totalSettleAmount").as("totalSettleAmount") + .sum("inFreezeAmount").as("inFreezeAmount") + .sum("outFreezeAmount").as("outFreezeAmount"); + + SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "shopId"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageDTO.getPageSize() * (pageDTO.getPageNum() - 1)); + LimitOperation limitOperation = Aggregation.limit(pageDTO.getPageSize()); + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoShopWalletVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation, + sortOperation, + skipOperation, + limitOperation + ); + + logger.info("pageShopWalletByTime()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoShopWalletVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new PageVO<>(); + } + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoShopWalletVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + + // 执行聚合操作 + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoShopWalletVO.class); + // 取出最终结果 + List mappedResults = aggregate.getMappedResults(); + // 组装数据 + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map shopMap = getShopMap(list.stream().map(MongoShopWalletVO::getShopId)); + for (MongoShopWalletVO mongoShopWalletVO : list) { + ShopWalletVO shopWalletVO = new ShopWalletVO(); + String shopName = shopMap.get(mongoShopWalletVO.getShopId()); + shopWalletVO.setShopId(mongoShopWalletVO.getShopId()); + shopWalletVO.setShopName(shopName); + shopWalletVO.setUnsettledAmount(mongoShopWalletVO.getInUnsettleAmount() - mongoShopWalletVO.getOutUnsettleAmount()); + shopWalletVO.setTotalSettledAmount(mongoShopWalletVO.getTotalSettleAmount()); + shopWalletVO.setFreezeAmount(mongoShopWalletVO.getInFreezeAmount() - mongoShopWalletVO.getOutFreezeAmount()); + result.add(shopWalletVO); + } + PageVO page = new PageVO<>(); + page.setTotal((long) mappedResults.size()); + page.setList(result); + page.setPages(PageUtil.getPages(mappedResults.size(), pageDTO.getPageSize())); + return page; + } + + @Override + public ShopWalletVO getPlatformWallet() { + // 统计reason在0,1,2的所有平台待结算金额,再统计结算金额,减掉就是真正的待结算金额 + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + Criteria criteria = Criteria.where("reason") + .in(ShopWalletChangeReason.PAY.value(), ShopWalletChangeReason.ORDER_REFUND.value()) + .and("paySysType").is(paySysType) + .and("amountType").is(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + Aggregation aggregation = getAggregation(criteria); + AggregationResults results = mongoTemplate.aggregate(aggregation, MongoShopWalletLogBO.class, MongoShopWalletLogVO.class); + List unSettleList = results.getMappedResults(); + if (CollUtil.isEmpty(unSettleList)) { + return new ShopWalletVO(); + } + Criteria settleCriteria = Criteria.where("reason").is(ShopWalletChangeReason.SETTLED.value()) + .and("paySysType").is(paySysType) + .and("amountType").is(ShopWalletAmountType.SETTLED_AMOUNT.value()); + Aggregation settledAggregation = getAggregation(settleCriteria); + AggregationResults settledResults = mongoTemplate.aggregate(settledAggregation, MongoShopWalletLogBO.class, MongoShopWalletLogVO.class); + List settleList = settledResults.getMappedResults(); + Long outUnAmount = 0L; + Long inUnAmount = 0L; + for (MongoShopWalletLogVO mongoShopWalletLogVO : unSettleList) { + if (Objects.equals(mongoShopWalletLogVO.getPlatformIoType(), ShopWalletIoType.INCOME.value())) { + // 待结算收入金额 + inUnAmount = mongoShopWalletLogVO.getTotalAmount(); + } + if (Objects.equals(mongoShopWalletLogVO.getPlatformIoType(), ShopWalletIoType.EXPENDITURE.value())) { + // 待结算支出金额 + outUnAmount = mongoShopWalletLogVO.getTotalAmount(); + } + } + Long outAmount = 0L; + Long inAmount = 0L; + for (MongoShopWalletLogVO mongoShopWalletLogVO : settleList) { + if (Objects.equals(mongoShopWalletLogVO.getPlatformIoType(), ShopWalletIoType.EXPENDITURE.value())) { + // 结算支出金额 + outAmount = mongoShopWalletLogVO.getTotalAmount(); + } + if (Objects.equals(mongoShopWalletLogVO.getPlatformIoType(), ShopWalletIoType.INCOME.value())) { + // 结算收入金额 + inAmount = mongoShopWalletLogVO.getTotalAmount(); + } + } + long settledAmount = inAmount - outAmount; + long unsettleAmount = inUnAmount - outUnAmount - settledAmount; + ShopWalletVO shopWalletVO = new ShopWalletVO(); + shopWalletVO.setUnsettledAmount(unsettleAmount); + shopWalletVO.setSettledAmount(settledAmount); + return shopWalletVO; + } + + private static Aggregation getAggregation(Criteria criteria) { + return Aggregation.newAggregation( + Aggregation.match(criteria), + Aggregation.group("platformIoType").sum("platformChangeAmount").as("totalAmount") + .last("platformIoType").as("platformIoType") + ); + } + + @Override + public List listByOrderIdsAndChangeReason(List orderIds, Integer shopWalletChangeReason) { + Criteria criteria = Criteria.where("orderId").in(orderIds).and("reason").is(shopWalletChangeReason); + Query query = new Query(criteria); + return mongoTemplate.find(query, MongoShopWalletLogBO.class); + } + + + + /** + * 获取MongoDB的搜索条件 + */ + private Criteria getCriteria(ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + Criteria criteria = new Criteria(); + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + Integer sysType = Objects.nonNull(AuthUserContext.get()) ? AuthUserContext.get().getSysType() : null; + criteria.and("paySysType").is(paySysType); + if (Objects.nonNull(shopWalletLogSearchDTO.getRefundId())) { + criteria.and("refundId").is(shopWalletLogSearchDTO.getRefundId()); + } + if (Objects.nonNull(shopWalletLogSearchDTO.getOrderId())) { + criteria.and("orderId").is(shopWalletLogSearchDTO.getOrderId()); + } + if (Objects.nonNull(shopWalletLogSearchDTO.getAmountType())) { + criteria.and("amountType").is(shopWalletLogSearchDTO.getAmountType()); + } + if(Objects.nonNull(shopWalletLogSearchDTO.getReason())){ + criteria.and("reason").is(shopWalletLogSearchDTO.getReason()); + } + if (Objects.nonNull(shopWalletLogSearchDTO.getShopId())) { + criteria.and("shopId").is(shopWalletLogSearchDTO.getShopId()); + } + if (Objects.nonNull(shopWalletLogSearchDTO.getShopIoType())) { + criteria.and("shopIoType").is(shopWalletLogSearchDTO.getShopIoType()); + } + if (Objects.nonNull(shopWalletLogSearchDTO.getPlatformIoType())) { + criteria.and("platformIoType").is(shopWalletLogSearchDTO.getPlatformIoType()); + } + if (StrUtil.isNotBlank(shopWalletLogSearchDTO.getShopName())) { + ShopSimpleBO shopSimpleBO = new ShopSimpleBO(); + shopSimpleBO.setShopName(shopWalletLogSearchDTO.getShopName()); + List shopSimpleList = shopDetailService.listSimple(shopSimpleBO); + if (CollUtil.isNotEmpty(shopSimpleList)) { + List shopIds = shopSimpleList.stream().map(ShopSimpleBO::getShopId).collect(Collectors.toList()); + criteria.and("shopId").in(shopIds); + } + } + if (Objects.nonNull(shopWalletLogSearchDTO.getStartTime())) { + criteria.and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(shopWalletLogSearchDTO.getStartTime()))).lte(Objects.requireNonNull(DateUtils.dateToIsoDate(shopWalletLogSearchDTO.getEndTime()))); + } + return criteria; + } + + private long countByMongoDb(Criteria criteria) { + return mongoTemplate.count(new Query(criteria), MongoShopWalletLogBO.class); + } +} + diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWalletServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWalletServiceImpl.java new file mode 100644 index 0000000..fa3a5bc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWalletServiceImpl.java @@ -0,0 +1,1285 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.distribution.feign.DistributionUserIncomeFeignClient; +import com.tmerclub.cloud.api.distribution.vo.DistributionUserIncomeApiVO; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.multishop.bo.ShopWalletBO; +import com.tmerclub.cloud.api.order.constant.PurchaseOrderWaitStatus; +import com.tmerclub.cloud.api.order.feign.OrderSettlementFeignClient; +import com.tmerclub.cloud.api.order.vo.OrderSettlementPayVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.dto.AllinpaySettlementApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierWalletFeignClient; +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.multishop.constant.ShopWalletAmountType; +import com.tmerclub.cloud.multishop.constant.ShopWalletChangeReason; +import com.tmerclub.cloud.multishop.constant.ShopWalletIoType; +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.mapper.ShopWalletMapper; +import com.tmerclub.cloud.multishop.model.ShopWallet; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.data.mongodb.core.query.Update; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商家钱包信息 + * + * @author FrozenWatermelon + */ +@Service +public class ShopWalletServiceImpl implements ShopWalletService { + + @Autowired + private ShopWalletMapper shopWalletMapper; + @Autowired + private ShopWalletLogService shopWalletLogService; + @Autowired + private SupplierWalletService supplierWalletService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private RocketMQTemplate updateShopRechargeSuccessTemplate; + @Autowired + private RocketMQTemplate addShopWalletLogTemplate; + @Autowired + private RocketMQTemplate shopWalletNotifyServiceTemplate; + @Autowired + private RocketMQTemplate refundShopNotifyServiceTemplate; + @Autowired + private RocketMQTemplate refundSuccessNotifySupplierTemplate; + @DubboReference + private PaymentFeignClient paymentFeignClient; + @DubboReference + private SupplierWalletFeignClient supplierWalletFeignClient; + @DubboReference + private DistributionUserIncomeFeignClient distributionUserIncomeFeignClient; + @DubboReference + private OrderSettlementFeignClient orderSettlementFeignClient; + @Autowired + private ShopAllinpayService shopAllinpayService; + + private static final Logger logger = LoggerFactory.getLogger(ShopWalletServiceImpl.class); + + @Override + public void save(ShopWallet shopWallet) { + shopWalletMapper.save(shopWallet); + } + + @Override + public void update(ShopWallet shopWallet) { + shopWalletMapper.update(shopWallet); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addAmountByOrder(List orderSimpleAmountInfos, PayNotifyBO message, Map settledAmountMap, Map salesMap) { + + // 进行分账,添加一个分账记录表,因为每一个订单进行分完帐后要进行退款,那么退款的时候也应该按照下单的时候的分账比例进行原路返回 + // 获取当前分账的比例 + List orderStatusList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List shopWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderSupplierAmountInfos = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderIds = orderSimpleAmountInfos.stream().map(OrderSimpleAmountInfoBO::getOrderId).collect(Collectors.toList()); + List mongoShopWalletLogList = shopWalletLogService.listByOrderIdsAndChangeReason(orderIds, ShopWalletChangeReason.PAY.value()); + List mongoOrderIds = mongoShopWalletLogList.stream().map(MongoShopWalletLogBO::getOrderId).toList(); + for (OrderSimpleAmountInfoBO orderSimpleAmountInfo : orderSimpleAmountInfos) { + Long settlementAmount; + // 商家之所以会从一笔订单拿到钱,是因为订单支付成功 + // 幂等 + if (mongoOrderIds.contains(orderSimpleAmountInfo.getOrderId())) { + return; + } + // 1. 商家应收 = 商品价格 - 商家优惠 - 分销金额 + // 2. 商家应收 = 用户支付 + 平台补贴 - 分销金额 + Long changeAmount; + long supplierAmount; + changeAmount = orderSimpleAmountInfo.getActualTotal() + orderSimpleAmountInfo.getPlatformAmount() - orderSimpleAmountInfo.getDistributionAmount() - orderSimpleAmountInfo.getPlatformCommission(); + if (!Objects.equals(orderSimpleAmountInfo.getSupplierId(), 0L)) { + // 代销订单处理 + // 商家余额 + settlementAmount = settledAmountMap.get(orderSimpleAmountInfo.getShopId() + ":" + orderSimpleAmountInfo.getPaySysType()); + // 供应商收入金额为 = 采购金额 + 运费 + 商家优惠运费 - 平台佣金 + supplierAmount = orderSimpleAmountInfo.getPurchaseAmount() + orderSimpleAmountInfo.getFreightAmount() + Math.abs(orderSimpleAmountInfo.getFreeFreightAmount()); + // 商家实际待结算金额 = 之前算法 - 运费 - 采购金额 + changeAmount = changeAmount - supplierAmount; + // 如果商家收入金额小于供货价,0.直接转换为待采购订单(默认选中),1.通过商家已结算金额扣除差价 + Integer type = salesMap.get(orderSimpleAmountInfo.getShopId()); + // 如果商家收入金额小于供货价,判断处理 + // 代销设置为商家通过已结算账户金额扣除差价,且已结算金额小于于差价则变成待采购订单 + // 情况一,代销设置为商家直接转换成采购订单,且已结算金额小于差价则转换成采购订单 + // 情况二,代销设置为商家通过已结算账户金额扣除差价,且已结算金额小于于差价则变成待采购订单 + boolean checkAmountFlag = (Objects.equals(type, 0) && changeAmount < 0) || (Objects.equals(type, 1) && settlementAmount + changeAmount < 0); + // 商家不同意采购,或者情况一,或者情况二,订单变成待采购 + if (!Objects.equals(message.getAgreePurchase(), 1) && checkAmountFlag) { + OrderStatusBO orderStatusBO = new OrderStatusBO(); + orderStatusBO.setOrderId(orderSimpleAmountInfo.getOrderId()); + orderStatusBO.setWaitPurchase(1); + orderStatusBO.setPurchaseSpreadAmount(Math.abs(changeAmount)); + orderStatusList.add(orderStatusBO); + continue; + } + // 自动采购完成,代销设置为商家通过已结算账户金额自动扣除差价,且已结算金额足够,且改变金额小于0 + if (changeAmount < 0 && Objects.equals(type, 1) && settlementAmount + changeAmount > 0) { + OrderStatusBO orderStatusBO = new OrderStatusBO(); + orderStatusBO.setOrderId(orderSimpleAmountInfo.getOrderId()); + orderStatusBO.setWaitPurchase(PurchaseOrderWaitStatus.PURCHASED.value()); + orderStatusBO.setPurchaseSpreadAmount(Math.abs(changeAmount)); + orderStatusList.add(orderStatusBO); + } + supplierAmount = supplierAmount - orderSimpleAmountInfo.getPurchasePlatformCommission(); + // 处理下供应商的分账 + handleSupplierAmount(orderSupplierAmountInfos, orderSimpleAmountInfo, changeAmount, supplierAmount, shopWalletLogList); + // 待结算金额处理 + changeAmount = Math.max(0L, changeAmount); + } + + // 商家添加未结算金额 + shopWalletMapper.addUnsettledAmount(orderSimpleAmountInfo.getShopId(), changeAmount, orderSimpleAmountInfo.getPaySysType()); + // 平台添加未结算金额(平台佣金 - 平台优惠分摊优惠金额) + long platformChangeAmount = orderSimpleAmountInfo.getPlatformCommission() + orderSimpleAmountInfo.getPurchasePlatformCommission() - orderSimpleAmountInfo.getPlatformAmount(); + + // 获取商家钱包记录列表 + saveShopWalletLog(orderSimpleAmountInfo, changeAmount, platformChangeAmount, shopWalletLogList); + } + + sendAddOrderAmountMsg(message, orderStatusList, shopWalletLogList, orderSupplierAmountInfos); + } + + private void sendAddOrderAmountMsg(PayNotifyBO message, List orderStatusList, List shopWalletLogList, List orderSupplierAmountInfos) { + // 批量设置商家钱包记录id - 存店铺钱包记录到mongodb,因为上面保证了幂等性所以这里可以直接生成id保存到数据库 + if (CollUtil.isNotEmpty(shopWalletLogList)) { + for (MongoShopWalletLogBO mongoShopWalletLogBO : shopWalletLogList) { + mongoShopWalletLogBO.setWalletLogId(message.getShopWalletIds().remove(0)); + } + } + + // 用mq批量保存钱包日志 + sendSingleMsg(addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(shopWalletLogList))); + message.setOrderStatusList(orderStatusList); + if (CollectionUtil.isNotEmpty(orderSupplierAmountInfos)) { + for (OrderSimpleAmountInfoBO orderSimpleAmountInfo : orderSupplierAmountInfos) { + orderSimpleAmountInfo.setWalletLogId(message.getShopWalletIds().remove(0)); + } + message.setOrderSimpleAmountInfos(orderSupplierAmountInfos); + } + + // 分账总消息,包括分销分支&&订单采购&&供应商分账 + // 分销订单有自己的操作,分销订单不包含积分订单 + // 订单成功 ----> 商家分账成功 ----> 分销分账 ---> 供应商分账 + // 代销商品流程 订单成功 ----> 商家分账成功 ----> 分销分账 ---> 供应商分账 --->修改订单为待采购订单 + sendSingleMsg(shopWalletNotifyServiceTemplate.syncSend(RocketMqConstant.SHOP_WALLET_NOTIFY_SERVICE_TOPIC, new GenericMessage<>(message))); + } + + private void saveShopWalletLog(OrderSimpleAmountInfoBO orderSimpleAmountInfo, Long changeAmount, long platformChangeAmount, List shopWalletLogList) { + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setOrderId(orderSimpleAmountInfo.getOrderId()); + shopWalletLog.setPaySysType(Objects.isNull(orderSimpleAmountInfo.getPaySysType()) ? 0 : orderSimpleAmountInfo.getPaySysType()); + shopWalletLog.setReason(ShopWalletChangeReason.PAY.value()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + shopWalletLog.setShopId(orderSimpleAmountInfo.getShopId()); + shopWalletLog.setAmountType(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + shopWalletLog.setPlatformIoType(platformChangeAmount >= 0 ? 1 : 0); + + shopWalletLog.setUserAmount(orderSimpleAmountInfo.getActualTotal()); + shopWalletLog.setPlatformAmount(orderSimpleAmountInfo.getPlatformAmount()); + shopWalletLog.setPlatformCommission(orderSimpleAmountInfo.getPlatformCommission() + orderSimpleAmountInfo.getPurchasePlatformCommission()); + shopWalletLog.setPlatformChangeAmount(shopWalletLog.getUserAmount()); + shopWalletLog.setDistributionAmount(orderSimpleAmountInfo.getDistributionAmount()); + + shopWalletLog.setShopPlatformCommission(orderSimpleAmountInfo.getPlatformCommission()); + shopWalletLog.setShopReduceAmount(orderSimpleAmountInfo.getShopAmount()); + + if (!Objects.equals(orderSimpleAmountInfo.getShopId(), Constant.PLATFORM_SHOP_ID)) { + shopWalletLog.setShopIoType(1); + shopWalletLog.setShopChangeAmount(changeAmount); + shopWalletLog.setShopPlatformCommission(orderSimpleAmountInfo.getPlatformCommission()); + shopWalletLog.setPlatformChangeAmount(Math.abs(platformChangeAmount)); + } + shopWalletLogList.add(shopWalletLog); + } + + /** + * 供应商采购金额处理,如果商家待结算金额改变金额小于0,减少结算金额并添加日志 + * + * @param orderSupplierAmountInfos 采购分账信息 + * @param orderSimpleAmountInfo 订单信息 + * @param changeAmount 商家待结算改变金额 + * @param supplierAmount 供应商收入金额 + */ + private void handleSupplierAmount(List orderSupplierAmountInfos, OrderSimpleAmountInfoBO orderSimpleAmountInfo, + Long changeAmount, Long supplierAmount, List shopWalletLogList) { + OrderSimpleAmountInfoBO supplierAmountBO = new OrderSimpleAmountInfoBO(); + supplierAmountBO.setOrderId(orderSimpleAmountInfo.getOrderId()); + supplierAmountBO.setSupplierId(orderSimpleAmountInfo.getSupplierId()); + supplierAmountBO.setPurchasePlatformCommission(orderSimpleAmountInfo.getPurchasePlatformCommission()); + supplierAmountBO.setPurchaseAmount(supplierAmount); + supplierAmountBO.setActualTotal(orderSimpleAmountInfo.getActualTotal()); + supplierAmountBO.setFreightAmount(orderSimpleAmountInfo.getFreightAmount()); + supplierAmountBO.setFreeFreightAmount(orderSimpleAmountInfo.getFreeFreightAmount()); + supplierAmountBO.setPaySysType(Objects.isNull(orderSimpleAmountInfo.getPaySysType()) ? 0 : orderSimpleAmountInfo.getPaySysType()); + orderSupplierAmountInfos.add(supplierAmountBO); + + if (changeAmount < 0) { + // 代销订单,商家减少结算金额并添加日志 + boolean isSuccess = subSettledAmount(orderSimpleAmountInfo.getShopId(), Math.abs(changeAmount), orderSimpleAmountInfo.getPaySysType()); + if (!isSuccess) { + throw new LuckException("店铺结算金额不足"); + } + // 添加日志 + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setShopId(orderSimpleAmountInfo.getShopId()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(shopWalletLog.getCreateTime()); + shopWalletLog.setPaySysType(Objects.isNull(orderSimpleAmountInfo.getPaySysType()) ? 0 : orderSimpleAmountInfo.getPaySysType()); + shopWalletLog.setOrderId(orderSimpleAmountInfo.getOrderId()); + shopWalletLog.setReason(ShopWalletChangeReason.PURCHASE_SPREAD_AMOUNT.value()); + shopWalletLog.setShopIoType(0); + shopWalletLog.setShopChangeAmount(changeAmount); + shopWalletLog.setPlatformAmount(orderSimpleAmountInfo.getPlatformAmount()); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLog.setUserAmount(orderSimpleAmountInfo.getActualTotal()); + shopWalletLog.setDistributionAmount(orderSimpleAmountInfo.getDistributionAmount()); + shopWalletLog.setShopReduceAmount(orderSimpleAmountInfo.getShopAmount()); + shopWalletLog.setShopPlatformCommission(orderSimpleAmountInfo.getPlatformCommission()); + // 添加日志 + shopWalletLogList.add(shopWalletLog); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addAmountBySettledOrder(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + Long orderId = orderChangeShopWalletAmountBO.getOrderId(); + // 商家之所以会从一笔订单拿到钱,是因为确认收货 or 订单退款时有部分不退 + long count = shopWalletLogService.countInAmountByOrderId(orderId, ShopWalletChangeReason.SETTLED.value()); + // 幂等 + if (count > 0) { + return; + } + + // 商家&平台需要结算的钱 + MongoShopWalletLogBO payLog = null; + ShopWalletLogSearchDTO shopWalletLogSearchDTO = new ShopWalletLogSearchDTO(); + shopWalletLogSearchDTO.setOrderId(orderId); + List shopWalletLogs = shopWalletLogService.listByParam(shopWalletLogSearchDTO); + + MongoShopWalletLogBO shopRefundLog = new MongoShopWalletLogBO(); + shopRefundLog.setUserAmount(0L); + shopRefundLog.setDistributionAmount(0L); + shopRefundLog.setPlatformCommission(0L); + shopRefundLog.setPlatformAmount(0L); + shopRefundLog.setShopPlatformCommission(0L); + shopRefundLog.setShopChangeAmount(0L); + shopRefundLog.setPlatformChangeAmount(0L); + for (MongoShopWalletLogBO shopWalletLog : shopWalletLogs) { + // 下单 + MongoShopWalletLogBO shopPayLog = polymerizationShopWalletLog(shopRefundLog, shopWalletLog); + if (shopPayLog != null) { + payLog = shopPayLog; + } + } + // 非积分订单需要保存店铺结算记录 + if (Objects.isNull(payLog)) { + return; + } + // 保存店铺结算记录 + saveSettledLog(payLog, shopRefundLog); + // 通知供应商供应商结算 + supplierWalletService.addAmountBySettledOrder(orderId); + } + + @Override + public void addAmountSettlementOrderByAllinPay(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + Long orderId = orderChangeShopWalletAmountBO.getOrderId(); + + // 找出当时支付的payId,如果是预售可能会有两笔支付 + ServerResponseEntity orderSettlementResp = orderSettlementFeignClient.getPayIdByOrderId(orderId); + if (!orderSettlementResp.isSuccess()) { + return; + } + List payIds = getPayIds(orderSettlementResp); + + SplitRuleVO supplierSplitRule = supplierWalletService.getSupplierSettledInfoByOrderId(orderId); + // 2.计算分销员所得 + ServerResponseEntity> distributionUserIncomeResp = distributionUserIncomeFeignClient.listDistributionUserIncomeByOrderId(orderId); + if (!distributionUserIncomeResp.isSuccess()) { + throw new LuckException(distributionUserIncomeResp.getMsg()); + } + List distributionUserIncomeApiList = distributionUserIncomeResp.getData(); + List userSplitRuleList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollectionUtil.isNotEmpty(distributionUserIncomeApiList)) { + for (DistributionUserIncomeApiVO distributionUserIncomeApiVO : distributionUserIncomeApiList) { + SplitRuleVO userSplitRuleVO = new SplitRuleVO(); + userSplitRuleVO.setOrderId(orderId); + // 分销员收入金额 + userSplitRuleVO.setAmount(distributionUserIncomeApiVO.getIncomeAmount()); + userSplitRuleVO.setFee(0L); + userSplitRuleVO.setBizUserId(distributionUserIncomeApiVO.getUserId().toString()); + userSplitRuleList.add(userSplitRuleVO); + } + + } + + // 3.计算店铺所得 + List shopWalletLogs = shopWalletLogService.listByOrderIdAndReason(orderId, null); + + // 商家&平台需要结算的钱 + MongoShopWalletLogBO payLog = null; + + MongoShopWalletLogBO shopRefundLog = new MongoShopWalletLogBO(); + shopRefundLog.setPlatformCommission(0L); + shopRefundLog.setUserAmount(0L); + shopRefundLog.setDistributionAmount(0L); + shopRefundLog.setShopPlatformCommission(0L); + shopRefundLog.setPlatformAmount(0L); + shopRefundLog.setShopChangeAmount(0L); + shopRefundLog.setPlatformChangeAmount(0L); + for (MongoShopWalletLogBO shopWalletLog : shopWalletLogs) { + // 下单 + MongoShopWalletLogBO shopPayLog = polymerizationShopWalletLog(shopRefundLog, shopWalletLog); + if (shopPayLog != null) { + payLog = shopPayLog; + } + } + Long shopChangeAmount = (Objects.isNull(payLog) ? 0L : payLog.getShopChangeAmount()) - shopRefundLog.getShopChangeAmount(); + SplitRuleVO shopSplitRuleVO = new SplitRuleVO(); + // 商家收入金额 + shopSplitRuleVO.setAmount(shopChangeAmount); + // 平台收入金额 + if (Objects.isNull(payLog)) { + shopSplitRuleVO.setFee(0L); + } else { + long platformAmount = payLog.getPlatformAmount() - shopRefundLog.getPlatformAmount(); + long fee = payLog.getPlatformCommission() - shopRefundLog.getPlatformCommission(); + shopSplitRuleVO.setFee(fee - platformAmount); + } + shopSplitRuleVO.setBizUserId(orderChangeShopWalletAmountBO.getShopId().toString()); + shopSplitRuleVO.setOrderId(orderId); + + AllinpaySettlementApiDto allinpaySettlementApiDto = new AllinpaySettlementApiDto(); + allinpaySettlementApiDto.setOrderId(orderId.toString()); + allinpaySettlementApiDto.setPayIds(payIds); + allinpaySettlementApiDto.setShopSplitRuleDto(shopSplitRuleVO); + allinpaySettlementApiDto.setSupplierSplitRuleDto(supplierSplitRule); + allinpaySettlementApiDto.setDistributionUserSplitRuleList(userSplitRuleList); + // 这里还是用mq会比较好,因为如果系统突然挂了,这一段还能重试,继续执行? + // 不过这里本身就是在mq当中,用一个统一的批量执行id,如果遇到重复的就不会执行成功所以直接用feign也没有问题 + ServerResponseEntity serverResponseEntity = paymentFeignClient.doAllinPaySettlement(allinpaySettlementApiDto); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + private static List getPayIds(ServerResponseEntity orderSettlementResp) { + List payIds = Collections.singletonList(orderSettlementResp.getData().getPayId()); + if (StrUtil.isNotBlank(orderSettlementResp.getData().getPayIds())) { + String payIdsStr = orderSettlementResp.getData().getPayIds(); + payIds = Arrays.stream(payIdsStr.split(StrUtil.COMMA)).map(Long::valueOf).collect(Collectors.toList()); + } + return payIds; + } + + /** + * 聚合订单支付退款导致商家金额变更的记录 + * + * @param refundWalletLog + * @param shopWalletLog + * @return + */ + private MongoShopWalletLogBO polymerizationShopWalletLog(MongoShopWalletLogBO refundWalletLog, MongoShopWalletLogBO shopWalletLog) { + if (Objects.equals(ShopWalletChangeReason.PAY.value(), shopWalletLog.getReason())) { + return shopWalletLog; + } + // 退款 + else if (Objects.equals(ShopWalletChangeReason.ORDER_REFUND.value(), shopWalletLog.getReason())) { + refundWalletLog.setPlatformAmount(refundWalletLog.getPlatformAmount() + shopWalletLog.getPlatformAmount()); + refundWalletLog.setUserAmount(refundWalletLog.getUserAmount() + shopWalletLog.getUserAmount()); + refundWalletLog.setDistributionAmount(refundWalletLog.getDistributionAmount() + shopWalletLog.getDistributionAmount()); + refundWalletLog.setPlatformCommission(refundWalletLog.getPlatformCommission() + + (Objects.nonNull(shopWalletLog.getPlatformCommission()) ? shopWalletLog.getPlatformCommission() : 0L)); + refundWalletLog.setShopPlatformCommission(refundWalletLog.getShopPlatformCommission() + + (Objects.nonNull(shopWalletLog.getShopPlatformCommission()) ? shopWalletLog.getShopPlatformCommission() : 0L)); + // 如果因为退款收入,实际上是减少了退款的钱 + Long platformChangeAmount = (Objects.isNull(shopWalletLog.getPlatformIoType()) ? 0L : + (shopWalletLog.getPlatformIoType() == 1) ? -shopWalletLog.getPlatformChangeAmount() : shopWalletLog.getPlatformChangeAmount()); + Long shopChangeAmount = (Objects.isNull(shopWalletLog.getShopIoType()) ? 0L : + (shopWalletLog.getShopIoType() == 1) ? -shopWalletLog.getShopChangeAmount() : shopWalletLog.getShopChangeAmount()); + refundWalletLog.setPlatformChangeAmount(refundWalletLog.getPlatformChangeAmount() + platformChangeAmount); + refundWalletLog.setShopChangeAmount(refundWalletLog.getShopChangeAmount() + shopChangeAmount); + refundWalletLog.setPaySysType(Objects.isNull(shopWalletLog.getPaySysType()) ? 0 : shopWalletLog.getPaySysType()); + } + return null; + } + + + private void saveSettledLog(MongoShopWalletLogBO shopPayLog, MongoShopWalletLogBO shopRefundLog) { + Long shopChangeAmount = shopPayLog.getShopChangeAmount(); + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setPaySysType(Objects.isNull(shopPayLog.getPaySysType()) ? 0 : shopPayLog.getPaySysType()); + shopWalletLog.setOrderId(shopPayLog.getOrderId()); + shopWalletLog.setWalletLogId(walletLogId); + shopWalletLog.setReason(ShopWalletChangeReason.SETTLED.value()); + shopWalletLog.setShopId(shopPayLog.getShopId()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + int shopIoType = shopPayLog.getShopIoType(); + if (shopChangeAmount - shopRefundLog.getShopChangeAmount() < 0) { + shopIoType = 0; + } + // 如果之前未结算为负收入或者当前金额小于退款金额,则已结算的收入是负收入 + if (Objects.equals(shopIoType, 0)) { + shopChangeAmount = -shopChangeAmount - shopRefundLog.getShopChangeAmount(); + } else { + shopChangeAmount = shopChangeAmount - shopRefundLog.getShopChangeAmount(); + } + shopWalletLog.setShopIoType(shopIoType); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLog.setShopChangeAmount(Math.abs(shopChangeAmount)); + shopWalletLog.setUserAmount(shopPayLog.getUserAmount() - shopRefundLog.getUserAmount()); + shopWalletLog.setDistributionAmount(shopPayLog.getDistributionAmount() - shopRefundLog.getDistributionAmount()); + shopWalletLog.setPlatformAmount(shopPayLog.getPlatformAmount() - shopRefundLog.getPlatformAmount()); + shopWalletLog.setShopPlatformCommission(shopPayLog.getShopPlatformCommission() - shopRefundLog.getShopPlatformCommission()); + + // 平台日志 + Long platformChangeAmount = shopPayLog.getPlatformChangeAmount(); + Integer platformIoType = shopPayLog.getPlatformIoType(); + + if (Objects.equals(platformIoType, 0)) { + platformChangeAmount = -platformChangeAmount - shopRefundLog.getPlatformChangeAmount(); + } else { + platformChangeAmount = platformChangeAmount - shopRefundLog.getPlatformChangeAmount(); + } + + if (platformChangeAmount < 0) { + platformIoType = ShopWalletIoType.EXPENDITURE.value(); + platformChangeAmount = Math.abs(platformChangeAmount); + } + shopWalletLog.setPlatformIoType(platformIoType); + shopWalletLog.setPlatformChangeAmount(platformChangeAmount); + shopWalletLog.setPlatformCommission(shopPayLog.getPlatformCommission() - shopRefundLog.getPlatformCommission()); + + + // 商家结算,分成 1.减少待结算金额 和 2.增加结算金额以及总结算金额 两步操作,因为添加结算金额需要上锁操作,细粒化 + // 1.减少待结算金额,订单在哪个分片加的待结算金额就从哪里减掉 + boolean subUnsettledAmountSuccess = subUnsettledAmount(shopWalletLog.getShopId(), shopPayLog.getOrderId(), shopChangeAmount, shopPayLog.getPaySysType()); + if (!subUnsettledAmountSuccess) { + throw new LuckException("您的待结算金额不足,无法进行结算"); + } + + // 2.增加结算金额以及总结算金额,这里可以随机加在某个分片中 + boolean addSettledAmountSuccess = addSettledAmount(shopWalletLog.getShopId(), shopChangeAmount, shopPayLog.getPaySysType()); + if (!addSettledAmountSuccess) { + throw new LuckException("结算失败"); + } + + // 用mq保存钱包日志 + sendSingleMsg(addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(Collections.singleton(shopWalletLog)))); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundShopAmountByRefund(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + // 看看这个订单有没有锁定过 + long count = shopWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), ShopWalletChangeReason.ORDER_REFUND.value()); + // 幂等 + if (count > 0) { + return; + } + // 先来记住几个公式: + // 1. 商家应收 = 商品价格 - 商家优惠 - 分销金额 + // 2. 商家应收 = 用户支付 + 平台补贴 - 分销金额 + // 由于 如果优惠是按照比例来划分,那么用户选择退款金额占(订单/订单项)的比例应该是商家收入减少的比例 + // 可得两个公式: + // 商家应收 = (商品价格 - 商家优惠 - 分销金额) *(1 - 退款金额 / 实付金额) + // 商家应收 = (用户支付 + 平台补贴 - 分销金额) *(1 - 退款金额 / 实付金额) + + // 现规定,如果发生退款,则认为分销失效有: + // 如果订单100元,分销10元,10元的分销费用由商家出,此时商家结算时,拿到90元。 + // 当用户进行退款,退1块的时候,分销会无效,此时商家拿回给出去的10元分销费用,并将1元给到退款用户,此时商家因为退款赚9元。 shopRealRefundAmount = -9 + // 当用户进行退款,退11块的时候,分销会无效,此时商家拿回给出去的10元分销费用,并将11元给到退款用户,此时商家因为11块退款仅亏1元。shopRealRefundAmount = 1 + + // 有发生退款时: + // 商家应收 = (商品价格 - 商家优惠) *(1 - 退款金额 / 实付金额) + // 商家应收 = (实付金额 + 平台补贴) *(1 - 退款金额 / 实付金额) + + // 商家应退 = (实付金额 + 平台补贴) *(退款金额 / 实付金额) + + // 平台佣金应退 = 实付金额 *(退款金额 / 实付金额) + + // 商家改变金额 = 原商家应收(下单时商家应收) - 现在商家应收 - 平台佣金应退 + // = (用户支付 + 平台补贴) - 分销金额 - (实付金额 + 平台补贴) - 平台佣金 *(退款金额 / 实付金额) + // = (用户支付 + 平台补贴)*(退款金额 / 实付金额) - 分销金额 + // = (用户支付 + 平台补贴 - 平台佣金) * (退款金额 / 实付金额) - 分销金额 + // = 退款金额 + (平台补贴 - 平台佣金)* (退款金额 / 实付金额) - 分销金额 + // = 退款金额 + 平台补贴改变量 - 平台佣金改变量 - 分销金额 + + // 平台补贴改变量 + // 平台佣金改变量 + long shopRealRefundAmount; + List shopWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (!Objects.equals(orderChangeShopWalletAmountBO.getSupplierHandleStatus(), -1)) { + // 商家改变金额 = 退款金额 + 平台补贴改变量 - 平台佣金改变量 -分销金额 - 供应商金额改变量 - 运费 + shopRealRefundAmount = orderChangeShopWalletAmountBO.getRefundAmount() + orderChangeShopWalletAmountBO.getPlatformAllowanceAmount() + - orderChangeShopWalletAmountBO.getChangePlatformCommission() - orderChangeShopWalletAmountBO.getDistributionAmount() + - orderChangeShopWalletAmountBO.getChangePurchaseAmount() - orderChangeShopWalletAmountBO.getFreightAmount(); + // 最后一单退款时需要计算一下运费 + if (orderChangeShopWalletAmountBO.getFreightAmount() == 0L && orderChangeShopWalletAmountBO.getPlatformFreeFreightAmount() > 0 && BooleanUtil.isTrue(orderChangeShopWalletAmountBO.isLastOrder())) { + // 在之前的计算中,如果是会员包邮的订单,则此处的运费freightAmount为0,但是会员包邮体现在平台补贴里面 + // 比如一个10元商品(供货价为10元)及8元运费,用户平台会员包邮支付后申请退款10元 + // 不考虑佣金的情况下,则上述计算为 10 + 8 - 0 - 0 - 0 - 10 = 8元,所以还需要减去平台包邮金额 + shopRealRefundAmount -= orderChangeShopWalletAmountBO.getPlatformFreeFreightAmount(); + } + // 供应商发货订单,未发货单项退款运费处理:供应商订单的运费最终是给供应商的,商家不会得到运费的钱,按目前的业务供应商发货订单的运费可以有以下两种理解 + // 情况一:用户支付运费,运费先给到商家,然后商家将运费给供应商。按业务是这个流程,因为用户是跟商家购买的商品,商家再到供应商去请求发货 + // 情况二:平台会员包邮,用户需要支付的运费由平台出了,所以平台需要补贴运费给商家,商家再把平台补贴的运费给供应商 + // 因为供应商发货订单的运费,最终都是给到供应商,商家只是做一个中转,所以在退款的时候,商家不需要去扣除运费的金额 + // 但情况二的平台补贴金额中包含了供应商商品运费,因此在商家的计算要扣除运费的金额,避免商家又扣了一次运费造成亏损 + // 情况三:用户下单了两件商品,平台包邮的运费,因为在这个方法里面都是已经待结算了钱(包含运费)到供应商的, + // 所以在用户申请退款其中一个商品项,此时商家改变金额应该不需要减去运费,因为商家没有收到运费的钱 + if (Objects.nonNull(orderChangeShopWalletAmountBO.getSupplierFreightAmount()) && !Objects.equals(orderChangeShopWalletAmountBO.getShopId(), 0L)) { + shopRealRefundAmount = shopRealRefundAmount - orderChangeShopWalletAmountBO.getSupplierFreightAmount() + orderChangeShopWalletAmountBO.getPlatformFreeFreightAmount(); + } + } else { + + // 商家自行处理,商家需要负担供应商应退金额 + // 商家改变金额 = 退款金额 + 平台补贴改变量(包含运费) - 平台佣金改变量 -分销金额 - 供应商金额改变量 - 运费 - 平台包邮 + // 如果运费为0,但是平台免运费金额大于0,则还需要计算这个运费 + long platformFreeFreightAmount = 0L; + if (orderChangeShopWalletAmountBO.getFreightAmount() == 0L && orderChangeShopWalletAmountBO.getPlatformFreeFreightAmount() > 0) { + platformFreeFreightAmount = orderChangeShopWalletAmountBO.getPlatformFreeFreightAmount(); + } + shopRealRefundAmount = orderChangeShopWalletAmountBO.getRefundAmount() + orderChangeShopWalletAmountBO.getPlatformAllowanceAmount() + - orderChangeShopWalletAmountBO.getChangePlatformCommission() - orderChangeShopWalletAmountBO.getDistributionAmount() + - orderChangeShopWalletAmountBO.getChangePurchaseAmount() - orderChangeShopWalletAmountBO.getFreightAmount(); + // 供应商改变金额 = 供应商改变金额 + 运费 - 平台供应商佣金改变量 + 平台包邮运费 + long supplierRealRefundAmount = orderChangeShopWalletAmountBO.getChangePurchaseAmount() + orderChangeShopWalletAmountBO.getFreightAmount() + - orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission(); + // 只有供应商订单,商家自行处理才需要负责供应商的运费退回 + if (!Objects.equals(orderChangeShopWalletAmountBO.getSupplierId(), 0L)) { + shopRealRefundAmount -= platformFreeFreightAmount; + supplierRealRefundAmount += platformFreeFreightAmount; + } + // 默认支付方式的订单,商家自行处理供应商订单,减少商家结算金额 + if (Objects.equals(orderChangeShopWalletAmountBO.getPaySysType(), PaySysType.DEFAULT.value()) && supplierRealRefundAmount > 0) { + subSettlementAmount(supplierRealRefundAmount, orderChangeShopWalletAmountBO, shopWalletLogList, true); + } + } + sendRefundShopAmountMsg(orderChangeShopWalletAmountBO, shopRealRefundAmount, shopWalletLogList); + } + + private void sendRefundShopAmountMsg(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO, long shopRealRefundAmount, List shopWalletLogList) { + // 添加平台钱包记录 + saveRefundShopWalletLog(orderChangeShopWalletAmountBO, shopRealRefundAmount, shopWalletLogList); + for (MongoShopWalletLogBO mongoShopWalletLogBO : shopWalletLogList) { + mongoShopWalletLogBO.setWalletLogId(orderChangeShopWalletAmountBO.getWalletLogIds().remove(0)); + } + // 通知分销,退回分销佣金 + // 通知供应商,退回供应商未结算金额 + sendSingleMsg(refundShopNotifyServiceTemplate.syncSend(RocketMqConstant.REFUND_SHOP_NOTIFY_SERVICE_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountBO))); + + // 保存之前查一下,防止重复保存 + long count = shopWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), ShopWalletChangeReason.ORDER_REFUND.value()); + // 已经有记录就回滚 + if (count > 0) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + // 直接保存,如果失败就回滚,不能用mq,mongo和mysql之间无法保证原子性 + shopWalletLogService.saveMongoBatch(shopWalletLogList); + + } + + private void saveRefundShopWalletLog(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO, Long shopRealRefundAmount, List shopWalletLogList) { + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + handleShopLogInfo(orderChangeShopWalletAmountBO, shopRealRefundAmount, shopWalletLog); + // 1. 订单未确认收货则扣未结算金额 + // 2. 商家撤销拼团活动时失效拼团时,将待成团的队伍进行退款 + + // 此时会有两种情况,1.商家采购订单后退款 2.普通退款 + // 商家采购订单后退款,此时钱退回结算金额,为0不需要减少 + if (shopRealRefundAmount != 0L) { + if (Objects.equals(orderChangeShopWalletAmountBO.getWaitPurchase(), PurchaseOrderWaitStatus.PURCHASED.value())) { + // 修改结算金额 + boolean isSuccess = subSettledAmount(orderChangeShopWalletAmountBO.getShopId(), shopRealRefundAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!isSuccess) { + throw new LuckException("您的结算金额不足,无法进行退款"); + } + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + } else { + // 减少未结算金额 + boolean isSuccess = subUnsettledAmount(orderChangeShopWalletAmountBO.getShopId(), orderChangeShopWalletAmountBO.getOrderId(), shopRealRefundAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!isSuccess) { + throw new LuckException("您的待结算金额不足,无法进行退款"); + } + shopWalletLog.setAmountType(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + } + } + // 添加平台日志,平台日志需要加上供应商的那份佣金 + shopWalletLog.setPlatformCommission(orderChangeShopWalletAmountBO.getChangePlatformCommission() + orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission()); + // 平台实际上改变金额 + // 订单退款,补贴肯定是减少了,但是对于平台来说是赚钱了 + // 订单退款了,平台的佣金也是减少了,所以对于平台来说是亏钱的 + long platformRealRefundAmount = shopWalletLog.getPlatformAmount() - shopWalletLog.getPlatformCommission(); + shopWalletLog.setPlatformIoType(platformRealRefundAmount >= 0 ? 1 : 0); + shopWalletLog.setPlatformChangeAmount(Math.abs(platformRealRefundAmount)); + + // 采购完成、且商家减免了金额(支付了扣除订单采购价差、或者别的优惠) + // 如果满足上面的条件,那么shopWalletLog是店铺余额的记录,这里还需要添加一条待结算金额的记录 + if (Objects.equals(orderChangeShopWalletAmountBO.getWaitPurchase(), PurchaseOrderWaitStatus.PURCHASED.value())) { + MongoShopWalletLogBO mongoShopWalletLogBO = new MongoShopWalletLogBO(); + BeanUtils.copyProperties(shopWalletLog, mongoShopWalletLogBO); + mongoShopWalletLogBO.setShopChangeAmount(0L); + mongoShopWalletLogBO.setAmountType(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + + shopWalletLogList.add(mongoShopWalletLogBO); + } + // 如果退款导致已结算金额变动,平台应该是没有金额变动的 + if (Objects.equals(shopWalletLog.getAmountType(), ShopWalletAmountType.SETTLED_AMOUNT.value())) { + shopWalletLog.setPlatformChangeAmount(0L); + } + // 添加日志 + shopWalletLogList.add(shopWalletLog); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundShopAmountByRefundAndWaitPur(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + + // 看看这个订单有没有锁定过 + long count = shopWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), ShopWalletChangeReason.ORDER_REFUND.value()); + // 幂等 + if (count > 0) { + return; + } + // 先来记住几个公式: + // 1. 商家应收 = 商品价格 - 商家优惠 - 分销金额 + // 2. 商家应收 = 用户支付 + 平台补贴 - 分销金额 + // 由于 如果优惠是按照比例来划分,那么用户选择退款金额占(订单/订单项)的比例应该是商家收入减少的比例 + // 可得两个公式: + // 商家应收 = (商品价格 - 商家优惠 - 分销金额) *(1 - 退款金额 / 实付金额) + // 商家应收 = (用户支付 + 平台补贴 - 分销金额) *(1 - 退款金额 / 实付金额) + + // 现规定,如果发生退款,则认为分销失效有: + // 如果订单100元,分销10元,10元的分销费用由商家出,此时商家结算时,拿到90元。 + // 当用户进行退款,退1块的时候,分销会无效,此时商家拿回给出去的10元分销费用,并将1元给到退款用户,此时商家因为退款赚9元。 shopRealRefundAmount = -9 + // 当用户进行退款,退11块的时候,分销会无效,此时商家拿回给出去的10元分销费用,并将11元给到退款用户,此时商家因为11块退款仅亏1元。shopRealRefundAmount = 1 + + // 有发生退款时: + // 商家应收 = (商品价格 - 商家优惠) *(1 - 退款金额 / 实付金额) + // 商家应收 = (实付金额 + 平台补贴) *(1 - 退款金额 / 实付金额) + + // 商家应退 = (实付金额 + 平台补贴) *(退款金额 / 实付金额) + + // 平台佣金应退 = 实付金额 *(退款金额 / 实付金额) + + // 商家改变金额 = 原商家应收(下单时商家应收) - 现在商家应收 - 平台佣金应退 + // = (用户支付 + 平台补贴) - 分销金额 - (实付金额 + 平台补贴) - 平台佣金 *(退款金额 / 实付金额) + // = (用户支付 + 平台补贴)*(退款金额 / 实付金额) - 分销金额 + // = (用户支付 + 平台补贴 - 平台佣金) * (退款金额 / 实付金额) - 分销金额 + // = 退款金额 + (平台补贴 - 平台佣金)* (退款金额 / 实付金额) - 分销金额 + // = 退款金额 + 平台补贴改变量 - 平台佣金改变量 - 分销金额 + + // 待采购订单肯定是待发货的,此时运费肯定要退给用户 + // 商家改变金额 = 退款金额 + 平台补贴改变量 - 平台佣金改变量 -分销金额 - 供应商金额改变量 + Long shopRealRefundAmount = orderChangeShopWalletAmountBO.getRefundAmount() + orderChangeShopWalletAmountBO.getPlatformAllowanceAmount() + - orderChangeShopWalletAmountBO.getChangePlatformCommission() - orderChangeShopWalletAmountBO.getDistributionAmount(); + + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + handleShopLogInfo(orderChangeShopWalletAmountBO, shopRealRefundAmount, shopWalletLog); + // 1. 订单未确认收货则扣未结算金额 + // 2. 商家撤销拼团活动时失效拼团时,将待成团的队伍进行退款 + + // 减少未结算金额 + boolean isSuccess = subUnsettledAmount(orderChangeShopWalletAmountBO.getShopId(), orderChangeShopWalletAmountBO.getOrderId(), shopRealRefundAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!isSuccess) { + throw new LuckException("您的待结算金额不足,无法进行退款"); + } + // 添加平台日志 + shopWalletLog.setPlatformCommission(orderChangeShopWalletAmountBO.getChangePlatformCommission()); + // 平台实际上改变金额 + // 订单退款,补贴肯定是减少了,但是对于平台来说是赚钱了 + // 订单退款了,平台的佣金也是减少了,所以对于平台来说是亏钱的 + long platformRealRefundAmount = shopWalletLog.getPlatformAmount() - shopWalletLog.getPlatformCommission(); + + shopWalletLog.setPlatformIoType(platformRealRefundAmount >= 0 ? 1 : 0); + shopWalletLog.setPlatformChangeAmount(Math.abs(platformRealRefundAmount)); + + // 通知分销,退回分销佣金 + orderChangeShopWalletAmountBO.setSupplierHandleStatus(null); + sendSingleMsg(refundShopNotifyServiceTemplate.syncSend(RocketMqConstant.REFUND_SHOP_NOTIFY_SERVICE_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountBO))); + // 保存之前查一下,防止重复保存 + long logCount = shopWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), ShopWalletChangeReason.ORDER_REFUND.value()); + // 如果已经有记录就证明已经退过一次钱了,则抛出异常回滚 + if (count > 0) { + return; + } + // 用mq保存钱包日志 + shopWalletLogService.saveMongoBatch(Collections.singletonList(shopWalletLog)); + } + + private void handleShopLogInfo(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO, Long shopRealRefundAmount, MongoShopWalletLogBO shopWalletLog) { + shopWalletLog.setRefundId(orderChangeShopWalletAmountBO.getRefundId()); + shopWalletLog.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + shopWalletLog.setPaySysType(Objects.isNull(orderChangeShopWalletAmountBO.getPaySysType()) ? 0 : orderChangeShopWalletAmountBO.getPaySysType()); + shopWalletLog.setReason(ShopWalletChangeReason.ORDER_REFUND.value()); + shopWalletLog.setShopId(orderChangeShopWalletAmountBO.getShopId()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + + // 用户申请的退款金额 + shopWalletLog.setUserAmount(orderChangeShopWalletAmountBO.getRefundAmount()); + // 回退的分销金额 + shopWalletLog.setDistributionAmount(orderChangeShopWalletAmountBO.getDistributionAmount()); + // 回退的平台补贴 + shopWalletLog.setPlatformAmount(orderChangeShopWalletAmountBO.getPlatformAllowanceAmount()); + shopWalletLog.setShopReduceAmount(orderChangeShopWalletAmountBO.getShopAllowanceAmount()); + // 回退的平台佣金 + shopWalletLog.setShopPlatformCommission(orderChangeShopWalletAmountBO.getChangePlatformCommission()); + // 商家改变金额 + if (shopRealRefundAmount >= 0) { + // 扣除 + shopWalletLog.setShopIoType(0); + shopWalletLog.setShopChangeAmount(shopRealRefundAmount); + } else { + // 如果算出的商品改变金额为负数,负支出等于收入,就是说要把退款记录的收支类型改为收入 + shopWalletLog.setShopIoType(1); + shopWalletLog.setShopChangeAmount(Math.abs(shopRealRefundAmount)); + } + shopWalletLog.setAmountType(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + } + + @Override + public void subSettlementAmount(Long supplierRealRefundAmount, OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO, List shopWalletLogList, Boolean isNowSave) { + + // 代销订单,商家减少结算金额并添加日志 + // 代销订单,商家减少结算金额并添加日志 + boolean isSuccess = subSettledAmount(orderChangeShopWalletAmountBO.getShopId(), Math.abs(supplierRealRefundAmount), orderChangeShopWalletAmountBO.getPaySysType()); + if (!isSuccess) { + throw new LuckException("您的结算金额不足,无法进行退款"); + } + + // 添加日志 + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + shopWalletLog.setRefundId(orderChangeShopWalletAmountBO.getRefundId()); + shopWalletLog.setPaySysType(Objects.isNull(orderChangeShopWalletAmountBO.getPaySysType()) ? 0 : orderChangeShopWalletAmountBO.getPaySysType()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + shopWalletLog.setReason(ShopWalletChangeReason.REFUND_SPREAD_AMOUNT.value()); + shopWalletLog.setShopId(orderChangeShopWalletAmountBO.getShopId()); + shopWalletLog.setShopIoType(0); + shopWalletLog.setShopChangeAmount(supplierRealRefundAmount); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLog.setUserAmount(orderChangeShopWalletAmountBO.getRefundAmount()); + shopWalletLog.setDistributionAmount(0L); + shopWalletLog.setShopReduceAmount(0L); + shopWalletLog.setPlatformAmount(0L); + shopWalletLog.setShopPlatformCommission(0L); + // 判断是直接保存还是一起保存 + if (isNowSave) { + // 添加日志 + shopWalletLogList.add(shopWalletLog); + } else { + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setWalletLogId(walletLogId); + // 用mq批量保存钱包日志 + List shopWalletLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + shopWalletLogs.add(shopWalletLog); + sendSingleMsg(addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(shopWalletLogs))); + } + } + + @Override + public void settlementByRefundAndWaitPurAndAllinpay(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + Long orderId = orderChangeShopWalletAmountBO.getOrderId(); + // 找出当时支付的payId,如果是预售可能会有两笔支付 + ServerResponseEntity orderSettlementResp = orderSettlementFeignClient.getPayIdByOrderId(orderId); + if (!orderSettlementResp.isSuccess()) { + return; + } + List payIds = getPayIds(orderSettlementResp); + Long settlementAmount = orderChangeShopWalletAmountBO.getActualTotal() - orderChangeShopWalletAmountBO.getRefundAmount(); + // 平台补贴改变量 + Long changePlatformAmount = orderChangeShopWalletAmountBO.getPlatformAllowanceAmount(); + // 平台佣金改变量 + long changePlatformCommission = orderChangeShopWalletAmountBO.getPlatformCommission() - orderChangeShopWalletAmountBO.getChangePlatformCommission(); + // 商家改变金额 + Long shopSettlementAmount = settlementAmount + changePlatformAmount - changePlatformCommission; + // 平台收入金额,可能为负数 + Long platformChangeAmount = changePlatformCommission - changePlatformAmount; + // 分账给商家 + SplitRuleVO shopSplitRuleVO = new SplitRuleVO(); + // 商家收入金额 + shopSplitRuleVO.setAmount(shopSettlementAmount); + // 平台佣金 + shopSplitRuleVO.setFee(platformChangeAmount); + shopSplitRuleVO.setBizUserId(orderChangeShopWalletAmountBO.getShopId().toString()); + shopSplitRuleVO.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + + AllinpaySettlementApiDto allinpaySettlementApiDto = new AllinpaySettlementApiDto(); + allinpaySettlementApiDto.setOrderId(orderChangeShopWalletAmountBO.getOrderId().toString()); + allinpaySettlementApiDto.setPayIds(payIds); + allinpaySettlementApiDto.setShopSplitRuleDto(shopSplitRuleVO); + allinpaySettlementApiDto.setSupplierSplitRuleDto(null); + allinpaySettlementApiDto.setDistributionUserSplitRuleList(null); + // 这里还是用mq会比较好,因为如果系统突然挂了,这一段还能重试,继续执行? + // 不过这里本身就是在mq当中,用一个统一的批量执行id,如果遇到重复的就不会执行成功所以直接用feign也没有问题 + ServerResponseEntity serverResponseEntity = paymentFeignClient.doAllinPaySettlement(allinpaySettlementApiDto); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void settlementShopAmountByRefund(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + // 看看这个订单有没有锁定过 + long count = shopWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), ShopWalletChangeReason.SETTLED.value()); + Long distributionAmount = Objects.isNull(orderChangeShopWalletAmountBO.getDistributionAmount()) ? 0L : orderChangeShopWalletAmountBO.getDistributionAmount(); + // 幂等 + if (count > 0) { + return; + } + // 当前需要结算金额 = 用户实付金额 - 退款金额 + // 平台补贴改变量 = 平台补贴 * 当前需要结算金额 / 商品实际金额 + // 平台佣金改变量 = 平台佣金 * 当前需要结算金额 / 商品实际金额 + // 商家结算金额 = 当前需要结算金额 + 平台补贴改变量 - 平台佣金改变量 + // 平台结算金额 = 平台佣金改变量 - 平台补贴改变量 + Long settlementAmount = orderChangeShopWalletAmountBO.getActualTotal() - orderChangeShopWalletAmountBO.getRefundAmount(); + // 平台补贴改变量 (退款成功的时候已经处理了平台补贴金额,这里不需要再去计算, 但部分退款成功时,还有平台补贴金额需要结算) + Long changePlatformAmount = orderChangeShopWalletAmountBO.getPlatformAllowanceAmount(); + // 平台佣金改变量 + Long changePlatformCommission = orderChangeShopWalletAmountBO.getPlatformCommission() - orderChangeShopWalletAmountBO.getChangePlatformCommission(); + // 商家改变金额 + Long shopSettlementAmount = settlementAmount + changePlatformAmount - changePlatformCommission; + if (!Objects.equals(orderChangeShopWalletAmountBO.getSupplierId(), 0L)) { + // 如果有供应商,则商家还需减去供应商收入,供应商收入 = 供应商金额 - 已退金额 + Long supplierAmount = orderChangeShopWalletAmountBO.getRefundPurchaseAmount(); + shopSettlementAmount = shopSettlementAmount - supplierAmount; + } + MongoShopWalletLogBO shopWalletLog = getShopWalletLogBO(orderChangeShopWalletAmountBO, distributionAmount, settlementAmount, changePlatformAmount); + + // 有可能到负数,如果为负数就不能结算店铺了 + if (shopSettlementAmount > 0L) { + shopWalletLog.setShopId(orderChangeShopWalletAmountBO.getShopId()); + // 回退的平台佣金 + shopWalletLog.setShopPlatformCommission(changePlatformCommission); + // 商家改变金额 + shopWalletLog.setShopChangeAmount(shopSettlementAmount); + // 增加 + shopWalletLog.setShopIoType(1); + + // 1. 订单部分退款导致订单关闭 商家结算操作 + // 商家结算操作同订单结算一样,分成两步 + // 1.减少待结算金额,订单在哪个分片加的待结算金额就从哪里减掉 + boolean subUnsettledAmountSuccess = subUnsettledAmount(shopWalletLog.getShopId(), orderChangeShopWalletAmountBO.getOrderId(), shopSettlementAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!subUnsettledAmountSuccess) { + throw new LuckException("您的待结算金额不足,无法进行退款"); + } + + // 2.增加结算金额以及总结算金额,这里可以随机加在某个分片中 + boolean addSettledAmountSuccess = addSettledAmount(shopWalletLog.getShopId(), shopSettlementAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!addSettledAmountSuccess) { + throw new LuckException("店铺结算失败,无法进行退款"); + } + } + // 添加平台日志 + // 回退的平台佣金,还需加上供应商佣金改变量 + shopWalletLog.setPlatformCommission(changePlatformCommission + orderChangeShopWalletAmountBO.getRefundPurchasePlatformCommission()); + // 平台结算金额实际上改变金额 = 平台佣金改变量 - 平台补贴改变量 + long platformChangeAmount = shopWalletLog.getPlatformCommission() - shopWalletLog.getPlatformAmount(); + shopWalletLog.setPlatformChangeAmount(Math.abs(platformChangeAmount)); + shopWalletLog.setPlatformIoType(platformChangeAmount >= 0 ? 1 : 0); + // 用mq保存钱包日志 + sendSingleMsg(addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(Collections.singleton(shopWalletLog)))); + + // 供应商 添加结算金额 + sendSingleMsg(refundSuccessNotifySupplierTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_SUPPLIER_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountBO))); + } + + private MongoShopWalletLogBO getShopWalletLogBO(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO, Long distributionAmount, Long settlementAmount, Long changePlatformAmount) { + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setWalletLogId(walletLogId); + shopWalletLog.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + shopWalletLog.setPaySysType(Objects.isNull(orderChangeShopWalletAmountBO.getPaySysType()) ? 0 : orderChangeShopWalletAmountBO.getPaySysType()); + shopWalletLog.setReason(ShopWalletChangeReason.SETTLED.value()); + shopWalletLog.setShopId(Constant.PLATFORM_SHOP_ID); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + + // 结算的金额 + shopWalletLog.setUserAmount(settlementAmount); + // 回退的分销金额 + shopWalletLog.setDistributionAmount(distributionAmount); + // 回退的平台补贴 + shopWalletLog.setPlatformAmount(changePlatformAmount); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + return shopWalletLog; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void settlementShopAmountByPreSaleFail(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + + // 看看这个订单有没有锁定过 + long count = shopWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getOrderId(), ShopWalletChangeReason.PRE_SALE_FAIL.value()); + // 幂等 + if (count > 0) { + return; + } + Long distributionAmount = Objects.isNull(orderChangeShopWalletAmountBO.getDistributionAmount()) ? 0L : orderChangeShopWalletAmountBO.getDistributionAmount(); + // 当前需要结算金额 = 用户实付金额 - 退款金额 + // 平台补贴改变量 = 平台补贴 * 当前需要结算金额 / 商品实际金额 + // 平台佣金改变量 = 平台佣金 * 当前需要结算金额 / 商品实际金额 + // 商家结算金额 = 当前需要结算金额 + 平台补贴改变量 - 平台佣金改变量 + // 平台结算金额 = 平台佣金改变量 - 平台补贴改变量 + // 商家改变金额 + Long settlementAmount = orderChangeShopWalletAmountBO.getActualTotal(); + Long changeAmount = orderChangeShopWalletAmountBO.getActualTotal() - orderChangeShopWalletAmountBO.getPlatformCommission(); + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + shopWalletLog.setWalletLogId(walletLogId); + shopWalletLog.setReason(ShopWalletChangeReason.PRE_SALE_FAIL.value()); + shopWalletLog.setShopId(orderChangeShopWalletAmountBO.getShopId()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + shopWalletLog.setPaySysType(Objects.isNull(orderChangeShopWalletAmountBO.getPaySysType()) ? 0 : orderChangeShopWalletAmountBO.getPaySysType()); + + + // 结算的金额 + shopWalletLog.setUserAmount(settlementAmount); + // 回退的分销金额 + shopWalletLog.setDistributionAmount(0L); + // 回退的平台补贴 + shopWalletLog.setPlatformAmount(0L); + // 回退的平台佣金 + shopWalletLog.setShopPlatformCommission(orderChangeShopWalletAmountBO.getPlatformCommission()); + // 商家改变金额 + shopWalletLog.setShopChangeAmount(changeAmount); + // 增加 + shopWalletLog.setShopIoType(1); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + // 添加店铺日志(尾款超时支付取消的订单 定金结算给商家) + shopWalletLog.setShopId(orderChangeShopWalletAmountBO.getShopId()); + // 平台佣金 + shopWalletLog.setPlatformCommission(orderChangeShopWalletAmountBO.getPlatformCommission()); + // 平台结算金额实际上改变金额 = 平台佣金改变量 + long platformChangeAmount = shopWalletLog.getPlatformCommission(); + shopWalletLog.setPlatformIoType(platformChangeAmount >= 0 ? 1 : 0); + shopWalletLog.setPlatformChangeAmount(Math.abs(platformChangeAmount)); + + // 1. 订单超时未支付尾款 商家结算操作 + boolean isSuccess = addSettledAmount(orderChangeShopWalletAmountBO.getShopId(), changeAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!isSuccess) { + throw new LuckException("结算失败,无法进行退款"); + } + + // 用mq批量保存钱包日志 + sendSingleMsg(addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(Collections.singleton(shopWalletLog)))); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void settlementShopAmountByRefundAndWaitPur(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + + // 看看这个订单有没有锁定过 + long count = shopWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), ShopWalletChangeReason.SETTLED.value()); + // 幂等 + if (count > 0) { + return; + } + Long distributionAmount = Objects.isNull(orderChangeShopWalletAmountBO.getDistributionAmount()) ? 0L : orderChangeShopWalletAmountBO.getDistributionAmount(); + // 当前需要结算金额 = 用户实付金额 - 退款金额 + // 平台补贴改变量 = 平台补贴 * 当前需要结算金额 / 商品实际金额 + // 平台佣金改变量 = 平台佣金 * 当前需要结算金额 / 商品实际金额 + // 商家结算金额 = 当前需要结算金额 + 平台补贴改变量 - 平台佣金改变量 + // 平台结算金额 = 平台佣金改变量 - 平台补贴改变量 + Long settlementAmount = orderChangeShopWalletAmountBO.getActualTotal() - orderChangeShopWalletAmountBO.getRefundAmount(); + // 平台补贴改变量 + Long changePlatformAmount = orderChangeShopWalletAmountBO.getPlatformAllowanceAmount(); + // 商家改变金额 + long shopSettlementAmount = settlementAmount + changePlatformAmount; + // 平台佣金改变量,因为是待采购的订单,所以用订单的相关参数这里肯定是为0,应该直接用商家结算的金额来进行计算 + Long changePlatformCommission = orderChangeShopWalletAmountBO.getPlatformCommission() - orderChangeShopWalletAmountBO.getChangePlatformCommission(); + + // 供应商发货订单,待采购的单项退款,如果有会员包邮,平台补贴金额中就会包含运费补贴的金额--supplierFreightAmount赋值位置:com.tmerclub.cloud.order.service.impl.OrderRefundServiceImpl.handlePartialRefund + // 但待采购的订单是还未处理待结算金额的,也就是说平台补贴的运费,实际上是未从平台待结算金额扣除的 + // 所以运费补贴的金额在退款时要从平台补贴金额中扣除,避免平台未发放运费补贴金额,退款时又给平台添加了运费补贴的金额 + // 但不能在平台补贴改变量中扣除,否则结算记录中平台补贴改变量就会少了运费补贴的金额,因此要在改变金额中扣除 + + // 有可能到负数,如果为负数就不能结算了 + if (shopSettlementAmount < 0L) { + return; + } + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setWalletLogId(walletLogId); + shopWalletLog.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + shopWalletLog.setReason(ShopWalletChangeReason.SETTLED.value()); + shopWalletLog.setShopId(orderChangeShopWalletAmountBO.getShopId()); + shopWalletLog.setPaySysType(Objects.isNull(orderChangeShopWalletAmountBO.getPaySysType()) ? 0 : orderChangeShopWalletAmountBO.getPaySysType()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + + // 结算的金额 + shopWalletLog.setUserAmount(settlementAmount); + // 回退的分销金额 + shopWalletLog.setDistributionAmount(distributionAmount); + // 回退的平台补贴 + shopWalletLog.setPlatformAmount(changePlatformAmount); + // 回退的平台佣金 + shopWalletLog.setShopPlatformCommission(changePlatformCommission); + // 商家改变金额 + shopWalletLog.setShopChangeAmount(shopSettlementAmount); + // 增加 + shopWalletLog.setShopIoType(1); + + // 1. 订单部分退款导致订单关闭 商家结算操作,此时不需要减少待结算金额 + if (shopSettlementAmount != 0L) { + boolean isSuccess = addSettledAmount(orderChangeShopWalletAmountBO.getShopId(), shopSettlementAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!isSuccess) { + throw new LuckException("结算失败,无法进行退款"); + } + } + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + // 添加平台日志 + // 回退的平台佣金,还需加上供应商佣金改变量 + shopWalletLog.setPlatformCommission(changePlatformCommission); + // 平台结算金额实际上改变金额 = 平台佣金改变量 - 平台补贴改变量 + long platformChangeAmount = shopWalletLog.getPlatformCommission() - shopWalletLog.getPlatformAmount(); + shopWalletLog.setPlatformIoType(platformChangeAmount >= 0 ? 1 : 0); + shopWalletLog.setPlatformChangeAmount(Math.abs(platformChangeAmount)); + + sendSingleMsg(addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(Collections.singleton(shopWalletLog)))); + } + + private void sendSingleMsg(SendResult addShopWalletLogTemplate) { + // 用mq保存钱包日志 + SendStatus sendWalletLogStatus = addShopWalletLogTemplate.getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateByDistributionAmount(List message) { + if (CollUtil.isEmpty(message)) { + return; + } + List shopWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopWalletBO shopWalletBO : message) { + Long shopId = shopWalletBO.getShopId(); + Long orderId = shopWalletBO.getOrderId(); + // 商家待结算改变金额,从分销过来的待结算金额是个负数,用来减少待结算金额 + Long unsettledAmount = shopWalletBO.getUnsettledAmount(); + // 幂等处理 + long count = shopWalletLogService.countInAmountByOrderId(orderId, ShopWalletChangeReason.DISTRIBUTION_AMOUNT.value()); + if (count > 0) { + continue; + } + // 修改支付成功结算的店铺钱包日志 + ShopWalletLogSearchDTO shopWalletLogQuery = new ShopWalletLogSearchDTO(); + shopWalletLogQuery.setOrderId(orderId); + shopWalletLogQuery.setReason(ShopWalletChangeReason.PAY.value()); + shopWalletLogQuery.setShopId(shopId); + shopWalletLogQuery.setShopIoType(1); + shopWalletLogQuery.setAmountType(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + // 必须保存店铺分账完成,有该条分账记录后,才可以分销 + List shopWalletLogBOList = shopWalletLogService.listByParam(shopWalletLogQuery); + if (CollUtil.isEmpty(shopWalletLogBOList) || Objects.isNull(shopWalletLogBOList.get(0))) { + throw new LuckException("未找到支付成功结算的店铺钱包日志"); + } + MongoShopWalletLogBO shopWalletLogUpdate = shopWalletLogBOList.get(0); + shopWalletLogUpdate.setDistributionAmount(Math.abs(unsettledAmount)); + // 修改钱包日志分销金额 + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(shopWalletLogUpdate.getWalletLogId())); + Update update = new Update(); + update.set("updateTime", new Date()); + update.set("distributionAmount", shopWalletLogUpdate.getDistributionAmount()); + mongoTemplate.updateFirst(query, update, MongoShopWalletLogBO.class); + + // 更新钱包未结算金额 + shopWalletMapper.addUnsettledAmount(shopId, unsettledAmount, shopWalletLogUpdate.getPaySysType()); + + // 分销减少店铺钱包日志,只是为了添加一条日志,保证幂等 + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setWalletLogId(walletLogId); + shopWalletLog.setShopId(shopId); + shopWalletLog.setOrderId(orderId); + shopWalletLog.setPaySysType(Objects.isNull(shopWalletLogUpdate.getPaySysType()) ? 0 : shopWalletLogUpdate.getPaySysType()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + shopWalletLog.setShopIoType(unsettledAmount >= 0 ? 1 : 0); + shopWalletLog.setAmountType(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + shopWalletLog.setReason(ShopWalletChangeReason.DISTRIBUTION_AMOUNT.value()); + shopWalletLog.setDistributionAmount(Math.abs(unsettledAmount)); + shopWalletLog.setShopChangeAmount(Math.abs(unsettledAmount)); + shopWalletLog.setUserAmount(shopWalletLogUpdate.getUserAmount()); + shopWalletLogList.add(shopWalletLog); + } + // 用mq批量保存钱包日志 + sendSingleMsg(addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(shopWalletLogList))); + } + + @Override + public List listByShopIds(List shopIds, Integer paySysType) { + return shopWalletMapper.listByShopIds(shopIds, paySysType); + } + + @Override + public Long getSettlementAmountByShopId(Long shopId, Integer paySysType) { + return shopWalletMapper.getSettlementAmountByShopId(shopId, paySysType); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void rechargeSuccess(RechargeNotifyBO message) { + Long shopWalletLogId = message.getBalanceLogId(); + MongoShopWalletLogBO shopWalletLogDb = mongoTemplate.findById(shopWalletLogId, MongoShopWalletLogBO.class); + if (Objects.isNull(shopWalletLogDb)) { + throw new LuckException("未找到支付成功的钱包日志"); + } + if (Objects.equals(shopWalletLogDb.getReason(), ShopWalletChangeReason.SUCCESS_RECHARGE.value())) { + return; + } + + // 更新店铺余额,充值的余额加至主分片 + Long shopId = shopWalletLogDb.getShopId(); + shopWalletMapper.addSettledAmount(shopId, shopWalletLogDb.getShopChangeAmount(), shopWalletLogDb.getPaySysType(), true); + + // 更新支付状态 + sendSingleMsg(updateShopRechargeSuccessTemplate.syncSend(RocketMqConstant.UPDATE_SHOP_RECHARGE_SUCCESS_TOPIC, new GenericMessage<>(message))); + } + + @Override + public ShopWalletVO getByShopId(Long shopId) { + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + return shopWalletMapper.getByShopId(shopId, paySysType); + } + + @Override + public ShopWalletVO getAllShop(ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + ShopWalletVO shopWallet; + if (Objects.nonNull(shopWalletLogSearchDTO.getStartTime()) && Objects.nonNull(shopWalletLogSearchDTO.getEndTime())) { + shopWallet = shopWalletLogService.getShopWalletByTime(shopWalletLogSearchDTO); + } else { + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + shopWallet = shopWalletMapper.getAllShop(shopWalletLogSearchDTO, paySysType); + } + return shopWallet; + } + + @Override + public PageVO pageShopWalletByTime(PageDTO pageDTO, ShopWalletLogSearchDTO shopWalletLogSearchDTO) { + PageVO shopWalletPage; + if (Objects.nonNull(shopWalletLogSearchDTO.getStartTime()) && Objects.nonNull(shopWalletLogSearchDTO.getEndTime())) { + shopWalletPage = shopWalletLogService.pageShopWalletByTime(pageDTO, shopWalletLogSearchDTO); + } else { + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + shopWalletPage = PageUtil.doPage(pageDTO, () -> shopWalletMapper.listAllShopWallet(shopWalletLogSearchDTO, paySysType)); + } + return shopWalletPage; + } + + /** + * 退款减少待结算金额 + */ + private boolean subUnsettledAmount(Long shopId, Long orderId, Long changeAmount, Integer paySysType) { + if (Objects.isNull(paySysType)) { + paySysType = 0; + } + if (Objects.equals(changeAmount, 0L)) { + // 变化金额为0,不需要更改数据库 + return true; + } + // 未分片就直接按原来的方式扣减待结算金额 + return shopWalletMapper.subUnsettledAmount(shopId, changeAmount, paySysType) > 0; + } + + /** + * 代销订单,商家减少结算金额 + */ + @Override + public boolean subSettledAmount(Long shopId, Long changeAmount, Integer paySysType) { + if (Objects.equals(changeAmount, 0L)) { + return true; + } + if (Objects.isNull(paySysType)) { + paySysType = 0; + } + return shopWalletMapper.subSettledAmount(shopId, changeAmount, paySysType) > 0; + } + + /** + * 增加结算金额 + */ + private boolean addSettledAmount(Long shopId, Long changeAmount, Integer paySysType) { + if (Objects.equals(changeAmount, 0L)) { + return true; + } + if (Objects.isNull(paySysType)) { + paySysType = 0; + } + return shopWalletMapper.addSettledAmount(shopId, changeAmount, paySysType, true) > 0; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWithdrawCashServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWithdrawCashServiceImpl.java new file mode 100644 index 0000000..7081a5c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/ShopWithdrawCashServiceImpl.java @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysConfigApiVO; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.multishop.constant.*; +import com.tmerclub.cloud.multishop.dto.AllinpayShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashConfigDto; +import com.tmerclub.cloud.multishop.dto.ShopWithdrawCashDTO; +import com.tmerclub.cloud.multishop.mapper.ShopWalletMapper; +import com.tmerclub.cloud.multishop.mapper.ShopWithdrawCashMapper; +import com.tmerclub.cloud.multishop.model.ShopWithdrawCash; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.*; +import com.tmerclub.cloud.multishop.vo.ShopWalletVO; +import com.tmerclub.cloud.multishop.vo.ShopWithdrawCashVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +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.Objects; + +/** + * 商家提现申请信息 + * + * @author FrozenWatermelon + */ +@Service +public class ShopWithdrawCashServiceImpl implements ShopWithdrawCashService { + private static final Logger logger = LoggerFactory.getLogger(ShopWithdrawCashServiceImpl.class); + + @Autowired + private ShopWithdrawCashMapper shopWithdrawCashMapper; + @Autowired + private ShopDetailService shopDetailService; + @DubboReference + private NotifyFeignClient sendNotifyFeignClient; + @DubboReference + private AccountFeignClient accountFeignClient; + @Autowired + private ShopWalletService shopWalletService; + @Autowired + private ShopBankCardService shopBankCardService; + @Autowired + private ShopWalletMapper shopWalletMapper; + @Autowired + private RocketMQTemplate addShopWalletLogTemplate; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private ShopAllinpayService shopAllinpayService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @Override + @Transactional(rollbackFor = Exception.class) + public void apply(ShopWithdrawCashDTO shopWithdrawCashDTO, Long shopId) { + Integer paySysType = shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + Date now = new Date(); + this.checkWithdrawInfo(shopWithdrawCashDTO, shopId); + ShopWithdrawCash shopWithdrawCash = BeanUtil.map(shopWithdrawCashDTO, ShopWithdrawCash.class); + shopWithdrawCash.setUpdateTime(now); + shopWithdrawCash.setCreateTime(now); + shopWithdrawCash.setStatus(ShopWithdrawCashStatus.WAITAUDIT.value()); + shopWithdrawCash.setShopId(shopId); + shopWithdrawCash.setPaySysType(paySysType); + this.checkConfig(shopWithdrawCash); + ShopWalletVO shopWallet = shopWalletService.getByShopId(shopId); + if (shopWithdrawCash.getAmount() > shopWallet.getSettledAmount()) { + // 可提现金额不足 + throw new LuckException("可提现金额不足"); + } + // 插入提现申请记录 + shopWithdrawCashMapper.save(shopWithdrawCash); + + // 更新钱包,添加提现日志 + changeWalletAndAddLog(shopId, paySysType, now, shopWithdrawCash); + } + + private void changeWalletAndAddLog(Long shopId, Integer paySysType, Date now, ShopWithdrawCash shopWithdrawCash) { + // 更新钱包的结算金额和冻结金额 + updateShopWalletByApply(shopWithdrawCash); + + List shopWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 保存提现记录 + this.saveShopWalletLog(shopWithdrawCash.getAmount(), shopId, now, ShopWalletChangeReason.APPLY_CASH, shopWalletLogList, paySysType); + + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(shopWalletLogList)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String allinpayApply(AllinpayShopWithdrawCashDTO allinpayShopWithdrawCashDTO, Long shopId) { + Long amount = allinpayShopWithdrawCashDTO.getAmount(); + // 校验提现条件 + this.checkAllinpay(shopId, amount); + ShopWithdrawCash shopWithdrawCash = new ShopWithdrawCash(); + shopWithdrawCash.setAmount(amount); + shopWithdrawCash.setShopId(shopId); + shopWithdrawCash.setPayingCardNo(allinpayShopWithdrawCashDTO.getBankCardNo()); + shopWithdrawCash.setPaySysType(PaySysType.ALLINPAY.value()); + this.checkConfig(shopWithdrawCash); + // 提现订单支付成功的条件为:status = OK且payStatus = success。 + String bizUserId = AllinpayConstant.SHOP + shopId; + ServerResponseEntity withdrawApplyResponse = allinpayFeignClient.withdrawApply(bizUserId, amount, allinpayShopWithdrawCashDTO.getBankCardNo(), SysTypeEnum.MULTISHOP.value()); + if (!withdrawApplyResponse.isSuccess()) { + throw new LuckException(withdrawApplyResponse.getMsg()); + } + // 保存至数据库,确认支付后更新状态 + String bizOrderNo = withdrawApplyResponse.getData().getBizOrderNo(); + shopWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.APPLY_SUCCESS.value()); + shopWithdrawCash.setBizOrderNo(bizOrderNo); + shopWithdrawCashMapper.save(shopWithdrawCash); + // 更新钱包,添加提现日志 + changeWalletAndAddLog(shopId, PaySysType.ALLINPAY.value(), new Date(), shopWithdrawCash); + return bizOrderNo; + } + + @Override + public void confirmWithdrawPay(AllinpayShopWithdrawCashDTO shopWithdrawCashDTO, Long shopId) { + ShopWithdrawCash shopWithdrawCash = shopWithdrawCashMapper.getByBizOrderNo(shopWithdrawCashDTO.getBizOrderNo()); + if (Objects.isNull(shopWithdrawCash)) { + throw new LuckException("提现记录不存在"); + } + if (!Objects.equals(shopId, shopWithdrawCash.getShopId())) { + throw new LuckException("当前提现订单号不属于该店铺"); + } + if (!Objects.equals(shopWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.APPLY_SUCCESS.value()) + && !Objects.equals(shopWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.WAIT_PAY.value())) { + throw new LuckException("申请状态异常,请刷新重试"); + } + String bizUserId = AllinpayConstant.SHOP + shopId; + ServerResponseEntity payResponse = allinpayFeignClient.payByBackSms(bizUserId, shopWithdrawCash.getBizOrderNo(), shopWithdrawCashDTO.getVerificationCode()); + if (!payResponse.isSuccess()) { + throw new LuckException(payResponse.getMsg()); + } + PayByBackSmsResp payByBackSmsResp = payResponse.getData(); + String payFailMessage = payByBackSmsResp.getPayFailMessage(); + String payStatus = payByBackSmsResp.getPayStatus(); + if (Objects.equals(payStatus, AllinpayPayStatus.UNPAY.value())) { + // 收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + shopWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.WAIT_PAY.value()); + shopWithdrawCash.setPayFailMessage(payFailMessage); + logger.error("提现订单{}提现失败,原因为:{}", payByBackSmsResp.getBizOrderNo(), payFailMessage); + shopWithdrawCashMapper.update(shopWithdrawCash); + } + } + + private void allinpayFail(Long shopId, ShopWithdrawCash shopWithdrawCash, Long amount, String bizOrderNo, String payFailMessage, List list) { + shopWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.CASH_FAIL.value()); + shopWithdrawCash.setPayFailMessage(payFailMessage); + logger.error("商家提现订单{}提现失败,原因为:{}", bizOrderNo, payFailMessage); + boolean subFreezeAmount = shopWalletMapper.subFreezeAmount(shopId, amount, shopWithdrawCash.getPaySysType()) > 0; + if (!subFreezeAmount) { + throw new LuckException("商家确认支付失败,冻结金额异常"); + } + // 增加结算金额到主分片(不增加总结算金额) + boolean addSettledAmount = shopWalletMapper.addSettledAmount(shopId, amount, shopWithdrawCash.getPaySysType(), false) > 0; + if (!addSettledAmount) { + throw new LuckException("商家确认支付失败,结算金额异常"); + } + // 保存日志 + this.saveShopWalletLog(amount, shopId, new Date(), ShopWalletChangeReason.REFUSE_CASH, list, shopWithdrawCash.getPaySysType()); + } + + private void allinpaySuccess(Long shopId, ShopWithdrawCash shopWithdrawCash, Long amount, List list) { + shopWithdrawCash.setAllinpayStatus(AllinpayWithdrawCashStatusType.CASH_SUCCESS.value()); + // 更新店铺结算金额 + boolean subFreezeAmountSuccess = shopWalletMapper.subFreezeAmount(shopId, amount, shopWithdrawCash.getPaySysType()) > 0; + if (!subFreezeAmountSuccess) { + throw new LuckException("冻结金额不足,提现失败"); + } + // 保存日志 + this.saveShopWalletLog(amount, shopId, new Date(), ShopWalletChangeReason.PASS_CASH, list, shopWithdrawCash.getPaySysType()); + } + + @Override + public void resendPaySms(String bizOrderNo, Long shopId) { + ShopWithdrawCash shopWithdrawCash = shopWithdrawCashMapper.getByBizOrderNo(bizOrderNo); + if (Objects.isNull(shopWithdrawCash)) { + throw new LuckException("提现记录不存在"); + } + if (!Objects.equals(shopId, shopWithdrawCash.getShopId())) { + throw new LuckException("当前提现订单号不属于该店铺"); + } + if (!Objects.equals(shopWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.WAIT_PAY.value())) { + throw new LuckException("提现申请不在未支付状态,请刷新重试"); + } + ServerResponseEntity response = allinpayFeignClient.resendPaySms(bizOrderNo); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + + @Override + public void withdrawBack(String bizOrderNo, String payStatus, String bizUserId, String payFailMessage) { + ShopWithdrawCash shopWithdrawCash = shopWithdrawCashMapper.getByBizOrderNo(bizOrderNo); + if (Objects.isNull(shopWithdrawCash)) { + throw new LuckException("提现记录不存在"); + } + if (Objects.equals(shopWithdrawCash.getAllinpayStatus(), AllinpayWithdrawCashStatusType.CASH_SUCCESS.value())) { + return; + } + Long shopId = shopWithdrawCash.getShopId(); + Long amount = shopWithdrawCash.getAmount(); + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(payStatus, AllinpayPayStatus.OK.value())) { + allinpaySuccess(shopId, shopWithdrawCash, amount, list); + } else if (Objects.equals(payStatus, AllinpayPayStatus.ERROR.value())) { + allinpayFail(shopId, shopWithdrawCash, amount, bizOrderNo, payFailMessage, list); + } + shopWithdrawCashMapper.update(shopWithdrawCash); + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(list)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private void checkAllinpay(Long shopId, Long amount) { + if (!shopAllinpayService.getIsAllinpay()) { + throw new LuckException("当前不支持通联提现"); + } + if (amount < 1) { + throw new LuckException("提现金额不能少于1.00元"); + } + ShopDetailVO shopDetail = shopDetailService.getByShopId(shopId); + if (Objects.equals(shopDetail.getIsBindPhone(), 0) || + !Objects.equals(shopDetail.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value()) || + !Objects.equals(shopDetail.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + throw new LuckException("店铺信息未通过审核,无法提现"); + } + } + + /** + * 更新钱包金额 + */ + private void updateShopWalletByApply(ShopWithdrawCash shopWithdrawCash) { + Long shopId = shopWithdrawCash.getShopId(); + Long changeAmount = shopWithdrawCash.getAmount(); + if (Objects.equals(changeAmount, 0L)) { + return; + } + // 1.增加冻结金额 + boolean addFreezeAmountSuccess = shopWalletMapper.addFreezeAmount(shopId, changeAmount, shopWithdrawCash.getPaySysType()) > 0; + if (!addFreezeAmountSuccess) { + throw new LuckException("提现申请发生异常"); + } + // 2.减少结算金额 + boolean isSuccess = shopWalletService.subSettledAmount(shopId, changeAmount, shopWithdrawCash.getPaySysType()); + if (!isSuccess) { + throw new LuckException("可提现金额不足"); + } + } + + @Override + public PageVO pageByParam(PageDTO pageDTO, ShopWithdrawCashDTO shopWithdrawCashDTO) { + shopWithdrawCashDTO.setPaySysType(shopAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value()); + return PageUtil.doPage(pageDTO, () -> shopWithdrawCashMapper.listByParam(shopWithdrawCashDTO)); + } + + @Override + public ShopWithdrawCashVO getDetailByCashId(Long cashId) { + return shopWithdrawCashMapper.getDetailByCashId(cashId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void auditWithdrawCash(ShopWithdrawCashDTO shopWithdrawCashDTO, Long userId) { + if (shopAllinpayService.getIsAllinpay()) { + throw new LuckException("开启通联后,平台无需审核商家提现信息"); + } + ShopWithdrawCashVO shopWithdrawCashVO = shopWithdrawCashMapper.getDetailByCashId(shopWithdrawCashDTO.getCashId()); + if (Objects.isNull(shopWithdrawCashVO)) { + throw new LuckException("未找到申请信息"); + } + if (!Objects.equals(shopWithdrawCashVO.getStatus(), ShopWithdrawCashStatus.WAITAUDIT.value())) { + throw new LuckException("该申请已被审核"); + } + + this.checkAuditInfo(shopWithdrawCashDTO, shopWithdrawCashDTO.getShopId()); + ShopWithdrawCash shopWithdrawCash = BeanUtil.map(shopWithdrawCashVO, ShopWithdrawCash.class); + Date now = new Date(); + shopWithdrawCash.setAuditorId(userId); + shopWithdrawCash.setAuditingTime(now); + shopWithdrawCash.setStatus(shopWithdrawCashDTO.getStatus()); + shopWithdrawCash.setRemarks(shopWithdrawCashDTO.getRemarks()); + shopWithdrawCash.setPayingAccount(shopWithdrawCashDTO.getPayingAccount()); + shopWithdrawCash.setPayingTime(shopWithdrawCashDTO.getPayingTime()); + shopWithdrawCash.setPayingCardNo(shopWithdrawCashDTO.getPayingCardNo()); + Long shopId = shopWithdrawCash.getShopId(); + Long changeAmount = shopWithdrawCash.getAmount(); + + ShopWalletChangeReason shopWalletChangeReason = ShopWalletChangeReason.PASS_CASH; + List shopWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (!Objects.equals(changeAmount, 0L)) { + switch (Objects.requireNonNull(ShopWithdrawCashStatus.instance(shopWithdrawCash.getStatus()))) { + case SUCCESSAUDIT: + // 审核通过, 减去冻结的金额 + boolean subFreezeAmountSuccess = shopWalletMapper.subFreezeAmount(shopId, changeAmount, PaySysType.DEFAULT.value()) > 0; + if (!subFreezeAmountSuccess) { + throw new LuckException("冻结金额不足,提现失败"); + } + break; + case FAILAUDIT: + // 审核不通过,将冻结的金额返回到已结算金额 + boolean subFreezeAmount = shopWalletMapper.subFreezeAmount(shopId, changeAmount, PaySysType.DEFAULT.value()) > 0; + if (!subFreezeAmount) { + throw new LuckException("审核失败,冻结金额异常"); + } + // 增加结算金额到主分片(不增加总结算金额) + boolean addSettledAmount = shopWalletMapper.addSettledAmount(shopId, changeAmount, PaySysType.DEFAULT.value(), false) > 0; + if (!addSettledAmount) { + throw new LuckException("审核失败,结算金额异常"); + } + shopWalletChangeReason = ShopWalletChangeReason.REFUSE_CASH; + break; + default: + // 审核状态有误 + throw new LuckException("审核状态有误"); + } + } + // 保存日志 + this.saveShopWalletLog(changeAmount, shopId, now, shopWalletChangeReason, shopWalletLogList, PaySysType.DEFAULT.value()); + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addShopWalletLogTemplate.syncSend(RocketMqConstant.ADD_SHOP_WALLET_LOG_TOPIC, new GenericMessage<>(shopWalletLogList)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + if (shopWithdrawCashMapper.updateByIdAndStatus(shopWithdrawCash, shopWithdrawCash.getCashId(), ShopWithdrawCashStatus.WAITAUDIT.value()) != 1) { + throw new LuckException("该申请已被审核"); + } + } + + private void checkConfig(ShopWithdrawCash shopWithdrawCash) { + ShopWithdrawCashConfigDto config = getConfig(); + if (shopWithdrawCash.getAmount() < config.getWithdrawCashLeast()) { + throw new LuckException("商家提现金额过少,最低提现:" + config.getWithdrawCashLeast() / 100); + } + if (Objects.nonNull(config.getWithdrawCashMax()) && shopWithdrawCash.getAmount() > config.getWithdrawCashMax()) { + throw new LuckException("商家提现金额过大,最高提现:" + config.getWithdrawCashMax() / 100); + } + Integer frequency = config.getFrequency(); + String date; + Date startTimes; + Date endTimes; + if (frequency.equals(WithdrawCashType.WEEKEND.value())) { + date = WithdrawCashType.WEEKEND.date(); + startTimes = DateUtils.getCurrentWeekStartTimes(new Date()); + endTimes = DateUtils.getCurrentWeekEndTimes(new Date()); + } else if (frequency.equals(WithdrawCashType.MONTH.value())) { + date = WithdrawCashType.MONTH.date(); + startTimes = DateUtils.getMonthFirstOrLastDay(new Date(), 0); + endTimes = DateUtils.getMonthFirstOrLastDay(new Date(), 1); + } else { + date = WithdrawCashType.YEAR.date(); + startTimes = DateUtils.getCurrentYearStartTime(new Date()); + endTimes = DateUtils.getCurrentYearEndTime(new Date()); + } + int count = shopWithdrawCashMapper.getWithdrawCashCount(startTimes, endTimes, shopWithdrawCash); + if (count + 1 > config.getNumber()) { + throw new LuckException("超出提现频率限制,当前频率为:" + date + " " + config.getNumber() + "次"); + } + } + + + @Override + public void saveConfig(ShopWithdrawCashConfigDto shopWithdrawCashDto) { + checkParam(shopWithdrawCashDto); + SysConfigApiVO sysConfigApiVO = new SysConfigApiVO(); + sysConfigApiVO.setParamKey(Constant.SHOP_WITHDRWA); + sysConfigApiVO.setRemark("商家提现配置"); + sysConfigApiVO.setParamValue(Json.toJsonString(shopWithdrawCashDto)); + configFeignClient.saveOrUpdateSysConfig(sysConfigApiVO); + } + + @Override + public ShopWithdrawCashConfigDto getConfig() { + + ShopWithdrawCashConfigDto shopWithdrawCashConfigDto = Json.parseObject(configFeignClient.getConfig(Constant.SHOP_WITHDRWA).getData(), ShopWithdrawCashConfigDto.class); + if (Objects.isNull(shopWithdrawCashConfigDto)) { + shopWithdrawCashConfigDto = new ShopWithdrawCashConfigDto(); + shopWithdrawCashConfigDto.setWithdrawCashLeast(100.0D); + shopWithdrawCashConfigDto.setFrequency(1); + shopWithdrawCashConfigDto.setNumber(1); + } + return shopWithdrawCashConfigDto; + } + + @Override + public void checkDrawCashAmount(Long amount) { + // 基础数值检查 - 小于100 + ShopWithdrawCashConfigDto config = this.getConfig(); + if (amount < config.getWithdrawCashLeast()) { + throw new LuckException("提现金额不能少于" + config.getWithdrawCashLeast() / 100 + "元"); + } + // 系统配置检查 + ShopWithdrawCash shopWithdrawCash = new ShopWithdrawCash(); + shopWithdrawCash.setAmount(amount); + this.checkConfig(shopWithdrawCash); + } + + private void checkParam(ShopWithdrawCashConfigDto shopWithdrawCashDto) { + Double least = shopWithdrawCashDto.getWithdrawCashLeast(); + Double max = shopWithdrawCashDto.getWithdrawCashMax(); + Integer frequency = shopWithdrawCashDto.getFrequency(); + Integer number = shopWithdrawCashDto.getNumber(); + if (Objects.isNull(least) || least < 1) { + throw new LuckException("商家最少金额设置错误"); + } + if (Objects.nonNull(max) && max < least) { + throw new LuckException("商家最大金额设置错误"); + } + boolean isError = Objects.isNull(frequency) || (!frequency.equals(WithdrawCashType.WEEKEND.value()) && !frequency.equals(WithdrawCashType.MONTH.value()) && !frequency.equals(WithdrawCashType.YEAR.value())); + if (isError) { + throw new LuckException("商家提现频率设置错误"); + } + if (Objects.isNull(number) || number < 1) { + throw new LuckException("商家提现次数设置错误"); + } + } + + private void saveShopWalletLog(Long changeAmount, Long shopId, Date now, ShopWalletChangeReason shopWalletChangeReason, List shopWalletLogList, Integer paySysType) { + + // 插入结算金额修改记录【提现申请/提现申请被拒绝】 + if (Objects.equals(shopWalletChangeReason, ShopWalletChangeReason.APPLY_CASH) || Objects.equals(shopWalletChangeReason, ShopWalletChangeReason.REFUSE_CASH)) { + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + shopWalletLog.setWalletLogId(walletLogId); + shopWalletLog.setCreateTime(now); + shopWalletLog.setUpdateTime(now); + shopWalletLog.setShopId(shopId); + shopWalletLog.setPaySysType(paySysType); + shopWalletLog.setReason(shopWalletChangeReason.value()); + shopWalletLog.setShopChangeAmount(Math.abs(changeAmount)); + shopWalletLog.setShopIoType(Objects.equals(shopWalletChangeReason, ShopWalletChangeReason.APPLY_CASH) ? ShopWalletIoType.EXPENDITURE.value() : ShopWalletIoType.INCOME.value()); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLogList.add(shopWalletLog); + } + + // 插入冻结金额修改记录 + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setWalletLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG)); + shopWalletLog.setPaySysType(paySysType); + shopWalletLog.setCreateTime(now); + shopWalletLog.setUpdateTime(now); + shopWalletLog.setShopId(shopId); + shopWalletLog.setReason(shopWalletChangeReason.value()); + shopWalletLog.setShopChangeAmount(Math.abs(changeAmount)); + shopWalletLog.setShopIoType(!Objects.equals(shopWalletChangeReason, ShopWalletChangeReason.APPLY_CASH) ? ShopWalletIoType.EXPENDITURE.value() : ShopWalletIoType.INCOME.value()); + shopWalletLog.setAmountType(ShopWalletAmountType.FREEZE_AMOUNT.value()); + shopWalletLogList.add(shopWalletLog); + } + + private void checkWithdrawInfo(ShopWithdrawCashDTO shopWithdrawCashDTO, Long shopId) { + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity merchantInfoRes = accountFeignClient.getAccountInfoByTenantId(shopId, sysType); + if (!merchantInfoRes.isSuccess() || Objects.isNull(merchantInfoRes.getData())) { + throw new LuckException("商家信息获取出错"); + } + if (shopWithdrawCashDTO.getAmount() < 1) { + throw new LuckException("提现金额不能少于1.00元"); + } + ServerResponseEntity sendNotifyResponse = sendNotifyFeignClient.checkValidCode(merchantInfoRes.getData().getPhone(), shopWithdrawCashDTO.getValidCode(), SendTypeEnum.VALID); + if (!sendNotifyResponse.isSuccess() || !sendNotifyResponse.getData()) { + throw new LuckException("验证码有误或已过期"); + } + checkAuditInfo(shopWithdrawCashDTO, shopId); + } + + private void checkAuditInfo(ShopWithdrawCashDTO shopWithdrawCashDTO, Long shopId) { + ShopDetailVO shopDetailVO = shopDetailService.getByShopId(shopId); + if (Objects.isNull(shopDetailVO)) { + throw new LuckException("店铺不存在"); + } + ShopBankCardVO shopBankCard = shopBankCardService.getByShopBankCardId(shopWithdrawCashDTO.getShopBankCardId()); + if (Objects.isNull(shopBankCard) || !Objects.equals(shopBankCard.getShopId(), shopId)) { + throw new LuckException("银行卡信息错误"); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/WalletLogOperationServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/WalletLogOperationServiceImpl.java new file mode 100644 index 0000000..f7faa76 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/service/impl/WalletLogOperationServiceImpl.java @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.multishop.constant.ShopWalletAmountType; +import com.tmerclub.cloud.multishop.constant.ShopWalletChangeReason; +import com.tmerclub.cloud.multishop.dto.ShopWalletLogSearchDTO; +import com.tmerclub.cloud.multishop.mapper.ShopWalletMapper; +import com.tmerclub.cloud.multishop.mongo.MongoShopWalletLogBO; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import com.tmerclub.cloud.multishop.service.ShopWalletService; +import com.tmerclub.cloud.multishop.service.WalletLogOperationService; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商家钱包信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +@Service +public class WalletLogOperationServiceImpl implements WalletLogOperationService { + + @Autowired + private ShopWalletMapper shopWalletMapper; + @Autowired + private ShopWalletLogService shopWalletLogService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private RocketMQTemplate shopWalletNotifyServiceTemplate; + @Autowired + private SupplierWalletService supplierWalletService; + @Autowired + private RedissonClient redissonClient; + @Autowired + private ShopWalletService shopWalletService; + private static final Logger logger = LoggerFactory.getLogger(WalletLogOperationServiceImpl.class); + + /** + * TODO -supplier + * @param orderSimpleAmountInfos 订单id和店铺id关联信息 + * @param message 订单id和店铺id关联信息 + * @param settledAmountMap 店铺已结算金额map + * @param salesMap 商家的代销配置 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void addAmountByOrder(List orderSimpleAmountInfos, PayNotifyBO message, Map settledAmountMap, Map salesMap) { + + // 进行分账,添加一个分账记录表,因为每一个订单进行分完帐后要进行退款,那么退款的时候也应该按照下单的时候的分账比例进行原路返回 + // 获取当前分账的比例 + List shopWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderSupplierAmountInfos = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderSimpleAmountInfoBO orderSimpleAmountInfo : orderSimpleAmountInfos) { + Long settlementAmount; + // 商家之所以会从一笔订单拿到钱,是因为订单支付成功 + // 幂等 + // 1. 商家应收 = 商品价格 - 商家优惠 - 分销金额 + // 2. 商家应收 = 用户支付 + 平台补贴 - 分销金额 + Long changeAmount; + long supplierAmount; + changeAmount = orderSimpleAmountInfo.getActualTotal() + orderSimpleAmountInfo.getPlatformAmount() - orderSimpleAmountInfo.getDistributionAmount() - orderSimpleAmountInfo.getPlatformCommission(); + if (!Objects.equals(orderSimpleAmountInfo.getSupplierId(), 0L)) { + // 代销订单处理 + // 商家余额 + settlementAmount = settledAmountMap.get(orderSimpleAmountInfo.getShopId()); + // 如果商家收入金额小于供货价,0.直接转换为待采购订单(默认选中),1.通过商家已结算金额扣除差价 + Integer type = salesMap.get(orderSimpleAmountInfo.getShopId()); + // 供应商收入金额为 = 采购金额 + 运费 + 商家优惠运费 - 平台佣金 + supplierAmount = orderSimpleAmountInfo.getPurchaseAmount() + orderSimpleAmountInfo.getFreightAmount() + Math.abs(orderSimpleAmountInfo.getFreeFreightAmount()); + // 商家实际待结算金额 = 之前算法 - 运费 - 采购金额 + changeAmount = changeAmount - supplierAmount; + // 如果商家收入金额小于供货价,判断处理 + // 代销设置为商家通过已结算账户金额扣除差价,且已结算金额小于于差价则变成待采购订单 + // 情况一,代销设置为商家直接转换成采购订单,且已结算金额小于差价则转换成采购订单 + // 情况二,代销设置为商家通过已结算账户金额扣除差价,且已结算金额小于于差价则变成待采购订单 + boolean checkAmountFlag = (Objects.equals(type, 0) && changeAmount < 0) || (Objects.equals(type, 1) && settlementAmount + changeAmount < 0); + // 商家不同意采购,或者情况一,或者情况二,订单变成待采购 + if (!Objects.equals(message.getAgreePurchase(), 1) && checkAmountFlag) { + continue; + } + // 自动采购完成,代销设置为商家通过已结算账户金额自动扣除差价,且已结算金额足够,且改变金额小于0 + supplierAmount = supplierAmount - orderSimpleAmountInfo.getPurchasePlatformCommission(); + // 处理下供应商的分账 + handleSupplierAmount(orderSupplierAmountInfos, orderSimpleAmountInfo, changeAmount, supplierAmount, shopWalletLogList); + // 待结算金额处理 + changeAmount = Math.max(0L, changeAmount); + } + + // 商家添加未结算金额 + shopWalletMapper.addUnsettledAmount(orderSimpleAmountInfo.getShopId(), changeAmount, orderSimpleAmountInfo.getPaySysType()); + // 平台添加未结算金额(平台佣金 - 平台优惠分摊优惠金额) + long platformChangeAmount = orderSimpleAmountInfo.getPlatformCommission() + orderSimpleAmountInfo.getPurchasePlatformCommission() - orderSimpleAmountInfo.getPlatformAmount(); + + // 获取商家钱包记录列表 + saveShopWalletLog(orderSimpleAmountInfo, changeAmount, platformChangeAmount, shopWalletLogList); + } + if (CollectionUtil.isNotEmpty(orderSupplierAmountInfos)) { + for (OrderSimpleAmountInfoBO orderSimpleAmountInfo : orderSupplierAmountInfos) { + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + orderSimpleAmountInfo.setWalletLogId(walletLogId); + } + message.setOrderSimpleAmountInfos(orderSupplierAmountInfos); + } + + // 分账总消息,包括分销分支&&订单采购&&供应商分账 + // 分销订单有自己的操作,分销订单不包含积分订单 + // 订单成功 ----> 商家分账成功 ----> 分销分账 ---> 供应商分账 + // 代销商品流程 订单成功 ----> 商家分账成功 ----> 分销分账 ---> 供应商分账 --->修改订单为待采购订单 + SendStatus shopWalletNotifyStatus = shopWalletNotifyServiceTemplate.syncSend(RocketMqConstant.SHOP_WALLET_NOTIFY_SERVICE_TOPIC, new GenericMessage<>(message)).getSendStatus(); + if (!Objects.equals(shopWalletNotifyStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addAmountBySettledOrder(Long orderId) { + ShopWalletLogSearchDTO shopWalletLogSearchDTO = new ShopWalletLogSearchDTO(); + shopWalletLogSearchDTO.setOrderId(orderId); + List shopWalletLogs = shopWalletLogService.listByParam(shopWalletLogSearchDTO); + + // 商家&平台需要结算的钱 + MongoShopWalletLogBO payLog = null; + + MongoShopWalletLogBO shopRefundLog = new MongoShopWalletLogBO(); + shopRefundLog.setUserAmount(0L); + shopRefundLog.setDistributionAmount(0L); + shopRefundLog.setPlatformAmount(0L); + shopRefundLog.setShopPlatformCommission(0L); + shopRefundLog.setPlatformCommission(0L); + shopRefundLog.setShopChangeAmount(0L); + shopRefundLog.setPlatformChangeAmount(0L); + for (MongoShopWalletLogBO shopWalletLog : shopWalletLogs) { + // 下单 + MongoShopWalletLogBO shopPayLog = polymerizationShopWalletLog(shopRefundLog, shopWalletLog); + if (shopPayLog != null) { + payLog = shopPayLog; + } + } + // 非积分订单需要保存店铺结算记录 + if (Objects.nonNull(payLog)) { + // 通知供应商供应商结算 + supplierWalletService.addAmountBySettledOrder(orderId); + } + + } + + + private void saveShopWalletLog(OrderSimpleAmountInfoBO orderSimpleAmountInfo, Long changeAmount, long platformChangeAmount, List shopWalletLogList) { + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setOrderId(orderSimpleAmountInfo.getOrderId()); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(new Date()); + shopWalletLog.setReason(ShopWalletChangeReason.PAY.value()); + shopWalletLog.setShopId(orderSimpleAmountInfo.getShopId()); + shopWalletLog.setAmountType(ShopWalletAmountType.UNSETTLED_AMOUNT.value()); + shopWalletLog.setPlatformIoType(platformChangeAmount >= 0 ? 1 : 0); + + shopWalletLog.setUserAmount(orderSimpleAmountInfo.getActualTotal()); + shopWalletLog.setPlatformCommission(orderSimpleAmountInfo.getPlatformCommission() + orderSimpleAmountInfo.getPurchasePlatformCommission()); + shopWalletLog.setPlatformChangeAmount(shopWalletLog.getUserAmount()); + shopWalletLog.setDistributionAmount(orderSimpleAmountInfo.getDistributionAmount()); + shopWalletLog.setPlatformAmount(orderSimpleAmountInfo.getPlatformAmount()); + + shopWalletLog.setShopReduceAmount(orderSimpleAmountInfo.getShopAmount()); + shopWalletLog.setShopPlatformCommission(orderSimpleAmountInfo.getPlatformCommission()); + + if (!Objects.equals(orderSimpleAmountInfo.getShopId(), Constant.PLATFORM_SHOP_ID)) { + shopWalletLog.setShopIoType(1); + shopWalletLog.setShopChangeAmount(changeAmount); + shopWalletLog.setShopPlatformCommission(orderSimpleAmountInfo.getPlatformCommission()); + shopWalletLog.setPlatformChangeAmount(Math.abs(platformChangeAmount)); + } + shopWalletLogList.add(shopWalletLog); + } + + /** + * 供应商采购金额处理,如果商家待结算金额改变金额小于0,减少结算金额并添加日志 + * @param orderSupplierAmountInfos 采购分账信息 + * @param orderSimpleAmountInfo 订单信息 + * @param changeAmount 商家待结算改变金额 + * @param supplierAmount 供应商收入金额 + */ + private void handleSupplierAmount(List orderSupplierAmountInfos, OrderSimpleAmountInfoBO orderSimpleAmountInfo, + Long changeAmount, Long supplierAmount, List shopWalletLogList) { + OrderSimpleAmountInfoBO supplierAmountBO = new OrderSimpleAmountInfoBO(); + supplierAmountBO.setOrderId(orderSimpleAmountInfo.getOrderId()); + supplierAmountBO.setPurchasePlatformCommission(orderSimpleAmountInfo.getPurchasePlatformCommission()); + supplierAmountBO.setPurchaseAmount(supplierAmount); + supplierAmountBO.setActualTotal(orderSimpleAmountInfo.getActualTotal()); + supplierAmountBO.setSupplierId(orderSimpleAmountInfo.getSupplierId()); + supplierAmountBO.setFreightAmount(orderSimpleAmountInfo.getFreightAmount()); + supplierAmountBO.setFreeFreightAmount(orderSimpleAmountInfo.getFreeFreightAmount()); + orderSupplierAmountInfos.add(supplierAmountBO); + + if (changeAmount < 0) { + // 代销订单,商家减少结算金额并添加日志 + boolean isSuccess = shopWalletService.subSettledAmount(orderSimpleAmountInfo.getShopId(), Math.abs(changeAmount), orderSimpleAmountInfo.getPaySysType()); + if (!isSuccess) { + throw new LuckException("店铺结算金额不足"); + } + // 添加日志 + MongoShopWalletLogBO shopWalletLog = new MongoShopWalletLogBO(); + shopWalletLog.setCreateTime(new Date()); + shopWalletLog.setUpdateTime(shopWalletLog.getCreateTime()); + shopWalletLog.setOrderId(orderSimpleAmountInfo.getOrderId()); + shopWalletLog.setReason(ShopWalletChangeReason.PURCHASE_SPREAD_AMOUNT.value()); + shopWalletLog.setShopId(orderSimpleAmountInfo.getShopId()); + shopWalletLog.setShopIoType(0); + shopWalletLog.setShopChangeAmount(changeAmount); + shopWalletLog.setAmountType(ShopWalletAmountType.SETTLED_AMOUNT.value()); + shopWalletLog.setUserAmount(orderSimpleAmountInfo.getActualTotal()); + shopWalletLog.setDistributionAmount(orderSimpleAmountInfo.getDistributionAmount()); + shopWalletLog.setShopReduceAmount(orderSimpleAmountInfo.getShopAmount()); + shopWalletLog.setPlatformAmount(orderSimpleAmountInfo.getPlatformAmount()); + shopWalletLog.setShopPlatformCommission(orderSimpleAmountInfo.getPlatformCommission()); + // 添加日志 + shopWalletLogList.add(shopWalletLog); + } + } + + /** + * 聚合订单支付退款导致商家金额变更的记录 + * @param refundWalletLog + * @param shopWalletLog + * @return + */ + private MongoShopWalletLogBO polymerizationShopWalletLog(MongoShopWalletLogBO refundWalletLog, MongoShopWalletLogBO shopWalletLog) { + if (Objects.equals(ShopWalletChangeReason.PAY.value(), shopWalletLog.getReason())) { + return shopWalletLog; + } + // 退款 + else if (Objects.equals(ShopWalletChangeReason.ORDER_REFUND.value(), shopWalletLog.getReason())) { + refundWalletLog.setUserAmount(refundWalletLog.getUserAmount() + shopWalletLog.getUserAmount()); + refundWalletLog.setDistributionAmount(refundWalletLog.getDistributionAmount() + shopWalletLog.getDistributionAmount()); + refundWalletLog.setPlatformAmount(refundWalletLog.getPlatformAmount() + shopWalletLog.getPlatformAmount()); + refundWalletLog.setShopPlatformCommission(refundWalletLog.getShopPlatformCommission() + + (Objects.nonNull(shopWalletLog.getShopPlatformCommission()) ? shopWalletLog.getShopPlatformCommission() : 0L)); + refundWalletLog.setPlatformCommission(refundWalletLog.getPlatformCommission() + + (Objects.nonNull(shopWalletLog.getPlatformCommission()) ? shopWalletLog.getPlatformCommission() : 0L)); + // 如果因为退款收入,实际上是减少了退款的钱 + Long shopChangeAmount = (Objects.isNull(shopWalletLog.getShopIoType()) ? 0L : + (shopWalletLog.getShopIoType() == 1) ? -shopWalletLog.getShopChangeAmount() : shopWalletLog.getShopChangeAmount()); + Long platformChangeAmount = (Objects.isNull(shopWalletLog.getPlatformIoType()) ? 0L : + (shopWalletLog.getPlatformIoType() == 1) ? -shopWalletLog.getPlatformChangeAmount() : shopWalletLog.getPlatformChangeAmount()); + refundWalletLog.setShopChangeAmount(refundWalletLog.getShopChangeAmount() + shopChangeAmount); + refundWalletLog.setPlatformChangeAmount(refundWalletLog.getPlatformChangeAmount() + platformChangeAmount); + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/task/ShopTask.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/task/ShopTask.java new file mode 100644 index 0000000..f6f18ad --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/task/ShopTask.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.task; + +import com.tmerclub.cloud.multishop.service.ShopAllinpayService; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.multishop.service.ShopWalletLogService; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 店铺定时任务 + * + * @Author lth + * @Date 2021/7/9 13:35 + */ +@Component +public class ShopTask { + + @Autowired + private ShopDetailService shopDetailService; + @Autowired + private ShopWalletLogService shopWalletLogService; + @Autowired + private ShopAllinpayService shopAllinpayService; + + /** + * 根据签约时间改变店铺状态 + */ + @XxlJob("changeShopStatus") + public void changeShopStatus() { + Date now = new Date(); + // 根据签约时间修改店铺状态 + if (shopAllinpayService.getIsAllinpay()) { + return; + } + shopDetailService.changeShopStatusByContractTime(now); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/HotSearchVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/HotSearchVO.java new file mode 100644 index 0000000..5baf3c1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/HotSearchVO.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 热搜VO + * + * @author YXF + * @date 2021-01-27 09:10:00 + */ +public class HotSearchVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long hotSearchId; + + @Schema(description = "店铺ID 0为全局热搜") + private Long shopId; + + @Schema(description = "内容") + private String content; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "状态 0下线 1上线") + private Integer status; + + @Schema(description = "热搜标题") + private String title; + + @Schema(description = "1:商品热搜 2:店铺热搜") + private Integer type; + + public Long getHotSearchId() { + return hotSearchId; + } + + public void setHotSearchId(Long hotSearchId) { + this.hotSearchId = hotSearchId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "HotSearchVO{" + + "hotSearchId=" + hotSearchId + + ",shopId=" + shopId + + ",content=" + content + + ",seq=" + seq + + ",status=" + status + + ",title=" + title + + ",type=" + type + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopBankCardVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopBankCardVO.java new file mode 100644 index 0000000..de4d69f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopBankCardVO.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/4/26 10:12 + */ +public class ShopBankCardVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键id") + private Long shopBankCardId; + + @Schema(description = "银行名称") + private String bankName; + + @Schema(description = "账户名") + private String recipientName; + + @Schema(description = "账号") + private String cardNo; + + @Schema(description = "支行名称") + private String branchName; + + @Schema(description = "是否为默认") + private Integer isDefault; + + @Schema(description = "是否已验证") + private Integer isVerify; + + @Schema(description = "店铺id") + private Long shopId; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public Integer getIsVerify() { + return isVerify; + } + + public void setIsVerify(Integer isVerify) { + this.isVerify = isVerify; + } + + @Override + public String toString() { + return "ShopBankCardVO{" + + "shopBankCardId=" + shopBankCardId + + ", bankName='" + bankName + '\'' + + ", recipientName='" + recipientName + '\'' + + ", cardNo='" + cardNo + '\'' + + ", branchName='" + branchName + '\'' + + ", isDefault=" + isDefault + + ", isVerify=" + isVerify + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCollectionVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCollectionVO.java new file mode 100644 index 0000000..dbff10e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopCollectionVO.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户店铺收藏记录VO + * + * @author lhd + * @date 2021-02-23 14:41:42 + */ +public class ShopCollectionVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收藏自增id") + private Long collectionId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺logo(可修改)") + private String shopLogo; + + @Schema(description = "店铺状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核)") + private Integer shopStatus; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "店铺收藏数量") + private Long collectionNum; + + @Schema(description = "店铺商品列表") + private List spuSearchList; + + @Schema(description = "设为主页的h5装修id") + private Long renovationId; + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + public List getSpuSearchList() { + return spuSearchList; + } + + public void setSpuSearchList(List spuSearchList) { + this.spuSearchList = spuSearchList; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getCollectionId() { + return collectionId; + } + + public void setCollectionId(Long collectionId) { + this.collectionId = collectionId; + } + + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRenovationId() { + return renovationId; + } + + public void setRenovationId(Long renovationId) { + this.renovationId = renovationId; + } + + @Override + public String toString() { + return "ShopCollectionVO{" + + "collectionId=" + collectionId + + ", shopId=" + shopId + + ", shopLogo='" + shopLogo + '\'' + + ", shopStatus=" + shopStatus + + ", shopName='" + shopName + '\'' + + ", type=" + type + + ", collectionNum=" + collectionNum + + ", spuSearchList=" + spuSearchList + + ", renovationId=" + renovationId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopDetailAppVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopDetailAppVO.java new file mode 100644 index 0000000..0ad649e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopDetailAppVO.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 店铺详情VO + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public class ShopDetailAppVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺简介") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + + @Schema(description = "店铺logo(可修改)") + private String shopLogo; + + @Schema(description = "店铺状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核)") + private Integer shopStatus; + + @Schema(description = "商品列表") + private List spuList; + + @Schema(description = "店铺收藏数量") + private Long collectionNum; + + @Schema(description = "移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "pc背景图") + private String pcBackgroundPic; + + + @Schema(description = "是否优选好店 1.是 0.不是") + private String isPreferred; + + public String getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(String isPreferred) { + this.isPreferred = isPreferred; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + @Override + public String toString() { + return "ShopDetailAppVO{" + + "shopId=" + shopId + + ", type=" + type + + ", shopName='" + shopName + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", shopStatus=" + shopStatus + + ", spuList=" + spuList + + ", collectionNum=" + collectionNum + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", isPreferred='" + isPreferred + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopHeadInfoVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopHeadInfoVO.java new file mode 100644 index 0000000..a8eaef3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopHeadInfoVO.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺的头信息 + * @author FrozenWatermelon + */ +public class ShopHeadInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "店长用户id") + private Long ownerUserId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺简介") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "店铺logo(可修改)") + private String shopLogo; + + @Schema(description = "店铺收藏数量") + private Long collectionNum; + + @Schema(description = "是否优选好店 1.是 0.不是") + private Integer isPreferred; + + @Schema(description = "店铺状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核)") + private Integer shopStatus; + + @Schema(description = "移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "pc背景图") + private String pcBackgroundPic; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "主页装修id") + private Long renovationId; + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getOwnerUserId() { + return ownerUserId; + } + + public void setOwnerUserId(Long ownerUserId) { + this.ownerUserId = ownerUserId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public Long getRenovationId() { + return renovationId; + } + + public void setRenovationId(Long renovationId) { + this.renovationId = renovationId; + } + + @Override + public String toString() { + return "ShopHeadInfoVO{" + + "shopId=" + shopId + + ", type=" + type + + ", ownerUserId=" + ownerUserId + + ", shopName='" + shopName + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", collectionNum=" + collectionNum + + ", isPreferred=" + isPreferred + + ", shopStatus=" + shopStatus + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", renovationId=" + renovationId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopRechargeVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopRechargeVO.java new file mode 100644 index 0000000..4cb41c1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopRechargeVO.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class ShopRechargeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "扫码支付信息") + private String payInfo; + + @Schema(description = "钱包id") + private Long walletLogId; + + public ShopRechargeVO() { + } + + public ShopRechargeVO(String payInfo, Long walletLogId) { + this.payInfo = payInfo; + this.walletLogId = walletLogId; + } + + public String getPayInfo() { + return payInfo; + } + + public void setPayInfo(String payInfo) { + this.payInfo = payInfo; + } + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + @Override + public String toString() { + return "ShopRechargeVO{" + + "payInfo='" + payInfo + '\'' + + ", walletLogId=" + walletLogId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopStatusInfoVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopStatusInfoVO.java new file mode 100644 index 0000000..fc87958 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopStatusInfoVO.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @Author lth + * @Date 2021/7/15 16:42 + */ +public class ShopStatusInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "账号状态, 1:启用 0:禁用 -1:删除") + private Integer accountStatus; + + @Schema(description = "状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:店铺申请中 5:上线申请待审核)") + private Integer shopStatus; + + @Schema(description = "下线状态 1平台进行下线 2 重新申请,等待审核 3.审核通过 4 审核未通过") + private Integer offlineStatus; + + @Schema(description = "下线原因") + private String offlineReason; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + public Integer getAccountStatus() { + return accountStatus; + } + + public void setAccountStatus(Integer accountStatus) { + this.accountStatus = accountStatus; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public Integer getOfflineStatus() { + return offlineStatus; + } + + public void setOfflineStatus(Integer offlineStatus) { + this.offlineStatus = offlineStatus; + } + + public String getOfflineReason() { + return offlineReason; + } + + public void setOfflineReason(String offlineReason) { + this.offlineReason = offlineReason; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + @Override + public String toString() { + return "ShopStatusInfoVO{" + + "accountStatus=" + accountStatus + + ", shopStatus=" + shopStatus + + ", offlineStatus=" + offlineStatus + + ", offlineReason='" + offlineReason + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopSubstituteSalesVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopSubstituteSalesVO.java new file mode 100644 index 0000000..23aba3e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopSubstituteSalesVO.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 代销设置表VO + * + * @author lhd + * @date 2022-06-22 17:09:12 + */ +public class ShopSubstituteSalesVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "代销设置id") + private Long shopSubstituteSalesId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "代销设置类型 0.智能设价 1.手动设价") + private Integer salesType; + + @Schema(description = "默认加价比例 0.按比例加价 1.按固定数值加价") + private Integer salesPriceType; + + @Schema(description = "默认加价比例为0时,代表百分比*100,为1时代表实际奖励金额*100") + private Long salesPrice; + + @Schema(description = "商家收入低于供货价订单形式默认0 0.直接转换为待采购订单 1.通过商家已结算金额扣除差价") + private Integer orderShape; + + @Schema(description = "操作人id") + private Long modifier; + + @Schema(description = "代销设置类型为1才有:供货价高于代销价时是否自动下架:1.是,0.否") + private Integer automaticOff; + + public Integer getAutomaticOff() { + return automaticOff; + } + + public void setAutomaticOff(Integer automaticOff) { + this.automaticOff = automaticOff; + } + + public Integer getOrderShape() { + return orderShape; + } + + public void setOrderShape(Integer orderShape) { + this.orderShape = orderShape; + } + + public Long getShopSubstituteSalesId() { + return shopSubstituteSalesId; + } + + public void setShopSubstituteSalesId(Long shopSubstituteSalesId) { + this.shopSubstituteSalesId = shopSubstituteSalesId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSalesType() { + return salesType; + } + + public void setSalesType(Integer salesType) { + this.salesType = salesType; + } + + public Integer getSalesPriceType() { + return salesPriceType; + } + + public void setSalesPriceType(Integer salesPriceType) { + this.salesPriceType = salesPriceType; + } + + public Long getSalesPrice() { + return salesPrice; + } + + public void setSalesPrice(Long salesPrice) { + this.salesPrice = salesPrice; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "ShopSubstituteSalesVO{" + + "shopSubstituteSalesId=" + shopSubstituteSalesId + + ", shopId=" + shopId + + ", salesType=" + salesType + + ", salesPriceType=" + salesPriceType + + ", salesPrice=" + salesPrice + + ", orderShape=" + orderShape + + ", modifier=" + modifier + + ", automaticOff=" + automaticOff + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletLogExcelVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletLogExcelVO.java new file mode 100644 index 0000000..1b00391 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletLogExcelVO.java @@ -0,0 +1,221 @@ +package com.tmerclub.cloud.multishop.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 导出商家余额 + * @author 菠萝凤梨 + */ +public class ShopWalletLogExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "店铺结算明细表"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"店铺结算明细表", "序号"}) + private String seq; + + @ExcelProperty({"店铺结算明细表", "店铺名称"}) + private String shopName; + + /** + * @see com.tmerclub.cloud.multishop.constant.ShopWalletAmountType + */ + @ExcelProperty({"店铺结算明细表", "金额类型"}) + private String amountType; + + @Schema(description = "商家收支类型 0支出 1收入") + @ExcelProperty({"店铺结算明细表", "收支类型"}) + private String ioType; + + @ExcelProperty({"店铺结算明细表", "改变金额"}) + private String changeAmount; + + @ExcelProperty({"店铺结算明细表", "订单编号"}) + private String orderId; + + @ExcelProperty({"店铺结算明细表", "退款编号"}) + private String refundId; + + @ExcelProperty({"店铺结算明细表", "操作金额"}) + private String userAmount; + + @ExcelProperty({"店铺结算明细表", "平台补贴金额"}) + private String platformAmount; + + @ExcelProperty({"店铺结算明细表", "商家补贴金额"}) + private String shopReduceAmount; + + @ExcelProperty({"店铺结算明细表", "分销金额"}) + private String distributionAmount; + + @ExcelProperty({"店铺结算明细表", "平台佣金"}) + private String platformCommission; + + @ExcelProperty({"店铺结算明细表", "商家平台佣金"}) + private String shopPlatformCommission; + + @ExcelProperty({"店铺结算明细表", "资金变化原因"}) + private String reasonStr; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty({"店铺结算明细表", "创建时间"}) + private Date createTime; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getAmountType() { + return amountType; + } + + public void setAmountType(String amountType) { + this.amountType = amountType; + } + + public String getIoType() { + return ioType; + } + + public void setIoType(String ioType) { + this.ioType = ioType; + } + + public String getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(String changeAmount) { + this.changeAmount = changeAmount; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public String getRefundId() { + return refundId; + } + + public void setRefundId(String refundId) { + this.refundId = refundId; + } + + public String getUserAmount() { + return userAmount; + } + + public void setUserAmount(String userAmount) { + this.userAmount = userAmount; + } + + public String getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(String platformAmount) { + this.platformAmount = platformAmount; + } + + public String getShopReduceAmount() { + return shopReduceAmount; + } + + public void setShopReduceAmount(String shopReduceAmount) { + this.shopReduceAmount = shopReduceAmount; + } + + public String getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(String distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public String getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(String platformCommission) { + this.platformCommission = platformCommission; + } + + public String getShopPlatformCommission() { + return shopPlatformCommission; + } + + public void setShopPlatformCommission(String shopPlatformCommission) { + this.shopPlatformCommission = shopPlatformCommission; + } + + public String getReasonStr() { + return reasonStr; + } + + public void setReasonStr(String reasonStr) { + this.reasonStr = reasonStr; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "ShopWalletLogExcelVO{" + + "seq='" + seq + '\'' + + ", shopName='" + shopName + '\'' + + ", amountType=" + amountType + + ", ioType=" + ioType + + ", changeAmount=" + changeAmount + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", shopReduceAmount=" + shopReduceAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", shopPlatformCommission=" + shopPlatformCommission + + ", reasonStr='" + reasonStr + '\'' + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletLogVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletLogVO.java new file mode 100644 index 0000000..3a574dd --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/ShopWalletLogVO.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家钱包记录VO + * + * @author lhd + * @date 2021-01-04 13:55:51 + */ +public class ShopWalletLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "序号") + private Long index; + + @Schema(description = "店铺钱包id") + private Long walletLogId; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "关联订单号") + private Long orderId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "收支类型 0支出 1收入") + private Integer ioType; + + @Schema(description = "金额类型 0 未结算金额 1可提现金额 2冻结金额") + private Integer amountType; + + @Schema(description = "改变金额") + private Long changeAmount; + + @Schema(description = "原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝") + private Integer reason; + + @Schema(description = "操作金额(支付实付金额,退款实际申请金额)") + private Long userAmount; + + @Schema(description = "平台补贴金额") + private Long platformAmount; + + @Schema(description = "分销占用金额") + private Long distributionAmount; + + @Schema(description = "平台佣金") + private Long platformCommission; + + @Schema(description = "商家优惠金额") + private Long shopReduceAmount; + + @Schema(description = "商家名称") + private String shopName; + + public Long getIndex() { + return index; + } + + public void setIndex(Long index) { + this.index = index; + } + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + @Override + public Date getCreateTime() { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + @Override + public Date getUpdateTime() { + return updateTime; + } + + public Long getUserAmount() { + return userAmount; + } + + public void setUserAmount(Long userAmount) { + this.userAmount = userAmount; + } + + @Override + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getShopReduceAmount() { + return shopReduceAmount; + } + + public void setShopReduceAmount(Long shopReduceAmount) { + this.shopReduceAmount = shopReduceAmount; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + @Override + public String toString() { + return "ShopWalletLogVO{" + + "index=" + index + + ", walletLogId=" + walletLogId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", ioType=" + ioType + + ", amountType=" + amountType + + ", changeAmount=" + changeAmount + + ", reason=" + reason + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", shopReduceAmount=" + shopReduceAmount + + ", shopName='" + shopName + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/mongo/MongoShopWalletLogVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/mongo/MongoShopWalletLogVO.java new file mode 100644 index 0000000..24636af --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/mongo/MongoShopWalletLogVO.java @@ -0,0 +1,70 @@ +package com.tmerclub.cloud.multishop.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * mongo返回的字段 + * @author 菠萝凤梨 + */ +@Document("shop_wallet_log") +public class MongoShopWalletLogVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺日志数") + private Long shopLogCount; + + @Schema(description = "总金额") + private Long totalAmount; + + @Schema(description = "收支类型") + private Integer platformIoType; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getShopLogCount() { + return shopLogCount; + } + + public void setShopLogCount(Long shopLogCount) { + this.shopLogCount = shopLogCount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getPlatformIoType() { + return platformIoType; + } + + public void setPlatformIoType(Integer platformIoType) { + this.platformIoType = platformIoType; + } + + @Override + public String toString() { + return "MongoShopWalletLogVO{" + + "shopId=" + shopId + + ", shopLogCount=" + shopLogCount + + ", totalAmount=" + totalAmount + + ", ioType=" + platformIoType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/mongo/MongoShopWalletVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/mongo/MongoShopWalletVO.java new file mode 100644 index 0000000..fe18885 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/multishop/vo/mongo/MongoShopWalletVO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.multishop.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家钱包信息VO + * @author TRACK + */ +@Document("shop_wallet_log") +public class MongoShopWalletVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "未结算金额(收入)") + private Long inUnsettleAmount; + + @Schema(description = "未结算金额(支出)") + private Long outUnsettleAmount; + + @Schema(description = "已结算金额") + private Long totalSettleAmount; + + @Schema(description = "冻结金额(收入)") + private Long inFreezeAmount; + + @Schema(description = "冻结金额(支出)") + private Long outFreezeAmount; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getInUnsettleAmount() { + return inUnsettleAmount; + } + + public void setInUnsettleAmount(Long inUnsettleAmount) { + this.inUnsettleAmount = inUnsettleAmount; + } + + public Long getOutUnsettleAmount() { + return outUnsettleAmount; + } + + public void setOutUnsettleAmount(Long outUnsettleAmount) { + this.outUnsettleAmount = outUnsettleAmount; + } + + public Long getTotalSettleAmount() { + return totalSettleAmount; + } + + public void setTotalSettleAmount(Long totalSettleAmount) { + this.totalSettleAmount = totalSettleAmount; + } + + public Long getInFreezeAmount() { + return inFreezeAmount; + } + + public void setInFreezeAmount(Long inFreezeAmount) { + this.inFreezeAmount = inFreezeAmount; + } + + public Long getOutFreezeAmount() { + return outFreezeAmount; + } + + public void setOutFreezeAmount(Long outFreezeAmount) { + this.outFreezeAmount = outFreezeAmount; + } + + @Override + public String toString() { + return "MongoShopWalletVO{" + + "shopId=" + shopId + + ", inUnsettleAmount=" + inUnsettleAmount + + ", outUnsettleAmount=" + outUnsettleAmount + + ", totalSettleAmount=" + totalSettleAmount + + ", inFreezeAmount=" + inFreezeAmount + + ", outFreezeAmount=" + outFreezeAmount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/constant/WebConfigType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/constant/WebConfigType.java new file mode 100644 index 0000000..697ca61 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/constant/WebConfigType.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.constant; + +/** + * 配置类型(平台端 商家端 PC端 h5端 自提点端) + * + * @author FrozenWatermelon + */ +public enum WebConfigType { + /** + * 平台端 + */ + PLATFROM("PLATFROM_WEBSITE_CONFIG"), + + /** + * 商家端 + */ + MULTISHOP("MULTISHOP_WEBSITE_CONFIG"), + + /** + * 供应商端 + */ + SUPPLIER("SUPPLIER_WEBSITE_CONFIG"), + /** + * PC端 + */ + PC("PC_WEBSITE_CONFIG"), + + /** + * h5端 + */ + H5("H5_WEBSITE_CONFIG"), + + + /** + * 自提点端 + */ + STATION("STATION_WEBSITE_CONFIG"); + + private final String value; + + WebConfigType(String value) { + this.value = value; + } + + public String value() { + return value; + } + + public static WebConfigType instance(String paramKey) { + WebConfigType[] enums = values(); + for (WebConfigType typeEnum : enums) { + if (typeEnum.value().equals(paramKey)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysUserController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysUserController.java new file mode 100644 index 0000000..8486ab9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/SysUserController.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller; + +import cn.hutool.core.util.PhoneUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.platform.dto.SysUserDTO; +import com.tmerclub.cloud.platform.model.SysUser; +import com.tmerclub.cloud.platform.service.SysUserService; +import com.tmerclub.cloud.platform.vo.SysUserSimpleVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author lhd + * @date 2020/12/21 + */ +@RequestMapping("/p/sys_user") +@RestController +@Tag(name = "平台用户信息") +public class SysUserController { + + @Autowired + private SysUserService sysUserService; + + + @DubboReference + private AccountFeignClient accountFeignClient; + + @GetMapping("/info") + @Operation(summary = "登陆平台用户信息", description = "获取当前登陆平台用户的用户信息") + public ServerResponseEntity info() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + SysUserSimpleVO sysUserSimple = sysUserService.getSimpleByUserId(uidInfoBO.getUserId()); + sysUserSimple.setIsAdmin(uidInfoBO.getIsAdmin()); + sysUserSimple.setUserId(uidInfoBO.getUserId()); + sysUserSimple.setUserName(uidInfoBO.getUsername()); + return ServerResponseEntity.success(sysUserSimple); + } + + @GetMapping("/page") + @Operation(summary = "平台用户列表", description = "获取平台用户列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SysUserDTO sysUserDTO) { + sysUserDTO.setShopId(AuthUserContext.getShopId()); + PageVO sysUserPage = sysUserService.pageByShopId(pageDTO, sysUserDTO); + for (SysUserVO sysUserVO : sysUserPage.getList()) { + sysUserVO.setPhoneNum(Objects.isNull(sysUserVO.getPhoneNum()) ? null : PhoneUtil.hideBetween(sysUserVO.getPhoneNum()).toString()); + } + return ServerResponseEntity.success(sysUserPage); + } + + @GetMapping + @Operation(summary = "获取平台用户信息", description = "根据用户id获取平台用户信息") + public ServerResponseEntity detail(@RequestParam Long sysUserId) { + SysUserVO sysUserVO = sysUserService.getByUserId(sysUserId); + sysUserVO.setPhoneNum(Objects.isNull(sysUserVO.getPhoneNum()) ? null : PhoneUtil.hideBetween(sysUserVO.getPhoneNum()).toString()); + ServerResponseEntity authResponseEntity = accountFeignClient.getByUserIdAndType(sysUserVO.getSysUserId(), SysTypeEnum.PLATFORM.value()); + if (!authResponseEntity.isSuccess()) { + throw new LuckException(authResponseEntity.getMsg()); + } + sysUserVO.setIsAdmin(authResponseEntity.getData().getIsAdmin()); + return ServerResponseEntity.success(sysUserVO); + } + + @PostMapping + @Operation(summary = "保存平台用户信息", description = "保存平台用户信息") + public ServerResponseEntity save(@Valid @RequestBody SysUserDTO sysUserDTO) { + SysUser sysUser = BeanUtil.map(sysUserDTO, SysUser.class); + sysUser.setSysUserId(null); + sysUser.setHasAccount(0); + List roleIds = sysUserDTO.getRoleIds(); + sysUserService.save(sysUser, roleIds); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新平台用户信息", description = "更新平台用户信息") + public ServerResponseEntity update(@Valid @RequestBody SysUserDTO sysUserDTO) { + SysUser sysUser = BeanUtil.map(sysUserDTO, SysUser.class); + sysUserService.update(sysUser, sysUserDTO.getRoleIds()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除平台用户信息", description = "根据平台用户id删除平台用户信息") + public ServerResponseEntity delete(@RequestParam Long sysUserId) { + if (Objects.equals(sysUserId, 1L)) { + throw new LuckException("系统超级管理员不能删除"); + } + if (Objects.equals(AuthUserContext.get().getUserId(), sysUserId)) { + throw new LuckException("您正在使用当前账号,无法进行删除操作"); + } + sysUserService.deleteById(sysUserId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/app/SysConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/app/SysConfigController.java new file mode 100644 index 0000000..1f2427e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/app/SysConfigController.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.app; + +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.service.SysConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 lth + * @Date 2021/6/1 13:59 + */ +@RestController("appSysConfigController") +@RequestMapping("/ua/app/sys_config") +@Tag(name = "app-系统配置信息") +public class SysConfigController { + + @Autowired + private SysConfigService sysConfigService; + + @GetMapping("/service_protocol") + @Operation(summary = "获取服务条款", description = "获取服务条款") + public ServerResponseEntity getServiceProtocol() { + Integer dbLang = I18nMessage.getLang(); + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), dbLang)) { + return ServerResponseEntity.success(sysConfigService.getValue(ConfigNameConstant.SERVICE_PROTOCOL_CN)); + } else { + return ServerResponseEntity.success(sysConfigService.getValue(ConfigNameConstant.SERVICE_PROTOCOL_EN)); + } + } + + @GetMapping("/privacy_protocol") + @Operation(summary = "获取隐私策略", description = "获取隐私策略") + public ServerResponseEntity getPrivacyProtocol() { + Integer dbLang = I18nMessage.getLang(); + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), dbLang)) { + return ServerResponseEntity.success(sysConfigService.getValue(ConfigNameConstant.PRIVACY_PROTOCOL_CN)); + } else { + return ServerResponseEntity.success(sysConfigService.getValue(ConfigNameConstant.PRIVACY_PROTOCOL_EN)); + } + } + + @GetMapping("/pay_settlement_type") + @Operation(summary = "获取支付系统配置", description = "获取支付系统配置") + public ServerResponseEntity getPaySettlementType() { + return ServerResponseEntity.success(sysConfigService.getValue(Constant.PAY_SETTLEMENT_CONFIG)); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/multishop/SysConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/multishop/SysConfigController.java new file mode 100644 index 0000000..09f3417 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/multishop/SysConfigController.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.multishop; + +import com.tmerclub.cloud.common.bean.Quick100; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.service.SysConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 track + */ +@RestController("shopSysConfigController") +@RequestMapping("/m/ua/sys_config") +@Tag(name = "multishop-系统配置信息") +public class SysConfigController { + + @Autowired + private SysConfigService sysConfigService; + + @GetMapping("/pay_settlement_type") + @Operation(summary = "获取支付系统配置", description = "获取支付系统配置") + public ServerResponseEntity getPaySettlementType() { + return ServerResponseEntity.success(sysConfigService.getValue(Constant.PAY_SETTLEMENT_CONFIG)); + } + + @GetMapping("/quick_100") + @Operation(summary = "获取快递100配置", description = "获取快递100配置") + public ServerResponseEntity getQuick100() { + Quick100 quick100 = sysConfigService.getSysConfigObject(Constant.QUICK100_CONFIG, Quick100.class); + return ServerResponseEntity.success(quick100.getIsPrint()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/OfflineHandleEventController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/OfflineHandleEventController.java new file mode 100644 index 0000000..2f3a982 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/OfflineHandleEventController.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.service.OfflineHandleEventService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 lth + * @Date 2021/5/21 15:41 + */ +@RestController("platformOfflineHandleEventController") +@RequestMapping("/p/offline_handle_event") +@Tag(name = "platform-下线处理事件信息") +public class OfflineHandleEventController { + + @Autowired + private OfflineHandleEventService offlineHandleEventService; + + @GetMapping("/getOfflineHandleEventByShopId/{shopId}/{sysType}") + @Operation(summary = "通过店铺id获取下线信息", description = "通过店铺id获取下线信息") + public ServerResponseEntity getOfflineHandleEventByShopId(@PathVariable("shopId") Long shopId, @PathVariable("sysType") Integer sysType) { + OfflineHandleEventVO offlineHandleEvent = offlineHandleEventService.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), shopId, sysType); + return ServerResponseEntity.success(offlineHandleEvent); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ScoreConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ScoreConfigController.java new file mode 100644 index 0000000..cabfe1f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ScoreConfigController.java @@ -0,0 +1,90 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.platform.dto.ScoreConfigDTO; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import com.tmerclub.cloud.platform.vo.ScoreConfigVO; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + + +/** + * 积分基本配置信息 + * @author lhd + */ +@RestController +@RequestMapping("/p/score_config") +public class ScoreConfigController { + + @Autowired + private SysConfigService sysConfigService; + + /** + * 获取配置信息 + */ + @GetMapping("/info/{key}") + public ServerResponseEntity info(@PathVariable("key") String key) { + ScoreConfigVO scoreConfig = sysConfigService.getSysConfigObject(key, ScoreConfigVO.class); + if (Objects.isNull(scoreConfig)) { + return ServerResponseEntity.success(new ScoreConfigVO()); + } + if (scoreConfig.getSignInScoreString() != null) { + List signScore = new ArrayList<>(Constant.INITIAL_CAPACITY); + String[] scores = scoreConfig.getSignInScoreString().split(StrUtil.COMMA); + for (String score : scores) { + signScore.add(Integer.valueOf(score.trim())); + } + scoreConfig.setSignInScore(signScore); + } + return ServerResponseEntity.success(scoreConfig); + } + + + /** + * 保存配置 + */ + @PostMapping + public ServerResponseEntity save(@RequestBody @Valid ScoreConfigDTO scoreConfig) { + SysConfig config = new SysConfig(); + List signInScore = scoreConfig.getSignInScore(); + if (CollectionUtil.isNotEmpty(signInScore)) { + StringBuilder signsString = new StringBuilder(Constant.INITIAL_CAPACITY); + for (Integer score : signInScore) { + signsString.append(score).append(StrUtil.COMMA); + } + signsString.deleteCharAt(signsString.length() - 1); + scoreConfig.setSignInScoreString(signsString.toString()); + scoreConfig.setSignInScore(null); + } + String paramValue = Json.toJsonString(scoreConfig); + config.setParamKey(ConfigNameConstant.SCORE_CONFIG); + config.setParamValue(paramValue); + config.setRemark(ConfigNameConstant.SCORE_REMARKS); + sysConfigService.saveOrUpdateSysConfig(config); + return ServerResponseEntity.success(); + } + + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ScoreOtherRelatedConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ScoreOtherRelatedConfigController.java new file mode 100644 index 0000000..4ac13dc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ScoreOtherRelatedConfigController.java @@ -0,0 +1,61 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + + +/** + * 其他积分相关配置 + * @author lhd + */ +@RestController +@RequestMapping("/p/score/other_related") +public class ScoreOtherRelatedConfigController { + + @Autowired + private SysConfigService sysConfigService; + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + /** + * 配置信息 + */ + @GetMapping("/info/{id}") + public ServerResponseEntity info(@PathVariable("id") String key) { + SysConfig config = sysConfigService.getByKey(key); + if (Objects.isNull(config)) { + return ServerResponseEntity.success(new SysConfig()); + } + return ServerResponseEntity.success(config); + } + + /** + * 保存or修改配置 + */ + @PostMapping + public ServerResponseEntity saveOrUpdate(@RequestBody SysConfig config) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("抱歉,当前无操作权限"); + } + sysConfigService.saveOrUpdateSysConfig(config); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ShopStatisticsController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ShopStatisticsController.java new file mode 100644 index 0000000..205db7c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/ShopStatisticsController.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +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 java.util.List; + +/** + * @author chiley + * @date 2022/9/6 14:22 + */ +@RestController("platformShopStatisticsController") +@RequestMapping("/p/shop_statistics") +@Tag(name = "platform-店铺统计信息") +public class ShopStatisticsController { + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + @Autowired + private SupplierDetailService supplierDetailService; + + @GetMapping("/count_by_shop_status") + @Operation(summary = "根据店铺状态查询店铺数量", description = "根据店铺状态查询店铺数量") + public ServerResponseEntity countByShopStatus(@RequestParam(value = "shopStatus", required = false, defaultValue = "3") Integer shopStatus) { + // 商家店铺数量 + ServerResponseEntity> shopIdsResponseEntity = shopDetailFeignClient.getShopIdsByShopStatus(shopStatus); + if (!shopIdsResponseEntity.isSuccess()) { + throw new LuckException(shopIdsResponseEntity.getMsg()); + } + List merchantShopIdList = shopIdsResponseEntity.getData(); + long merchantShopCount = 0L; + if (CollUtil.isNotEmpty(merchantShopIdList)) { + merchantShopCount = merchantShopIdList.size(); + } + // 供应商店铺数量 + List supplierIdList = supplierDetailService.getSupplierIdBySupplierStatus(shopStatus); + long supplierShopCount = 0L; + if (CollUtil.isNotEmpty(supplierIdList)) { + supplierShopCount = supplierIdList.size(); + } + return ServerResponseEntity.success(merchantShopCount + supplierShopCount); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/WebConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/WebConfigController.java new file mode 100644 index 0000000..611f7a2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/platform/WebConfigController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.model.SysConfig; +import com.tmerclub.cloud.platform.service.SysConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 网站配置信息表 + * + * @author Orange + */ +@RestController("platformWebConfigController") +@RequestMapping("/p/web_config") +@Tag(name = "网站配置信息表") +public class WebConfigController { + + @Autowired + private SysConfigService sysConfigService; + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @GetMapping("/info/{key}") + @Operation(summary = "根据key获取对应的网站配置", description = "根据key获取对应的网站配置") + public ServerResponseEntity info(@PathVariable("key") String key) { + return ServerResponseEntity.success(sysConfigService.getValue(key)); + } + + @PostMapping("/save") + @Operation(summary = "更新网站配置", description = "更新网站配置") + public ServerResponseEntity save(@RequestBody @Valid SysConfig sysConfig) { + if (BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("对不起,您没有修改网站配置的权限"); + } + if (Objects.isNull(sysConfig.getParamKey()) || Objects.isNull(sysConfig.getParamValue())) { + throw new LuckException("参数不完整,请准确填写后重试"); + } + sysConfigService.saveOrUpdateSysConfig(sysConfig); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/supplier/OfflineHandleEventController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/supplier/OfflineHandleEventController.java new file mode 100644 index 0000000..6aabc43 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/supplier/OfflineHandleEventController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.supplier; + +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.platform.service.OfflineHandleEventService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 lth + * @Date 2021/5/24 18:26 + */ +@RestController("platformOfflineHandleEvent") +@RequestMapping("/s/offline_handle_event") +@Tag(name = "supplier-下线处理事件信息") +public class OfflineHandleEventController { + + @Autowired + private OfflineHandleEventService offlineHandleEventService; + + @GetMapping("/get_event_info") + @Operation(summary = "通过供应商id获取下线信息", description = "通过供应商id获取下线信息") + public ServerResponseEntity getOfflineHandleEventByShopId() { + Long supplierId = AuthUserContext.get().getTenantId(); + if (Objects.equals(supplierId, Constant.DEFAULT_SHOP_ID)) { + return ServerResponseEntity.success(); + } + OfflineHandleEventVO offlineHandleEvent = offlineHandleEventService.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.SHOP.getValue(), supplierId, AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(offlineHandleEvent); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/supplier/SysConfigController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/supplier/SysConfigController.java new file mode 100644 index 0000000..d825221 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/controller/supplier/SysConfigController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.controller.supplier; + +import com.tmerclub.cloud.common.bean.Quick100; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.service.SysConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 track + */ +@RestController("supplierSysConfigController") +@RequestMapping("/s/ua/sys_config") +@Tag(name = "supplier-系统配置信息") +public class SysConfigController { + + @Autowired + private SysConfigService sysConfigService; + + @GetMapping("/pay_settlement_type") + @Operation(summary = "获取支付系统配置", description = "获取支付系统配置") + public ServerResponseEntity getPaySettlementType() { + return ServerResponseEntity.success(sysConfigService.getValue(Constant.PAY_SETTLEMENT_CONFIG)); + } + @GetMapping("/quick_100") + @Operation(summary = "获取快递100配置", description = "获取快递100配置") + public ServerResponseEntity getQuick100() { + Quick100 quick100 = sysConfigService.getSysConfigObject(Constant.QUICK100_CONFIG, Quick100.class); + return ServerResponseEntity.success(quick100.getIsPrint()); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/DistributionConfigDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/DistributionConfigDTO.java new file mode 100644 index 0000000..95f4f75 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/DistributionConfigDTO.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import com.tmerclub.cloud.common.util.PriceUtil; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 分销配置 + * @author cl + * @date 2021-08-06 09:25:10 + */ +public class DistributionConfigDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 分销开关: 0:关闭 1:开启 + */ + private Integer distributionSwitch; + + /** + * 客户绑定设置-业绩归属 : 0:允许绑定,关系优先 1:不绑定 分享人优先 + */ + private Integer attribution; + +// 申请条件配置------------------------------------------------------------- + /** + * 申请条件-条件审核判定: 0:人工判定 1:系统判定 + */ + private Integer autoCheck; + /** + * 申请条件-条件审核判定:购买指定商品,确认收货任意一件商品后计入 + */ + private List spuIdList; + /** + * 申请条件-条件审核判定:消费金额大于等于expenseAmount元,实付金额+积分抵扣+余额抵扣总金额,收货后计入 + * (单位: 元) + */ + @DecimalMax(value = PriceUtil.MAX_AMOUNT_STR, message = "最大不能超过" + PriceUtil.MAX_AMOUNT) + private BigDecimal expenseAmount; + /** + * 申请条件-条件审核判定:消费笔数大于等于expenseNumber次,下单次数,收货后计入 + */ + private Integer expenseNumber; + /** + *申请条件-申请所需信息:是否需要真实姓名 true 需要 false不需要 + */ + private Boolean realName; + /** + *申请条件-申请所需信息:是否需要身份证号码 true 需要 false不需要 + */ + private Boolean identityCardPic; + /** + *申请条件-申请所需信息:是否需要身份证照片 true 需要 false不需要 + */ + private Boolean identityCardNumber; + + /** + *提现发放方式: 0.无需审核直接发放,1.审核后系统发放,2.审核后人工发放 + */ + private Integer withdrawal; + +// 提现申请配置------------------------------------------------------------- + /** + * 提现频率(天) + */ + private Integer frequency; + /** + * 单笔提现最高(元) + */ + @Max(value = 20000, message = "单笔提现最高不能超过2W") + private BigDecimal amountMax; + /** + * 单笔提现最低 (元) + */ + @Max(value = 19999, message = "单笔提现最低不能超过19999元") + @Min(value = 1, message = "单笔提现最低不能低于1元") + private BigDecimal amountMin; + /** + * 打款说明 + */ + private String paymentExplain; + /** + * 提现次数 + */ + @Min(value = 0, message = "提现次数不能小于0") + private Integer number; + + public Integer getWithdrawal() { + return withdrawal; + } + + public void setWithdrawal(Integer withdrawal) { + this.withdrawal = withdrawal; + } + + public Integer getDistributionSwitch() { + return distributionSwitch; + } + + public void setDistributionSwitch(Integer distributionSwitch) { + this.distributionSwitch = distributionSwitch; + } + + public Integer getAttribution() { + return attribution; + } + + public void setAttribution(Integer attribution) { + this.attribution = attribution; + } + + public Integer getAutoCheck() { + return autoCheck; + } + + public void setAutoCheck(Integer autoCheck) { + this.autoCheck = autoCheck; + } + + public List getSpuIdList() { + return spuIdList; + } + + public void setSpuIdList(List spuIdList) { + this.spuIdList = spuIdList; + } + + public BigDecimal getExpenseAmount() { + return expenseAmount; + } + + public void setExpenseAmount(BigDecimal expenseAmount) { + this.expenseAmount = expenseAmount; + } + + public Integer getExpenseNumber() { + return expenseNumber; + } + + public void setExpenseNumber(Integer expenseNumber) { + this.expenseNumber = expenseNumber; + } + + public Boolean getRealName() { + return realName; + } + + public void setRealName(Boolean realName) { + this.realName = realName; + } + + public Boolean getIdentityCardPic() { + return identityCardPic; + } + + public void setIdentityCardPic(Boolean identityCardPic) { + this.identityCardPic = identityCardPic; + } + + public Boolean getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(Boolean identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public BigDecimal getAmountMax() { + return amountMax; + } + + public void setAmountMax(BigDecimal amountMax) { + this.amountMax = amountMax; + } + + public BigDecimal getAmountMin() { + return amountMin; + } + + public void setAmountMin(BigDecimal amountMin) { + this.amountMin = amountMin; + } + + public String getPaymentExplain() { + return paymentExplain; + } + + public void setPaymentExplain(String paymentExplain) { + this.paymentExplain = paymentExplain; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + @Override + public String toString() { + return "DistributionConfigDTO{" + + "distributionSwitch=" + distributionSwitch + + ", attribution=" + attribution + + ", autoCheck=" + autoCheck + + ", spuIdList=" + spuIdList + + ", expenseAmount=" + expenseAmount + + ", expenseNumber=" + expenseNumber + + ", realName=" + realName + + ", identityCardPic=" + identityCardPic + + ", identityCardNumber=" + identityCardNumber + + ", withdrawal=" + withdrawal + + ", frequency=" + frequency + + ", amountMax=" + amountMax + + ", amountMin=" + amountMin + + ", paymentExplain='" + paymentExplain + '\'' + + ", number=" + number + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/DistributionRecruitConfigDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/DistributionRecruitConfigDTO.java new file mode 100644 index 0000000..fc19c7a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/DistributionRecruitConfigDTO.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销招募推广配置 + * @author cl + * @date 2021-08-06 09:26:11 + */ +public class DistributionRecruitConfigDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 推广图 + */ + private String pic; + + /** + * 推广标题 + */ + @NotBlank(message = "推广标题不能为空") + private String title; + + /** + * 推广内容 + */ + @NotBlank(message = "推广内容不能为空") + private String content; + + /** + * 推广链接 + */ + private String url; + + /** + * 推广开关: 状态(0下线 1上线) + */ + private Integer state; + + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionRecruitConfigDTO{" + + "pic='" + pic + '\'' + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", url='" + url + '\'' + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/PublicBankDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/PublicBankDTO.java new file mode 100644 index 0000000..f3e485a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/PublicBankDTO.java @@ -0,0 +1,56 @@ +package com.tmerclub.cloud.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-21 + */ +public class PublicBankDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行id") + private Long bankId; + + @Schema(description = "银行名称") + private String bankName; + + @Schema(description = "银行代码") + private String bankCode; + + public Long getBankId() { + return bankId; + } + + public void setBankId(Long bankId) { + this.bankId = bankId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + @Override + public String toString() { + return "PublicBankDTO{" + + "bankId=" + bankId + + ", bankName='" + bankName + '\'' + + ", bankCode='" + bankCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysConfigDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysConfigDTO.java new file mode 100644 index 0000000..0dccee6 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/SysConfigDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 系统配置信息表DTO + * + * @author lhd + * @date 2020-12-23 16:27:57 + */ +public class SysConfigDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long id; + + @Schema(description = "key") + private String paramKey; + + @Schema(description = "value") + private String paramValue; + + @Schema(description = "备注") + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SysConfigVO{" + + "id=" + id + + ",paramKey=" + paramKey + + ",paramValue=" + paramValue + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/WebConfigDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/WebConfigDTO.java new file mode 100644 index 0000000..9994e8d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/dto/WebConfigDTO.java @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 网站配置信息表DTO + * + * @author Orange + */ +public class WebConfigDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Integer id; + + @Schema(description = "配置类型(1:平台端 2:商家端 3:PC端 4:h5端 6:供应商端)") + @NotNull(message = "配置类型不能为空") + private Integer configType; + + @Schema(description = "激活(0:否 1:是)") + @NotNull(message = "激活状态不能为空") + private Integer isActivity; + + @Schema(description = "登录logo") + private String loginLogoImg; + + @Schema(description = "登录背景(后台+pc)") + private String loginBgImg; + + @Schema(description = "版权声明-中文(后台+pc)") + private String copyrightCn; + + @Schema(description = "版权声明-英文(后台+pc)") + private String copyrightEn; + + @Schema(description = "网站标题文本-中文(后台+pc+h5)") + private String titleContentCn; + + @Schema(description = "网站标题文本-英文(后台+pc+h5)") + private String titleContentEn; + + @Schema(description = "标题图标(后台+pc)") + private String titleImg; + + @Schema(description = "后台-菜单展开时的文本-中文") + private String bsMenuTitleOpenCn; + + @Schema(description = "后台-菜单展开时的文本-英文") + private String bsMenuTitleOpenEn; + + @Schema(description = "后台-菜单缩小时的文本-中文") + private String bsMenuTitleCloseCn; + + @Schema(description = "后台-菜单缩小时的文本-英文") + private String bsMenuTitleCloseEn; + + @Schema(description = "后台-顶部栏图标") + private String bsTopBarIcon; + + @Schema(description = "PC-底部二维码") + private String pcQrcodeImg; + + @Schema(description = "PC-公司全名-中文") + private String pcCompanyNameCn; + + @Schema(description = "PC-公司全名-英文") + private String pcCompanyNameEn; + + @Schema(description = "PC-公司名简写-中文") + private String pcCompanyNameShortCn; + + @Schema(description = "PC-公司名简写-英文") + private String pcCompanyNameShortEn; + + @Schema(description = "PC-公司图文logo(注册、登录、改密时显示)") + private String pcLogoImgText; + + @Schema(description = "PC-导航栏欢迎语-中文") + private String pcWelcomeCn; + + @Schema(description = "PC-导航栏欢迎语-英文") + private String pcWelcomeEn; + + @Schema(description = "PC-底部公司地址等信息-中文") + private String pcCompanyInfoCn; + + @Schema(description = "PC-底部公司地址等信息-英文") + private String pcCompanyInfoEn; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getConfigType() { + return configType; + } + + public void setConfigType(Integer configType) { + this.configType = configType; + } + + public Integer getIsActivity() { + return isActivity; + } + + public void setIsActivity(Integer isActivity) { + this.isActivity = isActivity; + } + + public String getLoginLogoImg() { + return loginLogoImg; + } + + public void setLoginLogoImg(String loginLogoImg) { + this.loginLogoImg = loginLogoImg; + } + + public String getLoginBgImg() { + return loginBgImg; + } + + public void setLoginBgImg(String loginBgImg) { + this.loginBgImg = loginBgImg; + } + + public String getCopyrightCn() { + return copyrightCn; + } + + public void setCopyrightCn(String copyrightCn) { + this.copyrightCn = copyrightCn; + } + + public String getCopyrightEn() { + return copyrightEn; + } + + public void setCopyrightEn(String copyrightEn) { + this.copyrightEn = copyrightEn; + } + + public String getTitleContentCn() { + return titleContentCn; + } + + public void setTitleContentCn(String titleContentCn) { + this.titleContentCn = titleContentCn; + } + + public String getTitleContentEn() { + return titleContentEn; + } + + public void setTitleContentEn(String titleContentEn) { + this.titleContentEn = titleContentEn; + } + + public String getTitleImg() { + return titleImg; + } + + public void setTitleImg(String titleImg) { + this.titleImg = titleImg; + } + + public String getBsMenuTitleOpenCn() { + return bsMenuTitleOpenCn; + } + + public void setBsMenuTitleOpenCn(String bsMenuTitleOpenCn) { + this.bsMenuTitleOpenCn = bsMenuTitleOpenCn; + } + + public String getBsMenuTitleOpenEn() { + return bsMenuTitleOpenEn; + } + + public void setBsMenuTitleOpenEn(String bsMenuTitleOpenEn) { + this.bsMenuTitleOpenEn = bsMenuTitleOpenEn; + } + + public String getBsMenuTitleCloseCn() { + return bsMenuTitleCloseCn; + } + + public void setBsMenuTitleCloseCn(String bsMenuTitleCloseCn) { + this.bsMenuTitleCloseCn = bsMenuTitleCloseCn; + } + + public String getBsMenuTitleCloseEn() { + return bsMenuTitleCloseEn; + } + + public void setBsMenuTitleCloseEn(String bsMenuTitleCloseEn) { + this.bsMenuTitleCloseEn = bsMenuTitleCloseEn; + } + + public String getBsTopBarIcon() { + return bsTopBarIcon; + } + + public void setBsTopBarIcon(String bsTopBarIcon) { + this.bsTopBarIcon = bsTopBarIcon; + } + + public String getPcQrcodeImg() { + return pcQrcodeImg; + } + + public void setPcQrcodeImg(String pcQrcodeImg) { + this.pcQrcodeImg = pcQrcodeImg; + } + + public String getPcCompanyNameCn() { + return pcCompanyNameCn; + } + + public void setPcCompanyNameCn(String pcCompanyNameCn) { + this.pcCompanyNameCn = pcCompanyNameCn; + } + + public String getPcCompanyNameEn() { + return pcCompanyNameEn; + } + + public void setPcCompanyNameEn(String pcCompanyNameEn) { + this.pcCompanyNameEn = pcCompanyNameEn; + } + + public String getPcCompanyNameShortCn() { + return pcCompanyNameShortCn; + } + + public void setPcCompanyNameShortCn(String pcCompanyNameShortCn) { + this.pcCompanyNameShortCn = pcCompanyNameShortCn; + } + + public String getPcCompanyNameShortEn() { + return pcCompanyNameShortEn; + } + + public void setPcCompanyNameShortEn(String pcCompanyNameShortEn) { + this.pcCompanyNameShortEn = pcCompanyNameShortEn; + } + + public String getPcLogoImgText() { + return pcLogoImgText; + } + + public void setPcLogoImgText(String pcLogoImgText) { + this.pcLogoImgText = pcLogoImgText; + } + + public String getPcWelcomeCn() { + return pcWelcomeCn; + } + + public void setPcWelcomeCn(String pcWelcomeCn) { + this.pcWelcomeCn = pcWelcomeCn; + } + + public String getPcWelcomeEn() { + return pcWelcomeEn; + } + + public void setPcWelcomeEn(String pcWelcomeEn) { + this.pcWelcomeEn = pcWelcomeEn; + } + + public String getPcCompanyInfoCn() { + return pcCompanyInfoCn; + } + + public void setPcCompanyInfoCn(String pcCompanyInfoCn) { + this.pcCompanyInfoCn = pcCompanyInfoCn; + } + + public String getPcCompanyInfoEn() { + return pcCompanyInfoEn; + } + + public void setPcCompanyInfoEn(String pcCompanyInfoEn) { + this.pcCompanyInfoEn = pcCompanyInfoEn; + } + + @Override + public String toString() { + return "WebConfigDTO{" + + "id=" + id + + ",configType=" + configType + + ",isActivity=" + isActivity + + ",loginLogoImg=" + loginLogoImg + + ",loginBgImg=" + loginBgImg + + ",copyrightCn=" + copyrightCn + + ",copyrightEn=" + copyrightEn + + ",titleContentCn=" + titleContentCn + + ",titleContentEn=" + titleContentEn + + ",titleImg=" + titleImg + + ",bsMenuTitleOpenCn=" + bsMenuTitleOpenCn + + ",bsMenuTitleOpenEn=" + bsMenuTitleOpenEn + + ",bsMenuTitleCloseCn=" + bsMenuTitleCloseCn + + ",bsMenuTitleCloseEn=" + bsMenuTitleCloseEn + + ",bsTopBarIcon=" + bsTopBarIcon + + ",pcQrcodeImg=" + pcQrcodeImg + + ",pcCompanyNameCn=" + pcCompanyNameCn + + ",pcCompanyNameEn=" + pcCompanyNameEn + + ",pcCompanyNameShortCn=" + pcCompanyNameShortCn + + ",pcCompanyNameShortEn=" + pcCompanyNameShortEn + + ",pcLogoImgText=" + pcLogoImgText + + ",pcWelcomeCn=" + pcWelcomeCn + + ",pcWelcomeEn=" + pcWelcomeEn + + ",pcCompanyInfoCn=" + pcCompanyInfoCn + + ",pcCompanyInfoEn=" + pcCompanyInfoEn + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/CoreConfigFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/CoreConfigFeignController.java new file mode 100644 index 0000000..f6f6bc2 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/CoreConfigFeignController.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.feign; + +import com.tmerclub.cloud.common.dubbo.CoreConfigFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.platform.service.SysConfigService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author TRACK + */ +@DubboService +public class CoreConfigFeignController implements CoreConfigFeignClient { + + @Autowired + private SysConfigService sysConfigService; + + @Override + public ServerResponseEntity getConfig(String key) { + return ServerResponseEntity.success(sysConfigService.getValue(key)); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/SysUserFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/SysUserFeignController.java new file mode 100644 index 0000000..b303913 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/feign/SysUserFeignController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.feign; + +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.platform.service.SysUserService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author Citrus + * @date 2021/8/14 16:27 + */ +@DubboService +public class SysUserFeignController implements SysUserFeignClient { + + @Autowired + private SysUserService sysUserService; + + @Override + public ServerResponseEntity> getSysUserList(List userIds) { + return ServerResponseEntity.success(sysUserService.getUserNameMap(userIds)); + } + + @Override + public List getImSysUserList(List userIds) { + return sysUserService.getUserNameMap(userIds); + } + + @Override + public ServerResponseEntity getSysUserByUserId(Long userId) { + return ServerResponseEntity.success(sysUserService.getByUserId(userId)); + } + + @Override + public SysUserVO getSimpleByUserId(Long userId) { + return BeanUtil.map(sysUserService.getSimpleByUserId(userId), SysUserVO.class); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/OfflineHandleEventItemMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/OfflineHandleEventItemMapper.java new file mode 100644 index 0000000..d895066 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/OfflineHandleEventItemMapper.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventItemVO; +import com.tmerclub.cloud.platform.model.OfflineHandleEventItem; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 下线处理事件记录项 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public interface OfflineHandleEventItemMapper { + + /** + * 获取下线处理事件记录项列表 + * + * @return 下线处理事件记录项列表 + */ + List list(); + + /** + * 根据下线处理事件记录项id获取下线处理事件记录项 + * + * @param eventItemId 下线处理事件记录项id + * @return 下线处理事件记录项 + */ + OfflineHandleEventItemVO getByEventItemId(@Param("eventItemId") Long eventItemId); + + /** + * 保存下线处理事件记录项 + * + * @param offlineHandleEventItem 下线处理事件记录项 + */ + void save(@Param("offlineHandleEventItem") OfflineHandleEventItem offlineHandleEventItem); + + /** + * 更新下线处理事件记录项 + * + * @param offlineHandleEventItem 下线处理事件记录项 + */ + void update(@Param("offlineHandleEventItem") OfflineHandleEventItem offlineHandleEventItem); + + /** + * 获取最新的下线处理事件记录 + * @param eventId + * @return + */ + OfflineHandleEventItem getNewOfflineHandleEventItem(@Param("eventId") Long eventId); + + /** + * 根据事件id列表删除事件项 + * @param eventIds + */ + void deleteByEventIds(@Param("eventIds") List eventIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/PublicBankMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/PublicBankMapper.java new file mode 100644 index 0000000..de8d7bf --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/PublicBankMapper.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.platform.mapper; + +import com.tmerclub.cloud.platform.dto.PublicBankDTO; +import com.tmerclub.cloud.platform.vo.PublicBankVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-03-21 + */ +public interface PublicBankMapper { + /** + * 获取对公户银行列表 + * @param publicBankDTO + * @return + */ + List listPublicBank(@Param("publicBankDTO") PublicBankDTO publicBankDTO); + + /** + * 保存 + * @param publicBankDTO + */ + void save(@Param("publicBankDTO") PublicBankDTO publicBankDTO); + + /** + * 更新 + * @param publicBankDTO + */ + void update(@Param("publicBankDTO") PublicBankDTO publicBankDTO); + + /** + * 批量删除 + * @param bankIds + */ + void deleteByIds(@Param("bankIds") List bankIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessKeyMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessKeyMapper.java new file mode 100644 index 0000000..ceadf14 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessKeyMapper.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.platform.dto.SysAccessKeyDTO; +import com.tmerclub.cloud.platform.model.SysAccessKey; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 系统密钥 + * @author TRACK + */ +public interface SysAccessKeyMapper { + + /** + * 获取系统密钥列表 + * @param sysAccessKeyDTO + * @return 系统密钥列表 + */ + List list(@Param("sysAccessKeyDTO") SysAccessKeyDTO sysAccessKeyDTO); + + /** + * 根据系统密钥id获取系统密钥 + * @param sysAccessKeyId 系统密钥id + * @return 系统密钥 + */ + SysAccessKeyVO getBySysAccessKeyId(@Param("sysAccessKeyId") Long sysAccessKeyId); + + /** + * 根据账号id获取系统密钥 + * @param accessId 账号id + * @return 系统密钥 + */ + SysAccessKeyVO getByAccessId(@Param("accessId") String accessId); + + /** + * 保存系统密钥 + * @param sysAccessKey 系统密钥 + */ + void save(@Param("sysAccessKey") SysAccessKey sysAccessKey); + + /** + * 更新系统密钥 + * @param sysAccessKey 系统密钥 + */ + void update(@Param("sysAccessKey") SysAccessKey sysAccessKey); + + /** + * 根据系统密钥id删除系统密钥 + * @param sysAccessKeyId + */ + void deleteById(@Param("sysAccessKeyId") Long sysAccessKeyId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessMenuMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessMenuMapper.java new file mode 100644 index 0000000..f48bc75 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessMenuMapper.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2024/1/5 15:32 + */ +public interface SysAccessMenuMapper { + /** + * 根据角色id 批量添加角色与菜单关系 + * + * @param sysAccessKeyId 角色ID + * @param menuIdList 角色与菜单关系列表 + */ + void insertAccessKeyAndMenu(@Param("sysAccessKeyId") Long sysAccessKeyId, @Param("menuIdList") List menuIdList); + + /** + * 获取关联平台端菜单权限 + * + * @param sysAccessKeyId + * @return + */ + List queryAllPermsBySysMenu(@Param("sysAccessKeyId") Long sysAccessKeyId); + /** + * 获取关联商家端关联权限 + * + * @param sysAccessKeyId + * @return + */ + List queryAllPermsByShopMenu(@Param("sysAccessKeyId") Long sysAccessKeyId); + + /** + * 根据id获取关联权限 + * @param sysAccessKeyId + * @return + */ + List listMenuIdAccessId(@Param("sysAccessKeyId")Long sysAccessKeyId); + + /** + * 根据sysAccessKeyId删除关联权限 + * @param sysAccessKeyId + */ + void deleteSysAccessMenuById(@Param("sysAccessKeyId") Long sysAccessKeyId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessMenuPermissionMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessMenuPermissionMapper.java new file mode 100644 index 0000000..965e7d3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysAccessMenuPermissionMapper.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2024/1/9 10:13 + */ +public interface SysAccessMenuPermissionMapper { + /** + * 根据sysAccessKeyId获取关联资源id + * @param sysAccessKeyId + * @return + */ + List queryMenuPermsBySysAccessKeyId(@Param("sysAccessKeyId") Long sysAccessKeyId); + + /** + * 保存系统密钥关联菜单资源id + * @param menuPermsIdList + * @param sysAccessKeyId + */ + void saveSysAccessMenuPerms(@Param("sysAccessKeyId") Long sysAccessKeyId, @Param("menuPermsIdList") List menuPermsIdList); + + /** + * 根据sysAccessKeyId删除关联资源id + * @param sysAccessKeyId + */ + void deletSysAccessMenuPermsBySysAccessKeyId(@Param("sysAccessKeyId") Long sysAccessKeyId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysConfigMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysConfigMapper.java new file mode 100644 index 0000000..8634196 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/mapper/SysConfigMapper.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.mapper; + +import com.tmerclub.cloud.platform.model.SysConfig; +import org.apache.ibatis.annotations.Param; + +/** + * 系统配置信息表 + * + * @author lhd + * @date 2020-12-23 16:27:57 + */ +public interface SysConfigMapper { + + /** + * 保存系统配置信息表 + * @param sysConfig 系统配置信息表 + */ + void save(@Param("sysConfig") SysConfig sysConfig); + + /** + * 更新系统配置信息表 + * @param sysConfig 系统配置信息表 + */ + void update(@Param("sysConfig") SysConfig sysConfig); + + /** + * 根据系统配置key获取对应数量 + * @param paramKey key + * @return count + */ + int countByKey(@Param("paramKey") String paramKey); + + + /** + * 根据key,查询系统配置信息 + * @param key key + * @return SysConfig + */ + SysConfig queryByKey(@Param("key") String key); + + /** + * 根据key,更新value + * @param key + * @param value + * @return 更新成功条数 + */ + void updateValueByKey(@Param("key") String key, @Param("value") String value); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/OfflineHandleEvent.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/OfflineHandleEvent.java new file mode 100644 index 0000000..eb2cfe4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/OfflineHandleEvent.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 下线处理事件 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public class OfflineHandleEvent extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 事件id + */ + private Long eventId; + + /** + * 1 商品 2 店铺 3满减 4.优惠券 5.团购 6.分销 7.秒杀 9.自提点 + */ + private Integer handleType; + + /** + * 处理id,如果是商品就是商品id,店铺就是店铺id + */ + private Long handleId; + + /** + * 用户类型见SysTypeEnum 0.普通用户系统 1.商家端 2平台端 3供应商端 + */ + private Integer sysType; + + /** + * 关联店铺id + */ + private Long shopId; + + /** + * 处理人id + */ + private Long handlerId; + + /** + * 处理状态 1平台进行下线 2 重新申请,等待审核 3.审核通过 4 审核未通过 + */ + private Integer status; + + /** + * 下线原因 + */ + private String offlineReason; + + public Long getEventId() { + return eventId; + } + + public void setEventId(Long eventId) { + this.eventId = eventId; + } + + public Integer getHandleType() { + return handleType; + } + + public void setHandleType(Integer handleType) { + this.handleType = handleType; + } + + public Long getHandleId() { + return handleId; + } + + public void setHandleId(Long handleId) { + this.handleId = handleId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getHandlerId() { + return handlerId; + } + + public void setHandlerId(Long handlerId) { + this.handlerId = handlerId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getOfflineReason() { + return offlineReason; + } + + public void setOfflineReason(String offlineReason) { + this.offlineReason = offlineReason; + } + + @Override + public String toString() { + return "OfflineHandleEvent{" + + "eventId=" + eventId + + ", handleType=" + handleType + + ", handleId=" + handleId + + ", sysType=" + sysType + + ", shopId=" + shopId + + ", handlerId=" + handlerId + + ", status=" + status + + ", offlineReason='" + offlineReason + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/PublicBank.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/PublicBank.java new file mode 100644 index 0000000..4ad25d6 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/PublicBank.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.platform.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 对公户银行 + * @author gaozijie + * @date 2023-03-21 + */ +public class PublicBank extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 银行id + */ + private Long bankId; + /** + * 银行名称 + */ + private String bankName; + /** + * 银行代码 + */ + private String bankCode; + + public Long getBankId() { + return bankId; + } + + public void setBankId(Long bankId) { + this.bankId = bankId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + @Override + public String toString() { + return "PublicBank{" + + "bankId=" + bankId + + ", bankName='" + bankName + '\'' + + ", bankCode='" + bankCode + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessKey.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessKey.java new file mode 100644 index 0000000..21cbef4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysAccessKey.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 系统密钥 + * @author TRACK + */ +public class SysAccessKey extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long sysAccessKeyId; + + /** + * 名称 + */ + private String name; + + /** + * 备注 + */ + private String remark; + + /** + * 账号id + */ + private String accessId; + + /** + * 密钥 + */ + private String accessKey; + + /** + * 系统类型 0.c端用户 1.商家端 2.平台端 + */ + private Integer sysType; + + /** + * 密钥权限类型 0.全部权限 1.指定权限 + */ + private Integer premType; + + /** + * 密钥可用店铺id,如果为0则为所有店铺 + */ + private Long usabilityShopId; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getPremType() { + return premType; + } + + public void setPremType(Integer premType) { + this.premType = premType; + } + + public Long getUsabilityShopId() { + return usabilityShopId; + } + + public void setUsabilityShopId(Long usabilityShopId) { + this.usabilityShopId = usabilityShopId; + } + + public Long getSysAccessKeyId() { + return sysAccessKeyId; + } + + public void setSysAccessKeyId(Long sysAccessKeyId) { + this.sysAccessKeyId = sysAccessKeyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getAccessId() { + return accessId; + } + + public void setAccessId(String accessId) { + this.accessId = accessId; + } + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + @Override + public String toString() { + return "SysAccessKey{" + + "sysAccessKeyId=" + sysAccessKeyId + + ",name=" + name + + ",remark=" + remark + + ",accessId=" + accessId + + ",accessKey=" + accessKey + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",sysType=" + sysType + + ",premType=" + premType + + ",usabilityShopId=" + usabilityShopId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysConfig.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysConfig.java new file mode 100644 index 0000000..cedf1f7 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysConfig.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 系统配置信息表 + * + * @author lhd + * @date 2020-12-23 16:27:57 + */ +public class SysConfig extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long id; + + /** + * key + */ + private String paramKey; + + /** + * value + */ + private String paramValue; + + /** + * 备注 + */ + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SysConfigVO{" + + "id=" + id + + ",paramKey=" + paramKey + + ",paramValue=" + paramValue + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysUser.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysUser.java new file mode 100644 index 0000000..87f86af --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/model/SysUser.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 平台用户 + * + * @author lhd + * @date 2020-12-21 14:16:34 + */ +public class SysUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 平台用户id + */ + private Long sysUserId; + + /** + * 昵称 + */ + private String nickName; + + /** + * 头像 + */ + private String avatar; + + /** + * 员工编号 + */ + private String code; + + /** + * 联系方式 + */ + private String phoneNum; + + /** + * 是否已经设置账号 + */ + private Integer hasAccount; + + public Long getSysUserId() { + return sysUserId; + } + + public void setSysUserId(Long sysUserId) { + this.sysUserId = sysUserId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + @Override + public String toString() { + return "SysUserVO{" + + "sysUserId=" + sysUserId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",nickName=" + nickName + + ",avatar=" + avatar + + ",code=" + code + + ",phoneNum=" + phoneNum + + ",hasAccount=" + hasAccount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/OfflineHandleEventItemService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/OfflineHandleEventItemService.java new file mode 100644 index 0000000..7a8793c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/OfflineHandleEventItemService.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventItemVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.model.OfflineHandleEventItem; + +import java.util.List; + +/** + * 下线处理事件记录项 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public interface OfflineHandleEventItemService { + + /** + * 分页获取下线处理事件记录项列表 + * @param pageDTO 分页参数 + * @return 下线处理事件记录项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据下线处理事件记录项id获取下线处理事件记录项 + * + * @param eventItemId 下线处理事件记录项id + * @return 下线处理事件记录项 + */ + OfflineHandleEventItemVO getByEventItemId(Long eventItemId); + + /** + * 保存下线处理事件记录项 + * @param offlineHandleEventItem 下线处理事件记录项 + */ + void save(OfflineHandleEventItem offlineHandleEventItem); + + /** + * 更新下线处理事件记录项 + * @param offlineHandleEventItem 下线处理事件记录项 + */ + void update(OfflineHandleEventItem offlineHandleEventItem); + + + /** + * 获取最新的下线处理事件记录 + * @param eventId + * @return + */ + OfflineHandleEventItem getNewOfflineHandleEventItem(Long eventId); + + /** + * 根据事件id删除事件项 + * @param eventIds + */ + void deleteByEventIds(List eventIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/PublicBankService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/PublicBankService.java new file mode 100644 index 0000000..56387cd --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/PublicBankService.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.dto.PublicBankDTO; +import com.tmerclub.cloud.platform.vo.PublicBankVO; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-03-21 + */ +public interface PublicBankService { + /** + * 获取对公户银行列表 + * @param publicBankDTO + * @return + */ + List listPublicBank(PublicBankDTO publicBankDTO); + + /** + * 分页获取对公户银行列表 + * @param pageDTO + * @param publicBankDTO + * @return + */ + PageVO pagePublicBank(PageDTO pageDTO, PublicBankDTO publicBankDTO); + + /** + * 保存 + * @param publicBankDTO + * @return + */ + void save(PublicBankDTO publicBankDTO); + + /** + * 更新 + * @param publicBankDTO + */ + void update(PublicBankDTO publicBankDTO); + + /** + * 批量删除 + * @param bankIds + */ + void deleteByIds(List bankIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysAccessKeyService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysAccessKeyService.java new file mode 100644 index 0000000..4210833 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/SysAccessKeyService.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.dto.SysAccessKeyDTO; +import com.tmerclub.cloud.platform.model.SysAccessKey; + +/** + * 系统密钥 + * @author TRACK + */ +public interface SysAccessKeyService { + + /** + * 分页获取系统密钥列表 + * @param pageDTO 分页参数 + * @param sysAccessKeyDTO + * @return 系统密钥列表分页数据 + */ + PageVO page(PageDTO pageDTO, SysAccessKeyDTO sysAccessKeyDTO); + + /** + * 根据系统密钥id获取系统密钥 + * @param sysAccessKeyId 系统密钥id + * @return 系统密钥 + */ + SysAccessKeyVO getBySysAccessKeyId(Long sysAccessKeyId); + + /** + * 保存系统密钥 + * @param sysAccessKeyDTO 系统密钥 + */ + void save(SysAccessKeyDTO sysAccessKeyDTO); + + /** + * 更新系统密钥 + * @param sysAccessKeyDTO 系统密钥 + */ + void update(SysAccessKeyDTO sysAccessKeyDTO); + + /** + * 根据系统密钥id删除系统密钥 + * @param sysAccessKeyId 系统密钥id + */ + void deleteById(Long sysAccessKeyId); + + /** + * 删除缓存 + * @param accessId + */ + void removeCacheById(String accessId); + + /** + * 重置密钥 + * @param sysAccessKeyId + */ + void resetAccessKey(Long sysAccessKeyId); + + /** + * 根据账号id获取信息 + * @param accessId + * @return + */ + SysAccessKeyVO getByAccessId(String accessId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/WebConfigService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/WebConfigService.java new file mode 100644 index 0000000..771e819 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/WebConfigService.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.dto.WebConfigDTO; +import com.tmerclub.cloud.platform.model.WebConfig; +import com.tmerclub.cloud.platform.vo.WebConfigVO; + +/** + * 网站配置信息表 + * + * @author Orange + */ +public interface WebConfigService { + + /** + * 分页获取网站配置信息表列表 + * @param pageDTO 分页参数 + * @param webConfigDTO 搜索参数 + * @return 网站配置信息表列表分页数据 + */ + PageVO page(PageDTO pageDTO, WebConfigDTO webConfigDTO); + + /** + * 根据网站配置信息表id获取网站配置信息表 + * + * @param id 网站配置信息表id + * @return 网站配置信息表 + */ + WebConfig getById(Long id); + + /** + * 保存网站配置信息表 + * @param webConfig 网站配置信息表 + */ + void save(WebConfig webConfig); + + /** + * 更新网站配置信息表 + * @param webConfig 网站配置信息表 + */ + void update(WebConfig webConfig); + + /** + * 根据网站配置信息表id删除网站配置信息表 + * @param id 网站配置信息表id + */ + void deleteById(Long id); + + /** + * 根据网站类型修改已经激活的网站为待激活 + * @param configType 配置类型(1:平台端 2:商家端 3:PC端 4:h5端) + */ + void updateActivityState(Integer configType); + + /** + * 获取后台网站配置信息 + * @param configType 配置类型 + * @return 配置信息 + */ + WebConfigVO getActivityWebConfig(Integer configType); + + /** + * 清除网站配置信息缓存 + * @param configType 配置类型 + */ + void removeActivityWebConfig(Integer configType); + + /** + * 根据网站配置类型获取激活配置数量 + * @param configType + * @return + */ + int countByType(Integer configType); + + /** + * 根据网站配置类型获取网站配置信息 + * @param configType + * @return + */ + WebConfigVO getByConfigType(Integer configType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/OfflineHandleEventServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/OfflineHandleEventServiceImpl.java new file mode 100644 index 0000000..6a08281 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/OfflineHandleEventServiceImpl.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.platform.mapper.OfflineHandleEventMapper; +import com.tmerclub.cloud.platform.model.OfflineHandleEvent; +import com.tmerclub.cloud.platform.model.OfflineHandleEventItem; +import com.tmerclub.cloud.platform.service.OfflineHandleEventItemService; +import com.tmerclub.cloud.platform.service.OfflineHandleEventService; +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.Objects; + +/** + * 下线处理事件 + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +@Service +public class OfflineHandleEventServiceImpl implements OfflineHandleEventService { + + @Autowired + private OfflineHandleEventMapper offlineHandleEventMapper; + @Autowired + private OfflineHandleEventItemService offlineHandleEventItemService; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> offlineHandleEventMapper.list()); + } + + @Override + public OfflineHandleEventVO getByEventId(Long eventId) { + return BeanUtil.map(offlineHandleEventMapper.getByEventId(eventId), OfflineHandleEventVO.class); + } + + @Override + public void save(OfflineHandleEvent offlineHandleEvent) { + offlineHandleEvent.setShopId(AuthUserContext.get().getTenantId()); + offlineHandleEvent.setHandlerId(AuthUserContext.get().getUserId()); + offlineHandleEvent.setStatus(Objects.isNull(offlineHandleEvent.getStatus()) ? OfflineHandleEventStatus.OFFLINE_BY_PLATFORM.getValue() : offlineHandleEvent.getStatus()); + offlineHandleEventMapper.save(offlineHandleEvent); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void apply(Long eventId, String reapplyReason) { + // 更新事件为申请状态 + offlineHandleEventMapper.updateToApply(eventId); + // 添加申请记录 + OfflineHandleEventItem offlineHandleEventItem = new OfflineHandleEventItem(); + offlineHandleEventItem.setEventId(eventId); + offlineHandleEventItem.setReapplyReason(reapplyReason); + offlineHandleEventItemService.save(offlineHandleEventItem); + } + + @Override + public OfflineHandleEventVO getProcessingEventByHandleTypeAndHandleId(Integer handleType, Long handleId, Integer sysType) { + return offlineHandleEventMapper.getProcessingEventByHandleTypeAndHandleId(handleType, handleId, sysType); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateToApply(Long eventId, String reapplyReason) { + OfflineHandleEventVO eventVO = getByEventId(eventId); + boolean canApply = !Objects.equals(eventVO.getStatus(), OfflineHandleEventStatus.OFFLINE_BY_PLATFORM.getValue()) && + !Objects.equals(eventVO.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue()); + if (canApply) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + // 更新事件状态 + offlineHandleEventMapper.updateToApply(eventId); + + // 添加事件申请 + OfflineHandleEventItem offlineHandleEventItem = new OfflineHandleEventItem(); + offlineHandleEventItem.setEventId(eventId); + offlineHandleEventItem.setReapplyReason(reapplyReason); + offlineHandleEventItemService.save(offlineHandleEventItem); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void auditOfflineEvent(OfflineHandleEventDTO offlineHandleEventDTO) { + OfflineHandleEvent offlineHandleEvent = offlineHandleEventMapper.getByEventId(offlineHandleEventDTO.getEventId()); + if (Objects.isNull(offlineHandleEvent) || !Objects.equals(offlineHandleEvent.getStatus(), OfflineHandleEventStatus.APPLY_BY_SHOP.getValue())) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + // 审核通过 + if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + offlineHandleEvent.setStatus(OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue()); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + offlineHandleEvent.setStatus(OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue()); + } + Date date = new Date(); + offlineHandleEvent.setHandlerId(AuthUserContext.get().getUserId()); + offlineHandleEventMapper.update(offlineHandleEvent); + + OfflineHandleEventItem offlineHandleEventItem = offlineHandleEventItemService.getNewOfflineHandleEventItem(offlineHandleEvent.getEventId()); + if (Objects.isNull(offlineHandleEventItem)) { + return; + } + offlineHandleEventItem.setRefuseReason(offlineHandleEventDTO.getRefuseReason()); + offlineHandleEventItem.setAuditTime(date); + offlineHandleEventItemService.update(offlineHandleEventItem); + } + + @Override + public int offlineCount(Integer handleType, Long handleId, Integer sysType) { + return offlineHandleEventMapper.offlineCount(handleType, handleId, sysType); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(OfflineHandleEventDTO offlineHandleEventDto) { + OfflineHandleEvent offlineHandleEvent = BeanUtil.map(offlineHandleEventDto, OfflineHandleEvent.class); + offlineHandleEventMapper.update(offlineHandleEvent); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByHandleTypeAndHandleId(Integer handleType, Long handleId) { + List eventIds = offlineHandleEventMapper.listIdByHandleTypeAndHandleId(handleType, handleId); + if (CollUtil.isEmpty(eventIds)) { + return; + } + // 删除下线处理事件记录项 + offlineHandleEventItemService.deleteByEventIds(eventIds); + // 删除下线处理事件 + offlineHandleEventMapper.deleteByHandleTypeAndHandleId(handleType, handleId); + } + + @Override + public void batchSave(List offlineHandleEventList) { + offlineHandleEventMapper.batchSave(offlineHandleEventList); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/PublicBankServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/PublicBankServiceImpl.java new file mode 100644 index 0000000..826c3df --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/PublicBankServiceImpl.java @@ -0,0 +1,49 @@ +package com.tmerclub.cloud.platform.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.platform.dto.PublicBankDTO; +import com.tmerclub.cloud.platform.mapper.PublicBankMapper; +import com.tmerclub.cloud.platform.service.PublicBankService; +import com.tmerclub.cloud.platform.vo.PublicBankVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-03-21 + */ +@Service +public class PublicBankServiceImpl implements PublicBankService { + + @Autowired + private PublicBankMapper publicBankMapper; + + @Override + public List listPublicBank(PublicBankDTO publicBankDTO) { + return publicBankMapper.listPublicBank(publicBankDTO); + } + + @Override + public PageVO pagePublicBank(PageDTO pageDTO, PublicBankDTO publicBankDTO) { + return PageUtil.doPage(pageDTO, () -> publicBankMapper.listPublicBank(publicBankDTO)); + } + + @Override + public void save(PublicBankDTO publicBankDTO) { + publicBankMapper.save(publicBankDTO); + } + + @Override + public void update(PublicBankDTO publicBankDTO) { + publicBankMapper.update(publicBankDTO); + } + + @Override + public void deleteByIds(List bankIds) { + publicBankMapper.deleteByIds(bankIds); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysUserAccountServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysUserAccountServiceImpl.java new file mode 100644 index 0000000..e2cf1ca --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/service/impl/SysUserAccountServiceImpl.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.service.impl; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.constant.IsPassShopEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.platform.dto.ChangeAccountDTO; +import com.tmerclub.cloud.platform.mapper.SysUserMapper; +import com.tmerclub.cloud.platform.model.SysUser; +import com.tmerclub.cloud.platform.service.SysUserAccountService; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * @author lhd + * @date 2020/12/22 + */ +@Service +public class SysUserAccountServiceImpl implements SysUserAccountService { + + @Resource + private SysUserMapper sysUserMapper; + @DubboReference + private AccountFeignClient accountFeignClient; + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity save(ChangeAccountDTO changeAccountDTO) { + AuthAccountDTO authAccountDTO = getAuthAccountDTO(changeAccountDTO); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setSysType(SysTypeEnum.PLATFORM.value()); + authAccountDTO.setIsAdmin(0); + authAccountDTO.setIsPassShop(IsPassShopEnum.YES.value()); + // 保存 + ServerResponseEntity serverResponseEntity = accountFeignClient.save(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + return ServerResponseEntity.transform(serverResponseEntity); + } + SysUser sysUser = new SysUser(); + sysUser.setSysUserId(changeAccountDTO.getUserId()); + sysUser.setHasAccount(1); + sysUser.setPhoneNum(changeAccountDTO.getPhone()); + sysUserMapper.update(sysUser); + return ServerResponseEntity.success(); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity update(ChangeAccountDTO changeAccountDTO) { + + AuthAccountDTO authAccountDTO = getAuthAccountDTO(changeAccountDTO); + // 更新,不涉及分布式事务 + ServerResponseEntity serverResponseEntity = accountFeignClient.update(authAccountDTO); + if (!serverResponseEntity.isSuccess()) { + return serverResponseEntity; + } + sysUserMapper.updatePhoneNum(changeAccountDTO.getUserId(), changeAccountDTO.getPhone()); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType) { + ServerResponseEntity response = accountFeignClient.getByUserIdAndSysType(userId, sysType); + AuthAccountVO authAccountVO = response.getData(); + if (Objects.nonNull(authAccountVO) && StrUtil.isNotBlank(authAccountVO.getPhone())) { + authAccountVO.setPhone(PhoneUtil.hideBetween(authAccountVO.getPhone()).toString()); + } + return response; + } + + private AuthAccountDTO getAuthAccountDTO(ChangeAccountDTO changeAccountDTO) { + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + UidInfoBO uidInfoBO = AuthUserContext.get(); + authAccountDTO.setTenantId(uidInfoBO.getTenantId()); + authAccountDTO.setPassword(changeAccountDTO.getPassword()); + authAccountDTO.setUsername(changeAccountDTO.getUsername()); + authAccountDTO.setStatus(changeAccountDTO.getStatus()); + authAccountDTO.setSysType(uidInfoBO.getSysType()); + authAccountDTO.setUserId(changeAccountDTO.getUserId()); + authAccountDTO.setEmail(changeAccountDTO.getEmail()); + authAccountDTO.setPhone(changeAccountDTO.getPhone()); + return authAccountDTO; + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/GrowthConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/GrowthConfigVO.java new file mode 100644 index 0000000..2301614 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/GrowthConfigVO.java @@ -0,0 +1,76 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 成长配置信息 + * @author lhd + */ +public class GrowthConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 成长值获取开关 + */ + private Boolean shopGrowthSwitch; + + private Double buyPrice; + + private Double buyOrder; + + private Double recharge; + + public Boolean getShopGrowthSwitch() { + return shopGrowthSwitch; + } + + public void setShopGrowthSwitch(Boolean shopGrowthSwitch) { + this.shopGrowthSwitch = shopGrowthSwitch; + } + + public Double getBuyPrice() { + return buyPrice; + } + + public void setBuyPrice(Double buyPrice) { + this.buyPrice = buyPrice; + } + + public Double getBuyOrder() { + return buyOrder; + } + + public void setBuyOrder(Double buyOrder) { + this.buyOrder = buyOrder; + } + + public Double getRecharge() { + return recharge; + } + + public void setRecharge(Double recharge) { + this.recharge = recharge; + } + + @Override + public String toString() { + return "GrowthConfigVO{" + + "shopGrowthSwitch=" + shopGrowthSwitch + + ", buyPrice=" + buyPrice + + ", buyOrder=" + buyOrder + + ", recharge=" + recharge + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/PublicBankVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/PublicBankVO.java new file mode 100644 index 0000000..9f7b4ea --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/PublicBankVO.java @@ -0,0 +1,56 @@ +package com.tmerclub.cloud.platform.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-21 + */ +public class PublicBankVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行id") + private Long bankId; + + @Schema(description = "银行名") + private String bankName; + + @Schema(description = "银行代码") + private String bankCode; + + public Long getBankId() { + return bankId; + } + + public void setBankId(Long bankId) { + this.bankId = bankId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + @Override + public String toString() { + return "PublicBankVO{" + + "bankId=" + bankId + + ", bankName='" + bankName + '\'' + + ", bankCode='" + bankCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreCategoryConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreCategoryConfigVO.java new file mode 100644 index 0000000..f833392 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreCategoryConfigVO.java @@ -0,0 +1,83 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/30 + */ +public class ScoreCategoryConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 分类名称 + */ + private String categoryName; + + /** + * 使用上限比例 + */ + private Double useScoreLimit; + /** + * 获取上限比例 + */ + private Double getScoreLimit; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public Double getUseScoreLimit() { + return useScoreLimit; + } + + public void setUseScoreLimit(Double useScoreLimit) { + this.useScoreLimit = useScoreLimit; + } + + public Double getGetScoreLimit() { + return getScoreLimit; + } + + public void setGetScoreLimit(Double getScoreLimit) { + this.getScoreLimit = getScoreLimit; + } + + @Override + public String toString() { + return "ScoreCategoryConfigVO{" + + "categoryId=" + categoryId + + ", categoryName='" + categoryName + '\'' + + ", useScoreLimit=" + useScoreLimit + + ", getScoreLimit=" + getScoreLimit + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreConfigVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreConfigVO.java new file mode 100644 index 0000000..5ff08ec --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/platform/vo/ScoreConfigVO.java @@ -0,0 +1,183 @@ + + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.platform.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 积分配置信息 + * @author lhd + */ +public class ScoreConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 参数名 + */ + private String paramKey; + /** + * 参数值 + */ + private String paramValue; + + /** + * 签到获取积分 + */ + private String signInScoreString; + + /** + * 签到获取积分 + */ + private List signInScore; + + /** + * 注册获取积分 + */ + private Long registerScore; + + /** + * 购物开关 + */ + private Boolean shoppingScoreSwitch; + + /** + * 购物获取积分(x元获取1积分) + */ + private Long shoppingGetScore; + + /** + * 购物使用积分抵现比例(x积分抵扣1元) + */ + private Long shoppingUseScoreRatio; + + /** + * 购物积分分类获取比例上限 + */ + private Double getRatioLimit; + + /** + * 平台使用积分分类比例上限 + */ + private Double useRatioLimit; + + public Double getUseRatioLimit() { + return useRatioLimit; + } + + public void setUseRatioLimit(Double useRatioLimit) { + this.useRatioLimit = useRatioLimit; + } + + public Double getGetRatioLimit() { + return getRatioLimit; + } + + public void setGetRatioLimit(Double getRatioLimit) { + this.getRatioLimit = getRatioLimit; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getSignInScoreString() { + return signInScoreString; + } + + public void setSignInScoreString(String signInScoreString) { + this.signInScoreString = signInScoreString; + } + + public List getSignInScore() { + return signInScore; + } + + public void setSignInScore(List signInScore) { + this.signInScore = signInScore; + } + + public Long getRegisterScore() { + return registerScore; + } + + public void setRegisterScore(Long registerScore) { + this.registerScore = registerScore; + } + + public Boolean getShoppingScoreSwitch() { + return shoppingScoreSwitch; + } + + public void setShoppingScoreSwitch(Boolean shoppingScoreSwitch) { + this.shoppingScoreSwitch = shoppingScoreSwitch; + } + + public Long getShoppingGetScore() { + return shoppingGetScore; + } + + public void setShoppingGetScore(Long shoppingGetScore) { + this.shoppingGetScore = shoppingGetScore; + } + + public Long getShoppingUseScoreRatio() { + return shoppingUseScoreRatio; + } + + public void setShoppingUseScoreRatio(Long shoppingUseScoreRatio) { + this.shoppingUseScoreRatio = shoppingUseScoreRatio; + } + + @Override + public String toString() { + return "ScoreConfigVO{" + + "id=" + id + + ", paramKey='" + paramKey + '\'' + + ", paramValue='" + paramValue + '\'' + + ", signInScoreString='" + signInScoreString + '\'' + + ", signInScore=" + signInScore + + ", registerScore=" + registerScore + + ", shoppingScoreSwitch=" + shoppingScoreSwitch + + ", shoppingGetScore=" + shoppingGetScore + + ", shoppingUseScoreRatio=" + shoppingUseScoreRatio + + ", useRatioLimit=" + useRatioLimit + + ", getRatioLimit=" + getRatioLimit + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/AuditStatus.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/AuditStatus.java new file mode 100644 index 0000000..1169b6a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/AuditStatus.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * 审核状态 + * + * @author YXF + */ +public enum AuditStatus { + + /** + * 未审核 + */ + WAITAUDIT(0), + /** + * 已通过 + */ + SUCCESSAUDIT(1), + + /** + * 未通过 + */ + FAILAUDIT(-1), + + /** + * 平台下线 + */ + OFFLINE(2); + + private final Integer num; + + public Integer value() { + return num; + } + + AuditStatus(Integer num) { + this.num = num; + } + + public static AuditStatus instance(Integer value) { + AuditStatus[] enums = values(); + for (AuditStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/IsPreferred.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/IsPreferred.java new file mode 100644 index 0000000..8f73a85 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/IsPreferred.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * @Author lth + * @Date 2021/5/20 20:34 + */ +public enum IsPreferred { + /** + * 是优选好店 + */ + YES(1), + /** + * 不是优选好店 + */ + NO(0); + + private final Integer num; + + public Integer value() { + return num; + } + + IsPreferred(Integer num) { + this.num = num; + } + + public static IsPreferred instance(Integer value) { + IsPreferred[] enums = values(); + for (IsPreferred statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/NoticeType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/NoticeType.java new file mode 100644 index 0000000..4653b05 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/NoticeType.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * 供应商钱包金额类型 + * 金额类型 0 未结算金额 1可提现金额 2冻结金额 + * + * @author FrozenWatermelon + */ +public enum NoticeType { + + /** + * 平台公告 + */ + PLATFORM(1, "平台公告"), + + /** + * 商城公告 + */ + MULTI_SHOP(2, "商城公告"); + + private final Integer num; + + private final String supplierWalletAmountType; + + public Integer value() { + return num; + } + + public String getSupplierWalletAmountType() { + return supplierWalletAmountType; + } + + NoticeType(Integer num, String supplierWalletAmountType) { + this.num = num; + this.supplierWalletAmountType = supplierWalletAmountType; + } + + public static NoticeType instance(Integer value) { + NoticeType[] enums = values(); + for (NoticeType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierType.java new file mode 100644 index 0000000..acbe79e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * 供应商类型 + * + * @author YXF + */ +public enum SupplierType { + + /** + * 自营店 + */ + SELF_SHOP(1), + /** + * 其他供应商 + */ + STOP(2); + + private final Integer num; + + public Integer value() { + return num; + } + + SupplierType(Integer num) { + this.num = num; + } + + public static SupplierType instance(Integer value) { + SupplierType[] enums = values(); + for (SupplierType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletAmountType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletAmountType.java new file mode 100644 index 0000000..52f4102 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWalletAmountType.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * 供应商钱包金额类型 + * 金额类型 0 未结算金额 1可提现金额 2冻结金额 + * + * @author FrozenWatermelon + */ +public enum SupplierWalletAmountType { + + /** + * 未结算金额 + */ + UNSETTLED_AMOUNT(0, "未结算金额"), + + /** + * 可提现金额 + */ + SETTLED_AMOUNT(1, "可提现金额"), + + /** + * 冻结金额 + */ + FREEZE_AMOUNT(2, "冻结金额"), + + ; + + private final Integer num; + + private final String supplierWalletAmountType; + + public Integer value() { + return num; + } + + public String getSupplierWalletAmountType() { + return supplierWalletAmountType; + } + + SupplierWalletAmountType(Integer num, String supplierWalletAmountType) { + this.num = num; + this.supplierWalletAmountType = supplierWalletAmountType; + } + + public static SupplierWalletAmountType instance(Integer value) { + SupplierWalletAmountType[] enums = values(); + for (SupplierWalletAmountType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getAmountTypeName(Integer value) { + SupplierWalletAmountType[] enums = values(); + for (SupplierWalletAmountType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.supplierWalletAmountType; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWithdrawCashStatus.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWithdrawCashStatus.java new file mode 100644 index 0000000..c037b78 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/SupplierWithdrawCashStatus.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.constant; + +/** + * 商家提现申请信息状态 + * + * @author lth + */ + +public enum SupplierWithdrawCashStatus { + + /** + * 未通过 + */ + FAILAUDIT(-1), + + /** + * 未审核 + */ + WAITAUDIT(0), + /** + * 已通过 + */ + SUCCESSAUDIT(1), + + /** + * 发放成功 + */ + SUCCESS(2), + + /** + * 发放失败 + */ + FAIL(3); + + private final Integer num; + + public Integer value() { + return num; + } + + SupplierWithdrawCashStatus(Integer num) { + this.num = num; + } + + public static SupplierWithdrawCashStatus instance(Integer value) { + SupplierWithdrawCashStatus[] enums = values(); + for (SupplierWithdrawCashStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/WithdrawCashType.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/WithdrawCashType.java new file mode 100644 index 0000000..91d2806 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/constant/WithdrawCashType.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.supplier.constant; +/** + * @author lanhai + */ +public enum WithdrawCashType { + /** + * 周 + */ + WEEKEND(1, "每周"), + + /** + * 月 + */ + MONTH(2, "每月"), + + /** + * 年 + */ + YEAR(3, "每年"); + + private final Integer value; + + private final String date; + + public Integer value() { + return value; + } + + public String date() { + return date; + } + + WithdrawCashType(Integer value, String date) { + this.value = value; + this.date = date; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierDetailController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierDetailController.java new file mode 100644 index 0000000..d310a24 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierDetailController.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.admin; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @Author lth + * @Date 2021/8/14 16:45 + */ +@RestController("adminSupplierDetailController") +@RequestMapping("/mp/supplier_detail") +@Tag(name = "admin-供应商供应商信息") +public class SupplierDetailController { + + @Autowired + private SupplierDetailService supplierDetailService; + + @GetMapping("/check_supplier_shop_name") + @Operation(summary = "检查供应商供应商名称是否已存在", description = "检查供应商供应商名称是否已存在") + public ServerResponseEntity checkSupplierName(@RequestParam("supplierName") String supplierName) { + Boolean res = supplierDetailService.checkSupplierName(supplierName); + return ServerResponseEntity.success(res); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierWalletController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierWalletController.java new file mode 100644 index 0000000..2a819bb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierWalletController.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.supplier.dto.SupplierWalletLogSearchDTO; +import com.tmerclub.cloud.supplier.mongo.MongoSupplierWalletLogBO; +import com.tmerclub.cloud.supplier.service.SupplierWalletLogService; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import com.tmerclub.cloud.supplier.vo.SupplierWalletLogExcelVO; +import com.tmerclub.cloud.supplier.vo.SupplierWalletVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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; + +/** + * 供应商钱包日志 + * + * @author Pineapple + * @date 2021/6/8 19:46 + */ +@RestController("adminSupplierWalletController") +@RequestMapping("/mp/supplier_wallet") +@Tag(name = "admin-供应商供应商钱包") +public class SupplierWalletController { + + @Autowired + private SupplierWalletLogService supplierWalletLogService; + + @Autowired + private SupplierWalletService supplierWalletService; + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "分页查询") + public ServerResponseEntity> getSupplierWalletLogPage(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + supplierWalletLogSearchDTO.setSupplierId(AuthUserContext.get().getTenantId()); + PageVO page = supplierWalletLogService.pageByParam(pageDTO, supplierWalletLogSearchDTO); + return ServerResponseEntity.success(page); + } + + @GetMapping("/get_all_supplier_wallet") + @Operation(summary = "查看所有供应商钱包总信息") + public ServerResponseEntity getAllSupplierWalletVoBySupplierId(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + SupplierWalletVO supplierWallet = supplierWalletService.getAllSupplier(supplierWalletLogSearchDTO); + return ServerResponseEntity.success(supplierWallet); + } + + @GetMapping("/page_supplier_wallet_by_time") + @Operation(summary = "分页查看供应商钱包总信息") + public ServerResponseEntity> pageSupplierWalletByTime(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + PageVO pageSupplierWalletByTime = supplierWalletService.pageSupplierWalletByTime(pageDTO, supplierWalletLogSearchDTO); + return ServerResponseEntity.success(pageSupplierWalletByTime); + } + + @GetMapping("/page_all_supplier") + @Operation(summary = "查看所有供应商供应商的钱包记录日志") + public ServerResponseEntity> getAllSupplierWalletLogPage(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + PageVO page = supplierWalletLogService.pageAllSupplier(pageDTO, supplierWalletLogSearchDTO); + return ServerResponseEntity.success(page); + } + + @GetMapping("/get_supplier_wallet_log_form") + @Operation(summary = "导出供应商结算报表", description = "导出供应商结算报表") + public ServerResponseEntity getSupplierWalletLogForm(HttpServletResponse response, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + List list = supplierWalletLogService.listSupplierWalletLogExcel(supplierWalletLogSearchDTO); + ExcelUtil.soleExcel(response, list, SupplierWalletLogExcelVO.EXCEL_NAME, SupplierWalletLogExcelVO.MERGE_ROW_INDEX, SupplierWalletLogExcelVO.MERGE_COLUMN_INDEX, SupplierWalletLogExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_supplier_wallet") + @Operation(summary = "查看供应商钱包信息", description = "根据供应商id查看供应商钱包信息") + public ServerResponseEntity getSupplierWalletVoBySupplierId() { + SupplierWalletVO supplierWallet = supplierWalletService.getBySupplierId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(supplierWallet); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierWithdrawCashController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierWithdrawCashController.java new file mode 100644 index 0000000..df3df9f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/admin/SupplierWithdrawCashController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.admin; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.service.SupplierWithdrawCashService; +import com.tmerclub.cloud.supplier.vo.SupplierWithdrawCashVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.Objects; + +/** + * 商家提现申请信息 + * + * @Author lth + * @Date 2021/6/11 9:23 + */ +@RestController("adminSupplierWithdrawCashController") +@RequestMapping("/mp/supplier_withdraw_cash") +@Tag(name = "admin-供应商提现申请信息") +public class SupplierWithdrawCashController { + + @Autowired + private SupplierWithdrawCashService supplierWithdrawCashService; + + @GetMapping("/page") + @Operation(summary = "分页获取商家提现记录信息", description = "分页获取商家提现记录信息") + public ServerResponseEntity> page(PageDTO pageDTO, SupplierWithdrawCashDTO supplierWithdrawCashDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(supplierId, Constant.PLATFORM_SHOP_ID)) { + supplierWithdrawCashDTO.setSupplierId(supplierId); + } + PageVO pageVO = supplierWithdrawCashService.pageByParam(pageDTO, supplierWithdrawCashDTO); + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/info") + @Operation(summary = "根据提现记录id查看提现记录", description = "根据提现记录id查看提现记录") + public ServerResponseEntity getById(@RequestParam("cashId") Long cashId) { + SupplierWithdrawCashVO supplierWithdrawCashVO = supplierWithdrawCashService.getDetailByCashId(cashId); + return ServerResponseEntity.success(supplierWithdrawCashVO); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierAuditingController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierAuditingController.java new file mode 100644 index 0000000..b8b8de1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierAuditingController.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.AuditingSupplierInfoDTO; +import com.tmerclub.cloud.supplier.dto.SupplierAuditingDTO; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierAuditingService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingInfoVO; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 商家审核信息 + * + * @author YXF + * @date 2021-02-01 17:10:35 + */ +@RestController("platformSupplierAuditingController") +@RequestMapping("/p/supplier_auditing") +@Tag(name = "platform-平台审核信息") +public class SupplierAuditingController { + + @Autowired + private SupplierAuditingService supplierAuditingService; + + @Autowired + private SupplierDetailService supplierDetailService; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "分页查询") + public ServerResponseEntity> getSupplierAuditingPage(PageDTO pageDTO, AuditingSupplierInfoDTO auditingInfoDTO) { + checkAuthorized(); + return ServerResponseEntity.success(supplierAuditingService.auditingInfoPage(pageDTO, auditingInfoDTO)); + } + + @GetMapping("/{supplierId}") + @Operation(summary = "根据供应商id查询详情信息", description = "根据供应商id查询详情信息") + public ServerResponseEntity getSupplierAuditing(@PathVariable Long supplierId) { + checkAuthorized(); + SupplierAuditingVO supplierAuditing = supplierAuditingService.getBySupplierId(supplierId); + if (Objects.isNull(supplierAuditing)) { + supplierAuditing = new SupplierAuditingVO(); + } + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + supplierApiDetailVO.setContactPhone(PhoneUtil.hideBetween(supplierApiDetailVO.getContactPhone()).toString()); + if (PrincipalUtil.isMobile(supplierApiDetailVO.getSupplierAccount())) { + supplierApiDetailVO.setSupplierAccount(PhoneUtil.hideBetween(supplierApiDetailVO.getSupplierAccount()).toString()); + } + if (Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OFFLINE.value())) { + supplierAuditing.setStatus(AuditStatus.OFFLINE.value()); + } else if (Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OFFLINE_AWAIT_AUDIT.value()) || Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OPEN_AWAIT_AUDIT.value())) { + supplierAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + } + ServerResponseEntity responseEntity = accountFeignClient.getAccountInfoByTenantId(supplierId, SysTypeEnum.SUPPLIER.value()); + if (responseEntity.isSuccess() && Objects.nonNull(responseEntity.getData())) { + AuthAccountVO authAccountVO = responseEntity.getData(); + supplierApiDetailVO.setSupplierAccount(authAccountVO.getPhone()); + supplierApiDetailVO.setAccountStatus(authAccountVO.getStatus()); + } + supplierAuditing.setSupplierDetail(supplierApiDetailVO); + return ServerResponseEntity.success(supplierAuditing); + } + + @PutMapping("/audit") + @Operation(summary = "审核信息(审核供应商)", description = "审核信息(审核供应商)") + public ServerResponseEntity audit(@Valid @RequestBody SupplierAuditingDTO supplierAuditingDTO) { + if (supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("开启通联后,平台无需审核供应商"); + } + checkAuthorized(); + supplierDetailService.audit(supplierAuditingDTO); + supplierDetailService.removeCacheBySupplierId(supplierAuditingDTO.getSupplierId()); + + return ServerResponseEntity.success(); + } + + /** + * 校验权限 + */ + private void checkAuthorized() { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierWithdrawCashController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierWithdrawCashController.java new file mode 100644 index 0000000..f62192e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/platform/SupplierWithdrawCashController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.platform; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashConfigDto; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.service.SupplierWithdrawCashService; +import com.tmerclub.cloud.supplier.vo.SupplierWithdrawCashVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Author lth + * @Date 2021/6/11 9:28 + */ +@RestController("platformSupplierWithdrawCashController") +@RequestMapping("/p/supplier_withdraw_cash") +@Tag(name = "platform-供应商提现申请信息") +public class SupplierWithdrawCashController { + + @Autowired + private SupplierWithdrawCashService supplierWithdrawCashService; + + @GetMapping("/info") + @Operation(summary = "根据提现记录id查看提现记录", description = "根据提现记录id查看提现记录") + public ServerResponseEntity getById(@RequestParam("cashId") Long cashId) { + SupplierWithdrawCashVO supplierWithdrawCashVO = supplierWithdrawCashService.getDetailByCashId(cashId); + return ServerResponseEntity.success(supplierWithdrawCashVO); + } + + @PutMapping("/audit") + @Operation(summary = "审核供应商提现信息", description = "审核供应商提现信息") + public ServerResponseEntity audit(@RequestBody SupplierWithdrawCashDTO supplierWithdrawCashDTO) { + supplierWithdrawCashService.auditWithdrawCash(supplierWithdrawCashDTO, AuthUserContext.get().getUserId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/save") + @Operation(summary = "设置提现金额", description = "设置提现金额") + public ServerResponseEntity saveWithdrawCashConfig(@RequestBody SupplierWithdrawCashConfigDto supplierWithdrawCashConfigDto) { + supplierWithdrawCashService.saveConfig(supplierWithdrawCashConfigDto); + return ServerResponseEntity.success(); + } + + @GetMapping("/getWithdrawCash") + public ServerResponseEntity getWithdrawCashConfig() { + return ServerResponseEntity.success(supplierWithdrawCashService.getConfig()); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/ApplySupplierUserController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/ApplySupplierUserController.java new file mode 100644 index 0000000..2dca22b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/ApplySupplierUserController.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierUserSimpleVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 lth + * @Date 2021/5/12 20:27 + */ +@RequestMapping("/s/apply_supplier/supplier_user") +@RestController("supplierSupplierUserController") +@Tag(name = "supplier-供应商用户信息") +public class ApplySupplierUserController { + + @Autowired + private SupplierDetailService supplierDetailService; + + @GetMapping("/info") + @Operation(summary = "登录供应商用户信息", description = "获取当前登录供应商用户的用户信息") + public ServerResponseEntity info() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + SupplierUserSimpleVO supplierUserSimple = new SupplierUserSimpleVO(); + supplierUserSimple.setIsAdmin(uidInfoBO.getIsAdmin()); + supplierUserSimple.setIsPassShop(uidInfoBO.getIsPassShop()); + supplierUserSimple.setTenantId(uidInfoBO.getTenantId()); + supplierUserSimple.setUserId(uidInfoBO.getUserId()); + supplierUserSimple.setUserName(uidInfoBO.getUsername()); + if (!Objects.equals(uidInfoBO.getTenantId(), Constant.DEFAULT_SUPPLIER_ID)) { + SupplierApiDetailVO supplierDetail = supplierDetailService.getBySupplierId(uidInfoBO.getTenantId()); + supplierUserSimple.setAvatar(supplierDetail.getSupplierLogo()); + supplierUserSimple.setSupplierName(supplierDetail.getSupplierName()); + } + return ServerResponseEntity.success(supplierUserSimple); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierCompanyController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierCompanyController.java new file mode 100644 index 0000000..e89854a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierCompanyController.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.model.SupplierCompany; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierCompanyService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/25 16:31 + */ +@RestController +@RequestMapping("/s/apply_supplier/supplier_company") +@Tag(name = "supplier-供应商工商信息") +public class SupplierCompanyController { + + @Autowired + private SupplierCompanyService supplierCompanyService; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + @Autowired + private SupplierDetailService supplierDetailService; + @Autowired + private SupplierDetailMapper supplierDetailMapper; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @PostMapping + @Operation(summary = "新增供应商工商信息", description = "新增供应商工商信息") + public ServerResponseEntity save(@Valid @RequestBody SupplierCompanyDTO supplierCompanyDTO) { + Long supplierId = this.getSupplierId(); + checkAllinpay(supplierCompanyDTO); + SupplierCompany supplierCompany = BeanUtil.map(supplierCompanyDTO, SupplierCompany.class); + supplierCompany.setSupplierId(supplierId); + supplierCompany.setStatus(AuditStatus.WAITAUDIT.value()); + supplierCompanyService.save(supplierCompany, true); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "供应商更新工商信息,仅在申请开店时调用", description = "供应商更新工商信息") + public ServerResponseEntity update(@Valid @RequestBody SupplierCompanyDTO supplierCompanyDTO) { + checkAllinpay(supplierCompanyDTO); + SupplierCompany supplierCompany = BeanUtil.map(supplierCompanyDTO, SupplierCompany.class); + supplierCompany.setStatus(AuditStatus.WAITAUDIT.value()); + supplierCompanyService.checkInfo(supplierCompany, false, null); + supplierCompanyService.update(supplierCompany); + return ServerResponseEntity.success(); + } + + @PostMapping("/storage") + @Operation(summary = "存储供应商工商信息", description = "存储供应商工商信息,已存在则更新,不存在则新增") + public ServerResponseEntity storage(@Valid @RequestBody SupplierCompanyDTO supplierCompanyDTO) { + Long supplierId = this.getSupplierId(); + checkAllinpay(supplierCompanyDTO); + SupplierCompanyVO supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + SupplierCompany supplierCompany = BeanUtil.map(supplierCompanyDTO, SupplierCompany.class); + supplierCompany.setSupplierId(supplierId); + supplierCompany.setStatus(AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(supplierCompanyVO)) { + // 不存在,新增 + supplierCompanyService.save(supplierCompany, true); + } else { + // 已存在,更新 + supplierCompany.setSupplierCompanyId(supplierCompanyVO.getSupplierCompanyId()); + supplierCompanyService.checkInfo(supplierCompany, false, null); + supplierCompanyService.update(supplierCompany); + } + return ServerResponseEntity.success(); + } + + @GetMapping + @Operation(summary = "获取供应商工商信息") + @Parameter(name = "status", description = "审核状态:1:已通过 0待审核 -1未通过") + public ServerResponseEntity getSupplierCompanyBySupplierId(@RequestParam(value = "status", required = false, defaultValue = "1") Integer status) { + Long supplierId = this.getSupplierId(); + Integer isPassShop = AuthUserContext.get().getIsPassShop(); + if (Objects.equals(isPassShop, StatusEnum.DISABLE.value())) { + status = AuditStatus.WAITAUDIT.value(); + } + if (supplierAllinpayService.getIsAllinpay()) { + // 影印件还没通过审核 + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (!Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + status = AuditStatus.WAITAUDIT.value(); + } + } + return ServerResponseEntity.success(supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, status)); + } + + @PutMapping("/update_acct_protocol_no") + @Operation(summary = "更新供应商账户协议编号") + @Parameters({ + @Parameter(name = "signAcctType", description = "签约类型 1.个人 2.法人 3.企业"), + @Parameter(name = "acctProtocolNo", description = "账户提现协议编号") + }) + public ServerResponseEntity updateAcctProtocolNo(@RequestParam("signAcctType") Integer signAcctType, + @RequestParam("acctProtocolNo") String acctProtocolNo) { + Long supplier = this.getSupplierId(); + // 企业会员-“企业名称”“法人姓名”变更后,需重新签约。 + supplierDetailMapper.updateAcctProtocolNoByType(supplier, signAcctType, acctProtocolNo); + supplierDetailService.removeCacheBySupplierId(supplier); + return ServerResponseEntity.success(); + } + + + private Long getSupplierId() { + Long supplierId = AuthUserContext.get().getTenantId(); + if (Objects.equals(supplierId, Constant.DEFAULT_SUPPLIER_ID)) { + throw new LuckException("供应商不存在"); + } + return supplierId; + } + + private void checkAllinpay(SupplierCompanyDTO supplierCompanyDTO) { + boolean needInfo = Objects.isNull(supplierCompanyDTO.getLegalIds()) || Objects.isNull(supplierCompanyDTO.getLegalPhone()); + if (supplierAllinpayService.getIsAllinpay() && needInfo) { + throw new LuckException("开店所需要提交的信息有所变更,请重新填写"); + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierUserRegisterController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierUserRegisterController.java new file mode 100644 index 0000000..65e1ab3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/controller/supplier/SupplierUserRegisterController.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.controller.supplier; + +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.dto.SupplierUserRegisterDTO; +import com.tmerclub.cloud.supplier.service.SupplierUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @author lth + */ +@RestController("supplierSupplierUserRegisterController") +@RequestMapping("/ua/supplier_user_register") +@Tag(name = "supplier-供应商账户注册") +public class SupplierUserRegisterController { + + @Autowired + private SupplierUserService supplierUserService; + + @DubboReference + private ConfigFeignClient configFeignClient; + + + @Operation(summary = "账户注册") + @PostMapping + public ServerResponseEntity register(@Valid @RequestBody SupplierUserRegisterDTO supplierRegisterDTO) { + // 创建并保存用户信息 + supplierUserService.register(supplierRegisterDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "获取供应商注册协议") + @GetMapping("/get_supplier_register_protocol") + public ServerResponseEntity getSupplierRegisterProtocol() { + Integer dbLang = I18nMessage.getLang(); + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), dbLang)) { + return configFeignClient.getConfig(ConfigNameConstant.SUPPLIER_REGISTER_PROTOCOL_CN); + } else { + return configFeignClient.getConfig(ConfigNameConstant.SUPPLIER_REGISTER_PROTOCOL_EN); + } + } + + @Operation(summary = "获取供应商合作协议") + @GetMapping("/get_supplier_protocol") + public ServerResponseEntity getSupplierProtocol() { + Integer dbLang = I18nMessage.getLang(); + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), dbLang)) { + return configFeignClient.getConfig(ConfigNameConstant.SUPPLIER_SHOP_PROTOCOL_CN); + } else { + return configFeignClient.getConfig(ConfigNameConstant.SUPPLIER_SHOP_PROTOCOL_EN); + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AllinpaySupplierBankCardDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AllinpaySupplierBankCardDTO.java new file mode 100644 index 0000000..f0989e1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/AllinpaySupplierBankCardDTO.java @@ -0,0 +1,128 @@ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 企业会员绑定对公户 + * @author LGH + */ +public class AllinpaySupplierBankCardDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "企业对公账户 AES加密", requiredMode = Schema.RequiredMode.REQUIRED) + private String accountNo; + + @Schema(description = "开户银行名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String parentBankName; + + @Schema(description = "开户行地区代码 非必填") + private String bankCityNo; + + @Schema(description = "开户支行名称 \t如:“中国工商银行股份有限公司北京樱桃园支行”", requiredMode = Schema.RequiredMode.REQUIRED) + private String bankName; + + @Schema(description = "支付行号 12位数字", requiredMode = Schema.RequiredMode.REQUIRED) + private String unionBank; + + @Schema(description = "开户行所在省 开户行所在市必须同时上送 非必填") + private String province; + + @Schema(description = "开户行所在市 开户行所在省必须同时上送 非必填") + private String city; + + @Schema(description = "银行卡属性 0法人 1企业对公") + private Integer bankCardPro; + + @Schema(description = "供应商id") + private Long supplierId; + + public String getAccountNo() { + return accountNo; + } + + public void setAccountNo(String accountNo) { + this.accountNo = accountNo; + } + + public String getParentBankName() { + return parentBankName; + } + + public void setParentBankName(String parentBankName) { + this.parentBankName = parentBankName; + } + + public String getBankCityNo() { + return bankCityNo; + } + + public void setBankCityNo(String bankCityNo) { + this.bankCityNo = bankCityNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "AllinpaySupplierBankCardDTO{" + + "accountNo='" + accountNo + '\'' + + ", parentBankName='" + parentBankName + '\'' + + ", bankCityNo='" + bankCityNo + '\'' + + ", bankName='" + bankName + '\'' + + ", unionBank='" + unionBank + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", bankCardPro=" + bankCardPro + + ", supplierId=" + supplierId + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/ChangeAccountDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/ChangeAccountDTO.java new file mode 100644 index 0000000..c8932b1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/ChangeAccountDTO.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +public class ChangeAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "用户id不能为空") + @Schema(description = "用户id") + private Long userId; + + @NotBlank(message = "用户名不能为空") + @Schema(description = "用户名") + private String username; + + @Schema(description = "密码") + private String password; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Override + public String toString() { + return "ChangeAccountDTO{" + + "userId=" + userId + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", status=" + status + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/PurchaseAmountLogDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/PurchaseAmountLogDTO.java new file mode 100644 index 0000000..02a9bb1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/PurchaseAmountLogDTO.java @@ -0,0 +1,101 @@ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +public class PurchaseAmountLogDTO { + + @Schema(description = "商家id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "采购订单id") + private Long purchaseOrderId; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "起始时间") + private LocalDateTime startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "结束时间") + private LocalDateTime endTime; + + /** + * 系统类型 + * @see com.tmerclub.cloud.common.constant.SysTypeEnum + */ + @Hidden + private Integer sysType; + + public PurchaseAmountLogDTO() { + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public LocalDateTime getStartTime() { + return startTime; + } + + public void setStartTime(LocalDateTime startTime) { + this.startTime = startTime; + } + + public LocalDateTime getEndTime() { + return endTime; + } + + public void setEndTime(LocalDateTime endTime) { + this.endTime = endTime; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + @Override + public String toString() { + return "PurchaseAmountLogDTO{" + + "shopId=" + shopId + + ", supplierId=" + supplierId + + ", purchaseOrderId=" + purchaseOrderId + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierAccountDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierAccountDTO.java new file mode 100644 index 0000000..1264e1c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierAccountDTO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/5/21 14:07 + */ +public class SupplierAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "密码") + private String password; + + @Schema(description = "供应商id") + private Long supplierId; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "SupplierAccountDTO{" + + "password='" + password + '\'' + + ", supplierId='" + supplierId + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierAuditingDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierAuditingDTO.java new file mode 100644 index 0000000..3b581f0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierAuditingDTO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商审核信息DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierAuditingDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商审核id") + private Long supplierAuditingId; + + @Schema(description = "申请人id") + private Long userId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "供应商类型1自营店 2普通店") + private Integer supplierType; + + @Schema(description = "0 未审核 1已通过 -1未通过 2平台下线 3 平台下线待审核") + private Integer status; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public Integer getSupplierType() { + return supplierType; + } + + public void setSupplierType(Integer supplierType) { + this.supplierType = supplierType; + } + + public Long getSupplierAuditingId() { + return supplierAuditingId; + } + + public void setSupplierAuditingId(Long supplierAuditingId) { + this.supplierAuditingId = supplierAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SupplierAuditingDTO{" + + "supplierAuditingId=" + supplierAuditingId + + ", userId=" + userId + + ", supplierId=" + supplierId + + ", auditorId=" + auditorId + + ", supplierType=" + supplierType + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCompanyAuditingDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCompanyAuditingDTO.java new file mode 100644 index 0000000..3d597fb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCompanyAuditingDTO.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 工商信息审核记录 + * + * @author chiley + * @date 2022/9/1 16:16 + */ + +public class SupplierCompanyAuditingDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 工商信息审核id + */ + private Long companyAuditingId; + /** + * 申请人id + */ + @Schema(description = "申请人id") + private String userId; + + /** + * 供应商id + */ + @Schema(description = "供应商id") + private Long supplierId; + + /** + * 工商信息id + */ + @Schema(description = "工商信息id") + private Long supplierCompanyId; + + /** + * 供应商名称 + */ + @Schema(description = "供应商名称") + private String supplierName; + + /** + * 审核人id + */ + @Schema(description = "审核人id") + private Long auditorId; + + /** + * 0 未审核 1已通过 -1未通过 + */ + @Schema(description = "0 未审核 1已通过 -1未通过") + private Integer status; + + @Schema(description = "申请起始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + + @Schema(description = "申请结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "备注") + private String remarks; + + public SupplierCompanyAuditingDTO() { + + } + + public SupplierCompanyAuditingDTO(Long companyAuditingId, Integer status, String remarks) { + this.companyAuditingId = companyAuditingId; + this.status = status; + this.remarks = remarks; + } + + public Long getCompanyAuditingId() { + return companyAuditingId; + } + + public void setCompanyAuditingId(Long companyAuditingId) { + this.companyAuditingId = companyAuditingId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getSupplierCompanyId() { + return supplierCompanyId; + } + + public void setSupplierCompanyId(Long supplierCompanyId) { + this.supplierCompanyId = supplierCompanyId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBeginTime() { + return beginTime; + } + + public void setBeginTime(Date beginTime) { + this.beginTime = beginTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SupplierCompanyAuditingDTO{" + + "companyAuditingId=" + companyAuditingId + + ", userId='" + userId + '\'' + + ", supplierId=" + supplierId + + ", supplierCompanyId=" + supplierCompanyId + + ", supplierName='" + supplierName + '\'' + + ", auditorId=" + auditorId + + ", status=" + status + + ", beginTime=" + beginTime + + ", endTime=" + endTime + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCompanyDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCompanyDTO.java new file mode 100644 index 0000000..4014cff --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierCompanyDTO.java @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商工商信息DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierCompanyDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商工商信息id") + private Long supplierCompanyId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "统一社会信用代码") + private String creditCode; + + @Schema(description = "企业名称") + private String firmName; + + @Schema(description = "住所") + private String residence; + + @Schema(description = "法定代表人") + private String representative; + + @Schema(description = "法人身份证号") + private String legalIds; + + @Schema(description = "法人手机号码") + private String legalPhone; + + @Schema(description = "注册资本(万元)") + private Double capital; + + @Schema(description = "成立日期") + private Date foundTime; + + @Schema(description = "营业起始日期") + private Date startTime; + + @Schema(description = "营业终止日期") + private Date endTime; + + @Schema(description = "经营范围") + private String businessScope; + + @Schema(description = "营业执照") + private String businessLicense; + + @Schema(description = "身份证正面") + private String identityCardFront; + + @Schema(description = "身份证反面") + private String identityCardLater; + + public Long getSupplierCompanyId() { + return supplierCompanyId; + } + + public void setSupplierCompanyId(Long supplierCompanyId) { + this.supplierCompanyId = supplierCompanyId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getCreditCode() { + return creditCode; + } + + public void setCreditCode(String creditCode) { + this.creditCode = creditCode; + } + + public String getFirmName() { + return firmName; + } + + public void setFirmName(String firmName) { + this.firmName = firmName; + } + + public String getResidence() { + return residence; + } + + public void setResidence(String residence) { + this.residence = residence; + } + + public String getRepresentative() { + return representative; + } + + public void setRepresentative(String representative) { + this.representative = representative; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public Double getCapital() { + return capital; + } + + public void setCapital(Double capital) { + this.capital = capital; + } + + public Date getFoundTime() { + return foundTime; + } + + public void setFoundTime(Date foundTime) { + this.foundTime = foundTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getBusinessLicense() { + return businessLicense; + } + + public void setBusinessLicense(String businessLicense) { + this.businessLicense = businessLicense; + } + + public String getIdentityCardFront() { + return identityCardFront; + } + + public void setIdentityCardFront(String identityCardFront) { + this.identityCardFront = identityCardFront; + } + + public String getIdentityCardLater() { + return identityCardLater; + } + + public void setIdentityCardLater(String identityCardLater) { + this.identityCardLater = identityCardLater; + } + + @Override + public String toString() { + return "SupplierCompanyDTO{" + + "supplierCompanyId=" + supplierCompanyId + + ", supplierId=" + supplierId + + ", creditCode='" + creditCode + '\'' + + ", firmName='" + firmName + '\'' + + ", residence='" + residence + '\'' + + ", representative='" + representative + '\'' + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + ", capital=" + capital + + ", foundTime=" + foundTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", businessScope='" + businessScope + '\'' + + ", businessLicense='" + businessLicense + '\'' + + ", identityCardFront='" + identityCardFront + '\'' + + ", identityCardLater='" + identityCardLater + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierDetailDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierDetailDTO.java new file mode 100644 index 0000000..7166842 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierDetailDTO.java @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.*; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商详情DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierDetailDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "系统类型 1商家端 2平台端 3供应商端") + private Integer sysType; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商名称") + @NotBlank(message = "供应商名称不能为空") + @Length(min = 2, max = 30, message = "供应商名称限制在2到30个字符之间") + private String supplierName; + + @Schema(description = "供应商供应商名称") + private String supplierShopName; + + @Schema(description = "联系人姓名") + @NotBlank(message = "联系人不能为空") + @Length(min = 2, max = 10, message = "联系人姓名需要在2到10个字符之间") + private String contactName; + + @Schema(description = "联系方式") + @NotBlank(message = "联系方式不能为空") + private String contactPhone; + + @Schema(description = "供应商简介") + @Length(max = 200, message = "供应商简介字符不能超过200") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "供应商logo(可修改)") + private String supplierLogo; + + @Schema(description = "供应商状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:供应商申请中 5:上线申请待审核)") + private Integer supplierStatus; + + @Schema(description = "备注信息") + private String remarks; + + @Schema(description = "是否优选好店 1.是 0.不是") + @Max(value = 1, message = "只能为0或1") + @Min(value = 0, message = "只能为0或1") + private Integer isPreferred; + + @Schema(description = "账号名", requiredMode = Schema.RequiredMode.REQUIRED) + private String username; + + @Size(max = 64) + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED) + private String password; + + @Size(max = 15) + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) + private String phone; + + @Schema(description = "验证码", requiredMode = Schema.RequiredMode.REQUIRED) + private String code; + + @Schema(description = "移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "pc背景图") + private String pcBackgroundPic; + + @Schema(description = "供应商中的商品数量") + @Max(value = 5, message = "最多只能返回5个商品") + @Min(value = 0, message = "spuNum不能小于0") + private Integer spuNum; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "支付系统类型 0默认 1通联") + private Integer paySysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierShopName() { + return supplierShopName; + } + + public void setSupplierShopName(String supplierShopName) { + this.supplierShopName = supplierShopName; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Integer getSpuNum() { + return spuNum; + } + + public void setSpuNum(Integer spuNum) { + this.spuNum = spuNum; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "SupplierDetailDTO{" + + "sysType=" + sysType + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", supplierShopName='" + supplierShopName + '\'' + + ", contactName='" + contactName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", supplierStatus=" + supplierStatus + + ", remarks='" + remarks + '\'' + + ", isPreferred=" + isPreferred + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", phone='" + phone + '\'' + + ", code='" + code + '\'' + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", spuNum=" + spuNum + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierRefundAddrDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierRefundAddrDTO.java new file mode 100644 index 0000000..ef60e54 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierRefundAddrDTO.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商退货地址DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierRefundAddrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商退货地址id") + private Long supplierRefundAddrId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "默认地址 1:是 0:不是") + private Integer isDefault; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getSupplierRefundAddrId() { + return supplierRefundAddrId; + } + + public void setSupplierRefundAddrId(Long supplierRefundAddrId) { + this.supplierRefundAddrId = supplierRefundAddrId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "SupplierRefundAddrDTO{" + + "supplierRefundAddrId=" + supplierRefundAddrId + + ",supplierId=" + supplierId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",addr=" + addr + + ",postCode=" + postCode + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierSigningInfoDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierSigningInfoDTO.java new file mode 100644 index 0000000..5ee50de --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierSigningInfoDTO.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @Author lth + * @Date 2021/7/16 8:43 + */ +public class SupplierSigningInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "签约起始时间") + @NotNull(message = "签约起始时间不能为空") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "供应商类型 1自营店 2普通店") + @Max(value = 2, message = "只能为1或2") + @Min(value = 1, message = "只能为1或2") + private Integer type; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "SupplierSigningInfoDTO{" + + "supplierId=" + supplierId + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", supplierType=" + type + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierUserRegisterDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierUserRegisterDTO.java new file mode 100644 index 0000000..6d55651 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierUserRegisterDTO.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lth + */ +@Schema(description = "商家注册信息") +public class SupplierUserRegisterDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "密码") + @NotBlank(message = "密码不能为空") + private String password; + + @Schema(description = "手机号") + @NotBlank(message = "手机号不能为空") + private String mobile; + + @Schema(description = "用户名") + @NotBlank(message = "用户名不能为空") + private String username; + + @Schema(description = "验证码") + @NotBlank(message = "验证码不能为空") + private String validCode; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + @Override + public String toString() { + return "ShopUserRegisterDTO{" + + "password='" + password + '\'' + + ", mobile='" + mobile + '\'' + + ", userName='" + username + '\'' + + ", validCode='" + validCode + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletLogSearchDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletLogSearchDTO.java new file mode 100644 index 0000000..2aa18f8 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWalletLogSearchDTO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author Pineapple + * @date 2021/6/8 19:56 + */ +public class SupplierWalletLogSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收支类型 0支出 1收入") + private Integer ioType; + + @Schema(description = "金额类型 0 未结算金额 1可提现金额 2冻结金额") + private Integer amountType; + + @Schema(description = "原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝") + private Integer reason; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "供应商id列表,勾选导出") + private List supplierIds; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + public Integer getSortType() { + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + @Override + public String toString() { + return "SupplierWalletLogSearchDTO{" + + "ioType=" + ioType + + ", amountType=" + amountType + + ", reason=" + reason + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", supplierIds=" + supplierIds + + ", sortType=" + sortType + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWithdrawCashConfigDto.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWithdrawCashConfigDto.java new file mode 100644 index 0000000..37978c6 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWithdrawCashConfigDto.java @@ -0,0 +1,53 @@ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class SupplierWithdrawCashConfigDto implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "最少提现金额") + private Double WithdrawCashLeast; + @Schema(description = "最多提现金额") + private Double WithdrawCashMax; + @Schema(description = "提现金额频率") + private Integer frequency; + @Schema(description = "提现金额次数") + private Integer number; + + public Double getWithdrawCashLeast() { + return WithdrawCashLeast; + } + + public void setWithdrawCashLeast(Double withdrawCashLeast) { + WithdrawCashLeast = withdrawCashLeast; + } + + public Double getWithdrawCashMax() { + return WithdrawCashMax; + } + + public void setWithdrawCashMax(Double withdrawCashMax) { + WithdrawCashMax = withdrawCashMax; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWithdrawCashDTO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWithdrawCashDTO.java new file mode 100644 index 0000000..906c908 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/dto/SupplierWithdrawCashDTO.java @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商提现申请信息DTO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWithdrawCashDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现id") + private Long cashId; + + @Schema(description = "支付系统类型0默认1通联") + private Integer paySysType; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "审核人id") + private Long auditorId; + + @Schema(description = "提现金额") + private Long amount; + + @Schema(description = "审核时间") + private Date auditingTime; + + @Schema(description = "状态(0:未审核、1:已通过 -1:未通过 2:发放成功 3:发放失败)") + private Integer status; + + @Schema(description = "平台备注") + private String remarks; + + @Schema(description = "供应商备注") + private String supplierRemarks; + + @Schema(description = "付款户名") + private String payingAccount; + + @Schema(description = "汇款账户") + private String payingCardNo; + + @Schema(description = "汇款时间") + private Date payingTime; + + @Schema(description = "收款银行卡id") + private Long supplierBankCardId; + + @Schema(description = "验证码") + private String validCode; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "通联提现状态 0.待支付 1.申请成功(还没确认) 2.提现成功 3.提现失败") + private Integer allinpayStatus; + + @Schema(description = "通联提现订单号") + private String bizOrderNo; + + @Schema(description = "提现失败原因") + private String payFailMessage; + + public Long getCashId() { + return cashId; + } + + public void setCashId(Long cashId) { + this.cashId = cashId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getAuditorId() { + return auditorId; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getSupplierRemarks() { + return supplierRemarks; + } + + public void setSupplierRemarks(String supplierRemarks) { + this.supplierRemarks = supplierRemarks; + } + + public String getPayingAccount() { + return payingAccount; + } + + public void setPayingAccount(String payingAccount) { + this.payingAccount = payingAccount; + } + + public String getPayingCardNo() { + return payingCardNo; + } + + public void setPayingCardNo(String payingCardNo) { + this.payingCardNo = payingCardNo; + } + + public Date getPayingTime() { + return payingTime; + } + + public void setPayingTime(Date payingTime) { + this.payingTime = payingTime; + } + + public Long getSupplierBankCardId() { + return supplierBankCardId; + } + + public void setSupplierBankCardId(Long supplierBankCardId) { + this.supplierBankCardId = supplierBankCardId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Integer getAllinpayStatus() { + return allinpayStatus; + } + + public void setAllinpayStatus(Integer allinpayStatus) { + this.allinpayStatus = allinpayStatus; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + @Override + public String toString() { + return "SupplierWithdrawCashDTO{" + + "cashId=" + cashId + + ", paySysType=" + paySysType + + ", supplierId=" + supplierId + + ", auditorId=" + auditorId + + ", amount=" + amount + + ", auditingTime=" + auditingTime + + ", status=" + status + + ", remarks='" + remarks + '\'' + + ", supplierRemarks='" + supplierRemarks + '\'' + + ", payingAccount='" + payingAccount + '\'' + + ", payingCardNo='" + payingCardNo + '\'' + + ", payingTime=" + payingTime + + ", supplierBankCardId=" + supplierBankCardId + + ", validCode='" + validCode + '\'' + + ", supplierName='" + supplierName + '\'' + + ", allinpayStatus=" + allinpayStatus + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierBankCardFeignController.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierBankCardFeignController.java new file mode 100644 index 0000000..0a989fe --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/feign/SupplierBankCardFeignController.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.feign; + +import com.tmerclub.cloud.api.supplier.feign.SupplierBankCardFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.supplier.mapper.SupplierBankCardMapper; +import com.tmerclub.cloud.supplier.model.SupplierBankCard; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Objects; + +/** + * @author track + */ +@DubboService +public class SupplierBankCardFeignController implements SupplierBankCardFeignClient { + + @Autowired + private SupplierBankCardMapper supplierBankCardMapper; + + @Override + public void saveBandCardByAllinpay(String tenantId, SupplierBankCardVO supplierBankCardVO) { + SupplierBankCard supplierBankCard = new SupplierBankCard(); + BeanUtils.copyProperties(supplierBankCardVO, supplierBankCard); + supplierBankCard.setSupplierId(Long.valueOf(tenantId.substring(AllinpayConstant.SUPPLIER_LENGTH))); + supplierBankCard.setStatus(StatusEnum.ENABLE.value()); + supplierBankCardMapper.save(supplierBankCard); + } + + @Override + public ServerResponseEntity deleteLegalBankCard(Long supplierBankCardId) { + SupplierBankCardVO supplierBankCardVO = supplierBankCardMapper.getBySupplierBankCardId(supplierBankCardId); + if (Objects.nonNull(supplierBankCardVO) && Objects.equals(supplierBankCardVO.getBankCardPro(), 1)) { + throw new LuckException("企业对公户不支持解绑"); + } + supplierBankCardMapper.deleteById(supplierBankCardId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/AddPurchaseLogConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/AddPurchaseLogConsumer.java new file mode 100644 index 0000000..eacb896 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/AddPurchaseLogConsumer.java @@ -0,0 +1,46 @@ +package com.tmerclub.cloud.supplier.listener; + +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.PurchaseAmountLogBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.supplier.mongo.MongoPurchaseAmountLogBO; +import com.tmerclub.cloud.supplier.service.PurchaseAmountLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ADD_PURCHASE_AMOUNT_LOG_TOPIC, consumerGroup = RocketMqConstant.ADD_PURCHASE_AMOUNT_LOG_TOPIC) +public class AddPurchaseLogConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(AddPurchaseLogConsumer.class); + + @Autowired + private PurchaseAmountLogService purchaseAmountLogService; + + @Autowired + private SegmentManager segmentManager; + + @Override + public void onMessage(PurchaseAmountLogBO purchaseAmountLogBO) { + LOG.info("通知添加采购金额日志至MongoDB开始... message: {}", Json.toJsonString(purchaseAmountLogBO)); + MongoPurchaseAmountLogBO mongoPurchaseAmountLogBO = new MongoPurchaseAmountLogBO(); + BeanUtils.copyProperties(purchaseAmountLogBO, mongoPurchaseAmountLogBO); + mongoPurchaseAmountLogBO.setCreateTime(LocalDateTime.now()); + mongoPurchaseAmountLogBO.setPurchaseLogId(segmentManager.getSegmentId(DistributedIdKey.PURCHASE_AMOUNT_LOG)); + purchaseAmountLogService.savePurchaseLog(mongoPurchaseAmountLogBO); + LOG.info("添加采购金额日志结束"); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/AddSupplierWalletLogConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/AddSupplierWalletLogConsumer.java new file mode 100644 index 0000000..d1b291e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/AddSupplierWalletLogConsumer.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.supplier.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.supplier.mongo.MongoSupplierWalletLogBO; +import com.tmerclub.cloud.supplier.service.SupplierWalletLogService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 添加供应商钱包日志至MongoDB + * @author 菠萝凤梨 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, consumerGroup = RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC) +public class AddSupplierWalletLogConsumer implements RocketMQListener> { + private static final Logger LOG = LoggerFactory.getLogger(AddSupplierWalletLogConsumer.class); + + @Autowired + private SupplierWalletLogService supplierWalletLogService; + + @Override + public void onMessage(List message) { + LOG.info("通知添加供应商钱包日志至MongoDB开始... message: {}", Json.toJsonString(message)); + supplierWalletLogService.saveMongoBatch(message); + LOG.info("添加供应商钱包日志结束"); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OpenAllinpaySupplierConsumer.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OpenAllinpaySupplierConsumer.java new file mode 100644 index 0000000..bb7bc69 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/listener/OpenAllinpaySupplierConsumer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.OPEN_ALLINPAY_TOPIC,consumerGroup = RocketMqConstant.OPEN_ALLINPAY_SUPPLIER_TOPIC) +public class OpenAllinpaySupplierConsumer implements RocketMQListener { + private static final Logger LOGGER = LoggerFactory.getLogger(OpenAllinpaySupplierConsumer.class); + @Autowired + private SupplierDetailService supplierDetailService; + + /** + * 开启通联,供应商批量创建会员 + */ + @Override + public void onMessage(Integer paySysType) { + LOGGER.info("供应商开始批量创建会员"); + supplierDetailService.createAllinpayMember(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierAuditingMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierAuditingMapper.java new file mode 100644 index 0000000..204fd85 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierAuditingMapper.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.supplier.dto.AuditingSupplierInfoDTO; +import com.tmerclub.cloud.supplier.model.SupplierAuditing; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingInfoVO; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 供应商审核信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierAuditingMapper { + + /** + * 获取商家审核信息列表 + * + * @return 商家审核信息列表 + */ + List list(); + + /** + * 根据商家审核信息id获取商家审核信息 + * + * @param supplierAuditingId 商家审核信息id + * @return 商家审核信息 + */ + SupplierAuditingVO getBySupplierAuditingId(@Param("supplierAuditingId") Long supplierAuditingId); + + /** + * 保存商家审核信息 + * + * @param supplierAuditing 商家审核信息 + */ + void save(@Param("supplierAuditing") SupplierAuditing supplierAuditing); + + /** + * 更新商家审核信息 + * + * @param supplierAuditing 商家审核信息 + */ + void update(@Param("supplierAuditing") SupplierAuditing supplierAuditing); + + /** + * 根据商家审核信息id删除商家审核信息 + * + * @param supplierAuditingId + */ + void deleteById(@Param("supplierAuditingId") Long supplierAuditingId); + + /** + * 获取指定供应商的申请信息 + * + * @param supplierId + * @return + */ + SupplierAuditingVO getBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 获取供应商申请列表 + * @param auditingInfoDTO + * @return + */ + List auditingInfoList(@Param("auditingInfo") AuditingSupplierInfoDTO auditingInfoDTO); + + /** + * 更新开店失败 + * @param supplierIds + */ + void updateToFail(@Param("supplierIds") List supplierIds); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierBankCardMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierBankCardMapper.java new file mode 100644 index 0000000..bf97240 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierBankCardMapper.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.supplier.dto.SupplierBankCardDTO; +import com.tmerclub.cloud.supplier.model.SupplierBankCard; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 银行卡信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierBankCardMapper { + + /** + * 根据银行卡信息id获取银行卡信息 + * + * @param supplierBankCardId 银行卡信息id + * @return 银行卡信息 + */ + SupplierBankCardVO getBySupplierBankCardId(@Param("supplierBankCardId") Long supplierBankCardId); + + /** + * 保存银行卡信息 + * @param supplierBankCard 银行卡信息 + */ + void save(@Param("supplierBankCard") SupplierBankCard supplierBankCard); + + /** + * 更新银行卡信息 + * @param supplierBankCard 银行卡信息 + */ + void update(@Param("supplierBankCard") SupplierBankCard supplierBankCard); + + /** + * 根据银行卡信息id删除银行卡信息 + * @param supplierBankCardId + */ + void deleteById(@Param("supplierBankCardId") Long supplierBankCardId); + + /** + * 根据供应商id获取银行卡列表 + * @param supplierId + * @return + */ + List listBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 批量插入供应商银行卡信息 + * @param supplierBankCardDTOList + * @param supplierId + */ + void insertBatch(@Param("supplierBankCardList") List supplierBankCardDTOList, @Param("supplierId") Long supplierId); + + /** + * 根据供应商id批量删除该供应商下的银行卡信息 + * @param supplierId + */ + void deleteBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 设置银行卡为主账号 + * @param supplierBankCardId + * @param supplierId + */ + void setPrimary(@Param("supplierBankCardId") Long supplierBankCardId, @Param("supplierId") Long supplierId); + + /** + * 设置银行卡不为主账号 + * @param supplierBankCardId + * @param supplierId + */ + void setNotPrimary(@Param("supplierBankCardId") Long supplierBankCardId, @Param("supplierId") Long supplierId); + + /** + * 根据供应商id统计银行卡数量 + * @param supplierId + * @return + */ + int countBySupplierId(Long supplierId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierCompanyAuditingMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierCompanyAuditingMapper.java new file mode 100644 index 0000000..d12fa13 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierCompanyAuditingMapper.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + + +import com.tmerclub.cloud.supplier.dto.SupplierCompanyAuditingDTO; +import com.tmerclub.cloud.supplier.model.SupplierCompanyAuditing; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyAuditingVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + * @author chiley + * @date 2022/9/13 14:42 + */ + +public interface SupplierCompanyAuditingMapper { + + /** + * 根据信息id获取供应商工商审核信息 + * + * @param supplierCompanyAuditingId 供应商工商审核信息id + * @return 供应商工商审核信息 + */ + SupplierCompanyAuditing getById(@Param("supplierCompanyAuditingId") Long supplierCompanyAuditingId); + + /** + * 新增供应商工商审核信息 + * @param supplierCompanyAuditing 供应商工商审核信息 + */ + void insert(@Param("supplierCompanyAuditing") SupplierCompanyAuditing supplierCompanyAuditing); + + /** + * 更新供应商工商审核信息 + * @param supplierCompanyAuditing 供应商工商审核信息 + */ + void update(@Param("supplierCompanyAuditing") SupplierCompanyAuditing supplierCompanyAuditing); + + /** + * 根据供应商工商信息id删除供应商工商信息 + * @param supplierCompanyAuditingId + */ + void deleteById(@Param("supplierCompanyAuditingId") Long supplierCompanyAuditingId); + + /** + * 根据供应商id获取最近一条工商审核信息 + * @param supplierId + * @return + */ + SupplierCompanyAuditingVO getLatestAuditingBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 获取待审核的工商信息 + * + * @param supplierCompanyAuditingDTO 搜索参数 + * @return + */ + List list(@Param("supplierCompanyAuditingDTO") SupplierCompanyAuditingDTO supplierCompanyAuditingDTO); + + + /** + * 获取需要审核驳回的工商申请 + * @return + */ + List getNeedAuditList(); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierExtensionMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierExtensionMapper.java new file mode 100644 index 0000000..e430dfc --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierExtensionMapper.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.supplier.model.SupplierExtension; +import com.tmerclub.cloud.supplier.vo.SupplierExtensionVO; +import org.apache.ibatis.annotations.Param; + +/** + * 供应商扩张信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierExtensionMapper { + + + /** + * 保存供应商扩张信息 + * @param supplierExtension 供应商扩张信息 + */ + void save(@Param("supplierExtension") SupplierExtension supplierExtension); + + /** + * 更新供应商扩张信息 + * @param supplierExtension 供应商扩张信息 + */ + void update(@Param("supplierExtension") SupplierExtensionVO supplierExtension); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierRefundAddrMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierRefundAddrMapper.java new file mode 100644 index 0000000..50109f3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierRefundAddrMapper.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.supplier.dto.SupplierRefundAddrDTO; +import com.tmerclub.cloud.supplier.model.SupplierRefundAddr; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 供应商退货地址 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierRefundAddrMapper { + + /** + * 获取商家退货地址列表 + * @param supplierRefundAddrDTO + * @return 商家退货地址列表 + */ + List list(@Param("supplierRefundAddr") SupplierRefundAddrDTO supplierRefundAddrDTO); + + /** + * 根据商家退货地址id获取商家退货地址 + * + * @param supplierRefundAddrId 商家退货地址id + * @param supplierId + * @return 商家退货地址 + */ + SupplierApiRefundAddrVO getBySupplierRefundAddrId(@Param("supplierRefundAddrId") Long supplierRefundAddrId, @Param("supplierId") Long supplierId); + + /** + * 保存商家退货地址 + * + * @param supplierRefundAddr 商家退货地址 + */ + void save(@Param("supplierRefundAddr") SupplierRefundAddr supplierRefundAddr); + + /** + * 更新商家退货地址 + * + * @param supplierRefundAddr 商家退货地址 + */ + void update(@Param("supplierRefundAddr") SupplierRefundAddr supplierRefundAddr); + + /** + * 根据商家退货地址id删除商家退货地址 + * + * @param supplierRefundAddrId + */ + void deleteById(@Param("supplierRefundAddrId") Long supplierRefundAddrId); + + /** + * 获取供应商退货地址 + * + * @param supplierId 供应商id + * @return 供应商退货地址 + */ + List listBySupplierId(@Param("supplierId") Long supplierId); + + /** + * 清除默认地址 + * + * @param supplierId + */ + void cancelDefaultAddr(@Param("supplierId") Long supplierId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierWalletMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierWalletMapper.java new file mode 100644 index 0000000..01d3605 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierWalletMapper.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.supplier.dto.SupplierWalletLogSearchDTO; +import com.tmerclub.cloud.supplier.model.SupplierWallet; +import com.tmerclub.cloud.supplier.vo.SupplierWalletVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 供应商钱包信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierWalletMapper { + + /** + * 保存商家钱包信息 + * + * @param supplierWallet 商家钱包信息 + */ + void save(@Param("supplierWallet") SupplierWallet supplierWallet); + + /** + * 根据供应商id获取钱包信息 + * + * @param supplierId 供应商id + * @param paySysType + * @return 钱包信息 + */ + SupplierWalletVO getBySupplierId(@Param("supplierId") Long supplierId, @Param("paySysType") Integer paySysType); + + /** + * 给商家钱包,添加未结算金额 + * + * @param supplierId 供应商id + * @param changeAmount + * @param paySysType + * @return + */ + int addUnsettledAmount(@Param("supplierId") Long supplierId, @Param("changeAmount") Long changeAmount, @Param("paySysType") Integer paySysType); + + /** + * 给供应商钱包,添加结算金额 + * + * @param supplierId 供应商id + * @param settledAmount + * @param paySysType + * @param isUpdateTotal + * @return + */ + int addSettledAmount(@Param("supplierId") Long supplierId, + @Param("settledAmount") Long settledAmount, + @Param("paySysType") Integer paySysType, + @Param("isUpdateTotal") boolean isUpdateTotal); + + /** + * 给供应商钱包,减少结算金额 + * + * @param supplierId 供应商id + * @param settledAmount + * @param paySysType + * @return + */ + int subSettledAmount(@Param("supplierId") Long supplierId, @Param("settledAmount") Long settledAmount, @Param("paySysType") Integer paySysType); + + /** + * 锁定未结算金额 + * + * @param supplierId + * @param supplierRealRefundAmount + * @param paySysType + * @return + */ + int subUnsettledAmount(@Param("supplierId") Long supplierId, @Param("supplierRealRefundAmount") Long supplierRealRefundAmount, @Param("paySysType") Integer paySysType); + + /** + * 提现申请的时候增加冻结金额 + * @param supplierId 供应商id + * @param changeAmount 冻结金额 + * @param paySysType + * @return + */ + int addFreezeAmount(@Param("supplierId") Long supplierId, @Param("changeAmount") Long changeAmount, @Param("paySysType") Integer paySysType); + + /** + * 提现申请通过的时候/提现申请被拒绝的时候减少冻结金额 + * @param supplierId 供应商id + * @param changeAmount 冻结金额 + * @param paySysType + * @return + */ + int subFreezeAmount(@Param("supplierId") Long supplierId, @Param("changeAmount") Long changeAmount, @Param("paySysType") Integer paySysType); + + /** + * 获取所有商家钱包信息 + * @param supplierWalletLogSearchDTO + * @param paySysType + * @return 钱包信息 + */ + SupplierWalletVO getAllSupplier(@Param("supplierWalletLogSearchDTO") SupplierWalletLogSearchDTO supplierWalletLogSearchDTO, @Param("paySysType") Integer paySysType); + + /** + * 分页获取供应商钱包 + * @param supplierWalletLogSearchDTO + * @param paySysType + * @return + */ + List listAllSupplierWallet(@Param("supplierWalletLogSearchDTO") SupplierWalletLogSearchDTO supplierWalletLogSearchDTO, @Param("paySysType") Integer paySysType); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierWithdrawCashMapper.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierWithdrawCashMapper.java new file mode 100644 index 0000000..8231da3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mapper/SupplierWithdrawCashMapper.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.mapper; + +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.model.SupplierWithdrawCash; +import com.tmerclub.cloud.supplier.vo.SupplierWithdrawCashVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 供应商提现申请信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierWithdrawCashMapper { + + /** + * 根据提现单号查询 + * @param bizOrderNo + * @return + */ + SupplierWithdrawCash getByBizOrderNo(@Param("bizOrderNo") String bizOrderNo); + + /** + * 保存商家提现申请信息 + * @param supplierWithdrawCash 商家提现申请信息 + */ + void save(@Param("supplierWithdrawCash") SupplierWithdrawCash supplierWithdrawCash); + + /** + * 更新商家提现申请信息 + * @param supplierWithdrawCash 商家提现申请信息 + */ + void update(@Param("supplierWithdrawCash") SupplierWithdrawCash supplierWithdrawCash); + + /** + * 根据银行卡id与商家提现申请状态获取商家提现申请数量 + * @param supplierBankCardId 银行卡id + * @param status 提现申请状态 + * @return + */ + int countBySupplierBandCardIdAndStatus(@Param("supplierBankCardId") Long supplierBankCardId, @Param("status") Integer status); + + /** + * 根据参数获取提现记录列表 + * @param supplierWithdrawCashDTO 搜索筛选参数 + * @return 提现记录列表 + */ + List listByParam(@Param("supplierWithdrawCash") SupplierWithdrawCashDTO supplierWithdrawCashDTO); + + /** + * 根据id获取提现申请详情信息 + * @param cashId + * @return + */ + SupplierWithdrawCashVO getDetailByCashId(@Param("cashId") Long cashId); + + /** + * 根据id与状态更新提现申请信息 + * @param supplierWithdrawCash + * @param cashId + * @param status + * @return + */ + int updateByIdAndStatus(@Param("supplierWithdrawCash") SupplierWithdrawCash supplierWithdrawCash, @Param("cashId") Long cashId, @Param("status") Integer status); + + /** + * 计算提现频率 + * @param startTimes + * @param endTimes + * @param supplierWithdrawCash + * @return + */ + int getWithdrawCashCount(@Param("startTimes") Date startTimes, @Param("endTimes") Date endTimes, @Param("supplierWithdrawCash") SupplierWithdrawCash supplierWithdrawCash); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierAuditing.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierAuditing.java new file mode 100644 index 0000000..694f2e9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierAuditing.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 供应商审核信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierAuditing extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商审核id + */ + private Long supplierAuditingId; + + /** + * 申请人id + */ + private Long userId; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 审核人id + */ + private Long auditorId; + + /** + * 0 未审核 1已通过 -1未通过 + */ + private Integer status; + + /** + * 备注 + */ + private String remarks; + + public Long getSupplierAuditingId() { + return supplierAuditingId; + } + + public void setSupplierAuditingId(Long supplierAuditingId) { + this.supplierAuditingId = supplierAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SupplierAuditing{" + + "supplierAuditingId=" + supplierAuditingId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",supplierId=" + supplierId + + ",auditorId=" + auditorId + + ",status=" + status + + ",remarks=" + remarks + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierBankCard.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierBankCard.java new file mode 100644 index 0000000..1a64a3b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierBankCard.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 银行卡信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierBankCard extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 银行卡自增id + */ + private Long supplierBankCardId; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 银行名称 + */ + private String bankName; + + /** + * 银行开户行 + */ + private String openingBank; + + /** + * 收款方户名 + */ + private String recipientName; + + /** + * 收款方账户 + */ + private String cardNo; + + /** + * 是否默认 1:默认 0:非默认 + */ + private Integer isDefault; + + /** + * 支行名称 + */ + private String branchName; + + /** + * 银行卡号 + */ + private String bankCardNo; + + /** + * 银行卡/账户属性 0个人银行卡 1企业对公账户 + */ + private Integer bankCardPro; + + /** + * 支付行号 + */ + private String unionBank; + + /** + * 1.正常,-1.已删除 + */ + private Integer status; + + public Long getSupplierBankCardId() { + return supplierBankCardId; + } + + public void setSupplierBankCardId(Long supplierBankCardId) { + this.supplierBankCardId = supplierBankCardId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getOpeningBank() { + return openingBank; + } + + public void setOpeningBank(String openingBank) { + this.openingBank = openingBank; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + @Override + public String toString() { + return "SupplierBankCard{" + + "supplierBankCardId=" + supplierBankCardId + + ", supplierId=" + supplierId + + ", bankName='" + bankName + '\'' + + ", openingBank='" + openingBank + '\'' + + ", recipientName='" + recipientName + '\'' + + ", cardNo='" + cardNo + '\'' + + ", isDefault=" + isDefault + + ", branchName='" + branchName + '\'' + + ", bankCardNo='" + bankCardNo + '\'' + + ", bankCardPro=" + bankCardPro + + ", unionBank='" + unionBank + '\'' + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierCompany.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierCompany.java new file mode 100644 index 0000000..5a3a42a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierCompany.java @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商工商信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierCompany extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商工商信息id + */ + private Long supplierCompanyId; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 统一社会信用代码 + */ + private String creditCode; + + /** + * 企业名称 + */ + private String firmName; + + /** + * 住所 + */ + private String residence; + + /** + * 法定代表人 + */ + private String representative; + + /** + * 法人身份证号 + */ + private String legalIds; + + /** + * 法人手机号 + */ + private String legalPhone; + + /** + * 注册资本(万元) + */ + private Double capital; + + /** + * 成立日期 + */ + private Date foundTime; + + /** + * 营业起始日期 + */ + private Date startTime; + + /** + * 营业终止日期 + */ + private Date endTime; + + /** + * 经营范围 + */ + private String businessScope; + + /** + * 营业执照 + */ + private String businessLicense; + + /** + * 身份证正面 + */ + private String identityCardFront; + + /** + * 身份证反面 + */ + private String identityCardLater; + + /** + * 审核状态:1:已通过 0待审核 -1未通过 + */ + private Integer status; + + + public Long getSupplierCompanyId() { + return supplierCompanyId; + } + + public void setSupplierCompanyId(Long supplierCompanyId) { + this.supplierCompanyId = supplierCompanyId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getCreditCode() { + return creditCode; + } + + public void setCreditCode(String creditCode) { + this.creditCode = creditCode; + } + + public String getFirmName() { + return firmName; + } + + public void setFirmName(String firmName) { + this.firmName = firmName; + } + + public String getResidence() { + return residence; + } + + public void setResidence(String residence) { + this.residence = residence; + } + + public String getRepresentative() { + return representative; + } + + public void setRepresentative(String representative) { + this.representative = representative; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public Double getCapital() { + return capital; + } + + public void setCapital(Double capital) { + this.capital = capital; + } + + public Date getFoundTime() { + return foundTime; + } + + public void setFoundTime(Date foundTime) { + this.foundTime = foundTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getBusinessLicense() { + return businessLicense; + } + + public void setBusinessLicense(String businessLicense) { + this.businessLicense = businessLicense; + } + + public String getIdentityCardFront() { + return identityCardFront; + } + + public void setIdentityCardFront(String identityCardFront) { + this.identityCardFront = identityCardFront; + } + + public String getIdentityCardLater() { + return identityCardLater; + } + + public void setIdentityCardLater(String identityCardLater) { + this.identityCardLater = identityCardLater; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SupplierCompany{" + + "supplierCompanyId=" + supplierCompanyId + + ", supplierId=" + supplierId + + ", creditCode='" + creditCode + '\'' + + ", firmName='" + firmName + '\'' + + ", residence='" + residence + '\'' + + ", representative='" + representative + '\'' + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + ", capital=" + capital + + ", foundTime=" + foundTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", businessScope='" + businessScope + '\'' + + ", businessLicense='" + businessLicense + '\'' + + ", identityCardFront='" + identityCardFront + '\'' + + ", identityCardLater='" + identityCardLater + '\'' + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierCompanyAuditing.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierCompanyAuditing.java new file mode 100644 index 0000000..847b5e1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierCompanyAuditing.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 工商信息审核记录 + * + * @author chiley + * @date 2022/9/1 15:52 + */ +public class SupplierCompanyAuditing extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 工商信息审核id + */ + private Long companyAuditingId; + + /** + * 申请人id + */ + private Long userId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 工商信息id + */ + private Long supplierCompanyId; + /** + * 审核人id + */ + private Long auditorId; + + /** + * 0 未审核 1已通过 -1未通过 + */ + private Integer status; + + /** + * 备注 + */ + private String remarks; + + public Long getCompanyAuditingId() { + return companyAuditingId; + } + + public void setCompanyAuditingId(Long companyAuditingId) { + this.companyAuditingId = companyAuditingId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getSupplierCompanyId() { + return supplierCompanyId; + } + + public void setSupplierCompanyId(Long supplierCompanyId) { + this.supplierCompanyId = supplierCompanyId; + } + + public Long getAuditorId() { + return auditorId; + } + + public void setAuditorId(Long auditorId) { + this.auditorId = auditorId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SupplierCompanyAuditing{" + + "companyAuditingId=" + companyAuditingId + + ", userId='" + userId + '\'' + + ", supplierId=" + supplierId + + ", supplierCompanyId=" + supplierCompanyId + + ", auditorId=" + auditorId + + ", status=" + status + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierExtension.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierExtension.java new file mode 100644 index 0000000..ed75d4e --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierExtension.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 供应商扩张信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierExtension extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long supplierExtensionId; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 供应商商品总销量 + */ + private Integer saleNum; + + public Long getSupplierExtensionId() { + return supplierExtensionId; + } + + public void setSupplierExtensionId(Long supplierExtensionId) { + this.supplierExtensionId = supplierExtensionId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + @Override + public String toString() { + return "SupplierExtension{" + + "supplierExtensionId=" + supplierExtensionId + + ",supplierId=" + supplierId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",saleNum=" + saleNum + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierRefundAddr.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierRefundAddr.java new file mode 100644 index 0000000..0e9043f --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/model/SupplierRefundAddr.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 供应商退货地址 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierRefundAddr extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 供应商退货地址id + */ + private Long supplierRefundAddrId; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 手机 + */ + private String mobile; + + /** + * 默认地址 1:是 0:不是 + */ + private Integer isDefault; + + /** + * 收货人 + */ + private String consignee; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 地址 + */ + private String addr; + + /** + * 邮编 + */ + private String postCode; + + /** + * 经度 + */ + private Double lng; + + /** + * 纬度 + */ + private Double lat; + + public Long getSupplierRefundAddrId() { + return supplierRefundAddrId; + } + + public void setSupplierRefundAddrId(Long supplierRefundAddrId) { + this.supplierRefundAddrId = supplierRefundAddrId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "SupplierRefundAddr{" + + "supplierRefundAddrId=" + supplierRefundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",supplierId=" + supplierId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",addr=" + addr + + ",postCode=" + postCode + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mongo/MongoSupplierWalletLogBO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mongo/MongoSupplierWalletLogBO.java new file mode 100644 index 0000000..c7e6b51 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/mongo/MongoSupplierWalletLogBO.java @@ -0,0 +1,239 @@ +package com.tmerclub.cloud.supplier.mongo; + +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.Date; + +/** + * 对应MongoDB存储供应商钱包日志emp + * @author 菠萝凤梨 + */ +@CompoundIndexes({ + @CompoundIndex(name = "supplierId_reason_idx", def = "{'supplierId':1, 'reason':1}"), + @CompoundIndex(name = "order_idx", def = "{'orderId':1}") +}) +@Document("supplier_wallet_log") +public class MongoSupplierWalletLogBO { + + @Id + @Schema(description = "供应商钱包id") + private Long walletLogId; + + @Schema(description = "供应商id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long supplierId; + + /** + * 支付系统类型 + * @see PaySysType + */ + @Schema(description = "支付系统类型", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer paySysType; + + @Schema(description = "关联订单id") + private Long orderId; + + @Schema(description = "关联退款单id") + private Long refundId; + + @Schema(description = "收支类型 0支出 1收入") + private Integer ioType; + + @Schema(description = "金额类型 0 未结算金额 1可提现金额 2冻结金额") + private Integer amountType; + + @Schema(description = "改变金额") + private Long changeAmount; + + @Schema(description = "原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝") + private Integer reason; + + @Schema(description = "用户金额(支付实付金额,退款实际申请金额)") + private Long userAmount; + + @Schema(description = "平台补贴金额") + private Long platformAmount; + + @Schema(description = "分销占用金额") + private Long distributionAmount; + + @Schema(description = "平台佣金") + private Long platformCommission; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + //----mongodb没有的字段----- + + @Schema(description = "运费") + private Long freightAmount; + + @Schema(description = "供应商名称") + private String supplierName; + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getUserAmount() { + return userAmount; + } + + public void setUserAmount(Long userAmount) { + this.userAmount = userAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + @Override + public String toString() { + return "MongoSupplierWalletLogBO{" + + "walletLogId=" + walletLogId + + ", supplierId=" + supplierId + + ", paySysType=" + paySysType + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", ioType=" + ioType + + ", amountType=" + amountType + + ", changeAmount=" + changeAmount + + ", reason=" + reason + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", freightAmount=" + freightAmount + + ", supplierName='" + supplierName + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierAllinpayService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierAllinpayService.java new file mode 100644 index 0000000..75fc264 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierAllinpayService.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.supplier.service; + +/** + * @author TRACK + */ +public interface SupplierAllinpayService { + + /** + * 获取通联支付是否开启 + * @return + */ + boolean getIsAllinpay(); + + /** + * 删除通联支付缓存 + */ + void deleteAllinpayCache(); + + /** + * 创建通联会员 + * @param supplierId + */ + void createAllinpayCompanyMember(Long supplierId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierBankCardService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierBankCardService.java new file mode 100644 index 0000000..daa9c19 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierBankCardService.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierBankCardDTO; +import com.tmerclub.cloud.supplier.dto.SupplierBankCardDTO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; + +import java.util.List; + +/** + * 银行卡信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierBankCardService { + /** + * 批量新增结算银行账户 + * @param supplierBankCardDTOList + * @param supplierId + */ + void insertBatch(List supplierBankCardDTOList, Long supplierId); + + /** + * 根据供应商id获取银行卡列表 + * @param supplierId + * @return + */ + List listBySupplierId(Long supplierId); + + /** + * 根据银行卡id删除银行卡信息 + * @param supplierBankCardId + * @param supplierId + */ + void deleteBySupplierBankCardId(Long supplierBankCardId, Long supplierId); + + + /** + * 将对公户信息和之前提交的工商信息一起交给通联去审核 + * @param allinpaySupplierBankCardDTO + * @param supplierId + * @param supplierCompanyVO + */ + void insertAndSetCompanyInfo(AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO, Long supplierId, SupplierCompanyVO supplierCompanyVO); + + /** + * 通联设置企业信息 + * @param allinpaySupplierBankCardDTO + * @param supplierId + * @param supplierCompanyVO + * @param supplierDetail + */ + void allinpaySetCompanyInfo(AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO, Long supplierId, SupplierCompanyVO supplierCompanyVO, SupplierApiDetailVO supplierDetail); + + /** + * 更新通联供应商状态 + * @param supplierId + */ + void updateSupplierAllinpayStatusToSuccess(Long supplierId); + + /** + * 批量新增结算银行账户并提交开店申请 + * @param supplierBankCardDTOList + * @param supplierId + */ + void insertBatchAndSubmitApply(List supplierBankCardDTOList, Long supplierId); + + /** + * 更新供应商银行卡信息 + * @param supplierBankCardDTO 银行卡信息 + * @param supplierId 供应商id + */ + void updateBySupplierId(SupplierBankCardDTO supplierBankCardDTO, Long supplierId); + + /** + * 设置银行卡为主账号 + * @param supplierBankCardId + * @param supplierId + */ + void setPrimaryBySupplierId(Long supplierBankCardId, Long supplierId); + + /** + * 设置银行卡不为主账号 + * @param supplierBankCardId + * @param supplierId + */ + void setNotPrimaryBySupplierId(Long supplierBankCardId, Long supplierId); + + /** + * 保存单个银行卡信息 + * @param supplierBankCardDTO + * @param supplierId + */ + void insertBySupplierId(SupplierBankCardDTO supplierBankCardDTO, Long supplierId); + + /** + * 根据银行卡id获取银行卡信息 + * @param supplierBankCardId + * @return + */ + SupplierBankCardVO getBySupplierBankCardId(Long supplierBankCardId); + + /** + * 根据银行卡id与供应商id获取银行卡信息 + * @param supplierBankCardId + * @param supplierId + * @return + */ + SupplierBankCardVO getBySupplierBankCardIdAndSupplierId(Long supplierBankCardId, Long supplierId); + + /** + * 删除供应商绑定银行卡信息 + * @param supplierId + */ + void deleteBySupplierId(Long supplierId); + + /** + * 刷新银行卡 + * @param supplierId + */ + void refresh(Long supplierId); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierExtensionService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierExtensionService.java new file mode 100644 index 0000000..2c1442d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierExtensionService.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.supplier.model.SupplierExtension; +import com.tmerclub.cloud.supplier.vo.SupplierExtensionVO; + +/** + * 供应商扩张信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierExtensionService { + + /** + * 保存供应商扩张信息 + * @param supplierExtension 供应商扩张信息 + */ + void save(SupplierExtension supplierExtension); + + /** + * 更新供应商扩张信息 + * @param supplierExtension 供应商扩张信息 + */ + void update(SupplierExtensionVO supplierExtension); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWithdrawCashService.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWithdrawCashService.java new file mode 100644 index 0000000..a76e7a0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/SupplierWithdrawCashService.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashConfigDto; +import com.tmerclub.cloud.supplier.dto.SupplierWithdrawCashDTO; +import com.tmerclub.cloud.supplier.vo.SupplierWithdrawCashVO; + +/** + * 供应商提现申请信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public interface SupplierWithdrawCashService { + + /** + * 根据供应商id提交提现申请 + * @param supplierWithdrawCashDTO + * @param supplierId + */ + void apply(SupplierWithdrawCashDTO supplierWithdrawCashDTO, Long supplierId); + + /** + * 通联供应商提现 + * @param supplierWithdrawCashDTO + * @param shopId + * @return + */ + String allinpayApply(AllinpaySupplierWithdrawCashDTO supplierWithdrawCashDTO, Long shopId); + + /** + * 确认支付提现订单 + * @param supplierWithdrawCashDTO + * @param shopId + */ + void confirmWithdrawPay(AllinpaySupplierWithdrawCashDTO supplierWithdrawCashDTO, Long shopId); + + /** + * 重新发送验证码 + * @param bizOrderNo + * @param shopId + */ + void resendPaySms(String bizOrderNo, Long shopId); + + /** + * 提现回调 + * @param bizOrderNo + * @param payStatus + * @param bizUserId + * @param payFailMessage + */ + void withdrawBack(String bizOrderNo, String payStatus, String bizUserId, String payFailMessage); + + /** + * 根据参数分页获取商家提现记录信息 + * @param pageDTO + * @param supplierWithdrawCashDTO + * @return + */ + PageVO pageByParam(PageDTO pageDTO, SupplierWithdrawCashDTO supplierWithdrawCashDTO); + + /** + * 根据id获取提现申请详情信息 + * @param cashId + * @return + */ + SupplierWithdrawCashVO getDetailByCashId(Long cashId); + + /** + * 审核商家提现信息 + * @param supplierWithdrawCashDTO + * @param userId + */ + void auditWithdrawCash(SupplierWithdrawCashDTO supplierWithdrawCashDTO, Long userId); + + /** + * 保存提现配置 + * @param shopWithdrawCashDto + */ + void saveConfig(SupplierWithdrawCashConfigDto shopWithdrawCashDto); + + /** + * 获取提现配置 + * @return + */ + SupplierWithdrawCashConfigDto getConfig(); + + /** + * 检查提现金额 + * @param amount + */ + void checkDrawCashAmount(Long amount); +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/PurchaseAmountLogServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/PurchaseAmountLogServiceImpl.java new file mode 100644 index 0000000..6585868 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/PurchaseAmountLogServiceImpl.java @@ -0,0 +1,285 @@ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.common.constant.PurchaseAmountType; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.multishop.model.ShopDetail; +import com.tmerclub.cloud.multishop.service.ShopDetailService; +import com.tmerclub.cloud.supplier.dto.PurchaseAmountLogDTO; +import com.tmerclub.cloud.supplier.model.SupplierDetail; +import com.tmerclub.cloud.supplier.mongo.MongoPurchaseAmountLogBO; +import com.tmerclub.cloud.supplier.service.PurchaseAmountLogService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.vo.PurchaseAmountLogShopExcelVO; +import com.tmerclub.cloud.supplier.vo.PurchaseAmountLogSupplierExcelVO; +import com.tmerclub.cloud.supplier.vo.ShopSupplierNameVO; +import com.tmerclub.cloud.supplier.vo.TotalPurchaseAmountVO; +import com.tmerclub.cloud.supplier.vo.mongo.MongoPurchaseAmountLogVO; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +@Service +public class PurchaseAmountLogServiceImpl implements PurchaseAmountLogService { + + private static final Logger logger = LoggerFactory.getLogger(PurchaseAmountLogServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private MongoPageUtil mongoPageUtil; + + @Autowired + private ShopDetailService shopDetailService; + @Autowired + private SupplierDetailService supplierDetailService; + + @Override + public List listSupplier(Long shopId) { + // 查询供应商id + Query query = new Query(Criteria.where("shopId").is(shopId)); + logger.info("listSupplier()的mongodb查询语句:{}", query); + List supplierIds = mongoTemplate.findDistinct(query, "supplierId", MongoPurchaseAmountLogBO.class, Long.class); + if (CollectionUtils.isEmpty(supplierIds)) { + return new ArrayList<>(); + } + // 查询供应商名称 + List suppliers = supplierDetailService.listBySupplierIds(supplierIds); + if (CollectionUtils.isEmpty(suppliers)) { + return new ArrayList<>(); + } + return suppliers.stream().map(supplier -> { + ShopSupplierNameVO nameVO = new ShopSupplierNameVO(); + nameVO.setSupplierId(supplier.getSupplierId()); + nameVO.setSupplierName(supplier.getSupplierName()); + return nameVO; + }).toList(); + } + + @Override + public List listShop(Long supplierId) { + // 查询商家id + Query query = new Query(Criteria.where("supplierId").is(supplierId)); + logger.info("listShop()的mongodb查询语句:{}", query); + List shopIds = mongoTemplate.findDistinct(query, "shopId", MongoPurchaseAmountLogBO.class, Long.class); + if (CollectionUtils.isEmpty(shopIds)) { + return new ArrayList<>(); + } + // 查询商家名称 + List shops = shopDetailService.listByShopIds(shopIds); + if (CollectionUtils.isEmpty(shops)) { + return new ArrayList<>(); + } + return shops.stream().map(shop -> { + ShopSupplierNameVO nameVO = new ShopSupplierNameVO(); + nameVO.setShopId(shop.getShopId()); + nameVO.setShopName(shop.getShopName()); + return nameVO; + }).toList(); + } + + @Override + public PageVO pagePurchaseAmountLog(PageDTO pageDTO, + PurchaseAmountLogDTO purchaseAmountLogDTO) { + // 分页查询日志 + Criteria criteria = this.buildCriteria(purchaseAmountLogDTO); + Query query = new Query(criteria).with(Sort.by(Sort.Direction.DESC, "createTime")); + PageVO boPage = mongoPageUtil.doPage(MongoPurchaseAmountLogBO.class, pageDTO, query); + PageVO voPage = new PageVO<>(); + voPage.setPages(boPage.getPages()); + voPage.setTotal(boPage.getTotal()); + if (CollectionUtils.isEmpty(boPage.getList())) { + voPage.setList(new ArrayList<>()); + return voPage; + } + voPage.setList(BeanUtil.mapAsList(boPage.getList(), MongoPurchaseAmountLogVO.class)); + // 补充商家or供应商名称 + this.fillShopOrSupplierName(purchaseAmountLogDTO.getSysType(), voPage.getList()); + return voPage; + } + + @Override + public void savePurchaseLog(MongoPurchaseAmountLogBO mongoPurchaseAmountLogBO) { + logger.info("添加采购金额日志到mongodb{}", Json.toJsonString(mongoPurchaseAmountLogBO)); + mongoTemplate.insert(mongoPurchaseAmountLogBO); + } + + @Override + public TotalPurchaseAmountVO getTotalPurchaseAmount(PurchaseAmountLogDTO purchaseAmountLogDTO) { + // group聚合统计数据 + Criteria criteria = this.buildCriteria(purchaseAmountLogDTO); + Aggregation aggregation = Aggregation.newAggregation( + Aggregation.match(criteria), + Aggregation.group("purchaseAmountType") + .first("purchaseAmountType").as("purchaseAmountType") + .sum("changeAmount").as("changeAmount") + ); + logger.info("getTotalPurchaseAmount()的mongodb查询语句:{}", aggregation); + List purchaseAmountLogs = mongoTemplate.aggregate(aggregation, MongoPurchaseAmountLogBO.class, MongoPurchaseAmountLogVO.class).getMappedResults(); + // 构建VO类 + TotalPurchaseAmountVO amountVO = new TotalPurchaseAmountVO(); + amountVO.setTotalPurchaseAmount(0L); + amountVO.setTotalCancelAmount(0L); + for (MongoPurchaseAmountLogVO purchaseAmountLog : purchaseAmountLogs) { + if (Objects.equals(purchaseAmountLog.getPurchaseAmountType(), PurchaseAmountType.IN_OR_OUT.getValue())) { + amountVO.setTotalPurchaseAmount(purchaseAmountLog.getChangeAmount()); + } else if (Objects.equals(purchaseAmountLog.getPurchaseAmountType(), PurchaseAmountType.CANCEL.getValue())) { + amountVO.setTotalCancelAmount(purchaseAmountLog.getChangeAmount()); + } + } + return amountVO; + } + + @Override + public void exportExcel(HttpServletResponse response, PurchaseAmountLogDTO purchaseAmountLogDTO) { + // 查询日志 + Criteria criteria = this.buildCriteria(purchaseAmountLogDTO); + Query query = new Query(criteria).with(Sort.by(Sort.Direction.DESC, "createTime")); + logger.info("exportExcel()的mongodb查询语句:{}", query); + List amountLogBOList = mongoTemplate.find(query, MongoPurchaseAmountLogBO.class); + List amountLogVOList = BeanUtil.mapAsList(amountLogBOList, MongoPurchaseAmountLogVO.class); + // 补充商家or供应商名称 + this.fillShopOrSupplierName(purchaseAmountLogDTO.getSysType(), amountLogVOList); + // 导出excel + boolean isShop = Objects.equals(purchaseAmountLogDTO.getSysType(), SysTypeEnum.MULTISHOP.value()); + int seq = 1; + if (isShop) { + logger.info("导出商家采购金额日志"); + List excels = new ArrayList<>(amountLogVOList.size()); + for (MongoPurchaseAmountLogVO amountLog : amountLogVOList) { + excels.add(this.buildShopExcel(amountLog, seq++)); + } + ExcelUtil.soleExcel(response, excels, PurchaseAmountLogShopExcelVO.EXCEL_NAME, + PurchaseAmountLogShopExcelVO.MERGE_ROW_INDEX, PurchaseAmountLogShopExcelVO.MERGE_COLUMN_INDEX, PurchaseAmountLogShopExcelVO.class); + } else { + logger.info("导出供应商采购金额日志"); + List excels = new ArrayList<>(amountLogVOList.size()); + for (MongoPurchaseAmountLogVO amountLog : amountLogVOList) { + excels.add(this.buildSupplierExcel(amountLog, seq++)); + } + ExcelUtil.soleExcel(response, excels, PurchaseAmountLogSupplierExcelVO.EXCEL_NAME, + PurchaseAmountLogSupplierExcelVO.MERGE_ROW_INDEX, PurchaseAmountLogSupplierExcelVO.MERGE_COLUMN_INDEX, PurchaseAmountLogSupplierExcelVO.class); + } + } + + /** + * 补充商家/供应商名称 + * @param sysType 系统类型 + * @param amountLogs 采购金额日志 + */ + private void fillShopOrSupplierName(Integer sysType, List amountLogs) { + if (CollectionUtils.isEmpty(amountLogs)) { + return; + } + boolean isShop = Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()); + if (isShop) { + // 查询供应商信息,补充供应商名称 + logger.info("采购金额日志补充供应商信息"); + Set supplierIds = amountLogs.stream().map(MongoPurchaseAmountLogVO::getSupplierId).collect(Collectors.toSet()); + List suppliers = supplierDetailService.listBySupplierIds(new ArrayList<>(supplierIds)); + Map supplierMap = suppliers.stream().collect(Collectors.toMap(SupplierDetail::getSupplierId, SupplierDetail::getSupplierName)); + for (MongoPurchaseAmountLogVO amountLog : amountLogs) { + amountLog.setSupplierName(supplierMap.get(amountLog.getSupplierId())); + } + } else { + // 查询商家信息,补充商家名称 + logger.info("采购金额日志补充商家信息"); + Set shopIds = amountLogs.stream().map(MongoPurchaseAmountLogVO::getShopId).collect(Collectors.toSet()); + List shops = shopDetailService.listByShopIds(new ArrayList<>(shopIds)); + Map shopMap = shops.stream().collect(Collectors.toMap(ShopDetail::getShopId, ShopDetail::getShopName)); + for (MongoPurchaseAmountLogVO amountLog : amountLogs) { + amountLog.setShopName(shopMap.get(amountLog.getShopId())); + } + } + } + + /** + * 构建mongo匹配条件 + * @param purchaseAmountLogDTO 查询参数 + * @return 匹配条件 + */ + private Criteria buildCriteria(PurchaseAmountLogDTO purchaseAmountLogDTO) { + Criteria criteria = new Criteria(); + if (Objects.nonNull(purchaseAmountLogDTO.getShopId())) { + criteria.and("shopId").is(purchaseAmountLogDTO.getShopId()); + } + if (Objects.nonNull(purchaseAmountLogDTO.getSupplierId())) { + criteria.and("supplierId").is(purchaseAmountLogDTO.getSupplierId()); + } + if (Objects.nonNull(purchaseAmountLogDTO.getPurchaseOrderId())) { + criteria.and("purchaseOrderId").is(purchaseAmountLogDTO.getPurchaseOrderId()); + } + if (Objects.nonNull(purchaseAmountLogDTO.getStartTime()) && Objects.nonNull(purchaseAmountLogDTO.getEndTime())) { + criteria.and("createTime").gte(purchaseAmountLogDTO.getStartTime()).lte(purchaseAmountLogDTO.getEndTime()); + } + return criteria; + } + + /** + * 构建采购金额日志商家导出excel + * @param amountLog 采购金额日志 + * @param seq 序号 + * @return 商家导出excel对象 + */ + private PurchaseAmountLogShopExcelVO buildShopExcel(MongoPurchaseAmountLogVO amountLog, int seq) { + PurchaseAmountLogShopExcelVO shopExcel = new PurchaseAmountLogShopExcelVO(); + BeanUtils.copyProperties(amountLog, shopExcel); + shopExcel.setSeq(String.valueOf(seq)); + PurchaseAmountType amountType = PurchaseAmountType.instance(amountLog.getPurchaseAmountType()); + shopExcel.setPurchaseAmountType(Objects.isNull(amountType) ? "" : amountType.getShopDesc()); + shopExcel.setPurchaseOrderId(String.valueOf(amountLog.getPurchaseOrderId())); + shopExcel.setChangeAmount(this.centToYuan(amountLog.getChangeAmount())); + shopExcel.setPurchaseTotalAmount(this.centToYuan(amountLog.getPurchaseTotalAmount())); + return shopExcel; + } + + /** + * 构建采购金额日志供应商导出excel + * @param amountLog 采购金额日志 + * @param seq 序号 + * @return 供应商导出excel对象 + */ + private PurchaseAmountLogSupplierExcelVO buildSupplierExcel(MongoPurchaseAmountLogVO amountLog, int seq) { + PurchaseAmountLogSupplierExcelVO supplierExcel = new PurchaseAmountLogSupplierExcelVO(); + BeanUtils.copyProperties(amountLog, supplierExcel); + supplierExcel.setSeq(String.valueOf(seq)); + PurchaseAmountType amountType = PurchaseAmountType.instance(amountLog.getPurchaseAmountType()); + supplierExcel.setPurchaseAmountType(Objects.isNull(amountType) ? "" : amountType.getSupplierDesc()); + supplierExcel.setPurchaseOrderId(String.valueOf(amountLog.getPurchaseOrderId())); + supplierExcel.setChangeAmount(this.centToYuan(amountLog.getChangeAmount())); + supplierExcel.setPurchaseTotalAmount(this.centToYuan(amountLog.getPurchaseTotalAmount())); + return supplierExcel; + } + + /** + * 分转元 + * @param amount 金额 + * @return + */ + private BigDecimal centToYuan(Long amount) { + return BigDecimal.valueOf(amount).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierAllinpayServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierAllinpayServiceImpl.java new file mode 100644 index 0000000..8d22395 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierAllinpayServiceImpl.java @@ -0,0 +1,67 @@ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.bean.PaySettlementConfig; +import com.tmerclub.cloud.common.cache.constant.SupplierCacheNames; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.Objects; + +/** + * @author TRACK + */ +@Service +public class SupplierAllinpayServiceImpl implements SupplierAllinpayService { + + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private SupplierDetailMapper supplierDetailMapper; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @Override + @Cacheable(cacheNames = SupplierCacheNames.ALLINPAY_CONFIG_KEY, key = "'0'") + public boolean getIsAllinpay() { + // 获取是否开启通联支付 + ServerResponseEntity response = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!response.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfig paySettlementConfig = Json.parseObject(response.getData(), PaySettlementConfig.class); + return Objects.equals(paySettlementConfig.getPaySettlementType(), 1); + } + + @Override + @CacheEvict(cacheNames = SupplierCacheNames.ALLINPAY_CONFIG_KEY, key = "'0'") + public void deleteAllinpayCache() { + } + + @Override + public void createAllinpayCompanyMember(Long supplierId) { + SupplierAllinpayService supplierAllinpayService = (SupplierAllinpayService) AopContext.currentProxy(); + if (supplierAllinpayService.getIsAllinpay()) { + ServerResponseEntity serverResponse = allinpayFeignClient.batchCreateMember(Collections.singletonList(AllinpayConstant.SUPPLIER + supplierId)); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + // 更新供应商为已创建会员 + supplierDetailMapper.updateSupplierIsCreate(Collections.singletonList(supplierId)); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierApplyServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierApplyServiceImpl.java new file mode 100644 index 0000000..f802897 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierApplyServiceImpl.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.mapper.SupplierAuditingMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierCompanyMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.model.SupplierAuditing; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierApplyService; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +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.Objects; + +/** + * @author lth + * @date 2021/4/29 17:23 + */ +@Service +public class SupplierApplyServiceImpl implements SupplierApplyService { + + @Autowired + private SupplierAuditingMapper supplierAuditingMapper; + + @Autowired + private SupplierDetailMapper supplierDetailMapper; + + @Autowired + private SupplierCompanyMapper supplierCompanyMapper; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void apply(Long supplierId) { + Date now = new Date(); + boolean isAllinpay = supplierAllinpayService.getIsAllinpay(); + this.checkApplyInfo(supplierId); + // 插入一条开店申请审核记录 + SupplierAuditingVO supplierAuditingVO = supplierAuditingMapper.getBySupplierId(supplierId); + SupplierAuditing supplierAuditing = new SupplierAuditing(); + supplierAuditing.setSupplierId(supplierId); + supplierAuditing.setUserId(isAllinpay ? null : AuthUserContext.get().getUserId()); + supplierAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + supplierAuditing.setUpdateTime(now); + if (Objects.nonNull(supplierAuditingVO)) { + supplierAuditing.setSupplierAuditingId(supplierAuditingVO.getSupplierAuditingId()); + supplierAuditingMapper.update(supplierAuditing); + } else { + supplierAuditing.setCreateTime(now); + supplierAuditingMapper.save(supplierAuditing); + } + // 更新供应商状态为待审核 + supplierDetailMapper.changeSupplierStatus(supplierId, SupplierStatus.OPEN_AWAIT_AUDIT.value()); + } + + private void checkApplyInfo(Long supplierId) { + SupplierApiDetailVO supplierDetailVO = supplierDetailMapper.getBySupplierId(supplierId); + if (Objects.nonNull(supplierDetailVO) && Objects.equals(supplierDetailVO.getSupplierStatus(), SupplierStatus.OPEN_AWAIT_AUDIT.value())) { + throw new LuckException("供应商入驻申请审核中,请不要重复提交"); + } + SupplierCompanyVO supplierCompanyVO = supplierCompanyMapper.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + if (Objects.isNull(supplierCompanyVO)) { + throw new LuckException("供应商工商信息未填写"); + } + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierBankCardServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierBankCardServiceImpl.java new file mode 100644 index 0000000..5c8086c --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierBankCardServiceImpl.java @@ -0,0 +1,464 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.SetCompanyInfoResp; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.supplier.constant.SupplierStatus; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.constant.IsDefault; +import com.tmerclub.cloud.supplier.constant.SupplierWithdrawCashStatus; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierBankCardDTO; +import com.tmerclub.cloud.supplier.dto.SupplierAuditingDTO; +import com.tmerclub.cloud.supplier.dto.SupplierBankCardDTO; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyAuditingDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierBankCardMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierCompanyMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierWithdrawCashMapper; +import com.tmerclub.cloud.supplier.model.SupplierAuditing; +import com.tmerclub.cloud.supplier.model.SupplierBankCard; +import com.tmerclub.cloud.supplier.service.*; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyAuditingVO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 银行卡信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierBankCardServiceImpl implements SupplierBankCardService { + private static final Logger LOGGER = LoggerFactory.getLogger(SupplierBankCardServiceImpl.class); + + @Autowired + private SupplierBankCardMapper supplierBankCardMapper; + + @Autowired + private SupplierWithdrawCashMapper supplierWithdrawCashMapper; + + @Autowired + private SupplierApplyService supplierApplyService; + + + @DubboReference + private AccountFeignClient accountFeignClient; + + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @Autowired + private SupplierDetailMapper supplierDetailMapper; + + @Autowired + private SupplierUserService supplierUserService; + + @Autowired + private SupplierCompanyMapper supplierCompanyMapper; + + @Autowired + @Lazy + private SupplierCompanyAuditingService supplierCompanyAuditingService; + @Autowired + @Lazy + private SupplierDetailServiceImpl supplierDetailService; + @Autowired + private SupplierAuditingService supplierAuditingService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertBatch(List supplierBankCardDTOList, Long supplierId) { + if (CollUtil.isEmpty(supplierBankCardDTOList)) { + return; + } + List supplierBankCardVos = supplierBankCardMapper.listBySupplierId(supplierId); + if (CollUtil.isEmpty(supplierBankCardVos)) { + supplierBankCardVos = new ArrayList<>(0); + } + // 检查银行卡信息 + this.checkSaveBankCardList(supplierBankCardVos, supplierBankCardDTOList, supplierId, false); + supplierBankCardMapper.insertBatch(supplierBankCardDTOList, supplierId); + } + + @Override + public List listBySupplierId(Long supplierId) { + return supplierBankCardMapper.listBySupplierId(supplierId); + } + + @Override + public void deleteBySupplierBankCardId(Long supplierBankCardId, Long supplierId) { + SupplierBankCardVO supplierBankCard = supplierBankCardMapper.getBySupplierBankCardId(supplierBankCardId); + if (Objects.equals(supplierBankCard.getIsDefault(), 1)) { + // 不能删除默认银行卡 + throw new LuckException("不能删除默认银行卡"); + } + // 检查是否为最后一张银行卡 + if (supplierBankCardMapper.countBySupplierId(supplierId) == 1) { + throw new LuckException("至少保留一张银行卡"); + } + // 检查是否属于当前供应商 + this.checkIsCurrentSupplier(supplierId, supplierBankCardId); + // 检查是否处于提现状态 + this.checkIsWithdraw(supplierBankCardId); + // 进行删除 + supplierBankCardMapper.deleteById(supplierBankCardId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertBatchAndSubmitApply(List supplierBankCardDTOList, Long supplierId) { + if (Objects.equals(AuthUserContext.get().getIsPassShop(), IsPassShopEnum.YES.value())) { + // 供应商已入驻不能调用该方法 + throw new LuckException("接口调用错误"); + } + if (supplierBankCardDTOList == null || supplierBankCardDTOList.size() == 0) { + throw new LuckException("至少要添加一个银行卡"); + } + // 先删除已保存的银行卡信息 + supplierBankCardMapper.deleteBySupplierId(AuthUserContext.get().getTenantId()); + // 检查银行卡信息 + this.checkSaveBankCardList(new ArrayList<>(Constant.INITIAL_CAPACITY), supplierBankCardDTOList, supplierId, false); + // 保存银行卡信息 + supplierBankCardMapper.insertBatch(supplierBankCardDTOList, supplierId); + // 提交开店申请 + supplierApplyService.apply(supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertAndSetCompanyInfo(AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO, Long supplierId, SupplierCompanyVO supplierCompanyVO) { + // 保存数据到数据库 + supplierBankCardMapper.deleteBySupplierId(supplierId); + SupplierBankCard supplierBankCard = new SupplierBankCard(); + supplierBankCard.setSupplierId(supplierId); + supplierBankCard.setBankName(allinpaySupplierBankCardDTO.getParentBankName()); + supplierBankCard.setOpeningBank(allinpaySupplierBankCardDTO.getParentBankName()); + supplierBankCard.setBranchName(allinpaySupplierBankCardDTO.getBankName()); + supplierBankCard.setRecipientName(supplierCompanyVO.getFirmName()); + supplierBankCard.setCardNo(allinpaySupplierBankCardDTO.getAccountNo()); + supplierBankCard.setStatus(StatusEnum.ENABLE.value()); + supplierBankCard.setUnionBank(allinpaySupplierBankCardDTO.getUnionBank()); + supplierBankCard.setBankCardNo(allinpaySupplierBankCardDTO.getAccountNo()); + supplierBankCard.setBankCardPro(1); + supplierBankCardMapper.save(supplierBankCard); + SupplierApiDetailVO supplierDetail = supplierDetailMapper.getBySupplierId(supplierId); + if (Objects.equals(supplierDetail.getSupplierStatus(), SupplierStatus.APPLYING.value())) { + LOGGER.info("供应商{}提交开店申请", supplierId + "supplierName:" + supplierDetail.getSupplierName()); + // 提交开店申请 + supplierApplyService.apply(supplierId); + } + + allinpaySetCompanyInfo(allinpaySupplierBankCardDTO, supplierId, supplierCompanyVO, supplierDetail); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void allinpaySetCompanyInfo(AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO, Long supplierId, SupplierCompanyVO supplierCompanyVO, SupplierApiDetailVO supplierDetail) { + SetCompanyInfoDTO setCompanyInfoDTO = BeanUtil.map(allinpaySupplierBankCardDTO, SetCompanyInfoDTO.class); + setCompanyInfoDTO.setCompanyName(supplierCompanyVO.getFirmName()); + setCompanyInfoDTO.setCompanyAddress(supplierCompanyVO.getResidence()); + setCompanyInfoDTO.setUniCredit(supplierCompanyVO.getCreditCode()); + setCompanyInfoDTO.setLegalName(supplierCompanyVO.getRepresentative()); + setCompanyInfoDTO.setLegalIds(supplierCompanyVO.getLegalIds()); + setCompanyInfoDTO.setLegalPhone(supplierCompanyVO.getLegalPhone()); + setCompanyInfoDTO.setBizUserId(AllinpayConstant.SUPPLIER + supplierId); + // 设置完企业信息——供应商变为上线待审核(已开店)/开店待审核(未开店)——回调假如成功更改为营业,失败则为审核失败,重新填写,平台开店也一样 + ServerResponseEntity response = allinpayFeignClient.setCompanyInfo(setCompanyInfoDTO); + LOGGER.info("供应商{}设置企业信息结果:{}", supplierId + "supplierName:" + supplierDetail.getSupplierName(), response); + SupplierCompanyAuditingVO supplierCompanyAuditingVO = supplierCompanyAuditingService.getLatestAuditingBySupplierId(supplierId); + ServerResponseEntity accountInfoByTenantId = accountFeignClient.getAccountInfoByTenantId(supplierId, SysTypeEnum.SUPPLIER.value()); + String failReason = response.getMsg(); + if (!response.isSuccess()) { + if (Objects.equals(failReason, AllinpayConstant.SET_COMPANY_INFO_RESULT)) { + LOGGER.info("当前供应商在通联已审核通过,无法设置企业信息。更新供应商状态,上传影印件,等待影印件通过审核。"); + // 审核成功 更新供应商企业信息审核状态为审核通过,待影印件通过后即可将通联供应商状态更改为营业中,并且把工商信息修改为成功 + updateSupplierStatusToWaitAudit(supplierId, supplierDetail, supplierCompanyAuditingVO); + supplierCompanyAuditingService.updateAllinpaySupplierStatus(AllinpayConstant.SUPPLIER + supplierId, com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode(), + "", accountInfoByTenantId.getData().getIsPassShop()); + return; + } + // 更新审核失败 + if (Objects.nonNull(supplierCompanyAuditingVO)) { + // 如果是已经开店来审核的话要把审核拒绝通过 + if (Objects.equals(supplierCompanyAuditingVO.getStatus(), AuditStatus.FAILAUDIT.value())) { + LOGGER.info("已开店供应商:{}审核失败,更新失败原因:{}", supplierId + "supplierName:" + supplierDetail.getSupplierName(), failReason); + supplierCompanyAuditingService.updateRemark(new SupplierCompanyAuditingDTO(supplierCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } else { + LOGGER.info("已开店供应商:{}审核失败,开店拒绝通过,原因为:{}", supplierId + "supplierName:" + supplierDetail.getSupplierName(), failReason); + supplierCompanyAuditingService.audit(new SupplierCompanyAuditingDTO(supplierCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } + } + if (Objects.equals(supplierDetail.getSupplierStatus(), SupplierStatus.APPLYING.value()) || Objects.equals(accountInfoByTenantId.getData().getIsPassShop(), 0)) { + // 申请拒绝 + SupplierAuditingVO supplierAuditingVO = supplierAuditingService.getBySupplierId(supplierId); + SupplierAuditingDTO supplierAuditingDTO = BeanUtil.map(supplierAuditingVO, SupplierAuditingDTO.class); + supplierAuditingDTO.setStatus(AuditStatus.FAILAUDIT.value()); + supplierAuditingDTO.setRemarks(failReason); + if (Objects.equals(supplierAuditingVO.getStatus(), AuditStatus.FAILAUDIT.value())) { + LOGGER.info("申请开店供应商:{}审核失败,更新失败原因:{}", supplierId + "supplierName:" + supplierDetail.getSupplierName(), failReason); + supplierAuditingService.update(BeanUtil.map(supplierAuditingDTO, SupplierAuditing.class)); + } else { + LOGGER.info("申请开店供应商:{}审核失败,开店拒绝通过,原因为:{}", supplierId + "supplierName:" + supplierDetail.getSupplierName(), failReason); + supplierDetailService.audit(supplierAuditingDTO); + } + } + supplierDetailMapper.updateSupplierAuditFail(supplierId); + return; + } + SetCompanyInfoResp setCompanyInfoResp = response.getData(); + updateSupplierStatusToWaitAudit(supplierId, supplierDetail, supplierCompanyAuditingVO); + if (Objects.nonNull(setCompanyInfoResp.getResult())) { + supplierCompanyAuditingService.updateAllinpaySupplierStatus(setCompanyInfoResp.getBizUserId(), setCompanyInfoResp.getResult(), "", accountInfoByTenantId.getData().getIsPassShop()); + } + } + + private void updateSupplierStatusToWaitAudit(Long supplierId, SupplierApiDetailVO supplierDetail, SupplierCompanyAuditingVO supplierCompanyAuditingVO) { + if (Objects.nonNull(supplierCompanyAuditingVO) && Objects.equals(supplierCompanyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + LOGGER.info("已开店供应商:{}审核失败,更新供应商状态为上线待审核", supplierId + "supplierName:" + supplierDetail.getSupplierName()); + // 已经开店来审核更改为上线待审核 + supplierDetailMapper.updateAllinpaySupplierStatus(supplierId, AllinpayShopStatus.WAIT_AUDIT.value()); + } else { + LOGGER.info("申请开店供应商:{}审核失败,更新供应商状态为开店待审核", supplierId + "supplierName:" + supplierDetail.getSupplierName()); + // 未开店更改为开店待审核 + supplierDetailMapper.updateAllinpaySupplierStatus(supplierId, AllinpayShopStatus.OPEN_WAIT_AUDIT.value()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateSupplierAllinpayStatusToSuccess(Long supplierId) { + // 影印件回调只会在企业审核通过后,所以这里再次更新一下,可能之前设置企业信息回调失败了 + SupplierApiDetailVO supplierApiDetailVO = supplierDetailMapper.getBySupplierId(supplierId); + if (Objects.isNull(supplierApiDetailVO)) { + return; + } + if (Objects.equals(supplierApiDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + return; + } + supplierDetailMapper.updateSupplierAuditSuccess(supplierId); + boolean shouldUpdate = Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.APPLYING.value()) || Objects.equals(supplierApiDetailVO.getSupplierStatus(), SupplierStatus.OPEN_AWAIT_AUDIT.value()); + ServerResponseEntity accountInfoByTenantId = accountFeignClient.getAccountInfoByTenantId(supplierId, SysTypeEnum.SUPPLIER.value()); + if (shouldUpdate && Objects.equals(accountInfoByTenantId.getData().getIsPassShop(), 0)) { + Long userId = supplierUserService.getUserIdBySupplierId(supplierId); + UidInfoBO uidInfoBO = new UidInfoBO(); + uidInfoBO.setUserId(userId); + uidInfoBO.setSysType(SysTypeEnum.SUPPLIER.value()); + uidInfoBO.setTenantId(supplierId); + uidInfoBO.setIsAdmin(UserAdminType.ADMIN.value()); + uidInfoBO.setIsPassShop(IsPassShopEnum.YES.value()); + ServerResponseEntity updateTenantIdRes = accountFeignClient.updateUserInfoByUserIdAndSysType(uidInfoBO, userId, SysTypeEnum.SUPPLIER.value()); + if (!updateTenantIdRes.isSuccess()) { + throw new LuckException("审核失败"); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBySupplierId(SupplierBankCardDTO supplierBankCardDTO, Long supplierId) { + if (Objects.isNull(supplierBankCardDTO.getSupplierBankCardId())) { + throw new LuckException("银行卡信息错误"); + } + List supplierBankCardVOList = this.listBySupplierId(supplierId); + // 检查银行卡是否属于当前供应商 + this.checkIsCurrentSupplier(supplierId, supplierBankCardDTO.getSupplierBankCardId()); + // 检查是否处于提现状态 + this.checkIsWithdraw(supplierBankCardDTO.getSupplierBankCardId()); + // 检查银行卡信息 + this.checkSaveBankCardList(supplierBankCardVOList, Collections.singletonList(supplierBankCardDTO), supplierId, true); + supplierBankCardMapper.update(BeanUtil.map(supplierBankCardDTO, SupplierBankCard.class)); + if (Objects.equals(supplierBankCardDTO.getIsDefault(), IsDefault.YES.value())) { + supplierBankCardMapper.setPrimary(supplierBankCardDTO.getSupplierBankCardId(), supplierId); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void setPrimaryBySupplierId(Long supplierBankCardId, Long supplierId) { + this.checkIsCurrentSupplier(supplierId, supplierBankCardId); + supplierBankCardMapper.setPrimary(supplierBankCardId, supplierId); + } + + @Override + public void setNotPrimaryBySupplierId(Long supplierBankCardId, Long supplierId) { + this.checkIsCurrentSupplier(supplierId, supplierBankCardId); + supplierBankCardMapper.setNotPrimary(supplierBankCardId, supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertBySupplierId(SupplierBankCardDTO supplierBankCardDTO, Long supplierId) { + if (Objects.isNull(supplierBankCardDTO)) { + return; + } + List supplierBankCardVOList = this.listBySupplierId(supplierId); + if (CollUtil.isEmpty(supplierBankCardVOList)) { + supplierBankCardVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + // 检查银行卡信息 + this.checkSaveBankCardList(supplierBankCardVOList, Collections.singletonList(supplierBankCardDTO), supplierId, false); + SupplierBankCard supplierBankCard = BeanUtil.map(supplierBankCardDTO, SupplierBankCard.class); + supplierBankCard.setSupplierId(supplierId); + supplierBankCard.setStatus(StatusEnum.ENABLE.value()); + supplierBankCardMapper.save(supplierBankCard); + if (Objects.equals(supplierBankCardDTO.getIsDefault(), 1)) { + supplierBankCardMapper.setPrimary(supplierBankCard.getSupplierBankCardId(), supplierId); + } + } + + @Override + public SupplierBankCardVO getBySupplierBankCardId(Long supplierBankCardId) { + return supplierBankCardMapper.getBySupplierBankCardId(supplierBankCardId); + } + + @Override + public SupplierBankCardVO getBySupplierBankCardIdAndSupplierId(Long supplierBankCardId, Long supplierId) { + SupplierBankCardVO supplierBankCardVO = supplierBankCardMapper.getBySupplierBankCardId(supplierBankCardId); + if (!Objects.equals(supplierBankCardVO.getSupplierId(), supplierId)) { + throw new LuckException("当前银行卡不属于该供应商"); + } + return supplierBankCardVO; + } + + @Override + public void deleteBySupplierId(Long supplierId) { + supplierBankCardMapper.deleteBySupplierId(supplierId); + } + + @Override + public void refresh(Long supplierId) { + ServerResponseEntity> response = allinpayFeignClient.listBindCard(AllinpayConstant.SUPPLIER + supplierId, null); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + LOGGER.info("供应商:{}在通联的银行卡列表信息查询结果:{}", supplierId, response); + List bindCardList = response.getData().stream().filter(card -> Objects.equals(card.getBindState(), 1)).collect(Collectors.toList()); + List dbCardList = supplierBankCardMapper.listBySupplierId(supplierId); + LOGGER.info("供应商:{}在数据库的银行卡列表信息查询结果:{}", supplierId, dbCardList); + if (Objects.equals(bindCardList.size(), dbCardList.size())) { + return; + } + // 获取主账号卡号 + List collect = dbCardList.stream().filter(card -> Objects.equals(card.getIsDefault(), 1)).collect(Collectors.toList()); + String cardNo = null; + if (CollUtil.isNotEmpty(collect)) { + cardNo = collect.get(0).getCardNo(); + } + // 删除原有的 + supplierBankCardMapper.deleteBySupplierId(supplierId); + // 更新 + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + SupplierCompanyVO supplierCompanyVO = supplierCompanyMapper.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.SUCCESSAUDIT.value()); + for (BindCard bindCard : bindCardList) { + SupplierBankCardDTO supplierBankCardDTO = new SupplierBankCardDTO(); + supplierBankCardDTO.setBankName(bindCard.getBankName()); + supplierBankCardDTO.setSupplierId(supplierId); + supplierBankCardDTO.setBranchName(bindCard.getBranchBankName()); + supplierBankCardDTO.setOpeningBank(bindCard.getBankName()); + supplierBankCardDTO.setUnionBank(bindCard.getUnionBank()); + supplierBankCardDTO.setBankCardNo(bindCard.getBankCardNo()); + supplierBankCardDTO.setBankCardPro(bindCard.getBankCardPro()); + if (Objects.equals(bindCard.getBankCardPro(), 0)) { + supplierBankCardDTO.setRecipientName(supplierCompanyVO.getRepresentative()); + supplierBankCardDTO.setCardNo(bindCard.getBankCardNo()); + } else if (Objects.equals(bindCard.getBankCardPro(), 1)) { + supplierBankCardDTO.setRecipientName(supplierCompanyVO.getFirmName()); + supplierBankCardDTO.setCardNo(bindCard.getAccountNo()); + } + boolean isDefault = Objects.nonNull(cardNo) && (Objects.equals(cardNo, bindCard.getBankCardNo()) || Objects.equals(cardNo, bindCard.getUnionBank())); + if (isDefault) { + supplierBankCardDTO.setIsDefault(1); + } + saveList.add(supplierBankCardDTO); + } + supplierBankCardMapper.insertBatch(saveList, supplierId); + } + + /** + * 检查银行卡列表信息 + * @param savedBankCardList 已保存的银行卡列表 + * @param newBankCardList 新增的银行卡列表 + * @param supplierId 用于保存银行卡的供应商id + */ + private void checkSaveBankCardList(List savedBankCardList, List newBankCardList, + Long supplierId, Boolean isUpdate) { + if (!isUpdate && (savedBankCardList.size() + newBankCardList.size() > Constant.SHOP_BANK_CARD_LIMIT_NUM)) { + throw new LuckException("银行卡数量不能超过" + Constant.SHOP_BANK_CARD_LIMIT_NUM); + } + Map bankCardMap = new HashMap<>(5); + savedBankCardList.forEach(item -> { + if (bankCardMap.containsKey(item.getCardNo())) { + throw new LuckException("已添加的银行卡中存在重复账号" + item.getCardNo() + ",请先删除重复的银行卡账号"); + } + bankCardMap.put(item.getCardNo(), 1); + }); + newBankCardList.forEach(item -> { + //新增的需要校验 + if (Objects.isNull(item.getSupplierBankCardId()) && bankCardMap.containsKey(item.getCardNo())) { + throw new LuckException("银行卡账号" + item.getCardNo() + "重复"); + } + bankCardMap.put(item.getCardNo(), 1); + }); + } + + /** + * 检查是否处于提现状态 + * @param supplierBankCardId 银行卡id + */ + private void checkIsWithdraw(Long supplierBankCardId) { + int count = supplierWithdrawCashMapper.countBySupplierBandCardIdAndStatus(supplierBankCardId, SupplierWithdrawCashStatus.WAITAUDIT.value()); + if (count > 0) { + // 正在用于提现的银行卡不能删除 + throw new LuckException("正在用于提现的银行卡账号不能修改或删除"); + } + } + + /** + * 检查银行卡是否属于当前供应商 + * @param supplierId + * @param supplierBankCardId + */ + private void checkIsCurrentSupplier(Long supplierId, Long supplierBankCardId) { + if (Objects.equals(supplierId, Constant.PLATFORM_SHOP_ID)) { + // 平台端操作 + return; + } + SupplierBankCardVO supplierBankCard = this.supplierBankCardMapper.getBySupplierBankCardId(supplierBankCardId); + if (!Objects.equals(supplierBankCard.getSupplierId(), supplierId)) { + throw new LuckException("当前银行卡不属于你的供应商"); + } + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierCompanyAuditingServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierCompanyAuditingServiceImpl.java new file mode 100644 index 0000000..1c24223 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierCompanyAuditingServiceImpl.java @@ -0,0 +1,460 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.UpdateCompanyInfoResp; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.SupplierAuditingDTO; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyAuditingDTO; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierCompanyAuditingMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.model.SupplierCompany; +import com.tmerclub.cloud.supplier.model.SupplierCompanyAuditing; +import com.tmerclub.cloud.supplier.service.*; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyAuditingVO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * @author chiley + * @date 2022/9/13 14:40 + */ + +@Service +public class SupplierCompanyAuditingServiceImpl implements SupplierCompanyAuditingService { + private static final Logger logger = LoggerFactory.getLogger(SupplierCompanyAuditingServiceImpl.class); + + @Autowired + private SupplierCompanyAuditingMapper companyAuditingMapper; + @Autowired + private SupplierCompanyService supplierCompanyService; + @Autowired + private SupplierDetailMapper supplierDetailMapper; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private SupplierDetailService supplierDetailService; + @Autowired + private SupplierBankCardService supplierBankCardService; + @Autowired + private SupplierAuditingService supplierAuditingService; + + @Override + public void updateRemark(SupplierCompanyAuditingDTO supplierCompanyAuditingDTO) { + companyAuditingMapper.update(BeanUtil.map(supplierCompanyAuditingDTO, SupplierCompanyAuditing.class)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void applyChangeCompanyInfo(SupplierCompanyDTO supplierCompanyDTO) { + SupplierApiDetailVO supplierApiDetailVO = supplierDetailMapper.getBySupplierId(supplierCompanyDTO.getSupplierId()); + SupplierCompanyVO supplierCompanyVO = new SupplierCompanyVO(); + if (supplierAllinpayService.getIsAllinpay()) { + if (!Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("获取影印件还未通过的供应商{}工商信息,状态为待审核", supplierCompanyDTO.getSupplierId()); + supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierCompanyDTO.getSupplierId(), AuditStatus.WAITAUDIT.value()); + } else { + logger.info("获取影印件已经通过的供应商{}工商信息,状态为审核成功", supplierCompanyDTO.getSupplierId()); + supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierCompanyDTO.getSupplierId(), AuditStatus.SUCCESSAUDIT.value()); + } + } + if (StrUtil.isNotBlank(supplierCompanyDTO.getLegalPhone())) { + if (!PrincipalUtil.isDbPhone(supplierCompanyDTO.getLegalPhone(), supplierCompanyVO.getLegalPhone(), true)) { + throw new LuckException("请输入正确的手机号"); + } + if (supplierCompanyDTO.getLegalPhone().contains(Constant.ASTERISK)) { + supplierCompanyDTO.setLegalPhone(supplierCompanyVO.getLegalPhone()); + } + } + // 把之前审核不通过的工商信息删除 + supplierCompanyService.deleteBySupplierIdAndStatus(supplierCompanyDTO.getSupplierId(), AuditStatus.FAILAUDIT.value()); + // 保存变更工商信息 + SupplierCompany supplierCompany = BeanUtil.map(supplierCompanyDTO, SupplierCompany.class); + supplierCompany.setStatus(AuditStatus.WAITAUDIT.value()); + supplierCompanyService.save(supplierCompany, false); + // 生成审核信息 + Long companyAuditingId = generateAuditInformation(supplierCompany); + if (supplierAllinpayService.getIsAllinpay()) { + if (Objects.equals(supplierApiDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + logger.info("供应商{}工商信息已经通过审核,更新工商信息内容和状态和后续处理", supplierCompanyDTO.getSupplierId()); + // 审核成功的要进行更改的 + updateCompany(supplierCompanyDTO, companyAuditingId, supplierCompanyVO, supplierApiDetailVO); + } + } + } + + private void updateCompany(SupplierCompanyDTO supplierCompanyDTO, Long companyAuditingId, SupplierCompanyVO supplierCompanyVO, SupplierApiDetailVO supplierApiDetailVO) { + Long supplierId = supplierCompanyDTO.getSupplierId(); + ServerResponseEntity idCardStatus = allinpayFeignClient.getIdCardStatus(AllinpayConstant.SUPPLIER + supplierId); + if (!idCardStatus.isSuccess()) { + throw new LuckException(idCardStatus.getMsg()); + } + if (!Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData())) { + logger.info("供应商{}影印件信息状态{}和通联影印件信息状态{}不一致,处理影印件状态", supplierCompanyDTO.getSupplierId(), + supplierApiDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData()); + // 不一致先更新 + supplierDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SUPPLIER + supplierId, idCardStatus.getData()); + } + // 改了基本信息 + boolean isChangeInfo = getIsChangeInfo(supplierCompanyDTO, supplierCompanyVO); + // 改了关键信息 + boolean isChangeKeyInfo = getIsChangeKeyInfo(supplierCompanyDTO, supplierCompanyVO); + // 改了影印件 + boolean isChangeIdCard = getIsChangeIdCard(supplierCompanyDTO, supplierCompanyVO); + if (!isChangeInfo && !isChangeKeyInfo && !isChangeIdCard) { + // 没有改通联有关信息直接审核成功 + logger.info("没有修改通联有关信息,供应商{}工商信息审核通过", supplierId); + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.SUCCESSAUDIT.value(), "")); + return; + } + + if (isChangeInfo || isChangeKeyInfo) { + logger.info("供应商修改了基本信息{}或关键信息{},交给通联审核", isChangeInfo, isChangeKeyInfo); + // 对于信息修改操作,上送所有需修改信息均认证成功才操作修改,否则信息均不修改; + UpdateCompanyInfoDTO updateCompanyInfoDTO = new UpdateCompanyInfoDTO(AllinpayConstant.SUPPLIER + supplierId); + updateCompanyInfoDTO.setCompanyName(supplierCompanyDTO.getFirmName()); + updateCompanyInfoDTO.setCompanyAddress(supplierCompanyDTO.getResidence()); + updateCompanyInfoDTO.setLegalIds(supplierCompanyDTO.getLegalIds()); + updateCompanyInfoDTO.setLegalPhone(supplierCompanyDTO.getLegalPhone()); + updateCompanyInfoDTO.setLegalName(supplierCompanyDTO.getRepresentative()); + // 通联审核 + ServerResponseEntity response = allinpayFeignClient.updateCompanyInfo(updateCompanyInfoDTO); + if (!response.isSuccess()) { + logger.info("通联审核供应商{}修改的工商信息失败,拒绝更新,原因为{}", supplierId, response.getMsg()); + // 审核失败不会更新影印件审核,只需要拒绝更新就可以了 + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), response.getMsg())); + return; + } + UpdateCompanyInfoResp updateCompanyInfoResp = response.getData(); + if (Objects.equals(updateCompanyInfoResp.getResult(), com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode())) { + logger.info("通联审核供应商{}修改的工商信息成功", supplierId); + if (isChangeKeyInfo) { + logger.info("供应商{}修改了关键信息,并且审核通过,更新店铺为通联上线待审核,等待影印件重新审核通过", supplierId); + // 修改了会触发ocr的 + //审核成功 通联更新了企业信息 更新会触发ocr,供应商需要下线等待影印件审核通过 + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.SUCCESSAUDIT.value(), "")); + // 更新供应商为通联上线待审核,影印件审核通过即可营业 + supplierDetailMapper.updateSupplierToWaitAudit(supplierCompanyDTO.getSupplierId()); + } else if (!isChangeIdCard) { + logger.info("供应商{}没有修改了关键信息,也没有影印件要上传,直接审核成功", supplierId); + // 没有修改关键信息,没有上传影印件可以直接成功 + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.SUCCESSAUDIT.value(), "")); + if (!Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("供应商{}影印件状态异常,更新影印件", supplierId); + supplierDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SUPPLIER + supplierId, idCardStatus.getData()); + } + return; + } + } else if (Objects.equals(updateCompanyInfoResp.getResult(), com.tmerclub.cloud.api.payment.constant.AuditStatus.FAIL.getCode())) { + logger.info("通联审核供应商{}修改的工商信息失败,拒绝更新", supplierId); + // 审核失败不会更新影印件审核,只需要拒绝更新就可以了 + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), updateCompanyInfoResp.getFailReason())); + return; + } + } + + // 如果有改变影印件,没有改变别的信息,在这里影印件需要重新上传,上传失败拒绝更新 + onlyChangeIdCard(supplierCompanyDTO, companyAuditingId, supplierApiDetailVO, supplierId, idCardStatus, isChangeInfo, isChangeKeyInfo); + } + + private void onlyChangeIdCard(SupplierCompanyDTO supplierCompanyDTO, Long companyAuditingId, SupplierApiDetailVO supplierApiDetailVO, Long supplierId, ServerResponseEntity idCardStatus, boolean isChangeInfo, boolean isChangeKeyInfo) { + if (!isChangeInfo && !isChangeKeyInfo) { + logger.info("供应商{}只修改影印件,影印件上传", supplierId); + if (!Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData()) && Objects.equals(idCardStatus.getData(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("供应商{}影印件已经通过审核,但是供应商影印件状态没更新,更新状态并且拒绝影印件上传审核", supplierId); + // 如果影印件上传成功但是这里没有更新的话要更新一下 + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), "供应商影印件已经审核通过,无需更新")); + supplierDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SUPPLIER + supplierId, idCardStatus.getData()); + return; + } else if (!Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), idCardStatus.getData())) { + logger.info("供应商{}影印件状态没更新,更新状态", supplierId); + supplierDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SUPPLIER + supplierId, idCardStatus.getData()); + } else if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + logger.info("供应商{}影印件已经通过审核,拒绝影印件上传审核", supplierId); + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), "供应商影印件已经审核通过,无需更新")); + return; + } + String result = supplierCompanyService.idCardCollect(BeanUtil.map(supplierCompanyDTO, SupplierCompanyVO.class), supplierId); + if (!Objects.equals(result, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + logger.info("供应商{}影印件上传失败,拒绝影印件更新", supplierId); + audit(new SupplierCompanyAuditingDTO(companyAuditingId, AuditStatus.FAILAUDIT.value(), "供应商影印件上传失败,请重新上传")); + return; + } + // 更新供应商为通联上线待审核,影印件审核通过即可营业 + supplierDetailMapper.updateSupplierToWaitAudit(supplierCompanyDTO.getSupplierId()); + // 更新供应商影印件采集状态 + supplierDetailMapper.updateAllinpayIdCardStatus(supplierCompanyDTO.getSupplierId(), IdCardCollectProcessStatus.WAIT_AUDIT.value()); + } + } + + + @Override + public SupplierCompanyAuditingVO getLatestAuditingBySupplierId(Long supplierId) { + return companyAuditingMapper.getLatestAuditingBySupplierId(supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void revoke(Long supplierId) { + if (supplierAllinpayService.getIsAllinpay()) { + throw new LuckException("当前无法撤销申请"); + } + SupplierCompanyAuditingVO companyAuditingVO = getLatestAuditingBySupplierId(supplierId); + if (Objects.isNull(companyAuditingVO) || !Objects.equals(companyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("申请信息未能找到,请刷新页面"); + } + // 删除申请变更的工商信息 + supplierCompanyService.deleteBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + // 删除申请审核信息 + companyAuditingMapper.deleteById(companyAuditingVO.getCompanyAuditingId()); + } + + @Override + public PageVO page(PageDTO pageDTO, SupplierCompanyAuditingDTO supplierCompanyAuditingDTO) { + return PageUtil.doPage(pageDTO, () -> companyAuditingMapper.list(supplierCompanyAuditingDTO)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void audit(SupplierCompanyAuditingDTO supplierCompanyAuditingDTO) { + boolean isAllinpay = supplierAllinpayService.getIsAllinpay(); + SupplierCompanyAuditing companyAuditing = companyAuditingMapper.getById(supplierCompanyAuditingDTO.getCompanyAuditingId()); + if (Objects.isNull(companyAuditing) || !Objects.equals(companyAuditing.getStatus(), AuditStatus.WAITAUDIT.value())) { + throw new LuckException("申请信息未能找到,请刷新页面"); + } + companyAuditing.setAuditorId(isAllinpay ? null : AuthUserContext.get().getUserId()); + // 审核不通过 + if (Objects.equals(supplierCompanyAuditingDTO.getStatus(), AuditStatus.FAILAUDIT.value())) { + companyAuditing.setStatus(AuditStatus.FAILAUDIT.value()); + companyAuditing.setRemarks(supplierCompanyAuditingDTO.getRemarks()); + companyAuditingMapper.update(companyAuditing); + // 把对应的工商信息设置为审核不通过状态 + SupplierCompany supplierCompany = new SupplierCompany(); + supplierCompany.setSupplierCompanyId(companyAuditing.getSupplierCompanyId()); + supplierCompany.setStatus(AuditStatus.FAILAUDIT.value()); + supplierCompanyService.updateById(supplierCompany); + return; + } + // 审核通过 + if (Objects.equals(supplierCompanyAuditingDTO.getStatus(), AuditStatus.SUCCESSAUDIT.value())) { + companyAuditing.setStatus(AuditStatus.SUCCESSAUDIT.value()); + companyAuditingMapper.update(companyAuditing); + + supplierCompanyService.batchUpdateStatus(companyAuditing.getSupplierId(), AuditStatus.FAILAUDIT.value(), null); + // 把对应的工商信息设置为启用状态 + SupplierCompany supplierCompany = new SupplierCompany(); + supplierCompany.setSupplierCompanyId(companyAuditing.getSupplierCompanyId()); + supplierCompany.setStatus(AuditStatus.SUCCESSAUDIT.value()); + supplierCompanyService.updateById(supplierCompany); + } + + } + + @Override + public SupplierCompanyAuditingVO getAuditInfo(Long supplierId) { + SupplierCompanyAuditingVO companyAuditingVO = getLatestAuditingBySupplierId(supplierId); + if (Objects.isNull(companyAuditingVO)) { + if (supplierAllinpayService.getIsAllinpay()) { + SupplierCompanyVO supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + SupplierCompanyAuditingVO supplierCompanyAuditingVO = new SupplierCompanyAuditingVO(); + supplierCompanyAuditingVO.setSupplierCompanyVO(supplierCompanyVO); + return supplierCompanyAuditingVO; + } + return null; + } + SupplierCompanyVO supplierCompanyVO = supplierCompanyService.getById(companyAuditingVO.getSupplierCompanyId()); + companyAuditingVO.setSupplierCompanyVO(supplierCompanyVO); + return companyAuditingVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCompanyInfoResult(String bizUserId, Integer status, Integer result, String failReason) { + Long supplierId = Long.valueOf(bizUserId.substring(AllinpayConstant.SUPPLIER_LENGTH)); + SupplierCompanyVO waitAuditShopCompany = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + SupplierCompanyVO successShopCompany = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.SUCCESSAUDIT.value()); + SupplierCompanyAuditingVO supplierCompanyAuditingVO = getLatestAuditingBySupplierId(supplierId); + // 更新失败 + if (Objects.equals(result, com.tmerclub.cloud.api.payment.constant.AuditStatus.FAIL.getCode())) { + logger.info("通联回调审核供应商{}修改的工商信息失败,拒绝更新,原因为{}", supplierId, failReason); + audit(new SupplierCompanyAuditingDTO(supplierCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } + // 更新成功 + if (Objects.equals(result, com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode())) { + // 如果有改变企业名称,法人名称,需要重新签约提现协议 + checkChangeName(waitAuditShopCompany, successShopCompany, supplierId); + if (getIsChangeIdCard(BeanUtil.map(waitAuditShopCompany, SupplierCompanyDTO.class), successShopCompany)) { + logger.info("通联回调审核供应商{}修改的工商信息成功,修改了影印件,重新上传影印件", supplierId); + // 修改了影印件 + String idCardCollectResult = supplierCompanyService.idCardCollect(waitAuditShopCompany, supplierId); + if (!Objects.equals(idCardCollectResult, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + logger.info("通联回调审核供应商{}修改的工商信息成功,影印件上传异常,拒绝申请", supplierId); + audit(new SupplierCompanyAuditingDTO(supplierCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), "影印件上传异常,请重试")); + return; + } + // 更新供应商为通联上线待审核,影印件审核通过即可营业 + supplierDetailMapper.updateSupplierToWaitAudit(supplierId); + // 更新供应商影印件采集状态 + supplierDetailMapper.updateAllinpayIdCardStatus(supplierId, IdCardCollectProcessStatus.WAIT_AUDIT.value()); + } else { + logger.info("通联回调审核供应商{}修改的工商信息成功,没有修改影印件", supplierId); + if (!Objects.equals(status, IdCardCollectProcessStatus.ALL.value())) { + logger.info("通联回调审核供应商{}修改的工商信息成功,没有修改影印件,影印件ocr失败", supplierId); + // 影印件ocr失败了,对供应商进行状态更新 + // 更新供应商为通联上线待审核,影印件审核通过即可营业 + supplierDetailMapper.updateSupplierToWaitAudit(supplierId); + // 更新供应商影印件采集状态 + supplierDetailMapper.updateAllinpayIdCardStatus(supplierId, status); + return; + } + // 审核成功 + audit(new SupplierCompanyAuditingDTO(supplierCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.SUCCESSAUDIT.value(), "")); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAllinpaySupplierStatus(String bizUserId, Integer status, String failReason, Integer isPassShop) { + Long supplierId = Long.valueOf(bizUserId.substring(AllinpayConstant.SUPPLIER_LENGTH)); + SupplierApiDetailVO supplierDetailVO = supplierDetailService.getBySupplierId(supplierId); + if (Objects.equals(status, com.tmerclub.cloud.api.payment.constant.AuditStatus.FAIL.getCode())) { + logger.info("通联审核供应商企业信息失败"); + if (Objects.equals(supplierDetailVO.getAllinpaySupplierStatus(), AllinpayShopStatus.OFFLINE.value()) && Objects.equals(supplierDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.FAIL.value())) { + logger.info("供应商{}状态已经处理过,无需下线处理", supplierDetailVO.getSupplierName()); + return; + } + authFail(bizUserId, failReason, supplierId); + } else if (Objects.equals(status, com.tmerclub.cloud.api.payment.constant.AuditStatus.SUCCESS.getCode())) { + logger.info("通联审核供应商企业信息成功"); + if (Objects.equals(supplierDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value()) && Objects.equals(supplierDetailVO.getCompanyInfoProcessStatus(), CompanyInfoProcessStatus.SUCCESS.value())) { + return; + } + SupplierCompanyVO supplierCompanyVO = supplierCompanyService.getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.WAITAUDIT.value()); + // 审核成功 更新供应商状态 + supplierBankCardService.updateSupplierAllinpayStatusToSuccess(supplierId); + if (!Objects.equals(supplierDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + // 调用影印件上传接口 + String idCardResult = supplierCompanyService.idCardCollect(supplierCompanyVO, supplierId); + if (!Objects.equals(idCardResult, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + logger.error("供应商设置企业信息回调,影印件上传审核失败:{}", idCardResult); + } + } + } + supplierDetailService.removeCacheBySupplierId(supplierId); + } + + private void authFail(String bizUserId, String failReason, Long supplierId) { + SupplierCompanyAuditingVO supplierCompanyAuditingVO = getLatestAuditingBySupplierId(supplierId); + if (Objects.nonNull(supplierCompanyAuditingVO) && Objects.equals(supplierCompanyAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value())) { + logger.info("供应商Id{}已经开店,通联审核失败,拒绝供应商的工商申请", supplierId); + // 如果是已经开店来审核的话要把审核拒绝通过 + audit(new SupplierCompanyAuditingDTO(supplierCompanyAuditingVO.getCompanyAuditingId(), AuditStatus.FAILAUDIT.value(), failReason)); + } else { + logger.info("供应商Id{}还未开店,通联审核失败,拒绝供应商的开店申请", supplierId); + // 还未开店,审核失败 + SupplierAuditingVO supplierAuditingVO = supplierAuditingService.getBySupplierId(supplierId); + SupplierAuditingDTO supplierAuditingDTO = BeanUtil.map(supplierAuditingVO, SupplierAuditingDTO.class); + supplierAuditingDTO.setStatus(AuditStatus.FAILAUDIT.value()); + supplierAuditingDTO.setRemarks(failReason); + supplierDetailService.audit(supplierAuditingDTO); + } + // 更新审核失败——平台下线 + supplierDetailMapper.updateSupplierAuditFail(supplierId); + logger.info("供应商id为{}通联审核失败原因:{}", bizUserId, failReason); + } + + private void checkChangeName(SupplierCompanyVO supplierCompanyDTO, SupplierCompanyVO supplierCompanyVO, Long supplierId) { + if (!Objects.equals(supplierCompanyVO.getFirmName(), supplierCompanyDTO.getFirmName())) { + logger.info("通联回调审核供应商{}修改的工商信息成功,修改了企业名称,需要重新签约对公提现协议", supplierId); + supplierDetailMapper.updateAcctProtocolNoByType(supplierId, SignAcctType.COMPANY.getValue(), null); + } + if (!Objects.equals(supplierCompanyVO.getRepresentative(), supplierCompanyDTO.getRepresentative())) { + logger.info("通联回调审核供应商{}修改的工商信息成功,修改了法人姓名,需要重新签约法人提现协议", supplierId); + supplierDetailMapper.updateAcctProtocolNoByType(supplierId, SignAcctType.LEGAL_PERSON.getValue(), null); + } + } + + private boolean getIsChangeIdCard(SupplierCompanyDTO supplierCompanyDTO, SupplierCompanyVO supplierCompanyVO) { + if (Objects.isNull(supplierCompanyVO)) { + return true; + } + if (!Objects.equals(supplierCompanyVO.getBusinessLicense(), supplierCompanyDTO.getBusinessLicense())) { + return true; + } + if (!Objects.equals(supplierCompanyVO.getIdentityCardFront(), supplierCompanyDTO.getIdentityCardFront())) { + return true; + } + return !Objects.equals(supplierCompanyVO.getIdentityCardLater(), supplierCompanyDTO.getIdentityCardLater()); + } + + private boolean getIsChangeInfo(SupplierCompanyDTO supplierCompanyDTO, SupplierCompanyVO supplierCompanyVO) { + if (Objects.isNull(supplierCompanyVO)) { + return true; + } + if (!Objects.equals(supplierCompanyDTO.getResidence(), supplierCompanyVO.getResidence())) { + return true; + } + return !Objects.equals(supplierCompanyDTO.getLegalPhone(), supplierCompanyVO.getLegalPhone()); + } + + private boolean getIsChangeKeyInfo(SupplierCompanyDTO supplierCompanyDTO, SupplierCompanyVO supplierCompanyVO) { + if (Objects.isNull(supplierCompanyVO)) { + return true; + } + if (!Objects.equals(supplierCompanyDTO.getFirmName(), supplierCompanyVO.getFirmName())) { + return true; + } + if (!Objects.equals(supplierCompanyDTO.getRepresentative(), supplierCompanyVO.getRepresentative())) { + return true; + } + return !Objects.equals(supplierCompanyDTO.getLegalIds(), supplierCompanyVO.getLegalIds()); + } + + /** + * 生成供应商申请记录 + * + * @param supplierCompany + */ + private Long generateAuditInformation(SupplierCompany supplierCompany) { + SupplierCompanyAuditing supplierCompanyAuditing = new SupplierCompanyAuditing(); + supplierCompanyAuditing.setSupplierId(supplierCompany.getSupplierId()); + supplierCompanyAuditing.setSupplierCompanyId(supplierCompany.getSupplierCompanyId()); + supplierCompanyAuditing.setUserId(AuthUserContext.get().getUserId()); + supplierCompanyAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + companyAuditingMapper.insert(supplierCompanyAuditing); + return supplierCompanyAuditing.getCompanyAuditingId(); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierCompanyServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierCompanyServiceImpl.java new file mode 100644 index 0000000..801ebf3 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierCompanyServiceImpl.java @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.biz.feign.AttachFileFeignClient; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.IdCardCollectByFileUploadResp; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.bean.UploadFile; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.IdCardCollectProcessStatus; +import com.tmerclub.cloud.common.constant.PicType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.supplier.constant.AuditStatus; +import com.tmerclub.cloud.supplier.dto.AllinpaySupplierBankCardDTO; +import com.tmerclub.cloud.supplier.dto.SupplierCompanyDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierCompanyMapper; +import com.tmerclub.cloud.supplier.mapper.SupplierDetailMapper; +import com.tmerclub.cloud.supplier.model.SupplierAuditing; +import com.tmerclub.cloud.supplier.model.SupplierCompany; +import com.tmerclub.cloud.supplier.service.*; +import com.tmerclub.cloud.supplier.vo.SupplierAuditingVO; +import com.tmerclub.cloud.supplier.vo.SupplierCompanyVO; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + +/** + * 供应商工商信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierCompanyServiceImpl implements SupplierCompanyService { + private static final Logger LOGGER = LoggerFactory.getLogger(SupplierCompanyServiceImpl.class); + + @Autowired + private SupplierCompanyMapper supplierCompanyMapper; + @Autowired + private SupplierAuditingService supplierAuditingService; + @DubboReference + private AttachFileFeignClient attachFileFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + @Autowired + private SupplierDetailMapper supplierDetailMapper; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + @Autowired + @Lazy + private SupplierDetailService supplierDetailService; + @Autowired + private SupplierBankCardService supplierBankCardService; + @Autowired + private FeignShopConfig feignShopConfig; + + private static final String HTTP = "http"; + private static final String JPG = "jpg"; + private static final String PNG = "png"; + private static final Integer ID_CARD_FAIL_RESULT = 2; + + @Transactional(rollbackFor = Exception.class) + @Override + public void updateBySupplierId(SupplierCompany supplierCompany, Long supplierId, Integer temp) { + this.checkInfo(supplierCompany, false, temp); + supplierCompanyMapper.updateBySupplierId(supplierCompany, supplierId, temp); + } + + @Override + public SupplierCompanyVO getById(Long supplierCompanyId) { + SupplierCompany supplierCompany = supplierCompanyMapper.getBySupplierCompanyId(supplierCompanyId); + return BeanUtil.map(supplierCompany, SupplierCompanyVO.class); + } + + @Override + public SupplierCompanyVO getSupplierCompanyBySupplierIdAndStatus(Long supplierId, Integer status) { + SupplierCompanyVO supplierCompanyVO = supplierCompanyMapper.getSupplierCompanyBySupplierIdAndStatus(supplierId, status); + // 检查工商信息是否有更新记录,若存在更新记录则发请求 查询审核信息 (逻辑上或许可以修改为存在多条工商信息记录) + if (Objects.nonNull(supplierCompanyVO)) { + Integer recordStatus = supplierCompanyMapper.getLatestRecord(supplierId); + if (!Objects.equals(AuditStatus.SUCCESSAUDIT.value(), recordStatus)) { + supplierCompanyVO.setEdit(true); + supplierCompanyVO.setNewStatus(recordStatus); + } + } + return supplierCompanyVO; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(SupplierCompany supplierCompany, boolean isCreate) { + this.checkInfo(supplierCompany, isCreate, null); + supplierCompanyMapper.save(supplierCompany); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SupplierCompany supplierCompany) { + supplierCompanyMapper.update(supplierCompany); + } + + @Override + public Boolean checkCreditCode(String creditCode, Long supplierId) { + List supplierIds = supplierCompanyMapper.getSupplierIdByCreditCode(creditCode); + if (CollUtil.isNotEmpty(supplierIds)) { + boolean isSame = true; + for (Long creditSupplierId : supplierIds) { + if (!Objects.equals(creditSupplierId, supplierId)) { + LOGGER.info("供应商信用代码重复"); + isSame = false; + break; + } + } + return !isSame; + } + return false; + } + + @Override + public void deleteBySupplierIdAndStatus(Long supplierId, Integer status) { + supplierCompanyMapper.deleteBySupplierIdAndStatus(supplierId, status); + } + + @Override + public void batchUpdateStatus(Long supplierId, Integer status, Integer dbStatus) { + supplierCompanyMapper.batchUpdateStatus(supplierId, status, dbStatus); + } + + /** + * 校验供应商工商信息,isCreate为true代表校验新增时的信息,false代表校验更新时的信息 + * @param supplierCompany + * @param isCreate + * @param temp 0代表通过审核,1代表平台修改 + */ + @Override + public void checkInfo(SupplierCompany supplierCompany, Boolean isCreate, Integer temp) { + if (isCreate) { + SupplierCompanyVO oldCompany = supplierCompanyMapper.getSupplierCompanyBySupplierIdAndStatus(supplierCompany.getSupplierId(), AuditStatus.SUCCESSAUDIT.value()); + if (Objects.nonNull(oldCompany)) { + throw new LuckException("供应商工商信息已存在,不能重复新增"); + } + } else { + SupplierAuditingVO supplierAuditingVO = supplierAuditingService.getBySupplierId(supplierCompany.getSupplierId()); + if (Objects.nonNull(supplierAuditingVO) && Objects.equals(supplierAuditingVO.getStatus(), AuditStatus.WAITAUDIT.value()) + && !supplierAllinpayService.getIsAllinpay() && !Objects.equals(temp, 0)) { + throw new LuckException("供应商处于待审核状态,无法修改供应商信息"); + } + } + if (checkCreditCode(supplierCompany.getCreditCode(), supplierCompany.getSupplierId())) { + throw new LuckException("统一信用码重复"); + } + if (supplierCompany.getEndTime() != null && !supplierCompany.getStartTime().before(supplierCompany.getEndTime())) { + throw new LuckException("营业起始日期不能大于营业终止时间"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateById(SupplierCompany supplierCompany) { + supplierCompanyMapper.updateById(supplierCompany); + } + + @Override + public String idCardCollect(SupplierCompanyVO supplierCompany, Long supplierId) { + // 该方法会上传营业执照和身份证 + String businessLicense = getImgUrl(supplierCompany.getBusinessLicense(), PicType.BUSINESS_LICENSE.getCode()); + if (!businessLicense.contains(HTTP)) { + LOGGER.info("供应商营业执照获取文件路径失败,原因{}", businessLicense); + return businessLicense; + } + ServerResponseEntity buinessLicense = allinpayFeignClient.idCardCollectByFileUpload(null, + null, PicType.BUSINESS_LICENSE.getCode(), businessLicense, AllinpayConstant.SUPPLIER + supplierId); + if (!buinessLicense.isSuccess() || Objects.equals(buinessLicense.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "供应商审核通过,影印件上传失败,原因为:" + (Objects.isNull(buinessLicense.getMsg()) ? buinessLicense.getData().getFailReason() : buinessLicense.getMsg()); + } + // 人面像 + String legalPicFaceToken = getImgUrl(supplierCompany.getIdentityCardFront(), PicType.FRONT_OF_ID_CARD.getCode()); + if (!legalPicFaceToken.contains(HTTP)) { + LOGGER.info("供应商身份证-人面像获取文件路径失败,原因{}", legalPicFaceToken); + return legalPicFaceToken; + } + // 国徽面 + String legalPicEmblemToken = getImgUrl(supplierCompany.getIdentityCardLater(), PicType.REVERSE_SIDE_OF_ID_CARD.getCode()); + if (!legalPicEmblemToken.contains(HTTP)) { + LOGGER.info("供应商身份证-国徽像获取文件路径失败,原因{}", legalPicEmblemToken); + return legalPicEmblemToken; + } + ServerResponseEntity fileUpload = allinpayFeignClient.idCardCollectByFileUpload(legalPicFaceToken, + legalPicEmblemToken, null, null, AllinpayConstant.SUPPLIER + supplierId); + if (!fileUpload.isSuccess() || Objects.equals(fileUpload.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "供应商审核通过,影印件上传失败,原因为:" + (Objects.isNull(fileUpload.getMsg()) ? fileUpload.getData().getFailReason() : fileUpload.getMsg()); + } + // 所有都上传成功,改变供应商影印件状态 + supplierDetailMapper.updateAllinpayIdCardStatus(supplierId, IdCardCollectProcessStatus.WAIT_AUDIT.value()); + return AllinpayConstant.ALLINPAY_AUDIT_SUCCESS; + } + + @Override + public void updateStatusToWaitAudit() { + supplierCompanyMapper.updateStatusToWaitAudit(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String uploadIdCard(SupplierCompanyDTO supplierCompanyDTO, SupplierApiDetailVO supplierApiDetailVO, Integer status) { + Long supplierId = supplierApiDetailVO.getSupplierId(); + if (!Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), status)) { + // 状态不同先更新状态 + supplierDetailService.updateAllinpayIdCardStatus(AllinpayConstant.SUPPLIER + supplierId, status); + supplierApiDetailVO.setIdCardCollectProcessStatus(status); + } + if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ALL.value())) { + return "影印件已审核通过,请刷新页面"; + } + if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.WAIT_AUDIT.value())) { + return "影印件待审核中,请刷新影印件"; + } + if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.UN_COMMITTED.value())) { + LOGGER.info("供应商{}影印件上传失败,尝试重新上传", supplierId); + // 还没提交上传 + SupplierCompanyVO supplierCompanyVO = BeanUtil.map(supplierCompanyDTO, SupplierCompanyVO.class); + String result = idCardCollect(supplierCompanyVO, supplierId); + if (Objects.equals(result, AllinpayConstant.ALLINPAY_AUDIT_SUCCESS)) { + supplierCompanyMapper.updateIdCardById(supplierCompanyVO); + } + return result; + } + if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.REG.value())) { + LOGGER.info("供应商{}影印件只有工商信息审核通过了,尝试重新上传身份证信息", supplierId); + // 只有工商信息审核通过了,重新提交下身份证信息 + // 国徽面 + String legalPicEmblemToken = getImgUrl(supplierCompanyDTO.getIdentityCardLater(), PicType.REVERSE_SIDE_OF_ID_CARD.getCode()); + if (!legalPicEmblemToken.contains(HTTP)) { + LOGGER.info("供应商重新上传身份证-国徽像获取文件路径失败,原因{}", legalPicEmblemToken); + return legalPicEmblemToken; + } + // 人面像 + String legalPicFaceToken = getImgUrl(supplierCompanyDTO.getIdentityCardFront(), PicType.FRONT_OF_ID_CARD.getCode()); + if (!legalPicFaceToken.contains(HTTP)) { + LOGGER.info("供应商重新上传身份证-人面像获取文件路径失败,原因{}", legalPicFaceToken); + return legalPicFaceToken; + } + ServerResponseEntity fileUpload = allinpayFeignClient.idCardCollectByFileUpload(legalPicFaceToken, + legalPicEmblemToken, null, null, AllinpayConstant.SUPPLIER + supplierId); + if (!fileUpload.isSuccess() || Objects.equals(fileUpload.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "供应商审核通过,影印件-身份证信息上传失败,原因为:" + (Objects.isNull(fileUpload.getMsg()) ? fileUpload.getData().getFailReason() : fileUpload.getMsg()); + } + supplierCompanyMapper.updateIdCardById(BeanUtil.map(supplierCompanyDTO, SupplierCompanyVO.class)); + } + if (Objects.equals(supplierApiDetailVO.getIdCardCollectProcessStatus(), IdCardCollectProcessStatus.ID_CARD.value())) { + LOGGER.info("供应商{}影印件只有法人信息通过,尝试重新上传工商信息", supplierId); + // 只有法人信息通过,重新提交下工商信息 + String businessLicense = getImgUrl(supplierCompanyDTO.getBusinessLicense(), PicType.BUSINESS_LICENSE.getCode()); + if (!businessLicense.contains(HTTP)) { + LOGGER.info("供应商重新上传营业执照获取文件路径失败,原因{}", businessLicense); + return businessLicense; + } + ServerResponseEntity fileUpload = allinpayFeignClient.idCardCollectByFileUpload(null, + null, PicType.BUSINESS_LICENSE.getCode(), businessLicense, AllinpayConstant.SUPPLIER + supplierId); + if (!fileUpload.isSuccess() || Objects.equals(fileUpload.getData().getResult(), ID_CARD_FAIL_RESULT)) { + return "供应商审核通过,影印件-营业执照信息上传失败,原因为:" + (Objects.isNull(fileUpload.getMsg()) ? fileUpload.getData().getFailReason() : fileUpload.getMsg()); + } + supplierCompanyMapper.updateIdCardById(BeanUtil.map(supplierCompanyDTO, SupplierCompanyVO.class)); + } + return "影印件更新成功"; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void platformUpdateSupplierCompany(SupplierCompany supplierCompany, Long supplierId) { + this.checkInfo(supplierCompany, false, null); + // 通联开启后,平台更新商家的工商信息也需要通过通联审核 + // 且只有平台开店审核失败的店铺才能更改工商信息,所以这里只需要设置企业信息,同步返回 + SupplierCompanyVO supplierCompanyVO = getSupplierCompanyBySupplierIdAndStatus(supplierId, AuditStatus.SUCCESSAUDIT.value()); + if (Objects.nonNull(supplierCompanyVO)) { + throw new LuckException("工商信息已通过,无需修改"); + } + List supplierBankCardList = supplierBankCardService.listBySupplierId(supplierId); + if (CollUtil.isEmpty(supplierBankCardList)) { + throw new LuckException("供应商银行卡为空,请补充"); + } + updateBySupplierId(supplierCompany, supplierCompany.getSupplierId(), 0); + // 更新开店为待审核状态,影印件才可以回调 + SupplierAuditingVO supplierAuditingVO = supplierAuditingService.getBySupplierId(supplierId); + SupplierAuditing shopAuditing = BeanUtil.map(supplierAuditingVO, SupplierAuditing.class); + shopAuditing.setStatus(AuditStatus.WAITAUDIT.value()); + shopAuditing.setRemarks("平台提交申请"); + if (Objects.equals(supplierAuditingVO.getStatus(), AuditStatus.FAILAUDIT.value())) { + supplierAuditingService.update(shopAuditing); + } + // 通联审核 + SupplierBankCardVO supplierBankCardVO = supplierBankCardList.get(0); + AllinpaySupplierBankCardDTO allinpaySupplierBankCardDTO = new AllinpaySupplierBankCardDTO(); + allinpaySupplierBankCardDTO.setAccountNo(supplierBankCardVO.getCardNo()); + allinpaySupplierBankCardDTO.setParentBankName(supplierBankCardVO.getBankName()); + allinpaySupplierBankCardDTO.setBankName(supplierBankCardVO.getBranchName()); + allinpaySupplierBankCardDTO.setUnionBank(supplierBankCardVO.getUnionBank()); + SupplierApiDetailVO supplierApiDetailVO = supplierDetailService.getBySupplierId(supplierId); + supplierBankCardService.allinpaySetCompanyInfo(allinpaySupplierBankCardDTO, supplierId, BeanUtil.map(supplierCompany, SupplierCompanyVO.class), supplierApiDetailVO); + } + + private String getImgUrl(String imageUrl, Integer picType) { + if (Objects.isNull(imageUrl)) { + return "供应商审核通过," + PicType.getPicTypeName(picType) + "为空,请重新上传"; + } + ServerResponseEntity responseEntity = attachFileFeignClient.getfileTypeByfilePath(imageUrl); + String fileType = responseEntity.getData(); + if (Objects.isNull(fileType)) { + return "供应商审核通过," + PicType.getPicTypeName(picType) + "该图片类型为空"; + } + UploadFile uploadFile = feignShopConfig.getUploadFile(); + String imgDomain = uploadFile.getResourceUrl(); + if (!imageUrl.contains(HTTP)) { + // 给imageUrl 加上文件全路径 + if (Objects.isNull(imgDomain)) { + // 未配置文件域名,无法上传成功图片 + return "供应商审核通过," + "未配置文件域名,无法上传成功图片"; + } + imageUrl = StringUtils.join(imgDomain, imageUrl); + } + return imageUrl; + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierExtensionServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierExtensionServiceImpl.java new file mode 100644 index 0000000..f1158d0 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierExtensionServiceImpl.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.supplier.mapper.SupplierExtensionMapper; +import com.tmerclub.cloud.supplier.model.SupplierExtension; +import com.tmerclub.cloud.supplier.service.SupplierExtensionService; +import com.tmerclub.cloud.supplier.vo.SupplierExtensionVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 供应商扩张信息 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierExtensionServiceImpl implements SupplierExtensionService { + + @Autowired + private SupplierExtensionMapper supplierExtensionMapper; + + @Override + public void save(SupplierExtension supplierExtension) { + supplierExtensionMapper.save(supplierExtension); + } + + @Override + public void update(SupplierExtensionVO supplierExtension) { + supplierExtensionMapper.update(supplierExtension); + } + +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierRefundAddrServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierRefundAddrServiceImpl.java new file mode 100644 index 0000000..7aa4386 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierRefundAddrServiceImpl.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.supplier.dto.SupplierRefundAddrDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierRefundAddrMapper; +import com.tmerclub.cloud.supplier.model.SupplierRefundAddr; +import com.tmerclub.cloud.supplier.service.SupplierRefundAddrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; + +/** + * 供应商退货地址 + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +@Service +public class SupplierRefundAddrServiceImpl implements SupplierRefundAddrService { + + @Autowired + private SupplierRefundAddrMapper supplierRefundAddrMapper; + + @Override + public PageVO page(PageDTO pageDTO, SupplierRefundAddrDTO supplierRefundAddrDTO) { + return PageUtil.doPage(pageDTO, () -> supplierRefundAddrMapper.list(supplierRefundAddrDTO)); + } + + @Override + public SupplierApiRefundAddrVO getBySupplierRefundAddrId(Long supplierRefundAddrId, Long supplierId) { + return supplierRefundAddrMapper.getBySupplierRefundAddrId(supplierRefundAddrId, supplierId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(SupplierRefundAddr supplierRefundAddr) { + if (Objects.equals(supplierRefundAddr.getIsDefault(), 1)) { + supplierRefundAddrMapper.cancelDefaultAddr(supplierRefundAddr.getSupplierId()); + } else { + // 第一个地址自动为默认地址 + List refundAddrs = this.listBySupplierId(supplierRefundAddr.getSupplierId()); + if (CollectionUtils.isEmpty(refundAddrs)) { + supplierRefundAddr.setIsDefault(1); + } + } + supplierRefundAddrMapper.save(supplierRefundAddr); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SupplierRefundAddr supplierRefundAddr) { + SupplierApiRefundAddrVO dbSupplierRefund = getBySupplierRefundAddrId(supplierRefundAddr.getSupplierRefundAddrId(), supplierRefundAddr.getSupplierId()); + if (Objects.isNull(dbSupplierRefund)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } else if (!Objects.equals(supplierRefundAddr.getSupplierId(), dbSupplierRefund.getSupplierId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!PrincipalUtil.isDbPhone(supplierRefundAddr.getMobile(), dbSupplierRefund.getMobile(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (supplierRefundAddr.getMobile().contains(Constant.ASTERISK)) { + supplierRefundAddr.setMobile(dbSupplierRefund.getMobile()); + } + // 取消默认 + if (Objects.equals(supplierRefundAddr.getIsDefault(), 0) + && Objects.equals(dbSupplierRefund.getIsDefault(), 1)) { + throw new LuckException("默认地址禁止取消"); + } + // 设置默认 + if (Objects.equals(supplierRefundAddr.getIsDefault(), 1) && Objects.equals(dbSupplierRefund.getIsDefault(), 0)) { + supplierRefundAddrMapper.cancelDefaultAddr(supplierRefundAddr.getSupplierId()); + } + supplierRefundAddrMapper.update(supplierRefundAddr); + } + + @Override + public void deleteById(Long supplierRefundAddrId, Long supplierId) { + SupplierApiRefundAddrVO dbSupplierRefund = getBySupplierRefundAddrId(supplierRefundAddrId, supplierId); + if (Objects.isNull(dbSupplierRefund)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } else if (!Objects.equals(dbSupplierRefund.getSupplierId(), supplierId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (Objects.equals(dbSupplierRefund.getIsDefault(), 1)) { + throw new LuckException("默认地址禁止删除"); + } + supplierRefundAddrMapper.deleteById(supplierRefundAddrId); + } + + @Override + @Cacheable(cacheNames = CacheNames.SUPPLIER_REFUND_ADDR, key = "#supplierId", sync = true) + public List listBySupplierId(Long supplierId) { + return supplierRefundAddrMapper.listBySupplierId(supplierId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.SUPPLIER_REFUND_ADDR, key = "#supplierId") + public void removeCacheBySupplierId(Long supplierId) { + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWalletServiceImpl.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWalletServiceImpl.java new file mode 100644 index 0000000..59447cb --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/service/impl/SupplierWalletServiceImpl.java @@ -0,0 +1,532 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.BooleanUtil; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.api.supplier.bo.SupplierWalletBO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.supplier.constant.SupplierWalletAmountType; +import com.tmerclub.cloud.supplier.constant.SupplierWalletChangeReason; +import com.tmerclub.cloud.supplier.dto.SupplierWalletLogSearchDTO; +import com.tmerclub.cloud.supplier.mapper.SupplierWalletMapper; +import com.tmerclub.cloud.supplier.mongo.MongoSupplierWalletLogBO; +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierWalletLogService; +import com.tmerclub.cloud.supplier.service.SupplierWalletService; +import com.tmerclub.cloud.supplier.vo.SupplierWalletVO; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.mongodb.core.query.Update; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 商家钱包信息 + * + * @author FrozenWatermelon + * @date 2021-01-07 16:41:03 + */ +@Service +public class SupplierWalletServiceImpl implements SupplierWalletService { + + @Autowired + private SupplierWalletMapper supplierWalletMapper; + @Autowired + private SupplierWalletLogService supplierWalletLogService; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private RocketMQTemplate addSupplierWalletLogTemplate; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + + private static final Logger logger = LoggerFactory.getLogger(SupplierWalletServiceImpl.class); + + @Override + @Transactional(rollbackFor = Exception.class) + public void addAmountByOrder(List orderSimpleAmountInfos) { + + // 进行分账,添加一个分账记录表,因为每一个订单进行分完帐后要进行退款,那么退款的时候也应该按照下单的时候的分账比例进行原路返回 + // 获取当前分账的比例 + + List supplierWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderSimpleAmountInfoBO orderSimpleAmountInfo : orderSimpleAmountInfos) { + // 商家之所以会从一笔订单拿到钱,是因为订单支付成功 + long count = supplierWalletLogService.countInAmountByOrderId(orderSimpleAmountInfo.getOrderId(), SupplierWalletChangeReason.PAY.value()); + // 幂等 + if (count > 0) { + return; + } + // 供应商收入金额为 = 采购金额 + 运费 - 平台佣金,在之前已经处理,这里直接拿 + Long changeAmount = orderSimpleAmountInfo.getPurchaseAmount(); + + // 商家添加未结算金额(因为添加了唯一索引,所以是不用怕多次加钱) + supplierWalletMapper.addUnsettledAmount(orderSimpleAmountInfo.getSupplierId(), changeAmount, orderSimpleAmountInfo.getPaySysType()); + MongoSupplierWalletLogBO supplierWalletLog = new MongoSupplierWalletLogBO(); + + supplierWalletLog.setWalletLogId(orderSimpleAmountInfo.getWalletLogId()); + supplierWalletLog.setOrderId(orderSimpleAmountInfo.getOrderId()); + supplierWalletLog.setPaySysType(Objects.isNull(orderSimpleAmountInfo.getPaySysType()) ? 0 : orderSimpleAmountInfo.getPaySysType()); + supplierWalletLog.setReason(SupplierWalletChangeReason.PAY.value()); + supplierWalletLog.setSupplierId(orderSimpleAmountInfo.getSupplierId()); + supplierWalletLog.setIoType(1); + supplierWalletLog.setCreateTime(new Date()); + supplierWalletLog.setUpdateTime(new Date()); + supplierWalletLog.setChangeAmount(changeAmount); + supplierWalletLog.setFreightAmount(orderSimpleAmountInfo.getFreightAmount() + Math.abs(orderSimpleAmountInfo.getFreeFreightAmount())); + supplierWalletLog.setAmountType(SupplierWalletAmountType.UNSETTLED_AMOUNT.value()); + supplierWalletLog.setUserAmount(orderSimpleAmountInfo.getActualTotal()); + supplierWalletLog.setDistributionAmount(orderSimpleAmountInfo.getDistributionAmount()); + supplierWalletLog.setPlatformAmount(orderSimpleAmountInfo.getPlatformAmount()); + supplierWalletLog.setPlatformCommission(orderSimpleAmountInfo.getPurchasePlatformCommission()); + logger.info("供应商添加待结算金额完成,增加结算日志{}", supplierWalletLog); + // 添加日志 + supplierWalletLogList.add(supplierWalletLog); + } + logger.info("供应商添加待结算金额完成,增加结算日志{}条", supplierWalletLogList.size()); + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(supplierWalletLogList)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addAmountBySettledOrder(Long orderId) { + + // 商家之所以会从一笔订单拿到钱,是因为确认收货 or 订单退款时有部分不退 + long count = supplierWalletLogService.countInAmountByOrderId(orderId, SupplierWalletChangeReason.SETTLED.value()); + // 幂等 + if (count > 0) { + return; + } + + SupplierWalletLogSearchDTO supplierWalletLogSearchDTO = new SupplierWalletLogSearchDTO(); + supplierWalletLogSearchDTO.setOrderId(orderId); + List supplierWalletLogs = supplierWalletLogService.listByParam(supplierWalletLogSearchDTO); + if (CollectionUtil.isEmpty(supplierWalletLogs)) { + return; + } + // 商家需要结算的钱 + MongoSupplierWalletLogBO supplierPayLog = null; + + MongoSupplierWalletLogBO supplierRefundLog = new MongoSupplierWalletLogBO(); + supplierRefundLog.setChangeAmount(0L); + supplierRefundLog.setPlatformAmount(0L); + supplierRefundLog.setPlatformCommission(0L); + supplierRefundLog.setUserAmount(0L); + supplierRefundLog.setDistributionAmount(0L); + for (MongoSupplierWalletLogBO supplierWalletLog : supplierWalletLogs) { + // 下单 + MongoSupplierWalletLogBO payLog = polymerizationSupplierWalletLog(supplierRefundLog, supplierWalletLog); + if (payLog != null) { + supplierPayLog = payLog; + } + } + // 非积分订单需要保存供应商结算记录 + if (Objects.nonNull(supplierPayLog)) { + // 保存供应商结算记录 + saveSettledLog(supplierPayLog, supplierRefundLog); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public SplitRuleVO getSupplierSettledInfoByOrderId(Long orderId) { + + // 商家之所以会从一笔订单拿到钱,是因为确认收货 or 订单退款时有部分不退 + long count = supplierWalletLogService.countInAmountByOrderId(orderId, SupplierWalletChangeReason.SETTLED.value()); + // 幂等 + if (count > 0) { + return null; + } + + SupplierWalletLogSearchDTO supplierWalletLogSearchDTO = new SupplierWalletLogSearchDTO(); + supplierWalletLogSearchDTO.setOrderId(orderId); + List supplierWalletLogs = supplierWalletLogService.listByParam(supplierWalletLogSearchDTO); + if (CollectionUtil.isEmpty(supplierWalletLogs)) { + return null; + } + // 商家需要结算的钱 + MongoSupplierWalletLogBO supplierPayLog = null; + + MongoSupplierWalletLogBO supplierRefundLog = new MongoSupplierWalletLogBO(); + supplierRefundLog.setUserAmount(0L); + supplierRefundLog.setDistributionAmount(0L); + supplierRefundLog.setPlatformAmount(0L); + supplierRefundLog.setPlatformCommission(0L); + for (MongoSupplierWalletLogBO supplierWalletLog : supplierWalletLogs) { + // 下单 + MongoSupplierWalletLogBO payLog = polymerizationSupplierWalletLog(supplierRefundLog, supplierWalletLog); + if (payLog != null) { + supplierPayLog = payLog; + } + } + // 非积分订单需要保存供应商结算记录 + if (Objects.nonNull(supplierPayLog)) { + Long changeAmount = supplierPayLog.getChangeAmount(); + SplitRuleVO splitRuleVO = new SplitRuleVO(); + splitRuleVO.setAmount(changeAmount - supplierRefundLog.getChangeAmount()); + splitRuleVO.setFee(supplierPayLog.getPlatformCommission() - supplierRefundLog.getPlatformCommission()); + splitRuleVO.setBizUserId(supplierPayLog.getSupplierId().toString()); + splitRuleVO.setOrderId(supplierPayLog.getOrderId()); + return splitRuleVO; + } + return null; + } + + /** + * 聚合订单支付退款导致商家金额变更的记录 + * + * @param refundWalletLog + * @param supplierWalletLog + * @return + */ + private MongoSupplierWalletLogBO polymerizationSupplierWalletLog(MongoSupplierWalletLogBO refundWalletLog, MongoSupplierWalletLogBO supplierWalletLog) { + if (Objects.equals(SupplierWalletChangeReason.PAY.value(), supplierWalletLog.getReason())) { + return supplierWalletLog; + } + // 退款 + else if (Objects.equals(SupplierWalletChangeReason.ORDER_REFUND.value(), supplierWalletLog.getReason())) { + refundWalletLog.setPaySysType(Objects.isNull(supplierWalletLog.getPaySysType()) ? 0 : supplierWalletLog.getPaySysType()); + refundWalletLog.setUserAmount(refundWalletLog.getUserAmount() + supplierWalletLog.getUserAmount()); + refundWalletLog.setDistributionAmount(0L); + refundWalletLog.setPlatformAmount(0L); + refundWalletLog.setPlatformCommission(refundWalletLog.getPlatformCommission() + supplierWalletLog.getPlatformCommission()); + // 如果因为退款收入,实际上是减少了退款的钱 + Long changeAmount = (supplierWalletLog.getIoType() == 1) ? -supplierWalletLog.getChangeAmount() : supplierWalletLog.getChangeAmount(); + refundWalletLog.setChangeAmount(refundWalletLog.getChangeAmount() + changeAmount); + } + return null; + } + + + private void saveSettledLog(MongoSupplierWalletLogBO supplierPayLog, MongoSupplierWalletLogBO supplierRefundLog) { + Long changeAmount = supplierPayLog.getChangeAmount(); + MongoSupplierWalletLogBO supplierWalletLog = new MongoSupplierWalletLogBO(); + supplierWalletLog.setOrderId(supplierPayLog.getOrderId()); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + supplierWalletLog.setWalletLogId(walletLogId); + supplierWalletLog.setReason(SupplierWalletChangeReason.SETTLED.value()); + supplierWalletLog.setSupplierId(supplierPayLog.getSupplierId()); + supplierWalletLog.setPaySysType(Objects.isNull(supplierPayLog.getPaySysType()) ? 0 : supplierPayLog.getPaySysType()); + supplierWalletLog.setCreateTime(new Date()); + supplierWalletLog.setUpdateTime(new Date()); + int ioType = supplierPayLog.getIoType(); + if (changeAmount - supplierRefundLog.getChangeAmount() < 0) { + ioType = 0; + } + // 如果之前未结算为负收入或者当前金额小于退款金额,则已结算的收入是负收入 + if (Objects.equals(ioType, 0)) { + changeAmount = -changeAmount - supplierRefundLog.getChangeAmount(); + } else { + changeAmount = changeAmount - supplierRefundLog.getChangeAmount(); + } + supplierWalletLog.setIoType(ioType); + supplierWalletLog.setAmountType(SupplierWalletAmountType.SETTLED_AMOUNT.value()); + supplierWalletLog.setChangeAmount(Math.abs(changeAmount)); + supplierWalletLog.setUserAmount(supplierPayLog.getUserAmount() - supplierRefundLog.getUserAmount()); + supplierWalletLog.setDistributionAmount(0L); + supplierWalletLog.setPlatformAmount(0L); + supplierWalletLog.setPlatformCommission(supplierPayLog.getPlatformCommission() - supplierRefundLog.getPlatformCommission()); + + // 用mq保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(Collections.singleton(supplierWalletLog))).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 供应商结算,分成 1.减少待结算金额 和 2.增加结算金额以及总结算金额 两步操作,因为添加结算金额需要上锁操作,细粒化 + // 1.减少待结算金额 + boolean subUnsettledAmountSuccess = subUnsettledAmount(supplierWalletLog.getSupplierId(), supplierPayLog.getOrderId(), changeAmount, supplierPayLog.getPaySysType()); + if (!subUnsettledAmountSuccess) { + throw new LuckException("您的待结算金额不足,无法进行结算"); + } + + // 2.增加结算金额以及总结算金额 + boolean addSettledAmountSuccess = supplierWalletMapper.addSettledAmount(supplierWalletLog.getSupplierId(), changeAmount, supplierPayLog.getPaySysType(), true) > 0; + if (!addSettledAmountSuccess) { + throw new LuckException("结算失败"); + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundSupplierAmountByRefund(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + + // 看看这个订单有没有锁定过 + long count = supplierWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), SupplierWalletChangeReason.ORDER_REFUND.value()); + // 幂等 + if (count > 0) { + return; + } + // 供应商发货订单,未发货单项退款,且是最后一个订单的运费处理-- 赋值位置:com.tmerclub.cloud.order.controller.supplier.OrderRefundController.agreeRefund + if (Objects.nonNull(orderChangeShopWalletAmountBO.getSupplierFreightAmount()) && BooleanUtil.isTrue(orderChangeShopWalletAmountBO.isLastOrder())) { + // 添加供应商发货的订单的运费,这个运费与商家和平台的运费处理规则不一致 + // 供应商发货的订单单项退款包含的运费为商品原本的运费,不受平台和商家运费减免金额的影响(商家不能修改供应商发货订单的运费,平台减免金额是给商家的,跟供应商没有关系) + orderChangeShopWalletAmountBO.setFreightAmount(orderChangeShopWalletAmountBO.getSupplierFreightAmount()); + } + // 供应商改变金额 = 供应商改变金额 + 供应商商品运费 - 平台供应商佣金改变量 + Long supplierRealRefundAmount = orderChangeShopWalletAmountBO.getChangePurchaseAmount() + orderChangeShopWalletAmountBO.getFreightAmount() - orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission(); + MongoSupplierWalletLogBO supplierWalletLog = new MongoSupplierWalletLogBO(); + supplierWalletLog.setWalletLogId(orderChangeShopWalletAmountBO.getWalletLogIds().remove(0)); + supplierWalletLog.setRefundId(orderChangeShopWalletAmountBO.getRefundId()); + supplierWalletLog.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + supplierWalletLog.setPaySysType(Objects.isNull(orderChangeShopWalletAmountBO.getPaySysType()) ? 0 : orderChangeShopWalletAmountBO.getPaySysType()); + supplierWalletLog.setReason(SupplierWalletChangeReason.ORDER_REFUND.value()); + supplierWalletLog.setSupplierId(orderChangeShopWalletAmountBO.getSupplierId()); + supplierWalletLog.setCreateTime(new Date()); + supplierWalletLog.setUpdateTime(new Date()); + supplierWalletLog.setFreightAmount(orderChangeShopWalletAmountBO.getFreightAmount()); + + // 用户申请的退款金额 + supplierWalletLog.setUserAmount(orderChangeShopWalletAmountBO.getRefundAmount()); + // 回退的分销金额 + supplierWalletLog.setDistributionAmount(0L); + // 回退的平台补贴 + supplierWalletLog.setPlatformAmount(0L); + // 回退的平台佣金 + supplierWalletLog.setPlatformCommission(orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission()); + // 商家改变金额 + supplierWalletLog.setChangeAmount(supplierRealRefundAmount); + // 扣除 + supplierWalletLog.setIoType(0); + + // 1. 订单未确认收货则扣未结算金额 + // 2. 商家撤销拼团活动时失效拼团时,将待成团的队伍进行退款 + + // 减少未结算金额 + boolean isSuccess = subUnsettledAmount(orderChangeShopWalletAmountBO.getSupplierId(), orderChangeShopWalletAmountBO.getOrderId(), supplierRealRefundAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!isSuccess) { + throw new LuckException("您的待结算金额不足,无法进行退款"); + } + + supplierWalletLog.setAmountType(SupplierWalletAmountType.UNSETTLED_AMOUNT.value()); + + // 用mq保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(Collections.singleton(supplierWalletLog))).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void settlementSupplierAmountByRefund(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO) { + + // 看看这个订单有没有锁定过 + long count = supplierWalletLogService.countOutAmountByRefundId(orderChangeShopWalletAmountBO.getRefundId(), SupplierWalletChangeReason.SETTLED.value()); + // 幂等 + if (count > 0) { + return; + } + // 供应商收入,供应商收入 = 供应商剩余待结算金额 + 运费 - 已退金额 - 供应商剩余佣金 + Long supplierAmount = orderChangeShopWalletAmountBO.getChangePurchaseAmount() + orderChangeShopWalletAmountBO.getFreightAmount() - orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission(); + if (Objects.equals(supplierAmount, 0L) || Objects.equals(orderChangeShopWalletAmountBO.getSupplierId(), 0L)) { + return; + } + // 平台佣金改变量 + Long changePlatformCommission = orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission(); + MongoSupplierWalletLogBO supplierWalletLog = new MongoSupplierWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + supplierWalletLog.setWalletLogId(walletLogId); + supplierWalletLog.setOrderId(orderChangeShopWalletAmountBO.getOrderId()); + supplierWalletLog.setReason(SupplierWalletChangeReason.SETTLED.value()); + supplierWalletLog.setPaySysType(Objects.isNull(orderChangeShopWalletAmountBO.getPaySysType()) ? 0 : orderChangeShopWalletAmountBO.getPaySysType()); + supplierWalletLog.setSupplierId(orderChangeShopWalletAmountBO.getSupplierId()); + supplierWalletLog.setCreateTime(new Date()); + supplierWalletLog.setUpdateTime(new Date()); + + // 结算的金额 + supplierWalletLog.setUserAmount(supplierAmount); + // 回退的分销金额 + supplierWalletLog.setDistributionAmount(0L); + // 回退的平台补贴 + supplierWalletLog.setPlatformAmount(0L); + // 回退的平台佣金 + supplierWalletLog.setPlatformCommission(changePlatformCommission); + // 商家改变金额 + supplierWalletLog.setChangeAmount(supplierAmount); + // 增加 + supplierWalletLog.setIoType(1); + // 1. 订单部分退款导致订单关闭 商家结算操作 + // 供应商结算操作同订单结算一样,分成两步 + // 1.减少待结算金额,订单在哪个分片加的待结算金额就从哪里减掉 + boolean subUnsettledAmountSuccess = subUnsettledAmount(supplierWalletLog.getSupplierId(), orderChangeShopWalletAmountBO.getOrderId(), supplierAmount, orderChangeShopWalletAmountBO.getPaySysType()); + if (!subUnsettledAmountSuccess) { + throw new LuckException("您的待结算金额不足,无法进行退款"); + } + + // 2.增加结算金额以及总结算金额,这里可以随机加在某个分片中 + boolean addSettledAmountSuccess = supplierWalletMapper.addSettledAmount(supplierWalletLog.getSupplierId(), supplierAmount, orderChangeShopWalletAmountBO.getPaySysType(), true) > 0; + if (!addSettledAmountSuccess) { + throw new LuckException("供应商结算失败,无法进行退款"); + } + + supplierWalletLog.setAmountType(SupplierWalletAmountType.SETTLED_AMOUNT.value()); + // 添加日志 + // 用mq保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(Collections.singleton(supplierWalletLog))).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateByDistributionAmount(List message) { + if (CollUtil.isEmpty(message)) { + return; + } + List supplierWalletLogList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SupplierWalletBO supplierWalletBO : message) { + Long supplierId = supplierWalletBO.getSupplierId(); + Long orderId = supplierWalletBO.getOrderId(); + // 商家待结算改变金额,从分销过来的待结算金额是个负数,用来减少待结算金额 + Long unsettledAmount = supplierWalletBO.getUnsettledAmount(); + // 幂等处理 + long count = supplierWalletLogService.countInAmountByOrderId(orderId, SupplierWalletChangeReason.DISTRIBUTION_AMOUNT.value()); + if (count > 0) { + continue; + } + + // 修改支付成功结算的供应商钱包日志 + SupplierWalletLogSearchDTO supplierWalletLogQuery = new SupplierWalletLogSearchDTO(); + supplierWalletLogQuery.setOrderId(orderId); + supplierWalletLogQuery.setReason(SupplierWalletChangeReason.PAY.value()); + supplierWalletLogQuery.setSupplierId(supplierId); + supplierWalletLogQuery.setIoType(1); + supplierWalletLogQuery.setAmountType(SupplierWalletAmountType.UNSETTLED_AMOUNT.value()); + // 必须保存供应商分账完成,有该条分账记录后,才可以分销 + MongoSupplierWalletLogBO supplierWalletLogUpdate = supplierWalletLogService.listByParam(supplierWalletLogQuery).get(0); + if (Objects.isNull(supplierWalletLogUpdate)) { + throw new LuckException("未找到支付成功结算的供应商钱包日志"); + } + supplierWalletLogUpdate.setDistributionAmount(Math.abs(unsettledAmount)); + + // 修改钱包日志分销金额 + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(supplierWalletLogUpdate.getWalletLogId())); + Update update = new Update(); + update.set("distributionAmount", supplierWalletLogUpdate.getDistributionAmount()); + update.set("updateTime", new Date()); + mongoTemplate.updateFirst(query, update, MongoSupplierWalletLogBO.class); + + // 更新钱包未结算金额 + supplierWalletMapper.addUnsettledAmount(supplierId, unsettledAmount, supplierWalletLogUpdate.getPaySysType()); + + // 分销减少供应商钱包日志,只是为了添加一条日志,保证幂等 + MongoSupplierWalletLogBO supplierWalletLog = new MongoSupplierWalletLogBO(); + Long walletLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG); + supplierWalletLog.setWalletLogId(walletLogId); + supplierWalletLog.setSupplierId(supplierId); + supplierWalletLog.setOrderId(orderId); + supplierWalletLog.setCreateTime(new Date()); + supplierWalletLog.setUpdateTime(new Date()); + supplierWalletLog.setIoType(unsettledAmount >= 0 ? 1 : 0); + supplierWalletLog.setPaySysType(Objects.isNull(supplierWalletLogUpdate.getPaySysType()) ? 0 : supplierWalletLogUpdate.getPaySysType()); + supplierWalletLog.setAmountType(SupplierWalletAmountType.UNSETTLED_AMOUNT.value()); + supplierWalletLog.setReason(SupplierWalletChangeReason.DISTRIBUTION_AMOUNT.value()); + supplierWalletLog.setDistributionAmount(Math.abs(unsettledAmount)); + supplierWalletLog.setChangeAmount(Math.abs(unsettledAmount)); + supplierWalletLog.setUserAmount(supplierWalletLogUpdate.getUserAmount()); + supplierWalletLogList.add(supplierWalletLog); + } + // 用mq批量保存钱包日志 + SendStatus sendWalletLogStatus = addSupplierWalletLogTemplate.syncSend(RocketMqConstant.ADD_SUPPLIER_WALLET_LOG_TOPIC, new GenericMessage<>(supplierWalletLogList)).getSendStatus(); + if (!Objects.equals(sendWalletLogStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public PageVO pageSupplierWalletByTime(PageDTO pageDTO, SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Integer paySysType = supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + PageVO supplierWalletPage; + if (Objects.nonNull(supplierWalletLogSearchDTO.getStartTime()) && Objects.nonNull(supplierWalletLogSearchDTO.getEndTime())) { + supplierWalletPage = supplierWalletLogService.pageSupplierWalletByTime(pageDTO, supplierWalletLogSearchDTO); + } else { + supplierWalletPage = PageUtil.doPage(pageDTO, () -> supplierWalletMapper.listAllSupplierWallet(supplierWalletLogSearchDTO, paySysType)); + } + return supplierWalletPage; + } + + @Override + public SupplierWalletVO getBySupplierId(Long supplierId) { + Integer paySysType = supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + return supplierWalletMapper.getBySupplierId(supplierId, paySysType); + } + + @Override + public SupplierWalletVO getAllSupplier(SupplierWalletLogSearchDTO supplierWalletLogSearchDTO) { + Integer paySysType = supplierAllinpayService.getIsAllinpay() ? PaySysType.ALLINPAY.value() : PaySysType.DEFAULT.value(); + SupplierWalletVO supplierWallet; + if (Objects.nonNull(supplierWalletLogSearchDTO.getStartTime()) && Objects.nonNull(supplierWalletLogSearchDTO.getEndTime())) { + supplierWallet = supplierWalletLogService.getSupplierWalletByTime(supplierWalletLogSearchDTO); + } else { + supplierWallet = supplierWalletMapper.getAllSupplier(supplierWalletLogSearchDTO, paySysType); + } + return supplierWallet; + } + + /** + * 退款减少待结算金额 + */ + private boolean subUnsettledAmount(Long supplierId, Long orderId, Long changeAmount, Integer paySysType) { + if (Objects.equals(changeAmount, 0L)) { + return true; + } + if (Objects.isNull(paySysType)) { + paySysType = 0; + } + return supplierWalletMapper.subUnsettledAmount(supplierId, changeAmount, paySysType) > 0; + } + + /** + * 增加结算金额 + */ + private boolean addSettledAmount(Long shopId, Long changeAmount, Integer paySysType) { + if (Objects.equals(changeAmount, 0L)) { + return true; + } + if (Objects.isNull(paySysType)) { + paySysType = 0; + } + return supplierWalletMapper.addSettledAmount(shopId, changeAmount, paySysType, true) > 0; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/task/SupplierTask.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/task/SupplierTask.java new file mode 100644 index 0000000..ec44f14 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/task/SupplierTask.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.task; + +import com.tmerclub.cloud.supplier.service.SupplierAllinpayService; +import com.tmerclub.cloud.supplier.service.SupplierDetailService; +import com.tmerclub.cloud.supplier.service.SupplierWalletLogService; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 供应商定时任务 + * + * @Author lth + * @Date 2021/7/9 13:35 + */ +@Component +public class SupplierTask { + + @Autowired + private SupplierDetailService supplierDetailService; + @Autowired + private SupplierWalletLogService supplierWalletLogService; + @Autowired + private SupplierAllinpayService supplierAllinpayService; + + /** + * 根据签约时间改变供应商状态 + */ + @XxlJob("changeSupplierStatus") + public void changeSupplierStatus() { + Date now = new Date(); + // 根据签约时间修改供应商状态 + if (supplierAllinpayService.getIsAllinpay()) { + return; + } + supplierDetailService.changeSupplierStatusByContractTime(now); + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/PurchaseAmountLogSupplierExcelVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/PurchaseAmountLogSupplierExcelVO.java new file mode 100644 index 0000000..5561da1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/PurchaseAmountLogSupplierExcelVO.java @@ -0,0 +1,137 @@ +package com.tmerclub.cloud.supplier.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 供应商采购金额日志excel对象 + * @author gaozijie + * @date 2023-08-29 + */ +public class PurchaseAmountLogSupplierExcelVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "采购金额日志"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty(value = {"采购金额日志", "编号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"采购金额日志", "金额类型"}, index = 1) + private String purchaseAmountType; + + @ExcelProperty(value = {"采购金额日志", "商家名称"}, index = 2) + private String shopName; + + @ExcelProperty(value = {"采购金额日志", "改变金额"}, index = 3) + private BigDecimal changeAmount; + + @ExcelProperty(value = {"采购金额日志", "采购编号"}, index = 4) + private String purchaseOrderId; + + @ExcelProperty(value = {"采购金额日志", "采购金额"}, index = 5) + private BigDecimal purchaseTotalAmount; + + @ExcelProperty(value = {"采购金额日志", "商品数量"}, index = 6) + private Integer prodCount; + + @ExcelProperty(value = {"采购金额日志", "创建时间"}, index = 7) + private LocalDateTime createTime; + + public PurchaseAmountLogSupplierExcelVO() { + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPurchaseAmountType() { + return purchaseAmountType; + } + + public void setPurchaseAmountType(String purchaseAmountType) { + this.purchaseAmountType = purchaseAmountType; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public BigDecimal getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(BigDecimal changeAmount) { + this.changeAmount = changeAmount; + } + + public String getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(String purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public BigDecimal getPurchaseTotalAmount() { + return purchaseTotalAmount; + } + + public void setPurchaseTotalAmount(BigDecimal purchaseTotalAmount) { + this.purchaseTotalAmount = purchaseTotalAmount; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "PurchaseAmountLogSupplierExcelVO{" + + "seq='" + seq + '\'' + + ", purchaseAmountType='" + purchaseAmountType + '\'' + + ", shopName='" + shopName + '\'' + + ", changeAmount=" + changeAmount + + ", purchaseOrderId='" + purchaseOrderId + '\'' + + ", purchaseTotalAmount=" + purchaseTotalAmount + + ", prodCount=" + prodCount + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/ShopSupplierNameVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/ShopSupplierNameVO.java new file mode 100644 index 0000000..8d69cc4 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/ShopSupplierNameVO.java @@ -0,0 +1,67 @@ +package com.tmerclub.cloud.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +public class ShopSupplierNameVO { + + @Schema(description = "商家Id") + private Long shopId; + + @Schema(description = "商家名称") + private String shopName; + + @Schema(description = "供应商Id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + public ShopSupplierNameVO() { + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + @Override + public String toString() { + return "ShopSupplierListVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierAuditingInfoVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierAuditingInfoVO.java new file mode 100644 index 0000000..c841903 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierAuditingInfoVO.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 审核信息 + * + * @author YXF + */ +@Schema(description = "审核信息") +public class SupplierAuditingInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商审核id") + private Long supplierAuditingId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "申请时间") + private Date createTime; + + @Schema(description = "审核状态 0未审核 1已通过 -1未通过") + private Integer status; + + @Schema(description = "供应商名字") + private String supplierName; + + @Schema(description = "供应商详细地址") + private String supplierAddress; + + @Schema(description = "供应商所在省份") + private String province; + + @Schema(description = "供应商所在城市") + private String city; + + @Schema(description = "供应商所在区域") + private String area; + + @Schema(description = "供应商logo") + private String supplierLogo; + + @Schema(description = "供应商简介") + private String intro; + + @Schema(description = "供应商状态") + private Integer supplierStatus; + + @Schema(description = "供应商账号") + private String mobile; + + public Long getSupplierAuditingId() { + return supplierAuditingId; + } + + public void setSupplierAuditingId(Long supplierAuditingId) { + this.supplierAuditingId = supplierAuditingId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getSupplierAddress() { + return supplierAddress; + } + + public void setSupplierAddress(String supplierAddress) { + this.supplierAddress = supplierAddress; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "SupplierAuditingInfoVO{" + + "supplierAuditingId=" + supplierAuditingId + + ", supplierId=" + supplierId + + ", createTime=" + createTime + + ", status=" + status + + ", supplierName='" + supplierName + '\'' + + ", supplierAddress='" + supplierAddress + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", area='" + area + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", intro='" + intro + '\'' + + ", supplierStatus=" + supplierStatus + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierDetailAppVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierDetailAppVO.java new file mode 100644 index 0000000..33c6be1 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierDetailAppVO.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 供应商详情VO + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public class SupplierDetailAppVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商类型1自营店 2普通店") + private Integer type; + + @Schema(description = "供应商供应商名称") + private String supplierShopName; + + @Schema(description = "供应商简介") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + + @Schema(description = "供应商logo(可修改)") + private String supplierLogo; + + @Schema(description = "供应商状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核)") + private Integer supplierStatus; + + @Schema(description = "商品列表") + private List spuList; + + @Schema(description = "供应商收藏数量") + private Long collectionNum; + + @Schema(description = "移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "pc背景图") + private String pcBackgroundPic; + + @Schema(description = "是否优选好店 1.是 0.不是") + private String isPreferred; + + public String getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(String isPreferred) { + this.isPreferred = isPreferred; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getSupplierShopName() { + return supplierShopName; + } + + public void setSupplierShopName(String supplierShopName) { + this.supplierShopName = supplierShopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + @Override + public String toString() { + return "SupplierDetailAppVO{" + + "supplierId=" + supplierId + + ", type=" + type + + ", supplierShopName='" + supplierShopName + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", supplierStatus=" + supplierStatus + + ", spuList=" + spuList + + ", collectionNum=" + collectionNum + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", isPreferred='" + isPreferred + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierExtensionVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierExtensionVO.java new file mode 100644 index 0000000..4e069d9 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierExtensionVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商扩张信息VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierExtensionVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long supplierExtensionId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "供应商商品总销量") + private Integer saleNum; + + public Long getSupplierExtensionId() { + return supplierExtensionId; + } + + public void setSupplierExtensionId(Long supplierExtensionId) { + this.supplierExtensionId = supplierExtensionId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + @Override + public String toString() { + return "SupplierExtensionVO{" + + "supplierExtensionId=" + supplierExtensionId + + ",supplierId=" + supplierId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",saleNum=" + saleNum + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierInfoInOrderVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierInfoInOrderVO.java new file mode 100644 index 0000000..7f7c935 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierInfoInOrderVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2021/5/10 + */ +public class SupplierInfoInOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商类型1自营店 2普通店") + private Integer type; + + @Schema(description = "供应商名称") + private String shopName; + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + @Override + public String toString() { + return "ShopInfoInOrderVO{" + + "type=" + type + + ", shopName='" + shopName + '\'' + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierUserVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierUserVO.java new file mode 100644 index 0000000..e8d34e5 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierUserVO.java @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 供应商用户VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierUserVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * supplierUserId + */ + @Schema(description = "供应商用户id") + private Long supplierUserId; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "员工编号") + private String code; + + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "是否已经有账号了") + private Integer hasAccount; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "角色id列表") + private List roleIds; + + @Schema(description = "账号") + private String username; + + @Schema(description = "密码") + private String password; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + /** + * 是否是管理员 + */ + @Schema(description = "是否是管理员") + private Integer isAdmin; + + public Long getSupplierUserId() { + return supplierUserId; + } + + public void setSupplierUserId(Long supplierUserId) { + this.supplierUserId = supplierUserId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + @Override + public String toString() { + return "SupplierUserVO{" + + "supplierUserId=" + supplierUserId + + ", nickName='" + nickName + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", hasAccount=" + hasAccount + + ", supplierId=" + supplierId + + ", roleIds=" + roleIds + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", status=" + status + + ", isAdmin=" + isAdmin + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletLogExcelVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletLogExcelVO.java new file mode 100644 index 0000000..1adb82a --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletLogExcelVO.java @@ -0,0 +1,197 @@ +package com.tmerclub.cloud.supplier.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 导出供应商余额 + * @author TRACK + */ +public class SupplierWalletLogExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "供应商结算明细表"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"供应商结算明细表", "序号"}) + private String seq; + + @ExcelProperty({"供应商结算明细表", "供应商名称"}) + private String supplierName; + + /** + * @see com.tmerclub.cloud.supplier.constant.SupplierWalletAmountType + */ + @ExcelProperty({"供应商结算明细表", "金额类型"}) + private String amountType; + + @Schema(description = "商家收支类型 0支出 1收入") + @ExcelProperty({"供应商结算明细表", "收支类型"}) + private String ioType; + + @ExcelProperty({"供应商结算明细表", "改变金额"}) + private String changeAmount; + + @ExcelProperty({"供应商结算明细表", "订单编号"}) + private String orderId; + + @ExcelProperty({"供应商结算明细表", "退款编号"}) + private String refundId; + + @ExcelProperty({"供应商结算明细表", "操作金额"}) + private String userAmount; + + @ExcelProperty({"供应商结算明细表", "平台优惠金额"}) + private String platformAmount; + + @ExcelProperty({"供应商结算明细表", "分销金额"}) + private String distributionAmount; + + @ExcelProperty({"供应商结算明细表", "平台佣金"}) + private String platformCommission; + + @ExcelProperty({"供应商结算明细表", "资金变化原因"}) + private String reasonStr; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty({"供应商结算明细表", "创建时间"}) + private Date createTime; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getAmountType() { + return amountType; + } + + public void setAmountType(String amountType) { + this.amountType = amountType; + } + + public String getIoType() { + return ioType; + } + + public void setIoType(String ioType) { + this.ioType = ioType; + } + + public String getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(String changeAmount) { + this.changeAmount = changeAmount; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public String getRefundId() { + return refundId; + } + + public void setRefundId(String refundId) { + this.refundId = refundId; + } + + public String getUserAmount() { + return userAmount; + } + + public void setUserAmount(String userAmount) { + this.userAmount = userAmount; + } + + public String getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(String platformAmount) { + this.platformAmount = platformAmount; + } + + public String getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(String distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public String getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(String platformCommission) { + this.platformCommission = platformCommission; + } + + public String getReasonStr() { + return reasonStr; + } + + public void setReasonStr(String reasonStr) { + this.reasonStr = reasonStr; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "ShopWalletLogExcelVO{" + + "seq='" + seq + '\'' + + ", shopName='" + supplierName + '\'' + + ", amountType=" + amountType + + ", ioType=" + ioType + + ", changeAmount=" + changeAmount + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", reasonStr='" + reasonStr + '\'' + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletLogVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletLogVO.java new file mode 100644 index 0000000..413c070 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletLogVO.java @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商钱包记录VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWalletLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商钱包id") + private Long walletLogId; + + @Schema(description = "序号") + private Long index; + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "代销商家名称") + private String partnerMerchantName; + + @Schema(description = "关联订单id") + private Long orderId; + + @Schema(description = "关联订单项id") + private Long orderItemId; + + @Schema(description = "订单运费") + private Long freightAmount; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "收支类型 0支出 1收入") + private Integer ioType; + + @Schema(description = "金额类型 0 未结算金额 1可提现金额 2冻结金额") + private Integer amountType; + + @Schema(description = "改变金额") + private Long changeAmount; + + @Schema(description = "原因 0用户支付 1用户确认收货 2 用户退款申请 3 拒绝用户退款申请 4 提现申请 5 提现申请被拒绝") + private Integer reason; + + @Schema(description = "用户金额(支付实付金额,退款实际申请金额)") + private Long userAmount; + + @Schema(description = "平台补贴金额") + private Long platformAmount; + + @Schema(description = "分销占用金额") + private Long distributionAmount; + + @Schema(description = "平台佣金") + private Long platformCommission; + + @Schema(description = "供应商优惠金额") + private Long supplierReduceAmount; + + @Schema(description = "商品总金额") + private Long totalAmount; + + public Long getIndex() { + return index; + } + + public void setIndex(Long index) { + this.index = index; + } + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getPartnerMerchantName() { + return partnerMerchantName; + } + + public void setPartnerMerchantName(String partnerMerchantName) { + this.partnerMerchantName = partnerMerchantName; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Integer getAmountType() { + return amountType; + } + + public void setAmountType(Integer amountType) { + this.amountType = amountType; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Long getUserAmount() { + return userAmount; + } + + public void setUserAmount(Long userAmount) { + this.userAmount = userAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getSupplierReduceAmount() { + return supplierReduceAmount; + } + + public void setSupplierReduceAmount(Long supplierReduceAmount) { + this.supplierReduceAmount = supplierReduceAmount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + @Override + public String toString() { + return "SupplierWalletLogVO{" + + "walletLogId=" + walletLogId + + ", index=" + index + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", partnerMerchantName='" + partnerMerchantName + '\'' + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", freightAmount=" + freightAmount + + ", refundId=" + refundId + + ", ioType=" + ioType + + ", amountType=" + amountType + + ", changeAmount=" + changeAmount + + ", reason=" + reason + + ", userAmount=" + userAmount + + ", platformAmount=" + platformAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", supplierReduceAmount=" + supplierReduceAmount + + ", totalAmount=" + totalAmount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletVO.java new file mode 100644 index 0000000..c91cf3d --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/SupplierWalletVO.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商钱包信息VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierWalletVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商钱包id") + private Long supplierWalletId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "未结算金额(用户支付)") + private Long unsettledAmount; + + @Schema(description = "已结算金额(用户确认收货后,可以提现)") + private Long settledAmount; + + @Schema(description = "冻结金额(用户确认收货)") + private Long freezeAmount; + + @Schema(description = "累积结算金额") + private Long totalSettledAmount; + + @Schema(description = "乐观锁") + private Long version; + + public Long getSupplierWalletId() { + return supplierWalletId; + } + + public void setSupplierWalletId(Long supplierWalletId) { + this.supplierWalletId = supplierWalletId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + @Override + public String toString() { + return "SupplierWalletVO{" + + "supplierWalletId=" + supplierWalletId + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", freezeAmount=" + freezeAmount + + ", totalSettledAmount=" + totalSettledAmount + + ", version=" + version + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/TotalPurchaseAmountVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/TotalPurchaseAmountVO.java new file mode 100644 index 0000000..765383b --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/TotalPurchaseAmountVO.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author gaozijie + * @date 2023-08-29 + */ +public class TotalPurchaseAmountVO { + + @Schema(description = "总采购收入/支出金额") + private Long totalPurchaseAmount; + + @Schema(description = "总采购作废金额") + private Long totalCancelAmount; + + public TotalPurchaseAmountVO() { + } + + public Long getTotalPurchaseAmount() { + return totalPurchaseAmount; + } + + public void setTotalPurchaseAmount(Long totalPurchaseAmount) { + this.totalPurchaseAmount = totalPurchaseAmount; + } + + public Long getTotalCancelAmount() { + return totalCancelAmount; + } + + public void setTotalCancelAmount(Long totalCancelAmount) { + this.totalCancelAmount = totalCancelAmount; + } + + @Override + public String toString() { + return "TotalPurchaseAmountVO{" + + "totalPurchaseAmount=" + totalPurchaseAmount + + ", totalCancelAmount=" + totalCancelAmount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoSupplierWalletVO.java b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoSupplierWalletVO.java new file mode 100644 index 0000000..cb15322 --- /dev/null +++ b/tmerclub-admin/src/main/java/com/tmerclub/cloud/supplier/vo/mongo/MongoSupplierWalletVO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.supplier.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 供应商钱包信息VO + * @author TRACK + */ +@Document("supplier_wallet_log") +public class MongoSupplierWalletVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "未结算金额(收入)") + private Long inUnsettleAmount; + + @Schema(description = "未结算金额(支出)") + private Long outUnsettleAmount; + + @Schema(description = "已结算金额") + private Long totalSettleAmount; + + @Schema(description = "冻结金额(收入)") + private Long inFreezeAmount; + + @Schema(description = "冻结金额(支出)") + private Long outFreezeAmount; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getInUnsettleAmount() { + return inUnsettleAmount; + } + + public void setInUnsettleAmount(Long inUnsettleAmount) { + this.inUnsettleAmount = inUnsettleAmount; + } + + public Long getOutUnsettleAmount() { + return outUnsettleAmount; + } + + public void setOutUnsettleAmount(Long outUnsettleAmount) { + this.outUnsettleAmount = outUnsettleAmount; + } + + public Long getTotalSettleAmount() { + return totalSettleAmount; + } + + public void setTotalSettleAmount(Long totalSettleAmount) { + this.totalSettleAmount = totalSettleAmount; + } + + public Long getInFreezeAmount() { + return inFreezeAmount; + } + + public void setInFreezeAmount(Long inFreezeAmount) { + this.inFreezeAmount = inFreezeAmount; + } + + public Long getOutFreezeAmount() { + return outFreezeAmount; + } + + public void setOutFreezeAmount(Long outFreezeAmount) { + this.outFreezeAmount = outFreezeAmount; + } + + @Override + public String toString() { + return "MongoSupplierWalletVO{" + + "supplierId=" + supplierId + + ", inUnsettleAmount=" + inUnsettleAmount + + ", outUnsettleAmount=" + outUnsettleAmount + + ", totalSettleAmount=" + totalSettleAmount + + ", inFreezeAmount=" + inFreezeAmount + + ", outFreezeAmount=" + outFreezeAmount + + '}'; + } +} diff --git a/tmerclub-admin/src/main/resources/logback.xml b/tmerclub-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-admin/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/HotSearchMapper.xml b/tmerclub-admin/src/main/resources/mapper/HotSearchMapper.xml new file mode 100644 index 0000000..8297af7 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/HotSearchMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + `hot_search_id`,`shop_id`,`content`,`create_time`,`update_time`,`seq`,`status`,`title`,`type` + + + + + insert into hot_search (`shop_id`,`content`,`seq`,`status`,`title`,`type`) + values (#{hotSearch.shopId},#{hotSearch.content},#{hotSearch.seq},#{hotSearch.status},#{hotSearch.title},#{hotSearch.type}); + + + update hot_search + set `content` = #{hotSearch.content},`seq` = #{hotSearch.seq},`status` = #{hotSearch.status},`title` = #{hotSearch.title} + where hot_search_id = #{hotSearch.hotSearchId} and shop_id = #{hotSearch.shopId} + + + delete from hot_search where hot_search_id = #{hotSearchId} and shop_id = #{shopId} + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/IndexImgMapper.xml b/tmerclub-admin/src/main/resources/mapper/IndexImgMapper.xml new file mode 100644 index 0000000..b95f6e4 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/IndexImgMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + `img_id`,`shop_id`,`img_url`,`status`,`seq`,`spu_id`,`img_type`,`create_time`,`update_time` + + + + + insert into index_img (`shop_id`,`img_url`,`status`,`seq`,`spu_id`,`img_type`) + values (#{indexImg.shopId},#{indexImg.imgUrl},#{indexImg.status},#{indexImg.seq},#{indexImg.spuId},#{indexImg.imgType}); + + + update index_img + set `spu_id` = #{indexImg.spuId}, `img_url` = #{indexImg.imgUrl}, `status` = #{indexImg.status},`seq` = #{indexImg.seq},`img_type` = #{indexImg.imgType} + where img_id = #{indexImg.imgId} and shop_id = #{indexImg.shopId} + + + delete from index_img where img_id = #{imgId} and shop_id = #{shopId} + + + + + UPDATE index_img + SET spu_id = NULL + WHERE shop_id = #{shopId} AND spu_id IN + + #{spuId} + + + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/NoticeMapper.xml b/tmerclub-admin/src/main/resources/mapper/NoticeMapper.xml new file mode 100644 index 0000000..b3e93de --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/NoticeMapper.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + update notice + + `is_learning` = 1 + + where id = #{id} + + + insert into notice (`shop_id`,`title`,`content`,`types`,`status`,`is_top`,`publish_time`, `immediately_send`, `send_time`, `multi_shop_ids`, `user_ids`, `supplier_ids`) + values (#{notice.shopId}, #{notice.title}, #{notice.content}, #{notice.types}, #{notice.status}, #{notice.isTop}, #{notice.publishTime}, #{notice.immediatelySend}, #{notice.sendTime}, #{notice.multiShopIds}, #{notice.userIds}, #{notice.supplierIds}); + + + insert into notice (`shop_id`,`title`,`content`,`types`,`status`,`is_top`,`publish_time`, `immediately_send`, `send_time`) + values + + (#{notice.shopId}, #{notice.title}, #{notice.content}, #{notice.type}, #{notice.status}, #{notice.isTop}, #{notice.publishTime}, #{notice.immediatelySend}, #{notice.sendTime}) + + + + update notice + + + `title` = #{notice.title}, + + + `content` = #{notice.content}, + + + `types` = #{notice.types}, + + + `status` = #{notice.status}, + + + `immediately_send` = #{notice.immediatelySend}, + + + `send_time` = #{notice.sendTime}, + + + `is_top` = #{notice.isTop}, + + + `publish_time` = #{notice.publishTime}, + + + `multi_shop_ids` = #{notice.multiShopIds}, + + + `supplier_ids` = #{notice.supplierIds}, + + `user_ids` = #{notice.userIds} + + + where id = #{notice.id} + + + delete from notice where id = #{id} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/OfflineHandleEventItemMapper.xml b/tmerclub-admin/src/main/resources/mapper/OfflineHandleEventItemMapper.xml new file mode 100644 index 0000000..e96cf03 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/OfflineHandleEventItemMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + `event_item_id`,`create_time`,`event_id`,`reapply_reason`,`refuse_reason`,`reapply_time`,`audit_time` + + + delete from offline_handle_event_item where event_id in + + #{eventId} + + + + + + insert into offline_handle_event_item (`event_id`,`reapply_reason`) + values (#{offlineHandleEventItem.eventId},#{offlineHandleEventItem.reapplyReason}); + + + update offline_handle_event_item + + + `event_id` = #{offlineHandleEventItem.eventId}, + + + `reapply_reason` = #{offlineHandleEventItem.reapplyReason}, + + + `refuse_reason` = #{offlineHandleEventItem.refuseReason}, + + + `reapply_time` = #{offlineHandleEventItem.reapplyTime}, + + + `audit_time` = #{offlineHandleEventItem.auditTime}, + + + where event_item_id = #{offlineHandleEventItem.eventItemId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopBankCardMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopBankCardMapper.xml new file mode 100644 index 0000000..722d660 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopBankCardMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + `shop_bank_card_id`,`create_time`,`update_time`,`shop_id`,`bank_name`,`opening_bank`,`recipient_name`,`card_no`, + `branch_name`,`is_default`,`bank_card_no`,`bank_card_pro`,`union_bank`,`status` + + + + + + + insert into shop_bank_card (`shop_id`,`bank_name`,`opening_bank`,`recipient_name`,`card_no`,`branch_name`,`is_default`,`bank_card_no`,`bank_card_pro`,`union_bank`,`status`) + values (#{shopBankCard.shopId},#{shopBankCard.bankName},#{shopBankCard.openingBank},#{shopBankCard.recipientName},#{shopBankCard.cardNo},#{shopBankCard.branchName},#{shopBankCard.isDefault},#{shopBankCard.bankCardNo},#{shopBankCard.bankCardPro},#{shopBankCard.unionBank},#{shopBankCard.status}); + + + insert into shop_bank_card (`shop_id`,`bank_name`,`opening_bank`,`recipient_name`,`card_no`,`branch_name`,`is_default`,`bank_card_no`,`bank_card_pro`,`union_bank`) values + + (#{shopId},#{shopBankCard.bankName},#{shopBankCard.openingBank},#{shopBankCard.recipientName},#{shopBankCard.cardNo},#{shopBankCard.branchName},#{shopBankCard.isDefault},#{shopBankCard.bankCardNo},#{shopBankCard.bankCardPro},#{shopBankCard.unionBank}) + + + + + update shop_bank_card + + + `shop_id` = #{shopBankCard.shopId}, + + + `bank_name` = #{shopBankCard.bankName}, + + + `opening_bank` = #{shopBankCard.openingBank}, + + + `recipient_name` = #{shopBankCard.recipientName}, + + + `card_no` = #{shopBankCard.cardNo}, + + + `branch_name` = #{shopBankCard.branchName}, + + + `is_default` = #{shopBankCard.isDefault}, + + + `status` = #{shopBankCard.status}, + + + `bank_card_no` = #{shopBankCard.bankCardNo}, + + + `bank_card_pro` = #{shopBankCard.bankCardPro}, + + + `union_bank` = #{shopBankCard.unionBank}, + + + where shop_bank_card_id = #{shopBankCard.shopBankCardId} + + + UPDATE shop_bank_card + SET is_default = + IF( shop_bank_card_id = #{shopBankCardId}, 1, 0 ) + WHERE + shop_id = #{shopId} + + + UPDATE shop_bank_card + SET is_default = 0 + WHERE shop_id = #{shopId} and shop_bank_card_id = #{shopBankCardId} + + + UPDATE shop_bank_card + SET status = -1 + WHERE shop_bank_card_id = #{shopBankCardId} + + + delete from shop_bank_card where shop_id = #{shopId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopCollectionMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopCollectionMapper.xml new file mode 100644 index 0000000..3fb0a71 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopCollectionMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + sc.`collection_id`,sc.`create_time`,sc.`update_time`,sc.`shop_id`,sc.`user_id` + + + + + + + + + + insert into shop_collection (`shop_id`,`user_id`) + values (#{userCollectionShop.shopId},#{userCollectionShop.userId}); + + + update shop_collection + + + `create_time` = #{userCollectionShop.createTime}, + + + `update_time` = #{userCollectionShop.updateTime}, + + + `shop_id` = #{userCollectionShop.shopId}, + + + `user_id` = #{userCollectionShop.userId}, + + + where collection_id = #{userCollectionShop.collectionId} + + + delete from shop_collection + where user_id = #{userId} and shop_id = #{shopId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopCompanyMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopCompanyMapper.xml new file mode 100644 index 0000000..03a7f4a --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopCompanyMapper.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + `shop_company_id`,`shop_id`,`create_time`,`update_time`,`credit_code`,`firm_name`,`residence`,`representative`,`capital`,`found_time`,`start_time`, + `end_time`,`business_scope`,`business_license`,`identity_card_front`,`identity_card_later`,`status`,`legal_ids`,`legal_phone` + + + + + + + insert into shop_company (`shop_id`,`credit_code`,`firm_name`,`residence`,`representative`,`capital`,`found_time`,`start_time`,`end_time`, + `business_scope`,`business_license`,`identity_card_front`,`identity_card_later`, `status`,`legal_ids`,`legal_phone`) + values (#{shopCompany.shopId},#{shopCompany.creditCode},#{shopCompany.firmName},#{shopCompany.residence}, + #{shopCompany.representative},#{shopCompany.capital},#{shopCompany.foundTime},#{shopCompany.startTime}, + #{shopCompany.endTime},#{shopCompany.businessScope},#{shopCompany.businessLicense},#{shopCompany.identityCardFront}, + #{shopCompany.identityCardLater},#{shopCompany.status},#{shopCompany.legalIds},#{shopCompany.legalPhone}); + + + + update shop_company + + + `shop_id` = #{shopCompany.shopId}, + + + `credit_code` = #{shopCompany.creditCode}, + + + `firm_name` = #{shopCompany.firmName}, + + + `residence` = #{shopCompany.residence}, + + + `representative` = #{shopCompany.representative}, + + + `legal_ids` = #{shopCompany.legalIds}, + + + `legal_phone` = #{shopCompany.legalPhone}, + + + `capital` = #{shopCompany.capital}, + + + `found_time` = #{shopCompany.foundTime}, + + + `start_time` = #{shopCompany.startTime}, + + `end_time` = #{shopCompany.endTime}, + + `business_scope` = #{shopCompany.businessScope}, + + + `business_license` = #{shopCompany.businessLicense}, + + + `identity_card_front` = #{shopCompany.identityCardFront}, + + + `identity_card_later` = #{shopCompany.identityCardLater}, + + + `status` = #{shopCompany.status}, + + + where shop_company_id = #{shopCompany.shopCompanyId} + + + update shop_company + + + `shop_id` = #{shopCompany.shopId}, + + + `credit_code` = #{shopCompany.creditCode}, + + + `firm_name` = #{shopCompany.firmName}, + + + `residence` = #{shopCompany.residence}, + + + `representative` = #{shopCompany.representative}, + + + `legal_ids` = #{shopCompany.legalIds}, + + + `legal_phone` = #{shopCompany.legalPhone}, + + + `capital` = #{shopCompany.capital}, + + + `found_time` = #{shopCompany.foundTime}, + + + `start_time` = #{shopCompany.startTime}, + + `end_time` = #{shopCompany.endTime}, + + `business_scope` = #{shopCompany.businessScope}, + + + `business_license` = #{shopCompany.businessLicense}, + + + `identity_card_front` = #{shopCompany.identityCardFront}, + + + `identity_card_later` = #{shopCompany.identityCardLater}, + + + `status` = #{shopCompany.status}, + + + where shop_id = #{shopId} + + and status = 1 + + + limit 1 + + + + delete from shop_company where shop_id = #{shopId} and `status` = #{status} + + + update shop_company set `status` = #{status} + where shop_id = #{shopId} + + and `status` = #{dbStatus} + + + + + + update shop_company + + `update_time` = NOW(), + + `status` = #{shopCompany.status}, + + + where shop_company_id = #{shopCompany.shopCompanyId} + + + update shop_company + + + `business_license` = #{shopCompany.businessLicense}, + + + `identity_card_front` = #{shopCompany.identityCardFront}, + + + `identity_card_later` = #{shopCompany.identityCardLater}, + + + where shop_company_id = #{shopCompany.shopCompanyId} + + + + update shop_company set `status` = 0 where `status` = 1 + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopDetailMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopDetailMapper.xml new file mode 100644 index 0000000..cac2796 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopDetailMapper.xml @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `shop_id`,`create_time`,`update_time`,`type`,`shop_name`,`intro`,`notice_mobile`,`shop_logo`,`shop_status`, + `is_preferred`,`merchant_name`,`contact_name`,`contact_phone`,`contract_start_time`,`contract_end_time`, + `is_create_member`,`is_bind_phone`,`company_info_process_status`,`id_card_collect_process_status`,`allinpay_shop_status`, + `company_acct_protocol_no`,`legal_acct_protocol_no` + + + + + + + + insert into shop_detail (`shop_name`,`intro`,`notice_mobile`,`shop_logo`,`mobile_background_pic`,`pc_background_pic`,`shop_status`,`type`,`is_preferred`,`merchant_name`,`contact_name`,`contact_phone`,`contract_start_time`,`contract_end_time`) + values (#{shopDetail.shopName},#{shopDetail.intro},#{shopDetail.noticeMobile},#{shopDetail.shopLogo},#{shopDetail.mobileBackgroundPic},#{shopDetail.pcBackgroundPic},#{shopDetail.shopStatus},#{shopDetail.type},#{shopDetail.isPreferred},#{shopDetail.merchantName},#{shopDetail.contactName},#{shopDetail.contactPhone},#{shopDetail.contractStartTime},#{shopDetail.contractEndTime}); + + + update shop_detail + + + `shop_name` = #{shopDetail.shopName}, + + + `intro` = #{shopDetail.intro}, + + + `notice_mobile` = #{shopDetail.noticeMobile}, + + + `shop_logo` = #{shopDetail.shopLogo}, + + + `mobile_background_pic` = #{shopDetail.mobileBackgroundPic}, + + + `pc_background_pic` = #{shopDetail.pcBackgroundPic}, + + + `shop_status` = #{shopDetail.shopStatus}, + + + `type` = #{shopDetail.type}, + + + `is_preferred` = #{shopDetail.isPreferred}, + + + `merchant_name` = #{shopDetail.merchantName}, + + + `contact_name` = #{shopDetail.contactName}, + + + `contact_phone` = #{shopDetail.contactPhone}, + + + `contract_start_time` = #{shopDetail.contractStartTime}, + + `contract_end_time` = #{shopDetail.contractEndTime}, + + where shop_id = #{shopDetail.shopId} limit 1 + + + delete from shop_detail where shop_id = #{shopId} + + + + + + + + update shop_detail set `shop_status` = #{shopStatus} where shop_id = #{shopId} + + + update shop_detail + + set `shop_status` = + if(#{now} >= contract_start_time and (#{now} < contract_end_time or contract_end_time is null), 1, 0) + + where `shop_status` = 1 or `shop_status` = 0 + + + + + + + + + + + + + + + + + + + UPDATE shop_detail set allinpay_shop_status = 2 + where shop_status in (0,1,2,5) and shop_id in + + #{shopId} + + + + UPDATE shop_detail set allinpay_shop_status = 0, shop_status = 4 + where shop_status = 3 and shop_id in + + #{shopId} + + + + UPDATE shop_detail set is_create_member = 1 + where shop_id in + + #{shopId} + + + + update shop_detail set allinpay_shop_status = #{status} + where shop_id = #{shopId} and is_create_member = 1 + + + update shop_detail set company_info_process_status = 2 + where shop_id = #{shopId} and is_create_member = 1 + + + update shop_detail set company_info_process_status = 3, allinpay_shop_status = 2 + where shop_id = #{shopId} and is_create_member = 1 + + + update shop_detail set id_card_collect_process_status = #{status} + where shop_id = #{shopId} + + + update shop_detail set allinpay_shop_status = 1 + where shop_id = #{shopId} + and is_create_member = 1 and company_info_process_status = 2 and id_card_collect_process_status = 4 + + + update shop_detail set allinpay_shop_status = 3 where shop_id = #{shopId} and is_create_member = 1 and company_info_process_status = 2 + + + update shop_detail set is_bind_phone = #{status} + where shop_id = #{shopId} + + + update shop_detail + + + legal_acct_protocol_no = #{acctProtocolNo}, + + + company_acct_protocol_no = #{acctProtocolNo} + + + where shop_id = #{shopId} + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopRefundAddrMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopRefundAddrMapper.xml new file mode 100644 index 0000000..126925f --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopRefundAddrMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `shop_refund_addr_id`,`create_time`,`update_time`,`shop_id`,`mobile`,`is_default`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`post_code`,`addr`,`lng`,`lat` + + + + + + insert into shop_refund_addr (`shop_id`,`mobile`,`is_default`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`post_code`,`addr`,`lng`,`lat`) + values (#{shopRefundAddr.shopId},#{shopRefundAddr.mobile},#{shopRefundAddr.isDefault},#{shopRefundAddr.consignee},#{shopRefundAddr.provinceId},#{shopRefundAddr.province},#{shopRefundAddr.cityId},#{shopRefundAddr.city},#{shopRefundAddr.areaId},#{shopRefundAddr.area},#{shopRefundAddr.postCode},#{shopRefundAddr.addr},#{shopRefundAddr.lng},#{shopRefundAddr.lat}); + + + update shop_refund_addr + + + `mobile` = #{shopRefundAddr.mobile}, + + + `is_default` = #{shopRefundAddr.isDefault}, + + + `consignee` = #{shopRefundAddr.consignee}, + + + `province_id` = #{shopRefundAddr.provinceId}, + + + `province` = #{shopRefundAddr.province}, + + + `city_id` = #{shopRefundAddr.cityId}, + + + `city` = #{shopRefundAddr.city}, + + + `area_id` = #{shopRefundAddr.areaId}, + + + `area` = #{shopRefundAddr.area}, + + + `post_code` = #{shopRefundAddr.postCode}, + + + `addr` = #{shopRefundAddr.addr}, + + + `lng` = #{shopRefundAddr.lng}, + + + `lat` = #{shopRefundAddr.lat}, + + + where shop_refund_addr_id = #{shopRefundAddr.shopRefundAddrId} + + + delete from shop_refund_addr where shop_refund_addr_id = #{shopRefundAddrId} + + + + + + UPDATE shop_refund_addr SET `is_default` = 0 WHERE `shop_id` = #{shopId} + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopRenovationMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopRenovationMapper.xml new file mode 100644 index 0000000..05d99d8 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopRenovationMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + `renovation_id`,`shop_id`,`name`,`content`,`home_status`,`renovation_type`,`create_time`,`update_time` + + + + + + insert into shop_renovation (`shop_id`,`name`,`content`,`home_status`,`renovation_type`) + values (#{shopRenovation.shopId},#{shopRenovation.name},#{shopRenovation.content},#{shopRenovation.homeStatus},#{shopRenovation.renovationType}); + + + update shop_renovation + + + `shop_id` = #{shopRenovation.shopId}, + + + `name` = #{shopRenovation.name}, + + + `content` = #{shopRenovation.content}, + + + `home_status` = #{shopRenovation.homeStatus}, + + + `renovation_type` = #{shopRenovation.renovationType}, + + + where renovation_id = #{shopRenovation.renovationId} + + + delete from shop_renovation where renovation_id = #{renovationId} + + + update shop_renovation + set `home_status` = 0 + where renovation_type = #{renovationType} and shop_id = #{shopId} and home_status = 1 + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopTemplateMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopTemplateMapper.xml new file mode 100644 index 0000000..d50041e --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopTemplateMapper.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + `template_id`,`shop_id`,`name`,`content`,`image`,`type`,`remark`,`create_time`,`update_time` + + + + + insert into shop_template (`shop_id`,`name`,`content`,`image`,`type`,`remark`) + values (#{shopTemplate.shopId},#{shopTemplate.name},#{shopTemplate.content},#{shopTemplate.image},#{shopTemplate.type},#{shopTemplate.remark}); + + + update shop_template + + + `shop_id` = #{shopTemplate.shopId}, + + + `name` = #{shopTemplate.name}, + + + `content` = #{shopTemplate.content}, + + + `image` = #{shopTemplate.image}, + + + `type` = #{shopTemplate.type}, + + + `remark` = #{shopTemplate.remark}, + + + where template_id = #{shopTemplate.templateId} + + + delete from shop_template where template_id = #{templateId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopUserMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopUserMapper.xml new file mode 100644 index 0000000..7bb5a9f --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopUserMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + shop_user_id, create_time, update_time, shop_id, nick_name,`code`,phone_num,has_account + + + + + + insert into `shop_user` ( `shop_user_id`, `shop_id`, `nick_name`, `code`, `phone_num`,has_account) + values (#{shopUser.shopUserId},#{shopUser.shopId},#{shopUser.nickName},#{shopUser.code},#{shopUser.phoneNum}, #{shopUser.hasAccount}); + + + update shop_user + + + nick_name = #{shopUser.nickName}, + + + code = #{shopUser.code}, + + + phone_num = #{shopUser.phoneNum}, + + + has_account = #{shopUser.hasAccount}, + + + where shop_user_id = #{shopUser.shopUserId} and shop_id = #{shopUser.shopId} + + + + UPDATE shop_user SET shop_id = #{shopId} WHERE shop_user_id = #{shopUserId} LIMIT 1 + + + + delete from shop_user where shop_user_id = #{shopUserId} + + + + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/ShopWalletMapper.xml b/tmerclub-admin/src/main/resources/mapper/ShopWalletMapper.xml new file mode 100644 index 0000000..666f452 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/ShopWalletMapper.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + `shop_wallet_id`, + `pay_sys_type`, + `create_time`, + `update_time`, + `shop_id`, + `unsettled_amount`, + `settled_amount`, + `freeze_amount`, + `total_settled_amount`, + `sms_num`, + `version` + + + + + insert into shop_wallet (`pay_sys_type`,`shop_id`, `unsettled_amount`, `settled_amount`, `freeze_amount`, + `total_settled_amount`, `sms_num`,`version`) + values (#{shopWallet.paySysType},#{shopWallet.shopId}, #{shopWallet.unsettledAmount}, #{shopWallet.settledAmount}, + #{shopWallet.freezeAmount}, #{shopWallet.totalSettledAmount}, #{shopWallet.smsNum}, + #{shopWallet.version}); + + + update shop_wallet + + + `shop_id` = #{shopWallet.shopId}, + + + `unsettled_amount` = #{shopWallet.unsettledAmount}, + + + `settled_amount` = #{shopWallet.settledAmount}, + + + `freeze_amount` = #{shopWallet.freezeAmount}, + + + `total_settled_amount` = #{shopWallet.totalSettledAmount}, + + + `sms_num` = #{shopWallet.smsNum}, + + + `version` = #{shopWallet.version} + 1, + + + where shop_wallet_id = #{shopWallet.shopWalletId} + and `version` = #{shopWallet.version} + + + + + + update shop_wallet + set unsettled_amount = unsettled_amount + #{changeAmount} + where shop_id = #{shopId} and pay_sys_type = #{paySysType} + and unsettled_amount >= -#{changeAmount} + + + + update shop_wallet + set unsettled_amount = unsettled_amount - #{shopRealRefundAmount} + where shop_id = #{shopId} and pay_sys_type = #{paySysType} + and unsettled_amount >= #{shopRealRefundAmount} + + + + update shop_wallet + set settled_amount = settled_amount + #{settledAmount} + + , total_settled_amount = total_settled_amount + #{settledAmount} + + where shop_id = #{shopId} and pay_sys_type = #{paySysType} + + + + update shop_wallet + set settled_amount = settled_amount - #{changeAmount} + where shop_id = #{shopId} and pay_sys_type = #{paySysType} + and settled_amount >= #{changeAmount} + + + + update shop_wallet + set freeze_amount = freeze_amount + #{changeAmount} + where shop_id = #{shopId} and pay_sys_type = #{paySysType} + + + + update shop_wallet + set freeze_amount = freeze_amount - #{changeAmount} + where shop_id = #{shopId} and pay_sys_type = #{paySysType} + and freeze_amount >= #{changeAmount} + + + + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierAuditingMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierAuditingMapper.xml new file mode 100644 index 0000000..a8ac954 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierAuditingMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + `supplier_auditing_id`,`create_time`,`update_time`,`user_id`,`supplier_id`,`auditor_id`,`status`,`remarks` + + + + + insert into supplier_auditing (`user_id`,`supplier_id`,`auditor_id`,`status`,`remarks`) + values (#{supplierAuditing.userId},#{supplierAuditing.supplierId},#{supplierAuditing.auditorId},#{supplierAuditing.status},#{supplierAuditing.remarks}); + + + update supplier_auditing + + + `user_id` = #{supplierAuditing.userId}, + + + `supplier_id` = #{supplierAuditing.supplierId}, + + + `auditor_id` = #{supplierAuditing.auditorId}, + + + `status` = #{supplierAuditing.status}, + + + `remarks` = #{supplierAuditing.remarks}, + + + `update_time` = #{supplierAuditing.updateTime}, + + + where supplier_auditing_id = #{supplierAuditing.supplierAuditingId} + + + delete from supplier_auditing where supplier_auditing_id = #{supplierAuditingId} + + + + + update supplier_auditing set status = -1 + where status = 0 and supplier_id in + + #{supplierId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierDetailMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierDetailMapper.xml new file mode 100644 index 0000000..e84851d --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierDetailMapper.xml @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `supplier_id`,`create_time`,`update_time`,`type`,`supplier_shop_name`,`intro`,`notice_mobile`,`supplier_logo`,`supplier_status`, + `is_preferred`,`supplier_name`,`contact_name`,`contact_phone`,`contract_start_time`,`contract_end_time`, + `is_create_member`,`is_bind_phone`,`company_info_process_status`,`id_card_collect_process_status`,`allinpay_supplier_status`, + `company_acct_protocol_no`,`legal_acct_protocol_no` + + + + + + + + insert into supplier_detail (`intro`,`notice_mobile`,`supplier_logo`,`mobile_background_pic`,`pc_background_pic`,`supplier_status`,`type`,`is_preferred`,`supplier_name`,`contact_name`,`contact_phone`,`contract_start_time`,`contract_end_time`) + values (#{supplierDetail.intro},#{supplierDetail.noticeMobile},#{supplierDetail.supplierLogo},#{supplierDetail.mobileBackgroundPic},#{supplierDetail.pcBackgroundPic},#{supplierDetail.supplierStatus},#{supplierDetail.type},#{supplierDetail.isPreferred},#{supplierDetail.supplierName},#{supplierDetail.contactName},#{supplierDetail.contactPhone},#{supplierDetail.contractStartTime},#{supplierDetail.contractEndTime}); + + + update supplier_detail + + + `supplier_shop_name` = #{supplierDetail.supplierShopName}, + + + `intro` = #{supplierDetail.intro}, + + + `notice_mobile` = #{supplierDetail.noticeMobile}, + + + `supplier_logo` = #{supplierDetail.supplierLogo}, + + + `mobile_background_pic` = #{supplierDetail.mobileBackgroundPic}, + + + `pc_background_pic` = #{supplierDetail.pcBackgroundPic}, + + + `supplier_status` = #{supplierDetail.supplierStatus}, + + + `type` = #{supplierDetail.type}, + + + `is_preferred` = #{supplierDetail.isPreferred}, + + + `supplier_name` = #{supplierDetail.supplierName}, + + + `contact_name` = #{supplierDetail.contactName}, + + + `contact_phone` = #{supplierDetail.contactPhone}, + + + `contract_start_time` = #{supplierDetail.contractStartTime}, + + `contract_end_time` = #{supplierDetail.contractEndTime} + + where supplier_id = #{supplierDetail.supplierId} limit 1 + + + delete from supplier_detail where supplier_id = #{supplierId} + + + + + + + + update supplier_detail set `supplier_status` = #{supplierStatus} where supplier_id = #{supplierId} + + + update supplier_detail + + set `supplier_status` = + if(#{now} >= contract_start_time and (#{now} < contract_end_time or contract_end_time is null), 1, 0) + + where `supplier_status` = 1 or `supplier_status` = 0 + + + + + + + + + + + + + + + + + + + UPDATE supplier_detail set allinpay_supplier_status = 2 + where supplier_status in (0,1,2,5) and supplier_id in + + #{supplierId} + + + + UPDATE supplier_detail set allinpay_supplier_status = 0, supplier_status = 4 + where supplier_status = 3 and supplier_id in + + #{supplierId} + + + + UPDATE supplier_detail set is_create_member = 1 + where supplier_id in + + #{supplierId} + + + + update supplier_detail set allinpay_supplier_status = #{status} + where supplier_id = #{supplierId} and is_create_member = 1 + + + update supplier_detail set company_info_process_status = 2 + where supplier_id = #{supplierId} and is_create_member = 1 + + + update supplier_detail set company_info_process_status = 3, allinpay_supplier_status = 2 + where supplier_id = #{supplierId} and is_create_member = 1 + + + update supplier_detail set id_card_collect_process_status = #{status} + where supplier_id = #{supplierId} + + + update supplier_detail set allinpay_supplier_status = 1 + where supplier_id = #{supplierId} + and is_create_member = 1 and company_info_process_status = 2 and id_card_collect_process_status = 4 + + + update supplier_detail set allinpay_supplier_status = 3 where supplier_id = #{supplierId} and is_create_member = 1 and company_info_process_status = 2 + + + update supplier_detail set is_bind_phone = #{status} + where supplier_id = #{supplierId} + + + update supplier_detail + + + legal_acct_protocol_no = #{acctProtocolNo}, + + + company_acct_protocol_no = #{acctProtocolNo} + + + where supplier_id = #{supplierId} + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierExtensionMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierExtensionMapper.xml new file mode 100644 index 0000000..bdba4af --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierExtensionMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + `supplier_extension_id`,`supplier_id`,`create_time`,`update_time`,`sale_num` + + + insert into supplier_extension (`supplier_id`) + values (#{supplierExtension.supplierId}); + + + update supplier_extension + + + `sale_num` = #{supplierExtension.saleNum}, + + + where supplier_Id = #{supplierExtension.supplierId} + + diff --git a/tmerclub-admin/src/main/resources/mapper/SupplierWithdrawCashMapper.xml b/tmerclub-admin/src/main/resources/mapper/SupplierWithdrawCashMapper.xml new file mode 100644 index 0000000..1e68a7e --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SupplierWithdrawCashMapper.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `cash_id`,`pay_sys_type`,`create_time`,`update_time`,`supplier_id`,`auditor_id`,`amount`,`auditing_time`,`status`,`remarks`,`supplier_remarks`,`paying_account`,`paying_card_no`,`paying_time`,`supplier_bank_card_id`,`allinpay_status`,`biz_order_no`,`pay_fail_message` + + + + + + + + insert into supplier_withdraw_cash (`pay_sys_type`,`supplier_id`,`auditor_id`,`amount`,`auditing_time`,`status`,`remarks`,`supplier_remarks`,`paying_account`,`paying_card_no`,`paying_time`,`supplier_bank_card_id`,`allinpay_status`,`biz_order_no`) + values (#{supplierWithdrawCash.paySysType},#{supplierWithdrawCash.supplierId},#{supplierWithdrawCash.auditorId},#{supplierWithdrawCash.amount},#{supplierWithdrawCash.auditingTime},#{supplierWithdrawCash.status},#{supplierWithdrawCash.remarks},#{supplierWithdrawCash.supplierRemarks},#{supplierWithdrawCash.payingAccount},#{supplierWithdrawCash.payingCardNo},#{supplierWithdrawCash.payingTime},#{supplierWithdrawCash.supplierBankCardId},#{supplierWithdrawCash.allinpayStatus},#{supplierWithdrawCash.bizOrderNo}); + + + update supplier_withdraw_cash + + + `supplier_id` = #{supplierWithdrawCash.supplierId}, + + + `auditor_id` = #{supplierWithdrawCash.auditorId}, + + + `amount` = #{supplierWithdrawCash.amount}, + + + `auditing_time` = #{supplierWithdrawCash.auditingTime}, + + + `status` = #{supplierWithdrawCash.status}, + + + `remarks` = #{supplierWithdrawCash.remarks}, + + + `supplier_remarks` = #{supplierWithdrawCash.supplierRemarks}, + + + `paying_account` = #{supplierWithdrawCash.payingAccount}, + + + `paying_card_no` = #{supplierWithdrawCash.payingCardNo}, + + + `paying_time` = #{supplierWithdrawCash.payingTime}, + + + `supplier_bank_card_id` = #{supplierWithdrawCash.supplierBankCardId}, + + + `allinpay_status` = #{supplierWithdrawCash.allinpayStatus}, + + + `pay_fail_message` = #{supplierWithdrawCash.payFailMessage}, + + + where cash_id = #{supplierWithdrawCash.cashId} + + + update supplier_withdraw_cash + + + `supplier_id` = #{supplierWithdrawCash.supplierId}, + + + `auditor_id` = #{supplierWithdrawCash.auditorId}, + + + `amount` = #{supplierWithdrawCash.amount}, + + + `auditing_time` = #{supplierWithdrawCash.auditingTime}, + + + `status` = #{supplierWithdrawCash.status}, + + + `remarks` = #{supplierWithdrawCash.remarks}, + + + `supplier_remarks` = #{supplierWithdrawCash.supplierRemarks}, + + + `paying_account` = #{supplierWithdrawCash.payingAccount}, + + + `paying_card_no` = #{supplierWithdrawCash.payingCardNo}, + + + `paying_time` = #{supplierWithdrawCash.payingTime}, + + + `supplier_bank_card_id` = #{supplierWithdrawCash.supplierBankCardId}, + + + where cash_id = #{cashId} and status = #{status} + + diff --git a/tmerclub-admin/src/main/resources/mapper/SysAccessKeyMapper.xml b/tmerclub-admin/src/main/resources/mapper/SysAccessKeyMapper.xml new file mode 100644 index 0000000..e642590 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SysAccessKeyMapper.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `sys_access_key_id`,`name`,`remark`,`access_id`,`access_key`,`sys_type`,`prem_type`,`usability_shop_id`,`create_time`,`update_time` + + + + + + insert into sys_access_key (`name`,`remark`,`access_id`,`access_key`,sys_type,usability_shop_id,prem_type) + values (#{sysAccessKey.name},#{sysAccessKey.remark},#{sysAccessKey.accessId},#{sysAccessKey.accessKey},#{sysAccessKey.sysType}, + #{sysAccessKey.usabilityShopId},#{sysAccessKey.premType}); + + + update sys_access_key + + + `name` = #{sysAccessKey.name}, + + + `remark` = #{sysAccessKey.remark}, + + + `access_id` = #{sysAccessKey.accessId}, + + + `access_key` = #{sysAccessKey.accessKey}, + + + `prem_type` = #{sysAccessKey.premType}, + + + `usability_shop_id` = #{sysAccessKey.usabilityShopId}, + + + `sys_type` = #{sysAccessKey.sysType}, + + + where sys_access_key_id = #{sysAccessKey.sysAccessKeyId} + + + delete from sys_access_key where sys_access_key_id = #{sysAccessKeyId} + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SysAccessMenuMapper.xml b/tmerclub-admin/src/main/resources/mapper/SysAccessMenuMapper.xml new file mode 100644 index 0000000..2c84d1d --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SysAccessMenuMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + insert into sys_access_menu (sys_access_key_id,menu_id) values + + (#{sysAccessKeyId},#{menuId}) + + + + + + + + + + delete from sys_access_menu where sys_access_key_id = #{sysAccessKeyId} + + diff --git a/tmerclub-admin/src/main/resources/mapper/SysAccessMenuPermissionMapper.xml b/tmerclub-admin/src/main/resources/mapper/SysAccessMenuPermissionMapper.xml new file mode 100644 index 0000000..9aae2e8 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SysAccessMenuPermissionMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + insert into sys_access_menu_permission(sys_access_key_id, menu_permission_id) values + + (#{sysAccessKeyId}, #{menuPermsId}) + + + + + delete from sys_access_menu_permission where sys_access_key_id = #{sysAccessKeyId} + + \ No newline at end of file diff --git a/tmerclub-admin/src/main/resources/mapper/SysConfigMapper.xml b/tmerclub-admin/src/main/resources/mapper/SysConfigMapper.xml new file mode 100644 index 0000000..fef0301 --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SysConfigMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + `id`,`param_key`,`param_value`,`remark` + + + + + + insert into sys_config (`param_key`,`param_value`,`remark`) + values (#{sysConfig.paramKey},#{sysConfig.paramValue},#{sysConfig.remark}); + + + update sys_config + + + `param_key` = #{sysConfig.paramKey}, + + + `param_value` = #{sysConfig.paramValue}, + + + `remark` = #{sysConfig.remark}, + + + where param_key = #{sysConfig.paramKey} + + + update sys_config set param_value = #{value} where param_key = #{key} + + + + + + diff --git a/tmerclub-admin/src/main/resources/mapper/SysUserMapper.xml b/tmerclub-admin/src/main/resources/mapper/SysUserMapper.xml new file mode 100644 index 0000000..0de81ac --- /dev/null +++ b/tmerclub-admin/src/main/resources/mapper/SysUserMapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + sys_user_id, create_time, update_time, nick_name, avatar,`code`,phone_num,has_account + + + + + + + + insert into `sys_user` ( `sys_user_id`, `nick_name`, `avatar`, `code`, `phone_num`,has_account) + values (#{sysUser.sysUserId},#{sysUser.nickName},#{sysUser.avatar},#{sysUser.code},#{sysUser.phoneNum}, #{sysUser.hasAccount}); + + + update sys_user + + + nick_name = #{sysUser.nickName}, + + + avatar = #{sysUser.avatar}, + + + code = #{sysUser.code}, + + + phone_num = #{sysUser.phoneNum}, + + + has_account = #{sysUser.hasAccount}, + + + where sys_user_id = #{sysUser.sysUserId} + + + + delete from sys_user where sys_user_id = #{sysUserId} + + + + + + + update sys_user SET phone_num = #{phoneNum} + where sys_user_id = #{sysUserId} + + diff --git a/tmerclub-api/pom.xml b/tmerclub-api/pom.xml new file mode 100644 index 0000000..724dfb5 --- /dev/null +++ b/tmerclub-api/pom.xml @@ -0,0 +1,32 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api + pom + + mall4cloud 内网接口 + + tmerclub-api-auth + tmerclub-api-biz + tmerclub-api-product + tmerclub-api-user + tmerclub-api-marketing + tmerclub-api-order + tmerclub-api-search + tmerclub-api-admin + tmerclub-api-group + tmerclub-api-seckill + tmerclub-api-flow + tmerclub-api-payment + tmerclub-api-im + + + diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/EsShopDetailBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/EsShopDetailBO.java new file mode 100644 index 0000000..763f08b --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/EsShopDetailBO.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.bo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺详情VO + * + * @author FrozenWatermelon + * @date 2020-11-23 16:24:29 + */ +public class EsShopDetailBO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺logo") + private String shopLogo; + + @Schema(description = "店铺状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:待审核 4:店铺申请中 5:申请失败)") + private Integer shopStatus; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "联系电话") + private String contactPhone; + + @Schema(description = "店铺商品总销量") + private Integer saleNum; + + @Schema(description = "用户总收藏量") + private Integer collectionNum; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Integer collectionNum) { + this.collectionNum = collectionNum; + } + + @Override + public String toString() { + return "EsShopDetailBO{" + + "shopId=" + shopId + + ", type=" + type + + ", shopName='" + shopName + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", shopStatus=" + shopStatus + + ", noticeMobile='" + noticeMobile + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", saleNum=" + saleNum + + ", collectionNum=" + collectionNum + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/OrderChangeShopWalletAmountBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/OrderChangeShopWalletAmountBO.java new file mode 100644 index 0000000..963683b --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/OrderChangeShopWalletAmountBO.java @@ -0,0 +1,421 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/3/9 + */ +public class OrderChangeShopWalletAmountBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单状态 + */ + private Integer orderStatus; + + /** + * 订单id + */ + private Long orderId; + + /** + * 订单项id + */ + private Long orderItemId; + + /** + * 退款单id + */ + private Long refundId; + + /** + * 钱包分片序号 + */ + private Integer zoneNo; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 订单 or 订单项 实际支付金额 + */ + private Long actualTotal; + + /** + * 申请退款金额 + */ + private Long refundAmount; + + /** + * 平台补贴金额 + */ + private Long platformAllowanceAmount; + + /** + * 平台运费减免金额 + */ + private Long platformFreeFreightAmount; + + /** + * 店铺补贴金额 + */ + private Long shopAllowanceAmount; + + /** + * 平台抽成 + */ + private Long platformCommission; + + /** + * 平台抽成变化金额 + */ + private Long changePlatformCommission; + + /** + * 采购金额变化金额 + */ + private Long refundPurchaseAmount; + + /** + * 采购金额变化金额 + */ + private Long changePurchaseAmount; + + /** + * 平台抽成比例 + */ + private Double rate; + + /** + * 分销金额 + */ + private Long distributionAmount; + + /** + * 平台供应商佣金变化金额 + */ + private Long changePurchasePlatformCommission; + + /** + * 平台供应商佣金变化金额 + */ + private Long refundPurchasePlatformCommission; + + /** + * 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + */ + private Integer supplierHandleStatus; + + /** + * 订单运费 + */ + private Long freightAmount; + + + /** + * 供应商订单运费 + */ + private Long supplierFreightAmount; + + /** + * 钱包id列表 + */ + private List walletLogIds; + + /** + * 是否待采购 1.是 0.否 2.采购完成 + * 枚举类 com.tmerclub.cloud.api.order.constant.PurchaseOrderWaitStatus + */ + private Integer waitPurchase; + + /** + * 最后一单 + */ + private Boolean lastOrder; + /** + * 支付系统类型 + * @see com.tmerclub.cloud.api.payment.constant.PaySysType + */ + private Integer paySysType; + /** + * 平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款 + */ + private Integer interventionRefundType; + + public Integer getInterventionRefundType() { + return interventionRefundType; + } + + public void setInterventionRefundType(Integer interventionRefundType) { + this.interventionRefundType = interventionRefundType; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Long getRefundPurchasePlatformCommission() { + return refundPurchasePlatformCommission; + } + + public void setRefundPurchasePlatformCommission(Long refundPurchasePlatformCommission) { + this.refundPurchasePlatformCommission = refundPurchasePlatformCommission; + } + + public Long getRefundPurchaseAmount() { + return refundPurchaseAmount; + } + + public void setRefundPurchaseAmount(Long refundPurchaseAmount) { + this.refundPurchaseAmount = refundPurchaseAmount; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getChangePurchasePlatformCommission() { + return changePurchasePlatformCommission; + } + + public void setChangePurchasePlatformCommission(Long changePurchasePlatformCommission) { + this.changePurchasePlatformCommission = changePurchasePlatformCommission; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getChangePurchaseAmount() { + return changePurchaseAmount; + } + + public void setChangePurchaseAmount(Long changePurchaseAmount) { + this.changePurchaseAmount = changePurchaseAmount; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformAllowanceAmount() { + return platformAllowanceAmount; + } + + public void setPlatformAllowanceAmount(Long platformAllowanceAmount) { + this.platformAllowanceAmount = platformAllowanceAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getChangePlatformCommission() { + return changePlatformCommission; + } + + public void setChangePlatformCommission(Long changePlatformCommission) { + this.changePlatformCommission = changePlatformCommission; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getShopAllowanceAmount() { + return shopAllowanceAmount; + } + + public void setShopAllowanceAmount(Long shopAllowanceAmount) { + this.shopAllowanceAmount = shopAllowanceAmount; + } + + public Long getSupplierFreightAmount() { + return supplierFreightAmount; + } + + public void setSupplierFreightAmount(Long supplierFreightAmount) { + this.supplierFreightAmount = supplierFreightAmount; + } + + public List getWalletLogIds() { + return walletLogIds; + } + + public void setWalletLogIds(List walletLogIds) { + this.walletLogIds = walletLogIds; + } + + public Boolean isLastOrder() { + return lastOrder; + } + + public void setLastOrder(Boolean lastOrder) { + this.lastOrder = lastOrder; + } + + @Override + public String toString() { + return "OrderChangeShopWalletAmountBO{" + + "orderStatus=" + orderStatus + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundId=" + refundId + + ", zoneNo=" + zoneNo + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", actualTotal=" + actualTotal + + ", refundAmount=" + refundAmount + + ", platformAllowanceAmount=" + platformAllowanceAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", shopAllowanceAmount=" + shopAllowanceAmount + + ", platformCommission=" + platformCommission + + ", changePlatformCommission=" + changePlatformCommission + + ", refundPurchaseAmount=" + refundPurchaseAmount + + ", changePurchaseAmount=" + changePurchaseAmount + + ", rate=" + rate + + ", distributionAmount=" + distributionAmount + + ", changePurchasePlatformCommission=" + changePurchasePlatformCommission + + ", refundPurchasePlatformCommission=" + refundPurchasePlatformCommission + + ", supplierHandleStatus=" + supplierHandleStatus + + ", freightAmount=" + freightAmount + + ", supplierFreightAmount=" + supplierFreightAmount + + ", walletLogIds=" + walletLogIds + + ", waitPurchase=" + waitPurchase + + ", lastOrder=" + lastOrder + + ", paySysType=" + paySysType + + ", interventionRefundType=" + interventionRefundType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/ShopWalletBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/ShopWalletBO.java new file mode 100644 index 0000000..5f19afd --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/bo/ShopWalletBO.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家钱包信息BO + * @author cl + * @date 2021-08-19 11:04:45 + */ +public class ShopWalletBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺钱包id") + private Long shopWalletId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "未结算金额(用户支付)") + private Long unsettledAmount; + + @Schema(description = "已结算金额(用户确认收货后,可以提现)") + private Long settledAmount; + + @Schema(description = "冻结金额(用户确认收货)") + private Long freezeAmount; + + @Schema(description = "累积结算金额") + private Long totalSettledAmount; + + public Long getShopWalletId() { + return shopWalletId; + } + + public void setShopWalletId(Long shopWalletId) { + this.shopWalletId = shopWalletId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + @Override + public String toString() { + return "ShopWalletBO{" + + "shopWalletId=" + shopWalletId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", freezeAmount=" + freezeAmount + + ", totalSettledAmount=" + totalSettledAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/constant/ShopStatus.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/constant/ShopStatus.java new file mode 100644 index 0000000..a75db70 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/constant/ShopStatus.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.constant; + +import java.util.Objects; + +/** + * 店铺状态 + * + * @author YXF + */ +public enum ShopStatus { + + /** + * 已删除 + */ + DELETE(-1), + /** + * 停业中 + */ + STOP(0), + + /** + * 营业中 + */ + OPEN(1), + + /** + * 违规下线 + */ + OFFLINE(2), + + /** + * 开店申请待审核 + */ + OPEN_AWAIT_AUDIT(3), + + /** + * 店铺开店申请中 + */ + APPLYING(4), + + /** + * 上线申请待审核 + */ + OFFLINE_AWAIT_AUDIT(5), + + /** + * 审核失败(通联独有) + */ + AUDIT_FAIL(6); + + private final Integer num; + + public Integer value() { + return num; + } + + ShopStatus(Integer num) { + this.num = num; + } + + public static ShopStatus instance(Integer value) { + ShopStatus[] enums = values(); + for (ShopStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static Boolean offlineOrDelete(Integer status) { + if (!Objects.equals(status, OPEN.value()) && !Objects.equals(status, STOP.value())) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/IndexImgFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/IndexImgFeignClient.java new file mode 100644 index 0000000..97d2c94 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/IndexImgFeignClient.java @@ -0,0 +1,15 @@ +package com.tmerclub.cloud.api.multishop.feign; + + +/** + * @author lanhai + */ +public interface IndexImgFeignClient { + + /** + * 根据店铺id和商品id修改轮播图跳转地址 + * @param spuId + * @param shopId + */ + void udpateIndexImgBySpuId(Long spuId, Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopBankCardFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopBankCardFeignClient.java new file mode 100644 index 0000000..44965a3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopBankCardFeignClient.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.api.multishop.vo.ShopBankCardVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author track + */ +public interface ShopBankCardFeignClient { + + /** + * 保存银行卡至数据库 + * @param tenantId + * @param shopBankCardVO + */ + void saveBandCardByAllinpay(String tenantId, ShopBankCardVO shopBankCardVO); + + /** + * 解绑法人卡 + * @param shopBankCardId + * @return + */ + ServerResponseEntity deleteLegalBankCard(Long shopBankCardId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopRenovationFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopRenovationFeignClient.java new file mode 100644 index 0000000..2b6ac46 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopRenovationFeignClient.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.api.multishop.vo.ShopRenovationVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author track + */ +public interface ShopRenovationFeignClient { + + /** + * 根据页面id获取页面信息 + * @param renovationId 页面id + * @return 页面信息 + */ + ServerResponseEntity getbyRenovationId(Long renovationId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopUserFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopUserFeignClient.java new file mode 100644 index 0000000..585dba2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopUserFeignClient.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; +/** + * @author lanhai + */ +public interface ShopUserFeignClient { + /** + * 根据userId获取商家员工和账号信息 + * @param userId + * @return + */ + ServerResponseEntity getByUserId(Long userId); + /** + * 根据userId获取商家员工信息 + * @param userId + * @return + */ + ShopUserVO getSimpleByUserId(Long userId); + + + /** + * 根据用户id列表查名称 + * @param userIds 用户id列表 + * @return + */ + List getImShopUserList(List userIds); + + + /** + * 根据手机号码查询账户数量 + * + * @param mobile 手机号码 + * @return 账户数量 + */ + ServerResponseEntity countAccoutByMobile(String mobile); + + /** + * 根据店铺id获取店主id + * @param shopId + * @return + */ + ServerResponseEntity getShopUserIdByShopId(Long shopId); + +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWalletFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWalletFeignClient.java new file mode 100644 index 0000000..6b20f9f --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWalletFeignClient.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author lhd + * @date 2022/7/3716:42 + */ +public interface ShopWalletFeignClient { + + /** + * 获取店铺余额 + * @param shopId 店铺id + * @param paySysType 支付系统类型 0默认1通联 + * @return + */ + ServerResponseEntity getSettlementAmountByShopId(Long shopId, Integer paySysType); + + /** + * 减少商家结算金额 + * @param orderChangeShopWalletAmountBO + */ + void subSettlementAmount(OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO); + + /** + * 通联商家充值回调 + * @param bizOrderNo + * @param payStatus + * @param bizUserId + * @return + */ + ServerResponseEntity rechargeBack(String bizOrderNo, + String payStatus, + String bizUserId); + +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWalletLogFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWalletLogFeignClient.java new file mode 100644 index 0000000..fedbbd0 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWalletLogFeignClient.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author chiley + * @date 2022/6/30 16:42 + */ +public interface ShopWalletLogFeignClient { + /** + * 获取充值金额 + * @param shopWalletLogId 充值记录id + * @return + */ + ServerResponseEntity getPayAmount(Long shopWalletLogId); + + /** + * 获取充值记录是否已经支付 + * @param shopWalletLogId 充值记录id + * @return + */ + ServerResponseEntity getIsPay(Long shopWalletLogId); + + /** + * 获取钱包记录获取是否采购时已经支付过余额 + * @param orderId + * @return + */ + ServerResponseEntity getShopBalancePayIsPay(Long orderId); + + /** + * 获取钱包记录获取是否已经在自行处理供应商订单时支付过余额 + * @param orderId + * @return + */ + ServerResponseEntity getRefundShopBalancePayIsPay(Long orderId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWithdrawCashFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWithdrawCashFeignClient.java new file mode 100644 index 0000000..04fc1bf --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/feign/ShopWithdrawCashFeignClient.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author track + */ +public interface ShopWithdrawCashFeignClient { + + /** + * 提现回调 + * @param bizOrderNo + * @param payStatus + * @param bizUserId + * @param payFailMessage + * @return + */ + ServerResponseEntity withdrawBack(String bizOrderNo, + String payStatus, + String bizUserId, + String payFailMessage); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopDetailVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopDetailVO.java new file mode 100644 index 0000000..493f794 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopDetailVO.java @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 店铺详情VO + * + * @author FrozenWatermelon + * @date 2020-12-05 15:50:25 + */ +public class ShopDetailVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺简介") + private String intro; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "店铺logo(可修改)") + private String shopLogo; + + @Schema(description = "店铺状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:店铺申请中 5:上线申请待审核)") + private Integer shopStatus; + + @Schema(description = "是否优选好店 1.是 0.不是") + private Integer isPreferred; + + @Schema(description = "店铺收藏数量") + private Long collectionNum; + + @Schema(description = "移动端背景图") + private String mobileBackgroundPic; + + @Schema(description = "pc背景图") + private String pcBackgroundPic; + + @Schema(description = "联系人姓名") + private String contactName; + + @Schema(description = "联系方式") + private String contactPhone; + + @Schema(description = "商家账号") + private String merchantAccount; + + @Schema(description = "账号状态, 1:启用 0:禁用 -1:删除") + private Integer accountStatus; + + @Schema(description = "商家名称") + private String merchantName; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "是否在通联创建了企业会员 0否1是") + private Integer isCreateMember; + + @Schema(description = "是否绑定了手机 0否1是") + private Integer isBindPhone; + + @Schema(description = "企业信息审核状态 0.未提交 1.待审核 2.审核成功 3.审核失败") + private Integer companyInfoProcessStatus; + + @Schema(description = "影印件采集审核状态 0.未上传 1.待审核 2.只有工商认证通过 3.只有法人信息通过 4.均审核通过") + private Integer idCardCollectProcessStatus; + + @Schema(description = "通联店铺状态 0未开通 1营业中 2平台下线 3上线待审核 4开店待审核") + private Integer allinpayShopStatus; + + @Schema(description = "企业账户提现协议编号") + private String companyAcctProtocolNo; + + @Schema(description = "法人账户提现协议编号") + private String legalAcctProtocolNo; + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public String getMerchantAccount() { + return merchantAccount; + } + + public void setMerchantAccount(String merchantAccount) { + this.merchantAccount = merchantAccount; + } + + public Integer getAccountStatus() { + return accountStatus; + } + + public void setAccountStatus(Integer accountStatus) { + this.accountStatus = accountStatus; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public String getMobileBackgroundPic() { + return mobileBackgroundPic; + } + + public void setMobileBackgroundPic(String mobileBackgroundPic) { + this.mobileBackgroundPic = mobileBackgroundPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public Long getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Long collectionNum) { + this.collectionNum = collectionNum; + } + + public Integer getIsPreferred() { + return isPreferred; + } + + public void setIsPreferred(Integer isPreferred) { + this.isPreferred = isPreferred; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public String getMerchantName() { + return merchantName; + } + + public void setMerchantName(String merchantName) { + this.merchantName = merchantName; + } + + public Integer getIsCreateMember() { + return isCreateMember; + } + + public void setIsCreateMember(Integer isCreateMember) { + this.isCreateMember = isCreateMember; + } + + public Integer getIsBindPhone() { + return isBindPhone; + } + + public void setIsBindPhone(Integer isBindPhone) { + this.isBindPhone = isBindPhone; + } + + public Integer getCompanyInfoProcessStatus() { + return companyInfoProcessStatus; + } + + public void setCompanyInfoProcessStatus(Integer companyInfoProcessStatus) { + this.companyInfoProcessStatus = companyInfoProcessStatus; + } + + public Integer getIdCardCollectProcessStatus() { + return idCardCollectProcessStatus; + } + + public void setIdCardCollectProcessStatus(Integer idCardCollectProcessStatus) { + this.idCardCollectProcessStatus = idCardCollectProcessStatus; + } + + public Integer getAllinpayShopStatus() { + return allinpayShopStatus; + } + + public void setAllinpayShopStatus(Integer allinpayShopStatus) { + this.allinpayShopStatus = allinpayShopStatus; + } + + public String getCompanyAcctProtocolNo() { + return companyAcctProtocolNo; + } + + public void setCompanyAcctProtocolNo(String companyAcctProtocolNo) { + this.companyAcctProtocolNo = companyAcctProtocolNo; + } + + public String getLegalAcctProtocolNo() { + return legalAcctProtocolNo; + } + + public void setLegalAcctProtocolNo(String legalAcctProtocolNo) { + this.legalAcctProtocolNo = legalAcctProtocolNo; + } + + @Override + public String toString() { + return "ShopDetailVO{" + + "shopId=" + shopId + + ", type=" + type + + ", shopName='" + shopName + '\'' + + ", intro='" + intro + '\'' + + ", noticeMobile='" + noticeMobile + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", shopStatus=" + shopStatus + + ", isPreferred=" + isPreferred + + ", collectionNum=" + collectionNum + + ", mobileBackgroundPic='" + mobileBackgroundPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", contactName='" + contactName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", merchantAccount='" + merchantAccount + '\'' + + ", accountStatus=" + accountStatus + + ", merchantName='" + merchantName + '\'' + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", isCreateMember=" + isCreateMember + + ", isBindPhone=" + isBindPhone + + ", companyInfoProcessStatus=" + companyInfoProcessStatus + + ", idCardCollectProcessStatus=" + idCardCollectProcessStatus + + ", allinpayShopStatus=" + allinpayShopStatus + + ", companyAcctProtocolNo='" + companyAcctProtocolNo + '\'' + + ", legalAcctProtocolNo='" + legalAcctProtocolNo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopRefundAddrVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopRefundAddrVO.java new file mode 100644 index 0000000..4c5a150 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopRefundAddrVO.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家退货地址VO + * + * @author FrozenWatermelon + * @date 2021-03-09 15:03:18 + */ +public class ShopRefundAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商家退货地址id") + private Long shopRefundAddrId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "是否默认地址 1是") + private Integer isDefault; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getShopRefundAddrId() { + return shopRefundAddrId; + } + + public void setShopRefundAddrId(Long shopRefundAddrId) { + this.shopRefundAddrId = shopRefundAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "ShopRefundAddrVO{" + + "shopRefundAddrId=" + shopRefundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",postCode=" + postCode + + ",addr=" + addr + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopRenovationVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopRenovationVO.java new file mode 100644 index 0000000..7717ac6 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopRenovationVO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 店铺装修信息VO + * + * @author track + */ +public class ShopRenovationVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺装修id") + private Long renovationId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "装修名称") + private String name; + + @Schema(description = "装修内容") + private String content; + + @Schema(description = "是否主页 1.是 0.不是") + private Integer homeStatus; + + @Schema(description = "装修类型 1.pc 2.移动端") + private Integer renovationType; + + public Long getRenovationId() { + return renovationId; + } + + public void setRenovationId(Long renovationId) { + this.renovationId = renovationId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(Integer homeStatus) { + this.homeStatus = homeStatus; + } + + public Integer getRenovationType() { + return renovationType; + } + + public void setRenovationType(Integer renovationType) { + this.renovationType = renovationType; + } + + @Override + public String toString() { + return "ShopRenovationVO{" + + "renovationId=" + renovationId + + ",shopId=" + shopId + + ",name=" + name + + ",content=" + content + + ",homeStatus=" + homeStatus + + ",renovationType=" + renovationType + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopUserVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopUserVO.java new file mode 100644 index 0000000..1d24b6c --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/multishop/vo/ShopUserVO.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.multishop.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/2 + */ +public class ShopUserVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * shopUserId + */ + @Schema(description = "店铺用户id") + private Long shopUserId; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "员工编号") + private String code; + + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "是否已经有账号了") + private Integer hasAccount; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "角色id列表") + private List roleIds; + + @Schema(description = "账号") + private String username; + + @Schema(description = "密码") + private String password; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + /** + * 是否是管理员 + */ + @Schema(description = "是否是管理员") + private Integer isAdmin; + + public Long getShopUserId() { + return shopUserId; + } + + public void setShopUserId(Long shopUserId) { + this.shopUserId = shopUserId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + @Override + public String toString() { + return "ShopUserVO{" + + "shopUserId=" + shopUserId + + ", nickName='" + nickName + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", hasAccount=" + hasAccount + + ", shopId=" + shopId + + ", roleIds=" + roleIds + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", status=" + status + + ", isAdmin=" + isAdmin + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/config/FeignShopConfig.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/config/FeignShopConfig.java new file mode 100644 index 0000000..618bc02 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/config/FeignShopConfig.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.config; + + +import cn.hutool.core.util.StrUtil; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.bean.*; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Component; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * 商城配置文件 + * 支付配置、文件上传配置、短信配置、快递配置、小程序配置、微信网页开发配置、公众号配置 + * @author FrozenWatermelon + */ +@Component +public class FeignShopConfig { + + @DubboReference + private ConfigFeignClient configFeignClient; + + /** + * 缓存 + */ + private static final Cache CONFIG_MAP = Caffeine.newBuilder() + // 数量上限 + .maximumSize(100) + // 过期机制 + .expireAfterWrite(5, TimeUnit.MINUTES).build(); + + + public DaYu getDaYu() { + DaYu daYu = getSysConfigObject(Constant.ALIDAYU_CONFIG, DaYu.class); + if (daYu == null || StrUtil.isBlank(daYu.getAccessKeyId())) { + throw new LuckException("无法获取短信配置,无法发送短信"); + } + return daYu; + } + + + public QuickBird getQuickBird() { + return getSysConfigObject(Constant.QUICKBIRD_CONFIG, QuickBird.class); + } + + public AliLive getAliLive() { + return getSysConfigObject(Constant.ALI_LIVE_CONFIG, AliLive.class); + } + + public Quick100 getQuick100() { + return getSysConfigObject(Constant.QUICK100_CONFIG, Quick100.class); + } + + public AliQuick getAliQuickConfig() { + return getSysConfigObject(Constant.ALI_QUICK_CONFIG, AliQuick.class); + } + + + public WxMiniApp getWxMiniApp() { + WxMiniApp wxMiniApp = getSysConfigObject(Constant.MA_CONFIG, WxMiniApp.class); + if (wxMiniApp == null || StrUtil.isBlank(wxMiniApp.getAppId())) { + // 请在后台页面设置微信小程序信息后,再进行操作 + throw new LuckException("请在后台页面设置微信小程序信息后,再进行操作"); + } + return wxMiniApp; + } + + public WxMp getWxMp() { + WxMp wxMp = getSysConfigObject(Constant.MP_CONFIG, WxMp.class); + if (wxMp == null || StrUtil.isBlank(wxMp.getAppId())) { + // 请在后台页面设置微信公众号信息后,再进行操作 + throw new LuckException("请在后台页面设置微信公众号信息后,再进行操作"); + } + return wxMp; + } + + public WxApp getWxApp() { + WxApp wxApp = getSysConfigObject(Constant.MX_APP_CONFIG, WxApp.class); + if (wxApp == null || StrUtil.isBlank(wxApp.getAppId())) { + // 请在后台页面设置微信开放平申请应用相关信息后,再进行操作 + throw new LuckException("请在后台页面设置微信开放平申请应用相关信息后,再进行操作"); + } + return wxApp; + } + + public WxPay getWxPay() { + WxPay wxPay = getSysConfigObject(Constant.WXPAY_CONFIG, WxPay.class); + if (wxPay == null || StrUtil.isBlank(wxPay.getMchId())) { + // 请在后台页面设置微信支付信息后,再进行操作 + throw new LuckException("请在后台页面设置微信支付信息后,再进行操作"); + } + return wxPay; + } + + public Alipay getAlipay() { + return getSysConfigObject(Constant.ALIPAY_CONFIG, Alipay.class); + } + + public Allinpay getAllinpay() { + return getSysConfigObject(Constant.ALLINPAY_CONFIG, Allinpay.class); + } + + /** + * 获取文件上传配置 + * @return 文件上传配置 + */ + public UploadFile getUploadFile() { + return getSysConfigObject(Constant.UPLOAD_FILE_CONFIG, UploadFile.class); + } + + /** + * 获取系统配置,缓存起来 + */ + @SuppressWarnings("unchecked") + public T getSysConfigObject(String key, Class clazz) { +// T configData = (T) CONFIG_MAP.get(key, cacheKey -> { + ServerResponseEntity configResponse = configFeignClient.getConfig(key); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + String value = configResponse.getData(); + if (Objects.equals(String.class, clazz)) { + return (T) value; + } else { + return Json.parseObject(value, clazz); + } + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/OfflineHandleEventType.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/OfflineHandleEventType.java new file mode 100644 index 0000000..2bf4c29 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/constant/OfflineHandleEventType.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.constant; + +/** + * 下架处理事件类型 + * + * @author YXF + */ +public enum OfflineHandleEventType { + + /** + * 商品 + */ + PROD(1, "商品"), + /** + * 店铺 + */ + SHOP(2, "店铺"), + /** + * 满减 + */ + DISCOUNT(3, "满减"), + /** + * 优惠券 + */ + COUPON(4, "优惠券"), + /** + * 团购活动 + */ + GROUP_BUY(5, "团购活动"), + /** + * 分销总开关 + */ + DISTRIBUTION(6, "分销总开关"), + /** + * 秒杀 + */ + SECKILL(7, "秒杀"), + + /** + * 分销商品 + */ + DISTRIBUTION_PROD(8, "分销商品"), + + /** + * 自提点 + */ + STATION(9, "自提点"), + ; + + private final Integer value; + private final String desc; + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } + + OfflineHandleEventType(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + +} + + + diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/OfflineHandleEventFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/OfflineHandleEventFeignClient.java new file mode 100644 index 0000000..3af3021 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/OfflineHandleEventFeignClient.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.feign; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author YXF + * @date 2021/01/16 + */ +public interface OfflineHandleEventFeignClient { + + /** + * 新增下线事件记录 + * + * @param offlineHandleEventDto + * @return + */ + ServerResponseEntity save(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 通过handleId和sysType获取最新下线商品的事件 + * + * @param handleType + * @param handleId + * @param sysType + * @return + */ + ServerResponseEntity getProcessingEventByHandleTypeAndHandleId(Integer handleType, + Long handleId, Integer sysType); + + /** + * 审核下线事件 + * + * @param offlineHandleEventDto + * @return + */ + ServerResponseEntity auditOfflineEvent(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 违规事件提交审核 + * + * @param offlineHandleEventDto + * @return + */ + ServerResponseEntity updateToApply(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 更新审核事件的状态 + * + * @param offlineHandleEventDto + */ + void update(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 根据事件类型与事件id删除事件 + * + * @param handleType + * @param handleId + * @return + */ + ServerResponseEntity deleteByHandleTypeAndHandleId(Integer handleType, Long handleId); + + /** + * 批量新增下线事件记录 + * + * @param offlineHandleEventList + * @return + */ + ServerResponseEntity batchSave(List offlineHandleEventList); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/SysAccessKeyFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/SysAccessKeyFeignClient.java new file mode 100644 index 0000000..7c22ee7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/SysAccessKeyFeignClient.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.feign; + +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface SysAccessKeyFeignClient { + + + /** + * 根据账号id获取信息 + * @param accessId + * @return + */ + ServerResponseEntity getByAccessId(String accessId); + +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/SysUserFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/SysUserFeignClient.java new file mode 100644 index 0000000..7ab8e60 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/feign/SysUserFeignClient.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.feign; + +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author Citrus + * @date 2021/8/14 16:15 + */ +public interface SysUserFeignClient { + + /** + * 根据用户id列表查名称 + * @param userIds 用户id列表 + * @return + */ + ServerResponseEntity> getSysUserList(List userIds); + + /** + * 根据用户id列表查名称 + * @param userIds 用户id列表 + * @return + */ + List getImSysUserList(List userIds); + + /** + * 根据用户id查询用户及账号信息 + * @param userId 用户id + * @return + */ + ServerResponseEntity getSysUserByUserId(Long userId); + + /** + * 根据用户id查询用户 + * @param userId 用户id + * @return + */ + SysUserVO getSimpleByUserId(Long userId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionRecruitConfigApiVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionRecruitConfigApiVO.java new file mode 100644 index 0000000..1b183e2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/DistributionRecruitConfigApiVO.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author cl + * @date 2021-08-06 14:20:02 + */ +public class DistributionRecruitConfigApiVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "推广封面") + private String pic; + + @Schema(description = "推广标题") + private String title; + + @Schema(description = "推广内容") + private String content; + + /** + * 状态(0下线 1上线) + */ + @Schema(description = "状态 0关 1开") + private Integer state; + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionRecruitConfigApiVO{" + + "pic='" + pic + '\'' + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/OfflineHandleEventVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/OfflineHandleEventVO.java new file mode 100644 index 0000000..1bc172e --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/OfflineHandleEventVO.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 下线处理事件VO + * + * @author YXF + * @date 2021-01-15 17:46:26 + */ +public class OfflineHandleEventVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "事件id") + private Long eventId; + + @Schema(description = "1 商品 2 店铺 3满减 4.优惠券 5.团购 6.分销 7.秒杀 9.自提点") + private Integer handleType; + + @Schema(description = "处理id,如果是商品就是商品id,店铺就是店铺id") + private Long handleId; + + @Schema(description = "关联店铺id") + private Long shopId; + + @Schema(description = "处理人id") + private Long handlerId; + + @Schema(description = "处理人") + private String handler; + + @Schema(description = "处理状态 1平台进行下线 2 重新申请,等待审核 3.审核通过 4 审核未通过") + private Integer status; + + @Schema(description = "下线原因") + private String offlineReason; + + @Schema(description = "下线原因") + private List offlineHandleEventItemList; + + + public Long getEventId() { + return eventId; + } + + public void setEventId(Long eventId) { + this.eventId = eventId; + } + + public Integer getHandleType() { + return handleType; + } + + public void setHandleType(Integer handleType) { + this.handleType = handleType; + } + + public Long getHandleId() { + return handleId; + } + + public void setHandleId(Long handleId) { + this.handleId = handleId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getHandlerId() { + return handlerId; + } + + public void setHandlerId(Long handlerId) { + this.handlerId = handlerId; + } + + public String getHandler() { + return handler; + } + + public void setHandler(String handler) { + this.handler = handler; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getOfflineReason() { + return offlineReason; + } + + public void setOfflineReason(String offlineReason) { + this.offlineReason = offlineReason; + } + + public List getOfflineHandleEventItemList() { + return offlineHandleEventItemList; + } + + public void setOfflineHandleEventItemList(List offlineHandleEventItemList) { + this.offlineHandleEventItemList = offlineHandleEventItemList; + } + + @Override + public String toString() { + return "OfflineHandleEventVO{" + + "eventId=" + eventId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",handleType=" + handleType + + ",handleId=" + handleId + + ",shopId=" + shopId + + ",handlerId=" + handlerId + + ",status=" + status + + ",offlineReason=" + offlineReason + + ",handler=" + handler + + ",offlineHandleEventItemList=" + offlineHandleEventItemList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreCategoryConfigVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreCategoryConfigVO.java new file mode 100644 index 0000000..7dbe19c --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreCategoryConfigVO.java @@ -0,0 +1,83 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 积分分类关联信息 + * @author lhd + */ +public class ScoreCategoryConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 分类名称 + */ + private String categoryName; + + /** + * 使用上限比例 + */ + private Double useScoreLimit; + /** + * 获取上限比例 + */ + private Double getScoreLimit; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public Double getUseScoreLimit() { + return useScoreLimit; + } + + public void setUseScoreLimit(Double useScoreLimit) { + this.useScoreLimit = useScoreLimit; + } + + public Double getGetScoreLimit() { + return getScoreLimit; + } + + public void setGetScoreLimit(Double getScoreLimit) { + this.getScoreLimit = getScoreLimit; + } + + @Override + public String toString() { + return "ScoreCategoryConfigVO{" + + "categoryId=" + categoryId + + ", categoryName='" + categoryName + '\'' + + ", useScoreLimit=" + useScoreLimit + + ", getScoreLimit=" + getScoreLimit + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreConfigApiVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreConfigApiVO.java new file mode 100644 index 0000000..eff7414 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreConfigApiVO.java @@ -0,0 +1,182 @@ + + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 积分配置信息 + * @author lhd + */ +public class ScoreConfigApiVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 参数名 + */ + private String paramKey; + /** + * 参数值 + */ + private String paramValue; + + /** + * 签到获取积分 + */ + private String signInScoreString; + + /** + * 签到获取积分 + */ + private List signInScore; + + /** + * 注册获取积分 + */ + private Long registerScore; + + /** + * 购物开关 + */ + private Boolean shoppingScoreSwitch; + + /** + * 购物获取积分(x元获取1积分) + */ + private Long shoppingGetScore; + + /** + * 购物使用积分抵现(x积分抵扣1元) + */ + private Long shoppingUseScoreRatio; + + /** + * 平台使用积分分类上限比例 + */ + private Double useDiscount; + /** + * 购物积分分类获取上限比例 + */ + private Double getDiscount; + + public Double getUseDiscount() { + return useDiscount; + } + + public void setUseDiscount(Double useDiscount) { + this.useDiscount = useDiscount; + } + + public Double getGetDiscount() { + return getDiscount; + } + + public void setGetDiscount(Double getDiscount) { + this.getDiscount = getDiscount; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getSignInScoreString() { + return signInScoreString; + } + + public void setSignInScoreString(String signInScoreString) { + this.signInScoreString = signInScoreString; + } + + public List getSignInScore() { + return signInScore; + } + + public void setSignInScore(List signInScore) { + this.signInScore = signInScore; + } + + public Long getRegisterScore() { + return registerScore; + } + + public void setRegisterScore(Long registerScore) { + this.registerScore = registerScore; + } + + public Boolean getShoppingScoreSwitch() { + return shoppingScoreSwitch; + } + + public void setShoppingScoreSwitch(Boolean shoppingScoreSwitch) { + this.shoppingScoreSwitch = shoppingScoreSwitch; + } + + public Long getShoppingGetScore() { + return shoppingGetScore; + } + + public void setShoppingGetScore(Long shoppingGetScore) { + this.shoppingGetScore = shoppingGetScore; + } + + public Long getShoppingUseScoreRatio() { + return shoppingUseScoreRatio; + } + + public void setShoppingUseScoreRatio(Long shoppingUseScoreRatio) { + this.shoppingUseScoreRatio = shoppingUseScoreRatio; + } + + @Override + public String toString() { + return "ScoreConfigVO{" + + "id=" + id + + ", paramKey='" + paramKey + '\'' + + ", paramValue='" + paramValue + '\'' + + ", signInScoreString='" + signInScoreString + '\'' + + ", signInScore=" + signInScore + + ", registerScore=" + registerScore + + ", shoppingScoreSwitch=" + shoppingScoreSwitch + + ", shoppingGetScore=" + shoppingGetScore + + ", shoppingUseScoreRatio=" + shoppingUseScoreRatio + + ", useDiscount=" + useDiscount + + ", getDiscount=" + getDiscount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreExpireConfigVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreExpireConfigVO.java new file mode 100644 index 0000000..169d40c --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/ScoreExpireConfigVO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author Pineapple + * @date 2021/5/20 14:37 + */ +public class ScoreExpireConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 过期年限 + */ + private Integer expireYear; + + /** + * 积分过期开关 + */ + private Boolean scoreExpireSwitch; + + public Integer getExpireYear() { + return expireYear; + } + + public void setExpireYear(Integer expireYear) { + this.expireYear = expireYear; + } + + public Boolean getScoreExpireSwitch() { + return scoreExpireSwitch; + } + + public void setScoreExpireSwitch(Boolean scoreExpireSwitch) { + this.scoreExpireSwitch = scoreExpireSwitch; + } + + @Override + public String toString() { + return "ScoreExpireConfigVO{" + + "expireYear=" + expireYear + + ", scoreExpireSwitch=" + scoreExpireSwitch + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysAccessKeyVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysAccessKeyVO.java new file mode 100644 index 0000000..2327797 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysAccessKeyVO.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Set; + +/** + * 系统密钥VO + * @author TRACK + */ +public class SysAccessKeyVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long sysAccessKeyId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "账号id") + private String accessId; + + @Schema(description = "密钥") + private String accessKey; + + @Schema(description = "系统类型 0.c端用户 1.商家端 2.平台端" ) + private Integer sysType; + + @Schema(description = "密钥权限类型 0.全部权限 1.指定权限" ) + private Integer premType; + + @Schema(description = "密钥可用店铺id,如果为0则为所有店铺" ) + private Long usabilityShopId; + + @Schema(description = "菜单id列表" ) + private List menuIdList; + + @Schema(description = "授权" ) + private List prems; + + @Schema(description = "菜单资源id") + private List menuPermissionId; + + public List getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(List menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + public Integer getPremType() { + return premType; + } + + public void setPremType(Integer premType) { + this.premType = premType; + } + + public Long getUsabilityShopId() { + return usabilityShopId; + } + + public void setUsabilityShopId(Long usabilityShopId) { + this.usabilityShopId = usabilityShopId; + } + + public List getMenuIdList() { + return menuIdList; + } + + public void setMenuIdList(List menuIdList) { + this.menuIdList = menuIdList; + } + + public List getPrems() { + return prems; + } + + public void setPrems(List prems) { + this.prems = prems; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getSysAccessKeyId() { + return sysAccessKeyId; + } + + public void setSysAccessKeyId(Long sysAccessKeyId) { + this.sysAccessKeyId = sysAccessKeyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getAccessId() { + return accessId; + } + + public void setAccessId(String accessId) { + this.accessId = accessId; + } + + public String getAccessKey() { + return accessKey; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + @Override + public String toString() { + return "SysAccessKeyVO{" + + "sysAccessKeyId=" + sysAccessKeyId + + ", name='" + name + '\'' + + ", remark='" + remark + '\'' + + ", accessId='" + accessId + '\'' + + ", accessKey='" + accessKey + '\'' + + ", sysType=" + sysType + + ", premType=" + premType + + ", usabilityShopId=" + usabilityShopId + + ", menuIdList=" + menuIdList + + ", prems=" + prems + + ", menuPermissionId=" + menuPermissionId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysConfigApiVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysConfigApiVO.java new file mode 100644 index 0000000..a768b5a --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/SysConfigApiVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 系统配置信息表VO + * + * @author lhd + * @date 2021-04-20 16:27:57 + */ +public class SysConfigApiVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long id; + + @Schema(description = "key") + private String paramKey; + + @Schema(description = "value") + private String paramValue; + + @Schema(description = "备注") + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getParamKey() { + return paramKey; + } + + public void setParamKey(String paramKey) { + this.paramKey = paramKey; + } + + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SysConfigApiVO{" + + "id=" + id + + ",paramKey=" + paramKey + + ",paramValue=" + paramValue + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/UriPermissionVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/UriPermissionVO.java new file mode 100644 index 0000000..3434b7b --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/platform/vo/UriPermissionVO.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.platform.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2024/1/5 16:30 + */ +public class UriPermissionVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 请求方法 1.GET 2.POST 3.PUT 4.DELETE + */ + private Integer method; + + /** + * uri + */ + private String uri; + + /** + * permission + */ + private String permission; + + /** + * 用户拥有该权限 + */ + private Boolean hasPermission; + + public Integer getMethod() { + return method; + } + + public void setMethod(Integer method) { + this.method = method; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public Boolean getHasPermission() { + return hasPermission; + } + + public void setHasPermission(Boolean hasPermission) { + this.hasPermission = hasPermission; + } + + @Override + public String toString() { + return "UriPermissionBO{" + + "method=" + method + + ", uri='" + uri + '\'' + + ", permission='" + permission + '\'' + + ", hasPermission=" + hasPermission + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/OrderChangeSupplierWalletAmountBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/OrderChangeSupplierWalletAmountBO.java new file mode 100644 index 0000000..35a0cee --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/OrderChangeSupplierWalletAmountBO.java @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2021/3/9 + */ +public class OrderChangeSupplierWalletAmountBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单状态 + */ + private Integer orderStatus; + + /** + * 订单id + */ + private Long orderId; + + /** + * 订单项id + */ + private Long orderItemId; + + /** + * 退款单id + */ + private Long refundId; + + /** + * 店铺id + */ + private Long supplierId; + + /** + * 订单 or 订单项 实际支付金额 + */ + private Long actualTotal; + + /** + * 申请退款金额 + */ + private Long refundAmount; + + /** + * 平台补贴金额 + */ + private Long platformAllowanceAmount; + + /** + * 平台抽成 + */ + private Long platformCommission; + + /** + * 平台抽成变化金额 + */ + private Long changePlatformCommission; + + /** + * 平台抽成比例 + */ + private Double rate; + + /** + * 分销金额 + */ + private Long distributionAmount; + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformAllowanceAmount() { + return platformAllowanceAmount; + } + + public void setPlatformAllowanceAmount(Long platformAllowanceAmount) { + this.platformAllowanceAmount = platformAllowanceAmount; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getChangePlatformCommission() { + return changePlatformCommission; + } + + public void setChangePlatformCommission(Long changePlatformCommission) { + this.changePlatformCommission = changePlatformCommission; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + @Override + public String toString() { + return "OrderChangeSupplierWalletAmountBO{" + + "orderStatus=" + orderStatus + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundId=" + refundId + + ", supplierId=" + supplierId + + ", actualTotal=" + actualTotal + + ", refundAmount=" + refundAmount + + ", platformAllowanceAmount=" + platformAllowanceAmount + + ", platformCommission=" + platformCommission + + ", changePlatformCommission=" + changePlatformCommission + + ", rate=" + rate + + ", distributionAmount=" + distributionAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierDetailBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierDetailBO.java new file mode 100644 index 0000000..56e88bf --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierDetailBO.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.bo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 供应商店铺详情VO + * + * @author FrozenWatermelon + * @date 2020-11-23 16:24:29 + */ +public class SupplierDetailBO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "供应商店铺名称") + private String supplierShopName; + + @Schema(description = "供应商店铺logo") + private String supplierLogo; + + @Schema(description = "供应商店铺状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:待审核 4:供应商店铺申请中 5:申请失败)") + private Integer supplierStatus; + + @Schema(description = "接收短信号码") + private String noticeMobile; + + @Schema(description = "联系电话") + private String contactPhone; + + @Schema(description = "供应商店铺商品总销量") + private Integer saleNum; + + @Schema(description = "用户总收藏量") + private Integer collectionNum; + + @Schema(description = "签约起始时间") + private Date contractStartTime; + + @Schema(description = "签约终止时间") + private Date contractEndTime; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "联系人姓名") + private String contactName; + + public String getContactName() { + return contactName; + } + + public void setContactName(String contactName) { + this.contactName = contactName; + } + + public String getSupplierShopName() { + return supplierShopName; + } + + public void setSupplierShopName(String supplierShopName) { + this.supplierShopName = supplierShopName; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Date getContractStartTime() { + return contractStartTime; + } + + public void setContractStartTime(Date contractStartTime) { + this.contractStartTime = contractStartTime; + } + + public Date getContractEndTime() { + return contractEndTime; + } + + public void setContractEndTime(Date contractEndTime) { + this.contractEndTime = contractEndTime; + } + + public String getNoticeMobile() { + return noticeMobile; + } + + public void setNoticeMobile(String noticeMobile) { + this.noticeMobile = noticeMobile; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getSupplierLogo() { + return supplierLogo; + } + + public void setSupplierLogo(String supplierLogo) { + this.supplierLogo = supplierLogo; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getCollectionNum() { + return collectionNum; + } + + public void setCollectionNum(Integer collectionNum) { + this.collectionNum = collectionNum; + } + + @Override + public String toString() { + return "SupplierDetailBO{" + + "supplierId=" + supplierId + + ", type=" + type + + ", supplierShopName='" + supplierShopName + '\'' + + ", supplierLogo='" + supplierLogo + '\'' + + ", supplierStatus=" + supplierStatus + + ", noticeMobile='" + noticeMobile + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", saleNum=" + saleNum + + ", collectionNum=" + collectionNum + + ", contractStartTime=" + contractStartTime + + ", contractEndTime=" + contractEndTime + + ", supplierName='" + supplierName + '\'' + + ", contactName=" + contactName + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierSimpleBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierSimpleBO.java new file mode 100644 index 0000000..e2f6fc4 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierSimpleBO.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/8/11 10:05 + */ +public class SupplierSimpleBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "supplierId") + private Long supplierId; + + @Schema(description = "供应商店铺id列表") + private List supplierIds; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商店铺名称") + private String supplierShopName; + + @Schema(description = "供应商状态") + private Integer supplierStatus; + + @Schema(description = "供应商店铺类型") + private Integer type; + + @Schema(description = "排序: 1.supplierId 正序 2.supplierId 倒序") + private Integer seq; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public String getSupplierShopName() { + return supplierShopName; + } + + public void setSupplierShopName(String supplierShopName) { + this.supplierShopName = supplierShopName; + } + + @Override + public String toString() { + return "SupplierSimpleBO{" + + "supplierId=" + supplierId + + ", supplierIds=" + supplierIds + + ", supplierName='" + supplierName + '\'' + + ", supplierShopName='" + supplierShopName + '\'' + + ", supplierStatus=" + supplierStatus + + ", type=" + type + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierWalletBO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierWalletBO.java new file mode 100644 index 0000000..6859560 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/bo/SupplierWalletBO.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家钱包信息BO + * @author cl + * @date 2021-08-19 11:04:45 + */ +public class SupplierWalletBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺钱包id") + private Long supplierWalletId; + + @Schema(description = "店铺id") + private Long supplierId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "未结算金额(用户支付)") + private Long unsettledAmount; + + @Schema(description = "已结算金额(用户确认收货后,可以提现)") + private Long settledAmount; + + @Schema(description = "冻结金额(用户确认收货)") + private Long freezeAmount; + + @Schema(description = "累积结算金额") + private Long totalSettledAmount; + + public Long getSupplierWalletId() { + return supplierWalletId; + } + + public void setSupplierWalletId(Long supplierWalletId) { + this.supplierWalletId = supplierWalletId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getFreezeAmount() { + return freezeAmount; + } + + public void setFreezeAmount(Long freezeAmount) { + this.freezeAmount = freezeAmount; + } + + public Long getTotalSettledAmount() { + return totalSettledAmount; + } + + public void setTotalSettledAmount(Long totalSettledAmount) { + this.totalSettledAmount = totalSettledAmount; + } + + @Override + public String toString() { + return "SupplierWalletBO{" + + "supplierWalletId=" + supplierWalletId + + ", supplierId=" + supplierId + + ", orderId=" + orderId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", freezeAmount=" + freezeAmount + + ", totalSettledAmount=" + totalSettledAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierBankCardFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierBankCardFeignClient.java new file mode 100644 index 0000000..9e845ea --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierBankCardFeignClient.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.feign; + +import com.tmerclub.cloud.api.supplier.vo.SupplierBankCardVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author track + */ +public interface SupplierBankCardFeignClient { + + /** + * 保存银行卡至数据库 + * + * @param tenantId + * @param supplierBankCardVO + */ + void saveBandCardByAllinpay(String tenantId, SupplierBankCardVO supplierBankCardVO); + + /** + * 解绑法人卡 + * @param supplierBankCardId + * @return + */ + ServerResponseEntity deleteLegalBankCard(Long supplierBankCardId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierDetailFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierDetailFeignClient.java new file mode 100644 index 0000000..b0cbf02 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierDetailFeignClient.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.feign; + +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface SupplierDetailFeignClient { + + /** + * 根据供应商id获取供应商店铺信息 + * @param supplierId 供应商id + * @return 供应商店铺信息 + */ + ServerResponseEntity getSupplierBySupplierId(Long supplierId); + + /** + * 根据供应商id列表, 获取供应商店铺列表信息 + * @param supplierIds 供应商id列表 + * @return 供应商店铺列表信息 + */ + ServerResponseEntity> listBySupplierIds(List supplierIds); + + + /** + * 获取工厂店铺信息及扩展信息 + * @param supplierName 工厂店铺名称 + * @return 工厂店铺信息列表 + */ + ServerResponseEntity> getSupplierDetailBySupplierName(String supplierName); + + /** + * 获取指定供应商信息 + * @param supplierIds + * @return + */ + ServerResponseEntity> listSupplierDetailBySupplierIds(List supplierIds); + + /** + * 根据店铺Id查询相关的供应商列表 + * + * @param shopId + * @param supplierName + * @return + */ + ServerResponseEntity> listSupplierIdByShopIdAndSupplierName(Long shopId, String supplierName); + /** + * 删除通联支付的缓存 + */ + void deleteAllinpayCache(); + + /** + * 更改通联供应商影印件状态 + * @param bizUserId + * @param status + * @return + */ + ServerResponseEntity updateAllinpayIdCardStatus(String bizUserId, + Integer status); + + /** + * 更改通联供应商绑定手机号码状态 + * @param bizUserId + * @param status + * @return + */ + ServerResponseEntity updateAllinpayBindPhoneStatus(String bizUserId, + Integer status); + + /** + * 更新企业信息回调 + * @param bizUserId + * @param status + * @param result + * @param failReason + * @return + */ + ServerResponseEntity updateCompanyInfoResult(String bizUserId, + Integer status, + Integer result, + String failReason); + + /** + * 保存编号 + * @param supplierId + * @param signAcctType + * @param acctProtocolNo + * @return + */ + ServerResponseEntity updateAcctProtocolNoByType(Long supplierId, Integer signAcctType, String acctProtocolNo); + + /** + * 获取未删除的供应商id + * @return + */ + ServerResponseEntity> listSupplierIds(); + +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierRefundAddrFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierRefundAddrFeignClient.java new file mode 100644 index 0000000..c322384 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierRefundAddrFeignClient.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.feign; + +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/03/09 + */ +public interface SupplierRefundAddrFeignClient { + + + /** + * 获取店铺退货地址 + * @param refundAddrId 店铺id + * @return 店铺退货地址 + */ + ServerResponseEntity getSupplierRefundAddrByRefundAddrId(Long refundAddrId); + + /** + * 获取供应商地址列表 + * @param supplierId + * @return + */ + ServerResponseEntity> getBySupplierId(Long supplierId); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWalletLogOperationFeignClient.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWalletLogOperationFeignClient.java new file mode 100644 index 0000000..c4e6422 --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/feign/SupplierWalletLogOperationFeignClient.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.feign; + + +/** + * @author chiley + * @date 2022/6/30 16:42 + */ +public interface SupplierWalletLogOperationFeignClient { + + /** + * 删除供应商钱包日志 + * + * @param toJsonString + */ + void deleteSupplierLog(String toJsonString); +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiUserVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiUserVO.java new file mode 100644 index 0000000..2ac0e2f --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierApiUserVO.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/2 + */ +public class SupplierApiUserVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * supplierUserId + */ + @Schema(description = "店铺用户id") + private Long supplierUserId; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "员工编号") + private String code; + + @Schema(description = "联系方式") + private String phoneNum; + + @Schema(description = "是否已经有账号了") + private Integer hasAccount; + + @Schema(description = "店铺id") + private Long supplierId; + + @Schema(description = "角色id列表") + private List roleIds; + + @Schema(description = "账号") + private String username; + + @Schema(description = "密码") + private String password; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + @Schema(description = "状态 1启用 0禁用") + private Integer status; + + /** + * 是否是管理员 + */ + @Schema(description = "是否是管理员") + private Integer isAdmin; + + public Long getSupplierUserId() { + return supplierUserId; + } + + public void setSupplierUserId(Long supplierUserId) { + this.supplierUserId = supplierUserId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public Integer getHasAccount() { + return hasAccount; + } + + public void setHasAccount(Integer hasAccount) { + this.hasAccount = hasAccount; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + @Override + public String toString() { + return "SupplierUserVO{" + + "supplierUserId=" + supplierUserId + + ", nickName='" + nickName + '\'' + + ", code='" + code + '\'' + + ", phoneNum='" + phoneNum + '\'' + + ", hasAccount=" + hasAccount + + ", supplierId=" + supplierId + + ", roleIds=" + roleIds + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", status=" + status + + ", isAdmin=" + isAdmin + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierBankCardVO.java b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierBankCardVO.java new file mode 100644 index 0000000..420c5ad --- /dev/null +++ b/tmerclub-api/tmerclub-api-admin/src/main/java/com/tmerclub/cloud/api/supplier/vo/SupplierBankCardVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.supplier.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 银行卡信息VO + * + * @author lhd + * @date 2022-03-14 17:04:32 + */ +public class SupplierBankCardVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行卡自增id") + private Long supplierBankCardId; + + @Schema(description = "供应商ID") + private Long supplierId; + + @Schema(description = "银行名称") + private String bankName; + + @Schema(description = "银行开户行") + private String openingBank; + + @Schema(description = "收款方户名") + private String recipientName; + + @Schema(description = "收款方账户") + private String cardNo; + + @Schema(description = "是否默认 1:默认 0:非默认") + private Integer isDefault; + + @Schema(description = "支行名称") + private String branchName; + + @Schema(description = "1.正常,-1.已删除") + private Integer status; + + @Schema(description = "银行卡/账户属性 0个人银行卡 1企业对公账户") + private Integer bankCardPro; + + @Schema(description = "支付行号") + private String unionBank; + + @Schema(description = "卡号") + private String bankCardNo; + + public Long getSupplierBankCardId() { + return supplierBankCardId; + } + + public void setSupplierBankCardId(Long supplierBankCardId) { + this.supplierBankCardId = supplierBankCardId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getOpeningBank() { + return openingBank; + } + + public void setOpeningBank(String openingBank) { + this.openingBank = openingBank; + } + + public String getRecipientName() { + return recipientName; + } + + public void setRecipientName(String recipientName) { + this.recipientName = recipientName; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getBranchName() { + return branchName; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + @Override + public String toString() { + return "SupplierBankCardVO{" + + "supplierBankCardId=" + supplierBankCardId + + ", supplierId=" + supplierId + + ", bankName='" + bankName + '\'' + + ", openingBank='" + openingBank + '\'' + + ", recipientName='" + recipientName + '\'' + + ", cardNo='" + cardNo + '\'' + + ", isDefault=" + isDefault + + ", branchName='" + branchName + '\'' + + ", status=" + status + + ", bankCardPro=" + bankCardPro + + ", unionBank='" + unionBank + '\'' + + ", bankCardNo='" + bankCardNo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/UserRegisterNotifyBO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/UserRegisterNotifyBO.java new file mode 100644 index 0000000..1590dd2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/bo/UserRegisterNotifyBO.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.bo; + +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.dto.UserRegisterDTO; +import com.tmerclub.cloud.api.auth.dto.UserRegisterExtensionDTO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户批量用户注册 + * @author cl + * @date 2021-05-14 14:22:14 + */ +public class UserRegisterNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 账户信息 + */ + private List accountDTOList; + /** + * 用户信息 + */ + private List userRegisterList; + /** + * 用户注册信息 + */ + private List userRegisterExtensionDTOList; + + public UserRegisterNotifyBO() { + + } + + public UserRegisterNotifyBO(List userRegisterList, List userRegisterExtensionDTOList) { + this.userRegisterList = userRegisterList; + this.userRegisterExtensionDTOList = userRegisterExtensionDTOList; + } + + public UserRegisterNotifyBO(List accountDTOList, List userRegisterList, List userRegisterExtensionDTOList) { + this.accountDTOList = accountDTOList; + this.userRegisterList = userRegisterList; + this.userRegisterExtensionDTOList = userRegisterExtensionDTOList; + } + + public List getAccountDTOList() { + return accountDTOList; + } + + public void setAccountDTOList(List accountDTOList) { + this.accountDTOList = accountDTOList; + } + + public List getUserRegisterList() { + return userRegisterList; + } + + public void setUserRegisterList(List userRegisterList) { + this.userRegisterList = userRegisterList; + } + + public List getUserRegisterExtensionDTOList() { + return userRegisterExtensionDTOList; + } + + public void setUserRegisterExtensionDTOList(List userRegisterExtensionDTOList) { + this.userRegisterExtensionDTOList = userRegisterExtensionDTOList; + } + + @Override + public String toString() { + return "UserRegisterNotifyBO{" + + "accountDTOList=" + accountDTOList + + ", userRegisterList=" + userRegisterList + + ", userRegisterExtensionDTOList=" + userRegisterExtensionDTOList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/LoginType.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/LoginType.java new file mode 100644 index 0000000..60ea8fe --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/LoginType.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.constant; + +/** + * 登录方式 + * @author FrozenWatermelon + * @date 2021/01/19 + */ +public enum LoginType { + + /** + * 账号密码 + */ + PASSWORD(1), + + /** + * 验证码 + */ + CODE(2), + + /** + * 小程序一键登录 + */ + ONE_CLICK_LOGIN(3); + + private final Integer value; + + public Integer value() { + return value; + } + + LoginType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/SocialType.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/SocialType.java new file mode 100644 index 0000000..05d12bf --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/SocialType.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.constant; + +/** + * 第三方系统类型 + * @author FrozenWatermelon + * @date 2021/01/16 + */ +public enum SocialType { + + /** + * 小程序 + */ + MA(1), + + /** + * 公众号 + */ + MP(2), + + ; + + private final Integer value; + + public Integer value() { + return value; + } + + SocialType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/VerifyType.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/VerifyType.java new file mode 100644 index 0000000..a139377 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/constant/VerifyType.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.constant; + +/** + * 注册校验方式 + * @author FrozenWatermelon + * @date 2021/01/19 + */ +public enum VerifyType { + + /** + * 手机号 + */ + MOBILE(1), + + /** + * 邮箱 + */ + EMAIL(2), + + ; + + private final Integer value; + + public Integer value() { + return value; + } + + VerifyType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountUserDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountUserDTO.java new file mode 100644 index 0000000..be72f05 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountUserDTO.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author cl + * @date 2021-05-14 18:04:05 + */ +public class AuthAccountUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private List accountDTOList; + + private List userRegisterList; + + private List userRegisterExtensionDTOList; + + public List getAccountDTOList() { + return accountDTOList; + } + + public void setAccountDTOList(List accountDTOList) { + this.accountDTOList = accountDTOList; + } + + public List getUserRegisterList() { + return userRegisterList; + } + + public void setUserRegisterList(List userRegisterList) { + this.userRegisterList = userRegisterList; + } + + public List getUserRegisterExtensionDTOList() { + return userRegisterExtensionDTOList; + } + + public void setUserRegisterExtensionDTOList(List userRegisterExtensionDTOList) { + this.userRegisterExtensionDTOList = userRegisterExtensionDTOList; + } + + @Override + public String toString() { + return "AuthAccountUserDTO{" + + "accountDTOList=" + accountDTOList + + ", userRegisterList=" + userRegisterList + + ", userRegisterExtensionDTOList=" + userRegisterExtensionDTOList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountWithSocialDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountWithSocialDTO.java new file mode 100644 index 0000000..02664fb --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthAccountWithSocialDTO.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2021/1/19 + */ +public class AuthAccountWithSocialDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private AuthAccountDTO authAccount; + + private String tempUid; + + public AuthAccountDTO getAuthAccount() { + return authAccount; + } + + public void setAuthAccount(AuthAccountDTO authAccount) { + this.authAccount = authAccount; + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + @Override + public String toString() { + return "AuthAccountWithSocialDTO{" + + "authAccount=" + authAccount + + ", tempUid='" + tempUid + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthSocialDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthSocialDTO.java new file mode 100644 index 0000000..b40f599 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/AuthSocialDTO.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户社交登陆信息 + * + * @author lhd + * @date 2020/01/05 + */ +public class AuthSocialDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 本系统uid + */ + private Long uid; + + /** + * 第三方系统类型 1小程序 2 公众号 + */ + @NotNull(message = "socialType not null") + private Integer socialType; + + /** + * 第三方系统昵称 + */ + private String nickName; + + /** + * 第三方系统头像 + */ + private String imageUrl; + + /** + * 第三方系统userid + */ + private String bizUserId; + + /** + * 第三方系统unionid + */ + private String bizUnionid; + + /** + * 有些时候第三方系统授权之后,会有个临时的key,比如小程序的session_key + */ + private String bizTempSession; + + /** + * 当账户未绑定时,临时的uid + */ + private String tempUid; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Integer getSocialType() { + return socialType; + } + + public void setSocialType(Integer socialType) { + this.socialType = socialType; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizUnionid() { + return bizUnionid; + } + + public void setBizUnionid(String bizUnionid) { + this.bizUnionid = bizUnionid; + } + + public String getBizTempSession() { + return bizTempSession; + } + + public void setBizTempSession(String bizTempSession) { + this.bizTempSession = bizTempSession; + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + @Override + public String toString() { + return "AuthSocialDTO{" + + "id=" + id + + ", uid=" + uid + + ", socialType=" + socialType + + ", nickName='" + nickName + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", bizUnionid='" + bizUnionid + '\'' + + ", bizTempSession='" + bizTempSession + '\'' + + ", tempUid='" + tempUid + '\'' + + '}'; + } + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/ThirdApiAbutmentUserDto.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/ThirdApiAbutmentUserDto.java new file mode 100644 index 0000000..491c35c --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/ThirdApiAbutmentUserDto.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serializable; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2023/12/18 15:07 + */ +public class ThirdApiAbutmentUserDto implements Serializable { + + @Schema(description = "通信的用户唯一ID,可以随机uuid (建议自己服务端的用户唯一uid)") + private Long userId; + + @Schema(description = "用户昵称,商城有些通知会需要用到") + private String nickName; + + @Schema(description = "校验的token,随机uuid(建议使用自己服务端的用户的token)") + private String accessToken; + + @Schema(description = "token在多少秒后过期") + private Long expiresIn; + + @Schema(description = "openId,如果当前是在小程序上,则传小程序的openid。如果是在微信浏览器上开打,则传公众号openid") + private String openId; + + @Schema(description = "socialType, 1小程序登录,2公众号登录,0 其他 ") + private Integer socialType; + + @Schema(description = "本商城系统uid") + private Long uid; + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public Long getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Long expiresIn) { + this.expiresIn = expiresIn; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public Integer getSocialType() { + return socialType; + } + + public void setSocialType(Integer socialType) { + this.socialType = socialType; + } + + @Override + public String toString() { + return "ThirdApiAbutmentUserDto{" + + "userId='" + userId + '\'' + + ", nickName='" + nickName + '\'' + + ", accessToken='" + accessToken + '\'' + + ", expiresIn=" + expiresIn + + ", openId='" + openId + '\'' + + ", socialType=" + socialType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/UserRegisterDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/UserRegisterDTO.java new file mode 100644 index 0000000..fff35eb --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/dto/UserRegisterDTO.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.dto; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 用户注册信息vo + * @author cl + * @date 2021-05-13 14:40:43 + */ +public class UserRegisterDTO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "ID") + private Long userId; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "M(男) or F(女)") + private String sex; + + @Schema(description = "例如:2009-11-27") + private String birthDate; + + @Schema(description = "头像图片路径") + private String pic; + + @Schema(description = "状态 1 正常 0 无效") + private Integer status; + + @Schema(description = "会员等级(冗余字段)") + private Integer level; + + @Schema(description = "vip结束时间") + private Date vipEndTime; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "手机号(冗余)") + private String phone; + + @Schema(description = "付费会员等级") + private Integer vipLevel; + + /** + * openId list + */ + private List bizUserIdList; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public List getBizUserIdList() { + return bizUserIdList; + } + + public void setBizUserIdList(List bizUserIdList) { + this.bizUserIdList = bizUserIdList; + } + + public Integer getVipLevel() { + return vipLevel; + } + + public void setVipLevel(Integer vipLevel) { + this.vipLevel = vipLevel; + } + + @Override + public String toString() { + return "UserRegisterDTO{" + + "userId=" + userId + + ", nickName='" + nickName + '\'' + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", pic='" + pic + '\'' + + ", status=" + status + + ", level=" + level + + ", vipEndTime=" + vipEndTime + + ", levelType=" + levelType + + ", phone='" + phone + '\'' + + ", vipLevel=" + vipLevel + + ", bizUserIdList=" + bizUserIdList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/AccountFeignClient.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/AccountFeignClient.java new file mode 100644 index 0000000..cc22944 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/AccountFeignClient.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.feign; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.dto.AuthAccountUserDTO; +import com.tmerclub.cloud.api.auth.dto.AuthAccountWithSocialDTO; +import com.tmerclub.cloud.api.auth.dto.AuthSocialDTO; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +public interface AccountFeignClient { + + /** + * 保存统一账户 + * @param authAccountDTO 账户信息 + * @return Long uid + */ + ServerResponseEntity save(AuthAccountDTO authAccountDTO); + + /** + * 更新统一账户 + * @param authAccountDTO 账户信息 + * @return void + */ + ServerResponseEntity update(AuthAccountDTO authAccountDTO); + + /** + * 更新账户状态 + * @param authAccountDTO 账户信息 + * @return void + */ + ServerResponseEntity updateAuthAccountStatus(AuthAccountDTO authAccountDTO); + + /** + * 根据用户id和系统类型删除用户 + * @param userId 用户id + * @return void + */ + ServerResponseEntity deleteByUserIdAndSysType(Long userId); + + /** + * 删除账号(通过租户id和系统类型) + * @param tenantId 租户id + * @param sysType 系统类型 + */ + void deleteByTenantIdAndSysType(Long tenantId, Integer sysType); + + /** + * 根据手机号获取存在用户的数量 + * @param mobile 手机号 + * @return 数量 + */ + ServerResponseEntity countByMobile(String mobile); + + + /** + * 根据用户id和系统类型获取用户信息 + * @param userId 用户id + * @param sysType 系统类型 + * @return void + */ + ServerResponseEntity getByUserIdAndSysType(Long userId, Integer sysType); + + /** + * 根据用户id和系统类型获取用户信息 + * @param userId 用户id + * @param sysType 系统类型 + * @return void + */ + ServerResponseEntity getInsiderDataByUserIdAndSysType(Long userId, Integer sysType); + + /** + * 根据用户id和系统类型获取用户信息 + * @param sysType 系统类型 + * @param isAdmin 是否管理员 + * @param tenantId 租户id + * @return void + */ + ServerResponseEntity getBySysTypeAndIsAdminAndTenantId(Integer sysType, Integer isAdmin, Long tenantId); + + /** + * 保存统一账户 + * @param authAccountWithSocialDTO 账户信息 和社交账号信息 + * @return uid + */ + ServerResponseEntity saveAccountWithSocial(AuthAccountWithSocialDTO authAccountWithSocialDTO); + + /** + * 保存用户信息,生成token,返回前端 + * @param uidInfoBO 账户信息 和社交账号信息 + * @return uid + */ + ServerResponseEntity storeTokenAndGetVo(UidInfoBO uidInfoBO); + + /** + * 根据账号信息(账号名、手机号、邮箱),获取对应的用户列表 + * @param userName + * @param phone + * @param email + * @param sysType + * @return 用户账号信息列表 + */ + ServerResponseEntity> listByUserAccount(String userName, String phone + , String email, SysTypeEnum sysType); + + /** + * 根据用户id及系统id修改用户手机号 + * @param authAccountDTO 用户信息 + * @return void + */ + ServerResponseEntity updateUserMobile(AuthAccountDTO authAccountDTO); + + /** + * 根据用户id和系统类型,获取账号列表信息 + * @param userIds + * @param systemType + * @return + */ + ServerResponseEntity> listUserByUserIdsAndType(List userIds, Integer systemType); + + /** + * 根据用户ids,或者电话号码,系统类型获取用户列表 + * @param userIds + * @param phone + * @param sysType + * @return + */ + ServerResponseEntity> listByUserIdsAndPhoneAndType(List userIds, + String phone, + Integer sysType); + + /** + * userId,系统类型获取用户信息 + * @param userId + * @param sysType + * @return + */ + ServerResponseEntity getByUserIdAndType(Long userId, + Integer sysType); + + + /** + * 根据用户id与用户类型更新用户信息 + * @param uidInfoBO 新的用户信息 + * @param userId 用户id + * @param sysType 用户类型 + * @return + */ + ServerResponseEntity updateUserInfoByUserIdAndSysType(UidInfoBO uidInfoBO, Long userId, Integer sysType); + + /** + * 根据手机号和用户类型获取存在用户的数量 + * @param mobile 手机号 + * @param sysType 用户类型 + * @return 数量 + */ + ServerResponseEntity countByMobileAndSysType(String mobile, Integer sysType); + + /** + * 修改用户状态,删除用户登录token信息,使用户下线 + * @param authAccountDTO 账户信息 + * @return void + */ + ServerResponseEntity updateAuthAccountStatusAndDeleteUserToken(AuthAccountDTO authAccountDTO); + + /** + * 根据用户id获取用户的微信小程序的userid集合 + * @param userId 手机号 + * @return 第三方微信小程序的userid集合 + */ + ServerResponseEntity> getBizUserIdListByUserId(Long userId); + + /** + * 根据临时tempUid获取用户的微信小程序的userid集合 + * @param tempUid + * @return + */ + ServerResponseEntity getBizUserIdByTempUid(String tempUid); + + /** + * 批量注册用户信息 + * @param authAccountUserDTO + * @return + */ + ServerResponseEntity batchRegisterAccount(AuthAccountUserDTO authAccountUserDTO); + + /** + * 根据租户id查询店铺信息 + * @param tenantId + * @param sysType + * @return + */ + ServerResponseEntity getAccountInfoByTenantId(Long tenantId, Integer sysType); + + /** + * 验证手机号/邮箱/用户名是否存在 + * @param authAccountDTO 账户信息 + * @return Boolean true验证通过,该账号不存在 false验证不通过,该账号存在 + */ + ServerResponseEntity verifyAccount(AuthAccountDTO authAccountDTO); + + /** + * 根据用户名和用户类型获取存在用户的数量 + * @param userName 用户名 + * @param sysType 用户类型 + * @return 数量 + */ + ServerResponseEntity countByUserNameAndSysType(String userName, Integer sysType); + + /** + * 获取已存在的用户名称 + * @param names + * @return + */ + ServerResponseEntity> listUserNameByNames(List names); + + /** + * 更新未开店成功账号的token用户信息 + * @param uidInfoBO + * @return + */ + ServerResponseEntity updateNoAuditUidInfo(UidInfoBO uidInfoBO); + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/PasswordFeignClient.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/PasswordFeignClient.java new file mode 100644 index 0000000..3b577bc --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/feign/PasswordFeignClient.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author 菠萝凤梨 + * @date 2022/1/20 15:11 + */ +public interface PasswordFeignClient { + + /** + * 获取解密后的密码 + * @param password 加密的密码 + * @return 解密之后的密码 + */ + ServerResponseEntity getDecryptPassword(String password); +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/AuthAccountVO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/AuthAccountVO.java new file mode 100644 index 0000000..74f6501 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/auth/vo/AuthAccountVO.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +public class AuthAccountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 全平台用户唯一id + */ + private Long uid; + + @Schema(description = "邮箱") + private Long userId; + + @Schema(description = "邮箱") + private String email; + + @Schema(description = "手机号") + private String phone; + + @Schema(description = "用户名") + private String username; + + @Schema(description = "密码") + private String password; + + @Schema(description = "状态 1:启用 0:禁用 -1:删除") + private Integer status; + + @Schema(description = "创建ip") + private String createIp; + + /** + * 系统类型见SysTypeEnum + */ + @Schema(description = "系统类型 0.普通用户系统 1.商家端 2.平台端") + private Integer sysType; + + /** + * 是否是管理员 + */ + @Schema(description = "是否是管理员") + private Integer isAdmin; + @Schema(description = "店铺是否已经入驻") + private Integer isPassShop; + + @Schema(description = "所属租户") + private Long tenantId; + + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public String getCreateIp() { + return createIp; + } + + public void setCreateIp(String createIp) { + this.createIp = createIp; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + public Integer getIsPassShop() { + return isPassShop; + } + + public void setIsPassShop(Integer isPassShop) { + this.isPassShop = isPassShop; + } + + @Override + public String toString() { + return "AuthAccountVO{" + + "uid=" + uid + + ", userId=" + userId + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", status=" + status + + ", createIp='" + createIp + '\'' + + ", sysType=" + sysType + + ", isAdmin=" + isAdmin + + ", isPassShop=" + isPassShop + + ", tenantId=" + tenantId + + ", isPassShop=" + isPassShop + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/bo/UriPermissionBO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/bo/UriPermissionBO.java new file mode 100644 index 0000000..2b9a147 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/bo/UriPermissionBO.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.rbac.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * uri权限bo + * + * @author FrozenWatermelon + * @date 2020/9/3 + */ +public class UriPermissionBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 请求方法 1.GET 2.POST 3.PUT 4.DELETE + */ + private Integer method; + + /** + * uri + */ + private String uri; + + /** + * permission + */ + private String permission; + + /** + * 用户拥有该权限 + */ + private Boolean hasPermission; + + public Integer getMethod() { + return method; + } + + public void setMethod(Integer method) { + this.method = method; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public Boolean getHasPermission() { + return hasPermission; + } + + public void setHasPermission(Boolean hasPermission) { + this.hasPermission = hasPermission; + } + + @Override + public String toString() { + return "UriPermissionBO{" + + "method=" + method + + ", uri='" + uri + '\'' + + ", permission='" + permission + '\'' + + ", hasPermission=" + hasPermission + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/constant/HttpMethodEnum.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/constant/HttpMethodEnum.java new file mode 100644 index 0000000..002013a --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/constant/HttpMethodEnum.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.rbac.constant; + +import java.util.Objects; + +/** + * 请求方法 1.GET 2.POST 3.PUT 4.DELETE http方法枚举 + * @author FrozenWatermelon + * @date 2020/9/3 + */ +public enum HttpMethodEnum { + + /** + * GET + */ + GET(1, "GET"), + + /** + * POST + */ + POST(2, "POST"), + + /** + * PUT + */ + PUT(3, "PUT"), + + /** + * DELETE + */ + DELETE(4, "DELETE"), + ; + + private final Integer value; + + private final String method; + + public Integer value() { + return value; + } + + public String method() { + return this.method; + } + + HttpMethodEnum(Integer value, String method) { + this.value = value; + this.method = method; + } + + public static HttpMethodEnum valueOf(Integer value) { + for (HttpMethodEnum httpMethodEnum : values()) { + if (Objects.equals(httpMethodEnum.value(), value)) { + return httpMethodEnum; + } + } + return null; + } + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/CheckPermissionDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/CheckPermissionDTO.java new file mode 100644 index 0000000..cde4a02 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/CheckPermissionDTO.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.rbac.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/9/2 + */ +public class CheckPermissionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + @NotNull(message = "userId not null") + private Long userId; + + /** + * 系统类型 + */ + @NotNull(message = "sysType not null") + private Integer sysType; + + /** + * uri + */ + @NotBlank(message = "uri not blank") + private String uri; + + /** + * 是否是管理员 + */ + @NotNull(message = "isAdmin not null") + private Integer isAdmin; + + /** + * 请求方法 1.GET 2.POST 3.PUT 4.DELETE + */ + private Integer method; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(Integer isAdmin) { + this.isAdmin = isAdmin; + } + + public Integer getMethod() { + return method; + } + + public void setMethod(Integer method) { + this.method = method; + } + + @Override + public String toString() { + return "CheckPermissionDTO{" + "userId=" + userId + ", sysType=" + sysType + ", uri='" + uri + '\'' + + ", isAdmin=" + isAdmin + ", method=" + method + '}'; + } + +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/ClearUserPermissionsCacheDTO.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/ClearUserPermissionsCacheDTO.java new file mode 100644 index 0000000..f02c7f2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/dto/ClearUserPermissionsCacheDTO.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.rbac.dto; + +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/11/27 + */ +public class ClearUserPermissionsCacheDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + @NotNull(message = "userId not null") + private Long userId; + + /** + * 系统类型 + */ + @NotNull(message = "sysType not null") + private Integer sysType; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + @Override + public String toString() { + return "ClearUserPermissionsCacheDTO{" + + "userId=" + userId + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/feign/UserRoleFeignClient.java b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/feign/UserRoleFeignClient.java new file mode 100644 index 0000000..65977cf --- /dev/null +++ b/tmerclub-api/tmerclub-api-auth/src/main/java/com/tmerclub/cloud/api/rbac/feign/UserRoleFeignClient.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.rbac.feign; + +import com.tmerclub.cloud.api.rbac.dto.UserRoleDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/25 + */ +public interface UserRoleFeignClient { + + + /** + * 保存用户角色关联信息 + * @param userRoleDTO 用户角色关联信息 + */ + void saveByUserIdAndSysType(UserRoleDTO userRoleDTO); + + /** + * 更新用户角色关联信息 + * @param userRoleDTO 用户角色关联信息 + */ + void updateByUserIdAndSysType(UserRoleDTO userRoleDTO); + + /** + * 删除用户角色关联信息 + * @param userId 用户id + */ + void deleteByUserIdAndSysType(Long userId); + + /** + * 获取用户角色关联信息 + * @param userId 用户id + * @return 用户角色关联ids + */ + ServerResponseEntity> getRoleIds(Long userId); +} diff --git a/tmerclub-api/tmerclub-api-biz/pom.xml b/tmerclub-api/tmerclub-api-biz/pom.xml new file mode 100644 index 0000000..b550aff --- /dev/null +++ b/tmerclub-api/tmerclub-api-biz/pom.xml @@ -0,0 +1,23 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-biz + jar + biz对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/feign/NotifyFeignClient.java b/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/feign/NotifyFeignClient.java new file mode 100644 index 0000000..5e5be32 --- /dev/null +++ b/tmerclub-api/tmerclub-api-biz/src/main/java/com/tmerclub/cloud/api/biz/feign/NotifyFeignClient.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.biz.feign; + +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface NotifyFeignClient { + + /** + * 校验验证码 + * @param validAccount 校验的账号,手机号 or 邮箱 + * @param validCode 验证码 + * @param type 类型 + * @return 成功or失败 + */ + ServerResponseEntity /**/checkValidCode(String validAccount, String validCode, SendTypeEnum type); + + /** + * 通过标记校验验证码 + * @param mobile 手机号 + * @param checkRegisterSmsFlag 验证码成功的标记 + * @return 成功or失败 + */ + ServerResponseEntity checkValidCodeByFlag(String mobile, String checkRegisterSmsFlag); + + /** + * 获取未读消息数量 + * @param userId 用户id + * @return 数量 + */ + ServerResponseEntity getUnreadMsg(Long userId); + + /** + * 根据用户标签id删除与该用户标签关联的数据 + * @param tagId + * @return + */ + ServerResponseEntity deleteTagByTagId(Long tagId); + +} diff --git a/tmerclub-api/tmerclub-api-flow/pom.xml b/tmerclub-api/tmerclub-api-flow/pom.xml new file mode 100644 index 0000000..6520412 --- /dev/null +++ b/tmerclub-api/tmerclub-api-flow/pom.xml @@ -0,0 +1,28 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-flow + jar + 用户流量分析对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/vo/GroupOrderVO.java b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/vo/GroupOrderVO.java new file mode 100644 index 0000000..538c075 --- /dev/null +++ b/tmerclub-api/tmerclub-api-group/src/main/java/com/tmerclub/cloud/api/group/vo/GroupOrderVO.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.group.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团订单表VO + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团订单id") + private Long groupOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "拼团团队id") + private Long groupTeamId; + + @Schema(description = "user_id(当user_id为0时标识为机器人)") + private Long userId; + + @Schema(description = "身份标识(0:成员 1:团长)") + private Integer identityType; + + @Schema(description = "活动商品金额") + private Long activityProdPrice; + + @Schema(description = "支付金额") + private Long payPrice; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "状态(0:待支付、1:支付成功、-1:失效)") + private Integer status; + + @Schema(description = "拼团活动id") + private Long groupActivityId; + + public Long getGroupOrderId() { + return groupOrderId; + } + + public void setGroupOrderId(Long groupOrderId) { + this.groupOrderId = groupOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public Long getActivityProdPrice() { + return activityProdPrice; + } + + public void setActivityProdPrice(Long activityProdPrice) { + this.activityProdPrice = activityProdPrice; + } + + public Long getPayPrice() { + return payPrice; + } + + public void setPayPrice(Long payPrice) { + this.payPrice = payPrice; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + @Override + public String toString() { + return "GroupOrderVO{" + + "groupOrderId=" + groupOrderId + + ", shopId=" + shopId + + ", groupTeamId=" + groupTeamId + + ", userId=" + userId + + ", identityType=" + identityType + + ", activityProdPrice=" + activityProdPrice + + ", payPrice=" + payPrice + + ", orderId=" + orderId + + ", status=" + status + + ", groupActivityId=" + groupActivityId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-im/pom.xml b/tmerclub-api/tmerclub-api-im/pom.xml new file mode 100644 index 0000000..9be1e4c --- /dev/null +++ b/tmerclub-api/tmerclub-api-im/pom.xml @@ -0,0 +1,28 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-im + jar + 客服对内接口 + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-im/src/main/java/com/tmerclub/cloud/api/im/feign/ImFeignClient.java b/tmerclub-api/tmerclub-api-im/src/main/java/com/tmerclub/cloud/api/im/feign/ImFeignClient.java new file mode 100644 index 0000000..db78a19 --- /dev/null +++ b/tmerclub-api/tmerclub-api-im/src/main/java/com/tmerclub/cloud/api/im/feign/ImFeignClient.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.im.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author zp + * @Date 2023/7/12 10:28 + */ +public interface ImFeignClient { + + /** + * 根据用户id获取所有客服未读消息数量 + * @param userId 用户 + * @return 返回结果 + */ + ServerResponseEntity getImUserUnreadNum(Long userId); +} diff --git a/tmerclub-api/tmerclub-api-marketing/pom.xml b/tmerclub-api/tmerclub-api-marketing/pom.xml new file mode 100644 index 0000000..b19a699 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/pom.xml @@ -0,0 +1,33 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-marketing + jar + 营销活动对内接口 + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + com.moyuer.cloud + tmerclub-common-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboFeignClient.java new file mode 100644 index 0000000..19652da --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboFeignClient.java @@ -0,0 +1,69 @@ +package com.tmerclub.cloud.api.combo.feign;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import com.tmerclub.cloud.common.product.vo.ComboVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author xxw + * @date 2022/8/16 14:45 + */ +public interface ComboFeignClient { + + /** + * 根据spuId获取相关的套餐信息 + * + * @param shopId + * @param spuId + * @return + */ + ServerResponseEntity> listComboInfoBySpuId(Long shopId, Long spuId); + + /** + * 根据商品id获取套餐信息 + * + * @param spuId + * @return + */ + ServerResponseEntity> comboVoListBySpuId(Long spuId); + + /** + * 商品下架时如果商品在套餐活动中且为主商品则失效套餐活动 + * + * @param spuId + */ + void offComboMainSpu(Long spuId); + + /** + * 检查商品是否为套餐活动(状态正在进行中的)的主商品 + * @param spuId + * @param shopId + * @return + */ + ServerResponseEntity checkComboSpu(Long spuId, Long shopId); + + /** + * 根据套餐id集合检查套餐是否全部可用 + * + * @param comboIdList + * @return 返回不可用套餐数量 0代表全部可用,其它数据代表有不可用的套餐 + */ + ServerResponseEntity checkComboIsUsable(List comboIdList); + + /** + * 根据套餐商品上下级时删除套餐缓存 + * + * @param spuId + */ + void removeComboSpuCache(Long spuId); + +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboSpuFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboSpuFeignClient.java new file mode 100644 index 0000000..a2b00dd --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboSpuFeignClient.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.combo.feign; + +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author xxw + * @date 2022/9/28 9:45 + */ +public interface ComboSpuFeignClient { + + /** + * 根据套餐id获取套餐项商品信息 + * @param comboId + * @return + */ + ServerResponseEntity> comboSpuByComboId(Long comboId); + +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboSpuSkuFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboSpuSkuFeignClient.java new file mode 100644 index 0000000..6bf1ad0 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/feign/ComboSpuSkuFeignClient.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.combo.feign; + +import com.tmerclub.cloud.api.combo.vo.ComboSkuVo; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; +import java.util.Set; + +/** + * @author xxw + * @date 2022/8/22 17:53 + */ +public interface ComboSpuSkuFeignClient { + /** + * 根据套餐id列表和sku列表获取套餐信息 + * @param comboIdList + * @param skuIdList + * @return + */ + ServerResponseEntity> comboVoListComboAndSkuList(Set comboIdList, List skuIdList); +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/vo/ComboSkuVo.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/vo/ComboSkuVo.java new file mode 100644 index 0000000..377d08b --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/combo/vo/ComboSkuVo.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.combo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户勾选套餐信息 + * @author xxw + * @date 2022/8/23 14:05 + */ +public class ComboSkuVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "套餐名称") + private String name; + + @Schema(description = "sku id") + private Long skuId; + + @Schema(description = "sku 价格") + private Long price; + + @Schema(description = "sku 套餐价格") + private Long matchingPrice; + + @Schema(description = "起搭数量") + private Integer leastNum; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Long matchingPrice) { + this.matchingPrice = matchingPrice; + } + + public Integer getLeastNum() { + return leastNum; + } + + public void setLeastNum(Integer leastNum) { + this.leastNum = leastNum; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/bo/CouponGiveBO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/bo/CouponGiveBO.java new file mode 100644 index 0000000..8e0da71 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/bo/CouponGiveBO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 充值赠送优惠券信息 + * @author FrozenWatermelon + */ +public class CouponGiveBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 业务id + */ + private Long bizId; + + /** + * 业务类型 + */ + private Integer bizType; + + private Long userId; + + private List couponInfos; + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public List getCouponInfos() { + return couponInfos; + } + + public void setCouponInfos(List couponInfos) { + this.couponInfos = couponInfos; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + @Override + public String toString() { + return "CouponGiveBO{" + + "bizId=" + bizId + + ", bizType=" + bizType + + ", userId=" + userId + + ", couponInfos=" + couponInfos + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/bo/CouponIdAndCountBO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/bo/CouponIdAndCountBO.java new file mode 100644 index 0000000..a3c1590 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/bo/CouponIdAndCountBO.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 优惠券id和数量 + * @author FrozenWatermelon + */ +public class CouponIdAndCountBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long couponId; + + private Integer count; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "CouponIdAndCountBO{" + + "couponId=" + couponId + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/PutOnStatus.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/PutOnStatus.java new file mode 100644 index 0000000..dcdd293 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/PutOnStatus.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.constant; + +import java.util.Objects; + +/** + * 优惠券投放状态 + * @author yxf + * @date 2020/11/20 + */ +public enum PutOnStatus { + /** + * 取消投放 + */ + CANCEL(-1), + + /** + * 自动投放 + */ + AUTO_LAUNCH(0), + + /** + * 投放 + */ + PUT_ON(1), + + /** + * 违规下架 + */ + OFFLINE(2), + + /** + * 等待审核 + */ + WAIT_AUDIT(3), + + /** + * 暂不投放 + */ + WAIT_PUT_ON(4), + ; + + private final Integer value; + + public Integer value() { + return value; + } + + PutOnStatus(Integer value) { + this.value = value; + } + + public static Boolean offline(Integer value) { + return Objects.equals(OFFLINE.value, value) || Objects.equals(WAIT_AUDIT.value, value); + } + +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/UserCouponStatus.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/UserCouponStatus.java new file mode 100644 index 0000000..8eda282 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/constant/UserCouponStatus.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.constant; + +/** + * @author FrozenWatermelon + * @date 2020/12/28 + */ +public enum UserCouponStatus { + /** + * 0:失效 + */ + INVALID(0), + + /** + * 1:有效 + */ + EFFECTIVE(1), + + /** + * 使用过 + */ + USED(2); + + private Integer value; + + public Integer getValue() { + return value; + } + + public void setValue(Integer value) { + this.value = value; + } + + UserCouponStatus(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/feign/CouponFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/feign/CouponFeignClient.java new file mode 100644 index 0000000..cf1aacf --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/feign/CouponFeignClient.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.feign; + +import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO; +import com.tmerclub.cloud.api.coupon.dto.ReceiveCouponDTO; +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.api.coupon.vo.CouponUserCountDataVO; +import com.tmerclub.cloud.common.product.vo.SpuCouponAppVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.Date; +import java.util.List; + +/** + * 优惠券 + * @author FrozenWatermelon + * @date 2020/12/17 + */ +public interface CouponFeignClient { + + /** + * 根据优惠券id列表,获取优惠券列表 + * @param couponIds + * @return sku信息 + */ + ServerResponseEntity> getCouponListByCouponIds(List couponIds); + + /** + * 根据优惠券id列表,投放状态,获取优惠券列表 + * @param couponIds 优惠券ids + * @param putOnStatus 投放状态 + * @return sku信息 + */ + ServerResponseEntity> getCouponListByCouponIdsAndPutOnStatus(List couponIds, Integer putOnStatus); + + /** + * 绑定优惠券(平台赠送优惠券给用户) + * @param bindCouponDTO + * @return + */ + ServerResponseEntity batchBindCouponByCouponIds(BindCouponDTO bindCouponDTO); + + + /** + * 获取可使用的优惠券数量 + * @return 可使用的优惠券数量 + */ + ServerResponseEntity countCanUseCoupon(); + + /** + * 商品详情的优惠券列表 + * + * @param shopId + * @param spuId + * @return + */ + ServerResponseEntity> couponOfSpuDetail(Long shopId, Long spuId); + + /** + * 统计用户优惠券信息 + * @param userId + * @param shopId + * @return + */ + ServerResponseEntity countCouponUserByUserId(Long userId, Long shopId); + + /** + * 获取领券会员数 + * @param shopId 店铺id + * @param startTime 起始时间 + * @param endTime 结束时间 + * @return 领券会员数 + */ + ServerResponseEntity> countMemberCouponByParam(Long shopId,Date startTime, Date endTime); + + /** + * 处理商品下线 + * + * @param spuIds 商品id列表 + * @param shopIds 店铺id + * @return + */ + ServerResponseEntity handleSpuOffline(List spuIds, List shopIds); + + /** + * 处理店铺下线 + * + * @param shopIds 店铺id + * @return + */ + ServerResponseEntity handleShopOffline(List shopIds); + + /** + * 统计用户领取优惠券数量 + * @param receiveCouponDTO + * @return + */ + ServerResponseEntity> userReceiveCouponCount(ReceiveCouponDTO receiveCouponDTO); + + /** + * 获取优惠券库存 + * @param couponId + * @return + */ + ServerResponseEntity getStockByCouponId(Long couponId); +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponUserCountDataVO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponUserCountDataVO.java new file mode 100644 index 0000000..abaf348 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/coupon/vo/CouponUserCountDataVO.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.coupon.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户优惠券统计数据 + * @author: cl + * @date: 2021-04-12 16:12 + */ +public class CouponUserCountDataVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "未使用 优惠券的数量") + private Integer couponUsableNums; + + @Schema(description = "已使用 优惠券的数量") + private Integer couponUsedNums; + + @Schema(description = "已过期 优惠券的数量") + private Integer couponExpiredNums; + + public CouponUserCountDataVO() { + this.couponUsableNums = 0; + this.couponUsedNums = 0; + this.couponExpiredNums = 0; + } + + public Integer getCouponUsableNums() { + return couponUsableNums; + } + + public void setCouponUsableNums(Integer couponUsableNums) { + this.couponUsableNums = couponUsableNums; + } + + public Integer getCouponUsedNums() { + return couponUsedNums; + } + + public void setCouponUsedNums(Integer couponUsedNums) { + this.couponUsedNums = couponUsedNums; + } + + public Integer getCouponExpiredNums() { + return couponExpiredNums; + } + + public void setCouponExpiredNums(Integer couponExpiredNums) { + this.couponExpiredNums = couponExpiredNums; + } + + @Override + public String toString() { + return "CouponUserCountDataVO{" + + "couponUsableNums=" + couponUsableNums + + ", couponUsedNums=" + couponUsedNums + + ", couponExpiredNums=" + couponExpiredNums + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/vo/DiscountSumItemVO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/vo/DiscountSumItemVO.java new file mode 100644 index 0000000..b3161a5 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/discount/vo/DiscountSumItemVO.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.discount.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 每个满减活动的活动信息 + * @author FrozenWatermelon + */ +public class DiscountSumItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 需要商品金额/数量 + */ + private Long needAmount; + + /** + * 优惠项 + */ + private Long discountItemId; + + /** + * 优惠(元/折) + */ + private Long discount; + + /** + * 该满减活动实际优惠金额 + * 如果活动优惠金额有上限,且优惠金额达到了上限, + * 那么这个金额就是活动优惠金额的上限 + */ + private Long reduceAmount; + + /** + * 参与满减满折优惠的商品数量 + */ + private Integer count; + /** + * 参与满减满折优惠的商品金额 + */ + private Long prodsPrice; + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Long getDiscountItemId() { + return discountItemId; + } + + public void setDiscountItemId(Long discountItemId) { + this.discountItemId = discountItemId; + } + + public Long getDiscount() { + return discount; + } + + public void setDiscount(Long discount) { + this.discount = discount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getProdsPrice() { + return prodsPrice; + } + + public void setProdsPrice(Long prodsPrice) { + this.prodsPrice = prodsPrice; + } + + @Override + public String toString() { + return "DiscountSumItemVO{" + + "needAmount=" + needAmount + + ", discountItemId=" + discountItemId + + ", discount=" + discount + + ", reduceAmount=" + reduceAmount + + ", count=" + count + + ", prodsPrice=" + prodsPrice + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/feign/DistributionFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/feign/DistributionFeignClient.java new file mode 100644 index 0000000..d3a8261 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/feign/DistributionFeignClient.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.distribution.feign; + +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author cl + * @date 2021-08-05 16:07:34 + */ +public interface DistributionFeignClient { + + /** + * 根据主键id获取分销信息 + * @param distributionId 主键id + * @return + */ + ServerResponseEntity getByDistributionId(Long distributionId); + + /** + * 根据商品id获取分销信息 + * @param spuId 商品id + * @return + */ + ServerResponseEntity getBySpuId(Long spuId); + + /** + * 处理商品下线 + * + * @param spuIds 商品id列表 + * @param shopIds 店铺id + * @param state 状态 + * @return + */ + ServerResponseEntity handleSpuState(List spuIds, List shopIds, Integer state); + + /** + * 通联切换,分销初始化 + * @return + */ + ServerResponseEntity initDistributionBySwitchAllinpay(); +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/feign/DistributionUserIncomeFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/feign/DistributionUserIncomeFeignClient.java new file mode 100644 index 0000000..55c8b54 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/feign/DistributionUserIncomeFeignClient.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.distribution.feign; + +import com.tmerclub.cloud.api.distribution.vo.DistributionUserIncomeApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author lhd + * @date 2023-03-20 16:07:34 + */ +public interface DistributionUserIncomeFeignClient { + + /** + * 根据orderId获取分销收入信息 + * @param orderId 订单id + * @return + */ + ServerResponseEntity> listDistributionUserIncomeByOrderId(Long orderId); +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/vo/DistributionSpuVO.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/vo/DistributionSpuVO.java new file mode 100644 index 0000000..081fe7d --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/distribution/vo/DistributionSpuVO.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.distribution.vo; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/8/12 15:45 + */ +public class DistributionSpuVO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销商品表") + private Long distributionSpuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品主图") + private String MainImgUrl; + + @Schema(description = "奖励id") + private Long awardId; + + @Schema(description = "状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核)") + private Integer state; + + @Schema(description = "奖励方式(0 按比例 1 按固定数值)") + private Integer awardMode; + + @Schema(description = "上级奖励设置(0 关闭 1开启)") + private Integer parentAwardSet; + + @Schema(description = "奖励数额(奖励方式为0时,表示百分比,为1时代表实际奖励金额)") + private Long awardNumbers; + + @Schema(description = "上级奖励数额(奖励方式为0时,表示百分比,为1时代表实际奖励金额)") + private Long parentAwardNumbers; + + @Schema(description = "操作人id") + private Long modifier; + + public String getMainImgUrl() { + return MainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + MainImgUrl = mainImgUrl; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getAwardNumbers() { + return awardNumbers; + } + + public void setAwardNumbers(Long awardNumbers) { + this.awardNumbers = awardNumbers; + } + + public Long getParentAwardNumbers() { + return parentAwardNumbers; + } + + public void setParentAwardNumbers(Long parentAwardNumbers) { + this.parentAwardNumbers = parentAwardNumbers; + } + + public Long getDistributionSpuId() { + return distributionSpuId; + } + + public void setDistributionSpuId(Long distributionSpuId) { + this.distributionSpuId = distributionSpuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getAwardId() { + return awardId; + } + + public void setAwardId(Long awardId) { + this.awardId = awardId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public Integer getParentAwardSet() { + return parentAwardSet; + } + + public void setParentAwardSet(Integer parentAwardSet) { + this.parentAwardSet = parentAwardSet; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "DistributionSpuVO{" + + "distributionSpuId=" + distributionSpuId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", MainImgUrl='" + MainImgUrl + '\'' + + ", awardId=" + awardId + + ", state=" + state + + ", awardMode=" + awardMode + + ", parentAwardSet=" + parentAwardSet + + ", awardNumbers=" + awardNumbers + + ", parentAwardNumbers=" + parentAwardNumbers + + ", modifier=" + modifier + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/feign/MarketingFeignClient.java b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/feign/MarketingFeignClient.java new file mode 100644 index 0000000..3198bd1 --- /dev/null +++ b/tmerclub-api/tmerclub-api-marketing/src/main/java/com/tmerclub/cloud/api/feign/MarketingFeignClient.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemDiscountVO; +import com.tmerclub.cloud.common.order.vo.ShopCartVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 优惠活动 + * @author FrozenWatermelon + * @date 2020/12/14 + */ +public interface MarketingFeignClient { + + /** + * 计算优惠活动,并重新组合购物车 + * @param shopCarts 购物车信息 + * @param couponIds 优惠券id数组 + * @param userChangeCoupon 用户是否改变了优惠券的选择,如果用户改变了优惠券的选择,则完全根据传入参数进行优惠券的选择 + * @return void + */ + List calculateMarketingAndMakeUpShopCart(List shopCarts, List couponIds, Integer userChangeCoupon); + + /** + * 校验套餐活动 + * @param shopCartItemDiscountVOList + * @return + */ + ServerResponseEntity checkComboActivity(List shopCartItemDiscountVOList); +} diff --git a/tmerclub-api/tmerclub-api-order/pom.xml b/tmerclub-api/tmerclub-api-order/pom.xml new file mode 100644 index 0000000..9d676b1 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/pom.xml @@ -0,0 +1,48 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-order + jar + 订单对内接口 + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + com.moyuer.cloud + tmerclub-common-cache + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/bo/BmapPointBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/bo/BmapPointBO.java new file mode 100644 index 0000000..7feab1b --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/bo/BmapPointBO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/12/16 + */ +public class BmapPointBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 经度 + */ + private Double lng; + + /** + * 纬度 + */ + private Double lat; + + public BmapPointBO() { + + } + + public BmapPointBO(Double lng, Double lat) { + this.lng = lng; + this.lat = lat; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BmapPointBO) { + BmapPointBO bmapPoint = (BmapPointBO) obj; + return (Objects.equals(bmapPoint.getLng(), lng) && Objects.equals(bmapPoint.getLat(), lat)); + } else { + return false; + } + } + + @Override + public int hashCode() { + return Objects.hash(lng, lat); + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "BmapPointBO{" + + "lng=" + lng + + ", lat=" + lat + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/DistanceUtil.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/DistanceUtil.java new file mode 100644 index 0000000..fef9a38 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/DistanceUtil.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.constant; + +/** + * 距离计算工具 + * @author FrozenWatermelon + * @date 2020/12/16 + */ +public class DistanceUtil { + + private static final double EARTH_RADIUS = 6378.137; + + private static double rad(double d) { + return d * Math.PI / 180.0; + } + + /** + * 通过经纬度获取距离(单位:米) + * + * @param lat1 + * @param lng1 + * @param lat2 + * @param lng2 + * @return 距离 + */ + public static double getDistance(double lat1, double lng1, double lat2, + double lng2) { + double radLat1 = rad(lat1); + double radLat2 = rad(lat2); + double a = radLat1 - radLat2; + double b = rad(lng1) - rad(lng2); + double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) + * Math.pow(Math.sin(b / 2), 2))); + s = s * EARTH_RADIUS; + s = Math.round(s * 10000.0d) / 10000.0d; + s = s * 1000; + return s; + } + + +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/GraphUtils.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/GraphUtils.java new file mode 100644 index 0000000..d0fb88d --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/GraphUtils.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.constant; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.bo.BmapPointBO; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/12/16 + */ +public class GraphUtils { + /** + * 判断点是否在多边形内(基本思路是用交点法) + * + * @param point + * @param boundaryPoints + * @return + */ + public static boolean isPointInPolygon(BmapPointBO point, List boundaryPoints) { + if (CollectionUtil.isEmpty(boundaryPoints) || Objects.isNull(point)) { + return false; + } + int pointCount = boundaryPoints.size(); + + // 首先判断点是否在多边形的外包矩形内,如果在,则进一步判断,否则返回false + if (!isPointInRectangle(point, boundaryPoints)) { + return false; + } + for (BmapPointBO boundaryPoint : boundaryPoints) { + if (point.equals(boundaryPoint)) { + return true; + } + } + return pointIsInPolygon(pointCount, point, boundaryPoints); + } + + /** + * 基本思想是利用X轴射线法,计算射线与多边形各边的交点,如果是偶数,则点在多边形外,否则在多边形内。还会考虑一些特殊情况,如点在多边形顶点上 + * , 点在多边形边上等特殊情况。 + * @param pointCount + * @param point + * @param boundaryPoints + * @return + */ + public static boolean pointIsInPolygon(int pointCount, BmapPointBO point, List boundaryPoints) { + // X轴射线与多边形的交点数 + int intersectPointCount = 0; + // X轴射线与多边形的交点权值 + float intersectPointWeights = 0; + // 浮点类型计算时候与0比较时候的容差 + double precision = 2.0e-10; + // 边P1P2的两个端点 + BmapPointBO point1 = boundaryPoints.get(0), point2; + // 循环判断所有的边 + for (int i = 1; i <= pointCount; i++) { + point2 = boundaryPoints.get(i % pointCount); + /* + 如果点的y坐标在边P1P2的y坐标开区间范围之外,那么不相交。 + */ + if (point.getLat() < Math.min(point1.getLat(), point2.getLat()) + || point.getLat() > Math.max(point1.getLat(), point2.getLat())) { + point1 = point2; + continue; + } + /* + 此处判断射线与边相交 + */ + // 如果点的y坐标在边P1P2的y坐标开区间内 + if (point.getLat() > Math.min(point1.getLat(), point2.getLat()) + && point.getLat() < Math.max(point1.getLat(), point2.getLat())) { + // 若边P1P2是垂直的 + if (point1.getLng().equals(point2.getLng())) { + if (point.getLng().equals(point1.getLng())) { + // 若点在垂直的边P1P2上,则点在多边形内 + return true; + } else if (point.getLng() < point1.getLng()) { + // 若点在在垂直的边P1P2左边,则点与该边必然有交点 + ++intersectPointCount; + } + } else {// 若边P1P2是斜线 + // 点point的x坐标在点P1和P2的左侧 + if (point.getLng() <= Math.min(point1.getLng(), point2.getLng())) { + ++intersectPointCount; + } + // 点point的x坐标在点P1和P2的x坐标中间 + else if (point.getLng() > Math.min(point1.getLng(), point2.getLng()) + && point.getLng() < Math.max(point1.getLng(), point2.getLng())) { + double slopeDiff = getSlopeDiff(point, point1, point2); + if (slopeDiff > 0) { + // 由于double精度在计算时会有损失,故匹配一定的容差。经试验,坐标经度可以达到0.0001 + if (slopeDiff < precision) { + // 点在斜线P1P2上 + return true; + } else { + // 点与斜线P1P2有交点 + intersectPointCount++; + } + } + } + } + } else { + // 边P1P2水平 + if (point1.getLat().equals(point2.getLat())) { + if (point.getLng() <= Math.max(point1.getLng(), point2.getLng()) + && point.getLng() >= Math.min(point1.getLng(), point2.getLng())) { + // 若点在水平的边P1P2上,则点在多边形内 + return true; + } + } + intersectPointWeights = getIntersectPointWeights(point, intersectPointWeights, point1, point2); + } + point1 = point2; + } + int d = 2; + // 偶数在多边形外 + // 奇数在多边形内 + return (intersectPointCount + Math.abs(intersectPointWeights)) % d != 0; + } + + private static double getSlopeDiff(BmapPointBO point, BmapPointBO point1, BmapPointBO point2) { + double slopeDiff; + if (point1.getLat() > point2.getLat()) { + slopeDiff = (point.getLat() - point2.getLat()) / (point.getLng() - point2.getLng()) + - (point1.getLat() - point2.getLat()) / (point1.getLng() - point2.getLng()); + } else { + slopeDiff = (point.getLat() - point1.getLat()) / (point.getLng() - point1.getLng()) + - (point2.getLat() - point1.getLat()) / (point2.getLng() - point1.getLng()); + } + return slopeDiff; + } + + private static float getIntersectPointWeights(BmapPointBO point, float intersectPointWeights, BmapPointBO point1, BmapPointBO point2) { + /* + 判断点通过多边形顶点 + */ + boolean flag = ((point.getLat().equals(point1.getLat()) && point.getLng() < point1.getLng())) + || (point.getLat().equals(point2.getLat()) && point.getLng() < point2.getLng()); + if (flag) { + if (point2.getLat() < point1.getLat()) { + intersectPointWeights -= 0.5; + } else if (point2.getLat() > point1.getLat()) { + intersectPointWeights += 0.5; + } + } + return intersectPointWeights; + } + + /** + * 判断点是否在矩形内在矩形边界上,也算在矩形内(根据这些点,构造一个外包矩形) + * + * @param point + * 点对象 + * @param boundaryPoints + * 矩形边界点 + * @return + */ + public static boolean isPointInRectangle(BmapPointBO point, List boundaryPoints) { + // 西南角点 + BmapPointBO southWestPoint = getSouthWestPoint(boundaryPoints); + // 东北角点 + BmapPointBO northEastPoint = getNorthEastPoint(boundaryPoints); + return (point.getLng() >= southWestPoint.getLng() && point.getLng() <= northEastPoint.getLng() + && point.getLat() >= southWestPoint.getLat() && point.getLat() <= northEastPoint.getLat()); + + } + + /** + * 根据这组坐标,画一个矩形,然后得到这个矩形西南角的顶点坐标 + * + * @param vertexs + * @return + */ + private static BmapPointBO getSouthWestPoint(List vertexs) { + double minLng = vertexs.get(0).getLng(), minLat = vertexs.get(0).getLat(); + for (BmapPointBO bmapPoint : vertexs) { + double lng = bmapPoint.getLng(); + if (lng < minLng) { + minLng = lng; + } + double lat = bmapPoint.getLat(); + if (lat < minLat) { + minLat = lat; + } + } + return new BmapPointBO(minLng, minLat); + } + + /** + * 根据这组坐标,画一个矩形,然后得到这个矩形东北角的顶点坐标 + * + * @param vertexs + * @return + */ + private static BmapPointBO getNorthEastPoint(List vertexs) { + double maxLng = 0.0d, maxLat = 0.0d; + for (BmapPointBO bmapPoint : vertexs) { + double lng = bmapPoint.getLng(); + double lat = bmapPoint.getLat(); + if (lng > maxLng) { + maxLng = lng; + } + if (lat > maxLat) { + maxLat = lat; + } + } + return new BmapPointBO(maxLng, maxLat); + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/SameCityChargeType.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/SameCityChargeType.java new file mode 100644 index 0000000..bc24d9d --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/SameCityChargeType.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.constant; + + +/** + * 同城配送收费方式 1按区域收取固定配送费 2按距离收取配送费 + * @author FrozenWatermelon + */ +public enum SameCityChargeType { + + /** + * 1按区域收取固定配送费 + */ + FIXED(1), + + /** + * 2按距离收取配送费 + */ + DISTANCE(2); + + private final Integer num; + + public Integer value() { + return num; + } + + SameCityChargeType(Integer num) { + this.num = num; + } + + public static SameCityChargeType instance(Integer value) { + SameCityChargeType[] enums = values(); + for (SameCityChargeType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/StationStockStatus.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/StationStockStatus.java new file mode 100644 index 0000000..3edf32c --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/StationStockStatus.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.constant; + + +/** + * 自提门店库存状态 + * @author YXF + */ +public enum StationStockStatus { + /** + * 没有自提门店列表 + */ + NOT_STATION_LIST(0), + /** + * 该区域自提门店没有库存 + */ + NOT_STOCK(1), + /** + * 门店库存充足 + */ + HAS_STOCK(2), + + ; + + private final Integer status; + + + StationStockStatus(Integer status) { + this.status = status; + } + + public Integer getStatus() { + return status; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/TransportChargeType.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/TransportChargeType.java new file mode 100644 index 0000000..0419338 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/TransportChargeType.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.constant; + + +/** + * 运费收费方式 (0 按件数,1 按重量 2 按体积) + * @author FrozenWatermelon + */ +public enum TransportChargeType { + + /** + * 0按件数 + */ + COUNT(0), + + /** + * 1按重量 + */ + WEIGHT(1), + + /** + * 2按体积 + */ + VOLUME(2); + + private final Integer num; + + public Integer value() { + return num; + } + + TransportChargeType(Integer num) { + this.num = num; + } + + public static TransportChargeType instance(Integer value) { + TransportChargeType[] enums = values(); + for (TransportChargeType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/TransportFreeType.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/TransportFreeType.java new file mode 100644 index 0000000..839245d --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/constant/TransportFreeType.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.constant; + + +/** + * 包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮) + * @author FrozenWatermelon + */ +public enum TransportFreeType { + + /** + * 0满x件/重量/体积包邮 + */ + COUNT(0), + + /** + * 1满金额包邮 + */ + AMOUNT(1), + + /** + * 2满x件/重量/体积且满金额包邮 + */ + COUNT_AND_AMOUNT(2); + + private final Integer num; + + public Integer value() { + return num; + } + + TransportFreeType(Integer num) { + this.num = num; + } + + public static TransportFreeType instance(Integer value) { + TransportFreeType[] enums = values(); + for (TransportFreeType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/CalculateAndGetDeliverInfoDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/CalculateAndGetDeliverInfoDTO.java new file mode 100644 index 0000000..27ac380 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/CalculateAndGetDeliverInfoDTO.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.dto; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/15 + */ +public class CalculateAndGetDeliverInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "购物项") + private List shopCartItems; + @Schema(description = "用户地址信息") + private UserDeliveryInfoVO userDeliveryInfo; + + + public CalculateAndGetDeliverInfoDTO() { + } + + public CalculateAndGetDeliverInfoDTO(List shopCartItems, UserDeliveryInfoVO userDeliveryInfo) { + this.shopCartItems = shopCartItems; + this.userDeliveryInfo = userDeliveryInfo; + } + + public List getShopCartItems() { + return shopCartItems; + } + + public void setShopCartItems(List shopCartItems) { + this.shopCartItems = shopCartItems; + } + + public UserDeliveryInfoVO getUserDeliveryInfo() { + return userDeliveryInfo; + } + + public void setUserDeliveryInfo(UserDeliveryInfoVO userDeliveryInfo) { + this.userDeliveryInfo = userDeliveryInfo; + } + + @Override + public String toString() { + return "CalculateAndGetDeliverInfoDTO{" + + "shopCartItems=" + shopCartItems + + ", userDeliveryInfo=" + userDeliveryInfo + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/ChangeOrderAddrDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/ChangeOrderAddrDTO.java new file mode 100644 index 0000000..85c49b7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/ChangeOrderAddrDTO.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.dto; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author Citrus + * @date 2021/11/26 10:47 + */ +public class ChangeOrderAddrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "购物项") + private List shopCartItems; + + @Schema(description = "原本订单的运费") + private Long freightAmount; + + @Schema(description = "修改后的用户订单地址") + private UserAddrVO userAddrVO; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递 4:同城配送") + private Integer dvyType; + + public ChangeOrderAddrDTO() { + } + + public ChangeOrderAddrDTO(List shopCartItems, Long freightAmount, UserAddrVO userAddrVO, Integer dvyType) { + this.shopCartItems = shopCartItems; + this.freightAmount = freightAmount; + this.userAddrVO = userAddrVO; + this.dvyType = dvyType; + } + + public List getShopCartItems() { + return shopCartItems; + } + + public void setShopCartItems(List shopCartItems) { + this.shopCartItems = shopCartItems; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public UserAddrVO getUserAddrVO() { + return userAddrVO; + } + + public void setUserAddrVO(UserAddrVO userAddrVO) { + this.userAddrVO = userAddrVO; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + @Override + public String toString() { + return "ChangeOrderAddrDTO{" + + "shopCartItems=" + shopCartItems + + ", freightAmount=" + freightAmount + + ", userAddrVO=" + userAddrVO + + ", dvyType=" + dvyType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/DeliveryOrderItemDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/DeliveryOrderItemDTO.java new file mode 100644 index 0000000..c503e37 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/dto/DeliveryOrderItemDTO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 物流订单项信息DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrderItemDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long orderItemId; + + @Schema(description = "订单物流包裹id") + private Long deliveryOrderId; + + @Schema(description = "商品图片") + private String pic; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "发货改变的数量") + private Integer changeNum; + + @Schema(description = "供应商商品图片") + private String supplierPic; + + @Schema(description = "供应商商品名称") + private String supplierSpuName; + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getChangeNum() { + return changeNum; + } + + public void setChangeNum(Integer changeNum) { + this.changeNum = changeNum; + } + + @Override + public String toString() { + return "DeliveryOrderItemDTO{" + + "orderItemId=" + orderItemId + + ", deliveryOrderId=" + deliveryOrderId + + ", pic='" + pic + '\'' + + ", spuName='" + spuName + '\'' + + ", changeNum=" + changeNum + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/StationFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/StationFeignClient.java new file mode 100644 index 0000000..daa3a9f --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/feign/StationFeignClient.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.api.delivery.feign; + +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.OrderStationSpuDTO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lanhai + */ +public interface StationFeignClient { + + /** + * 通过id获取自提门店信息(内部调用,无需token) + * @param stationId + * @return + */ + ServerResponseEntity getStationByInside(Long stationId); + + /** + * 查询门店集合(通过Ids) + * @param stationIds 门店id集合 + * @return 门店集合 + */ + List listStationByIds(List stationIds); + + /** + * 获取自提订单的门店数据 - 仅订单stationId为null时,获取距离用户最近的门店,如果没有传经纬度,则是返回一个有库存的门店 + * @param userDeliveryInfoVO + * @param orderStationSpuList + * @return + */ + OrderSelfStationVO getOrderStation(UserDeliveryInfoVO userDeliveryInfoVO, ArrayList orderStationSpuList); + + /** + * 根据店铺id获取门店数量 + * @param shopId + * @return + */ + Integer getStationSize(Long shopId); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryCompanyExcelVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryCompanyExcelVO.java new file mode 100644 index 0000000..9f835a5 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryCompanyExcelVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Pineapple + * @date 2021/7/20 9:14 + */ +public class DeliveryCompanyExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long deliveryCompanyId; + + @Schema(description = "物流公司名称") + private String name; + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "DeliveryCompanyExcelVO{" + + "deliveryCompanyId=" + deliveryCompanyId + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryInfoVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryInfoVO.java new file mode 100644 index 0000000..8eedd87 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryInfoVO.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + */ +public class DeliveryInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "物流公司名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyName; + + @Schema(description = "物流公司官网", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyHomeUrl; + + @Schema(description = "物流订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private String dvyFlowId; + + @Schema(description = "物流状态 0:没有记录 1:已揽收 2:运输途中 201:达到目的城市 3:已签收 4:问题件", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer state; + + @Schema(description = "查询出的物流信息", requiredMode = Schema.RequiredMode.REQUIRED) + private List Traces; + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyHomeUrl() { + return companyHomeUrl; + } + + public void setCompanyHomeUrl(String companyHomeUrl) { + this.companyHomeUrl = companyHomeUrl; + } + + public String getDvyFlowId() { + return dvyFlowId; + } + + public void setDvyFlowId(String dvyFlowId) { + this.dvyFlowId = dvyFlowId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public List getTraces() { + return Traces; + } + + public void setTraces(List traces) { + Traces = traces; + } + + @Override + public String toString() { + return "DeliveryVO{" + + "companyName='" + companyName + '\'' + + ", companyHomeUrl='" + companyHomeUrl + '\'' + + ", dvyFlowId='" + dvyFlowId + '\'' + + ", state=" + state + + ", Traces=" + Traces + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryItemInfoVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryItemInfoVO.java new file mode 100644 index 0000000..e0e3fe7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/DeliveryItemInfoVO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单快递信息项VO + * + * @author lhd + * @date 2020-05-18 15:10:00 + */ +public class DeliveryItemInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "接受站点", requiredMode = Schema.RequiredMode.REQUIRED) + private String AcceptStation; + @Schema(description = "接受时间", requiredMode = Schema.RequiredMode.REQUIRED) + private String AcceptTime; + + public String getAcceptStation() { + return AcceptStation; + } + + public void setAcceptStation(String acceptStation) { + AcceptStation = acceptStation; + } + + public String getAcceptTime() { + return AcceptTime; + } + + public void setAcceptTime(String acceptTime) { + AcceptTime = acceptTime; + } + + @Override + public String toString() { + return "DeliveryInfoVO{" + + "AcceptStation='" + AcceptStation + '\'' + + ", AcceptTime='" + AcceptTime + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/ShopTransportVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/ShopTransportVO.java new file mode 100644 index 0000000..05b457d --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/delivery/vo/ShopTransportVO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.delivery.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 店铺运费信息 + * @author FrozenWatermelon + * @date 2020/12/16 + */ +public class ShopTransportVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "运费模板id") + private Long transportId; + + @Schema(description = "运费模板名称") + private String transName; + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public String getTransName() { + return transName; + } + + public void setTransName(String transName) { + this.transName = transName; + } + + @Override + public String toString() { + return "ShopTransportVO{" + + "transportId=" + transportId + + ", transName='" + transName + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/DistributionAmountWithOrderIdBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/DistributionAmountWithOrderIdBO.java new file mode 100644 index 0000000..cb084f7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/DistributionAmountWithOrderIdBO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2021/1/13 + */ +public class DistributionAmountWithOrderIdBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderId; + + private Long distributionAmount; + + private Long distributionParentAmount; + private Long itemPurchaseAmount; + private Long purchasePlatformCommission; + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + public Long getItemPurchaseAmount() { + return itemPurchaseAmount; + } + + public void setItemPurchaseAmount(Long itemPurchaseAmount) { + this.itemPurchaseAmount = itemPurchaseAmount; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getDistributionParentAmount() { + return distributionParentAmount; + } + + public void setDistributionParentAmount(Long distributionParentAmount) { + this.distributionParentAmount = distributionParentAmount; + } + + @Override + public String toString() { + return "DistributionAmountWithOrderIdBO{" + + "orderId=" + orderId + + ", distributionAmount=" + distributionAmount + + ", distributionParentAmount=" + distributionParentAmount + + ", itemPurchaseAmount=" + itemPurchaseAmount + + ", purchasePlatformCommission=" + purchasePlatformCommission + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsAllotOrderItemBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsAllotOrderItemBO.java new file mode 100644 index 0000000..8326b89 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsAllotOrderItemBO.java @@ -0,0 +1,93 @@ +package com.tmerclub.cloud.api.order.bo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @since 2023-11-27 + */ +public class EsAllotOrderItemBO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 调拨订单商品id + */ + private Long allotOrderItemId; + + /** + * 商品spuId + */ + private Long spuId; + + /** + * 商品skuId + */ + private Long skuId; + + /** + * 调拨数量 + */ + private Integer allotCount; + + /** + * 调拨入库数量 + */ + private Integer allotInCount; + + public EsAllotOrderItemBO() { + } + + public Long getAllotOrderItemId() { + return allotOrderItemId; + } + + public void setAllotOrderItemId(Long allotOrderItemId) { + this.allotOrderItemId = allotOrderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + public Integer getAllotInCount() { + return allotInCount; + } + + public void setAllotInCount(Integer allotInCount) { + this.allotInCount = allotInCount; + } + + @Override + public String toString() { + return "EsAllotOrderItemBO{" + + "allotOrderItemId=" + allotOrderItemId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", allotCount=" + allotCount + + ", allotInCount=" + allotInCount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderRefundBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderRefundBO.java new file mode 100644 index 0000000..ab5bf4a --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsOrderRefundBO.java @@ -0,0 +1,727 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import org.springframework.data.annotation.Id; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author YXF + * @date 2022/8/23 + */ +public class EsOrderRefundBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款记录ID + */ + @Id + private Long refundId; + + /** + * 店铺ID + */ + private Long shopId; + /** + * 供应商id + */ + private Long supplierId; + + /** + * 买家ID + */ + private Long userId; + + /** + * 订单号 + */ + private Long orderId; + + /** + * 订单项ID(0:为全部订单项) + */ + private Long orderItemId; + + /** + * 退货数量(0:为全部订单项) + */ + private Integer refundCount; + + /** + * 退还积分 + */ + private Long refundScore; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + */ + private Long platformRefundAmount; + + /** + * 平台退款佣金 + */ + private Long platformRefundCommission; + + /** + * 退款单总分销金额 + */ + private Long distributionTotalAmount; + + /** + * 退款单类型(1:整单退款,2:单个物品退款) + */ + private Integer refundType; + + /** + * 申请类型:1,仅退款,2退款退货 + */ + private Integer applyType; + + /** + * 是否接收到商品(1:已收到,0:未收到) + */ + private Integer isReceived; + + /** + * 退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭) + */ + private Integer closeType; + + /** + * 处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType + */ + private Integer returnMoneySts; + + /** + * 申请原因 见 BuyerReasonType + */ + private Integer buyerReason; + + /** + * 申请说明 + */ + private String buyerDesc; + + /** + * 联系方式(退款时留下的手机号码) + */ + private String buyerMobile; + + /** + * 文件凭证(逗号隔开) + */ + private String imgUrls; + + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 订单更新时间 + */ + private Date updateTime; + + /** + * 超时时间(超过该时间不处理,系统将自动处理)(保留字段) + */ + private Date overTime; + + /** + * 拒绝原因 + */ + private String rejectMessage; + + /** + * 卖家备注 + */ + private String sellerMsg; + + /** + * 受理时间 + */ + private Date handelTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 收货时间 + */ + private Date receiveTime; + + /** + * 关闭时间 + */ + private Date closeTime; + + /** + * 确定时间(确定退款时间) + */ + private Date decisionTime; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 移交供应商时间 + */ + private Date supplierTime; + + /** + * 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + */ + private Integer supplierHandleStatus; + /** + * 采购退款金额 + */ + private Long purchaseRefundAmount; + /** + * 采购的平台佣金退款金额 + */ + private Long purPlatformRefundCommission; + + /** + * 订单类型 0普通订单 1团购订单 2秒杀订单 3积分订单 + */ + private Integer orderType; + + /** + * 店铺名称 + */ + private String shopName; + /** + * 订单运费 + */ + private Long freightAmount; + /** + * 是否待采购 1.是 0.否 2.已处理 + */ + private Long waitPurchase; + + /** + * 退款订单状态 + */ + private Integer orderStatus; + + /** + * 平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功 + */ + private Integer platformInterventionStatus; + + /** + * 用户申请介入理由 + */ + private String applyInterventionReason; + + /** + * 用户申请介入凭证 + */ + private String applyInterventionImgUrls; + + /** + * 平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款 + */ + private Integer interventionRefundType; + + /** + * 平台介入前的退款金额 + */ + private Long afterInterventionRefundAmount; + + /** + * 平台留言 + */ + private String platformMessage; + + /** + * 申请介入时间 + */ + private Date applyInterventionTime; + + /** + * 介入完成时间 + */ + private Date interventionFinishTime; + /** + * 退款订单项 + * @return + */ + private List orderItems; + + public Integer getPlatformInterventionStatus() { + return platformInterventionStatus; + } + + public void setPlatformInterventionStatus(Integer platformInterventionStatus) { + this.platformInterventionStatus = platformInterventionStatus; + } + + public String getApplyInterventionReason() { + return applyInterventionReason; + } + + public void setApplyInterventionReason(String applyInterventionReason) { + this.applyInterventionReason = applyInterventionReason; + } + + public String getApplyInterventionImgUrls() { + return applyInterventionImgUrls; + } + + public void setApplyInterventionImgUrls(String applyInterventionImgUrls) { + this.applyInterventionImgUrls = applyInterventionImgUrls; + } + + public Integer getInterventionRefundType() { + return interventionRefundType; + } + + public void setInterventionRefundType(Integer interventionRefundType) { + this.interventionRefundType = interventionRefundType; + } + + public Long getAfterInterventionRefundAmount() { + return afterInterventionRefundAmount; + } + + public void setAfterInterventionRefundAmount(Long afterInterventionRefundAmount) { + this.afterInterventionRefundAmount = afterInterventionRefundAmount; + } + + public String getPlatformMessage() { + return platformMessage; + } + + public void setPlatformMessage(String platformMessage) { + this.platformMessage = platformMessage; + } + + public Date getApplyInterventionTime() { + return applyInterventionTime; + } + + public void setApplyInterventionTime(Date applyInterventionTime) { + this.applyInterventionTime = applyInterventionTime; + } + + public Date getInterventionFinishTime() { + return interventionFinishTime; + } + + public void setInterventionFinishTime(Date interventionFinishTime) { + this.interventionFinishTime = interventionFinishTime; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public Long getPlatformRefundCommission() { + return platformRefundCommission; + } + + public void setPlatformRefundCommission(Long platformRefundCommission) { + this.platformRefundCommission = platformRefundCommission; + } + + public Long getDistributionTotalAmount() { + return distributionTotalAmount; + } + + public void setDistributionTotalAmount(Long distributionTotalAmount) { + this.distributionTotalAmount = distributionTotalAmount; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Date getOverTime() { + return overTime; + } + + public void setOverTime(Date overTime) { + this.overTime = overTime; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Date getHandelTime() { + return handelTime; + } + + public void setHandelTime(Date handelTime) { + this.handelTime = handelTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getCloseTime() { + return closeTime; + } + + public void setCloseTime(Date closeTime) { + this.closeTime = closeTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Date getSupplierTime() { + return supplierTime; + } + + public void setSupplierTime(Date supplierTime) { + this.supplierTime = supplierTime; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getPurchaseRefundAmount() { + return purchaseRefundAmount; + } + + public void setPurchaseRefundAmount(Long purchaseRefundAmount) { + this.purchaseRefundAmount = purchaseRefundAmount; + } + + public Long getPurPlatformRefundCommission() { + return purPlatformRefundCommission; + } + + public void setPurPlatformRefundCommission(Long purPlatformRefundCommission) { + this.purPlatformRefundCommission = purPlatformRefundCommission; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Long waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "EsOrderRefundBO{" + + "refundId=" + refundId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", userId=" + userId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundCount=" + refundCount + + ", refundScore=" + refundScore + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", platformRefundCommission=" + platformRefundCommission + + ", distributionTotalAmount=" + distributionTotalAmount + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", closeType=" + closeType + + ", returnMoneySts=" + returnMoneySts + + ", buyerReason=" + buyerReason + + ", buyerDesc='" + buyerDesc + '\'' + + ", buyerMobile='" + buyerMobile + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", overTime=" + overTime + + ", rejectMessage='" + rejectMessage + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + ", handelTime=" + handelTime + + ", deliveryTime=" + deliveryTime + + ", receiveTime=" + receiveTime + + ", closeTime=" + closeTime + + ", decisionTime=" + decisionTime + + ", refundTime=" + refundTime + + ", supplierTime=" + supplierTime + + ", supplierHandleStatus=" + supplierHandleStatus + + ", purchaseRefundAmount=" + purchaseRefundAmount + + ", purPlatformRefundCommission=" + purPlatformRefundCommission + + ", orderType=" + orderType + + ", shopName='" + shopName + '\'' + + ", freightAmount=" + freightAmount + + ", waitPurchase=" + waitPurchase + + ", orderStatus=" + orderStatus + + ", platformInterventionStatus=" + platformInterventionStatus + + ", applyInterventionReason='" + applyInterventionReason + '\'' + + ", applyInterventionImgUrls='" + applyInterventionImgUrls + '\'' + + ", interventionRefundType=" + interventionRefundType + + ", afterInterventionRefundAmount=" + afterInterventionRefundAmount + + ", platformMessage='" + platformMessage + '\'' + + ", applyInterventionTime=" + applyInterventionTime + + ", interventionFinishTime=" + interventionFinishTime + + ", orderItems=" + orderItems + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsPurchaseOrderBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsPurchaseOrderBO.java new file mode 100644 index 0000000..fdcbdbc --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/EsPurchaseOrderBO.java @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 采购订单信息 + * + * @author YXF + * @date 20222-09-20 + */ +public class EsPurchaseOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 采购id + */ + private Long purchaseOrderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 订单更新时间 + */ + private Date updateTime; + + /** + * 送达时间 + */ + private Date deliverTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 总采购金额 + */ + private Double totalAmount; + + /** + * 总采购库存数量 + */ + private Integer totalStock; + + /** + * 实际总库存数量 + */ + private Integer actualTotalStock; + + /** + * 状态 0:已作废 1:待入库 2:已发货 3.部分入库 4:待付款 5:已完成 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 操作员工id + */ + private Long employeeId; + + /** + * 配送类型 1:快递 2:自提 3:无需快递 4同城配送 + */ + private Integer deliveryType; + + /** + * 收货人姓名 + */ + private String consignee; + + /** + * 收货人手机号 + */ + private String mobile; + + /** + * 商品名称 + */ + private String spuName; + + /** + * 商品中文名称 + */ + private String spuNameZh; + + /** + * 商品英文名称 + */ + private String spuNameEn; + + /** + * 付款凭证图片 多个图片逗号分隔 + */ + private String voucherImgUrls; + + @Schema(description = "采购订单项列表") + private List purchaseOrderItems; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 供应商仓库id + */ + private Long supplierWarehouseId; + + /** + * 库存点类型 + */ + private Integer stockPointType; + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getDeliverTime() { + return deliverTime; + } + + public void setDeliverTime(Date deliverTime) { + this.deliverTime = deliverTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Double getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Double totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getActualTotalStock() { + return actualTotalStock; + } + + public void setActualTotalStock(Integer actualTotalStock) { + this.actualTotalStock = actualTotalStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public List getPurchaseOrderItems() { + return purchaseOrderItems; + } + + public void setPurchaseOrderItems(List purchaseOrderItems) { + this.purchaseOrderItems = purchaseOrderItems; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getVoucherImgUrls() { + return voucherImgUrls; + } + + public void setVoucherImgUrls(String voucherImgUrls) { + this.voucherImgUrls = voucherImgUrls; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getSupplierWarehouseId() { + return supplierWarehouseId; + } + + public void setSupplierWarehouseId(Long supplierWarehouseId) { + this.supplierWarehouseId = supplierWarehouseId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "EsPurchaseOrderBO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deliverTime=" + deliverTime + + ", deliveryTime=" + deliveryTime + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", totalAmount=" + totalAmount + + ", totalStock=" + totalStock + + ", actualTotalStock=" + actualTotalStock + + ", status=" + status + + ", remark='" + remark + '\'' + + ", employeeId=" + employeeId + + ", deliveryType=" + deliveryType + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", spuName='" + spuName + '\'' + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", voucherImgUrls='" + voucherImgUrls + '\'' + + ", purchaseOrderItems=" + purchaseOrderItems + + ", warehouseId=" + warehouseId + + ", supplierWarehouseId=" + supplierWarehouseId + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/RefundAmountWithOrderIdBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/RefundAmountWithOrderIdBO.java new file mode 100644 index 0000000..ffa132e --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/RefundAmountWithOrderIdBO.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2021/1/13 + */ +public class RefundAmountWithOrderIdBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderId; + + private Long refundAmount; + + private Long platformRefundAmount; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + @Override + public String toString() { + return "RefundAmountWithOrderIdBO{" + + "orderId=" + orderId + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/UserScoreLogOrderBO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/UserScoreLogOrderBO.java new file mode 100644 index 0000000..dc90f15 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/bo/UserScoreLogOrderBO.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author cdt + * @date 2021/05/08 + */ +public class UserScoreLogOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单号 + */ + private Long orderId; + + /** + * 积分订单总价 + */ + private Long actualTotal; + + /** + * 积分商品单价 + */ + private Long scoreFee; + + /** + * 积分商品数量 + */ + private Integer allCount; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + @Override + public String toString() { + return "UserScoreLogOrderBO{" + + "orderId=" + orderId + + ", actualTotal=" + actualTotal + + ", scoreFee=" + scoreFee + + ", allCount=" + allCount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/FinanceType.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/FinanceType.java new file mode 100644 index 0000000..ca523a9 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/FinanceType.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +/** + * 财务明细类型 1.订单&退款 2.余额充值 3.会员购买 + * @author TRACK + */ +public enum FinanceType { + /** + * 订单&退款 + */ + ORDER(1, "订单"), + /** + * 余额充值 + */ + RECHARGE(2, "余额充值"), + + /** + * 会员购买 + */ + LEVEL(3, "会员购买"); + + private final Integer num; + private final String str; + + FinanceType(Integer num, String str) { + this.num = num; + this.str = str; + } + + public Integer value() { + return num; + } + + public String str() { + return str; + } + + public static FinanceType instance(Integer value) { + FinanceType[] enums = values(); + for (FinanceType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/OrderDeleteStatus.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/OrderDeleteStatus.java new file mode 100644 index 0000000..1c9daf3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/OrderDeleteStatus.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +/** + * 订单状态 + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public enum OrderDeleteStatus { + + /** + * 没有删除 + */ + NOT_DELETE(0), + + /** + * 回收站 + */ + RECYCLE_BIN(1), + + /** + * 永久删除 + */ + DELETE(2); + + + private final Integer num; + + public Integer value() { + return num; + } + + + OrderDeleteStatus(Integer num) { + this.num = num; + } + + public static OrderDeleteStatus instance(Integer value) { + OrderDeleteStatus[] enums = values(); + for (OrderDeleteStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/PreSalePayStatus.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/PreSalePayStatus.java new file mode 100644 index 0000000..d98ff91 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/PreSalePayStatus.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +/** + * 定金预售支付状态 1.已支付定金 2.已支付尾款 + * @author lhd + * @date 2022/08/26 + */ +public enum PreSalePayStatus { + + /** + * 已支付定金 + */ + PAYED_DEPOSIT(1), + + /** + * 已支付尾款 + */ + PAYED_BALANCE(2); + + private final Integer num; + + public Integer value() { + return num; + } + + PreSalePayStatus(Integer num) { + this.num = num; + } + + public static PreSalePayStatus instance(Integer value) { + PreSalePayStatus[] enums = values(); + for (PreSalePayStatus typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/PurchaseOrderWaitStatus.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/PurchaseOrderWaitStatus.java new file mode 100644 index 0000000..5304f5c --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/PurchaseOrderWaitStatus.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +/** + * 订单状态 + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public enum PurchaseOrderWaitStatus { + + /** + * 无需采购 + */ + NOT_PURCHASE(0), + /** + * 待采购 + */ + WAIT_PURCHASE(1), + + /** + * 采购完成 + */ + PURCHASED(2); + + private final Integer num; + + public Integer value() { + return num; + } + + PurchaseOrderWaitStatus(Integer num) { + this.num = num; + } + + public static PurchaseOrderWaitStatus instance(Integer value) { + PurchaseOrderWaitStatus[] enums = values(); + for (PurchaseOrderWaitStatus typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/RetainedType.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/RetainedType.java new file mode 100644 index 0000000..f341fed --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/RetainedType.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +/** + * 留存类型 1访问留存 2成交留存 + * @author cl + * @date 2021-05-31 11:01:18 + */ +public enum RetainedType { + + /** + * 访问留存 + */ + VISIT_RETAINED(1), + + /** + * 成交留存 + */ + TRADE_RETAINED(2); + + private final Integer num; + + public Integer value() { + return num; + } + + RetainedType(Integer num) { + this.num = num; + } + + public static RetainedType instance(Integer value) { + RetainedType[] enums = values(); + for (RetainedType typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/ShopCityStatus.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/ShopCityStatus.java new file mode 100644 index 0000000..84c401b --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/constant/ShopCityStatus.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.constant; + +/* + 同城配送状态 + */ + +/** + * @author Yami + */ +public enum ShopCityStatus { + + /** + * 起送费不够 + */ + INSUFFICIENT_DELIVERY_FEE(-3), + /** + * 商家没有配置同城配送信息 + */ + NO_CONFIG(-2), + + /** + * 不在范围内 + */ + OUT_OF_RANGE(-1), + + /** + * 可用 + */ + USABLE(1); + + private final Integer num; + + public Integer value() { + return num; + } + + ShopCityStatus(Integer num) { + this.num = num; + } + + public static ShopCityStatus instance(Integer value) { + ShopCityStatus[] enums = values(); + for (ShopCityStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/CustomerRetainedDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/CustomerRetainedDTO.java new file mode 100644 index 0000000..756a09e --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/CustomerRetainedDTO.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author cl + * @date 2021-05-22 14:28:43 + */ +public class CustomerRetainedDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 时间类型 1最近1个月 2最近3个月 3最近6个月 4最近1年 + * RetainedDateType + */ + @Schema(description = "时间类型 1最近三个月 2最近六个月 3最近一年") + private Integer dateType; + + @Schema(description = "留存类型 1访问留存 2成交留存") + private Integer retainType; + /** + * 1月留存 2周留存 + */ + @Schema(description = "1月留存 2周留存,暂时不统计周留存") + private Integer dateRetainType; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + /** + * 时间 + */ + @Schema(description = "不传字段") + private Date dateTime; + /** + * 店铺id + */ + @Schema(description = "不传字段") + private Long shopId; + + /** + * 第三方系统id 1:微信小程序 + */ + @Schema(description = "不传字段") + private Integer appId; + + public CustomerRetainedDTO() { + } + + public CustomerRetainedDTO(Date startTime, Date endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Integer getRetainType() { + return retainType; + } + + public void setRetainType(Integer retainType) { + this.retainType = retainType; + } + + public Integer getDateRetainType() { + return dateRetainType; + } + + public void setDateRetainType(Integer dateRetainType) { + this.dateRetainType = dateRetainType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getDateTime() { + return dateTime; + } + + public void setDateTime(Date dateTime) { + this.dateTime = dateTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getAppId() { + return appId; + } + + public void setAppId(Integer appId) { + this.appId = appId; + } + + @Override + public String toString() { + return "CustomerRetainedDTO{" + + "dateType=" + dateType + + ", retainType=" + retainType + + ", dateRetainType=" + dateRetainType + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", dateTime=" + dateTime + + ", shopId=" + shopId + + ", appId=" + appId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/FormExcelDTO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/FormExcelDTO.java new file mode 100644 index 0000000..86bbfe0 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/dto/FormExcelDTO.java @@ -0,0 +1,252 @@ +package com.tmerclub.cloud.api.order.dto; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author TRACK + */ +public class FormExcelDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 时间(报表中显示的时间字符串) + */ + private String formatTime; + + /** + * 总金额 + */ + private Long totalTransactionAmount; + + /** + * 下单金额 + */ + private Long orderAmount; + /** + * 下单笔数 + */ + private Integer orderNums; + + /** + * 下单商品数 + */ + private Integer productNums; + + /** + * 下单人数 + */ + private Integer userNums; + + /** + * 自营金额 + */ + private Long selfOperatedAmount; + + /** + * 自营订单数 + */ + private Integer selfOperatedOrderNums; + + /** + * 自营商品数 + */ + private Integer selfOperatedProductNums; + + /** + * 自营下单人数 + */ + private Integer selfOperatedUserNums; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 支付订单数 + */ + private Integer payOrderNums; + + /** + * 支付商品数 + */ + private Integer payProductNums; + + /** + * 支付人数 + */ + private Integer payUserNums; + + /** + * 退款金额 + */ + private Long refundAmount; + /** + * 退款订单数 + */ + private Integer refundOrderNums; + + /** + * 平台补贴金额 + */ + private Long platformAmount; + + public String getFormatTime() { + return formatTime; + } + + public void setFormatTime(String formatTime) { + this.formatTime = formatTime; + } + + public Long getTotalTransactionAmount() { + return totalTransactionAmount; + } + + public void setTotalTransactionAmount(Long totalTransactionAmount) { + this.totalTransactionAmount = totalTransactionAmount; + } + + public Long getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(Long orderAmount) { + this.orderAmount = orderAmount; + } + + public Integer getOrderNums() { + return orderNums; + } + + public void setOrderNums(Integer orderNums) { + this.orderNums = orderNums; + } + + public Integer getProductNums() { + return productNums; + } + + public void setProductNums(Integer productNums) { + this.productNums = productNums; + } + + public Integer getUserNums() { + return userNums; + } + + public void setUserNums(Integer userNums) { + this.userNums = userNums; + } + + public Long getSelfOperatedAmount() { + return selfOperatedAmount; + } + + public void setSelfOperatedAmount(Long selfOperatedAmount) { + this.selfOperatedAmount = selfOperatedAmount; + } + + public Integer getSelfOperatedOrderNums() { + return selfOperatedOrderNums; + } + + public void setSelfOperatedOrderNums(Integer selfOperatedOrderNums) { + this.selfOperatedOrderNums = selfOperatedOrderNums; + } + + public Integer getSelfOperatedProductNums() { + return selfOperatedProductNums; + } + + public void setSelfOperatedProductNums(Integer selfOperatedProductNums) { + this.selfOperatedProductNums = selfOperatedProductNums; + } + + public Integer getSelfOperatedUserNums() { + return selfOperatedUserNums; + } + + public void setSelfOperatedUserNums(Integer selfOperatedUserNums) { + this.selfOperatedUserNums = selfOperatedUserNums; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getPayOrderNums() { + return payOrderNums; + } + + public void setPayOrderNums(Integer payOrderNums) { + this.payOrderNums = payOrderNums; + } + + public Integer getPayProductNums() { + return payProductNums; + } + + public void setPayProductNums(Integer payProductNums) { + this.payProductNums = payProductNums; + } + + public Integer getPayUserNums() { + return payUserNums; + } + + public void setPayUserNums(Integer payUserNums) { + this.payUserNums = payUserNums; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getRefundOrderNums() { + return refundOrderNums; + } + + public void setRefundOrderNums(Integer refundOrderNums) { + this.refundOrderNums = refundOrderNums; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + @Override + public String toString() { + return "FormExcelDTO{" + + "formatTime='" + formatTime + '\'' + + ", totalTransactionAmount=" + totalTransactionAmount + + ", orderAmount=" + orderAmount + + ", platformAmount=" + platformAmount + + ", orderNums=" + orderNums + + ", productNums=" + productNums + + ", userNums=" + userNums + + ", selfOperatedAmount=" + selfOperatedAmount + + ", selfOperatedOrderNums=" + selfOperatedOrderNums + + ", selfOperatedProductNums=" + selfOperatedProductNums + + ", selfOperatedUserNums=" + selfOperatedUserNums + + ", payAmount=" + payAmount + + ", payOrderNums=" + payOrderNums + + ", payProductNums=" + payProductNums + + ", payUserNums=" + payUserNums + + ", refundAmount=" + refundAmount + + ", refundOrderNums=" + refundOrderNums + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderAddrFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderAddrFeignClient.java new file mode 100644 index 0000000..f88d798 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderAddrFeignClient.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @Author lth + * @Date 2021/11/22 9:20 + */ +public interface OrderAddrFeignClient { + + /** + * 根据订单id获取订单地址 + * @param orderId + * @return + */ + ServerResponseEntity getOrderAddrByOrderId(Long orderId); +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderSettlementFeignClient.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderSettlementFeignClient.java new file mode 100644 index 0000000..19dd54a --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/feign/OrderSettlementFeignClient.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.feign; + +import com.tmerclub.cloud.api.order.vo.OrderSettlementPayVO; +import com.tmerclub.cloud.api.order.vo.OrderSettlementSimpleVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/7/14 13:21 + */ +public interface OrderSettlementFeignClient { + + /** + * 根据支付单号列表获取订单号列表 + * @param payIds + * @param userId + * @return + */ + ServerResponseEntity> listOrderIdsByPayIds(Long userId, List payIds); + + /** + * 根据订单号获取支付号 + * @param orderId + * @return + */ + ServerResponseEntity getPayIdByOrderId(Long orderId); + +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/AccountOrderDetailVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/AccountOrderDetailVO.java new file mode 100644 index 0000000..4d4f910 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/AccountOrderDetailVO.java @@ -0,0 +1,91 @@ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class AccountOrderDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分") + private Long scoreCount; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "实付金额") + private Long actualTotal; + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + @Override + public String toString() { + return "AccountOrderDetailVO{" + + "wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", payType=" + payType + + ", actualTotal=" + actualTotal + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FormExcelParamVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FormExcelParamVO.java new file mode 100644 index 0000000..fcf96e2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/FormExcelParamVO.java @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * @author TRACK + */ +public class FormExcelParamVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺ID + */ + private Long shopId; + + + /** + * 时间周期 1:天 2:周 3:月 + */ + private Integer timeType; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 时间范围 1:近1天 2:近7天 3: 近30天 + */ + private Integer timeRange; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 下单金额 + */ + private Boolean orderAmount; + /** + * 下单笔数 + */ + private Boolean orderNums; + + /** + * 下单商品数 + */ + private Boolean productNums; + + /** + * 下单人数 + */ + private Boolean userNums; + + /** + * 自营金额 + */ + private Boolean selfOperatedAmount; + + /** + * 自营订单数 + */ + private Boolean selfOperatedOrderNums; + + /** + * 自营商品数 + */ + private Boolean selfOperatedProductNums; + + /** + * 自营下单人数 + */ + private Boolean selfOperatedUserNums; + + /** + * 支付金额 + */ + private Boolean payAmount; + + /** + * 支付订单数 + */ + private Boolean payOrderNums; + + /** + * 支付商品数 + */ + private Boolean payProductNums; + + /** + * 支付人数 + */ + private Boolean payUserNums; + + /** + * 退款金额 + */ + private Boolean refundAmount; + /** + * 退款订单数 + */ + private Boolean refundOrderNums; + + /** + * 报表项名称数组 + */ + private Set formItemNames; + + /** + * 报表项id集合 + */ + private List formItemIdList; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getTimeType() { + return timeType; + } + + public void setTimeType(Integer timeType) { + this.timeType = timeType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getTimeRange() { + return timeRange; + } + + public void setTimeRange(Integer timeRange) { + this.timeRange = timeRange; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Boolean getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(Boolean orderAmount) { + this.orderAmount = orderAmount; + } + + public Boolean getOrderNums() { + return orderNums; + } + + public void setOrderNums(Boolean orderNums) { + this.orderNums = orderNums; + } + + public Boolean getProductNums() { + return productNums; + } + + public void setProductNums(Boolean productNums) { + this.productNums = productNums; + } + + public Boolean getUserNums() { + return userNums; + } + + public void setUserNums(Boolean userNums) { + this.userNums = userNums; + } + + public Boolean getSelfOperatedAmount() { + return selfOperatedAmount; + } + + public void setSelfOperatedAmount(Boolean selfOperatedAmount) { + this.selfOperatedAmount = selfOperatedAmount; + } + + public Boolean getSelfOperatedOrderNums() { + return selfOperatedOrderNums; + } + + public void setSelfOperatedOrderNums(Boolean selfOperatedOrderNums) { + this.selfOperatedOrderNums = selfOperatedOrderNums; + } + + public Boolean getSelfOperatedProductNums() { + return selfOperatedProductNums; + } + + public void setSelfOperatedProductNums(Boolean selfOperatedProductNums) { + this.selfOperatedProductNums = selfOperatedProductNums; + } + + public Boolean getSelfOperatedUserNums() { + return selfOperatedUserNums; + } + + public void setSelfOperatedUserNums(Boolean selfOperatedUserNums) { + this.selfOperatedUserNums = selfOperatedUserNums; + } + + public Boolean getPayAmount() { + return payAmount; + } + + public void setPayAmount(Boolean payAmount) { + this.payAmount = payAmount; + } + + public Boolean getPayOrderNums() { + return payOrderNums; + } + + public void setPayOrderNums(Boolean payOrderNums) { + this.payOrderNums = payOrderNums; + } + + public Boolean getPayProductNums() { + return payProductNums; + } + + public void setPayProductNums(Boolean payProductNums) { + this.payProductNums = payProductNums; + } + + public Boolean getPayUserNums() { + return payUserNums; + } + + public void setPayUserNums(Boolean payUserNums) { + this.payUserNums = payUserNums; + } + + public Boolean getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Boolean refundAmount) { + this.refundAmount = refundAmount; + } + + public Boolean getRefundOrderNums() { + return refundOrderNums; + } + + public void setRefundOrderNums(Boolean refundOrderNums) { + this.refundOrderNums = refundOrderNums; + } + + public Set getFormItemNames() { + return formItemNames; + } + + public void setFormItemNames(Set formItemNames) { + this.formItemNames = formItemNames; + } + + public List getFormItemIdList() { + return formItemIdList; + } + + public void setFormItemIdList(List formItemIdList) { + this.formItemIdList = formItemIdList; + } + + @Override + public String toString() { + return "FormExcelParamVO{" + + "shopId=" + shopId + + ", timeType=" + timeType + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", timeRange=" + timeRange + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", orderAmount=" + orderAmount + + ", orderNums=" + orderNums + + ", productNums=" + productNums + + ", userNums=" + userNums + + ", selfOperatedAmount=" + selfOperatedAmount + + ", selfOperatedOrderNums=" + selfOperatedOrderNums + + ", selfOperatedProductNums=" + selfOperatedProductNums + + ", selfOperatedUserNums=" + selfOperatedUserNums + + ", payAmount=" + payAmount + + ", payOrderNums=" + payOrderNums + + ", payProductNums=" + payProductNums + + ", payUserNums=" + payUserNums + + ", refundAmount=" + refundAmount + + ", refundOrderNums=" + refundOrderNums + + ", formItemNames=" + formItemNames + + ", formItemIdList=" + formItemIdList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderAmountVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderAmountVO.java new file mode 100644 index 0000000..76884c6 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderAmountVO.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/25 + */ +public class OrderAmountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 实付金额 + */ + private Long actualTotal; + + /** + * 定金金额 + */ + private Long depositAmount; + + /** + * 支付积分 + */ + private Long payScore; + /** + * 收款的店铺id和金额 + */ + private List shopAmountList; + + public List getShopAmountList() { + return shopAmountList; + } + + public void setShopAmountList(List shopAmountList) { + this.shopAmountList = shopAmountList; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Long getPayScore() { + return payScore; + } + + public void setPayScore(Long payScore) { + this.payScore = payScore; + } + + @Override + public String toString() { + return "OrderAmountVO{" + + "payAmount=" + payAmount + + ", actualTotal=" + actualTotal + + ", depositAmount=" + depositAmount + + ", payScore=" + payScore + + ", shopAmountList=" + shopAmountList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundAddrVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundAddrVO.java new file mode 100644 index 0000000..0cb4bf0 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundAddrVO.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户退货物流地址VO + * + * @author FrozenWatermelon + * @date 2021-03-09 13:44:31 + */ +public class OrderRefundAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "物流ID") + private Long refundAddrId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "退款号") + private Long refundId; + + @Schema(description = "买家ID") + private Long userId; + + @Schema(description = "物流公司ID") + private Long deliveryCompanyId; + + @Schema(description = "物流公司名称") + private String deliveryName; + + @Schema(description = "物流单号") + private String deliveryNo; + + @Schema(description = "收件人姓名") + private String consigneeName; + + @Schema(description = "收件人电话(顺丰快递需要)") + private String consigneeMobile; + + @Schema(description = "收件人座机") + private String consigneeTelephone; + + @Schema(description = "收件人邮政编码") + private String consigneePostCode; + + @Schema(description = "收件人地址") + private String consigneeAddr; + + @Schema(description = "发送人手机号码") + private String senderMobile; + + @Schema(description = "买家备注") + private String senderRemarks; + + @Schema(description = "图片凭证") + private String imgs; + + public Long getRefundAddrId() { + return refundAddrId; + } + + public void setRefundAddrId(Long refundAddrId) { + this.refundAddrId = refundAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryName() { + return deliveryName; + } + + public void setDeliveryName(String deliveryName) { + this.deliveryName = deliveryName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getConsigneeMobile() { + return consigneeMobile; + } + + public void setConsigneeMobile(String consigneeMobile) { + this.consigneeMobile = consigneeMobile; + } + + public String getConsigneeTelephone() { + return consigneeTelephone; + } + + public void setConsigneeTelephone(String consigneeTelephone) { + this.consigneeTelephone = consigneeTelephone; + } + + public String getConsigneePostCode() { + return consigneePostCode; + } + + public void setConsigneePostCode(String consigneePostCode) { + this.consigneePostCode = consigneePostCode; + } + + public String getConsigneeAddr() { + return consigneeAddr; + } + + public void setConsigneeAddr(String consigneeAddr) { + this.consigneeAddr = consigneeAddr; + } + + public String getSenderMobile() { + return senderMobile; + } + + public void setSenderMobile(String senderMobile) { + this.senderMobile = senderMobile; + } + + public String getSenderRemarks() { + return senderRemarks; + } + + public void setSenderRemarks(String senderRemarks) { + this.senderRemarks = senderRemarks; + } + + public String getImgs() { + return imgs; + } + + public void setImgs(String imgs) { + this.imgs = imgs; + } + + @Override + public String toString() { + return "OrderRefundAddrVO{" + + "refundAddrId=" + refundAddrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",refundId=" + refundId + + ",userId=" + userId + + ",deliveryCompanyId=" + deliveryCompanyId + + ",deliveryName=" + deliveryName + + ",deliveryNo=" + deliveryNo + + ",consigneeName=" + consigneeName + + ",consigneeMobile=" + consigneeMobile + + ",consigneeTelephone=" + consigneeTelephone + + ",consigneePostCode=" + consigneePostCode + + ",consigneeAddr=" + consigneeAddr + + ",senderMobile=" + senderMobile + + ",senderRemarks=" + senderRemarks + + ",imgs=" + imgs + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundInfoVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundInfoVO.java new file mode 100644 index 0000000..c6d1afb --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundInfoVO.java @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 退款信息VO + * + * @author FrozenWatermelon + * @date 2021-03-15 15:26:03 + */ +public class OrderRefundInfoVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "关联的支付订单id") + private Long orderId; + + @Schema(description = "关联的支付单id") + private Long payId; + + @Schema(description = "回调时间") + private Date callbackTime; + + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "退款时间") + private Date refundTime; + + @Schema(description = "退款入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long refundAmount; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Date getCallbackTime() { + return callbackTime; + } + + public void setCallbackTime(Date callbackTime) { + this.callbackTime = callbackTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + @Override + public String toString() { + return "OrderRefundInfoVO{" + + "refundId=" + refundId + + ", orderId=" + orderId + + ", payId=" + payId + + ", callbackTime=" + callbackTime + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", refundTime=" + refundTime + + ", payEntry=" + payEntry + + ", payType=" + payType + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", refundAmount=" + refundAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundProdEffectRespVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundProdEffectRespVO.java new file mode 100644 index 0000000..129adb3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundProdEffectRespVO.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Pineapple + * @date 2021/5/21 16:06 + */ +public class OrderRefundProdEffectRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + @Schema(description = "商品id") + private Long spuId; + /** + * 申请退款订单数 + */ + @Schema(description = "申请退款订单数") + private Integer refundNum; + + /** + * 申请退款人数 + */ + @Schema(description = "申请退款人数") + private Integer refundPerson; + /** + * 成功退款订单数 + */ + @Schema(description = "成功退款订单数") + private Integer refundSuccessNum; + /** + * 成功退款人数 + */ + @Schema(description = "成功退款人数") + private Integer refundSuccessPerson; + /** + * 成功退款金额 + */ + @Schema(description = "成功退款金额") + private Double refundSuccessAmount; + /** + * 退款率 + */ + @Schema(description = "退款率") + private Double refundSuccessRate; + + public OrderRefundProdEffectRespVO() { + } + + public OrderRefundProdEffectRespVO(Long spuId, Integer refundNum, Integer refundPerson, Integer refundSuccessNum, Integer refundSuccessPerson, Double refundSuccessAmount, Double refundSuccessRate) { + this.spuId = spuId; + this.refundNum = refundNum; + this.refundPerson = refundPerson; + this.refundSuccessNum = refundSuccessNum; + this.refundSuccessPerson = refundSuccessPerson; + this.refundSuccessAmount = refundSuccessAmount; + this.refundSuccessRate = refundSuccessRate; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getRefundNum() { + return refundNum; + } + + public void setRefundNum(Integer refundNum) { + this.refundNum = refundNum; + } + + public Integer getRefundPerson() { + return refundPerson; + } + + public void setRefundPerson(Integer refundPerson) { + this.refundPerson = refundPerson; + } + + public Integer getRefundSuccessNum() { + return refundSuccessNum; + } + + public void setRefundSuccessNum(Integer refundSuccessNum) { + this.refundSuccessNum = refundSuccessNum; + } + + public Integer getRefundSuccessPerson() { + return refundSuccessPerson; + } + + public void setRefundSuccessPerson(Integer refundSuccessPerson) { + this.refundSuccessPerson = refundSuccessPerson; + } + + public Double getRefundSuccessAmount() { + return refundSuccessAmount; + } + + public void setRefundSuccessAmount(Double refundSuccessAmount) { + this.refundSuccessAmount = refundSuccessAmount; + } + + public Double getRefundSuccessRate() { + return refundSuccessRate; + } + + public void setRefundSuccessRate(Double refundSuccessRate) { + this.refundSuccessRate = refundSuccessRate; + } + + @Override + public String toString() { + return "OrderRefundProdEffectRespVO{" + + ", spuId" + spuId + + ", refundNum=" + refundNum + + ", refundPerson=" + refundPerson + + ", refundSuccessNum=" + refundSuccessNum + + ", refundSuccessPerson=" + refundSuccessPerson + + ", refundSuccessAmount=" + refundSuccessAmount + + ", refundSuccessRate=" + refundSuccessRate + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundVO.java new file mode 100644 index 0000000..b931043 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderRefundVO.java @@ -0,0 +1,515 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import com.tmerclub.cloud.common.order.vo.RefundOrderItemVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单退款记录信息VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderRefundVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "记录ID") + private Long refundId; + + @Schema(description = "支付系统 0默认1通联") + private Integer paySysType; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "买家ID") + private Long userId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "订单项ID(0:为全部订单项)") + private Long orderItemId; + + @Schema(description = "退货数量(0:为全部订单项)") + private Integer refundCount; + + @Schema(description = "退还积分") + private Long refundScore; + + @Schema(description = "退款金额") + private Long refundAmount; + + @Schema(description = "平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)") + private Long platformRefundAmount; + + @Schema(description = "退款单总分销金额") + private Long distributionTotalAmount; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)") + private Integer refundType; + + @Schema(description = "申请类型:1,仅退款,2退款退货") + private Integer applyType; + + @Schema(description = "是否接收到商品(1:已收到,0:未收到)") + private Integer isReceived; + + @Schema(description = "退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)") + private Integer closeType; + + @Schema(description = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType") + private Integer returnMoneySts; + + @Schema(description = "申请原因") + private Integer buyerReason; + + @Schema(description = "申请原因 中文描述") + private String buyerReasonValue; + + @Schema(description = "申请说明") + private String buyerDesc; + + @Schema(description = "联系方式(退款时留下的手机号码)") + private String buyerMobile; + + @Schema(description = "文件凭证(逗号隔开)") + private String imgUrls; + + @Schema(description = "超时时间(超过该时间不处理,系统将自动处理)(保留字段)") + private Date overTime; + + @Schema(description = "拒绝原因") + private String rejectMessage; + + @Schema(description = "卖家备注") + private String sellerMsg; + + @Schema(description = "受理时间") + private Date handelTime; + + @Schema(description = "发货时间") + private Date deliveryTime; + + @Schema(description = "收货时间") + private Date receiveTime; + + @Schema(description = "关闭时间") + private Date closeTime; + + @Schema(description = "确定时间(确定退款时间)") + private Date decisionTime; + + @Schema(description = "退款时间") + private Date refundTime; + + @Schema(description = "付款时间") + private Date payTime; + + @Schema(description = "订单实付金额") + private Long actualTotal; + + @Schema(description = "订单实付积分") + private Long orderScore; + + @Schema(description = "订单状态") + private Integer orderStatus; + + @Schema(description = "退款状态") + private Integer refundStatus; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "支付的时候,支付id") + private Long payId; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "订单项") + private List orderItems; + + @Schema(description = "退款地址信息") + private OrderRefundAddrVO orderRefundAddr; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public Long getDistributionTotalAmount() { + return distributionTotalAmount; + } + + public void setDistributionTotalAmount(Long distributionTotalAmount) { + this.distributionTotalAmount = distributionTotalAmount; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Date getOverTime() { + return overTime; + } + + public void setOverTime(Date overTime) { + this.overTime = overTime; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Date getHandelTime() { + return handelTime; + } + + public void setHandelTime(Date handelTime) { + this.handelTime = handelTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getCloseTime() { + return closeTime; + } + + public void setCloseTime(Date closeTime) { + this.closeTime = closeTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public String getBuyerReasonValue() { + return buyerReasonValue; + } + + public void setBuyerReasonValue(String buyerReasonValue) { + this.buyerReasonValue = buyerReasonValue; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public OrderRefundAddrVO getOrderRefundAddr() { + return orderRefundAddr; + } + + public void setOrderRefundAddr(OrderRefundAddrVO orderRefundAddr) { + this.orderRefundAddr = orderRefundAddr; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "OrderRefundVO{" + + "refundId=" + refundId + + ", paySysType=" + paySysType + + ", shopId=" + shopId + + ", userId=" + userId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundCount=" + refundCount + + ", refundScore=" + refundScore + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", distributionTotalAmount=" + distributionTotalAmount + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", closeType=" + closeType + + ", returnMoneySts=" + returnMoneySts + + ", buyerReason=" + buyerReason + + ", buyerReasonValue='" + buyerReasonValue + '\'' + + ", buyerDesc='" + buyerDesc + '\'' + + ", buyerMobile='" + buyerMobile + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", overTime=" + overTime + + ", rejectMessage='" + rejectMessage + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + ", handelTime=" + handelTime + + ", deliveryTime=" + deliveryTime + + ", receiveTime=" + receiveTime + + ", closeTime=" + closeTime + + ", decisionTime=" + decisionTime + + ", refundTime=" + refundTime + + ", payTime=" + payTime + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", orderStatus=" + orderStatus + + ", refundStatus=" + refundStatus + + ", shopName='" + shopName + '\'' + + ", payId=" + payId + + ", payType=" + payType + + ", orderItems=" + orderItems + + ", orderRefundAddr=" + orderRefundAddr + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderSettlementPayVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderSettlementPayVO.java new file mode 100644 index 0000000..5f79e60 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/OrderSettlementPayVO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单结算表查询支付用VO + * + * @author FrozenWatermelon + */ +public class OrderSettlementPayVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "支付结算单据ID") + private Long settlementId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "支付单号") + private String payIds; + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Long getSettlementId() { + return settlementId; + } + + public void setSettlementId(Long settlementId) { + this.settlementId = settlementId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + + @Override + public String toString() { + return "OrderSettlementPayVO{" + + "settlementId=" + settlementId + + ", orderId=" + orderId + + ", payId=" + payId + + ", payIds='" + payIds + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/UserShoppingDataVO.java b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/UserShoppingDataVO.java new file mode 100644 index 0000000..3a82555 --- /dev/null +++ b/tmerclub-api/tmerclub-api-order/src/main/java/com/tmerclub/cloud/api/order/vo/UserShoppingDataVO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.order.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户购物数据 + * @author cl + * @date 2021-08-16 13:10:02 + */ +public class UserShoppingDataVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户消费笔数 + */ + private Long expenseNumber; + + /** + * 用户消费金额, (分) + */ + private Long sumOfConsumption; + + public Long getExpenseNumber() { + return expenseNumber; + } + + public void setExpenseNumber(Long expenseNumber) { + this.expenseNumber = expenseNumber; + } + + public Long getSumOfConsumption() { + return sumOfConsumption; + } + + public void setSumOfConsumption(Long sumOfConsumption) { + this.sumOfConsumption = sumOfConsumption; + } + + @Override + public String toString() { + return "UserShoppingDataVO{" + + "expenseNumber=" + expenseNumber + + ", sumOfConsumption=" + sumOfConsumption + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/BindCard.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/BindCard.java new file mode 100644 index 0000000..1a5ffe2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/BindCard.java @@ -0,0 +1,178 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + +import com.tmerclub.cloud.common.constant.CardType; +import org.apache.commons.lang.StringUtils; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author LGH + */ +public class BindCard implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 绑定银行卡号 + */ + private String bankCardNo; + + /** + * 银行名称 + */ + private String bankName; + + /** + * 绑定时间,yyyy-MM-ddHH:mm:ss + */ + private String bindTime; + + /** + * 银行卡类型 + */ + private Integer cardType; + + /** + * 绑定状态 + * 1 已绑定 2已解除 + */ + private Integer bindState; + + /** + * 银行预留手机号码(仅四要素绑定的银行卡返回) + */ + private String phone; + + /** + * 银行卡/账户属性 0个人银行卡 1企业对公账户 + */ + private Integer bankCardPro; + + /** + * 若为企业对公户返回0 + */ + private Integer bindMethod; + + private String cardTypeString; + + /** + * 支付行号 + */ + private String unionBank; + + /** + * 开户支行名称 + */ + private String branchBankName; + + /** + * 企业对公账户 + */ + private String accountNo; + + /** + * 返回解密字符串,也就是真正银行卡号码 + * + * @return 真正银行卡号码 + */ + public String getBankCardNo() { + return bankCardNo; + } + + public void setBankCardNo(String bankCardNo) { + this.bankCardNo = bankCardNo; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBindTime() { + return bindTime; + } + + public void setBindTime(String bindTime) { + this.bindTime = bindTime; + } + + public Integer getCardType() { + return cardType; + } + + public void setCardType(Integer cardType) { + this.cardType = cardType; + } + + public Integer getBindState() { + return bindState; + } + + public void setBindState(Integer bindState) { + this.bindState = bindState; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getBankCardPro() { + return bankCardPro; + } + + public void setBankCardPro(Integer bankCardPro) { + this.bankCardPro = bankCardPro; + } + + public Integer getBindMethod() { + return bindMethod; + } + + public void setBindMethod(Integer bindMethod) { + this.bindMethod = bindMethod; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + + public String getCardTypeString() { + if (StringUtils.isNotBlank(this.cardTypeString)) { + return this.cardTypeString; + } + return CardType.getDescByCode(cardType); + } + + public void setCardTypeString(String cardTypeString) { + this.cardTypeString = cardTypeString; + + } + + public String getBranchBankName() { + return branchBankName; + } + + public void setBranchBankName(String branchBankName) { + this.branchBankName = branchBankName; + } + + public String getAccountNo() { + return accountNo; + } + + public void setAccountNo(String accountNo) { + this.accountNo = accountNo; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/PersonalMemberInfo.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/PersonalMemberInfo.java new file mode 100644 index 0000000..264f012 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/PersonalMemberInfo.java @@ -0,0 +1,313 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-04-27 + */ +public class PersonalMemberInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 姓名 + */ + private String name; + + /** + * 国家 非必填 + */ + private String country; + + /** + * 省份 非必填 + */ + private String province; + + /** + * 地区 非必填 + */ + private String area; + + /** + * 地址 非必填 + */ + private String address; + + /** + * 用户状态 + */ + private Integer userState; + + /** + * 会员类型 + */ + private Integer memberType; + + /** + * 云账户用户id + */ + private String userId; + + /** + * 手机号 + */ + private String phone; + + /** + * 身份证号码 + */ + private String identityCardNo; + + /** + * 是否绑定手机 + */ + private Boolean isPhoneChecked; + + /** + * 创建时间 + */ + private String registerTime; + + /** + * 创建ip + */ + private String registerIp; + + /** + * 支付失败次数 + */ + private Long payFailAmount; + + /** + * 是否进行实名认证 + */ + private Boolean isIdentityChecked; + + /** + * 实名认证时间 + */ + private String realNameTime; + + /** + * 备注 + */ + private String remark; + + /** + * 访问终端类型 + */ + private String source; + + /** + * 是否设置支付密码 + */ + private Boolean isSetPayPwd; + + /** + * 账户提现签约协议时间 + */ + private String signAcctProtocolTime; + + /** + * 账户提现协议编号 + */ + private String acctProtocolNo; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Integer getUserState() { + return userState; + } + + public void setUserState(Integer userState) { + this.userState = userState; + } + + public Integer getMemberType() { + return memberType; + } + + public void setMemberType(Integer memberType) { + this.memberType = memberType; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdentityCardNo() { + return identityCardNo; + } + + public void setIdentityCardNo(String identityCardNo) { + this.identityCardNo = identityCardNo; + } + + public Boolean getPhoneChecked() { + return isPhoneChecked; + } + + public void setPhoneChecked(Boolean phoneChecked) { + isPhoneChecked = phoneChecked; + } + + public String getRegisterTime() { + return registerTime; + } + + public void setRegisterTime(String registerTime) { + this.registerTime = registerTime; + } + + public String getRegisterIp() { + return registerIp; + } + + public void setRegisterIp(String registerIp) { + this.registerIp = registerIp; + } + + public Long getPayFailAmount() { + return payFailAmount; + } + + public void setPayFailAmount(Long payFailAmount) { + this.payFailAmount = payFailAmount; + } + + public Boolean getIdentityChecked() { + return isIdentityChecked; + } + + public void setIdentityChecked(Boolean identityChecked) { + isIdentityChecked = identityChecked; + } + + public String getRealNameTime() { + return realNameTime; + } + + public void setRealNameTime(String realNameTime) { + this.realNameTime = realNameTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public Boolean getSetPayPwd() { + return isSetPayPwd; + } + + public void setSetPayPwd(Boolean setPayPwd) { + isSetPayPwd = setPayPwd; + } + + public String getSignAcctProtocolTime() { + return signAcctProtocolTime; + } + + public void setSignAcctProtocolTime(String signAcctProtocolTime) { + this.signAcctProtocolTime = signAcctProtocolTime; + } + + public String getAcctProtocolNo() { + return acctProtocolNo; + } + + public void setAcctProtocolNo(String acctProtocolNo) { + this.acctProtocolNo = acctProtocolNo; + } + + @Override + public String toString() { + return "PersonalMemberInfo{" + + "name='" + name + '\'' + + ", country='" + country + '\'' + + ", province='" + province + '\'' + + ", area='" + area + '\'' + + ", address='" + address + '\'' + + ", userState=" + userState + + ", memberType=" + memberType + + ", userId='" + userId + '\'' + + ", phone='" + phone + '\'' + + ", identityCardNo='" + identityCardNo + '\'' + + ", isPhoneChecked=" + isPhoneChecked + + ", registerTime='" + registerTime + '\'' + + ", registerIp='" + registerIp + '\'' + + ", payFailAmount=" + payFailAmount + + ", isIdentityChecked=" + isIdentityChecked + + ", realNameTime='" + realNameTime + '\'' + + ", remark='" + remark + '\'' + + ", source='" + source + '\'' + + ", isSetPayPwd=" + isSetPayPwd + + ", signAcctProtocolTime='" + signAcctProtocolTime + '\'' + + ", acctProtocolNo='" + acctProtocolNo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/SetCompanyInfoResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/SetCompanyInfoResp.java new file mode 100644 index 0000000..2f1b85d --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/SetCompanyInfoResp.java @@ -0,0 +1,83 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class SetCompanyInfoResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户的用户id + */ + private String bizUserId; + /** + * 审核结果(2:成功, 3:失败) + */ + private Integer result; + /** + * 审核时间 + */ + private String checkTime; + /** + * 失败原因 + */ + private String failReason; + /** + * 备注 + */ + private String remark; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Integer getResult() { + return result; + } + + public void setResult(Integer result) { + this.result = result; + } + + public String getCheckTime() { + return checkTime; + } + + public void setCheckTime(String checkTime) { + this.checkTime = checkTime; + } + + public String getFailReason() { + return failReason; + } + + public void setFailReason(String failReason) { + this.failReason = failReason; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SetCompanyInfoResp{" + + "bizUserId='" + bizUserId + '\'' + + ", result=" + result + + ", checkTime='" + checkTime + '\'' + + ", failReason='" + failReason + '\'' + + ", remark='" + remark + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/UpdateCompanyInfoResp.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/UpdateCompanyInfoResp.java new file mode 100644 index 0000000..af48ca5 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/allinpay/member/resp/UpdateCompanyInfoResp.java @@ -0,0 +1,109 @@ +package com.tmerclub.cloud.api.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class UpdateCompanyInfoResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户的用户id + */ + private String bizUserId; + /** + * 商户请求流水号 + */ + private String reqsn; + /** + * 修改结果(2:成功, 3:失败 4.处理中) + */ + private Integer result; + /** + * 失败原因 + */ + private String failReason; + /** + * OCR识别与企业工商认证信息是否一致 0否1是 + */ + private Integer ocrRegnumComparisonResult; + /** + * OCR识别与企业法人实名信息是否一致 0否1是 + */ + private Integer ocrIdcardComparisonResult; + /** + * 比对结果信息 存在多种结果信息一起返回,使用“;”进行拼接 + */ + private String resultInfo; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getReqsn() { + return reqsn; + } + + public void setReqsn(String reqsn) { + this.reqsn = reqsn; + } + + public Integer getResult() { + return result; + } + + public void setResult(Integer result) { + this.result = result; + } + + public String getFailReason() { + return failReason; + } + + public void setFailReason(String failReason) { + this.failReason = failReason; + } + + public Integer getOcrRegnumComparisonResult() { + return ocrRegnumComparisonResult; + } + + public void setOcrRegnumComparisonResult(Integer ocrRegnumComparisonResult) { + this.ocrRegnumComparisonResult = ocrRegnumComparisonResult; + } + + public Integer getOcrIdcardComparisonResult() { + return ocrIdcardComparisonResult; + } + + public void setOcrIdcardComparisonResult(Integer ocrIdcardComparisonResult) { + this.ocrIdcardComparisonResult = ocrIdcardComparisonResult; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } + + @Override + public String toString() { + return "UpdateCompanyInfoResp{" + + "bizUserId='" + bizUserId + '\'' + + ", reqsn='" + reqsn + '\'' + + ", result=" + result + + ", failReason='" + failReason + '\'' + + ", ocrRegnumComparisonResult=" + ocrRegnumComparisonResult + + ", ocrIdcardComparisonResult=" + ocrIdcardComparisonResult + + ", resultInfo='" + resultInfo + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/AuditStatus.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/AuditStatus.java new file mode 100644 index 0000000..5bca864 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/AuditStatus.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.api.payment.constant; + +/** + * 通联审核状态 + * + * @author LGH + */ +public enum AuditStatus { + + /** + * 待审核 + */ + UN_AUDIT(1), + + /** + * 审核成功 + */ + SUCCESS(2), + + /** + * 审核失败 + */ + FAIL(3); + + private final Integer code; + + public Integer getCode() { + return code; + } + + AuditStatus(Integer code) { + this.code = code; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/PayEntry.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/PayEntry.java new file mode 100644 index 0000000..b21e99a --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/PayEntry.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.constant; + +import java.util.Objects; + +/** + * 支付入口 0订单 1充值 2开通会员 + * + * @author FrozenWatermelon + */ +public enum PayEntry { + + /** + * 订单 + */ + ORDER(0, "订单"), + + /** + * 充值 + */ + RECHARGE(1, "充值"), + + /** + * 开通会员 + */ + VIP(2, "开通会员"), + + /** + * 商家余额支付采购费用(通联支付独有) + */ + SHOP_BALANCE_PAY_PURCHASE(3, "商家余额支付(通联支付独有)"), + + /** + * 商家余额支付退款自行处理费用(通联支付独有) + */ + SHOP_BALANCE_PAY_REFUND_SPREAD(4, "商家余额支付退款自行处理费用(通联支付独有)"); + + private final Integer num; + private final String payName; + + public Integer value() { + return num; + } + + PayEntry(Integer num, String payName) { + this.num = num; + this.payName = payName; + } + + public static PayEntry instance(Integer value) { + PayEntry[] enums = values(); + for (PayEntry statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getPayTypeName(Integer value) { + PayEntry payEntry = instance(value); + if (Objects.isNull(payEntry)) { + return null; + } + return payEntry.payName; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/PaySysType.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/PaySysType.java new file mode 100644 index 0000000..b90ec1e --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/constant/PaySysType.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.constant; + +import java.util.Objects; + +/** + * 支付系统 0默认 1通联支付 + * 钱包标识 + * + * @author TRACK + */ +public enum PaySysType { + /** + * 默认 + */ + DEFAULT(0, "默认"), + + /** + * 通联支付 + */ + ALLINPAY(1, "通联支付"); + + private final Integer num; + private final String name; + + public Integer value() { + return num; + } + + PaySysType(Integer num, String name) { + this.num = num; + this.name = name; + } + + public static PaySysType instance(Integer value) { + PaySysType[] enums = values(); + for (PaySysType paySysType : enums) { + if (paySysType.value().equals(value)) { + return paySysType; + } + } + return null; + } + + public static String getName(Integer value) { + PaySysType paySysType = instance(value); + if (Objects.isNull(paySysType)) { + return null; + } + return paySysType.name; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/AllinpayBalanceDTO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/AllinpayBalanceDTO.java new file mode 100644 index 0000000..b120006 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/AllinpayBalanceDTO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.api.payment.dto; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-06-01 + */ +public class AllinpayBalanceDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 总额 + */ + private Long allAmount; + /** + * 冻结额 + */ + private Long freezenAmount; + + public Long getAllAmount() { + return allAmount; + } + + public void setAllAmount(Long allAmount) { + this.allAmount = allAmount; + } + + public Long getFreezenAmount() { + return freezenAmount; + } + + public void setFreezenAmount(Long freezenAmount) { + this.freezenAmount = freezenAmount; + } + + @Override + public String toString() { + return "AllinpayBalanceDTO{" + + "allAmount=" + allAmount + + ", freezenAmount=" + freezenAmount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/AllinpaySettlementApiDto.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/AllinpaySettlementApiDto.java new file mode 100644 index 0000000..d831f12 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/AllinpaySettlementApiDto.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.dto; + +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lhd + * @date 2022/03/13 + */ +public class AllinpaySettlementApiDto implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户支付单号 + * 存在预售订单两笔支付的情况 + */ + private List payIds; + /** + * 订单id + */ + private String orderId; + /** + * 商家收入明细 + */ + private SplitRuleVO shopSplitRuleVO; + /** + * 供应商收入明细 + */ + private SplitRuleVO supplierSplitRuleVO; + /** + * 平台收入明细 + */ + private SplitRuleVO platformSplitRuleVO; + /** + * 分销员收入明细 + */ + private List distributionUserSplitRuleList; + + public List getPayIds() { + return payIds; + } + + public void setPayIds(List payIds) { + this.payIds = payIds; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public SplitRuleVO getShopSplitRuleDto() { + return shopSplitRuleVO; + } + + public void setShopSplitRuleDto(SplitRuleVO shopSplitRuleVO) { + this.shopSplitRuleVO = shopSplitRuleVO; + } + + public SplitRuleVO getSupplierSplitRuleDto() { + return supplierSplitRuleVO; + } + + public void setSupplierSplitRuleDto(SplitRuleVO supplierSplitRuleVO) { + this.supplierSplitRuleVO = supplierSplitRuleVO; + } + + public SplitRuleVO getPlatformSplitRuleDto() { + return platformSplitRuleVO; + } + + public void setPlatformSplitRuleDto(SplitRuleVO platformSplitRuleVO) { + this.platformSplitRuleVO = platformSplitRuleVO; + } + + public List getDistributionUserSplitRuleList() { + return distributionUserSplitRuleList; + } + + public void setDistributionUserSplitRuleList(List distributionUserSplitRuleList) { + this.distributionUserSplitRuleList = distributionUserSplitRuleList; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/BindPayAcctDTO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/BindPayAcctDTO.java new file mode 100644 index 0000000..bf0e335 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/BindPayAcctDTO.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.api.payment.dto; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-05-31 + */ +public class BindPayAcctDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 通联userId + */ + private String bizUserId; + + /** + * 支付标识 + */ + private String acct; + + /** + * 支付账户类型 + */ + private Integer socialType; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + public Integer getSocialType() { + return socialType; + } + + public void setSocialType(Integer socialType) { + this.socialType = socialType; + } + + @Override + public String toString() { + return "BindPayAcctDTO{" + + "bizUserId='" + bizUserId + '\'' + + ", acct='" + acct + '\'' + + ", socialType=" + socialType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/PayInfoApiDto.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/PayInfoApiDto.java new file mode 100644 index 0000000..8558fe1 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/PayInfoApiDto.java @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.dto; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lhd + * @date 2022/03/13 + */ +public class PayInfoApiDto implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付信息,如商品名称 + */ + private String body; + + /** + * 支付单号 + */ + private Long payId; + + /** + * 付款金额 + */ + private Long payAmount; + + /** + * 支付方式 + */ + private Integer payType; + + /** + * api回调域名 + */ + private String apiNoticeUrl; + + /** + * 支付完成会跳地址 + */ + private String returnUrl; + + /** + * 第三方用户id + */ + private String bizUserId; + + /** + * 支付回调地址类型 + */ + private Integer backType; + + /** + * 订单ids + */ + private String orderIds; + + /** + * 本次支付关联的退款号 + */ + private Long refundId; + /** + * 是否是购买会员 + */ + private Boolean isVip; + /** + * 用户id + */ + private String userId; + /** + * 店铺id + */ + private String shopId; + /** + * 系统类型 1:移动端 2:pc + */ + private Integer systemType; + /** + * 交易验证方式 0.仅渠道验证,通商云不做交易验证 1.通商云发送并验证短信验证码,有效期3分钟。2.验证通商云支付密码 + */ + private Long validateType; + + /** + * 支付入口 + */ + private Integer payEntry; + /** + * 扩展信息,通联独有 + */ + private String extendInfo; + + /** + * 支付系统类型 0默认 1通联 + */ + private Integer paySysType; + + /** + * 第三方订单流水号 + */ + private String bizPayNo; + + /** + * 支付的系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios + */ + private Integer systemModel; + + public Integer getSystemModel() { + return systemModel; + } + + public void setSystemModel(Integer systemModel) { + this.systemModel = systemModel; + } + + public String getBizPayNo() { + return bizPayNo; + } + + public void setBizPayNo(String bizPayNo) { + this.bizPayNo = bizPayNo; + } + + public String getShopId() { + return shopId; + } + + public void setShopId(String shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public Long getValidateType() { + return validateType; + } + + public void setValidateType(Long validateType) { + this.validateType = validateType; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getApiNoticeUrl() { + return apiNoticeUrl; + } + + public void setApiNoticeUrl(String apiNoticeUrl) { + this.apiNoticeUrl = apiNoticeUrl; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Integer getBackType() { + return backType; + } + + public void setBackType(Integer backType) { + this.backType = backType; + } + + public Boolean getIsVip() { + return isVip; + } + + public void setIsVip(Boolean isVip) { + this.isVip = isVip; + } + + public Boolean getVip() { + return isVip; + } + + public void setVip(Boolean vip) { + isVip = vip; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "PayInfoApiDto{" + + "body='" + body + '\'' + + ", payId=" + payId + + ", payAmount=" + payAmount + + ", payType=" + payType + + ", apiNoticeUrl='" + apiNoticeUrl + '\'' + + ", returnUrl='" + returnUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", backType=" + backType + + ", orderIds='" + orderIds + '\'' + + ", refundId=" + refundId + + ", isVip=" + isVip + + ", userId='" + userId + '\'' + + ", shopId='" + shopId + '\'' + + ", systemType=" + systemType + + ", validateType=" + validateType + + ", payEntry=" + payEntry + + ", extendInfo='" + extendInfo + '\'' + + ", paySysType=" + paySysType + + ", bizPayNo=" + bizPayNo + + ", systemModel=" + systemModel + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/SetCompanyInfoDTO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/SetCompanyInfoDTO.java new file mode 100644 index 0000000..b9d9b3b --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/dto/SetCompanyInfoDTO.java @@ -0,0 +1,142 @@ +package com.tmerclub.cloud.api.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class SetCompanyInfoDTO extends BindCompanyAccountDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商户号") + private String bizUserId; + + @Schema(description = "企业名称,如有括号,使用中文括号", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyName; + + @Schema(description = "企业地址 非必填") + private String companyAddress; + + @Schema(description = "认证类型(1:三证, 2:一证),采用2") + private Integer authType; + + @Schema(description = "统一社会信用(一证时必传)", requiredMode = Schema.RequiredMode.REQUIRED) + private String uniCredit; + + @Schema(description = "联系电话 非必填") + private String telephone; + + @Schema(description = "法人姓名", requiredMode = Schema.RequiredMode.REQUIRED) + private String legalName; + + /** + * 当前默认 1身份证 + */ + @Schema(description = "法人证件类型(1:身份证, 2:护照, 3:军官证, 4:回乡证, 5:台胞证, 6:警官证, 7:士兵证,8:户口簿,9.港澳居民来往内地通行证,10.临时身份证,11.外国人居留证,12.港澳台居民居住证 99:其他)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer identityType; + + @Schema(description = "法人证件号", requiredMode = Schema.RequiredMode.REQUIRED) + private String legalIds; + + @Schema(description = "法人手机号码", requiredMode = Schema.RequiredMode.REQUIRED) + private String legalPhone; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyAddress() { + return companyAddress; + } + + public void setCompanyAddress(String companyAddress) { + this.companyAddress = companyAddress; + } + + public Integer getAuthType() { + return authType; + } + + public void setAuthType(Integer authType) { + this.authType = authType; + } + + public String getUniCredit() { + return uniCredit; + } + + public void setUniCredit(String uniCredit) { + this.uniCredit = uniCredit; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getLegalName() { + return legalName; + } + + public void setLegalName(String legalName) { + this.legalName = legalName; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + @Override + public String toString() { + return "SetCompanyInfoDTO{" + + "bizUserId='" + bizUserId + '\'' + + ", companyName='" + companyName + '\'' + + ", companyAddress='" + companyAddress + '\'' + + ", authType=" + authType + + ", uniCredit='" + uniCredit + '\'' + + ", telephone='" + telephone + '\'' + + ", legalName='" + legalName + '\'' + + ", identityType=" + identityType + + ", legalIds='" + legalIds + '\'' + + ", legalPhone='" + legalPhone + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/feign/AllinpayFeignClient.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/feign/AllinpayFeignClient.java new file mode 100644 index 0000000..1863c3d --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/feign/AllinpayFeignClient.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.feign; + +import com.tmerclub.cloud.api.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.api.payment.dto.AllinpayBalanceDTO; +import com.tmerclub.cloud.api.payment.dto.BindPayAcctDTO; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author lanhai + */ +public interface AllinpayFeignClient { + + /** + * 创建通联支付企业会员 + * @param bizUserIds + * @return + */ + ServerResponseEntity batchCreateMember(List bizUserIds); + + /** + * 批量创建通联支付个人会员 + * @param bizUserIds + * @return 创建会员成功数量 + */ + ServerResponseEntity batchCreatePersonalMember(List bizUserIds); + + /** + * 获取企业信息 + * @param bizUserId + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity getCompanyInfo(String bizUserId); + + /** + * 获取通联个人会员信息 + * @param bizUserId + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity getPersonalMemberInfo(String bizUserId); + + /** + * 设置企业信息 + * @param setCompanyInfoDTO + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity setCompanyInfo(SetCompanyInfoDTO setCompanyInfoDTO); + + /** + * 更新企业信息 + * @param updateCompanyInfoDTO + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity updateCompanyInfo(UpdateCompanyInfoDTO updateCompanyInfoDTO); + + /** + * 影印件采集 + * 这个方法是用base64的,暂时不用,采用文件上传的模式 + * @param imageUrl + * @param picType + * @param fileType + * @param bizUserId + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity idCardCollect(String imageUrl, + Integer picType, + String fileType, + String bizUserId); + + /** + * 影印件采集-文件上传模式 + * @param legalPicFaceToken + * @param legalPicEmblemToken + * @param picType + * @param token + * @param bizUserId + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity idCardCollectByFileUpload(String legalPicFaceToken, + String legalPicEmblemToken, + Integer picType, + String token, + String bizUserId); + + /** + * 查询银行卡列表 + * @param bizUserId + * @param cardNo + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity> listBindCard(String bizUserId, + String cardNo); + + /** + * 查询账户集余额 + * @param bizUserId + * @param sysType + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity queryBalance(String bizUserId, + Integer sysType); + + /** + * 重发支付短信验证码 + * @param bizOrderNo + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity resendPaySms(String bizOrderNo); + + /** + * 申请提现 + * @param bizUserId 商户号 + * @param amount 提现金额 + * @param bankCardNo 银行卡号 + * @param sysType 系统类型 + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity withdrawApply(String bizUserId, + Long amount, + String bankCardNo, + Integer sysType); + + /** + * 确认支付 后台+短信验证码 + * @param bizUserId + * @param bizOrderNo + * @param verificationCode + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity payByBackSms(String bizUserId, + String bizOrderNo, + String verificationCode); + + /** + * 商家充值申请 + * @param amount + * @param shopId + * @param walletLogId + * @param returnUrl + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity rechargeApply(Long amount, + Long shopId, + Long walletLogId, + String returnUrl); + + /** + * 获取影印件状态 + * @param bizUserId + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity getIdCardStatus(String bizUserId); + + /** + * 修改通联会员状态 + * @param userId 用户id + * @param status 状态(0:禁用, 1:解禁) + */ + void updateAllinpayMemberStatus(Long userId, + Integer status); + + /** + * 用户绑定支付标识 + * @param userId 用户id + * @param payAcct 支付标识 + * @param socialType 第三方类型 + */ + void bindPayAcct(Long userId, + String payAcct, + Integer socialType); + + /** + * 批量绑定用户支付标识 + * @param bindPayAcctDTOList + */ + void batchBindPayAcct(List bindPayAcctDTOList); + + /** + * 用户是否绑定支付标识 + * @param userId 用户id + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity isBindPayAcct(Long userId); + + /** + * 获取通联用户余额信息 + * + * @param userId + * @param sysType + * @return + */ + com.tmerclub.cloud.common.response.ServerResponseEntity getAllinpayBalance(Long userId, + Integer sysType); +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/PaySettlementConfigVO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/PaySettlementConfigVO.java new file mode 100644 index 0000000..d8c04cb --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/PaySettlementConfigVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.payment.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author Pineapple + */ +public class PaySettlementConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付结算类型 0.原生结算 1.通联结算 + */ + private Integer paySettlementType; + + /** + * 通联商户系统用户标识,商户系统中唯一编号,也就是平台唯一的通联标识 + */ + private String bizUserId; + + public Integer getPaySettlementType() { + return paySettlementType; + } + + public void setPaySettlementType(Integer paySettlementType) { + this.paySettlementType = paySettlementType; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + @Override + public String toString() { + return "PaySettlementConfigVO{" + + "paySettlementType=" + paySettlementType + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/SplitRuleVO.java b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/SplitRuleVO.java new file mode 100644 index 0000000..cc6a7d3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-payment/src/main/java/com/tmerclub/cloud/api/payment/vo/SplitRuleVO.java @@ -0,0 +1,111 @@ +package com.tmerclub.cloud.api.payment.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 收入明细 + * + * @author lhd + */ +public class SplitRuleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + private String bizUserId; + /** + * 如果向会员分账,不上送,默认为唯一托管账户集。 + * 如果向平台分账,请填写平台的标准账户集编号(不支持100003-准备金额度账户集)。详细 + */ + private String accountSetNo; + /** + * 非必填,一年前的代收订单必须上送,yyyy-MM-dd 精确到天 + */ + private String bizOrderCreateDate; + /** + * 金额,单位:分;部分代付时,可以少于或等于托管代收订单金额 + */ + private Long amount; + /** + * 手续费 + */ + private Long fee; + /** + * 备注,非必填 + */ + private Long remark; + /** + * 订单号 + */ + private Long orderId; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public String getBizOrderCreateDate() { + return bizOrderCreateDate; + } + + public void setBizOrderCreateDate(String bizOrderCreateDate) { + this.bizOrderCreateDate = bizOrderCreateDate; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Long getRemark() { + return remark; + } + + public void setRemark(Long remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SplitRuleVO{" + + "bizUserId='" + bizUserId + '\'' + + ", accountSetNo='" + accountSetNo + '\'' + + ", bizOrderCreateDate='" + bizOrderCreateDate + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", remark=" + remark + + ", orderId=" + orderId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/PlatformCommissionItemBO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/PlatformCommissionItemBO.java new file mode 100644 index 0000000..abdd878 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/PlatformCommissionItemBO.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 订单项平台佣金需要的参数 + * @author FrozenWatermelon + * @date 2021/5/24 + */ +public class PlatformCommissionItemBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long shopId; + + private Double rate; + + /** + * 类型 1.商家 3.供应商 + */ + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + @Override + public String toString() { + return "PlatformCommissionOrderItemBO{" + + "shopId=" + shopId + + ", rate=" + rate + + ", spuType=" + sysType + + '}'; + } +} + diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/PlatformCommissionOrderItemBO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/PlatformCommissionOrderItemBO.java new file mode 100644 index 0000000..c6798ca --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/bo/PlatformCommissionOrderItemBO.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 订单项平台佣金需要的参数 + * @author FrozenWatermelon + * @date 2021/5/24 + */ +public class PlatformCommissionOrderItemBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private Long categoryId; + + private Double rate; + private Double supplierRate; + + private Long skuId; + + private PlatformCommissionItemBO shopItem; + + private PlatformCommissionItemBO supplierItem; + + public Double getSupplierRate() { + return supplierRate; + } + + public void setSupplierRate(Double supplierRate) { + this.supplierRate = supplierRate; + } + + public PlatformCommissionItemBO getShopItem() { + return shopItem; + } + + public void setShopItem(PlatformCommissionItemBO shopItem) { + this.shopItem = shopItem; + } + + public PlatformCommissionItemBO getSupplierItem() { + return supplierItem; + } + + public void setSupplierItem(PlatformCommissionItemBO supplierItem) { + this.supplierItem = supplierItem; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + @Override + public String toString() { + return "PlatformCommissionOrderItemBO{" + + "categoryId=" + categoryId + + ", rate=" + rate + + ", supplierRate=" + supplierRate + + ", skuId=" + skuId + + ", shopItem=" + shopItem + + ", supplierItem=" + supplierItem + + '}'; + } +} + diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/constant/CategoryLevel.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/constant/CategoryLevel.java new file mode 100644 index 0000000..5187fc6 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/constant/CategoryLevel.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.constant; + +/** + * 分类等级 + * @author yxf + * @date 2020/11/20 + */ +public enum CategoryLevel { + + /** + * 第一级 + */ + First(0), + + /** + * 第二级 + */ + SECOND(1), + + /** + * 第三级 + */ + THIRD(2); + + private final Integer value; + + public Integer value() { + return value; + } + + CategoryLevel(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/HandleCategoryShopDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/HandleCategoryShopDTO.java new file mode 100644 index 0000000..f57dcec --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/HandleCategoryShopDTO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 分类签约信息 + * + * @author lhd + */ +public class HandleCategoryShopDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键Id") + private List categoryShopDTOList; + + @Schema(description = "系统类型 1.商家端 2.平台端 3.供应商端") + private Integer sysType; + + @Schema(description = "店铺/供应商id") + private Long shopId; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public List getCategoryShopDTOList() { + return categoryShopDTOList; + } + + public void setCategoryShopDTOList(List categoryShopDTOList) { + this.categoryShopDTOList = categoryShopDTOList; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + @Override + public String toString() { + return "HandleCategoryShopDTO{" + + "categoryShopDTOList=" + categoryShopDTOList + + ", sysType=" + sysType + + ", shopId=" + shopId + + '}'; + } +} + diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/ProdEffectDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/ProdEffectDTO.java new file mode 100644 index 0000000..be73736 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/ProdEffectDTO.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Pineapple + * @date 2021/5/21 16:05 + */ +public class ProdEffectDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 时间类型 1.日 2.周 3.月 4.今日实时 5.近七天 6.近30天 7.自定义 + * FlowTimeTypeEnum + */ + @Schema(description = "时间类型 1.日 3.月 4.今日实时 5.近七天 6.近30天") + private Integer dateType; + /** + * 开始时间 + */ + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + /** + * 结束时间 + */ + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + /** + * limit使用起始页 + */ + @Schema(description = "前端不传字段") + private Integer begin; + + /** + * limit使用大小 + */ + @Schema(description = "前端不传字段") + private Integer size; + + /** + * 当前语言 + */ + @Schema(description = "当前语言,前端不传") + private Integer lang; + + /** + * 店铺id + */ + @Schema(description = "店铺id,前端不传字段") + private Long shopId; + + @Schema(description = "排序字段(0:曝光次数, 1:曝光人数, 2:加购人数, 3:加购件数, 4:下单人数, 5:支付人数, " + + "6:下单件数, 7:支付件数, 8:下单金额, 9:支付金额, 10:申请退款订单数, " + + "11:申请退款人数, 12:成功退款订单数, 13:成功退款人数, 14:成功退款金额, 15:退款率)") + private Integer sortParam; + + @Schema(description = "排序顺序(0:降序, 1:升序)") + private Integer sortType; + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getBegin() { + return begin; + } + + public void setBegin(Integer begin) { + this.begin = begin; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSortParam() { + return sortParam; + } + + public void setSortParam(Integer sortParam) { + this.sortParam = sortParam; + } + + public Integer getSortType() { + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + @Override + public String toString() { + return "ProdEffectDTO{" + + "dateType=" + dateType + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", begin=" + begin + + ", size=" + size + + ", lang=" + lang + + ", shopId=" + shopId + + ", sortParam=" + sortParam + + ", sortType=" + sortType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SkuStockLockDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SkuStockLockDTO.java new file mode 100644 index 0000000..03492f2 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SkuStockLockDTO.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/12/22 + */ +public class SkuStockLockDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "产品ID不能为空") + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long spuId; + + @NotNull(message = "skuId不能为空") + @Schema(description = "skuId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long skuId; + + @NotNull(message = "shopId不能为空") + @Schema(description = "shopId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @NotNull(message = "orderId不能为空") + @Schema(description = "orderId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @NotNull(message = "商品数量不能为空") + @Min(value = 1, message = "商品数量不能为空") + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer count; + + @Schema(description = "仓库id") + private Long warehouseId; + + public SkuStockLockDTO() { + } + + public SkuStockLockDTO(Long skuId, Long orderId, Integer count) { + this.skuId = skuId; + this.orderId = orderId; + this.count = count; + } + + public SkuStockLockDTO(Long orderId, Long warehouseId, Long skuId, Integer count) { + this.skuId = skuId; + this.orderId = orderId; + this.count = count; + this.warehouseId = warehouseId; + } + + public SkuStockLockDTO(Long shopId, Long spuId, Long skuId, Long orderId, Integer count) { + this.shopId = shopId; + this.spuId = spuId; + this.skuId = skuId; + this.orderId = orderId; + this.count = count; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + @Override + public String toString() { + return "SkuStockLockDTO{" + + "spuId=" + spuId + + ", skuId=" + skuId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/StockBillLogItemDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/StockBillLogItemDTO.java new file mode 100644 index 0000000..25cddab --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/StockBillLogItemDTO.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.dto; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库商品项DTO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockBillLogItemDTO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public StockBillLogItemDTO(Long spuId, Long skuId, Long shopId, Long orderId, String spuName, String skuName, Integer stockCount, Long unitPrice, String partyCode, String mainImgUrl) { + this.spuId = spuId; + this.skuId = skuId; + this.shopId = shopId; + this.orderId = orderId; + this.spuName = spuName; + this.skuName = skuName; + this.stockCount = stockCount; + this.unitPrice = unitPrice; + this.partyCode = partyCode; + this.mainImgUrl = mainImgUrl; + } + + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "商品id") + private Long spuId; + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "店铺Id") + private Long shopId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "库存仓库id") + private Long stockPointId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品sku名称") + private String skuName; + + @Schema(description = "实际出入库数量") + private Integer stockCount; + + @Schema(description = "商品库存剩余量") + private Integer afterStock; + + @Schema(description = "成本单价") + private Long unitPrice; + + @Schema(description = "商品编码") + private String partyCode; + @Schema(description = "商品图片") + private String mainImgUrl; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "类型,1:出库 2:入库") + private Integer stocktype; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "库存点类型") + private Integer stockPointType; + + @Schema(description = "制单人手机号") + private String makerMobile; + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + public Integer getStocktype() { + return stocktype; + } + + public void setStocktype(Integer stocktype) { + this.stocktype = stocktype; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public StockBillLogItemDTO() { + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Integer getAfterStock() { + return afterStock; + } + + public void setAfterStock(Integer afterStock) { + this.afterStock = afterStock; + } + + public Long getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(Long unitPrice) { + this.unitPrice = unitPrice; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + @Override + public String toString() { + return "StockBillLogItemDTO{" + + "stockBillLogId=" + stockBillLogId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", stockPointId=" + stockPointId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", stockCount=" + stockCount + + ", afterStock=" + afterStock + + ", unitPrice=" + unitPrice + + ", partyCode='" + partyCode + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierId=" + supplierId + + ", stocktype=" + stocktype + + ", stockBillType=" + stockBillType + + ", stockPointType=" + stockPointType + + ", makerMobile='" + makerMobile + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SupplierSpuUpdateDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SupplierSpuUpdateDTO.java new file mode 100644 index 0000000..9e3aa03 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/SupplierSpuUpdateDTO.java @@ -0,0 +1,73 @@ +package com.tmerclub.cloud.api.product.dto; + +/** + * @author gaozijie + * @date 2023-09-22 + */ +public class SupplierSpuUpdateDTO { + + /** + * 更新价格 + */ + private boolean priceUpdate; + + /** + * 更新sku数量 + */ + private boolean skuUpdate; + + /** + * 更新重量 + */ + private boolean weightUpdate; + + /** + * 更新体积 + */ + private boolean sizeUpdate; + + public SupplierSpuUpdateDTO() { + } + + public boolean isPriceUpdate() { + return priceUpdate; + } + + public void setPriceUpdate(boolean priceUpdate) { + this.priceUpdate = priceUpdate; + } + + public boolean isSkuUpdate() { + return skuUpdate; + } + + public void setSkuUpdate(boolean skuUpdate) { + this.skuUpdate = skuUpdate; + } + + public boolean isWeightUpdate() { + return weightUpdate; + } + + public void setWeightUpdate(boolean weightUpdate) { + this.weightUpdate = weightUpdate; + } + + public boolean isSizeUpdate() { + return sizeUpdate; + } + + public void setSizeUpdate(boolean sizeUpdate) { + this.sizeUpdate = sizeUpdate; + } + + @Override + public String toString() { + return "SupplierSpuUpdateDTO{" + + "priceUpdate=" + priceUpdate + + ", skuUpdate=" + skuUpdate + + ", weightUpdate=" + weightUpdate + + ", sizeUpdate=" + sizeUpdate + + '}'; + } +} \ No newline at end of file diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/WarehouseSearchDTO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/WarehouseSearchDTO.java new file mode 100644 index 0000000..f514239 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/dto/WarehouseSearchDTO.java @@ -0,0 +1,108 @@ +package com.tmerclub.cloud.api.product.dto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author gaozijie + * @since 2023-12-01 + */ +public class WarehouseSearchDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 系统类型 + */ + private Integer sysType; + + /** + * 仓库名称 + */ + private String warehouseName; + + /** + * 仓库id集合 + */ + private List warehouseIds; + + /** + * 店铺id集合 + */ + private List shopIds; + + /** + * 区id + */ + private Long areaId; + + public WarehouseSearchDTO() { + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public List getWarehouseIds() { + return warehouseIds; + } + + public void setWarehouseIds(List warehouseIds) { + this.warehouseIds = warehouseIds; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + @Override + public String toString() { + return "WarehouseSearchDTO{" + + "shopId=" + shopId + + ", sysType=" + sysType + + ", warehouseName='" + warehouseName + '\'' + + ", warehouseIds=" + warehouseIds + + ", shopIds=" + shopIds + + ", areaId=" + areaId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/BrandFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/BrandFeignClient.java new file mode 100644 index 0000000..484ab4a --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/BrandFeignClient.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + + +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author YXF + * @date 2021/05/10 + */ +public interface BrandFeignClient { + + /** + * 获取品牌信息 + * @param brandId + * @return + */ + ServerResponseEntity getInfo(Long brandId); + + /** + * 根据店铺id把自定义品牌更新为平台品牌 + * @param shopId + * @param sysType + */ + void updateCustomBrandToPlatformBrandByShopId(Long shopId, Integer sysType); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/CategoryShopFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/CategoryShopFeignClient.java new file mode 100644 index 0000000..2e2617f --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/CategoryShopFeignClient.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.api.product.bo.PlatformCommissionOrderItemBO; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/5/24 + */ +public interface CategoryShopFeignClient { + + + /** + * 根据分类,店铺,获取订单项的佣金比例 + * @param platformCommissionOrderItems 订单项平台佣金需要的参数 + * @return 订单项佣金比例 + */ + ServerResponseEntity> calculatePlatformCommission(List platformCommissionOrderItems); + + + /** + * 根据店铺id获取有相同分类的供应商 + * @param shopId 店铺id + * @return 供应商ids + */ + ServerResponseEntity> getSupplierIdsByShopId(Long shopId); + + /** + * 根据店铺id获取所有分类ids + * @param shopId 店铺id + * @param sysType + * @return 所有分类ids + */ + ServerResponseEntity> getCategoryIdsByShopId(Long shopId, Integer sysType); + + /** + * 根据店铺id批量保存分类签约信息 + * @param categoryShopDTOList + * @param shopId + * @param sysType + * @return + */ + ServerResponseEntity insertBatchByShopId(List categoryShopDTOList, Long shopId, Integer sysType); + + /** + * 根据店铺id获取绑定的平台一级分类 + * @param shopId + * @param lang + * @param sysType + * @return + */ + ServerResponseEntity> getOneCategoryIdByShopId(Long shopId, Integer sysType, Integer lang); + + /** + * 根据分类id集合获取供应商id + * @param categoryIds + * @return + */ + ServerResponseEntity> getSupplyIdByCategoryIds(List categoryIds); + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/ProductFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/ProductFeignClient.java new file mode 100644 index 0000000..9e89b0d --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/ProductFeignClient.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public interface ProductFeignClient { + + /** + * 通过spuId需要搜索的商品 + * + * @param spuId spuid + * @return es保存的商品信息 + */ + ServerResponseEntity loadEsProductBO(Long spuId); + + /** + * 根据平台categoryId,获取spuId列表 + * + * @param shopCategoryIds + * @return spuId列表 + */ + ServerResponseEntity> getSpuIdsByShopCategoryIds(List shopCategoryIds); + + /** + * 根据categoryId列表,获取spuId列表 + * + * @param categoryIds + * @return spuId列表 + */ + ServerResponseEntity> getSpuIdsByCategoryIds(List categoryIds); + + /** + * 根据brandId,获取spuId列表 + * + * @param brandId + * @return spuId列表 + */ + ServerResponseEntity> getSpuIdsByBrandId(Long brandId); + + /** + * 根据供应商店铺id,获取spuId列表(仅处于上架状态的商品) + * @param supplierId + * @param createTime + * @param supplierSpuType + * @return + */ + ServerResponseEntity> listSpuIdsBySupplierIdAndSupplierSpuType(Long supplierId, String createTime, Integer supplierSpuType); + + /** + * 根据供应商id批量获取商家代销商品信息(所有商品,不包括删除商品) + * + * @param supplierId + * @return + */ + List listMerchantSpuIdsBySupplierId(Long supplierId); + + /** + * 根据商品id列表获取商品列表 + * + * @param spuIds + * @return + */ + ServerResponseEntity> listSpuBySpuIds(List spuIds); + + /** + * 获取spu分组列表 + * + * @param spuId + * @return spu分组列表 + */ + ServerResponseEntity> getSpuTagBySpuId(Long spuId); + + /** + * 商品状态发生改变时,需要处理的事件 + * + * @param spuId 商品id + */ + void handleStatusChange(Long spuId); + +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuComboFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuComboFeignClient.java new file mode 100644 index 0000000..1b65c99 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuComboFeignClient.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public interface SkuComboFeignClient { + + /** + * 通过skuId获取组合的商品信息 + * @param skuId skuIds + * @return sku信息 + */ + ServerResponseEntity> getCombSpusBySkuId(Long skuId); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuStockChangeFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuStockChangeFeignClient.java new file mode 100644 index 0000000..7bcec6f --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SkuStockChangeFeignClient.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.api.product.dto.SkuStockLockDTO; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/22 + */ +public interface SkuStockChangeFeignClient { + + /** + * 锁定库存 + * @param skuStockLocks 参数 + * @return 是否成功 + */ + ServerResponseEntity lock(List skuStockLocks); + + /** + * 锁定采购订单的库存 + * @param skuStockLocks 参数 + * @return 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 异常返回 skuId + */ + String lockPurchaseOrder(List skuStockLocks); + + /** + * 采购订单减少锁定库存 + * @param skuStockLockList + * @return 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 异常返回 skuId + */ + String purchaseOrderReduceLockStock(List skuStockLockList); + + /** + * 调拨订单锁定库存 + * @param skuStockLocks 库存锁定参数 + * @return 操作后的redis库存信息 + */ + String lockAllotOrder(List skuStockLocks); + + /** + * 调拨订单减少锁定库存 + * @param skuStockLocks 库存锁定参数 + * @return 操作后的redis库存信息 + */ + String reduceLockAllotOrder(List skuStockLocks); + + /** + * 改变sku库存 + * @param skuStockLocks + * @return 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存... + * 异常返回 skuId + */ + String changeStock(List skuStockLocks); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuFeignClient.java new file mode 100644 index 0000000..b2ee5d4 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/SpuFeignClient.java @@ -0,0 +1,425 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public interface SpuFeignClient { + + /** + * 通过spuId需要搜索的商品 + * + * @param spuId spuid + * @return 商品信息(spuId, name, mainImgUrl) + */ + ServerResponseEntity getById(Long spuId); + + /** + * 通过spuId需要搜索的商品 + * + * @param spuId spuid + * @return 商品信息(spuId, name, mainImgUrl) + */ + ServerResponseEntity getDetailById(Long spuId); + + /** + * 通过spuId需要搜索的商品 + * + * @param spuId spuId + * @param skuId skuId + * @param supplierSpu 是否供应商商品 + * @return 商品信息 + */ + ServerResponseEntity getSpuAndSkuAndRateById(Long spuId, Long skuId, Boolean supplierSpu); + + /** + * 根据店铺id或者商品id或者为空直接获取可以参与秒杀活动的商品列表 + * + * @param spuId spuId + * @param shopId 店铺id + * @return 商品信息 + */ + ServerResponseEntity> listCanSeckillProd(Long spuId, + Long shopId); + + /** + * 根据商品编码获取商品列表 + * + * @param partyCodeList 商品编码 + * @param shopId + * @return 商品信息 + */ + ServerResponseEntity> listPurchaseSpuByPartyCodeList(List partyCodeList, + Long shopId); + + /** + * 获取商品活动信息 + * + * @param shopId + * @param spuId + * @return + */ + ServerResponseEntity spuActivityBySpuId(Long shopId, Long spuId); + + /** + * 下线spu + * + * @param shopId + * @return + */ + ServerResponseEntity offlineSpuByShopId(Long shopId); + + /** + * 根据店铺id下线店铺商品(批量) + * + * @param shopIds 店铺id集合 + * @return + */ + ServerResponseEntity offlineSpuByShopIds(List shopIds); + + /** + * 根据供应商Id下线供应商店铺的商品 + * + * @param supplierId + * @return + */ + ServerResponseEntity offlineSpuBySupplierId(Long supplierId); + + /** + * 获取spu和sku信息, 包含了商品的库存和销量 + * + * @param spuId + * @return + */ + ServerResponseEntity getSpuAndSkuBySpuId(Long spuId); + + /** + * 更新商品类型 + * + * @param spuDTO + * @return + */ + ServerResponseEntity changeSpuType(SpuDTO spuDTO); + + /** + * 根据运费id获取商品数量 + * + * @param transportId + * @return + */ + ServerResponseEntity countByTransportId(Long transportId); + + /** + * 删除商品活动缓存 + * + * @param shopId null:代表所有的店铺 not null: 指定到具体店铺(若不指定spuIds,则按店铺、平台清除商品的缓存) + * @param spuIds 商品id列表不为空代表有指定删除缓存的商品列表,就不进行全店铺/平台的商品缓存清除 + */ + void removeSpuActivityCache(Long shopId, List spuIds); + + /** + * 将商品变为普通商品 + * + * @param spuIds 商品id + */ + void changeToNormalSpu(List spuIds); + + /** + * 根据用户id查询商品收藏数量 + * + * @param userId 用户id + * @return 商品收藏数量 + */ + ServerResponseEntity countByUserId(Long userId); + + /** + * 根据商品id列表获取商品名称列表 + * + * @param spuIds + * @return + */ + ServerResponseEntity> listSpuNameBySpuIds(List spuIds); + + /** + * 根据商品id列表获取商品列表 + * + * @param spuIds + * @return + */ + ServerResponseEntity> listSpuBySpuIds(List spuIds); + + /** + * 根据店铺id列表更新商品更新时间 + * + * @param shopIds + * @param sysType + * @return + */ + ServerResponseEntity updateSpuUpdateTimeByShopIds(List shopIds, Integer sysType); + + /** + * 更新商品更新时间 + * + * @param spuIds + * @return + */ + void updateSpuUpdateTimeBySpuIds(List spuIds); + + /** + * 失效商品活动信息,不需要下架商品 + * + * @param shopIds + * @return + */ + ServerResponseEntity offlineSpuActivityByShopIds(List shopIds); + + /** + * 根据基本信息查询商品列表 + * + * @param spuSimpleBO + * @return + */ + ServerResponseEntity> listSimple(SpuSimpleBO spuSimpleBO); + + /** + * 根据基本信息查询商品列表(包括删除商品) + * + * @param spuSimpleBO + * @return + */ + ServerResponseEntity> listSimples(SpuSimpleBO spuSimpleBO); + + + /** + * 获取指定sku的价格 + * + * @param skuIds + * @return + */ + ServerResponseEntity> listSkuPriceByIds(List skuIds); + + /** + * 根据店铺id获取所有商品id + * + * @param shopId + * @return + */ + ServerResponseEntity> listSpuIdsByShopId(Long shopId); + + /** + * 根据spuIds校验状态 + * + * @param spuIds + * @return + */ + ServerResponseEntity checkSpuStatus(List spuIds); + + /** + * 根据供应商id和商品规格id获取商品信息 + * + * @param skuList 商品规格 + * @param supplierId 供应商id + * @return 商品信息 + */ + ServerResponseEntity> listSpuAndSkuById(List skuList, Long supplierId); + + /** + * 根据店铺id和供应商商品id判断店铺是否代销了 + * + * @param spuAdminVOList + * @param shopId + * @return + */ + ServerResponseEntity> isCommissionByShopIdAndSpuId(List spuAdminVOList, Long shopId); + + /** + * 供应商修改供货价时修改代销商品价格 + * + * @param supplierSpuId + * @param price + * @param marketPriceFee + */ + void soldOutSpuBySpu(Long supplierSpuId, Long price, Long marketPriceFee); + + /** + * 供应商改变供应商品状态时代销商品同步状态 + * + * @param supplierSpuId + * @param status + */ + void supplierUpdateSpuStatus(Long supplierSpuId, Integer status); + + /** + * 获取代销商品 供应商商品更新后代销商品是否已同步更新 值 + * + * @param spuIds + * @return + */ + ServerResponseEntity> getSpuIsSynUpdate(List spuIds); + + /** + * 供应商商品变更后对应下架不同类型的代销商品 + * + * @param supplierSpuId + * @param commissionSpuOffType + * @return + */ + ServerResponseEntity supplierSpuUpdateLaterOffSpu(Long supplierSpuId, Integer commissionSpuOffType); + + /** + * 供货价发生变化、sku种类增加,商家是手动设价,下架商家的商品 + * + * @param supplierSpuId + */ + void skuUpdateLaterOperate(Long supplierSpuId); + + /** + * 验证 当商家设置了手动设价--供货价高于售价自动下架商品 发布的商品售价是否低于供货价 低于就下架代销商品 + * + * @param esProductBO + * @return + */ + ServerResponseEntity feePriceUnderSupplyPrice(EsProductBO esProductBO); + + + /** + * 供应商变更了商品信息,下架手动设价的代销商品 + * + * @param supplierSpuId + * @param isFiltration + * @param type + */ + void soldOutManualPriceCommissionSpu(Long supplierSpuId, Integer type, Integer isFiltration); + + /** + * 供应商品sku增加或者删除处理代销商品sku + * + * @param supplierSpuId + * @param skuId + */ + void supplierSkuAddOrDeleteLaterOperate(Long supplierSpuId, Long skuId); + + /** + * change + * @param supplierSpuId + */ + void changeSynUpdate(Long supplierSpuId); + + /** + * 商家修改代销设置,更新已导入的代销商品价格 + * + * @param shopId + */ + void updateManualPriceCommissionSpuPrice(Long shopId); + + /** + * 商家端获取商品信息列表时 检查代销商品基本信息是否改变,如果改变了显示商家自己商品信息,没有改变则显示供应商信息 + * + * @param spuAdminVOList + * @return + */ + ServerResponseEntity> checkCommissionSpuIsUpdateMsg(List spuAdminVOList); + + /** + * 商家端获取商品信息列表时 检查代销商品基本信息是否改变,如果改变了显示商家自己商品信息,没有改变则显示供应商信息 + * + * @param productSearchVOList + * @return + */ + ServerResponseEntity> usCheckCommissionSpuIsUpdateMsg(List productSearchVOList); + + /** + * 秒杀支付成功后,更新商品的销量 + * + * @param spuId + * @param prodCount + */ + void updateSaleNumBySeckillOrder(Long spuId, Integer prodCount); + + /** + * 根据商品id列表获取商品列表(无需授权) + * + * @param spuIds + * @return + */ + ServerResponseEntity> listSpuBySpuIdsNo(List spuIds); + + /** + * 根据spuIds获取商品信息 + * + * @param spuIdS + * @return mainImgUrl + */ + ServerResponseEntity> getDetailBySpuIds(List spuIdS); + + /** + * 根据供应商id列表下架商品 + * + * @param supplierIdsToStop + * @return + */ + ServerResponseEntity batchChangeSpuStatusToDisableBySupplierIds(List supplierIdsToStop); + + /** + * 供应商品更新品牌或者排序时,同步更新代销商品的品牌或排序 + * + * @param brandId + * @param seq + * @param supplierSpuId + */ + void syncUpdateCommissionSpuBrandOrSeq(Long brandId, Integer seq, + Long supplierSpuId); + + + /** + * 添加采购订单时未导入的供应商品自动导入 + * + * @param spuVOList + * @param sysType + * @param userId + * @return + */ + ServerResponseEntity voluntarilyImportSupplierSpu(List spuVOList, Integer sysType, + Long userId); + + /** + * 根据店铺id更新商品 + * @param shopId 店铺id + * @param sysType 系统类型 + * @return + */ + ServerResponseEntity updateSpuByShopId(Long shopId,Integer sysType); + + /** + * 新增供应商sku时,更新代销商品的数据 + * @param spuId + * @param skuId + */ + void processSupplierSkuInsert(Long spuId, Long skuId); + + /** + * 获取店铺中指定供应商商品的代销商品列表 + * @param supplierSpuIds + * @return + */ + List listShopSpuBySupplierSpuIds(Long shopId, List supplierSpuIds); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/TakeStockFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/TakeStockFeignClient.java new file mode 100644 index 0000000..a45f4df --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/TakeStockFeignClient.java @@ -0,0 +1,21 @@ +package com.tmerclub.cloud.api.product.feign; + +/** + * @author gaozijie + * @since 2023-12-20 + */ +public interface TakeStockFeignClient { + + /** + * 统计未完成的实物盘点数 + * @param warehouseId 仓库id + * @return 未完成数 + */ + Long countUnFinish(Long warehouseId); + + /** + * 作废调拨订单(通过仓库id) + * @param warehouseId 仓库id + */ + void nullifyByWarehouseId(Long warehouseId); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/WarehouseFeignClient.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/WarehouseFeignClient.java new file mode 100644 index 0000000..448a900 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/feign/WarehouseFeignClient.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.feign; + +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.api.product.dto.WarehouseSearchDTO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author ZP + * @date + */ +public interface WarehouseFeignClient { + + /** + * 创建默认仓库 + * @param shopId + * @param sysType + * @param phone + * @param name + * @param addr + * @return + */ + ServerResponseEntity createWarehouseByShopId(Long shopId, Integer sysType, String phone, String name); + + /** + * 判断是否默认仓库 + * @param warehouseId + * @return + */ + ServerResponseEntity isDefaultWarehouse(Long warehouseId); + + /** + * 获取仓库(通过仓库id) + * @param warehouseId 仓库id + * @return 仓库VO + */ + WarehouseVO getWarehouseById(Long warehouseId); + + /** + * 查询仓库集合 + * @param warehouseSearchDTO 仓库查询dto + * @return 仓库集合 + */ + List listWarehouse(WarehouseSearchDTO warehouseSearchDTO); + + /** + * 查询可配送的仓库(有对应的区域仓库就返回区域仓库,没有就返回默认仓库) + * @param warehouseSearchDTO 仓库查询dto + * @return 仓库集合 + */ + List listCanDeliveryWarehouse(WarehouseSearchDTO warehouseSearchDTO); + + /** + * 获取商家的默认仓库id + * @param shopId + * @param sysType + * @return + */ + ServerResponseEntity getDefaultIdByShopId(Long shopId, Integer sysType); + + /** + * 获取店铺的所有仓库列表 + * @param shopId + * @param systype + * @return + */ + List listWarehouseByShopId(Long shopId, Integer systype); + + /** + * 根据门店创建仓库 + * @param warehouseDTO + * @return + */ + ServerResponseEntity insertWarehouseAndArea(WarehouseDTO warehouseDTO); + + /** + * 根据门店更新仓库 + * @param warehouseDTO + * @return + */ + ServerResponseEntity updateWarehouseAndArea(WarehouseDTO warehouseDTO); + + /** + * 根据门店id删除仓库 + * @param warehouseId + * @return + */ + ServerResponseEntity deleteWarehouseAndArea(Long warehouseId); +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/manager/ShopCartItemAdapter.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/manager/ShopCartItemAdapter.java new file mode 100644 index 0000000..f880537 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/manager/ShopCartItemAdapter.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.manager; + +import com.tmerclub.cloud.api.product.feign.ShopCartFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.ShopCartItemDTO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.dto.CartComboMatchSpuDTO; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.PriceUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 购物车适配器 + * + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@Component +public class ShopCartItemAdapter { + + + private final Logger LOGGER = LoggerFactory.getLogger(ShopCartItemAdapter.class); + @DubboReference + private ShopCartFeignClient shopCartFeignClient; + + + /** + * 获取购物项组装信息 + * + * @param shopCartItemParam 购物项参数 + * @return 购物项组装信息 + */ + public List getShopCartItems(ShopCartItemDTO shopCartItemParam, Long userId, Long addrId, List dvyTypes) { + // 组装订单项,根据购物车或者立即购买, 分别组装订单项,购物车要查询一次数据库 shop_cart_item + List shopCartItems; + // 当立即购买时,没有提交的订单是没有购物车信息的 + if (Objects.nonNull(shopCartItemParam)) { + shopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(shopCartItemParam.getComboId())) { + LOGGER.info("立即购买-套餐商品"); + // ==================== 套餐主商品 ==================== + Integer mainCount = shopCartItemParam.getCount() * shopCartItemParam.getComboMainLeastNum(); + ShopCartItemVO mainShopCartItem = new ShopCartItemVO(userId, shopCartItemParam.getSpuId(), shopCartItemParam.getSkuId(), mainCount); + shopCartItems.add(mainShopCartItem); + // ==================== 套餐搭配商品 ==================== + // 搭配商品列表 + for (CartComboMatchSpuDTO cartComboMatchSpu : shopCartItemParam.getCartComboMatchSpuDTOS()) { + ShopCartItemVO matchShopCartItem = new ShopCartItemVO(userId, cartComboMatchSpu.getSpuId(), cartComboMatchSpu.getSkuId(), cartComboMatchSpu.getCount()); + shopCartItems.add(matchShopCartItem); + } + for (ShopCartItemVO shopCartItem : shopCartItems) { + shopCartItem.setComboId(shopCartItemParam.getComboId()); + shopCartItem.setComboCount(shopCartItem.getCount()); + } + } + // 非套餐商品 + else { + LOGGER.info("立即购买-商品"); + // 立即购买只有一件商品 + ShopCartItemVO shopCartItemVO = new ShopCartItemVO(userId, shopCartItemParam.getSpuId(), shopCartItemParam.getSkuId(), shopCartItemParam.getCount()); + shopCartItems.add(shopCartItemVO); + } + // 分销员id + for (ShopCartItemVO shopCartItem : shopCartItems) { + shopCartItem.setDistributionUserId(shopCartItemParam.getDistributionUserId()); + } + // 组装订单项数据 + shopCartItems = shopCartFeignClient.handleShopCartItem(shopCartItems, dvyTypes, null); + } + // 从购物车提交订单 + else { + // 查询购物车信息 + LOGGER.info("从购物车提交订单,处理购物车信息"); + shopCartItems = shopCartFeignClient.getCheckedShopCartItems(addrId, dvyTypes); + } + return shopCartItems; + } + + + /** + * 将参数转换成组装好的购物项 + * + * @param shopCartItemParam 购物项参数 + * @param activityPriceFee 活动价 + * @param userId 用户id + * @return 组装好的购物项 + */ + public List conversionShopCartItem(ShopCartItemDTO shopCartItemParam, Long activityPriceFee, Long userId, List dvyTypes) { + ShopCartItemVO shopCartItem = new ShopCartItemVO(userId, shopCartItemParam.getSpuId(), shopCartItemParam.getSkuId(), shopCartItemParam.getCount()); + List shopCartItemList = shopCartFeignClient.handleShopCartItem(Collections.singletonList(shopCartItem), dvyTypes, null); + shopCartItem = shopCartItemList.get(0); + + // 如果活动价大于0则使用活动价格 + if (activityPriceFee == null || activityPriceFee < 1L) { + return shopCartItemList; + } + // 如果是组合商品,需要重新计算一下所有组合的商品 + if(Objects.equals(shopCartItem.getMold(), SpuMold.COMBO.value())){ + Long totalShareReduce = (shopCartItem.getSkuPriceFee() - activityPriceFee) * shopCartItem.getCount(); + long totalSkuPriceFee = 0L; + for (int i = 0; i < shopCartItem.getComboShopCartItems().size(); i++) { + ShopCartItemVO comboShopCartItemVO = shopCartItem.getComboShopCartItems().get(i); + long comboItemShareReduce; + if (shopCartItem.getComboShopCartItems().size() - 1 == i) { + comboItemShareReduce = totalShareReduce - totalSkuPriceFee; + } else { + comboItemShareReduce = PriceUtil.divideByBankerRounding((long) Arith.mul(totalShareReduce, comboShopCartItemVO.getTotalAmount()), shopCartItem.getTotalAmount()); + } + // 商品实际金额,优惠金额放入店铺金额 + // comboShopCartItemVO.setSkuPriceFee(activityPriceFee); + comboShopCartItemVO.setActualTotal(comboShopCartItemVO.getActualTotal() - comboItemShareReduce); + comboShopCartItemVO.setShareReduce(comboItemShareReduce); + LOGGER.info("组合商品使用活动价格"); + totalSkuPriceFee += comboItemShareReduce; + } + } + // 商品实际金额,优惠金额放入店铺金额 + shopCartItem.setSkuPriceFee(activityPriceFee); + shopCartItem.setActualTotal(shopCartItem.getCount() * activityPriceFee); + long shareReduce = shopCartItem.getTotalAmount() - shopCartItem.getActualTotal() < 0 ? 0 : shopCartItem.getTotalAmount() - shopCartItem.getActualTotal(); + shopCartItem.setShareReduce(shareReduce); + LOGGER.info("活动价大于0则使用活动价格"); + return shopCartItemList; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/vo/ProdEffectRespVO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/vo/ProdEffectRespVO.java new file mode 100644 index 0000000..80778c6 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/vo/ProdEffectRespVO.java @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Pineapple + * @date 2021/5/21 16:06 + */ +public class ProdEffectRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public ProdEffectRespVO() { + this.spuId = 0L; + this.price = 0L; + this.expose = 0L; + this.exposePersonNum = 0; + this.addCartPerson = 0; + this.addCart = 0; + this.placeOrderPerson = 0; + this.payPerson = 0; + this.placeOrderNum = 0; + this.payNum = 0; + this.placeOrderAmount = 0D; + this.payAmount = 0D; + this.refundNum = 0; + this.refundPerson = 0; + this.refundSuccessNum = 0; + this.refundSuccessPerson = 0; + this.refundSuccessAmount = 0D; + this.refundSuccessRate = 0D; + } + + /** + * 商品id + */ + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "店铺名称") + private String shopName; + /** + * 商品名称 + */ + @Schema(description = "商品名称") + private String spuName; + /** + * 商品图片 + */ + @Schema(description = "商品图片") + private String spuUrl; + /** + * 商品价格 + */ + @Schema(description = "商品价格") + private Long price; + /** + * 曝光次数 + */ + @Schema(description = "曝光次数") + private Long expose; + /** + * 曝光人数 + */ + @Schema(description = "曝光人数") + private Integer exposePersonNum; + /** + * 加购人数 + */ + @Schema(description = "加购人数") + private Integer addCartPerson; + /** + * 加购件数 + */ + @Schema(description = "加购件数") + private Integer addCart; + /** + * 下单人数 + */ + @Schema(description = "下单人数") + private Integer placeOrderPerson; + /** + * 支付人数 + */ + @Schema(description = "支付人数") + private Integer payPerson; + /** + * 下单商品件数 + */ + @Schema(description = "下单商品件数") + private Integer placeOrderNum; + /** + * 支付商品件数 + */ + @Schema(description = "支付商品件数") + private Integer payNum; + /** + * 商品下单金额 + */ + @Schema(description = "商品下单金额") + private Double placeOrderAmount; + /** + * 商品支付金额 + */ + @Schema(description = "商品支付金额") + private Double payAmount; + /** + * 申请退款订单数 + */ + @Schema(description = "申请退款订单数") + private Integer refundNum; + + /** + * 申请退款人数 + */ + @Schema(description = "申请退款人数") + private Integer refundPerson; + /** + * 成功退款订单数 + */ + @Schema(description = "成功退款订单数") + private Integer refundSuccessNum; + /** + * 成功退款人数 + */ + @Schema(description = "成功退款人数") + private Integer refundSuccessPerson; + /** + * 成功退款金额 + */ + @Schema(description = "成功退款金额") + private Double refundSuccessAmount; + /** + * 退款率 + */ + @Schema(description = "退款率") + private Double refundSuccessRate; + + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSpuUrl() { + return spuUrl; + } + + public void setSpuUrl(String spuUrl) { + this.spuUrl = spuUrl; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getExpose() { + return expose; + } + + public void setExpose(Long expose) { + this.expose = expose; + } + + public Integer getExposePersonNum() { + return exposePersonNum; + } + + public void setExposePersonNum(Integer exposePersonNum) { + this.exposePersonNum = exposePersonNum; + } + + public Integer getAddCartPerson() { + return addCartPerson; + } + + public void setAddCartPerson(Integer addCartPerson) { + this.addCartPerson = addCartPerson; + } + + public Integer getAddCart() { + return addCart; + } + + public void setAddCart(Integer addCart) { + this.addCart = addCart; + } + + public Integer getPlaceOrderPerson() { + return placeOrderPerson; + } + + public void setPlaceOrderPerson(Integer placeOrderPerson) { + this.placeOrderPerson = placeOrderPerson; + } + + public Integer getPayPerson() { + return payPerson; + } + + public void setPayPerson(Integer payPerson) { + this.payPerson = payPerson; + } + + public Integer getPlaceOrderNum() { + return placeOrderNum; + } + + public void setPlaceOrderNum(Integer placeOrderNum) { + this.placeOrderNum = placeOrderNum; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + public Double getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Double placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getRefundNum() { + return refundNum; + } + + public void setRefundNum(Integer refundNum) { + this.refundNum = refundNum; + } + + public Integer getRefundPerson() { + return refundPerson; + } + + public void setRefundPerson(Integer refundPerson) { + this.refundPerson = refundPerson; + } + + public Integer getRefundSuccessNum() { + return refundSuccessNum; + } + + public void setRefundSuccessNum(Integer refundSuccessNum) { + this.refundSuccessNum = refundSuccessNum; + } + + public Integer getRefundSuccessPerson() { + return refundSuccessPerson; + } + + public void setRefundSuccessPerson(Integer refundSuccessPerson) { + this.refundSuccessPerson = refundSuccessPerson; + } + + public Double getRefundSuccessAmount() { + return refundSuccessAmount; + } + + public void setRefundSuccessAmount(Double refundSuccessAmount) { + this.refundSuccessAmount = refundSuccessAmount; + } + + public Double getRefundSuccessRate() { + return refundSuccessRate; + } + + public void setRefundSuccessRate(Double refundSuccessRate) { + this.refundSuccessRate = refundSuccessRate; + } + + @Override + public String toString() { + return "ProdEffectRespVO{" + + "spuId=" + spuId + + ", shopName='" + shopName + '\'' + + ", spuName='" + spuName + '\'' + + ", spuUrl='" + spuUrl + '\'' + + ", price=" + price + + ", expose=" + expose + + ", exposePersonNum=" + exposePersonNum + + ", addCartPerson=" + addCartPerson + + ", addCart=" + addCart + + ", placeOrderPerson=" + placeOrderPerson + + ", payPerson=" + payPerson + + ", placeOrderNum=" + placeOrderNum + + ", payNum=" + payNum + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", refundNum=" + refundNum + + ", refundPerson=" + refundPerson + + ", refundSuccessNum=" + refundSuccessNum + + ", refundSuccessPerson=" + refundSuccessPerson + + ", refundSuccessAmount=" + refundSuccessAmount + + ", refundSuccessRate=" + refundSuccessRate + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/vo/SkuStockVO.java b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/vo/SkuStockVO.java new file mode 100644 index 0000000..aadc742 --- /dev/null +++ b/tmerclub-api/tmerclub-api-product/src/main/java/com/tmerclub/cloud/api/product/vo/SkuStockVO.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/12/22 + */ +public class SkuStockVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "产品ID") + private Long spuId; + + + @Schema(description = "shopId") + private Long shopId; + + @Schema(description = "orderId") + private Long orderId; + + @Schema(description = "库存数量") + private Integer stock; + + @Schema(description = "锁定库存数量") + private Integer lockStock; + + @Schema(description = "销量") + private Integer sale; + + @Schema(description = "sku和商品的状态,1.商品为上架且sku非禁用 0.商品非上架, 或者sku禁用") + private Integer status; + + /** + * 库存分片序号 + * 记录扣除分片的id,回调解锁的时候找到这个分片去扣锁定库存 + */ + @Schema(description = "库存分片序号") + private Integer zoneNo; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点类型 1仓库 2门店") + private Integer stockPointType; + + @Schema(description = "操作类型 LuaOperateEnum") + private Integer operateType; + + @Schema(description = "组合商品关联的主skuId") + private Long mainSkuId; + + @Schema(description = "组合数量") + private Integer comboCount; + + + public SkuStockVO() { + } + + public SkuStockVO(Long skuId) { + this.skuId = skuId; + this.stock = 0; + this.lockStock = 0; + this.sale = 0; + this.stockPointId = 0L; + } + + public SkuStockVO(Long skuId, Long stockPointId) { + this.skuId = skuId; + this.stockPointId = stockPointId; + this.stock = 0; + this.lockStock = 0; + this.sale = 0; + } + + public SkuStockVO(Long skuId, Integer stock, Long stockPointId, Integer stockPointType) { + this.skuId = skuId; + this.stock = stock; + this.stockPointId = stockPointId; + this.stockPointType = stockPointType; + this.sale = 0; + } + + public SkuStockVO(Long skuId, Integer stock, Integer lockStock, Integer sale, Long stockPointId) { + this.skuId = skuId; + this.stock = stock; + this.lockStock = lockStock; + this.sale = sale; + this.stockPointId = stockPointId; + } + + + public SkuStockVO(Long skuId, Integer stock) { + this.skuId = skuId; + this.stock = stock; + this.sale = 0; + } + public Long getMainSkuId() { + return mainSkuId; + } + + public void setMainSkuId(Long mainSkuId) { + this.mainSkuId = mainSkuId; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getLockStock() { + return lockStock; + } + + public void setLockStock(Integer lockStock) { + this.lockStock = lockStock; + } + + public Integer getSale() { + return sale; + } + + public void setSale(Integer sale) { + this.sale = sale; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOperateType() { + return operateType; + } + + public void setOperateType(Integer operateType) { + this.operateType = operateType; + } + + @Override + public String toString() { + return "SkuStockVO{" + + "skuId=" + skuId + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", stock=" + stock + + ", lockStock=" + lockStock + + ", sale=" + sale + + ", status=" + status + + ", zoneNo=" + zoneNo + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + ", operateType=" + operateType + + ", mainSkuId=" + mainSkuId + + ", comboCount=" + comboCount + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/dto/EsPageDTO.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/dto/EsPageDTO.java new file mode 100644 index 0000000..e54d522 --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/dto/EsPageDTO.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.dto; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Locale; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +public class EsPageDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String ASC = "ASC"; + + public static final String DESC = "DESC"; + + /** + * 最大分页大小,如果分页大小大于500,则用500作为分页的大小。防止有人直接传入一个较大的数,导致服务器内存溢出宕机 + */ + public static final Integer MAX_PAGE_SIZE = 500; + + /** + * 当前页 + */ + @NotNull(message = "pageNum 不能为空") + @Schema(description = "当前页", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer pageNum; + + @NotNull(message = "pageSize 不能为空") + @Schema(description = "每页大小", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer pageSize; + + @Schema(description = "排序字段数组,用逗号分割") + private String[] columns; + + @Schema(description = "排序字段方式,用逗号分割,ASC正序,DESC倒序") + private String[] orders; + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + if (pageSize > MAX_PAGE_SIZE) { + this.pageSize = MAX_PAGE_SIZE; + return; + } + this.pageSize = pageSize; + } + + public String getOrderBy() { + return order(this.columns, this.orders); + } + + public String[] getColumns() { + return columns; + } + + public void setColumns(String[] columns) { + this.columns = columns; + } + + public String[] getOrders() { + return orders; + } + + public void setOrders(String[] orders) { + this.orders = orders; + } + + public static String order(String[] columns, String[] orders) { + + if (columns == null || columns.length == 0) { + return ""; + } + + StringBuilder stringBuilder = new StringBuilder(Constant.INITIAL_CAPACITY); + + for (int x = 0; x < columns.length; x++) { + + String column = columns[x]; + String order; + + if (orders != null && orders.length > x) { + order = orders[x].toUpperCase(Locale.ROOT); + if (!(order.equals(ASC) || order.equals(DESC))) { + throw new IllegalArgumentException("非法的排序策略:" + column); + } + } else { + order = ASC; + } + + // 判断列名称的合法性,防止SQL注入。只能是【字母,数字,下划线】 + if (PrincipalUtil.isField(column)) { + throw new IllegalArgumentException("非法的排序字段名称:" + column); + } + + // 驼峰转换为下划线 + column = humpConversionUnderscore(column); + + if (x != 0) { + stringBuilder.append(", "); + } + stringBuilder.append("`").append(column).append("` ").append(order); + } + return stringBuilder.toString(); + } + + public static String humpConversionUnderscore(String value) { + StringBuilder stringBuilder = new StringBuilder(Constant.INITIAL_CAPACITY); + char[] chars = value.toCharArray(); + for (char character : chars) { + if (Character.isUpperCase(character)) { + character = Character.toLowerCase(character); + stringBuilder.append("_"); + } + stringBuilder.append(character); + } + return stringBuilder.toString(); + } + + + @Override + public String toString() { + return "EsPageDTO{" + + "pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", columns=" + Arrays.toString(columns) + + ", orders=" + Arrays.toString(orders) + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderFeignClient.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderFeignClient.java new file mode 100644 index 0000000..51a5f9e --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderFeignClient.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 订单搜索 + * @author FrozenWatermelon + * @date 2021/02/05 + */ +public interface SearchOrderFeignClient { + + /** + * 统计用户的订单相关信息 + * @param userIds 用户id集合 + * @return 用户的订单相关统计数据 + */ + ServerResponseEntity> countOrderByUserIds(List userIds); + + /** + * 分页获取订单信息 + * @param orderSearchDTO + * @return + */ + ServerResponseEntity> pageOrder(OrderSearchDTO orderSearchDTO); + + /** + * 获取订单数量 + * @param orderSearchDTO + * @return + */ + ServerResponseEntity countOrder(OrderSearchDTO orderSearchDTO); + + /** + * 获取订单列表 + * @param orderIds + * @return + */ + ServerResponseEntity> listOrderById(List orderIds); + + /** + * 获取订单列表 + * @param orderSearchDTO + * @return + */ + ServerResponseEntity> listOrder(OrderSearchDTO orderSearchDTO); + + /** + * 获取订单列表 + * @param orderItemIds + * @return + */ + ServerResponseEntity> getOrderItems(List orderItemIds); + + /** + * 获取订单列表 + * @param orderSearchDTO + * @return + */ + ServerResponseEntity> listEsOrder(OrderSearchDTO orderSearchDTO); +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderRefundFeignClient.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderRefundFeignClient.java new file mode 100644 index 0000000..bac2e42 --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/feign/SearchOrderRefundFeignClient.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.feign; + +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * 退款订单搜索 + * @author YXF + * @date 2022/08/24 + */ +public interface SearchOrderRefundFeignClient { + + /** + * 分页获取退款订单信息 + * @param orderRefundSearchDTO + * @return + */ + ServerResponseEntity> pageOrderRefund(OrderRefundSearchDTO orderRefundSearchDTO); +} diff --git a/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/vo/EsPageVO.java b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/vo/EsPageVO.java new file mode 100644 index 0000000..19ceec8 --- /dev/null +++ b/tmerclub-api/tmerclub-api-search/src/main/java/com/tmerclub/cloud/api/vo/EsPageVO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +public class EsPageVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "总页数") + private Integer pages; + + @Schema(description = "总条目数") + private Long total; + + @Schema(description = "结果集") + private List list; + + public Integer getPages() { + return pages; + } + + public void setPages(Integer pages) { + this.pages = pages; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @Override + public String toString() { + return "EsPageVO{" + + ", pages=" + pages + + ", total=" + total + + ", list=" + list + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-seckill/pom.xml b/tmerclub-api/tmerclub-api-seckill/pom.xml new file mode 100644 index 0000000..eb3ea7c --- /dev/null +++ b/tmerclub-api/tmerclub-api-seckill/pom.xml @@ -0,0 +1,28 @@ + + + + tmerclub-api + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-api-seckill + jar + 秒杀对内接口 + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + com.moyuer.cloud + tmerclub-common-product + ${project.version} + + + + diff --git a/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/vo/SeckillApiVO.java b/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/vo/SeckillApiVO.java new file mode 100644 index 0000000..583a55e --- /dev/null +++ b/tmerclub-api/tmerclub-api-seckill/src/main/java/com/tmerclub/cloud/api/seckill/vo/SeckillApiVO.java @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.seckill.vo; + +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 秒杀信息VO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillApiVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "活动名称") + private String seckillName; + + @Schema(description = "开始日期") + private Date startTime; + + @Schema(description = "结束日期") + private Date endTime; + + @Schema(description = "所选批次") + private Integer selectedLot; + + @Schema(description = "所选秒杀分类") + private Long categoryId; + + @Schema(description = "活动标签") + private String seckillTag; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "取消订单时间") + private Integer maxCancelTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "0 未删除 1已删除") + private Integer isDelete; + + @Schema(description = "状态(0:失效、1:正常、2:违规下架、3:等待审核)") + private Integer status; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品信息") + private SpuVO spuVO; + + @Schema(description = "秒杀活动剩余总库存") + private Integer seckillTotalStocks; + + @Schema(description = "秒杀活动原始库存") + private Integer seckillOriginStocks; + + @Schema(description = "秒杀活动最低价") + private Long seckillPrice; + + @Schema(description = "sku列表") + private List skuList; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public SpuVO getSpuVO() { + return spuVO; + } + + public void setSpuVO(SpuVO spuVO) { + this.spuVO = spuVO; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public String getSeckillName() { + return seckillName; + } + + public void setSeckillName(String seckillName) { + this.seckillName = seckillName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public String getSeckillTag() { + return seckillTag; + } + + public void setSeckillTag(String seckillTag) { + this.seckillTag = seckillTag; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getMaxCancelTime() { + return maxCancelTime; + } + + public void setMaxCancelTime(Integer maxCancelTime) { + this.maxCancelTime = maxCancelTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getSeckillTotalStocks() { + return seckillTotalStocks; + } + + public void setSeckillTotalStocks(Integer seckillTotalStocks) { + this.seckillTotalStocks = seckillTotalStocks; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "SeckillApiVO{" + + "seckillId=" + seckillId + + ", seckillName='" + seckillName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", selectedLot=" + selectedLot + + ", categoryId=" + categoryId + + ", seckillTag='" + seckillTag + '\'' + + ", maxNum=" + maxNum + + ", maxCancelTime=" + maxCancelTime + + ", shopId=" + shopId + + ", isDelete=" + isDelete + + ", status=" + status + + ", spuId=" + spuId + + ", spuVO=" + spuVO + + ", seckillTotalStocks=" + seckillTotalStocks + + ", seckillOriginStocks=" + seckillOriginStocks + + ", seckillPrice=" + seckillPrice + + ", skuList=" + skuList + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BalancePayBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BalancePayBO.java new file mode 100644 index 0000000..55a77cf --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BalancePayBO.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 充值成功通知 + * @author FrozenWatermelon + */ +public class BalancePayBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long payId; + private String orderIds; + + private Long changeBalance; + + private Boolean isVip; + + private Integer paySysType; + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getChangeBalance() { + return changeBalance; + } + + public void setChangeBalance(Long changeBalance) { + this.changeBalance = changeBalance; + } + + public Boolean getIsVip() { + return isVip; + } + + public void setIsVip(Boolean isVip) { + this.isVip = isVip; + } + + public Boolean getVip() { + return isVip; + } + + public void setVip(Boolean vip) { + isVip = vip; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "BalancePayBO{" + + "payId=" + payId + + ", orderIds='" + orderIds + '\'' + + ", changeBalance=" + changeBalance + + ", isVip=" + isVip + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BuyVipNotifyBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BuyVipNotifyBO.java new file mode 100644 index 0000000..d0a46cc --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/BuyVipNotifyBO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 购买vip + * @author FrozenWatermelon + */ +public class BuyVipNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userLevelLogId; + + private Integer payType; + + private Long payId; + + public BuyVipNotifyBO() { + } + + public BuyVipNotifyBO(Long userLevelLogId, Integer payType, Long payId) { + this.userLevelLogId = userLevelLogId; + this.payType = payType; + this.payId = payId; + } + + public Long getUserLevelLogId() { + return userLevelLogId; + } + + public void setUserLevelLogId(Long userLevelLogId) { + this.userLevelLogId = userLevelLogId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + @Override + public String toString() { + return "BuyVipNotifyBO{" + + "userLevelLogId=" + userLevelLogId + + ", payType=" + payType + + ", payId=" + payId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UidAndUserIdBO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UidAndUserIdBO.java new file mode 100644 index 0000000..4509ec4 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UidAndUserIdBO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * uid和用户id,注册的时候用 + * @author FrozenWatermelon + */ +public class UidAndUserIdBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long uid; + + private Long userId; + + public UidAndUserIdBO(Long uid, Long userId) { + this.uid = uid; + this.userId = userId; + } + + public UidAndUserIdBO() { + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "UidAndUserIdBO{" + + "uid=" + uid + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderScoreBo.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderScoreBo.java new file mode 100644 index 0000000..6be743e --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/bo/UserOrderScoreBo.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 用户购物抵扣积分 + * @author cl + * @date 2021-07-17 15:18:02 + */ +public class UserOrderScoreBo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + private Long userId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 退款id + */ + private Long refundId; + + /** + * 订单使用积分 + */ + private Long orderScore; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + @Override + public String toString() { + return "UserOrderScoreBo{" + + "userId=" + userId + + ", orderId=" + orderId + + ", refundId=" + refundId + + ", orderScore=" + orderScore + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/CustomerReqDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/CustomerReqDTO.java new file mode 100644 index 0000000..566695c --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/CustomerReqDTO.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lhd + */ +public class CustomerReqDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 时间类型 1:自然日 2:自然周 3:自然月 4:今日实时 5:近七天 6:近30天 + */ + @Schema(description = "时间类型 1:自然日 2:自然周 3:自然月 4:今日实时 5:近七天 6:近30天") + private Integer dateType; + /** + * 开始时间 + */ + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + /** + * 开始时间 + */ + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dayStartTime; + /** + * 结束时间 + */ + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + /** + * 时间 + */ + @Schema(description = "不传字段") + private Date dateTime; + + /** + * 店铺id + */ + @Schema(description = "不传字段") + private Long shopId; + + /** + * 第三方系统id 1:微信小程序 + */ + @Schema(description = "不传字段") + private Integer appId; + + /** + * 粉丝=付费会员 + */ + private Integer member; + + public CustomerReqDTO() { + } + + public CustomerReqDTO(Date startTime, Date endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + public Date getDayStartTime() { + return dayStartTime; + } + + public void setDayStartTime(Date dayStartTime) { + this.dayStartTime = dayStartTime; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getDateTime() { + return dateTime; + } + + public void setDateTime(Date dateTime) { + this.dateTime = dateTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getAppId() { + return appId; + } + + public void setAppId(Integer appId) { + this.appId = appId; + } + + public Integer getMember() { + return member; + } + + public void setMember(Integer member) { + this.member = member; + } + + @Override + public String toString() { + return "CustomerReqDTO{" + + "dateType=" + dateType + + ", startTime=" + startTime + + ", dayStartTime=" + dayStartTime + + ", endTime=" + endTime + + ", dateTime=" + dateTime + + ", shopId=" + shopId + + ", appId=" + appId + + ", member=" + member + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/FinanceDetailDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/FinanceDetailDTO.java new file mode 100644 index 0000000..4581153 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/FinanceDetailDTO.java @@ -0,0 +1,136 @@ +package com.tmerclub.cloud.api.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +public class FinanceDetailDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "订单号") + private Long orderId; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式 -1不限 0积分 1微信 2支付宝...") + @NotNull(message = "支付方式不能为空") + private Integer payType; + + @Schema(description = "语言") + private Integer lang; + + @Schema(description = "请求财务类型:1.订单支付 2.退款 3.余额充值 4.会员购买") + private Integer financeBizType; + + @Schema(description = "当前页") + private Integer pageNum; + + @Schema(description = "每页大小") + private Integer pageSize; + + @Schema(description = "支付系统类型") + private Integer paySysType; + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Integer getFinanceBizType() { + return financeBizType; + } + + public void setFinanceBizType(Integer financeBizType) { + this.financeBizType = financeBizType; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "FinanceDetailDTO{" + + "startTime=" + startTime + + ", endTime=" + endTime + + ", orderId=" + orderId + + ", payType=" + payType + + ", lang=" + lang + + ", financeBizType=" + financeBizType + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/ShopCustomerReqDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/ShopCustomerReqDTO.java new file mode 100644 index 0000000..e21afae --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/ShopCustomerReqDTO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2023-01-15 15:53:16 + */ +public class ShopCustomerReqDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺id列表") + private List shopIds; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "ShopCustomerReqDTO{" + + "userId=" + userId + + ", shopId=" + shopId + + ", shopIds=" + shopIds + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserExtensionDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserExtensionDTO.java new file mode 100644 index 0000000..3a4c48e --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserExtensionDTO.java @@ -0,0 +1,109 @@ +package com.tmerclub.cloud.api.user.dto; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-05-23 + */ +public class UserExtensionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + private Long userId; + /** + * 通联会员创建 + */ + private Integer allinpayCreate; + /** + * 通联是否实名认证 + */ + private Integer allinpayRealNameSet; + /** + * 通联是否绑定手机号 + */ + private Integer allinpayPhoneBind; + /** + * 通联是否设置支付密码 + */ + private Integer allinpayPayPwdSet; + /** + * 通联是否签订提现协议 + */ + private Integer allinpayProtocolSign; + /** + * 通联是否绑定支付标识 + */ + private Integer allinpayPayAcctBind; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getAllinpayCreate() { + return allinpayCreate; + } + + public void setAllinpayCreate(Integer allinpayCreate) { + this.allinpayCreate = allinpayCreate; + } + + public Integer getAllinpayRealNameSet() { + return allinpayRealNameSet; + } + + public void setAllinpayRealNameSet(Integer allinpayRealNameSet) { + this.allinpayRealNameSet = allinpayRealNameSet; + } + + public Integer getAllinpayPhoneBind() { + return allinpayPhoneBind; + } + + public void setAllinpayPhoneBind(Integer allinpayPhoneBind) { + this.allinpayPhoneBind = allinpayPhoneBind; + } + + public Integer getAllinpayPayPwdSet() { + return allinpayPayPwdSet; + } + + public void setAllinpayPayPwdSet(Integer allinpayPayPwdSet) { + this.allinpayPayPwdSet = allinpayPayPwdSet; + } + + public Integer getAllinpayProtocolSign() { + return allinpayProtocolSign; + } + + public void setAllinpayProtocolSign(Integer allinpayProtocolSign) { + this.allinpayProtocolSign = allinpayProtocolSign; + } + + public Integer getAllinpayPayAcctBind() { + return allinpayPayAcctBind; + } + + public void setAllinpayPayAcctBind(Integer allinpayPayAcctBind) { + this.allinpayPayAcctBind = allinpayPayAcctBind; + } + + @Override + public String toString() { + return "UserExtensionDTO{" + + "userId=" + userId + + ", allinpayCreate=" + allinpayCreate + + ", allinpayRealNameSet=" + allinpayRealNameSet + + ", allinpayPhoneBind=" + allinpayPhoneBind + + ", allinpayPayPwdSet=" + allinpayPayPwdSet + + ", allinpayProtocolSign=" + allinpayProtocolSign + + ", allinpayPayAcctBind=" + allinpayPayAcctBind + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserRegisterDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserRegisterDTO.java new file mode 100644 index 0000000..542a2d7 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserRegisterDTO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/30 + */ +@Schema(description = "设置用户信息") +public class UserRegisterDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "密码") + private String password; + + @NotBlank + @Schema(description = "手机号") + private String mobile; + + @Schema(description = "tempUid") + private String tempUid; + + @Schema(description = "校验登陆注册验证码成功的标识") + private String checkRegisterSmsFlag; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getCheckRegisterSmsFlag() { + return checkRegisterSmsFlag; + } + + public void setCheckRegisterSmsFlag(String checkRegisterSmsFlag) { + this.checkRegisterSmsFlag = checkRegisterSmsFlag; + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + @Override + public String toString() { + return "UserRegisterDTO{" + + "password='" + password + '\'' + + ", mobile='" + mobile + '\'' + + ", tempUid='" + tempUid + '\'' + + ", checkRegisterSmsFlag='" + checkRegisterSmsFlag + '\'' + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserTypeDTO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserTypeDTO.java new file mode 100644 index 0000000..286a143 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/dto/UserTypeDTO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.dto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author FrozenWatermelon + * @date 2020/12/22 + */ +public class UserTypeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userId; + + private Date createTime; + + public UserTypeDTO() { + } + + public UserTypeDTO(Long userId, Date createTime) { + this.userId = userId; + this.createTime = createTime; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "UseLevelLogDTO{" + + "userId=" + userId + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/ShopCustomerFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/ShopCustomerFeignClient.java new file mode 100644 index 0000000..401cbed --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/ShopCustomerFeignClient.java @@ -0,0 +1,18 @@ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.user.dto.ShopCustomerReqDTO; + +import java.util.List; + +/** + * 店铺客户 + * @author: zsm + * @date: 2023/1/15 16:44 + */ +public interface ShopCustomerFeignClient { + /** + * 批量保存 + * @param shopCustomerReqList + */ + void saveBatchByOrders(List shopCustomerReqList); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserConsigneeFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserConsigneeFeignClient.java new file mode 100644 index 0000000..8b77a44 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserConsigneeFeignClient.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.common.order.vo.UserConsigneeVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * 用户地址feign连接 + * @author FrozenWatermelon + * @date 2020/12/07 + */ +public interface UserConsigneeFeignClient { + + + /** + * 根据地址id获取用户提货人信息 + * @return 用户地址信息 + */ + ServerResponseEntity getUseConsignee(); + +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserExtensionFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserExtensionFeignClient.java new file mode 100644 index 0000000..1857ea9 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserExtensionFeignClient.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-05-23 + */ +public interface UserExtensionFeignClient { + + /** + * 更新用户拓展信息 + * @param userExtensionDTO 用户拓展信息 + */ + void updateExtension(UserExtensionDTO userExtensionDTO); + + /** + * 批量更新用户拓展信息状态 + * @param userExtensionDTO 用户拓展信息dto + * @param userIds 用户id集合 + */ + void updateBatchStatus(UserExtensionDTO userExtensionDTO, List userIds); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserFeignClient.java new file mode 100644 index 0000000..4f89920 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserFeignClient.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.user.bo.UidAndUserIdBO; +import com.tmerclub.cloud.api.user.dto.CustomerReqDTO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.dto.UserRegisterDTO; +import com.tmerclub.cloud.api.user.vo.MemberContributeRespVO; +import com.tmerclub.cloud.api.user.vo.MemberCountVO; +import com.tmerclub.cloud.api.user.vo.MemberTrendRespVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import jakarta.validation.Valid; + +import java.util.Date; +import java.util.List; + +/** + * 用户信息feign连接 + * @author FrozenWatermelon + * @date 2020/12/07 + */ +public interface UserFeignClient { + + /** + * 根据用户id列表,获取用户信息 + * @param userIds 用户id列表 + * @return 用户列表信息 + */ + ServerResponseEntity> getUserByUserIds(List userIds); + + /** + * 根据搜索条件查询用户列表 + * @param userApiVO + * @return 用户列表信息 + */ + ServerResponseEntity> getUserByParam(UserApiVO userApiVO); + + /** + * 根据用户id获取用户详细信息 + * @param userId 用户id + * @return 用户详细信息 + */ + ServerResponseEntity getUserAndOpenIdsByUserId(Long userId); + + /** + * 获取用户数据 + * @param userId + * @return + */ + ServerResponseEntity getUserData(Long userId); + + /** + * 跳过鉴权获取用户数据 + * @param userId 用户id + * @return UserApiVO 用户信息 + */ + ServerResponseEntity getInsiderUserData(Long userId); + + + /** + * 获取用户分析数据 + * @param param 筛选参数 + * @return 用户分析数据 + */ + ServerResponseEntity> getMeetConditionsUserIds(MemberReqDTO param); + + /** + * --------------数据分析相关sql-------------- + * 根据条件参数,统计会员数量 + * @param param 参数 + * @return 数量 + */ + ServerResponseEntity getMemberContributeByParam(MemberReqDTO param); + + /** + * 筛选时间类的每一天注册的会员数数据 + * @param param 参数 + * @return 会员数数据 + */ + ServerResponseEntity getMemberTrend(MemberReqDTO param); + + /** + * 根据手机号码查询用户数量 + * @param mobile 手机号码 + * @return 用户数量 + */ + ServerResponseEntity> countUserByMobile(String mobile); + + /** + * 取消过期优惠券的绑定 + * @param couponIds 优惠券id列表 + * @return + */ + ServerResponseEntity cancelBindingCoupons(List couponIds); + + /** + * 用户注册并绑定第三方账号 + * @param userRegisterDTO 注册信息 + * @return + */ + ServerResponseEntity save(@Valid UserRegisterDTO userRegisterDTO); + + /** + * 统计时间段内的新增用户数量 + * @param customerReqDTO + * @return + */ + ServerResponseEntity countNewUserByTime(CustomerReqDTO customerReqDTO); + + + /** + * 获取时间段内的新增用户id列表 + * @param customerReqDTO + * @return + */ + List listNewUserIdByTime(CustomerReqDTO customerReqDTO); + + /** + * 获取指定用户列表 + * @param userIds + * @return + */ + List listUserByUserIds(List userIds); + + /** + * 创建通联支付会员(个人会员) + * @return + */ + ServerResponseEntity createAllinpayMember(); + + /** + * 统计会员数量(普通会员、付费会员) + * @param customerReqDTO + * @return + */ + ServerResponseEntity countUserNumByType(CustomerReqDTO customerReqDTO); + + /** + * 统计累计用户数、新增用户数、付费会员数 + * @param memberReqDTO + * @return + */ + MemberCountVO statisticsUserNum(MemberReqDTO memberReqDTO); + + /** + * 获取第一个用户的注册时间 + * @return + */ + ServerResponseEntity getInitialRegistrationTime(); + +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserScoreLockFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserScoreLockFeignClient.java new file mode 100644 index 0000000..c324311 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserScoreLockFeignClient.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.user.dto.UserScoreLockDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/22 + */ +public interface UserScoreLockFeignClient { + + /** + * 锁定积分 + * @param userScoreLocks 参数 + * @return 是否成功 + */ + ServerResponseEntity lock(List userScoreLocks); + +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserTagFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserTagFeignClient.java new file mode 100644 index 0000000..2eb8f5c --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserTagFeignClient.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 会员标签 + * @author cl + */ +public interface UserTagFeignClient { + + /** + * 通过标签id集合获取标签集合 + * @param tagIds 标签id + * @return 标签列表 + */ + ServerResponseEntity> getUserTagList(List tagIds); + + /** + * 通过标签获取标签下的用户信息 + * @param userTagIds 标签id集合 + * @return 用户列表 + */ + ServerResponseEntity> getUserByTagIds(List userTagIds); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserWithdrawCashFeignClient.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserWithdrawCashFeignClient.java new file mode 100644 index 0000000..6c791b3 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/feign/UserWithdrawCashFeignClient.java @@ -0,0 +1,21 @@ +package com.tmerclub.cloud.api.user.feign; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author gaozijie + * @date 2023-04-24 + */ +public interface UserWithdrawCashFeignClient { + + /** + * 余额提现回调 + * @param bizOrderNo + * @param payStatus + * @param payFailMessage + * @return + */ + ServerResponseEntity withdrawBack(String bizOrderNo, + String payStatus, + String payFailMessage); +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/AllinpayRechargeVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/AllinpayRechargeVO.java new file mode 100644 index 0000000..6d2d925 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/AllinpayRechargeVO.java @@ -0,0 +1,52 @@ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 通联余额充值 + * @author TRACK + */ +public class AllinpayRechargeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "支付系统类型") + private Integer paySysType; + + public AllinpayRechargeVO() { + } + + public AllinpayRechargeVO(Long payAmount, Integer paySysType) { + this.payAmount = payAmount; + this.paySysType = paySysType; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "AllinpayRechargeVO{" + + "payAmount=" + payAmount + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberContributeRespVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberContributeRespVO.java new file mode 100644 index 0000000..29e2a8e --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberContributeRespVO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author + */ +public class MemberContributeRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "普通会员") + private MemberContributeValueVO publicMember; + + @Schema(description = "付费会员") + private MemberContributeValueVO paidMember; + + @Schema(description = "符合条件的普通会员userIds") + private List userIds; + + @Schema(description = "符合条件的付费会员userIds") + private List paidUserIds; + + public List getPaidUserIds() { + return paidUserIds; + } + + public void setPaidUserIds(List paidUserIds) { + this.paidUserIds = paidUserIds; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public MemberContributeValueVO getPublicMember() { + return publicMember; + } + + public void setPublicMember(MemberContributeValueVO publicMember) { + this.publicMember = publicMember; + } + + public MemberContributeValueVO getPaidMember() { + return paidMember; + } + + public void setPaidMember(MemberContributeValueVO paidMember) { + this.paidMember = paidMember; + } + + @Override + public String toString() { + return "MemberContributeRespVO{" + + "publicMember=" + publicMember + + ", paidMember=" + paidMember + + ", paidUserIds=" + paidUserIds + + ", userIds=" + userIds + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberCountVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberCountVO.java new file mode 100644 index 0000000..cdc0d49 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberCountVO.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + */ +public class MemberCountVO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 累积会员数 + */ + private Integer totalMember; + + /** + * 新增会员数 + */ + private Integer newMember; + + /** + * 付费会员数 + */ + private Integer paidMember; + + /** + * 新增付费会员数 + * 从普通会员升到付费会员 + */ + private Integer newPaidMember; + + public Integer getTotalMember() { + return totalMember; + } + + public void setTotalMember(Integer totalMember) { + this.totalMember = totalMember; + } + + public Integer getNewMember() { + return newMember; + } + + public void setNewMember(Integer newMember) { + this.newMember = newMember; + } + + public Integer getPaidMember() { + return paidMember; + } + + public void setPaidMember(Integer paidMember) { + this.paidMember = paidMember; + } + + public Integer getNewPaidMember() { + return newPaidMember; + } + + public void setNewPaidMember(Integer newPaidMember) { + this.newPaidMember = newPaidMember; + } + + @Override + public String toString() { + return "MemberCountVO{" + + "totalMember=" + totalMember + + ", newMember=" + newMember + + ", paidMember=" + paidMember + + ", newPaidMember=" + newPaidMember + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealVO.java new file mode 100644 index 0000000..a699795 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberDealVO.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author + */ +public class MemberDealVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "成交会员数") + private Integer payMemberNum; + + @Schema(description = "成交会员数占比") + private Double payMemberNumRate; + + @Schema(description = "支付订单数") + private Integer payOrderNum; + + @Schema(description = "客单价") + private Double pricePerMember; + + @Schema(description = "支付金额") + private Double payAmount; + + @Schema(description = "支付金额占比") + private Double payAmountRate; + + public Integer getPayMemberNum() { + return payMemberNum; + } + + public void setPayMemberNum(Integer payMemberNum) { + this.payMemberNum = payMemberNum; + } + + public Double getPayMemberNumRate() { + return payMemberNumRate; + } + + public void setPayMemberNumRate(Double payMemberNumRate) { + this.payMemberNumRate = payMemberNumRate; + } + + public Integer getPayOrderNum() { + return payOrderNum; + } + + public void setPayOrderNum(Integer payOrderNum) { + this.payOrderNum = payOrderNum; + } + + public Double getPricePerMember() { + return pricePerMember; + } + + public void setPricePerMember(Double pricePerMember) { + this.pricePerMember = pricePerMember; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Double getPayAmountRate() { + return payAmountRate; + } + + public void setPayAmountRate(Double payAmountRate) { + this.payAmountRate = payAmountRate; + } + + @Override + public String toString() { + return "MemberDealVO{" + + "payMemberNum=" + payMemberNum + + ", payMemberNumRate=" + payMemberNumRate + + ", payOrderNum=" + payOrderNum + + ", pricePerMember=" + pricePerMember + + ", payAmount=" + payAmount + + ", payAmountRate=" + payAmountRate + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberOverviewVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberOverviewVO.java new file mode 100644 index 0000000..69ebcaf --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/MemberOverviewVO.java @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lhd + */ +public class MemberOverviewVO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public MemberOverviewVO() { + this.totalMember = 0; + this.totalMemberRate = 0.0; + this.newMember = 0; + this.newMemberRate = 0.0; + this.payMember = 0; + this.payMemberRate = 0.0; + this.couponMember = 0; + this.couponMemberRate = 0.0; + this.memberPayAmount = 0.0; + this.memberPayAmountRate = 0.0; + this.memberPayOrder = 0; + this.memberPayOrderRate = 0.0; + this.memberSingleAmount = 0.0; + this.memberSingleAmountRate = 0.0; + } + + private Long currentDay; + + @Schema(description = "累积会员数") + private Integer totalMember; + + @Schema(description = "新增会员数") + private Integer newMember; + + @Schema(description = "付费会员数") + private Integer paidMember; + + @Schema(description = "支付会员数") + private Integer payMember; + + @Schema(description = "领券会员数") + private Integer couponMember; + + @Schema(description = "会员支付金额") + private Double memberPayAmount; + + @Schema(description = "会员支付订单数") + private Integer memberPayOrder; + + @Schema(description = "会员客单价") + private Double memberSingleAmount; + + @Schema(description = "累积会员与之前的 >0 上升/ <0下降 率,") + private Double totalMemberRate; + + @Schema(description = "新增会员会员与之前的 上升/下降 率") + private Double newMemberRate; + + @Schema(description = "支付会员数,变化率") + private Double payMemberRate; + + @Schema(description = "领券会员数,变化率") + private Double couponMemberRate; + + @Schema(description = "会员支付金额,变化率") + private Double memberPayAmountRate; + + @Schema(description = "会员支付订单数, 变化率") + private Double memberPayOrderRate; + + @Schema(description = "会员客单价, 变化率") + private Double memberSingleAmountRate; + + @Schema(description = "符合条件的userIds") + private List userIds; + + @Schema(description = "储值会员数") + private Integer storedValue; + + public Double getTotalMemberRate() { + return totalMemberRate; + } + + public void setTotalMemberRate(Double totalMemberRate) { + this.totalMemberRate = totalMemberRate; + } + + public Double getNewMemberRate() { + return newMemberRate; + } + + public void setNewMemberRate(Double newMemberRate) { + this.newMemberRate = newMemberRate; + } + + public Double getPayMemberRate() { + return payMemberRate; + } + + public void setPayMemberRate(Double payMemberRate) { + this.payMemberRate = payMemberRate; + } + + public Double getCouponMemberRate() { + return couponMemberRate; + } + + public void setCouponMemberRate(Double couponMemberRate) { + this.couponMemberRate = couponMemberRate; + } + + public Double getMemberPayAmountRate() { + return memberPayAmountRate; + } + + public void setMemberPayAmountRate(Double memberPayAmountRate) { + this.memberPayAmountRate = memberPayAmountRate; + } + + public Double getMemberPayOrderRate() { + return memberPayOrderRate; + } + + public void setMemberPayOrderRate(Double memberPayOrderRate) { + this.memberPayOrderRate = memberPayOrderRate; + } + + public Double getMemberSingleAmountRate() { + return memberSingleAmountRate; + } + + public void setMemberSingleAmountRate(Double memberSingleAmountRate) { + this.memberSingleAmountRate = memberSingleAmountRate; + } + + public Integer getPaidMember() { + return paidMember; + } + + public void setPaidMember(Integer paidMember) { + this.paidMember = paidMember; + } + + public Integer getStoredValue() { + return storedValue; + } + + public void setStoredValue(Integer storedValue) { + this.storedValue = storedValue; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public Long getCurrentDay() { + return currentDay; + } + + public void setCurrentDay(Long currentDay) { + this.currentDay = currentDay; + } + + public Integer getTotalMember() { + return totalMember; + } + + public void setTotalMember(Integer totalMember) { + this.totalMember = totalMember; + } + + public Integer getNewMember() { + return newMember; + } + + public void setNewMember(Integer newMember) { + this.newMember = newMember; + } + + public Integer getPayMember() { + return payMember; + } + + public void setPayMember(Integer payMember) { + this.payMember = payMember; + } + + public Integer getCouponMember() { + return couponMember; + } + + public void setCouponMember(Integer couponMember) { + this.couponMember = couponMember; + } + + public Double getMemberPayAmount() { + return memberPayAmount; + } + + public void setMemberPayAmount(Double memberPayAmount) { + this.memberPayAmount = memberPayAmount; + } + + public Integer getMemberPayOrder() { + return memberPayOrder; + } + + public void setMemberPayOrder(Integer memberPayOrder) { + this.memberPayOrder = memberPayOrder; + } + + public Double getMemberSingleAmount() { + return memberSingleAmount; + } + + public void setMemberSingleAmount(Double memberSingleAmount) { + this.memberSingleAmount = memberSingleAmount; + } + + @Override + public String toString() { + return "MemberOverviewVO{" + + "currentDay=" + currentDay + + ", totalMember=" + totalMember + + ", newMember=" + newMember + + ", paidMember=" + paidMember + + ", payMember=" + payMember + + ", couponMember=" + couponMember + + ", memberPayAmount=" + memberPayAmount + + ", memberPayOrder=" + memberPayOrder + + ", memberSingleAmount=" + memberSingleAmount + + ", totalMemberRate=" + totalMemberRate + + ", newMemberRate=" + newMemberRate + + ", payMemberRate=" + payMemberRate + + ", couponMemberRate=" + couponMemberRate + + ", memberPayAmountRate=" + memberPayAmountRate + + ", memberPayOrderRate=" + memberPayOrderRate + + ", memberSingleAmountRate=" + memberSingleAmountRate + + ", userIds=" + userIds + + ", storedValue=" + storedValue + + '}'; + } +} diff --git a/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserPayInfoVO.java b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserPayInfoVO.java new file mode 100644 index 0000000..b87f798 --- /dev/null +++ b/tmerclub-api/tmerclub-api-user/src/main/java/com/tmerclub/cloud/api/user/vo/UserPayInfoVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.api.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +public class UserPayInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "支付时间") + private Date payTime; + + @Schema(description = "支付入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + @Schema(description = "关联订单号") + private String orderIds; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long payAmount; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "PayInfoVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", payTime=" + payTime + + ", payEntry=" + payEntry + + ", orderIds='" + orderIds + '\'' + + ", payType=" + payType + + ", payId=" + payId + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-auth/Dockerfile b/tmerclub-auth/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-auth/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/WxConfig.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/WxConfig.java new file mode 100644 index 0000000..2a8393c --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/config/WxConfig.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.config; + + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceHttpClientImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaRedissonConfigImpl; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.WxMiniApp; +import com.tmerclub.cloud.common.bean.WxMp; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceHttpClientImpl; +import me.chanjar.weixin.mp.config.impl.WxMpRedissonConfigImpl; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +/** + * 通过微信配置获取微信的支付信息,登陆信息等 + * @author FrozenWatermelon + */ +@RefreshScope +@Component +public class WxConfig { + + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private RedissonClient redissonClient; + + private static final String MA_CONFIG_KEY_PREFIX = "mall4cloud:ma_config_key_prefix"; + + private static final String MP_CONFIG_KEY_PREFIX = "mall4cloud:mp_config_key_prefix"; + + public WxMaService getWxMaService() { + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + // access token用redis缓存 + WxMaRedissonConfigImpl maRedissonConfig = new WxMaRedissonConfigImpl(redissonClient, MA_CONFIG_KEY_PREFIX); + maRedissonConfig.setAppid(wxMiniApp.getAppId()); + maRedissonConfig.setSecret(wxMiniApp.getSecret()); + + WxMaServiceHttpClientImpl wxMaServiceHttpClient = new WxMaServiceHttpClientImpl(); + wxMaServiceHttpClient.setWxMaConfig(maRedissonConfig); + return wxMaServiceHttpClient; + } + + public WxMpService getWxMpService() { + WxMp wxMp = feignShopConfig.getWxMp(); + // access token用redis缓存 + WxMpRedissonConfigImpl wxMpRedisConfig = new WxMpRedissonConfigImpl(redissonClient, MP_CONFIG_KEY_PREFIX); + wxMpRedisConfig.setAppId(wxMp.getAppId()); + wxMpRedisConfig.setSecret(wxMp.getSecret()); + + WxMpServiceHttpClientImpl wxMpServiceHttpClient = new WxMpServiceHttpClientImpl(); + wxMpServiceHttpClient.setWxMpConfigStorage(wxMpRedisConfig); + return wxMpServiceHttpClient; + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/CaptchaController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/CaptchaController.java new file mode 100644 index 0000000..db3dea8 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/CaptchaController.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller; + +import com.anji.captcha.model.common.RepCodeEnum; +import com.anji.captcha.model.common.ResponseModel; +import com.anji.captcha.model.vo.CaptchaVO; +import com.anji.captcha.service.CaptchaService; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author FrozenWatermelon + * @date 2020/7/30 + */ +@RestController +@RequestMapping("/ua/captcha") +@Tag(name = "验证码") +public class CaptchaController { + + private final CaptchaService captchaService; + + public CaptchaController(CaptchaService captchaService) { + this.captchaService = captchaService; + } + + @PostMapping("/get") + public ServerResponseEntity get(@RequestBody CaptchaVO captchaVO) { + return ServerResponseEntity.success(captchaService.get(captchaVO)); + } + + @PostMapping("/check") + public ServerResponseEntity check(@RequestBody CaptchaVO captchaVO) { + ResponseModel responseModel; + try { + responseModel = captchaService.check(captchaVO); + } catch (Exception e) { + return ServerResponseEntity.success(ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_COORDINATE_ERROR)); + } + return ServerResponseEntity.success(responseModel); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/PasswordController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/PasswordController.java new file mode 100644 index 0000000..1df4422 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/PasswordController.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.auth.dto.ForgetPasswordDTO; +import com.tmerclub.cloud.auth.dto.UpdatePasswordDTO; +import com.tmerclub.cloud.auth.manager.PasswordManager; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/01/29 + */ +@RestController +@Tag(name = "密码") +public class PasswordController { + + @Autowired + private TokenStore tokenStore; + + @Autowired + private AuthAccountService authAccountService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private PasswordManager passwordManager; + + public static final String CHECK_UPDATE_SMS_FLAG = "checkUpdatePwdSmsFlag"; + + + @PutMapping("/update_password") + @Operation(summary = "更新密码", description = "更新当前用户的密码, 更新密码之后要退出登录,清理token") + public ServerResponseEntity updatePassword(@Valid @RequestBody UpdatePasswordDTO updatePasswordDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + AuthAccount authAccount = authAccountService.getByUserIdAndType(uidInfoBO.getUserId(), uidInfoBO.getSysType()); + ServerResponseEntity oldPasswordEntity = passwordManager.decryptPassword(updatePasswordDTO.getOldPassword()); + if (!oldPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(oldPasswordEntity); + } + String oldDecryptPassword = oldPasswordEntity.getData(); + ServerResponseEntity newPasswordEntity = passwordManager.decryptPassword(updatePasswordDTO.getNewPassword()); + if (!newPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(newPasswordEntity); + } + String newDecryptPassword = newPasswordEntity.getData(); + if (!passwordEncoder.matches(oldDecryptPassword, authAccount.getPassword())) { + return ServerResponseEntity.showFailMsg("旧密码不正确"); + } + + + authAccountService.updatePassword(uidInfoBO.getUserId(), uidInfoBO.getSysType(), newDecryptPassword); + + tokenStore.deleteUserToken(); + return ServerResponseEntity.success(); + } + + @PutMapping("/ua/forget_password") + @Operation(summary = "忘记密码", description = "通过验证码修改密码,更新密码之后要退出登录,清理token") + public ServerResponseEntity password(@Valid @RequestBody ForgetPasswordDTO forgetPasswordDTO) { + + AuthAccount authAccount = authAccountService.getAccountByInputUserName(forgetPasswordDTO.getMobile(), forgetPasswordDTO.getSysType()); + if (authAccount == null) { + return ServerResponseEntity.showFailMsg("用户不存在"); + } + + String checkUpdatePwdSmsFlag = CHECK_UPDATE_SMS_FLAG + forgetPasswordDTO.getCheckUpdatePwdSmsFlag(); + // 看看有没有校验验证码成功的标识 + if (StrUtil.isBlank(forgetPasswordDTO.getCheckUpdatePwdSmsFlag())) { + // 验证码已过期,请重新发送验证码校验 + throw new LuckException("验证码已过期,请重新发送验证码校验"); + } else { + String checkRegisterSmsFlagMobile = RedisUtil.get(checkUpdatePwdSmsFlag); + if (!Objects.equals(checkRegisterSmsFlagMobile, forgetPasswordDTO.getMobile())) { + // 验证码已过期,请重新发送验证码校验 + throw new LuckException("验证码已过期,请重新发送验证码校验"); + } + } + + ServerResponseEntity newPasswordEntity = passwordManager.decryptPassword(forgetPasswordDTO.getNewPassword()); + if (!newPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(newPasswordEntity); + } + String newDecryptPassword = newPasswordEntity.getData(); + authAccountService.updatePassword(authAccount.getUserId(), authAccount.getSysType(), newDecryptPassword); + + tokenStore.deleteUserToken(); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/SocialLoginController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/SocialLoginController.java new file mode 100644 index 0000000..4b5a9a5 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/SocialLoginController.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller; + +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.hutool.core.util.IdUtil; + +import com.alibaba.fastjson.JSONObject; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SocialType; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.rbac.dto.ClearUserPermissionsCacheDTO; +import com.tmerclub.cloud.auth.config.WxConfig; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.auth.model.AuthSocial; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.auth.service.AuthSocialService; +import com.tmerclub.cloud.auth.vo.TokenWithTempUidVO; +import com.tmerclub.cloud.common.cache.constant.OauthCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.rbac.service.MenuPermissionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import me.chanjar.weixin.common.bean.WxOAuth2UserInfo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + + +/** + * 尝试使用社交账户登录 + * 如果登录成功,返回token信息 + * 如果登录失败,返回一个临时的uid,同时把openid之类的信息保存到数据库 + * 前提: + * 1. 如果在小程序注册,那么会直接绑定,下次打开不需要登录按钮进行登录(换了手机也会,只要是同一个微信号) + * 2. 如果用户直接输入账号密码登录,会直接跟这个用户进行绑定,会有退出登录按钮 + * 3. 如果退出登录的话,就要解除绑定,不然没办法退出登录 + * 4. 如果用户登录过一次,其实就已经绑定了,下次进入也是直接登录,不需要输入账号密码 + * 5. 如果用户在别的微信上登录过(也就是绑定过),需要在别人的微信上进行退出登录(解除绑定),才能在新的微信上登录(换手机不影响) + * 代码逻辑: + * 一进去小程序/微信公众号的时候会通过code获取openid(1.获取code不需要按钮的 2.code大概几分钟会过期)。 + * 如果没有openid就没办法进行支付。所以我们要在登录的时候把openid和token进行关联,通过token获取用户的userId和openid进行支付。 + * 但是会出现一种情况 比如在微信公众号是通过页面跳转获取code的,如果跳转完页面,用户一直在这个页面不去登录。后面再登录的时候已经code已经过期了。 + * 那怎么解决这种情况呢? + * 我们在拿到code的时候直接调用社交登录的接口,如/social/mp,/social/ma 这两个接口,会出现两种情况 + * 1. 如果通过code获取了openid,通过openid获取绑定的userid,如果能获取userid,那就直接登录,返回token。 + * 2. 如果没有获取到openid,就将这个openid保存用一个uuid关联起来,并保持到数据库。 + * 因为code会过期,数据库我们自己写的标识不会过期,将这个标识返回给前端(同时返回了A04001这个http状态,前端用tempUid保存起来)。 + * 前端进行登录的时候,用这个tempUid给到我们进行登录,这个时候用这个标识就能获取到数据库的openid了,也不会出现过期的情况。 + * 这个时候用openid可以关联登录信息、注册信息、绑定信息。 + * + * @author FrozenWatermelon + * @date 2021/1/16 + */ +@RequestMapping("/ua/social") +@RestController +@Tag(name = "社交账号登录") +public class SocialLoginController { + + private static final Logger logger = LoggerFactory.getLogger(SocialLoginController.class); + + + @Autowired + private WxConfig wxConfig; + @Autowired + private AuthSocialService authSocialService; + @Autowired + private TokenStore tokenStore; + @Autowired + private AuthAccountService authAccountService; + @Autowired + private MenuPermissionService menuPermissionService; + @DubboReference + private NotifyFeignClient notifyFeignClient; + + @PostMapping("/mp") + @Operation(summary = "公众号code登录", description = "通过公众号进行登录,只要在一进入到应用的时候调用微信登录的这个接口就行了,不要重复调用这个接口(不要在什么注册页面之类的地方再调用这个接口,打开应用的时候调用就已经足够了)" + + "1.返回状态码 A04001 社交账号未绑定,当前端看到该异常时,将该值tempUid存起来,并在应该在合适的时间(比如在购买的时候跳),跳转到登录的页面" + + "2.如果返回码是正常的登录成功,前端要保留原本已经存在的tempUid,如果有人切换登录的话,起码能够用这个tempUid重新获取openid进行绑定") + public ServerResponseEntity mp(@RequestBody String code) throws WxErrorException { + Integer socialType = SocialType.MP.value(); + WxOAuth2AccessToken wxAccessToken = wxConfig.getWxMpService().getOAuth2Service().getAccessToken(code); + + AuthSocial authSocial = authSocialService.getByBizUserId(wxAccessToken.getOpenId(), socialType); + if (authSocial != null && authSocial.getUid() != null) { + return ServerResponseEntity.success(new TokenWithTempUidVO(authSocial.getTempUid(), getTokenVo(authSocial).getData())); + } + String tempUid = IdUtil.simpleUUID(); + WxOAuth2UserInfo wxUserInfo = wxConfig.getWxMpService().getOAuth2Service().getUserInfo(wxAccessToken, null); + if (authSocial == null) { + authSocial = new AuthSocial(); + } + authSocial.setSocialType(socialType); + authSocial.setTempUid(tempUid); + authSocial.setNickName(wxUserInfo.getNickname()); + authSocial.setImageUrl(wxUserInfo.getHeadImgUrl()); + authSocial.setBizUserId(wxUserInfo.getOpenid()); + authSocial.setBizUnionid(wxUserInfo.getUnionId()); + authSocialService.saveOrUpdate(authSocial); + // 前端要保存这个tempUid + return ServerResponseEntity.success(new TokenWithTempUidVO(authSocial.getTempUid(), null)); + } + + + @PostMapping("/ma") + @Operation(summary = "小程序code登录", description = "通过小程序进行登录,只要在一进入到应用的时候调用微信登录的这个接口就行了,不要重复调用这个接口(不要在什么注册页面之类的地方再调用这个接口,打开应用的时候调用就已经足够了)" + + "1.返回状态码 A04001 社交账号未绑定,当前端看到该异常时,将该值tempUid存起来,并在应该在合适的时间(比如在购买的时候跳),跳转到登录的页面" + + "2.如果返回码是正常的登录成功,前端要保留原本已经存在的tempUid,如果有人切换登录的话,起码能够用这个tempUid重新获取openid进行绑定") + public ServerResponseEntity ma(@RequestBody String code) throws WxErrorException { + String recode = code.replaceAll("\"", ""); + Integer socialType = SocialType.MA.value(); + WxMaJscode2SessionResult session = wxConfig.getWxMaService().getUserService().getSessionInfo(recode); + + AuthSocial authSocial = authSocialService.getByBizUserId(session.getOpenid(), socialType); + logger.info("ma-session:{}, authSocial:{}", Json.toJsonString(session), Json.toJsonString(authSocial)); + if (authSocial != null && authSocial.getUid() != null) { + return ServerResponseEntity.success(new TokenWithTempUidVO(authSocial.getTempUid(), getTokenVo(authSocial).getData())); + } + + if (authSocial == null) { + authSocial = new AuthSocial(); + } + String tempUid = IdUtil.simpleUUID(); + authSocial.setTempUid(tempUid); + authSocial.setSocialType(socialType); + authSocial.setBizTempSession(session.getSessionKey()); + authSocial.setBizUserId(session.getOpenid()); + authSocial.setBizUnionid(session.getUnionid()); + authSocialService.saveOrUpdate(authSocial); + return ServerResponseEntity.success(new TokenWithTempUidVO(authSocial.getTempUid(), null)); + } + + private ServerResponseEntity getTokenVo(AuthSocial authSocial) { + AuthAccount authAccount = authAccountService.getByUid(authSocial.getUid()); + UidInfoBO uidInfoBO = BeanUtil.map(authAccount, UidInfoBO.class); + + ClearUserPermissionsCacheDTO clearUserPermissionsCacheDTO = new ClearUserPermissionsCacheDTO(); + clearUserPermissionsCacheDTO.setSysType(uidInfoBO.getSysType()); + clearUserPermissionsCacheDTO.setUserId(uidInfoBO.getUserId()); + // 将以前的权限清理了,以免权限有缓存 + menuPermissionService.clearUserPermissionsCache(clearUserPermissionsCacheDTO.getUserId(), clearUserPermissionsCacheDTO.getSysType()); + + // 保存token,返回token数据给前端 + TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(uidInfoBO); + if (Objects.nonNull(authSocial)) { + // 缓存当前登录的openId + LoginInfoBO loginInfoBO = new LoginInfoBO(); + loginInfoBO.setSocialType(authSocial.getSocialType()); + loginInfoBO.setBizUserId(authSocial.getBizUserId()); + RedisUtil.set(OauthCacheNames.LOGIN_INFO + tokenInfoVO.getAccessToken(), + JSONObject.toJSONString(loginInfoBO), + tokenInfoVO.getExpiresIn()); + } + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/admin/PasswordController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/admin/PasswordController.java new file mode 100644 index 0000000..ce148b5 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/controller/admin/PasswordController.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.controller.admin; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.auth.dto.ForgetPasswordDTO; +import com.tmerclub.cloud.auth.dto.UpdatePasswordDTO; +import com.tmerclub.cloud.auth.manager.PasswordManager; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/01/29 + */ +@RestController("adminPasswordController") +@RequestMapping("/mp/password") +@Tag(name = "管理后台密码修改") +public class PasswordController { + + @Autowired + private TokenStore tokenStore; + + @Autowired + private AuthAccountService authAccountService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @DubboReference + private NotifyFeignClient notifyFeignClient; + + @Autowired + private PasswordManager passwordManager; + + public static final String CHECK_UPDATE_SMS_FLAG = "checkUpdatePwdSmsFlag"; + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + + @PutMapping("/update_password") + @Operation(summary = "更新密码", description = "更新当前用户的密码, 更新密码之后要退出登录,清理token") + public ServerResponseEntity updatePassword(@Valid @RequestBody UpdatePasswordDTO updatePasswordDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + Integer sysType = uidInfoBO.getSysType(); + String userName; + switch (sysType) { + case 1: + userName = "home"; + break; + case 3: + userName = "supplier"; + break; + default: + userName = "admin"; + break; + } + if (Objects.equals(uidInfoBO.getUsername(), userName) && BooleanUtil.isFalse(permission)) { + throw new LuckException("没有权限进行此操作"); + } + AuthAccount authAccount = authAccountService.getByUserIdAndType(uidInfoBO.getUserId(), uidInfoBO.getSysType()); + ServerResponseEntity oldPasswordEntity = passwordManager.decryptPassword(updatePasswordDTO.getOldPassword()); + if (!oldPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(oldPasswordEntity); + } + ServerResponseEntity newPasswordEntity = passwordManager.decryptPassword(updatePasswordDTO.getNewPassword()); + if (!newPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(newPasswordEntity); + } + String oldDecryptPassword = oldPasswordEntity.getData(); + String newDecryptPassword = newPasswordEntity.getData(); + if (!passwordEncoder.matches(oldDecryptPassword, authAccount.getPassword())) { + return ServerResponseEntity.showFailMsg("旧密码错误"); + } + + authAccountService.updatePassword(uidInfoBO.getUserId(), uidInfoBO.getSysType(), newDecryptPassword); + + tokenStore.deleteUserToken(); + return ServerResponseEntity.success(); + } + + @PutMapping("/ua/forget_password") + @Operation(summary = "忘记密码", description = "通过验证码修改密码,更新密码之后要退出登录,清理token") + public ServerResponseEntity password(@Valid @RequestBody ForgetPasswordDTO forgetPasswordDTO) { + + AuthAccount authAccount = authAccountService.getAccountByInputUserName(forgetPasswordDTO.getMobile(), forgetPasswordDTO.getSysType()); + if (Objects.isNull(authAccount)) { + return ServerResponseEntity.showFailMsg("用户不存在"); + } + + String checkUpdatePwdSmsFlag = CHECK_UPDATE_SMS_FLAG + forgetPasswordDTO.getCheckUpdatePwdSmsFlag(); + // 看看有没有校验验证码成功的标识 + if (StrUtil.isBlank(forgetPasswordDTO.getCheckUpdatePwdSmsFlag())) { + // 验证码已过期,请重新发送验证码校验 + throw new LuckException("验证码已过期,请重新发送验证码校验!"); + } else { + String checkRegisterSmsFlagMobile = RedisUtil.get(checkUpdatePwdSmsFlag); + if (!Objects.equals(checkRegisterSmsFlagMobile, forgetPasswordDTO.getMobile())) { + // 验证码已过期,请重新发送验证码校验 + throw new LuckException("验证码已过期,请重新发送验证码校验!"); + } + } + + ServerResponseEntity newPasswordEntity = passwordManager.decryptPassword(forgetPasswordDTO.getNewPassword()); + if (!newPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(newPasswordEntity); + } + String newDecryptPassword = newPasswordEntity.getData(); + authAccountService.updatePassword(authAccount.getUserId(), authAccount.getSysType(), newDecryptPassword); + + tokenStore.deleteUserToken(); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/AuthenticationDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/AuthenticationDTO.java new file mode 100644 index 0000000..03ac9ca --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/AuthenticationDTO.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用于登陆传递账号密码 + * + * @author FrozenWatermelon + * @date 2020/7/1 + */ +public class AuthenticationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户名 + */ + @NotBlank(message = "userName不能为空") + @Schema(description = "用户名/邮箱/手机号", requiredMode = Schema.RequiredMode.REQUIRED) + protected String userName; + + /** + * 密码 + */ + @NotBlank(message = "passWord不能为空") + @Schema(description = "一般用作密码", requiredMode = Schema.RequiredMode.REQUIRED) + protected String passWord; + + /** + * sysType 参考SysTypeEnum + */ + @NotNull(message = "sysType不能为空") + @Schema(description = "系统类型 0.普通用户系统 1.商家端", requiredMode = Schema.RequiredMode.REQUIRED) + protected Integer sysType; + + @Schema(description = "零时的uid,微信公众号支付需要openid,但用户又不绑定社交账号,所以这个openId是临时的") + protected String tempUid; + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassWord() { + return passWord; + } + + public void setPassWord(String passWord) { + this.passWord = passWord; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + @Override + public String toString() { + return "AuthenticationDTO{" + + "userName='" + userName + '\'' + + ", passWord='" + passWord + '\'' + + ", sysType=" + sysType + + ", tempUid='" + tempUid + '\'' + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/ForgetPasswordDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/ForgetPasswordDTO.java new file mode 100644 index 0000000..6bf65b4 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/ForgetPasswordDTO.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.dto; + +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 忘记密码 + * + * @author FrozenWatermelon + * @date 2021/01/29 + */ +public class ForgetPasswordDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "newPassword NotNull") + @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED) + private String newPassword; + + @NotNull + @Schema(description = "系统类型 0普通用户 1商家端 2平台端", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer sysType; + + @Schema(description = "校验登陆注册验证码成功的标识") + private String checkUpdatePwdSmsFlag; + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = PrincipalUtil.MOBILE_REGEXP, message = "请输入正确的手机号") + @NotBlank(message = "手机号不能为空") + private String mobile; + + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getCheckUpdatePwdSmsFlag() { + return checkUpdatePwdSmsFlag; + } + + public void setCheckUpdatePwdSmsFlag(String checkUpdatePwdSmsFlag) { + this.checkUpdatePwdSmsFlag = checkUpdatePwdSmsFlag; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "ForgetPasswordDTO{" + + ", newPassword='" + newPassword + '\'' + + ", sysType=" + sysType + + ", checkUpdatePwdSmsFlag='" + checkUpdatePwdSmsFlag + '\'' + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/LoginCodeDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/LoginCodeDTO.java new file mode 100644 index 0000000..d8d15fb --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/LoginCodeDTO.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.dto; + +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用于登陆传递手机号码和验证码 + * + * @author FrozenWatermelon + * @date 2020/7/1 + */ +public class LoginCodeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = PrincipalUtil.MOBILE_REGEXP, message = "请输入正确的手机号") + @NotBlank(message = "手机号不能为空") + private String mobile; + + @Schema(description = "验证码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "验证码不能为空") + private String validCode; + + /** + * @see com.tmerclub.cloud.api.auth.constant.SysTypeEnum + */ + @Schema(description = "系统类型 0.普通用户系统", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "sysType不能为空") + private Integer sysType; + + @Schema(description = "tempUid", requiredMode = Schema.RequiredMode.REQUIRED) + private String tempUid; + + @Schema(description = "社交账号类型 微信小程序或者微信公众号", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer socialType; + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + public Integer getSocialType() { + return socialType; + } + + public void setSocialType(Integer socialType) { + this.socialType = socialType; + } + + @Override + public String toString() { + return "LoginCodeDTO{" + + "mobile='" + mobile + '\'' + + ", validCode='" + validCode + '\'' + + ", sysType=" + sysType + + ", tempUid='" + tempUid + '\'' + + ", socialType=" + socialType + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/MaCodeAuthenticationDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/MaCodeAuthenticationDTO.java new file mode 100644 index 0000000..e8410c2 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/MaCodeAuthenticationDTO.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 小程序通过code进行登录 + * + * @author FrozenWatermelon + * @date 2022/09/06 + */ +public class MaCodeAuthenticationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @NotBlank + @Schema(description = "临时的uid,微信公众号支付需要openid,但用户又不绑定社交账号,所以这个openId是临时的") + private String tempUid; + + @NotBlank + @Schema(description = "小程序通过getPhoneNumber方法获取的code") + private String code; + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + @Override + public String toString() { + return "MaCodeAuthenticationDTO{" + + "tempUid='" + tempUid + '\'' + + ", code='" + code + '\'' + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/UpdatePasswordDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/UpdatePasswordDTO.java new file mode 100644 index 0000000..ad44c1d --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/dto/UpdatePasswordDTO.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 更新密码 + * + * @author FrozenWatermelon + * @date 2020/09/21 + */ +public class UpdatePasswordDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotBlank(message = "oldPassword NotBlank") + @Schema(description = "旧密码", requiredMode = Schema.RequiredMode.REQUIRED) + private String oldPassword; + + @NotNull(message = "newPassword NotNull") + @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED) + private String newPassword; + + public String getOldPassword() { + return oldPassword; + } + + public void setOldPassword(String oldPassword) { + this.oldPassword = oldPassword; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + + @Override + public String toString() { + return "UpdatePasswordDTO{" + + "oldPassword='" + oldPassword + '\'' + + ", newPassword='" + newPassword + '\'' + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/AuthSocialController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/AuthSocialController.java new file mode 100644 index 0000000..3d14de9 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/AuthSocialController.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.feign; + +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import com.tmerclub.cloud.api.auth.feign.AuthSocialFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthSocialVO; +import com.tmerclub.cloud.api.payment.dto.BindPayAcctDTO; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.auth.config.WxConfig; +import com.tmerclub.cloud.auth.mapper.AuthSocialMapper; +import com.tmerclub.cloud.auth.model.AuthSocial; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/22 + */ +@DubboService +public class AuthSocialController implements AuthSocialFeignClient { + + @Autowired + private AuthSocialMapper authSocialMapper; + + + @Autowired + private WxConfig wxConfig; + + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + public static final Integer TYPE = 2; + + + @Override + public ServerResponseEntity getByTempUid(String tempUid) { + AuthSocial authSocial = authSocialMapper.getByTempUid(tempUid); + return ServerResponseEntity.success(BeanUtil.map(authSocial, AuthSocialVO.class)); + } + + @Override + public ServerResponseEntity getMobileByMaInfo(String sessionKey, String encryptedData, String ivStr) { + WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxConfig.getWxMaService().getUserService().getPhoneNoInfo( + sessionKey, encryptedData, ivStr); + return ServerResponseEntity.success(wxMaPhoneNumberInfo.getPhoneNumber()); + } + + @Override + public ServerResponseEntity getByUserIdAndSocialType(String bizUserId, Integer socialType) { + AuthSocial authSocial = authSocialMapper.getByBizUserIdAndType(bizUserId, socialType); + return ServerResponseEntity.success(BeanUtil.map(authSocial, AuthSocialVO.class)); + } + + @Override + public ServerResponseEntity getOpenIdByCode(String code, Integer type) { + String openId = null; + try { + if (type == 1) { + // 微信公众号获取openId + WxOAuth2AccessToken wxAccessToken = wxConfig.getWxMpService().getOAuth2Service().getAccessToken(code); + openId = wxAccessToken.getOpenId(); + } else if (type.equals(TYPE)) { + // 微信小程序获取openId + WxMaJscode2SessionResult session = wxConfig.getWxMaService().getUserService().getSessionInfo(code); + openId = session.getOpenid(); + } + } catch (WxErrorException e) { + throw new LuckException("获取openId失败"); + } + return ServerResponseEntity.success(openId); + } + + @Override + public ServerResponseEntity bindAllinpayPayAcct() { + // 获取可以绑定的用户支付标识 + List authSocialVOList = authSocialMapper.listAvailableSocial(); + if (CollectionUtils.isEmpty(authSocialVOList)) { + return ServerResponseEntity.success(); + } + List bindPayAcctDTOList = new ArrayList<>(authSocialVOList.size()); + BindPayAcctDTO bindPayAcctDTO; + for (AuthSocialVO authSocialVO : authSocialVOList) { + bindPayAcctDTO = new BindPayAcctDTO(); + bindPayAcctDTO.setBizUserId(String.valueOf(authSocialVO.getUserId())); + bindPayAcctDTO.setSocialType(authSocialVO.getSocialType()); + bindPayAcctDTO.setAcct(authSocialVO.getBizUserId()); + bindPayAcctDTOList.add(bindPayAcctDTO); + } + // 通联批量绑定用户支付标识 + allinpayFeignClient.batchBindPayAcct(bindPayAcctDTOList); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getByUidAndSocialType(Long uid, Integer socialType) { + AuthSocial authSocial = authSocialMapper.getByUidAndType(uid, socialType); + return ServerResponseEntity.success(BeanUtil.map(authSocial, AuthSocialVO.class)); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/PasswordFeignController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/PasswordFeignController.java new file mode 100644 index 0000000..49ceac5 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/PasswordFeignController.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.feign; + +import com.tmerclub.cloud.api.auth.feign.PasswordFeignClient; +import com.tmerclub.cloud.auth.manager.PasswordManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author 菠萝凤梨 + * @date 2022/1/20 15:07 + */ +@DubboService +public class PasswordFeignController implements PasswordFeignClient { + + @Autowired + private PasswordManager passwordManager; + + @Override + public ServerResponseEntity getDecryptPassword(String password) { + ServerResponseEntity decryptPasswordEntity = passwordManager.decryptPassword(password); + if (!decryptPasswordEntity.isSuccess()) { + return ServerResponseEntity.transform(decryptPasswordEntity); + } + return ServerResponseEntity.success(decryptPasswordEntity.getData()); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/TokenFeignController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/TokenFeignController.java new file mode 100644 index 0000000..e7501e2 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/feign/TokenFeignController.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.feign; + +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.dto.ThirdApiAbutmentUserDto; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.common.security.AuthUserContext; +import jakarta.servlet.http.HttpServletRequest; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author FrozenWatermelon + * @date 2020/7/15 + */ +@DubboService +public class TokenFeignController implements TokenFeignClient { + + private static final Logger logger = LoggerFactory.getLogger(TokenFeignController.class); + + @Autowired + private TokenStore tokenStore; + + @Override + public UidInfoBO checkToken(String accessToken) { + UidInfoBO uidInfoBO = tokenStore.getUidInfoByAccessToken(accessToken); + return uidInfoBO; + } + + @Override + public void clearToken() { + tokenStore.deleteUserToken(); + } + + @Override + public UidInfoBO getUidInfoInToken() { + return tokenStore.getUidInfoInToken(); + } + + @Override + public LoginInfoBO getLoginInfo() { + return tokenStore.getLoginInfoByCache(); + } + + @Override + public void userTokenSync(ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + tokenStore.userTokenSync(thirdApiAbutmentUserDto); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/listener/BatchUserRegisterTransactionListener.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/listener/BatchUserRegisterTransactionListener.java new file mode 100644 index 0000000..d4207f2 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/listener/BatchUserRegisterTransactionListener.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.listener; + +import com.tmerclub.cloud.api.auth.bo.UserRegisterNotifyBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.common.util.Json; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + + +/** + * 用户注册监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "userNotifyRegisterTemplate", maximumPoolSize = 20) +public class BatchUserRegisterTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private AuthAccountService authAccountService; + + @SuppressWarnings("unchecked") + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object authAccounts) { + int row = authAccountService.batchSaveAccounts((List) authAccounts); + if (row == 0) { + checkLocalTransaction(msg); + } + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + UserRegisterNotifyBO userRegisterNotifyBO = Json.parseObject((byte[]) msg.getPayload(), UserRegisterNotifyBO.class); + List userIds = userRegisterNotifyBO.getAccountDTOList().stream().map(AuthAccountDTO::getUserId).collect(Collectors.toList()); + // 如果插入的数据为0,这个时候我们是不需要插入数据的,则不用提交了 + int row = authAccountService.countByUserIds(userIds, SysTypeEnum.ORDINARY.value()); + if (row == 0) { + return RocketMQLocalTransactionState.ROLLBACK; + } + return RocketMQLocalTransactionState.COMMIT; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/manager/TokenStore.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/manager/TokenStore.java new file mode 100644 index 0000000..7162f4a --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/manager/TokenStore.java @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.manager; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SocialType; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.ThirdApiAbutmentUserDto; +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import com.tmerclub.cloud.auth.service.AuthAccountService; +import com.tmerclub.cloud.common.cache.constant.OauthCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.security.AuthTokenContext; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.security.bo.TokenInfoBO; +import com.tmerclub.cloud.common.util.Json; +import jakarta.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * token管理 1. 登陆返回token 2. 刷新token 3. 清除用户过去token 4. 校验token + * + * @author FrozenWatermelon + * @date 2020/7/2 + */ +@Component +@RefreshScope +public class TokenStore { + + private static final Logger logger = LoggerFactory.getLogger(TokenStore.class); + + private final RedisTemplate redisTemplate; + + @Autowired + private AuthAccountService authAccountService; + + public TokenStore(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + /** + * 根据accessToken 获取用户信息 + * @param accessToken accessToken + * @return 用户信息 + */ + public UidInfoBO getUidInfoByAccessToken(String accessToken) { + if (StrUtil.isBlank(accessToken)) { + throw new LuckException("accessToken is blank"); + } + String uid = this.getUidByToken(accessToken); + if (Objects.isNull(uid)) { + return null; + } + return AuthUserContext.getUidInfo(uid); + } + + /** + * 根据accessToken 获取用户信息 + * @param accessToken accessToken + * @return 用户信息 + */ + public UidInfoBO getUidInfoByCache(String accessToken) { + String uid = this.getUidByToken(accessToken); + if (Objects.isNull(uid)) { + return null; + } + return AuthUserContext.getUidInfo(uid); + } + + /** + * 直接从上下文中获取用户信息,适用于登陆后的操作 + * @return + */ + public UidInfoBO getUidInfoInToken() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + // 如果用户信息为空,则退出登录 + if (Objects.isNull(uidInfoBO)) { + String uid = AuthUserContext.getUid(uidInfoBO); + StpUtil.logout(uid); + throw new LuckException(ResponseEnum.UNAUTHORIZED, "登录过期,请重新登录"); + } + return this.getUidInfoInTokenByCache(uidInfoBO); + } + + /** + * 获取登录信息 + * @return 用户信息 + */ + public LoginInfoBO getLoginInfoByCache() { + String accessToken = AuthTokenContext.getToken(); + if (accessToken == null) { + return new LoginInfoBO(); + } + // 获取登录的信息 + Object loginInfoCache = RedisUtil.get(OauthCacheNames.LOGIN_INFO + accessToken); + if (Objects.isNull(loginInfoCache)) { + return new LoginInfoBO(); + } + return JSONObject.parseObject(loginInfoCache.toString(), LoginInfoBO.class); + } + + public TokenInfoVO storeAndGetVo(UidInfoBO uidInfoBO) { + TokenInfoBO tokenInfoBO = this.storeAccessSaToken(uidInfoBO); + TokenInfoVO tokenInfoVO = new TokenInfoVO(); + tokenInfoVO.setAccessToken(tokenInfoBO.getAccessToken()); + tokenInfoVO.setExpiresIn(tokenInfoBO.getExpiresIn()); + return tokenInfoVO; + } + + /** + * 计算过期时间(单位:秒) + * @param sysType + * @return + */ + public int getExpiresIn(int sysType) { + // 3600秒 + int expiresIn = 3600; + // 普通用户token过期时间 1小时 + if (Objects.equals(sysType, SysTypeEnum.ORDINARY.value())) { + expiresIn = expiresIn * 24 * 30; + } + // 系统管理员的token过期时间 2小时 + if (Objects.equals(sysType, SysTypeEnum.MULTISHOP.value()) || Objects.equals(sysType, SysTypeEnum.SUPPLIER.value()) || Objects.equals(sysType, SysTypeEnum.PLATFORM.value())) { + expiresIn = expiresIn * 24 * 30; + } + return expiresIn; + } + + /** + * 删除当前用户的token + */ + public void deleteUserToken() { + String uid = getUidByToken(AuthTokenContext.getToken()); + // 删除用户缓存 + redisTemplate.delete(OauthCacheNames.USER_INFO + uid); + // 移除该账号的全部token + StpUtil.logout(uid); + } + + + /** + * 根据uid信息删除token + * @param uidInfoBO + */ + public void deleteTokenByUidInfo(UidInfoBO uidInfoBO) { + String uid = AuthUserContext.getUid(uidInfoBO); + // 删除用户缓存 + redisTemplate.delete(OauthCacheNames.USER_INFO + uid); + // 移除该账号的全部token + StpUtil.logout(uid); + } + + + /** + * 更新uidinfo数据 + * @param uidInfoBO + */ + public void updateUidInfo(UidInfoBO uidInfoBO) { + if (uidInfoBO == null) { + return; + } + // 更新userInfoToken + redisTemplate.opsForValue().set( + OauthCacheNames.USER_INFO + this.getUidByToken(AuthTokenContext.getToken()), + JSON.toJSONString(uidInfoBO) + ); + } + + /** + * 根据uid更新uidinfo数据 + * @param uid + * @param uidInfoBO + */ + public void updateUidInfoByUid(String uid, UidInfoBO uidInfoBO) { + if (uid == null) { + return; + } + // 更新userInfoToken + redisTemplate.opsForValue().set( + OauthCacheNames.USER_INFO + uid, + JSON.toJSONString(uidInfoBO) + ); + } + + + + /** + * 以Sa-Token技术生成token,并返回token信息 + * @param uidInfoBO + * @return + */ + private TokenInfoBO storeAccessSaToken(UidInfoBO uidInfoBO) { + logger.info("storeAccessSaToken-请求参数:{}", Json.toJsonString(uidInfoBO)); + String uid = AuthUserContext.getUid(uidInfoBO); + // token生成 + int timeoutSecond = getExpiresIn(uidInfoBO.getSysType()); + StpUtil.login(uid, timeoutSecond); + + String token = StpUtil.getTokenValue(); + // 用户信息存入缓存 + String keyName = OauthCacheNames.USER_INFO + uid; + redisTemplate.opsForValue().set(keyName, JSON.toJSONString(uidInfoBO)); + // 数据封装返回(token不用加密) + TokenInfoBO tokenInfoBO = new TokenInfoBO(); + tokenInfoBO.setUidInfoBO(uidInfoBO); + tokenInfoBO.setExpiresIn(timeoutSecond); + tokenInfoBO.setAccessToken(token); + return tokenInfoBO; + } + + + private UidInfoBO getUidInfoInTokenByCache(UidInfoBO uidInfoBO) { + String uid = AuthUserContext.getUid(uidInfoBO); + String keyName = OauthCacheNames.USER_INFO + uid; + Object redisCache = redisTemplate.opsForValue().get(keyName); + // 如果用户信息为空,则退出登录 + if (Objects.isNull(redisCache)) { + StpUtil.logout(uid); + // 登录过期,请重新登录 + throw new LuckException(ResponseEnum.UNAUTHORIZED, "登录过期,请重新登录"); + } + return JSON.parseObject(redisCache.toString(), UidInfoBO.class); + } + + /** + * 获取登录用户的uid + * @return + */ + private String getUidByToken(String token) { + Object uid; + try { + uid = StpUtil.getLoginIdByToken(token); + } catch (NotLoginException e) { + // 登录过期,请重新登录 -- 如果是sa-token未登录异常,需要替换成商城的未登录异常 + throw new LuckException(ResponseEnum.UNAUTHORIZED, "登录过期,请重新登录"); + } + if (Objects.isNull(uid)) { + return null; + } + return uid.toString(); + } + + /** + * 获取登录用户的uid + * @return + */ + private String getUid() { + Object uid; + try { + uid = StpUtil.getLoginId(); + } catch (NotLoginException e) { + // 登录过期,请重新登录 -- 如果是sa-token未登录异常,需要替换成商城的未登录异常 + throw new LuckException(ResponseEnum.UNAUTHORIZED, "登录过期,请重新登录"); + } + return uid.toString(); + } + + + /** + * 将第三方token同步到商城 + * @param thirdApiAbutmentUserDto + */ + public void userTokenSync(ThirdApiAbutmentUserDto thirdApiAbutmentUserDto) { + + UidInfoBO uidInfoBO = new UidInfoBO(SysTypeEnum.ORDINARY.value(), thirdApiAbutmentUserDto.getUid(), thirdApiAbutmentUserDto.getUserId()); + String uid = AuthUserContext.getUid(uidInfoBO); + // 将token名称和过期时间设置为第三方的 + SaLoginModel saLoginModel = new SaLoginModel(); + saLoginModel.setToken(thirdApiAbutmentUserDto.getAccessToken()); + saLoginModel.setTimeout(thirdApiAbutmentUserDto.getExpiresIn()); + StpUtil.login(uid, saLoginModel); + // 小程序或者公众号登录 + if (Objects.equals(thirdApiAbutmentUserDto.getSocialType(), SocialType.MA.value()) + || Objects.equals(thirdApiAbutmentUserDto.getSocialType(), SocialType.MP.value()) ) { + // 缓存当前登录的openId + LoginInfoBO loginInfoBO = new LoginInfoBO(); + loginInfoBO.setSocialType(thirdApiAbutmentUserDto.getSocialType()); + loginInfoBO.setBizUserId(thirdApiAbutmentUserDto.getOpenId()); + RedisUtil.set(OauthCacheNames.LOGIN_INFO + thirdApiAbutmentUserDto.getAccessToken(), + JSONObject.toJSONString(loginInfoBO), + thirdApiAbutmentUserDto.getExpiresIn()); + } + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthLog.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthLog.java new file mode 100644 index 0000000..e01d95f --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/model/AuthLog.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 登陆日志 + * + * @author FrozenWatermelon + * @date 2020/07/02 + */ +public class AuthLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 本系统userId + */ + private Long userId; + + /** + * 登陆应用 1.小程序 2.微信公众号 3.PC 4.H5 5.ANDROID 1.IOS + */ + private Integer appType; + + /** + * 登录ip + */ + private String loginIp; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getAppType() { + return appType; + } + + public void setAppType(Integer appType) { + this.appType = appType; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + @Override + public String toString() { + return "AuthLog{" + "id=" + id + ", userId=" + userId + ", appType=" + appType + ", loginIp='" + loginIp + '\'' + + "} " + super.toString(); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/AuthAccountService.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/AuthAccountService.java new file mode 100644 index 0000000..27f2508 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/service/AuthAccountService.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.auth.service; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.auth.model.AuthAccount; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +import java.util.List; + +/** + * 统一账户信息 + * + * @author FrozenWatermelon + * @date 2020/7/2 + */ +public interface AuthAccountService { + + /** + * 通过输入的用户名密码,校验并获取部分用户信息 + * + * @param inputUserName 输入的用户名(用户名/邮箱/手机号) + * @param password 密码 + * @param sysType 系统类型 @see SysTypeEnum + * @param loginType 登录方式 + * @return 用户在token中信息 + */ + ServerResponseEntity getUserInfoInTokenByInputUserNameAndPassword(String inputUserName, + String password, Integer sysType, Integer loginType); + + /** + * 根据用户id 和系统类型获取平台唯一用户 + * + * @param userId 用户id + * @param sysType 系统类型 + * @return 平台唯一用户 + */ + AuthAccount getByUserIdAndType(Long userId, Integer sysType); + + /** + * 更新密码 根据用户id 和系统类型 + * + * @param userId 用户id + * @param sysType 系统类型 + * @param newPassWord 新密码 + */ + void updatePassword(Long userId, Integer sysType, String newPassWord); + + /** + * 根据getByUid获取平台唯一用户 + * + * @param uid uid + * @return 平台唯一用户 + */ + AuthAccount getByUid(Long uid); + + /** + * 根据手机号获取uid + * + * @param mobile 手机号 + * @param systemType 系统类型 + * @return uid + */ + AuthAccount getAccountByInputUserName(String mobile, Integer systemType); + + /** + * 根据手机号获取用户数量 + * + * @param mobile 手机号 + * @return 数量 + */ + int getByMobile(String mobile); + + /** + * 批量注册账户,必须使用条件插入,保证用户批量注册唯一性 + * 该接口只能于用户批量注册普通用户 + * 需要确定需要批量插入的集合本身 里面的手机号 邮箱 用户名 不存在重复的数据 + * + * @param authAccounts 账户参数集合 + * @return 行数 + */ + int batchSaveAccounts(List authAccounts); + + /** + * 统计用户数量 + * + * @param userIds 用户id集合 + * @param sysType 系统类型 + * @return 数量 + */ + int countByUserIds(List userIds, Integer sysType); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/vo/TokenWithTempUidVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/vo/TokenWithTempUidVO.java new file mode 100644 index 0000000..7a74eca --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/auth/vo/TokenWithTempUidVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.tmerclub.cloud.auth.vo; + +import com.tmerclub.cloud.api.auth.vo.TokenInfoVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +import java.io.Serial; +import java.io.Serializable; + +/** + * token和tempUid + * + * @author FrozenWatermelon + * @date 2022/09/06 + */ +public class TokenWithTempUidVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @NotBlank + @Schema(description = "临时的uid,微信公众号支付需要openid,但用户又不绑定社交账号,所以这个openId是临时的") + private String tempUid; + + @NotBlank + @Schema(description = "小程序通过getPhoneNumber方法获取的code") + private TokenInfoVO tokenInfo; + + public TokenWithTempUidVO(String tempUid, TokenInfoVO tokenInfo) { + this.tempUid = tempUid; + this.tokenInfo = tokenInfo; + } + + public TokenWithTempUidVO() { + } + + public String getTempUid() { + return tempUid; + } + + public void setTempUid(String tempUid) { + this.tempUid = tempUid; + } + + public TokenInfoVO getTokenInfo() { + return tokenInfo; + } + + public void setTokenInfo(TokenInfoVO tokenInfo) { + this.tokenInfo = tokenInfo; + } + + @Override + public String toString() { + return "TokenWithTempUidVO{" + + "tempUid='" + tempUid + '\'' + + ", tokenInfo=" + tokenInfo + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/MenuController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/MenuController.java new file mode 100644 index 0000000..2ee3c30 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/controller/MenuController.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.controller; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.BooleanUtil; +import com.tmerclub.cloud.rbac.dto.MenuDTO; +import com.tmerclub.cloud.rbac.model.Menu; +import com.tmerclub.cloud.rbac.service.MenuService; +import com.tmerclub.cloud.rbac.vo.MenuSimpleVO; +import com.tmerclub.cloud.rbac.vo.MenuVO; +import com.tmerclub.cloud.rbac.vo.RouteMetaVO; +import com.tmerclub.cloud.rbac.vo.RouteVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/08/06 + */ +@RequestMapping("/mp/menu") +@RestController +@Tag(name = "菜单接口") +public class MenuController { + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @Autowired + private MenuService menuService; + + + @GetMapping("/route") + @Operation(summary = "路由菜单", description = "获取当前登陆用户可用的路由菜单列表") + public ServerResponseEntity> route(Integer sysType) { + sysType = Objects.isNull(sysType) ? AuthUserContext.get().getSysType() : sysType; + List menus = menuService.listBySysType(sysType); + + List routes = new ArrayList<>(menus.size()); + + for (Menu menu : menus) { + RouteVO route = new RouteVO(); + route.setAlwaysShow(BooleanUtil.isTrue(menu.getAlwaysShow())); + route.setComponent(menu.getComponent()); + route.setHidden(BooleanUtil.isTrue(menu.getHidden())); + route.setName(menu.getName()); + route.setPath(menu.getPath()); + route.setRedirect(menu.getRedirect()); + route.setId(menu.getMenuId()); + route.setParentId(menu.getParentId()); + route.setSeq(menu.getSeq()); + + RouteMetaVO meta = new RouteMetaVO(); + meta.setActiveMenu(menu.getActiveMenu()); + meta.setAffix(BooleanUtil.isTrue(menu.getAffix())); + meta.setBreadcrumb(BooleanUtil.isTrue(menu.getBreadcrumb())); + meta.setIcon(menu.getIcon()); + meta.setNoCache(BooleanUtil.isTrue(menu.getNoCache())); + meta.setTitle(menu.getTitle()); + // 对于前端来说角色就是权限 + meta.setRoles(Collections.singletonList(menu.getPermission())); + + route.setMeta(meta); + routes.add(route); + } + return ServerResponseEntity.success(routes); + } + + @GetMapping + @Operation(summary = "获取菜单管理", description = "根据menuId获取菜单管理") + public ServerResponseEntity getByMenuId(@RequestParam Long menuId) { + return ServerResponseEntity.success(menuService.getByMenuId(menuId)); + } + + @PostMapping + @Operation(summary = "保存菜单管理", description = "保存菜单管理") + public ServerResponseEntity save(@Valid @RequestBody MenuDTO menuDTO) { + if (cn.hutool.core.util.BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限修改菜单"); + } + Menu menu = checkAndGenerate(menuDTO); + menu.setMenuId(null); + menuService.save(menu); + return ServerResponseEntity.success(); + } + + private Menu checkAndGenerate(@RequestBody @Valid MenuDTO menuDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (!Objects.equals(uidInfoBO.getTenantId(), 0L)) { + throw new LuckException("无权限操作!"); + } + Menu menu = BeanUtil.map(menuDTO, Menu.class); + menu.setBizType(menuDTO.getSysType()); + if (Objects.isNull(menuDTO.getSysType())) { + menu.setBizType(AuthUserContext.get().getSysType()); + } + return menu; + } + + @PutMapping + @Operation(summary = "更新菜单管理", description = "更新菜单管理") + public ServerResponseEntity update(@Valid @RequestBody MenuDTO menuDTO) { + if (cn.hutool.core.util.BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限修改菜单"); + } + Menu menu = checkAndGenerate(menuDTO); + menuService.update(menu); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除菜单管理", description = "根据菜单管理id删除菜单管理") + public ServerResponseEntity delete(@RequestParam("menuId") Long menuId, @RequestParam("sysType") Integer sysType) { + if (cn.hutool.core.util.BooleanUtil.isFalse(permission)) { + return ServerResponseEntity.showFailMsg("暂无权限修改菜单"); + } + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (!Objects.equals(uidInfoBO.getTenantId(), 0L)) { + throw new LuckException("无权限操作!"); + } + sysType = Objects.isNull(sysType) ? uidInfoBO.getSysType() : sysType; + menuService.deleteById(menuId, sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_with_permissions") + @Operation(summary = "菜单列表和按钮列表", description = "根据系统类型获取该系统的菜单列表 + 菜单下的权限列表") + public ServerResponseEntity> listWithPermissions(@RequestParam(required = false) Integer sysType) { + List menuList; + if (Objects.isNull(sysType)) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + menuList = menuService.listWithPermissions(uidInfoBO.getSysType(), uidInfoBO.getUserId(), uidInfoBO.getIsAdmin()); + } + else { + menuList = menuService.listWithPermissions(sysType, null, 1); + } + + return ServerResponseEntity.success(menuList); + } + + @GetMapping("/list_menu_ids") + @Operation(summary = "获取当前用户可见的菜单ids", description = "获取当前用户可见的菜单id") + public ServerResponseEntity> listMenuIds() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + List menuList = menuService.listMenuIds(uidInfoBO.getUserId()); + return ServerResponseEntity.success(menuList); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuPermissionDTO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuPermissionDTO.java new file mode 100644 index 0000000..05de20a --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/dto/MenuPermissionDTO.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 菜单资源DTO + * + * @author FrozenWatermelon + * @date 2020-09-15 16:35:01 + */ +public class MenuPermissionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "菜单资源用户id") + private Long menuPermissionId; + + @Schema(description = "资源关联菜单") + private Long menuId; + + @Schema(description = "权限对应的编码") + private String permission; + + /** + * 最长32个字符 + */ + @Length(message = "the longest 32 characters ", max = 32) + @Schema(description = "资源名称") + private String name; + + @Schema(description = "资源对应服务器路径") + private String uri; + + @Schema(description = "业务类型 1 店铺菜单 2平台菜单") + private Integer bizType; + + @Schema(description = "请求方法 1.GET 2.POST 3.PUT 4.DELETE") + private Integer method; + + @Schema(description = "菜单标题") + private String menuTitle; + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Long getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(Long menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getMethod() { + return method; + } + + public void setMethod(Integer method) { + this.method = method; + } + + public String getMenuTitle() { + return menuTitle; + } + + public void setMenuTitle(String menuTitle) { + this.menuTitle = menuTitle; + } + + @Override + public String toString() { + return "MenuPermissionDTO{" + + "menuPermissionId=" + menuPermissionId + + ", menuId=" + menuId + + ", permission='" + permission + '\'' + + ", name='" + name + '\'' + + ", uri='" + uri + '\'' + + ", bizType=" + bizType + + ", method=" + method + + ", menuTitle='" + menuTitle + '\'' + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/feign/UserRoleFeignController.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/feign/UserRoleFeignController.java new file mode 100644 index 0000000..892da3a --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/feign/UserRoleFeignController.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.feign; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.rbac.dto.UserRoleDTO; +import com.tmerclub.cloud.api.rbac.feign.UserRoleFeignClient; +import com.tmerclub.cloud.auth.manager.TokenStore; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.rbac.mapper.UserRoleMapper; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/7/15 + */ +@DubboService +public class UserRoleFeignController implements UserRoleFeignClient { + + private static final Logger logger = LoggerFactory.getLogger(UserRoleFeignController.class); + + @Autowired + private UserRoleMapper userRoleMapper; + + @Autowired + private TokenStore tokenStore; + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.MENU_ID_LIST_KEY, key = "#userRoleDTO.userId") + public void saveByUserIdAndSysType(UserRoleDTO userRoleDTO) { + + if (CollUtil.isEmpty(userRoleDTO.getRoleIds())) { + ServerResponseEntity.success(); + return; + } + //保存用户与角色关系 + userRoleMapper.insertUserAndUserRole(userRoleDTO.getUserId(), userRoleDTO.getRoleIds()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.MENU_ID_LIST_KEY, key = "#userRoleDTO.userId") + public void updateByUserIdAndSysType(UserRoleDTO userRoleDTO) { + // 不管权限具体有没有发生变动,都直接删除token缓存 + tokenStore.deleteUserToken(); + //先删除用户与角色关系 + userRoleMapper.deleteByUserId(userRoleDTO.getUserId()); + if (CollUtil.isEmpty(userRoleDTO.getRoleIds())) { + ServerResponseEntity.success(); + return; + } + //保存用户与角色关系 + userRoleMapper.insertUserAndUserRole(userRoleDTO.getUserId(), userRoleDTO.getRoleIds()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.MENU_ID_LIST_KEY, key = "#userId") + public void deleteByUserIdAndSysType(Long userId) { + userRoleMapper.deleteByUserId(userId); + } + + @Override + public ServerResponseEntity> getRoleIds(Long userId) { + return ServerResponseEntity.success(userRoleMapper.getRoleIds(userId)); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/MenuMapper.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/MenuMapper.java new file mode 100644 index 0000000..135b965 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/MenuMapper.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.mapper; + +import com.tmerclub.cloud.rbac.model.Menu; +import com.tmerclub.cloud.rbac.vo.MenuSimpleVO; +import com.tmerclub.cloud.rbac.vo.MenuVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + */ +public interface MenuMapper { + + /** + * 根据菜单管理id获取菜单管理 + * + * @param menuId 菜单管理id + * @return 菜单管理 + */ + MenuVO getByMenuId(@Param("menuId") Long menuId); + + /** + * 保存菜单管理 + * + * @param menu 菜单管理 + */ + void save(@Param("menu") Menu menu); + + /** + * 更新菜单管理 + * + * @param menu 菜单管理 + */ + void update(@Param("menu") Menu menu); + + /** + * 根据菜单管理id删除菜单管理 + * + * @param menuId + * @param sysType + */ + void deleteById(@Param("menuId") Long menuId, @Param("sysType") Integer sysType); + + /** + * 根据系统类型获取该系统的菜单列表 + * + * @param sysType 系统类型 + * @return 菜单列表 + */ + List listBySysType(@Param("sysType") Integer sysType); + + /** + * 根据系统类型获取该系统的菜单列表 + 菜单下的权限列表 + * + * @param sysType 系统类型 + * @return 菜单列表 + 菜单下的权限列表 + */ + List listWithPermissions(Integer sysType); + + /** + * 获取当前用户可见的菜单ids + * + * @param userId 用户id + * @return 菜单列表 + */ + List listMenuIds(@Param("userId") Long userId); + + /** + * 根据系统类型和用户id获取当前用户的菜单列表 + * + * @param sysType + * @param userId + * @return + */ + List listUserMenuAndBtn(@Param("sysType") Integer sysType, @Param("userId") Long userId); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/RoleMapper.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/RoleMapper.java new file mode 100644 index 0000000..5b80870 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/mapper/RoleMapper.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.mapper; + +import com.tmerclub.cloud.rbac.model.Role; +import com.tmerclub.cloud.rbac.vo.RoleVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色 + * + * @author FrozenWatermelon + * @date 2020-09-17 19:15:44 + */ +public interface RoleMapper { + + /** + * 获取角色列表 + * + * @param sysType + * @param tenantId + * @param roleName + * @return 角色列表 + */ + List list(@Param("sysType") Integer sysType, @Param("tenantId") Long tenantId, @Param("roleName") String roleName); + + /** + * 根据角色id获取角色 + * + * @param roleId 角色id + * @return 角色 + */ + RoleVO getByRoleId(@Param("roleId") Long roleId); + + /** + * 保存角色 + * + * @param role 角色 + */ + void save(@Param("role") Role role); + + /** + * 更新角色 + * + * @param role 角色 + */ + void update(@Param("role") Role role); + + /** + * 根据角色id删除角色 + * + * @param roleId 角色id + * @param sysType 系统类型 + */ + void deleteById(@Param("roleId") Long roleId, @Param("sysType") Integer sysType); + + /** + * 根据角色id获取该角色所在系统 + * + * @param roleId 角色id + * @return sysType + */ + Integer getBizType(@Param("roleId") Long roleId); + + /** + * 统计角色名称的使用数量 + * + * @param role + * @return + */ + int countRoleName(@Param("role") Role role); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/Menu.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/Menu.java new file mode 100644 index 0000000..a8d982b --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/Menu.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 菜单管理 + * + * @author FrozenWatermelon + * @date 2020-09-15 16:36:50 + */ +public class Menu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 菜单id + */ + private Long menuId; + + /** + * 父菜单ID,一级菜单为0 + */ + private Long parentId; + + /** + * 业务类型 1 店铺菜单 2平台菜单 3 供应商菜单 + */ + private Integer bizType; + + /** + * 权限,需要有哪个权限才能访问该菜单 + */ + private String permission; + + /** + * 路径 就像uri + */ + private String path; + + /** + * 组件如:1.'Layout' 为布局,不会跳页面 2.'components-demo/tinymce' 跳转到该页面 + */ + private String component; + + /** + * 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 一直显示根路由 + */ + private Integer alwaysShow; + + /** + * 当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + */ + private Integer hidden; + + /** + * 设定路由的名字,一定要填写不然使用时会出现各种问题 + */ + private String name; + + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon + */ + private String icon; + + /** + * 如果设置为true,则不会被 缓存(默认 false) + */ + private Integer noCache; + + /** + * 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true) + */ + private Integer breadcrumb; + + /** + * 若果设置为true,它则会固定在tags-view中(默认 false) + */ + private Integer affix; + + /** + * 当路由设置了该属性,则会高亮相对应的侧边栏。 + */ + private String activeMenu; + + /** + * 排序,越小越靠前 + */ + private Integer seq; + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getRedirect() { + return redirect; + } + + public void setRedirect(String redirect) { + this.redirect = redirect; + } + + public Integer getAlwaysShow() { + return alwaysShow; + } + + public void setAlwaysShow(Integer alwaysShow) { + this.alwaysShow = alwaysShow; + } + + public Integer getHidden() { + return hidden; + } + + public void setHidden(Integer hidden) { + this.hidden = hidden; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public Integer getNoCache() { + return noCache; + } + + public void setNoCache(Integer noCache) { + this.noCache = noCache; + } + + public Integer getBreadcrumb() { + return breadcrumb; + } + + public void setBreadcrumb(Integer breadcrumb) { + this.breadcrumb = breadcrumb; + } + + public Integer getAffix() { + return affix; + } + + public void setAffix(Integer affix) { + this.affix = affix; + } + + public String getActiveMenu() { + return activeMenu; + } + + public void setActiveMenu(String activeMenu) { + this.activeMenu = activeMenu; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "MenuVO{" + + "menuId=" + menuId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",parentId=" + parentId + + ",bizType=" + bizType + + ",permission=" + permission + + ",path=" + path + + ",component=" + component + + ",redirect=" + redirect + + ",alwaysShow=" + alwaysShow + + ",hidden=" + hidden + + ",name=" + name + + ",title=" + title + + ",icon=" + icon + + ",noCache=" + noCache + + ",breadcrumb=" + breadcrumb + + ",affix=" + affix + + ",activeMenu=" + activeMenu + + ",seq=" + seq + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/MenuPermission.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/MenuPermission.java new file mode 100644 index 0000000..44afa78 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/MenuPermission.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 菜单资源 + * + * @author FrozenWatermelon + * @date 2020-09-15 16:36:50 + */ +public class MenuPermission extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 菜单资源用户id + */ + private Long menuPermissionId; + + /** + * 资源关联菜单 + */ + private Long menuId; + + /** + * 业务类型 1 店铺菜单 2平台菜单 + */ + private Integer bizType; + + /** + * 权限对应的编码 + */ + private String permission; + + /** + * 资源名称 + */ + private String name; + + /** + * 资源对应服务器路径 + */ + private String uri; + + /** + * 请求方法 1.GET 2.POST 3.PUT 4.DELETE + */ + private Integer method; + + public Long getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(Long menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getMethod() { + return method; + } + + public void setMethod(Integer method) { + this.method = method; + } + + @Override + public String toString() { + return "MenuPermissionVO{" + + "menuPermissionId=" + menuPermissionId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",menuId=" + menuId + + ",bizType=" + bizType + + ",permission=" + permission + + ",name=" + name + + ",uri=" + uri + + ",method=" + method + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/Role.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/Role.java new file mode 100644 index 0000000..408080f --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/Role.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 角色 + * + * @author FrozenWatermelon + * @date 2020-09-17 19:15:44 + */ +public class Role extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 角色id + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 备注 + */ + private String remark; + + /** + * 创建者ID + */ + private Long createUserId; + + /** + * 业务类型 1 店铺菜单 2平台菜单 + */ + private Integer bizType; + + /** + * 所属租户id + */ + private Long tenantId; + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(Long createUserId) { + this.createUserId = createUserId; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Long getTenantId() { + return tenantId; + } + + public void setTenantId(Long tenantId) { + this.tenantId = tenantId; + } + + @Override + public String toString() { + return "Role{" + + "roleId=" + roleId + + ", roleName='" + roleName + '\'' + + ", remark='" + remark + '\'' + + ", createUserId=" + createUserId + + ", bizType=" + bizType + + ", tenantId=" + tenantId + + "} " + super.toString(); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/UserRole.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/UserRole.java new file mode 100644 index 0000000..7f6ec80 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/model/UserRole.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户与角色对应关系 + * + * @author FrozenWatermelon + * @date 2020/6/24 + */ +public class UserRole extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 关联id + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + @Override + public String toString() { + return "UserRole{" + "id=" + id + ", userId=" + userId + ", roleId=" + roleId + "} " + super.toString(); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/MenuPermissionService.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/MenuPermissionService.java new file mode 100644 index 0000000..ebd9533 --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/MenuPermissionService.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.service; + +import com.tmerclub.cloud.api.rbac.bo.UriPermissionBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.rbac.dto.MenuPermissionDTO; +import com.tmerclub.cloud.rbac.model.MenuPermission; +import com.tmerclub.cloud.rbac.vo.MenuPermissionVO; + +import java.util.List; + +/** + * 菜单资源 + * + * @author FrozenWatermelon + * @date 2020-09-14 16:27:55 + */ +public interface MenuPermissionService { + + /** + * 分页获取菜单资源列表 + * @param pageDTO 分页参数 + * @param menuPermissionDTO 搜索参数 + * @return 菜单资源列表分页数据 + */ + PageVO page(PageDTO pageDTO, MenuPermissionDTO menuPermissionDTO); + + /** + * 根据菜单资源id获取菜单资源 + * + * @param menuPermissionId 菜单资源id + * @return 菜单资源 + */ + MenuPermissionVO getByMenuPermissionId(Long menuPermissionId); + + /** + * 保存菜单资源 + * @param menuPermission 菜单资源 + * @return + */ + ServerResponseEntity save(MenuPermission menuPermission); + + /** + * 更新菜单资源 + * @param menuPermission 菜单资源 + * @return + */ + ServerResponseEntity update(MenuPermission menuPermission); + + /** + * 根据菜单资源id删除菜单资源 + * @param menuPermissionId + * @param sysType + */ + void deleteById(Long menuPermissionId, Integer sysType); + + /** + * 根据用户所在系统的用户id,用户所在系统类型,获取用户的权限列表 + * @param userId 用户id + * @param sysType 系统类型 + * @param isAdmin 是否为管理员 + * @return 权限列表 + */ + List listUserPermissions(Long userId, Integer sysType, boolean isAdmin); + + /** + * 清除用户权限缓存 + * @param userId 用户id + * @param sysType 系统类型 + */ + void clearUserPermissionsCache(Long userId, Integer sysType); + + /** + * 根据系统类型,获取该类型用户拥有的所有权限数据 + * @param sysType 系统类型 + * @return uri权限列表 + */ + List listUriPermissionInfo(Integer sysType); + + /** + * 根据menuId获取菜单资源列表 + * @param menuId 菜单id + * @return 菜单资源列表数据 + */ + List listByMenuId(Long menuId); + + /** + * 根据用户id,系统类型,获取用户的权限列表 + * @param userId + * @param sysType + * @return + */ + List listPermissionByUserIdAndSysType(Long userId, Integer sysType); + + + /** + * 根据MenuPermIdLis获取菜单资源数据 + * @param menuPermIdList + * @return + */ + List getUriPermissionListByMenuPermIdList(List menuPermIdList); +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/MenuPermissionServiceImpl.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/MenuPermissionServiceImpl.java new file mode 100644 index 0000000..4b01d6c --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/MenuPermissionServiceImpl.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.service.impl; + +import com.tmerclub.cloud.api.rbac.bo.UriPermissionBO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.rbac.dto.MenuPermissionDTO; +import com.tmerclub.cloud.rbac.mapper.MenuPermissionMapper; +import com.tmerclub.cloud.rbac.model.MenuPermission; +import com.tmerclub.cloud.rbac.service.MenuPermissionService; +import com.tmerclub.cloud.rbac.vo.MenuPermissionVO; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 菜单资源 + * + * @author FrozenWatermelon + * @date 2020-09-14 16:27:55 + */ +@Service +public class MenuPermissionServiceImpl implements MenuPermissionService { + + @Autowired + private MenuPermissionMapper menuPermissionMapper; + + @Autowired + private CacheManagerUtil cacheManagerUtil; + + @Override + public PageVO page(PageDTO pageDTO, MenuPermissionDTO menuPermissionDTO) { + return PageUtil.doPage(pageDTO, () -> menuPermissionMapper.list(menuPermissionDTO)); + } + + @Override + public MenuPermissionVO getByMenuPermissionId(Long menuPermissionId) { + return menuPermissionMapper.getByMenuPermissionId(menuPermissionId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.URI_PERMISSION_KEY, key = "#menuPermission.bizType") + public ServerResponseEntity save(MenuPermission menuPermission) { + + MenuPermission dbMenuPermission = menuPermissionMapper.getByPermission(menuPermission.getPermission(), + menuPermission.getBizType(), menuPermission.getMenuPermissionId()); + menuPermissionMapper.save(menuPermission); + return ServerResponseEntity.success(); + } + + @Override + @CacheEvict(cacheNames = CacheNames.URI_PERMISSION_KEY, key = "#menuPermission.bizType") + public ServerResponseEntity update(MenuPermission menuPermission) { + MenuPermission dbMenuPermission = menuPermissionMapper.getByPermission(menuPermission.getPermission(), + menuPermission.getBizType(), menuPermission.getMenuPermissionId()); + menuPermissionMapper.update(menuPermission); + return ServerResponseEntity.success(); + } + + @Override + @CacheEvict(cacheNames = CacheNames.URI_PERMISSION_KEY, key = "#sysType") + public void deleteById(Long menuPermissionId, Integer sysType) { + menuPermissionMapper.deleteById(menuPermissionId, sysType); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.USER_PERMISSIONS_KEY, key = "#sysType + ':' + #userId"), + @CacheEvict(cacheNames = CacheNames.MENU_ID_LIST_KEY, key = "#userId") + }) + public void clearUserPermissionsCache(Long userId, Integer sysType) { + } + + @Override + public List listUserPermissions(Long userId, Integer sysType, boolean isAdmin) { + MenuPermissionServiceImpl menuPermissionService = (MenuPermissionServiceImpl) AopContext.currentProxy(); + List permsList; + + // 系统管理员,拥有最高权限 + if (isAdmin) { + List uriPermissions = listUriPermissionInfo(sysType); + permsList = uriPermissions.stream().map(UriPermissionBO::getPermission).collect(Collectors.toList()); + } + else { + List uriPermissionBOList = menuPermissionService.listPermissionByUserIdAndSysType(userId, sysType); + permsList = uriPermissionBOList.stream() + .filter(uriPermissionBO -> uriPermissionBO.getHasPermission()) + .map(UriPermissionBO::getPermission).collect(Collectors.toList()); + } + return permsList; + } + + @Override + @Cacheable(cacheNames = CacheNames.URI_PERMISSION_KEY, key = "#sysType") + public List listUriPermissionInfo(Integer sysType) { + return menuPermissionMapper.listUriPermissionInfo(sysType); + } + + @Override + public List listByMenuId(Long menuId) { + return menuPermissionMapper.listByMenuId(menuId); + } + + /** + * 获取某个类型用户的所有权限列表(有缓存) + * + * @param sysType 系统类型 + * @return 权限列表 + */ + @Cacheable(cacheNames = CacheNames.PERMISSIONS_KEY, key = "#sysType") + public List listAllPermission(Integer sysType) { + return menuPermissionMapper.listAllPermissionBySysType(sysType); + } + + /** + * 获取某个类型用户的所有权限列表(有缓存) + * + * @param sysType 系统类型 + * @return 权限列表 + */ + @Override + @Cacheable(cacheNames = CacheNames.USER_PERMISSIONS_KEY, key = "#sysType + ':' + #userId") + public List listPermissionByUserIdAndSysType(Long userId, Integer sysType) { + // 获取所有的权限,并标出该用户所拥有的权限 + List userPermissionList = menuPermissionMapper.listPermissionByUserIdAndSysType(userId, sysType); + + MenuPermissionServiceImpl menuPermissionService = (MenuPermissionServiceImpl)AopContext.currentProxy(); + List uriPermissions = menuPermissionService.listUriPermissionInfo(sysType); + for (UriPermissionBO uriPermission : uriPermissions) { + if (!userPermissionList.contains(uriPermission.getPermission())) { + uriPermission.setHasPermission(false); + } + } + return uriPermissions; + } + + @Override + public List getUriPermissionListByMenuPermIdList(List menuIdList) { + return menuPermissionMapper.getUriPermissionListByMenuPermIdList(menuIdList); + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/MenuServiceImpl.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/MenuServiceImpl.java new file mode 100644 index 0000000..ee3d32c --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/service/impl/MenuServiceImpl.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.service.impl; + +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.rbac.mapper.MenuMapper; +import com.tmerclub.cloud.rbac.model.Menu; +import com.tmerclub.cloud.rbac.service.MenuService; +import com.tmerclub.cloud.rbac.vo.MenuSimpleVO; +import com.tmerclub.cloud.rbac.vo.MenuVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 菜单管理 + * + * @author FrozenWatermelon + * @date 2020-09-14 16:27:55 + */ +@Service +public class MenuServiceImpl implements MenuService { + + @Autowired + private MenuMapper menuMapper; + + @Override + public MenuVO getByMenuId(Long menuId) { + return menuMapper.getByMenuId(menuId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.MENU_LIST_KEY, key = "#menu.bizType") + public void save(Menu menu) { + menuMapper.save(menu); + } + + @Override + @CacheEvict(cacheNames = CacheNames.MENU_LIST_KEY, key = "#menu.bizType") + public void update(Menu menu) { + menuMapper.update(menu); + } + + @Override + @CacheEvict(cacheNames = CacheNames.MENU_LIST_KEY, key = "#sysType") + public void deleteById(Long menuId, Integer sysType) { + menuMapper.deleteById(menuId, sysType); + } + + @Override + @Cacheable(cacheNames = CacheNames.MENU_LIST_KEY, key = "#sysType") + public List listBySysType(Integer sysType) { + return menuMapper.listBySysType(sysType); + } + + @Override + public List listWithPermissions(Integer sysType, Long userId, Integer isAdmin) { + //判断当前用户是否为管理员 + if (isAdmin == 1) { + return menuMapper.listWithPermissions(sysType); + } else { + return menuMapper.listUserMenuAndBtn(sysType, userId); + } + } + + @Override + @Cacheable(cacheNames = CacheNames.MENU_ID_LIST_KEY, key = "#userId") + public List listMenuIds(Long userId) { + return menuMapper.listMenuIds(userId); + } + +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuPermissionSimpleVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuPermissionSimpleVO.java new file mode 100644 index 0000000..5d1aa9a --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/MenuPermissionSimpleVO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 菜单资源简易VO + * + * @author FrozenWatermelon + * @date 2020-09-17 16:35:01 + */ +public class MenuPermissionSimpleVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "菜单资源用户id") + private Long menuPermissionId; + + @Schema(description = "资源关联菜单") + private Long menuId; + + @Schema(description = "资源名称") + private String name; + + public Long getMenuPermissionId() { + return menuPermissionId; + } + + public void setMenuPermissionId(Long menuPermissionId) { + this.menuPermissionId = menuPermissionId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "MenuPermissionVO{" + + "menuPermissionId=" + menuPermissionId + + ",menuId=" + menuId + + ",name=" + name + + '}'; + } +} diff --git a/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RouteMetaVO.java b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RouteMetaVO.java new file mode 100644 index 0000000..b5a317d --- /dev/null +++ b/tmerclub-auth/src/main/java/com/tmerclub/cloud/rbac/vo/RouteMetaVO.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.rbac.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/8/7 + */ +public class RouteMetaVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + @Schema(description = "设置该路由在侧边栏和面包屑中展示的名字") + private String title; + + /** + * 设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon + */ + @Schema(description = "设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon") + private String icon; + + /** + * 如果设置为true,则不会被 缓存(默认 false) + */ + @Schema(description = "如果设置为true,则不会被 缓存(默认 false)") + private Boolean noCache; + + /** + * 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true) + */ + @Schema(description = "如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)") + private Boolean breadcrumb; + + /** + * 若果设置为true,它则会固定在tags-view中(默认 false) + */ + @Schema(description = "若果设置为true,它则会固定在tags-view中(默认 false)") + private Boolean affix; + + /** + * 当路由设置了该属性,则会高亮相对应的侧边栏。 这在某些场景非常有用,比如:一个文章的列表页路由为:/article/list + * 点击文章进入文章详情页,这时候路由为/article/1,但你想在侧边栏高亮文章列表的路由,就可以进行如下设置 + */ + @Schema(description = "当路由设置了该属性,则会高亮相对应的侧边栏。") + private String activeMenu; + + @Schema(description = "需要什么权限才能访问该菜单") + private List roles; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public Boolean getNoCache() { + return noCache; + } + + public void setNoCache(Boolean noCache) { + this.noCache = noCache; + } + + public Boolean getBreadcrumb() { + return breadcrumb; + } + + public void setBreadcrumb(Boolean breadcrumb) { + this.breadcrumb = breadcrumb; + } + + public Boolean getAffix() { + return affix; + } + + public void setAffix(Boolean affix) { + this.affix = affix; + } + + public String getActiveMenu() { + return activeMenu; + } + + public void setActiveMenu(String activeMenu) { + this.activeMenu = activeMenu; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + @Override + public String toString() { + return "RouteMetaVO{" + "title='" + title + '\'' + ", icon='" + icon + '\'' + ", noCache=" + noCache + + ", breadcrumb=" + breadcrumb + ", affix=" + affix + ", activeMenu='" + activeMenu + '\'' + ", roles=" + + roles + '}'; + } + +} diff --git a/tmerclub-auth/src/main/resources/bootstrap.yml b/tmerclub-auth/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..33b081f --- /dev/null +++ b/tmerclub-auth/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9101} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:11101} diff --git a/tmerclub-auth/src/main/resources/captcha/original/1.png b/tmerclub-auth/src/main/resources/captcha/original/1.png new file mode 100644 index 0000000..51573a0 Binary files /dev/null and b/tmerclub-auth/src/main/resources/captcha/original/1.png differ diff --git a/tmerclub-auth/src/main/resources/captcha/original/4.png b/tmerclub-auth/src/main/resources/captcha/original/4.png new file mode 100644 index 0000000..c856f4d Binary files /dev/null and b/tmerclub-auth/src/main/resources/captcha/original/4.png differ diff --git a/tmerclub-auth/src/main/resources/captcha/original/5.png b/tmerclub-auth/src/main/resources/captcha/original/5.png new file mode 100644 index 0000000..4594fcf Binary files /dev/null and b/tmerclub-auth/src/main/resources/captcha/original/5.png differ diff --git a/tmerclub-auth/src/main/resources/captcha/slidingBlock/1.png b/tmerclub-auth/src/main/resources/captcha/slidingBlock/1.png new file mode 100644 index 0000000..1905026 Binary files /dev/null and b/tmerclub-auth/src/main/resources/captcha/slidingBlock/1.png differ diff --git a/tmerclub-auth/src/main/resources/captcha/slidingBlock/4.png b/tmerclub-auth/src/main/resources/captcha/slidingBlock/4.png new file mode 100644 index 0000000..bc69c96 Binary files /dev/null and b/tmerclub-auth/src/main/resources/captcha/slidingBlock/4.png differ diff --git a/tmerclub-auth/src/main/resources/mapper/AuthAccountMapper.xml b/tmerclub-auth/src/main/resources/mapper/AuthAccountMapper.xml new file mode 100644 index 0000000..10bede0 --- /dev/null +++ b/tmerclub-auth/src/main/resources/mapper/AuthAccountMapper.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + `uid`, create_time, update_time, email, phone, username, `password`, create_ip, + `status`, sys_type, user_id, tenant_id, is_admin, is_pass_shop + + + + UPDATE + auth_account + SET + status = -1 + WHERE + tenant_id = #{tenantId} + AND sys_type = #{sysType} + + + + + + + + + + + update auth_account set password = #{newPassWord} where sys_type = #{sysType} and user_id = #{userId} + + + insert into auth_account (`uid`,`email`,`phone`,`username`,`password`,`create_ip`,`status`,`sys_type`,`user_id`,`tenant_id`,`is_admin`,`is_pass_shop`) + values (#{authAccount.uid},#{authAccount.email},#{authAccount.phone},#{authAccount.username},#{authAccount.password},#{authAccount.createIp},#{authAccount.status},#{authAccount.sysType},#{authAccount.userId},#{authAccount.tenantId},#{authAccount.isAdmin},#{authAccount.isPassShop}); + + + + insert into auth_account (`uid`,`email`,`phone`,`username`,`password`,`create_ip`,`status`,`sys_type`,`user_id`,`tenant_id`,`is_admin`) + select * from ( + + SELECT #{authAccount.uid} `uid`,#{authAccount.email} `email`, #{authAccount.phone} `phone`,#{authAccount.username} `username`, + #{authAccount.password} `password`,#{authAccount.createIp} `create_ip`,#{authAccount.status} `status`, + #{authAccount.sysType} `sys_type`,#{authAccount.userId} `user_id`,#{authAccount.tenantId} `tenant_id`,#{authAccount.isAdmin} `is_admin` + FROM DUAL + + ) a WHERE NOT EXISTS (SELECT `phone`,`email`,`username` FROM `auth_account` b + WHERE b.status != -1 AND b.sys_type = 0 AND (a.`phone` = b.`phone` OR a.`email` = b.`email` OR a.`username` = b.`username`)) + + + update auth_account + + + email = #{authAccount.email}, + + + phone = #{authAccount.phone}, + + + username = #{authAccount.username}, + + + password = #{authAccount.password}, + + + status = #{authAccount.status}, + + + is_pass_shop = #{authAccount.isPassShop} + + + where user_id = #{authAccount.userId} and sys_type = #{authAccount.sysType} + + + update auth_account set status = -1 where user_id = #{userId} and sys_type = #{sysType} + + + + update auth_account set phone = #{authAccountDTO.phone} where user_id = #{authAccountDTO.userId} and sys_type = #{authAccountDTO.sysType} + + + update auth_account + + + tenant_id = #{authAccount.tenantId}, + + + is_pass_shop = #{authAccount.isPassShop}, + + + where user_id = #{userId} and sys_type = #{sysType} and status != -1 limit 1 + + + + + + + + + + + + + + + + diff --git a/tmerclub-auth/src/main/resources/mapper/MenuMapper.xml b/tmerclub-auth/src/main/resources/mapper/MenuMapper.xml new file mode 100644 index 0000000..3635aba --- /dev/null +++ b/tmerclub-auth/src/main/resources/mapper/MenuMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `menu_id`,`create_time`,`update_time`,`parent_id`,`biz_type`,`permission`,`path`,`component`,`redirect`,`always_show`,`hidden`,`name`,`title`,`icon`,`no_cache`,`breadcrumb`,`affix`,`active_menu`,`seq` + + + + + + + insert into menu (`parent_id`,`biz_type`,`permission`,`path`,`component`,`redirect`,`always_show`,`hidden`,`name`,`title`,`icon`,`no_cache`,`breadcrumb`,`affix`,`active_menu`,seq) + values (#{menu.parentId},#{menu.bizType},#{menu.permission},#{menu.path},#{menu.component},#{menu.redirect},#{menu.alwaysShow},#{menu.hidden},#{menu.name},#{menu.title},#{menu.icon},#{menu.noCache},#{menu.breadcrumb},#{menu.affix},#{menu.activeMenu},#{menu.seq}); + + + + + update menu + + + + parent_id = #{menu.parentId}, + + + biz_type = #{menu.bizType}, + + + permission = #{menu.permission}, + + + path = #{menu.path}, + + + component = #{menu.component}, + + + redirect = #{menu.redirect}, + + + always_show = #{menu.alwaysShow}, + + + hidden = #{menu.hidden}, + + + `name` = #{menu.name}, + + + title = #{menu.title}, + + + icon = #{menu.icon}, + + + no_cache = #{menu.noCache}, + + + breadcrumb = #{menu.breadcrumb}, + + + affix = #{menu.affix}, + + + active_menu = #{menu.activeMenu}, + + + seq = #{menu.seq}, + + + where menu_id = #{menu.menuId} + + + + delete from menu where menu_id = #{menuId} and biz_type = #{sysType} + + + + + + + + + diff --git a/tmerclub-auth/src/main/resources/mapper/MenuPermissionMapper.xml b/tmerclub-auth/src/main/resources/mapper/MenuPermissionMapper.xml new file mode 100644 index 0000000..be14e95 --- /dev/null +++ b/tmerclub-auth/src/main/resources/mapper/MenuPermissionMapper.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + `menu_permission_id`,`menu_id`,`biz_type`,`permission`,`name`,`uri`,`method` + + + + + + + insert into menu_permission (`menu_id`, `biz_type`, `permission`, `name`, `uri`, `method`) + values (#{menuPermission.menuId}, #{menuPermission.bizType}, #{menuPermission.permission}, + #{menuPermission.name}, #{menuPermission.uri}, #{menuPermission.method}); + + + + + update menu_permission + + + + menu_id = #{menuPermission.menuId}, + + + + + biz_type = #{menuPermission.bizType}, + + + + + permission = #{menuPermission.permission}, + + + + + name = #{menuPermission.name}, + + + + + uri = #{menuPermission.uri}, + + + + + method = #{menuPermission.method}, + + + + where menu_permission_id = #{menuPermission.menuPermissionId} + + + + + delete + from menu_permission + where menu_permission_id = #{menuPermissionId} + and biz_type = #{sysType} + + + + + + + + + + diff --git a/tmerclub-auth/src/main/resources/mapper/RoleMenuMapper.xml b/tmerclub-auth/src/main/resources/mapper/RoleMenuMapper.xml new file mode 100644 index 0000000..0a57009 --- /dev/null +++ b/tmerclub-auth/src/main/resources/mapper/RoleMenuMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + insert into role_menu (role_id, menu_id, menu_permission_id) values + + (#{roleMenu.roleId},#{roleMenu.menuId},#{roleMenu.menuPermissionId}) + + + + delete from role_menu where role_id = #{roleId} + + + + diff --git a/tmerclub-auth/src/main/resources/mapper/UserRoleMapper.xml b/tmerclub-auth/src/main/resources/mapper/UserRoleMapper.xml new file mode 100644 index 0000000..4bfe90c --- /dev/null +++ b/tmerclub-auth/src/main/resources/mapper/UserRoleMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + id, create_time, update_time, user_id, role_id + + + + + + delete + from user_role + where user_id = #{userId} + + + + + + + + insert into user_role (user_id, role_id) values + + + + (#{userId}, #{roleId}) + + + + + delete + from user_role + where role_id = #{roleId} + + + + diff --git a/tmerclub-biz/pom.xml b/tmerclub-biz/pom.xml new file mode 100644 index 0000000..197ebc1 --- /dev/null +++ b/tmerclub-biz/pom.xml @@ -0,0 +1,93 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-biz + jar + + mall4cloud 业务代码。如图片上传/短信/快递等 + + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-cache + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.aliyun + aliyun-java-sdk-core + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-biz + ${project.version} + + + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.github.binarywang + weixin-java-miniapp + + + com.github.binarywang + weixin-java-mp + + + software.amazon.awssdk + s3 + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-im + ${project.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + + diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/BizServerApplication.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/BizServerApplication.java new file mode 100644 index 0000000..9e2ed54 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/BizServerApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/9/10 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class BizServerApplication { + + public static void main(String[] args) { + SpringApplication.run(BizServerApplication.class, args); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/FileType.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/FileType.java new file mode 100644 index 0000000..c7aec2d --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/FileType.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.constant; + +/** + * 文件类型 + * + * @author YXF + * @date 2021/03/30 + */ +public enum FileType { + + /** + * 图片 + */ + IMAGE(1), + + /** + * 视频 + */ + VIDEO(2), + + /** + * 文件 + */ + FILE(3), + ; + + private final Integer value; + + public Integer value() { + return value; + } + + FileType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/RemindType.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/RemindType.java new file mode 100644 index 0000000..0104834 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/constant/RemindType.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.biz.constant; + +/** + * 消息设置提醒 1开启提醒 0关闭提醒 + * @author lanhai + */ +public enum RemindType { + /** + * 开启提醒 + */ + OPEN(1), + + /** + * 关闭提醒 + */ + CLOSED(0); + + private final Integer num; + + public Integer value() { + return num; + } + + RemindType(Integer num) { + this.num = num; + } + + public static RemindType instance(Integer value) { + RemindType[] enums = values(); + for (RemindType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/OssController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/OssController.java new file mode 100644 index 0000000..8c21914 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/OssController.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller; + +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.biz.vo.PreSignUrlVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/10 + */ +@SuppressWarnings({"CommentedOutCode", "AlibabaRemoveCommentedCode"}) +@RequestMapping("/ua/oss") +@RestController +@Tag(name = "文件管理") +public class OssController { + + @Autowired + private AttachFileService attachFileService; + + @GetMapping("/get_batch_pre_sign_url") + @Operation(summary = "批量获取预签名url(s3协议)") + @Parameter(name = "fileNames", description = "文件名集合") + public ServerResponseEntity> getBatchPreSignUrl(@RequestParam List fileNames) { + List preSignUrlVOList = attachFileService.getBatchPreSignUrl(fileNames); + return ServerResponseEntity.success(preSignUrlVOList); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/QrcodeTicketController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/QrcodeTicketController.java new file mode 100644 index 0000000..df21b8a --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/QrcodeTicketController.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller; + +import cn.hutool.core.util.IdUtil; +import com.tmerclub.cloud.biz.config.WxConfig; +import com.tmerclub.cloud.biz.model.QrcodeTicket; +import com.tmerclub.cloud.biz.service.QrcodeTicketService; +import com.tmerclub.cloud.biz.vo.QrcodeTicketVO; +import com.tmerclub.cloud.common.constant.QRCodeType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * @author cl + * @date 2021-08-17 16:00:13 + */ + +@RestController +@RequestMapping("/ua/qrcode_ticket") +@Tag(name = "二维码数据") +public class QrcodeTicketController { + + @Autowired + private QrcodeTicketService qrcodeTicketService; + @Autowired + private WxConfig wxConfig; + + /** + * 小程序二维码 + */ + @GetMapping("/mini_qrcode") + @Operation(summary = "小程序二维码获取", description = "获取小程序二维码,返回二维码图片流,小程序跳到二维码的页面之后," + + "需要根据获取的scene请求获取线上保存的content,为什么要这么麻烦,以为scene的内容有限,只能在数据库保存") + @Parameters({ + @Parameter(name = "content", description = "要保存的内容", required = true), + @Parameter(name = "type", description = "类型:1. 小程序团购商品 2.小程序分销商品二维码", required = true) + }) + public ResponseEntity save(String content, Integer type) throws WxErrorException { + + String page; + if (Objects.equals(type, QRCodeType.GROUP.value()) || Objects.equals(type, QRCodeType.DISTRIBUTION.value())) { + page = "pages/detail/detail"; + } else { + // 无法获取页面信息 + throw new LuckException("无法获取页面信息"); + } + Map map = new HashMap<>(16); + map.put("type", type); + map.put("content", content); + String ticket = IdUtil.simpleUUID(); + QrcodeTicket qrcodeTicket = new QrcodeTicket(); + qrcodeTicket.setContent(Json.toJsonString(map)); + qrcodeTicket.setType(type); + qrcodeTicket.setTicket(ticket); + qrcodeTicket.setTicketUrl(page); + qrcodeTicketService.save(qrcodeTicket); + File file = wxConfig.getWxMaService().getQrcodeService().createWxaCodeUnlimit(ticket, page); + return ResponseEntity.ok(new FileSystemResource(file)); + } + + + /** + * 根据Ticket获取content + */ + @GetMapping("/get_content") + @Operation(summary = "根据Ticket获取保存的内容", description = "小程序里的scene就是你要的Ticket咯") + @Parameters(@Parameter(name = "ticket", description = "小程序里的scene就是你要的Ticket咯", required = true)) + public ServerResponseEntity getContent(String ticket) { + + QrcodeTicketVO qrcodeTicketVO = qrcodeTicketService.getByTicket(ticket); + if (Objects.isNull(qrcodeTicketVO)) { + // 二维码已过期 + throw new LuckException("二维码已过期"); + } + if (qrcodeTicketVO.getExpireTime() != null && qrcodeTicketVO.getExpireTime().getTime() < System.currentTimeMillis()) { + throw new LuckException("二维码已过期"); + } + return ServerResponseEntity.success(qrcodeTicketVO); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/AttachFileGroupController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/AttachFileGroupController.java new file mode 100644 index 0000000..e527f85 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/AttachFileGroupController.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.admin; + +import com.tmerclub.cloud.biz.dto.AttachFileGroupDTO; +import com.tmerclub.cloud.biz.model.AttachFileGroup; +import com.tmerclub.cloud.biz.service.AttachFileGroupService; +import com.tmerclub.cloud.biz.vo.AttachFileGroupVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author YXF + * @date 2020-12-04 16:15:02 + */ +@RestController("adminAttachFileGroupController") +@RequestMapping("/mp/attach_file_group") +@Tag(name = "admin-文件分组") +public class AttachFileGroupController { + @Autowired + private AttachFileGroupService attachFileGroupService; + + @GetMapping("/list") + @Operation(summary = "获取列表", description = "分页获取列表") + public ServerResponseEntity> list(@RequestParam(value = "type", defaultValue = "1") Integer type) { + List attachFileGroupPage = attachFileGroupService.list(type); + return ServerResponseEntity.success(attachFileGroupPage); + } + + @GetMapping + @Operation(summary = "获取", description = "根据attachFileGroupId获取") + public ServerResponseEntity getByAttachFileGroupId(@RequestParam Long attachFileGroupId) { + return ServerResponseEntity.success(attachFileGroupService.getByAttachFileGroupId(attachFileGroupId)); + } + + @PostMapping + @Operation(summary = "保存", description = "保存") + public ServerResponseEntity save(@Valid @RequestBody AttachFileGroupDTO attachFileGroupDTO) { + AttachFileGroup attachFileGroup = BeanUtil.map(attachFileGroupDTO, AttachFileGroup.class); + attachFileGroup.setAttachFileGroupId(null); + attachFileGroup.setSysType(AuthUserContext.get().getSysType()); + attachFileGroupService.save(attachFileGroup); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新", description = "更新") + public ServerResponseEntity update(@Valid @RequestBody AttachFileGroupDTO attachFileGroupDTO) { + attachFileGroupDTO.setShopId(AuthUserContext.get().getTenantId()); + AttachFileGroup attachFileGroup = BeanUtil.map(attachFileGroupDTO, AttachFileGroup.class); + attachFileGroup.setSysType(AuthUserContext.get().getSysType()); + attachFileGroupService.update(attachFileGroup); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除", description = "根据id删除") + public ServerResponseEntity delete(@RequestParam Long attachFileGroupId) { + AttachFileGroupVO dbAttachFileGroup = attachFileGroupService.getByAttachFileGroupId(attachFileGroupId); + if (!Objects.equals(dbAttachFileGroup.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + attachFileGroupService.deleteById(attachFileGroupId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/NotifyTemplateRemindController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/NotifyTemplateRemindController.java new file mode 100644 index 0000000..235a5ef --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/admin/NotifyTemplateRemindController.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.admin; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.biz.dto.NotifyTemplateRemindDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplateRemind; +import com.tmerclub.cloud.biz.service.NotifyTemplateRemindService; +import com.tmerclub.cloud.biz.vo.NotifyTemplateRemindVO; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 消息提醒设置 + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +@RestController("adminNotifyTemplateRemindController") +@RequestMapping("/mp/notify_template_remind") +@Tag(name = "商家端和供应商端消息提醒设置") +public class NotifyTemplateRemindController { + + @Autowired + private NotifyTemplateRemindService notifyTemplateRemindService; + + + @GetMapping("/page") + @Operation(summary = "获取消息提醒设置列表", description = "分页获取消息提醒设置列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + NotifyTemplateRemindDTO notifyTemplateRemindDTO = new NotifyTemplateRemindDTO(); + notifyTemplateRemindDTO.setSysType(AuthUserContext.get().getSysType()); + notifyTemplateRemindDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO notifyTemplateRemindPage = notifyTemplateRemindService.page(pageDTO, notifyTemplateRemindDTO); + + //没有消息提醒设置记录,默认开启提醒 + if (CollectionUtil.isNotEmpty(notifyTemplateRemindPage.getList())) { + notifyTemplateRemindPage.getList().forEach(notifyTemplateRemindVO -> { + if (Objects.isNull(notifyTemplateRemindVO.getNotifyTemplateRemindId())) { + notifyTemplateRemindVO.setIsRemind(1); + } + notifyTemplateRemindVO.setMenu(Objects.requireNonNull(SendTypeEnum.instance(notifyTemplateRemindVO.getSendType())).getMenu()); + notifyTemplateRemindVO.setNodeName(Objects.requireNonNull(SendTypeEnum.instance(notifyTemplateRemindVO.getSendType())).getNodeName()); + }); + } + return ServerResponseEntity.success(notifyTemplateRemindPage); + } + + @GetMapping + @Operation(summary = "获取消息提醒设置", description = "根据notifyTemplateRemindId获取消息提醒设置") + public ServerResponseEntity getByNotifyTemplateRemindId(@RequestParam Long notifyTemplateRemindId) { + return ServerResponseEntity.success(notifyTemplateRemindService.getByNotifyTemplateRemindId(notifyTemplateRemindId)); + } + + @PostMapping + @Operation(summary = "保存消息提醒设置", description = "保存消息提醒设置") + public ServerResponseEntity save(@Valid @RequestBody NotifyTemplateRemindDTO notifyTemplateRemindDTO) { + NotifyTemplateRemind notifyTemplateRemind = BeanUtil.map(notifyTemplateRemindDTO, NotifyTemplateRemind.class); + notifyTemplateRemind.setNotifyTemplateRemindId(null); + notifyTemplateRemindService.save(notifyTemplateRemind); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新消息提醒设置", description = "更新消息提醒设置") + public ServerResponseEntity update(@Valid @RequestBody NotifyTemplateRemindDTO notifyTemplateRemindDTO) { + NotifyTemplateRemind notifyTemplateRemind = BeanUtil.map(notifyTemplateRemindDTO, NotifyTemplateRemind.class); + notifyTemplateRemind.setShopId(AuthUserContext.get().getTenantId()); + notifyTemplateRemind.setSysType(AuthUserContext.get().getSysType()); + //提醒设置记录为空,则保存记录 + if (Objects.isNull(notifyTemplateRemindDTO.getNotifyTemplateRemindId())) { + notifyTemplateRemindService.save(notifyTemplateRemind); + } else { + notifyTemplateRemindService.update(notifyTemplateRemind); + } + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除消息提醒设置", description = "根据消息提醒设置id删除消息提醒设置") + public ServerResponseEntity delete(@RequestParam Long notifyTemplateRemindId) { + notifyTemplateRemindService.deleteById(notifyTemplateRemindId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/NotifyLogController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/NotifyLogController.java new file mode 100644 index 0000000..467f118 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/NotifyLogController.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.app; + +import com.alibaba.nacos.common.utils.CollectionUtils; +import com.tmerclub.cloud.api.im.feign.ImFeignClient; +import com.tmerclub.cloud.biz.service.NotifyLogService; +import com.tmerclub.cloud.biz.vo.NotifyLogVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +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.ArrayList; +import java.util.List; +import java.util.Objects; + + +/** + * @author lhd + * @date 2020-05-12 08:21:24 + */ +@RestController("appNotifyLogController") +@RequestMapping("/notify_log") +@Tag(name = "消息通知") +public class NotifyLogController { + + @Autowired + private NotifyLogService notifyLogService; + @DubboReference + private ImFeignClient imFeignClient; + + /** + * 查询用户未读消息数量 + */ + @GetMapping("/unread_count") + @Operation(summary = "查询用户未读消息数量", description = "查询用户未读消息数量") + public ServerResponseEntity getNotifyCount() { + Long userId = AuthUserContext.get().getUserId(); + int count = notifyLogService.countUnreadBySendTypeAndRemindType(userId, Constant.MSG_TYPE); + // 添加未读客服消息数量 + Integer size = imFeignClient.getImUserUnreadNum(userId).getData(); + return ServerResponseEntity.success(count + size); + } + + + /** + * 查询未读消息列表 + */ + @GetMapping("/unread_count_list") + @Operation(summary = "查询消息列表", description = "查询消息列表") + @Parameter(name = "status", description = "状态 0未读 1已读 不传查询全部按照已读未读排序") + public ServerResponseEntity> getUnReadCountList(@Valid PageDTO page, Integer status) { + Long userId = AuthUserContext.get().getUserId(); + PageVO notifyLogPageVO = notifyLogService.pageBySendTypeAndRemindType(page, userId, Constant.MSG_TYPE, status); + List records = notifyLogPageVO.getList(); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (NotifyLogVO record : records) { + if (!Objects.equals(StatusEnum.DISABLE.value(), record.getStatus())) { + continue; + } + NotifyLogVO notifyLogVO = new NotifyLogVO(); + notifyLogVO.setLogId(record.getLogId()); + notifyLogVO.setStatus(StatusEnum.ENABLE.value()); + updateList.add(notifyLogVO); + } + if (CollectionUtils.isNotEmpty(updateList)) { + notifyLogService.updateBatchById(updateList); + } + return ServerResponseEntity.success(notifyLogPageVO); + } + + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/SmsController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/SmsController.java new file mode 100644 index 0000000..48d36de --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/app/SmsController.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.app; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import com.google.common.collect.Maps; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.biz.dto.SendAndCheckSmsDTO; +import com.tmerclub.cloud.biz.service.SmsLogService; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/01/16 + */ +@RequestMapping("/ua/sms/verification_code") +@RestController +@Tag(name = "短信接口") +public class SmsController { + + @Autowired + private SmsLogService smsLogService; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private AccountFeignClient accountFeignClient; + + public static final String CHECK_REGISTER_SMS_FLAG = "checkRegisterSmsFlag"; + public static final String CHECK_UPDATE_SMS_FLAG = "checkUpdatePwdSmsFlag"; + public static final String UPDATE_PWD_SMS_FLAG = "updatePwdSmsFlag"; + + @PutMapping("/register") + @Operation(summary = "发送注册验证码", description = "发送注册验证码") + public ServerResponseEntity register(@Valid @RequestBody SendAndCheckSmsDTO sendAndCheckSmsDto) { + if (accountFeignClient.countByMobile(sendAndCheckSmsDto.getMobile()).getData() > 0) { + // 该手机号已注册,无法重新注册 + return ServerResponseEntity.showFailMsg("该手机号已注册,无法重新注册"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.REGISTER, sendAndCheckSmsDto.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + @PutMapping("/check_register") + @Operation(summary = "校验验证码", description = "校验验证码返回校验成功的标识") + public ServerResponseEntity checkRegisterSms(@Valid @RequestBody SendAndCheckSmsDTO sendAndCheckSmsDto) { + // 每个ip每分钟只能发十个注册的验证码,免得接口被利用 + if (!smsLogService.checkValidCode(sendAndCheckSmsDto.getMobile(), sendAndCheckSmsDto.getValidCode(), SendTypeEnum.REGISTER)) { + // 验证码有误或已过期 + return ServerResponseEntity.fail(ResponseEnum.VERIFICATION_CODE_ERROR); + } + String checkRegisterSmsFlag = IdUtil.simpleUUID(); + RedisUtil.set(CHECK_REGISTER_SMS_FLAG + checkRegisterSmsFlag, sendAndCheckSmsDto.getMobile(), 600); + return ServerResponseEntity.success(checkRegisterSmsFlag); + } + + @PutMapping("/apply_shop") + @Operation(summary = "发送申请开店验证码", description = "发送申请开店验证码") + public ServerResponseEntity applyShopSms(@Valid @RequestBody SendAndCheckSmsDTO sendSmsParam) { + if (accountFeignClient.countByMobileAndSysType(sendSmsParam.getMobile(), SysTypeEnum.MULTISHOP.value()).getData() > 0) { + return ServerResponseEntity.showFailMsg("手机号已存在,请更换手机号再次尝试"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.VALID, sendSmsParam.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + @PutMapping("/apply_supplier") + @Operation(summary = "发送申请开店验证码", description = "发送申请开店验证码") + public ServerResponseEntity applySupplierSms(@Valid @RequestBody SendAndCheckSmsDTO sendSmsParam) { + if (accountFeignClient.countByMobileAndSysType(sendSmsParam.getMobile(), SysTypeEnum.SUPPLIER.value()).getData() > 0) { + return ServerResponseEntity.showFailMsg("手机号已存在,请更换手机号再次尝试"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.VALID, sendSmsParam.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + /** + * 发送修改密码验证码接口 + */ + @PutMapping("/update_pwd") + @Operation(summary = "发送修改密码验证码接口", description = "发送修改密码验证码接口") + public ServerResponseEntity sendUpdatePwdCode(@RequestBody SendAndCheckSmsDTO sendSmsParam) { + + List userList = userFeignClient.countUserByMobile(sendSmsParam.getMobile()).getData(); + if (CollUtil.isEmpty(userList)){ + throw new LuckException("该手机号码未注册"); + }else if(Objects.equals(userList.get(0).getStatus(), 0)){ + throw new LuckException("该手机号码已被禁用"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.UPDATE_PASSWORD, sendSmsParam.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + @PutMapping("/check_update_pwd") + @Operation(summary = "校验用户忘记密码时的验证码", description = "校验验证码返回校验成功的标识") + public ServerResponseEntity checkUpdatePwdSms(@Valid @RequestBody SendAndCheckSmsDTO sendAndCheckSmsDto) { + // 每个ip每分钟只能发十个注册的验证码,免得接口被利用 + String checkUpdatePwdSmsFlag = IdUtil.simpleUUID(); + if (!smsLogService.checkValidCode(sendAndCheckSmsDto.getMobile(), sendAndCheckSmsDto.getValidCode(), SendTypeEnum.UPDATE_PASSWORD)) { + // 验证码有误或已过期 + return ServerResponseEntity.fail(ResponseEnum.VERIFICATION_CODE_ERROR); + } + RedisUtil.set(CHECK_UPDATE_SMS_FLAG + checkUpdatePwdSmsFlag, sendAndCheckSmsDto.getMobile(), 600); + return ServerResponseEntity.success(checkUpdatePwdSmsFlag); + } + + @PutMapping("/checkUpdatePhoneSms") + @Operation(summary = "校验用户手机号修改时的验证码", description = "校验用户手机号修改时的验证码") + public ServerResponseEntity checkUpdatePhoneSms(@RequestBody SendAndCheckSmsDTO sendAndCheckSmsDTO) { + + if (!smsLogService.checkValidCode(sendAndCheckSmsDTO.getMobile(), sendAndCheckSmsDTO.getValidCode(), SendTypeEnum.VALID)) { + // 验证码有误或已过期 + throw new LuckException("验证码有误或已过期"); + } + String checkRegisterSmsFlag = IdUtil.simpleUUID(); + RedisUtil.set(UPDATE_PWD_SMS_FLAG + checkRegisterSmsFlag, sendAndCheckSmsDTO.getMobile(), 600); + return ServerResponseEntity.success(checkRegisterSmsFlag); + } + + /** + * 修改用户手机号时发送验证码 + */ + @PutMapping("/valid") + @Operation(summary = "发送验证码接口", description = "发送验证码接口") + public ServerResponseEntity validSms(@RequestBody SendAndCheckSmsDTO sendSmsParam) { + if (accountFeignClient.countByMobileAndSysType(sendSmsParam.getMobile(), SysTypeEnum.ORDINARY.value()).getData() > 0) { + return ServerResponseEntity.showFailMsg("手机号已存在,请更换手机号后再次尝试"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.VALID, sendSmsParam.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + @PutMapping("/login_code") + @Operation(summary = "发送手机号登录验证码接口") + public ServerResponseEntity sendLoginCode(@RequestBody SendAndCheckSmsDTO sendSmsParam) { + ServerResponseEntity> listServerResponseEntity = accountFeignClient.listByUserAccount(null, sendSmsParam.getMobile(), null, SysTypeEnum.ORDINARY); + if(!listServerResponseEntity.isSuccess()){ + throw new LuckException(listServerResponseEntity.getMsg()); + } + List accountList = listServerResponseEntity.getData(); + if(CollUtil.isNotEmpty(accountList) && Objects.equals(accountList.get(0).getStatus(), StatusEnum.DISABLE.value())){ + // 用户已禁用,请联系客服 + return ServerResponseEntity.showFailMsg("用户已禁用,请联系客服"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.LOGIN, sendSmsParam.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/AttachFileController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/AttachFileController.java new file mode 100644 index 0000000..5490eae --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/AttachFileController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.platform; + +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/6/1 15:45 + */ +@RestController("platformAttachFileController") +@RequestMapping("/p/attach_file") +@Tag(name = "platform-上传文件记录表") +public class AttachFileController { + + @Autowired + private AttachFileService attachFileService; + + @DeleteMapping("/delete_by_ids") + @Operation(summary = "根据文件id列表批量删除文件记录", description = "根据文件id列表批量删除文件记录") + public ServerResponseEntity deleteByIds(@RequestBody List ids) { + Long shopId = Constant.PLATFORM_SHOP_ID; + attachFileService.deleteByIdsAndShopId(ids, shopId); + return ServerResponseEntity.success(); + } + + @PutMapping("/batch_move") + @Operation(summary = "根据文件id列表与分组id批量移动文件", description = "根据文件id列表与分组id批量移动文件") + public ServerResponseEntity batchMove(@RequestBody List ids, @RequestParam(value = "groupId", required = false, defaultValue = "") Long groupId) { + Long shopId = Constant.PLATFORM_SHOP_ID; + Integer sysType = AuthUserContext.get().getSysType(); + attachFileService.batchMoveByShopIdAndIdsAndGroupId(shopId, ids, groupId, sysType); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyTemplateController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyTemplateController.java new file mode 100644 index 0000000..b97ff1d --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyTemplateController.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.biz.constant.NotifyType; +import com.tmerclub.cloud.biz.dto.NotifyTemplateDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplate; +import com.tmerclub.cloud.biz.service.NotifyTemplateService; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author lhd + * @date 2021-05-14 09:35:32 + */ +@RestController("platformNotifyTemplateController") +@RequestMapping("/p/notify_template") +@Tag(name = "platform-消息通知配置") +public class NotifyTemplateController { + + @Autowired + private NotifyTemplateService notifyTemplateService; + + + @GetMapping("/page") + @Operation(summary = "获取列表", description = "分页获取列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, NotifyTemplateDTO notifyTemplateDTO) { + + PageVO templatePage = notifyTemplateService.page(pageDTO, notifyTemplateDTO); + if (CollectionUtils.isEmpty(templatePage.getList())) { + return ServerResponseEntity.success(); + } + for (NotifyTemplateVO template : templatePage.getList()) { + List templateList = getTemplateList(template.getNotifyTypes()); + template.setSms(false); + template.setApp(false); + template.setSub(false); + for (Integer type : templateList) { + template.setSms(Objects.equals(type, NotifyType.SMS.value()) || template.getSms()); + template.setApp(Objects.equals(type, NotifyType.APP.value()) || template.getApp()); + template.setSub(Objects.equals(type, NotifyType.MP.value()) || template.getSub()); + } + template.setTemplateTypeList(templateList); + } + return ServerResponseEntity.success(templatePage); + } + + @GetMapping + @Operation(summary = "获取", description = "根据templateId获取") + public ServerResponseEntity getByTemplateId(@RequestParam Long templateId) { + NotifyTemplateVO templateVO = notifyTemplateService.getByTemplateId(templateId); + templateVO.setTemplateTypeList(getTemplateList(templateVO.getNotifyTypes())); + return ServerResponseEntity.success(templateVO); + } + + @PutMapping + @Operation(summary = "更新", description = "更新") + public ServerResponseEntity update(@Valid @RequestBody NotifyTemplateDTO notifyTemplateDTO) { + int count = notifyTemplateService.countBySendType(notifyTemplateDTO.getSendType(), notifyTemplateDTO.getTemplateId()); + if (count > 0) { + // 已经存在当前消息类型的短信,请去进行修改操作 + throw new LuckException("已经存在当前消息类型的短信,请去进行修改操作"); + } + if (CollUtil.isNotEmpty(notifyTemplateDTO.getTemplateTypeList())) { + notifyTemplateDTO.setNotifyTypes(arrayChangeList(notifyTemplateDTO.getTemplateTypeList())); + } + NotifyTemplate notifyTemplate = BeanUtil.map(notifyTemplateDTO, NotifyTemplate.class); + NotifyTemplateVO byTemplateId = notifyTemplateService.getByTemplateId(notifyTemplate.getTemplateId()); + notifyTemplate.setMsgType(byTemplateId.getMsgType()); + notifyTemplate.setSendType(byTemplateId.getSendType()); + notifyTemplateService.update(notifyTemplate); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除", description = "根据id删除") + public ServerResponseEntity delete(@RequestParam Long templateId) { + notifyTemplateService.deleteById(templateId); + return ServerResponseEntity.success(); + } + + /** + * 通过id状态变更 + * + * @param templateId id + * @return 是否修改成功 + */ + @DeleteMapping("/{templateId}") + public ServerResponseEntity removeById(@PathVariable Long templateId) { + NotifyTemplateVO templateVO = notifyTemplateService.getByTemplateId(templateId); + templateVO.setStatus(templateVO.getStatus() == 1 ? 0 : 1); + NotifyTemplate notifyTemplate = BeanUtil.map(templateVO, NotifyTemplate.class); + notifyTemplateService.update(notifyTemplate); + return ServerResponseEntity.success(); + } + + private List getTemplateList(String templateTypes) { + String[] templateTypeList = templateTypes.split(StrUtil.COMMA); + List templates = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (String templateStr : templateTypeList) { + if (StrUtil.isBlank(templateStr)) { + continue; + } + templates.add(Integer.valueOf(templateStr)); + } + return templates; + } + + private String arrayChangeList(List templateTypeList) { + StringBuilder templateTypes = new StringBuilder(Constant.INITIAL_CAPACITY); + for (Integer templateType : templateTypeList) { + templateTypes.append(templateType); + templateTypes.append(StrUtil.COMMA); + } + templateTypes.deleteCharAt(templateTypes.length() - 1); + return templateTypes.toString(); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyTemplateTagController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyTemplateTagController.java new file mode 100644 index 0000000..3408a1b --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/platform/NotifyTemplateTagController.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.biz.constant.NotifyType; +import com.tmerclub.cloud.biz.dto.NotifyTemplateDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplate; +import com.tmerclub.cloud.biz.service.NotifyTemplateService; +import com.tmerclub.cloud.biz.service.NotifyTemplateTagService; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @author cl + * @date 2021-05-20 11:09:53 + */ +@RestController("platformNotifyTemplateTagController") +@RequestMapping("/p/notify_template_tag") +@Tag(name = "platform-标签消息") +public class NotifyTemplateTagController { + + @Autowired + private NotifyTemplateTagService notifyTemplateTagService; + @Autowired + private NotifyTemplateService notifyTemplateService; + + + @GetMapping("/page") + @Operation(summary = "获取列表", description = "分页获取列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO notifyTemplateTagPage = notifyTemplateTagService.pageTagNotify(pageDTO); + return ServerResponseEntity.success(notifyTemplateTagPage); + } + + @GetMapping("/info") + @Operation(summary = "获取", description = "根据templateId获取") + public ServerResponseEntity getByTemplateId(@RequestParam Long templateId) { + return ServerResponseEntity.success(notifyTemplateTagService.getByTemplateId(templateId)); + } + + @PostMapping + @Operation(summary = "保存", description = "保存") + public ServerResponseEntity save(@Valid @RequestBody NotifyTemplateDTO notifyTemplateDTO) { + List tagIds = notifyTemplateDTO.getTagIds(); + if (CollUtil.isEmpty(tagIds)) { + throw new LuckException("请至少选择一个标签!"); + } + NotifyTemplate notifyTemplate = BeanUtil.map(notifyTemplateDTO, NotifyTemplate.class); + notifyTemplate.setTemplateId(null); + notifyTemplate.setStatus(1); + notifyTemplate.setSendType(SendTypeEnum.CUSTOMIZE.getValue()); + notifyTemplate.setNotifyTypes(NotifyType.APP.value().toString()); + notifyTemplateTagService.saveTagNotify(notifyTemplate, tagIds); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新", description = "更新") + public ServerResponseEntity update(@Valid @RequestBody NotifyTemplateDTO notifyTemplateDTO) { + if (!Objects.equals(SendTypeEnum.CUSTOMIZE.getValue(), notifyTemplateDTO.getSendType())) { + throw new LuckException("非自定义类型的消息模板不可以使用此接口更新"); + } + notifyTemplateTagService.updateTemplateAndTag(notifyTemplateDTO); + return ServerResponseEntity.success(); + } + + + @DeleteMapping + @Operation(summary = "删除", description = "根据id删除") + public ServerResponseEntity delete(@RequestParam Long templateId) { + NotifyTemplateVO notifyTemplateVO = notifyTemplateService.getByTemplateId(templateId); + if (!Objects.equals(SendTypeEnum.CUSTOMIZE.getValue(), notifyTemplateVO.getSendType())) { + throw new LuckException("非自定义类型的消息模板不可以使用此接口更新"); + } + notifyTemplateTagService.deleteTemplateTagByTempLateId(templateId); + return ServerResponseEntity.success(); + } + + + @PutMapping("/send_msg") + @Operation(summary = "给标签用户推送模板的站内消息消息", description = "给标签用户推送模板的站内消息") + public ServerResponseEntity sendMsg(@RequestParam Long templateId) { + notifyTemplateTagService.sendMsg(templateId); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/supplier/SmsController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/supplier/SmsController.java new file mode 100644 index 0000000..428d483 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/controller/supplier/SmsController.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.controller.supplier; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Maps; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierUserFeignClient; +import com.tmerclub.cloud.biz.dto.SendAndCheckSmsDTO; +import com.tmerclub.cloud.biz.service.SmsLogService; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/6/10 14:34 + */ +@RestController("supplierSmsController") +@RequestMapping("/s/sms") +@Tag(name = "supplier-短信接口") +public class SmsController { + + @Autowired + private SmsLogService smsLogService; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private SupplierUserFeignClient supplierUserFeignClient; + public static final String CHECK_UPDATE_SMS_FLAG = "checkUpdatePwdSmsFlag"; + public static final String UPDATE_PWD_SMS_FLAG = "updatePwdSmsFlag"; + + + @PutMapping("/send_withdraw_code") + @Operation(summary = "给供应商手机号发送申请提现验证码", description = "给供应商手机号发送申请提现验证码,返回供应商手机号") + public ServerResponseEntity applyShopSms() { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity supplierInfoRes = accountFeignClient.getAccountInfoByTenantId(shopId, sysType); + if (!supplierInfoRes.isSuccess()) { + throw new LuckException("服务器繁忙"); + } + smsLogService.sendSmsCode(SendTypeEnum.VALID, supplierInfoRes.getData().getPhone(), Maps.newHashMap()); + return ServerResponseEntity.success(supplierInfoRes.getData().getPhone()); + } + + @PutMapping("/send_auth_shop_user_code") + @Operation(summary = "发送认证店铺员工/子账号验证码", description = "发送认证店铺员工/子账号验证码") + public ServerResponseEntity sendAuthShopUserSms(@RequestBody SendAndCheckSmsDTO sendAndCheckSmsDTO) { + String phone = sendAndCheckSmsDTO.getMobile(); + if (StrUtil.isBlank(phone) || !PrincipalUtil.isMobile(phone)) { + throw new LuckException("手机号格式不正确"); + } + smsLogService.sendSmsCode(SendTypeEnum.VALID, phone, Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + /** + * 发送忘记密码验证码接口 + */ + @PostMapping("/ua/update_pwd") + @Operation(summary = "发送忘记密码验证码接口", description = "发送忘记密码验证码接口") + public ServerResponseEntity sendUpdatePwdCode(@RequestBody SendAndCheckSmsDTO sendSmsParam) { + if (Objects.equals(supplierUserFeignClient.countAccoutByMobile(sendSmsParam.getMobile()).getData(), 0)) { + throw new LuckException("该手机号码未注册"); + } + // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用 + smsLogService.sendSmsCode(SendTypeEnum.UPDATE_PASSWORD, sendSmsParam.getMobile(), Maps.newHashMap()); + return ServerResponseEntity.success(); + } + + @PutMapping("/ua/check_update_pwd") + @Operation(summary = "校验用户忘记密码时的验证码", description = "校验验证码返回校验成功的标识") + public ServerResponseEntity checkUpdatePwdSms(@Valid @RequestBody SendAndCheckSmsDTO sendAndCheckSmsDto) { + // 每个ip每分钟只能发十个注册的验证码,免得接口被利用 + if (!smsLogService.checkValidCode(sendAndCheckSmsDto.getMobile(), sendAndCheckSmsDto.getValidCode(), SendTypeEnum.UPDATE_PASSWORD)) { + // 验证码有误或已过期 + return ServerResponseEntity.fail(ResponseEnum.VERIFICATION_CODE_ERROR); + } + String checkUpdatePwdSmsFlag = IdUtil.simpleUUID(); + RedisUtil.set(CHECK_UPDATE_SMS_FLAG + checkUpdatePwdSmsFlag, sendAndCheckSmsDto.getMobile(), 600); + return ServerResponseEntity.success(checkUpdatePwdSmsFlag); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/AttachFileGroupDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/AttachFileGroupDTO.java new file mode 100644 index 0000000..21d68b3 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/AttachFileGroupDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * DTO + * + * @author YXF + * @date 2020-12-04 16:15:02 + */ +public class AttachFileGroupDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long attachFileGroupId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "分组名称") + private String name; + + @Schema(description = "1:图片 2:视频 3:文件") + private Integer type; + + public Long getAttachFileGroupId() { + return attachFileGroupId; + } + + public void setAttachFileGroupId(Long attachFileGroupId) { + this.attachFileGroupId = attachFileGroupId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "AttachFileGroupDTO{" + + "attachFileGroupId=" + attachFileGroupId + + ",shopId=" + shopId + + ",name=" + name + + ",type=" + type + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateRemindDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateRemindDTO.java new file mode 100644 index 0000000..c3cf6a9 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/NotifyTemplateRemindDTO.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 消息提醒设置DTO + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +public class NotifyTemplateRemindDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "消息提醒设置") + private Long notifyTemplateRemindId; + + @Schema(description = "消息模板id") + private Long templateId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "是否开启提醒 1开启 0关闭") + private Integer isRemind; + + /** + * 系统类型(1.店铺 2.平台端 3.供应商) + */ + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + + public Long getNotifyTemplateRemindId() { + return notifyTemplateRemindId; + } + + public void setNotifyTemplateRemindId(Long notifyTemplateRemindId) { + this.notifyTemplateRemindId = notifyTemplateRemindId; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsRemind() { + return isRemind; + } + + public void setIsRemind(Integer isRemind) { + this.isRemind = isRemind; + } + + @Override + public String toString() { + return "NotifyTemplateRemindDTO{" + + "notifyTemplateRemindId=" + notifyTemplateRemindId + + ", templateId=" + templateId + + ", shopId=" + shopId + + ", isRemind=" + isRemind + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/SendAndCheckSmsDTO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/SendAndCheckSmsDTO.java new file mode 100644 index 0000000..be8398f --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/dto/SendAndCheckSmsDTO.java @@ -0,0 +1,59 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.dto; + +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/30 + */ +public class SendAndCheckSmsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "手机号") + @Pattern(regexp = PrincipalUtil.MOBILE_REGEXP, message = "请输入正确的手机号") + @NotBlank(message = "手机号不能为空") + private String mobile; + + @Schema(description = "验证码") + private String validCode; + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "SendAndCheckSmsDTO{" + + "mobile='" + mobile + '\'' + + ", validCode='" + validCode + '\'' + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/feign/AttachFileFeignController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/feign/AttachFileFeignController.java new file mode 100644 index 0000000..2c570a4 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/feign/AttachFileFeignController.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.feign; + +import com.tmerclub.cloud.api.biz.feign.AttachFileFeignClient; +import com.tmerclub.cloud.biz.service.AttachFileGroupService; +import com.tmerclub.cloud.biz.service.AttachFileService; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Author lth + * @Date 2021/7/23 10:30 + */ +@DubboService +public class AttachFileFeignController implements AttachFileFeignClient { + + @Autowired + private AttachFileService attachFileService; + @Autowired + private AttachFileGroupService attachFileGroupService; + + @Override + public ServerResponseEntity updateShopIdByUid(Long shopId) { + attachFileService.updateShopIdByUid(shopId, AuthUserContext.getAccountUid()); + attachFileGroupService.updateShopIdByUid(shopId, AuthUserContext.getAccountUid()); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getfileTypeByfilePath(String filePath) { + return ServerResponseEntity.success(attachFileService.getfileTypeByfilePath(filePath)); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/feign/NotifyFeignController.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/feign/NotifyFeignController.java new file mode 100644 index 0000000..86c44aa --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/feign/NotifyFeignController.java @@ -0,0 +1,68 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.feign; + +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.biz.controller.app.SmsController; +import com.tmerclub.cloud.biz.service.NotifyLogService; +import com.tmerclub.cloud.biz.service.NotifyTemplateTagService; +import com.tmerclub.cloud.biz.service.SmsLogService; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Objects; + + +/** + * @author lhd + * @date 2020/12/30 + */ +@DubboService +public class NotifyFeignController implements NotifyFeignClient { + + @Autowired + private SmsLogService smsLogService; + @Autowired + private NotifyLogService notifyLogService; + @Autowired + private NotifyTemplateTagService notifyTemplateTagService; + + @Override + public ServerResponseEntity checkValidCode(String validAccount, String validCode, SendTypeEnum type) { + if (PrincipalUtil.isMobile(validAccount)) { + return ServerResponseEntity.success(smsLogService.checkValidCode(validAccount, validCode, type)); + } + return ServerResponseEntity.success(false); + } + + @Override + public ServerResponseEntity checkValidCodeByFlag(String mobile, String checkRegisterSmsFlag) { + String redisMobile = RedisUtil.get(SmsController.CHECK_REGISTER_SMS_FLAG + checkRegisterSmsFlag); + return ServerResponseEntity.success(Objects.equals(redisMobile, mobile)); + } + + @Override + public ServerResponseEntity getUnreadMsg(Long userId) { + return ServerResponseEntity.success(notifyLogService.countUnreadBySendTypeAndRemindType(userId, Constant.MSG_TYPE)); + } + + @Override + public ServerResponseEntity deleteTagByTagId(Long tagId) { + notifyTemplateTagService.deleteByTagId(tagId); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/OrderGroupBizConsumer.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/OrderGroupBizConsumer.java new file mode 100644 index 0000000..8718f2e --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/OrderGroupBizConsumer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.linstener; + +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.biz.service.SendMessageService; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.dubbo.config.annotation.DubboReference; +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; + +/** + * @author lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_GROUP_NOTIFY_TO_USER_TOPIC, consumerGroup = RocketMqConstant.SEND_GROUP_NOTIFY_TO_USER_TOPIC) +public class OrderGroupBizConsumer implements RocketMQListener { + + @Autowired + private SendMessageService sendMessageService; + @DubboReference + private OrderFeignClient orderFeignClient; + + /** + * 开团成团相关通知(开团成功、拼团成功、拼团失败) + */ + @Override + public void onMessage(SendNotifyBO sendNotifyBO) { + // 获取订单相关信息 + SendNotifyBO sendNotifyDb = orderFeignClient.getOrderDetailInfo(sendNotifyBO.getBizId()).getData(); + sendNotifyDb.setSendType(sendNotifyBO.getSendType()); + sendMessageService.sendOrderNotifyMsgToShop(sendNotifyDb); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendActivityAuditNotifyToShopConsumer.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendActivityAuditNotifyToShopConsumer.java new file mode 100644 index 0000000..55fd032 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendActivityAuditNotifyToShopConsumer.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.biz.linstener; + +import com.tmerclub.cloud.biz.service.SendMessageService; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +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; +/** + * @author lanhai + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC, consumerGroup = RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC) +public class SendActivityAuditNotifyToShopConsumer implements RocketMQListener { + @Autowired + private SendMessageService sendMessageService; + + /** + * 营销活动审核消息推送给商家 + * + * @param sendNotifyBO + */ + @Override + public void onMessage(SendNotifyBO sendNotifyBO) { + sendMessageService.sendActivityNotifyMsgToShop(sendNotifyBO); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendActivityOfflineNotifyToShopConsumer.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendActivityOfflineNotifyToShopConsumer.java new file mode 100644 index 0000000..ba3444f --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendActivityOfflineNotifyToShopConsumer.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.biz.linstener; + +import com.tmerclub.cloud.biz.service.SendMessageService; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +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; +/** + * @author lanhai + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC, consumerGroup = RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC) +public class SendActivityOfflineNotifyToShopConsumer implements RocketMQListener { + @Autowired + private SendMessageService sendMessageService; + + /** + * 营销活动下线消息推送给商家 + * + * @param sendNotifyBO + */ + @Override + public void onMessage(SendNotifyBO sendNotifyBO) { + sendMessageService.sendActivityNotifyMsgToShop(sendNotifyBO); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendNotifyToShopConsumer.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendNotifyToShopConsumer.java new file mode 100644 index 0000000..610a69d --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendNotifyToShopConsumer.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.linstener; + +import com.tmerclub.cloud.biz.service.SendMessageService; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +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; + +/** + * @author lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, consumerGroup = RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC) +public class SendNotifyToShopConsumer implements RocketMQListener { + + @Autowired + private SendMessageService sendMessageService; + + /** + * 发送店铺消息(订单确认收货、买家发起退款、买家已退货) + */ + @Override + public void onMessage(SendNotifyBO sendNotifyBO) { + sendMessageService.sendOrderNotifyMsgToShop(sendNotifyBO); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendNotifyToUserConsumer.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendNotifyToUserConsumer.java new file mode 100644 index 0000000..1e801c9 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendNotifyToUserConsumer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.linstener; + +import com.tmerclub.cloud.biz.service.SendMessageService; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +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 lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, consumerGroup = RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC) +public class SendNotifyToUserConsumer implements RocketMQListener> { + + @Autowired + private SendMessageService sendMessageService; + + /** + * 订单事件推送消息给用户 + */ + @Override + public void onMessage(List notifyList) { + sendMessageService.sendOrderNotifyMsgToUser(notifyList); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendProductNotifyToShopConsumer.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendProductNotifyToShopConsumer.java new file mode 100644 index 0000000..04472e8 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/linstener/SendProductNotifyToShopConsumer.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.biz.linstener; + +import com.tmerclub.cloud.biz.service.SendMessageService; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +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 lanhai + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SEND_PRODUCT_NOTIFY_TO_SHOP_TOPIC, consumerGroup = RocketMqConstant.SEND_PRODUCT_NOTIFY_TO_SHOP_TOPIC) +public class SendProductNotifyToShopConsumer implements RocketMQListener> { + @Autowired + private SendMessageService sendMessageService; + + /** + * 商品事件推送信息给店铺 + * + * @param notifyList + */ + @Override + public void onMessage(List notifyList) { + sendMessageService.sendProductNotifyMsgToShop(notifyList); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/AttachFileGroupMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/AttachFileGroupMapper.java new file mode 100644 index 0000000..38476b2 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/AttachFileGroupMapper.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import com.tmerclub.cloud.biz.model.AttachFileGroup; +import com.tmerclub.cloud.biz.vo.AttachFileGroupVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author YXF + * @date 2020-12-04 16:15:02 + */ +public interface AttachFileGroupMapper { + + /** + * 获取列表 + * @param shopId + * @param sysType + * @param uid + * @param type + * @return + */ + List list(@Param("shopId") Long shopId, @Param("sysType") Integer sysType, @Param("uid") Long uid, @Param("type") Integer type); + + /** + * 根据id获取 + * + * @param attachFileGroupId id + * @return + */ + AttachFileGroupVO getByAttachFileGroupId(@Param("attachFileGroupId") Long attachFileGroupId); + + /** + * 保存 + * + * @param attachFileGroup + */ + void save(@Param("attachFileGroup") AttachFileGroup attachFileGroup); + + /** + * 更新 + * + * @param attachFileGroup + */ + void update(@Param("attachFileGroup") AttachFileGroup attachFileGroup); + + /** + * 根据id删除 + * + * @param attachFileGroupId + */ + void deleteById(@Param("attachFileGroupId") Long attachFileGroupId); + + /** + * 根据uid更新店铺id + * @param shopId + * @param uid + */ + void updateShopIdByUid(@Param("shopId") Long shopId, @Param("uid") Long uid); + + /** + * 根据分组名称,店铺id查询数量 + * @param name + * @param shopId + * @param sysType + * @param type + * @param attachFileGroupId + * @return + */ + int countByNameAndShopId(@Param("name") String name, @Param("shopId") Long shopId, @Param("sysType") Integer sysType, @Param("type") Integer type, @Param("attachFileGroupId") Long attachFileGroupId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyLogMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyLogMapper.java new file mode 100644 index 0000000..726da58 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyLogMapper.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import com.tmerclub.cloud.biz.dto.NotifyLogDTO; +import com.tmerclub.cloud.biz.model.NotifyLog; +import com.tmerclub.cloud.biz.vo.NotifyLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public interface NotifyLogMapper { + + /** + * 更新 + * @param notifyLogList + */ + void updateBatchById(@Param("notifyLogList") List notifyLogList); + + /** + * 查询用户消息列表 + * @param userId 用户id + * @param msgType 消息类型 + * @param status 消息已读状态 1.已读 0.未读 + * @return 消息列表 + */ + List listBySendTypeAndRemindType(@Param("userId") Long userId, @Param("msgType") Integer msgType, @Param("status") Integer status); + + /** + * 批量保存 + * @param notifyLogs 日志信息 + */ + void saveBatch(@Param("notifyLogs") List notifyLogs); + + /** + * 根据条件获取已发送消息数量 + * @param orderId 关联订单id + * @param level 等级 + * @param userId 用户id + * @param sendType 发送类型 + * @return 已发送消息数量 + */ + int countNotifyByConditions(@Param("orderId") Long orderId, @Param("level") Integer level, @Param("userId") Long userId, @Param("sendType") Integer sendType); + + /** + * 根据条件获取日志列表 + * @param notifyLogDTO 搜索参数 + * @return 日志列表 + */ + List list(@Param("notifyLog") NotifyLogDTO notifyLogDTO); + + + /** + * 根据id标记消息为已读状态 + * @param logId + */ + void updateStatus(@Param("logId") Long logId); + + /** + * 根据id获取消息详情 + * @param logId + * @return + */ + NotifyLogVO getByLogId(@Param("logId") Long logId); + + /** + * 消息批量设置成已读状态 + * @param logIds + */ + void isReadByIds(@Param("logIds") List logIds); + + /** + * 全部消息标为已读 + * @param shopId + */ + void isReadByShopId(Long shopId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateMapper.java new file mode 100644 index 0000000..f1b608b --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateMapper.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateDTO; +import com.tmerclub.cloud.biz.model.NotifyTemplate; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.biz.vo.SmsCodeTemplateVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public interface NotifyTemplateMapper { + + /** + * 获取列表 + * + * @param notifyTemplateDTO + * @return + */ + List list(@Param("notifyTemplateDTO") NotifyTemplateDTO notifyTemplateDTO); + + /** + * 根据id获取 + * + * @param templateId id + * @return + */ + NotifyTemplateVO getByTemplateId(@Param("templateId") Long templateId); + + /** + * 保存 + * + * @param notifyTemplate + */ + void save(@Param("notifyTemplate") NotifyTemplate notifyTemplate); + + /** + * 更新 + * + * @param notifyTemplate + */ + void update(@Param("notifyTemplate") NotifyTemplate notifyTemplate); + + /** + * 根据id删除 + * + * @param templateId + */ + void deleteById(@Param("templateId") Long templateId); + + /** + * 根据发送类型和店铺id,获取通知模板及店家发送类型 + * + * @param sendType 发送类型 + * @return 通知模板 + */ + NotifyTemplateVO getBySendType(@Param("sendType") Integer sendType); + + /** + * 获取短信验证码模板信息 + * + * @param sendType 模板类型 + * @return 短信验证码模板信息 + */ + SmsCodeTemplateVO getSmsCodeTemplateBySendType(@Param("sendType") Integer sendType); + + + /** + * 根据发送类型及非当前模板id获取当前消息类型数量 + * + * @param sendType 发送类型 + * @param templateId 模板id + * @return 数量 + */ + Integer countBySendType(@Param("sendType") Integer sendType, @Param("templateId") Long templateId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateShopMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateShopMapper.java new file mode 100644 index 0000000..68c24cb --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateShopMapper.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import com.tmerclub.cloud.biz.model.NotifyTemplateShop; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public interface NotifyTemplateShopMapper { + + /** + * 获取列表 + * + * @return 列表 + */ + List list(); + + /** + * 根据id获取 + * + * @param notifyShopId id + * @return + */ + NotifyTemplateShop getByNotifyShopId(@Param("notifyShopId") Long notifyShopId); + + /** + * 保存 + * + * @param notifyTemplateShop + */ + void save(@Param("notifyTemplateShop") NotifyTemplateShop notifyTemplateShop); + + /** + * 更新 + * + * @param notifyTemplateShop + */ + void update(@Param("notifyTemplateShop") NotifyTemplateShop notifyTemplateShop); + + /** + * 根据id删除 + * + * @param notifyShopId + */ + void deleteById(@Param("notifyShopId") Long notifyShopId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateTagMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateTagMapper.java new file mode 100644 index 0000000..2e37792 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/NotifyTemplateTagMapper.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import com.tmerclub.cloud.biz.model.NotifyTemplateTag; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + * + * @author cl + * @date 2021-05-20 11:09:53 + */ +public interface NotifyTemplateTagMapper { + + /** + * 获取列表 + * @return 列表 + */ + List list(); + + /** + * 根据id获取 + * + * @param notifyTagId id + * @return + */ + NotifyTemplateTag getByNotifyTagId(@Param("notifyTagId") Long notifyTagId); + + /** + * 保存 + * @param notifyTemplateTag + */ + void save(@Param("notifyTemplateTag") NotifyTemplateTag notifyTemplateTag); + + /** + * 更新 + * @param notifyTemplateTag + */ + void update(@Param("notifyTemplateTag") NotifyTemplateTag notifyTemplateTag); + + /** + * 根据id删除 + * @param notifyTagId + */ + void deleteById(@Param("notifyTagId") Long notifyTagId); + + /** + * 获取标签消息模板 + * @param pageAdapter 分页参数 + * @return 消息模板列表 + */ + List pageTagNotify(@Param("page") PageAdapter pageAdapter); + + /** + * 统计消息模板数量 + * 分页方法 pageTagNotify + * @return 数量 + */ + int countTagNotify(); + + /** + * 批量保存标签信息模板 + * @param notifyTemplateTags 消息标签关联列表 + * @return 插入行数 + */ + int saveBatch(@Param("notifyTemplateTags") List notifyTemplateTags); + + /** + * 删除模板下的所有关联标签信息 + * @param templateId 模板id + */ + void deleteTemplateTagByTempLateId(@Param("templateId") Long templateId); + + /** + * 获取标签下的所有标签id + * @param templateId 消息模板id + * @return 标签集合 + */ + List getTagIdsByTemplateId(@Param("templateId") Long templateId); + + /** + * 根据模板id获取模板信息 + * @param templateId 模板id + * @return 模板信息(包含模板下的标签信息) + */ + NotifyTemplateVO getByTemplateId(@Param("templateId") Long templateId); + + /** + * 根据标签id删除模板与标签关联关系 + * @param tagId + */ + void deleteTemplateTagByTagId(@Param("tagId") Long tagId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/SmsLogMapper.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/SmsLogMapper.java new file mode 100644 index 0000000..74c0885 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/mapper/SmsLogMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.mapper; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.biz.model.SmsLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 短信记录表 + * + * @author lhd + * @date 2021-01-04 13:36:52 + */ +public interface SmsLogMapper { + + /** + * 保存短信记录表 + * + * @param smsLog 短信记录表 + */ + void save(@Param("smsLog") SmsLog smsLog); + + /** + * 更新短信记录表 + * + * @param smsLog 短信记录表 + */ + void update(@Param("smsLog") SmsLog smsLog); + + /** + * 根据手机号和发送类型,失效掉对应的验证码 + * + * @param mobile 手机号 + * @param sendType 发送类型 + */ + void invalidSmsByMobileAndType(@Param("mobile") String mobile, @Param("sendType") Integer sendType); + + /** + * 根据用户id和发送类型,查询当天发送的验证码条数 + * + * @param beginOfDay 当天开始时间 + * @param endOfDay 当天结束时间 + * @param mobile 手机号 + * @param type 发送类型 + * @return 发送条数 + */ + List listByMobileAndTypeAndToday(@Param("beginOfDay") DateTime beginOfDay, @Param("endOfDay") DateTime endOfDay, + @Param("mobile") String mobile, @Param("sendType") Integer type); + + /** + * 根据手机号、验证码、发送类型,查询用户有效的验证码 + * + * @param mobile 手机号 + * @param validCode 验证码 + * @param sendType 发送类型 + * @return 验证码信息 + */ + SmsLog getByMobileAndCodeAndType(@Param("mobile") String mobile, @Param("validCode") String validCode, @Param("sendType") Integer sendType); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyLog.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyLog.java new file mode 100644 index 0000000..4b293f3 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyLog.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public class NotifyLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 消息记录表 + */ + private Long logId; + + /** + * 用户昵称or手机号 + */ + private String nickName; + + /** + * 发送手机号 + */ + private String userMobile; + + /** + * 通知的用户id + */ + private String remindId; + + /** + * 通知的订单id + */ + private Long bizId; + + /** + * 选择发送的店铺id + */ + private Long shopId; + /** + * 选择发送的店铺id + */ + private String shopName; + + /** + * 通知类型 1.短信发送 2.公众号订阅消息 3.站内消息 + */ + private Integer remindType; + + /** + * 通知模板 + */ + private Long templateId; + + /** + * 1.订单催付 2.付款成功通知 3.商家同意退款 4.商家拒绝退款 5.核销提醒 6.发货提醒 7.拼团失败提醒 8.拼团成功提醒 9.拼团开团提醒 10.会员升级提醒 101.退款临近超时提醒 102.确认收货提醒 103.买家发起退款提醒 104.买家已退货提醒 + */ + private Integer sendType; + + /** + * 通知内容 + */ + private String message; + + /** + * 是否阅读 1已读 0未读 + */ + private Integer status; + + /** + * 关联的商品id + */ + private Long spuId; + + /** + * 关联的活动id + */ + private Long activityId; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getRemindType() { + return remindType; + } + + public void setRemindType(Integer remindType) { + this.remindType = remindType; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "NotifyLog{" + + "logId=" + logId + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", remindId='" + remindId + '\'' + + ", bizId=" + bizId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", remindType=" + remindType + + ", templateId=" + templateId + + ", sendType=" + sendType + + ", message='" + message + '\'' + + ", status=" + status + + ", spuId=" + spuId + + ", activityId=" + activityId + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateShop.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateShop.java new file mode 100644 index 0000000..e616a51 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateShop.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public class NotifyTemplateShop extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺消息通知关联表 + */ + private Long notifyShopId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 模板id + */ + private Long templateId; + + /** + * 通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息 + */ + private String notifyTypes; + + public Long getNotifyShopId() { + return notifyShopId; + } + + public void setNotifyShopId(Long notifyShopId) { + this.notifyShopId = notifyShopId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public String getNotifyTypes() { + return notifyTypes; + } + + public void setNotifyTypes(String notifyTypes) { + this.notifyTypes = notifyTypes; + } + + @Override + public String toString() { + return "NotifyTemplateShop{" + + "notifyShopId=" + notifyShopId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",templateId=" + templateId + + ",notifyTypes=" + notifyTypes + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateTag.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateTag.java new file mode 100644 index 0000000..7a7d8fd --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/NotifyTemplateTag.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author cl + * @date 2021-05-20 11:09:53 + */ +public class NotifyTemplateTag extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 标签消息通知关联表 + */ + private Long notifyTagId; + + /** + * 标签id + */ + private Long userTagId; + + /** + * 模板id + */ + private Long templateId; + + public Long getNotifyTagId() { + return notifyTagId; + } + + public void setNotifyTagId(Long notifyTagId) { + this.notifyTagId = notifyTagId; + } + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + @Override + public String toString() { + return "NotifyTemplateTag{" + + "notifyTagId=" + notifyTagId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userTagId=" + userTagId + + ",templateId=" + templateId + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/SmsLog.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/SmsLog.java new file mode 100644 index 0000000..ad4610b --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/model/SmsLog.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 短信记录表 + * + * @author lhd + * @date 2021-01-04 13:36:52 + */ +public class SmsLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ID + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 手机号码 + */ + private String userPhone; + + /** + * 短信内容 + */ + private String content; + + /** + * 手机验证码 + */ + private String mobileCode; + + /** + * 短信类型 1:注册 2:验证 + */ + private Integer type; + + /** + * 发送短信返回码 + */ + private String responseCode; + + /** + * 状态 1:有效 0:失效 + */ + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserPhone() { + return userPhone; + } + + public void setUserPhone(String userPhone) { + this.userPhone = userPhone; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getMobileCode() { + return mobileCode; + } + + public void setMobileCode(String mobileCode) { + this.mobileCode = mobileCode; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getResponseCode() { + return responseCode; + } + + public void setResponseCode(String responseCode) { + this.responseCode = responseCode; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SmsLogVO{" + + "id=" + id + + ",userId=" + userId + + ",userPhone=" + userPhone + + ",content=" + content + + ",mobileCode=" + mobileCode + + ",type=" + type + + ",responseCode=" + responseCode + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/AttachFileGroupService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/AttachFileGroupService.java new file mode 100644 index 0000000..682aa8d --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/AttachFileGroupService.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.model.AttachFileGroup; +import com.tmerclub.cloud.biz.vo.AttachFileGroupVO; + +import java.util.List; + +/** + * + * + * @author YXF + * @date 2020-12-04 16:15:02 + */ +public interface AttachFileGroupService { + + /** + * 获取列表 + * @param type + * @return + */ + List list(Integer type); + + /** + * 根据id获取 + * + * @param attachFileGroupId id + * @return + */ + AttachFileGroupVO getByAttachFileGroupId(Long attachFileGroupId); + + /** + * 保存 + * @param attachFileGroup + */ + void save(AttachFileGroup attachFileGroup); + + /** + * 更新 + * @param attachFileGroup + */ + void update(AttachFileGroup attachFileGroup); + + /** + * 根据id删除 + * @param attachFileGroupId + */ + void deleteById(Long attachFileGroupId); + + /** + * 根据uid更新店铺id + * @param shopId + * @param uid + */ + void updateShopIdByUid(Long shopId, Long uid); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyLogService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyLogService.java new file mode 100644 index 0000000..a4baaed --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyLogService.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.dto.NotifyLogDTO; +import com.tmerclub.cloud.biz.model.NotifyLog; +import com.tmerclub.cloud.biz.vo.NotifyLogVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public interface NotifyLogService { + + /** + * 分页获取列表 + * + * @param page + * @param userId 用户id + * @param msgType 消息类型 + * @param status 消息已读状态 1.已读 0.未读 + * @return 消息数量 + */ + PageVO pageBySendTypeAndRemindType(PageDTO page, Long userId, Integer msgType, Integer status); + + /** + * 根据参数获取商家端或供应商端的消息记录 + * @param page + * @param notifyLogDTO + * @return + */ + PageVO pageShopNotifyLogByParam(PageDTO page, NotifyLogDTO notifyLogDTO); + + /** + * 批量更新 + * @param notifyLogList + */ + void updateBatchById(List notifyLogList); + + /** + * 查询用户未读消息数量 + * @param userId 用户id + * @param msgType 消息类型 + * @return 未读消息数量 + */ + int countUnreadBySendTypeAndRemindType(Long userId, Integer msgType); + + /** + * 批量保存 + * @param notifyLogs 日志信息 + */ + void saveBatch(List notifyLogs); + + /** + * 分页获取列表 + * @param pageDTO 分页信息 + * @param notifyLogDTO 搜索参数 + * @return 分页列表 + */ + PageVO page(PageDTO pageDTO, NotifyLogDTO notifyLogDTO); + + /** + * 根据条件获取已发送消息数量 + * @param orderId 关联订单id + * @param level 等级 + * @param userId 用户id + * @param sendType 发送类型 + * @return 已发送消息数量 + */ + int countNotifyByConditions(Long orderId, Integer level, Long userId, Integer sendType); + + /** + * 标记消息为已读 + * @param id + */ + void updateStatus(Long id); + + /** + * 根据id获取消息详情 + * @param logId + * @return + */ + NotifyLogVO getByLogId(Long logId); + + /** + * 消息批量设置已读 + * @param logIds + */ + void isReadByIds(List logIds); + + /** + * 全部标为已读 + * @param tenantId + */ + void isReadByShopId(Long tenantId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateShopService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateShopService.java new file mode 100644 index 0000000..485cb50 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/NotifyTemplateShopService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.model.NotifyTemplateShop; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +/** + * + * + * @author FrozenWatermelon + * @date 2021-01-16 15:01:14 + */ +public interface NotifyTemplateShopService { + + /** + * 分页获取列表 + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param notifyShopId id + * @return + */ + NotifyTemplateShop getByNotifyShopId(Long notifyShopId); + + /** + * 保存 + * @param notifyTemplateShop + */ + void save(NotifyTemplateShop notifyTemplateShop); + + /** + * 更新 + * @param notifyTemplateShop + */ + void update(NotifyTemplateShop notifyTemplateShop); + + /** + * 根据id删除 + * @param notifyShopId id + */ + void deleteById(Long notifyShopId); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/QrcodeTicketService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/QrcodeTicketService.java new file mode 100644 index 0000000..dde07e8 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/QrcodeTicketService.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.model.QrcodeTicket; +import com.tmerclub.cloud.biz.vo.QrcodeTicketVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +/** + * 二维码数据信息 + * + * @author cl + * @date 2021-08-13 15:32:12 + */ +public interface QrcodeTicketService { + + /** + * 分页获取二维码数据信息列表 + * @param pageDTO 分页参数 + * @return 二维码数据信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据二维码数据信息id获取二维码数据信息 + * + * @param ticketId 二维码数据信息id + * @return 二维码数据信息 + */ + QrcodeTicket getByTicketId(Long ticketId); + + /** + * 保存二维码数据信息 + * @param qrcodeTicket 二维码数据信息 + */ + void save(QrcodeTicket qrcodeTicket); + + /** + * 更新二维码数据信息 + * @param qrcodeTicket 二维码数据信息 + */ + void update(QrcodeTicket qrcodeTicket); + + /** + * 根据二维码数据信息id删除二维码数据信息 + * @param ticketId 二维码数据信息id + */ + void deleteById(Long ticketId); + + /** + * 根据二维码获取二维码信息 + * @param ticket 二维码 + * @return 二维码信息 + */ + QrcodeTicketVO getByTicket(String ticket); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/SendMessageService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/SendMessageService.java new file mode 100644 index 0000000..708d64d --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/SendMessageService.java @@ -0,0 +1,60 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.biz.vo.NotifyParamVO; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; + +import java.util.List; + + +/** + * 统一发送通知 + * @author lhd + */ +public interface SendMessageService { + + /** + * 推送通知 + * @param notifyParamVO 统一推送消息所需参数 + */ + void sendMsg(NotifyParamVO notifyParamVO); + + /** + * 推送消息给用户 + * @param notifyList 推送消息列表 + */ + void sendOrderNotifyMsgToUser(List notifyList); + + /** + * 推送消息给用户 + * @param sendNotifyBO 推送消息参数 + */ + void sendOrderNotifyMsgToShop(SendNotifyBO sendNotifyBO); + + /** + * 推送商品消息给店铺 + * @param notifyList 推送消息列表 + */ + void sendProductNotifyMsgToShop(List notifyList); + + /** + * 推送订单待采购提醒给店铺 + * @param sendNotify + */ + void sendOrderToPurchaseNotifyMsgToShop(List sendNotify); + + /** + * 营销活动消息推送给商家 + * @param sendNotifyBO + */ + void sendActivityNotifyMsgToShop(SendNotifyBO sendNotifyBO); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/SmsLogService.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/SmsLogService.java new file mode 100644 index 0000000..7364940 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/SmsLogService.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service; + +import com.tmerclub.cloud.common.constant.SendTypeEnum; + +import java.util.Map; + +/** + * 短信记录表 + * + * @author lhd + * @date 2021-01-04 13:36:52 + */ +public interface SmsLogService { + + + /** + * 送注册、登录、修改密码、校验等短信 + * + * @param smsType 通知短信参数 + * @param mobile 手机号 + * @param params 短信参数 + */ + void sendSmsCode(SendTypeEnum smsType, String mobile, Map params); + + /** + * 校验,并发送短信验证码 + * + * @param sendType + * @param mobile + * @param params + */ + void checkAndSendSmsCode(SendTypeEnum sendType, String mobile, Map params); + + /** + * 发送通知短信 + * + * @param templateCode 通知短信参数 + * @param userMobile 通知短信手机号 + * @param smsParam 短信参数 + * @return 返回发送结果 + */ + Boolean sendMsgSms(String templateCode, String userMobile, Map smsParam); + + /** + * 校验验证码 + * + * @param mobile 手机号 + * @param validCode 验证码 + * @param type 类型 + * @return 成功or失败 + */ + Boolean checkValidCode(String mobile, String validCode, SendTypeEnum type); +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/AttachFileGroupServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/AttachFileGroupServiceImpl.java new file mode 100644 index 0000000..cceda99 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/AttachFileGroupServiceImpl.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.biz.mapper.AttachFileGroupMapper; +import com.tmerclub.cloud.biz.mapper.AttachFileMapper; +import com.tmerclub.cloud.biz.model.AttachFileGroup; +import com.tmerclub.cloud.biz.service.AttachFileGroupService; +import com.tmerclub.cloud.biz.vo.AttachFileGroupVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.security.AuthUserContext; +import org.apache.dubbo.config.annotation.DubboReference; +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 YXF + * @date 2020-12-04 16:15:02 + */ +@Service +public class AttachFileGroupServiceImpl implements AttachFileGroupService { + + @Autowired + private AttachFileMapper attachFileMapper; + @Autowired + private AttachFileGroupMapper attachFileGroupMapper; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @Override + public List list(Integer type) { + if (Objects.equals(AuthUserContext.get().getTenantId(), Constant.DEFAULT_SHOP_ID)) { + return attachFileGroupMapper.list(null, AuthUserContext.get().getSysType(), AuthUserContext.getAccountUid(), type); + } + return attachFileGroupMapper.list(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType(), null, type); + } + + @Override + public AttachFileGroupVO getByAttachFileGroupId(Long attachFileGroupId) { + return attachFileGroupMapper.getByAttachFileGroupId(attachFileGroupId); + } + + @Override + public void save(AttachFileGroup attachFileGroup) { + attachFileGroup.setShopId(AuthUserContext.get().getTenantId()); + this.checkGroupNameIsRepeat(attachFileGroup.getName(), attachFileGroup.getShopId(), attachFileGroup.getSysType(), attachFileGroup.getType(), null); + attachFileGroup.setUid(AuthUserContext.getAccountUid()); + attachFileGroupMapper.save(attachFileGroup); + } + + @Override + public void update(AttachFileGroup attachFileGroup) { + this.checkGroupNameIsRepeat(attachFileGroup.getName(), attachFileGroup.getShopId(), attachFileGroup.getSysType(), attachFileGroup.getType(), attachFileGroup.getAttachFileGroupId()); + attachFileGroup.setShopId(AuthUserContext.get().getTenantId()); + attachFileGroupMapper.update(attachFileGroup); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long attachFileGroupId) { + attachFileGroupMapper.deleteById(attachFileGroupId); + attachFileMapper.updateBatchByAttachFileGroupId(attachFileGroupId); + } + + @Override + public void updateShopIdByUid(Long shopId, Long uid) { + attachFileGroupMapper.updateShopIdByUid(shopId, uid); + } + + /** + * 检查分组名是否重复 + * + * @param name 分组名称 + * @param shopId 店铺id + * @param sysType 系统类型 + * @param type 类型 + * @param attachFileGroupId 分组id + */ + private void checkGroupNameIsRepeat(String name, Long shopId, Integer sysType, Integer type, Long attachFileGroupId) { + int count = attachFileGroupMapper.countByNameAndShopId(name, shopId, sysType, type, attachFileGroupId); + if (count > 0) { + throw new LuckException("分组名称重复"); + } + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateRemindServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateRemindServiceImpl.java new file mode 100644 index 0000000..c0d47ec --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateRemindServiceImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import com.tmerclub.cloud.biz.dto.NotifyTemplateRemindDTO; +import com.tmerclub.cloud.biz.mapper.NotifyTemplateRemindMapper; +import com.tmerclub.cloud.biz.model.NotifyTemplateRemind; +import com.tmerclub.cloud.biz.service.NotifyTemplateRemindService; +import com.tmerclub.cloud.biz.vo.NotifyTemplateRemindVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 消息提醒设置 + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +@Service +public class NotifyTemplateRemindServiceImpl implements NotifyTemplateRemindService { + + @Autowired + private NotifyTemplateRemindMapper notifyTemplateRemindMapper; + + @Override + public PageVO page(PageDTO pageDTO, NotifyTemplateRemindDTO notifyTemplateRemindDTO) { + return PageUtil.doPage(pageDTO, () -> notifyTemplateRemindMapper.list(notifyTemplateRemindDTO)); + } + + @Override + public NotifyTemplateRemind getByNotifyTemplateRemindId(Long notifyTemplateRemindId) { + return notifyTemplateRemindMapper.getByNotifyTemplateRemindId(notifyTemplateRemindId); + } + + @Override + public void save(NotifyTemplateRemind notifyTemplateRemind) { + notifyTemplateRemindMapper.save(notifyTemplateRemind); + } + + @Override + public void update(NotifyTemplateRemind notifyTemplateRemind) { + notifyTemplateRemindMapper.update(notifyTemplateRemind); + } + + @Override + public void deleteById(Long notifyTemplateRemindId) { + notifyTemplateRemindMapper.deleteById(notifyTemplateRemindId); + } + + @Override + public NotifyTemplateRemindVO getByTemplateIdAndShopIdAndSysType(Long templateId, Long shopId, Integer sysType) { + return notifyTemplateRemindMapper.getByTemplateIdAndShopIdAndSysType(templateId, shopId, sysType); + } + +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateTagServiceImpl.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateTagServiceImpl.java new file mode 100644 index 0000000..0dbcbc5 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/service/impl/NotifyTemplateTagServiceImpl.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.user.feign.UserTagFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.biz.constant.NotifyType; +import com.tmerclub.cloud.biz.dto.NotifyTemplateDTO; +import com.tmerclub.cloud.biz.mapper.NotifyTemplateTagMapper; +import com.tmerclub.cloud.biz.model.NotifyLog; +import com.tmerclub.cloud.biz.model.NotifyTemplate; +import com.tmerclub.cloud.biz.model.NotifyTemplateTag; +import com.tmerclub.cloud.biz.service.NotifyLogService; +import com.tmerclub.cloud.biz.service.NotifyTemplateService; +import com.tmerclub.cloud.biz.service.NotifyTemplateTagService; +import com.tmerclub.cloud.biz.vo.NotifyTemplateVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author cl + * @date 2021-05-20 11:09:53 + */ +@Service +public class NotifyTemplateTagServiceImpl implements NotifyTemplateTagService { + + @Autowired + private NotifyTemplateTagMapper notifyTemplateTagMapper; + + @Autowired + private NotifyTemplateService notifyTemplateService; + + @Autowired + private NotifyLogService notifyLogService; + + @DubboReference + private UserTagFeignClient userTagFeignClient; + + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> notifyTemplateTagMapper.list()); + } + + @Override + public NotifyTemplateTag getByNotifyTagId(Long notifyTagId) { + return notifyTemplateTagMapper.getByNotifyTagId(notifyTagId); + } + + @Override + public void save(NotifyTemplateTag notifyTemplateTag) { + notifyTemplateTagMapper.save(notifyTemplateTag); + } + + @Override + public void update(NotifyTemplateTag notifyTemplateTag) { + notifyTemplateTagMapper.update(notifyTemplateTag); + } + + @Override + public void deleteById(Long notifyTagId) { + notifyTemplateTagMapper.deleteById(notifyTagId); + } + + @Override + public PageVO pageTagNotify(PageDTO pageDTO) { + PageVO pageVO = new PageVO<>(); + int count = notifyTemplateTagMapper.countTagNotify(); + pageVO.setTotal((long) count); + pageVO.setPages(PageUtil.getPages(pageVO.getTotal(), pageDTO.getPageSize())); + if (count < 1) { + return pageVO; + } + List list = notifyTemplateTagMapper.pageTagNotify(new PageAdapter(pageDTO)); + List> collect = list.stream().map(NotifyTemplateVO::getTagIds).distinct().collect(Collectors.toList()); + Set tagIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (List longs : collect) { + tagIds.addAll(longs); + } + + // 获取标签名称 + ServerResponseEntity> responseEntity = userTagFeignClient.getUserTagList(new ArrayList<>(tagIds)); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + List tagApiVOList = responseEntity.getData(); + Map tagApiMap = tagApiVOList.stream().collect(Collectors.toMap(UserTagApiVO::getTagId, (k) -> k)); + for (NotifyTemplateVO notifyTemplateVO : list) { + notifyTemplateVO.setApp(true); + List tagIdList = notifyTemplateVO.getTagIds(); + // 拼接字符串 + StringBuilder tagNames = new StringBuilder(100); + for (Long tagId : tagIdList) { + UserTagApiVO userTagApiVO = tagApiMap.get(tagId); + if (Objects.nonNull(userTagApiVO)) { + tagNames.append(userTagApiVO.getTagName()).append(StrUtil.COMMA); + } + } + if (tagNames.length() > 1) { + CharSequence charSequence = tagNames.subSequence(0, Math.min(tagNames.length() - 1, 100)); + if (tagNames.lastIndexOf(",") == tagNames.length() - 1) { + tagNames.deleteCharAt(tagNames.length() - 1); + } + notifyTemplateVO.setTemplateCode(tagNames.toString()); + } + } + pageVO.setList(list); + return pageVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveTagNotify(NotifyTemplate notifyTemplate, List tagIds) { + notifyTemplateService.save(notifyTemplate); + List notifyTemplateTags = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long tagId : tagIds) { + NotifyTemplateTag notifyTemplateTag = new NotifyTemplateTag(); + notifyTemplateTag.setUserTagId(tagId); + notifyTemplateTag.setTemplateId(notifyTemplate.getTemplateId()); + notifyTemplateTags.add(notifyTemplateTag); + } + notifyTemplateTagMapper.saveBatch(notifyTemplateTags); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTemplateTagByTempLateId(Long templateId) { + notifyTemplateService.deleteById(templateId); + notifyTemplateTagMapper.deleteTemplateTagByTempLateId(templateId); + } + + @Override + public void sendMsg(Long templateId) { + NotifyTemplateVO notifyTemplateVO = notifyTemplateService.getByTemplateId(templateId); + if (Objects.isNull(notifyTemplateVO)) { + throw new LuckException("消息模板不存在!"); + } + // 获取标签下的所有标签id + List userTagIds = notifyTemplateTagMapper.getTagIdsByTemplateId(templateId); + if (CollUtil.isEmpty(userTagIds)) { + return; + } + ServerResponseEntity> userResponse = userTagFeignClient.getUserByTagIds(userTagIds); + if (!Objects.equals(ResponseEnum.OK.value(), userResponse.getCode())) { + throw new LuckException(userResponse.getMsg()); + } + List userApiVOList = userResponse.getData(); + if (CollUtil.isEmpty(userApiVOList)) { + throw new LuckException("没有符合条件的用户去发送这条消息"); + } + List logs = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserApiVO userApiVO : userApiVOList) { + NotifyLog notifyLog = new NotifyLog(); + notifyLog.setNickName(userApiVO.getNickName()); + notifyLog.setUserMobile(userApiVO.getUserMobile()); + // 如果大于则为店铺自行接收的消息 + notifyLog.setRemindId(userApiVO.getUserId().toString()); + notifyLog.setShopId(Constant.PLATFORM_SHOP_ID); + // 站内消息 + notifyLog.setRemindType(NotifyType.APP.value()); + notifyLog.setTemplateId(templateId); + notifyLog.setSendType(SendTypeEnum.CUSTOMIZE.getValue()); + notifyLog.setMessage(notifyTemplateVO.getMessage()); + notifyLog.setStatus(0); + logs.add(notifyLog); + } + notifyLogService.saveBatch(logs); + } + + @Override + public NotifyTemplateVO getByTemplateId(Long templateId) { + return notifyTemplateTagMapper.getByTemplateId(templateId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTemplateAndTag(NotifyTemplateDTO notifyTemplateDTO) { + NotifyTemplate notifyTemplate = BeanUtil.map(notifyTemplateDTO, NotifyTemplate.class); + notifyTemplate.setUpdateTime(new Date()); + notifyTemplateService.update(notifyTemplate); + List tagIds = notifyTemplateDTO.getTagIds(); + Long templateId = notifyTemplate.getTemplateId(); + notifyTemplateTagMapper.deleteTemplateTagByTempLateId(templateId); + if (CollUtil.isEmpty(tagIds)) { + return; + } + List notifyTemplateTags = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long tagId : tagIds) { + NotifyTemplateTag notifyTemplateTag = new NotifyTemplateTag(); + notifyTemplateTag.setTemplateId(templateId); + notifyTemplateTag.setUserTagId(tagId); + notifyTemplateTags.add(notifyTemplateTag); + } + notifyTemplateTagMapper.saveBatch(notifyTemplateTags); + } + + @Override + public void deleteByTagId(Long tagId) { + notifyTemplateTagMapper.deleteTemplateTagByTagId(tagId); + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/AttachFileVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/AttachFileVO.java new file mode 100644 index 0000000..13e30cf --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/AttachFileVO.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 上传文件记录表VO + * + * @author YXF + * @date 2020-11-21 10:21:40 + */ +public class AttachFileVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long fileId; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "文件类型") + private String fileType; + + @Schema(description = "文件名") + private String fileName; + + @Schema(description = "文件大小") + private Integer fileSize; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "文件 1:图片 2:视频 3:文件") + private Integer type; + + @Schema(description = "分组id") + private Long attachFileGroupId; + + @Schema(description = "系统类型 1.商家端 2.平台端 3.供应商端") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Integer getFileSize() { + return fileSize; + } + + public void setFileSize(Integer fileSize) { + this.fileSize = fileSize; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getAttachFileGroupId() { + return attachFileGroupId; + } + + public void setAttachFileGroupId(Long attachFileGroupId) { + this.attachFileGroupId = attachFileGroupId; + } + + @Override + public String toString() { + return "AttachFileVO{" + + "fileId=" + fileId + + ", filePath='" + filePath + '\'' + + ", fileType='" + fileType + '\'' + + ", fileName='" + fileName + '\'' + + ", fileSize=" + fileSize + + ", shopId=" + shopId + + ", type=" + type + + ", attachFileGroupId=" + attachFileGroupId + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyLogVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyLogVO.java new file mode 100644 index 0000000..7eaaa8c --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyLogVO.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * VO + * + * @author lhd + * @date 2021-03-31 10:37:54 + */ +public class NotifyLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "消息记录表") + private Long logId; + + @Schema(description = "用户昵称or手机号") + private String nickName; + + @Schema(description = "发送手机号") + private String userMobile; + + @Schema(description = "通知的用户id") + private String remindId; + + @Schema(description = "选择发送的店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "通知类型 1.短信发送 2.公众号订阅消息 3.站内消息") + private Integer remindType; + + @Schema(description = "通知模板") + private Long templateId; + + @Schema(description = "1.订单催付 2.付款成功通知 3.商家同意退款 4.商家拒绝退款 5.核销提醒 6.发货提醒 7.拼团失败提醒 8.拼团成功提醒 9.拼团开团提醒 10.会员升级提醒 101.退款临近超时提醒 102.确认收货提醒 103.买家发起退款提醒 104.买家已退货提醒") + private Integer sendType; + + @Schema(description = "通知内容") + private String message; + + @Schema(description = "是否阅读 1已读 0未读") + private Integer status; + @Schema(description = "关联的订单id(等级)") + private Long bizId; + + /** + * 关联的商品id + */ + @Schema(description = "关联的商品id") + private Long spuId; + + /** + * 关联的营销活动id + */ + @Schema(description = "关联的营销活动id") + private Long activityId; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getRemindId() { + return remindId; + } + + public void setRemindId(String remindId) { + this.remindId = remindId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getRemindType() { + return remindType; + } + + public void setRemindType(Integer remindType) { + this.remindType = remindType; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "NotifyLogVO{" + + "logId=" + logId + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", remindId='" + remindId + '\'' + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", remindType=" + remindType + + ", templateId=" + templateId + + ", sendType=" + sendType + + ", message='" + message + '\'' + + ", status=" + status + + ", bizId=" + bizId + + ", spuId=" + spuId + + ", activityId=" + activityId + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyParamVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyParamVO.java new file mode 100644 index 0000000..29bbb1f --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyParamVO.java @@ -0,0 +1,408 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lhd + * @date 2021/05/08 + */ +public class NotifyParamVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 关联的订单id(等级) + */ + private Long bizId; + /** + * 用户id + */ + private Long userId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + /** + * 商品名称 + */ + private String spuName; + + /** + * 手机号 + */ + private String mobile; + /** + * 发送类型 + * 1.订单催付 2.付款成功通知 3.商家同意退款 4.商家拒绝退款 5.核销提醒 6.发货提醒 7.拼团失败提醒 8.拼团成功提醒 9.拼团开团提醒 10.开通会员提醒 + * 101.退款临近超时提醒 102.确认收货提醒 103.买家发起退款提醒 104.买家已退货提醒 + */ + private Integer sendType; + /** + * 实付金额转换成string并除以100 + */ + private String actualTotalStr; + + /** + * 支付方式 + */ + private Integer payType; + /** + * 等级名称 + */ + private String levelName; + + /** + * 用户昵称 + */ + private String nickName; + /** + * 店铺名称 + */ + private String shopName; + /** + * 自提点名称 + */ + private String stationName; + /** + * 退款备注 + */ + private String remark; + + /** + * 退款原因 + */ + private String rejectMessage; + /** + * 商品数量 + */ + private Integer prodNum; + /** + * 金额 + */ + private Double price; + + /** + * 退款超时时间,小时 + */ + private Long hour; + /** + * 开团人数 + */ + private Integer groupCount; + + /** + * 发货时间 + */ + private Date dvyTime; + /** + * 物流编号 + */ + private String dvyFlowId; + /** + * 物流公司名称 + */ + private String dvyName; + /** + * 取消时间 + */ + private String cancelTime; + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 关联的商品id + */ + private Long spuId; + + /** + * 关联的营销活动id + */ + private Long activityId; + + /** + * 关联的营销活动名称 + * @return + */ + private String activityName; + + public String getActivityName() { + return activityName; + } + + public void setActivityName(String activityName) { + this.activityName = activityName; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getActualTotalStr() { + return actualTotalStr; + } + + public void setActualTotalStr(String actualTotalStr) { + this.actualTotalStr = actualTotalStr; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public Integer getProdNum() { + return prodNum; + } + + public void setProdNum(Integer prodNum) { + this.prodNum = prodNum; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Long getHour() { + return hour; + } + + public void setHour(Long hour) { + this.hour = hour; + } + + public Integer getGroupCount() { + return groupCount; + } + + public void setGroupCount(Integer groupCount) { + this.groupCount = groupCount; + } + + public Date getDvyTime() { + return dvyTime; + } + + public void setDvyTime(Date dvyTime) { + this.dvyTime = dvyTime; + } + + public String getDvyFlowId() { + return dvyFlowId; + } + + public void setDvyFlowId(String dvyFlowId) { + this.dvyFlowId = dvyFlowId; + } + + public String getDvyName() { + return dvyName; + } + + public void setDvyName(String dvyName) { + this.dvyName = dvyName; + } + + public String getCancelTime() { + return cancelTime; + } + + public void setCancelTime(String cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + @Override + public String toString() { + return "NotifyParamVO{" + + "bizId=" + bizId + + ", userId=" + userId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", spuName='" + spuName + '\'' + + ", mobile='" + mobile + '\'' + + ", sendType=" + sendType + + ", actualTotalStr='" + actualTotalStr + '\'' + + ", payType=" + payType + + ", levelName='" + levelName + '\'' + + ", nickName='" + nickName + '\'' + + ", shopName='" + shopName + '\'' + + ", stationName='" + stationName + '\'' + + ", remark='" + remark + '\'' + + ", rejectMessage='" + rejectMessage + '\'' + + ", prodNum=" + prodNum + + ", price=" + price + + ", hour=" + hour + + ", groupCount=" + groupCount + + ", dvyTime=" + dvyTime + + ", dvyFlowId='" + dvyFlowId + '\'' + + ", dvyName='" + dvyName + '\'' + + ", cancelTime='" + cancelTime + '\'' + + ", createTime=" + createTime + + ", spuId=" + spuId + + ", activityId=" + activityId + + ", activityName='" + activityName + '\'' + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateRemindVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateRemindVO.java new file mode 100644 index 0000000..00cae87 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateRemindVO.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 消息提醒设置VO + * + * @author FrozenWatermelon + * @date 2022-10-24 13:48:38 + */ +public class NotifyTemplateRemindVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "消息提醒设置") + private Long notifyTemplateRemindId; + + @Schema(description = "消息模板id") + private Long templateId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "是否开启提醒 1开启 0关闭") + private Integer isRemind; + + @Schema(description = "1.订单催付 2.付款成功通知 3.商家同意退款 4.商家拒绝退款 5.核销提醒 6.发货提醒 7.拼团失败提醒 8.拼团成功提醒 " + + "9.拼团开团提醒 10.会员升级提醒11.退款临近超时提醒 102.确认收货提醒 103.买家发起退款提醒 104.买家已退货提醒") + private Integer sendType; + + @Schema(description = "通知内容") + private String message; + + @Schema(description = "通知方式集合用逗号分隔 1.短信 2.公众号 3.站内消息") + private String notifyTypes; + + @Schema(description = "所属菜单") + private String menu; + + @Schema(description = "推送节点") + private String nodeName; + + /** + * 系统类型(1.店铺 2.平台端 3.供应商) + */ + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getMenu() { + return menu; + } + + public void setMenu(String menu) { + this.menu = menu; + } + + public String getNodeName() { + return nodeName; + } + + public void setNodeName(String nodeName) { + this.nodeName = nodeName; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getNotifyTypes() { + return notifyTypes; + } + + public void setNotifyTypes(String notifyTypes) { + this.notifyTypes = notifyTypes; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public Long getNotifyTemplateRemindId() { + return notifyTemplateRemindId; + } + + public void setNotifyTemplateRemindId(Long notifyTemplateRemindId) { + this.notifyTemplateRemindId = notifyTemplateRemindId; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsRemind() { + return isRemind; + } + + public void setIsRemind(Integer isRemind) { + this.isRemind = isRemind; + } + + @Override + public String toString() { + return "NotifyTemplateRemindVO{" + + "notifyTemplateRemindId=" + notifyTemplateRemindId + + ", templateId=" + templateId + + ", shopId=" + shopId + + ", isRemind=" + isRemind + + ", sendType=" + sendType + + ", message='" + message + '\'' + + ", notifyTypes='" + notifyTypes + '\'' + + ", menu='" + menu + '\'' + + ", nodeName='" + nodeName + '\'' + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateTagVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateTagVO.java new file mode 100644 index 0000000..e5549ba --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/NotifyTemplateTagVO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * VO + * + * @author cl + * @date 2021-05-20 11:09:53 + */ +public class NotifyTemplateTagVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "标签消息通知关联表") + private Long notifyTagId; + + @Schema(description = "标签id") + private Long userTagId; + + @Schema(description = "模板id") + private Long templateId; + + public Long getNotifyTagId() { + return notifyTagId; + } + + public void setNotifyTagId(Long notifyTagId) { + this.notifyTagId = notifyTagId; + } + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + @Override + public String toString() { + return "NotifyTemplateTagVO{" + + "notifyTagId=" + notifyTagId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userTagId=" + userTagId + + ",templateId=" + templateId + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/OssVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/OssVO.java new file mode 100644 index 0000000..7f22e92 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/OssVO.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/12 + */ +public class OssVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String accessid; + + private String policy; + + private String signature; + + private String dir; + + private String host; + + private Integer expire; + + private String fileName; + + /** + * 返回的url,minio + */ + private String actionUrl; + + /** + * url列表--minio中一条链接对应一个上传的文件 + * @return + */ + private List ossList; + + public String getAccessid() { + return accessid; + } + + public void setAccessid(String accessid) { + this.accessid = accessid; + } + + public String getPolicy() { + return policy; + } + + public void setPolicy(String policy) { + this.policy = policy; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } + + public String getDir() { + return dir; + } + + public void setDir(String dir) { + this.dir = dir; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Integer getExpire() { + return expire; + } + + public void setExpire(Integer expire) { + this.expire = expire; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getActionUrl() { + return actionUrl; + } + + public void setActionUrl(String actionUrl) { + this.actionUrl = actionUrl; + } + + public List getOssList() { + return ossList; + } + + public void setOssList(List ossList) { + this.ossList = ossList; + } + + @Override + public String toString() { + return "OssVO{" + + "accessid='" + accessid + '\'' + + ", policy='" + policy + '\'' + + ", signature='" + signature + '\'' + + ", dir='" + dir + '\'' + + ", host='" + host + '\'' + + ", expire=" + expire + + ", fileName='" + fileName + '\'' + + ", actionUrl='" + actionUrl + '\'' + + ", ossList=" + ossList + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/PreSignUrlVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/PreSignUrlVO.java new file mode 100644 index 0000000..d177e7e --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/PreSignUrlVO.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.biz.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @author gaozijie + * @date 2023-11-01 + */ +public class PreSignUrlVO { + + @Schema(description = "文件目录路径") + private String dir; + + @Schema(description = "文件名") + private String fileName; + + @Schema(description = "预签名url") + private String preSignUrl; + + public PreSignUrlVO() { + } + + public String getDir() { + return dir; + } + + public void setDir(String dir) { + this.dir = dir; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getPreSignUrl() { + return preSignUrl; + } + + public void setPreSignUrl(String preSignUrl) { + this.preSignUrl = preSignUrl; + } + + @Override + public String toString() { + return "PreSignUrlVO{" + + "dir='" + dir + '\'' + + ", fileName='" + fileName + '\'' + + ", preSignUrl='" + preSignUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/QrcodeTicketVO.java b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/QrcodeTicketVO.java new file mode 100644 index 0000000..a093031 --- /dev/null +++ b/tmerclub-biz/src/main/java/com/tmerclub/cloud/biz/vo/QrcodeTicketVO.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.biz.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 二维码数据信息VO + * + * @author cl + * @date 2021-08-13 15:32:12 + */ +public class QrcodeTicketVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "二维码ticket id") + private Long ticketId; + + @Schema(description = "二维码ticket") + private String ticket; + + @Schema(description = "过期时间") + private Date expireTime; + + @Schema(description = "二维码类型(1. 小程序团购页面)") + private Integer type; + + @Schema(description = "二维码实际内容") + private String content; + + @Schema(description = "这个二维码要跳转的url") + private String ticketUrl; + + public Long getTicketId() { + return ticketId; + } + + public void setTicketId(Long ticketId) { + this.ticketId = ticketId; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTicketUrl() { + return ticketUrl; + } + + public void setTicketUrl(String ticketUrl) { + this.ticketUrl = ticketUrl; + } + + @Override + public String toString() { + return "QrcodeTicketVO{" + + "ticketId=" + ticketId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",ticket=" + ticket + + ",expireTime=" + expireTime + + ",type=" + type + + ",content=" + content + + ",ticketUrl=" + ticketUrl + + '}'; + } +} diff --git a/tmerclub-biz/src/main/resources/bootstrap.yml b/tmerclub-biz/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..ec10f7b --- /dev/null +++ b/tmerclub-biz/src/main/resources/bootstrap.yml @@ -0,0 +1,29 @@ +server: + port: ${MALL4CLOUD_PORT:9118} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} + +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9518} diff --git a/tmerclub-biz/src/main/resources/mapper/AttachFileGroupMapper.xml b/tmerclub-biz/src/main/resources/mapper/AttachFileGroupMapper.xml new file mode 100644 index 0000000..b6ad842 --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/AttachFileGroupMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + `attach_file_group_id`,`create_time`,`update_time`,`shop_id`,`sys_type`,`uid`,`name`,`type` + + + + + + insert into attach_file_group (`shop_id`,`uid`,`name`,`type`,`sys_type`) + values (#{attachFileGroup.shopId},#{attachFileGroup.uid},#{attachFileGroup.name},#{attachFileGroup.type},#{attachFileGroup.sysType}); + + + update attach_file_group + + + `name` = #{attachFileGroup.name}, + + + where attach_file_group_id = #{attachFileGroup.attachFileGroupId} and shop_id = #{attachFileGroup.shopId} + + + update attach_file_group set shop_id = #{shopId} where uid = #{uid} + + + delete from attach_file_group where attach_file_group_id = #{attachFileGroupId} + + + diff --git a/tmerclub-biz/src/main/resources/mapper/NotifyTemplateMapper.xml b/tmerclub-biz/src/main/resources/mapper/NotifyTemplateMapper.xml new file mode 100644 index 0000000..0a447fc --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/NotifyTemplateMapper.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + `template_id`,`create_time`,`update_time`,`send_type`,`message`,`notify_types`,`template_code`,`mp_code`,`msg_type`,`status` + + + + + insert into notify_template (`send_type`,`message`,`notify_types`,`template_code`,`mp_code`,`msg_type`,`status`) + values (#{notifyTemplate.sendType},#{notifyTemplate.message},#{notifyTemplate.notifyTypes},#{notifyTemplate.templateCode},#{notifyTemplate.mpCode},#{notifyTemplate.msgType},#{notifyTemplate.status}); + + + update notify_template + + + `send_type` = #{notifyTemplate.sendType}, + + + `message` = #{notifyTemplate.message}, + + + `notify_types` = #{notifyTemplate.notifyTypes}, + + + `template_code` = #{notifyTemplate.templateCode}, + + + `mp_code` = #{notifyTemplate.mpCode}, + + + `msg_type` = #{notifyTemplate.msgType}, + + + `status` = #{notifyTemplate.status}, + + + `update_time` = #{notifyTemplate.updateTime} + + + where template_id = #{notifyTemplate.templateId} + + + delete from notify_template where template_id = #{templateId} + + + + + + + + + diff --git a/tmerclub-biz/src/main/resources/mapper/NotifyTemplateShopMapper.xml b/tmerclub-biz/src/main/resources/mapper/NotifyTemplateShopMapper.xml new file mode 100644 index 0000000..750064b --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/NotifyTemplateShopMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + `notify_shop_id`,`create_time`,`update_time`,`shop_id`,`template_id`,`notify_types` + + + + + insert into notify_template_shop (`shop_id`,`template_id`,`notify_types`) + values (#{notifyTemplateShop.shopId},#{notifyTemplateShop.templateId},#{notifyTemplateShop.notifyTypes}); + + + update notify_template_shop + + + `shop_id` = #{notifyTemplateShop.shopId}, + + + `template_id` = #{notifyTemplateShop.templateId}, + + + `notify_types` = #{notifyTemplateShop.notifyTypes}, + + + where notify_shop_id = #{notifyTemplateShop.notifyShopId} + + + delete from notify_template_shop where notify_shop_id = #{notifyShopId} + + + diff --git a/tmerclub-biz/src/main/resources/mapper/QrcodeTicketMapper.xml b/tmerclub-biz/src/main/resources/mapper/QrcodeTicketMapper.xml new file mode 100644 index 0000000..ddcfc42 --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/QrcodeTicketMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + `ticket_id`,`create_time`,`ticket`,`expire_time`,`type`,`content`,`ticket_url` + + + + + insert into qrcode_ticket (`ticket`,`expire_time`,`type`,`content`,`ticket_url`) + values (#{qrcodeTicket.ticket},#{qrcodeTicket.expireTime},#{qrcodeTicket.type},#{qrcodeTicket.content},#{qrcodeTicket.ticketUrl}); + + + update qrcode_ticket + + + `ticket` = #{qrcodeTicket.ticket}, + + + `expire_time` = #{qrcodeTicket.expireTime}, + + + `type` = #{qrcodeTicket.type}, + + + `content` = #{qrcodeTicket.content}, + + + `ticket_url` = #{qrcodeTicket.ticketUrl}, + + + where ticket_id = #{qrcodeTicket.ticketId} + + + delete from qrcode_ticket where ticket_id = #{ticketId} + + + + diff --git a/tmerclub-biz/src/main/resources/mapper/SmsLogMapper.xml b/tmerclub-biz/src/main/resources/mapper/SmsLogMapper.xml new file mode 100644 index 0000000..c627b73 --- /dev/null +++ b/tmerclub-biz/src/main/resources/mapper/SmsLogMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`user_id`,`user_phone`,`content`,`mobile_code`,`type`,`response_code`,`status` + + + + + + + + insert into sms_log (`user_id`,`user_phone`,`content`,`mobile_code`,`type`,`response_code`,`status`) + values (#{smsLog.userId},#{smsLog.userPhone},#{smsLog.content},#{smsLog.mobileCode},#{smsLog.type},#{smsLog.responseCode},#{smsLog.status}); + + + update sms_log + + + `create_time` = #{smsLog.createTime}, + + + `update_time` = #{smsLog.updateTime}, + + + `user_id` = #{smsLog.userId}, + + + `user_phone` = #{smsLog.userPhone}, + + + `content` = #{smsLog.content}, + + + `mobile_code` = #{smsLog.mobileCode}, + + + `type` = #{smsLog.type}, + + + `response_code` = #{smsLog.responseCode}, + + + `status` = #{smsLog.status}, + + + where id = #{smsLog.id} + + + + update sms_log set status = 0 where user_phone = #{mobile} and type = #{sendType} + + diff --git a/tmerclub-common/pom.xml b/tmerclub-common/pom.xml new file mode 100644 index 0000000..9a9fcea --- /dev/null +++ b/tmerclub-common/pom.xml @@ -0,0 +1,29 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common + pom + + mall4cloud 公共模块 + + tmerclub-common-core + tmerclub-common-database + tmerclub-common-cache + tmerclub-common-security + tmerclub-common-order + tmerclub-common-product + tmerclub-common-rocketmq + tmerclub-common-mongodb + tmerclub-common-leaf + tmerclub-common-sharding-proxy + + + diff --git a/tmerclub-common/tmerclub-common-cache/README.md b/tmerclub-common/tmerclub-common-cache/README.md new file mode 100644 index 0000000..4914725 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/README.md @@ -0,0 +1,9 @@ +### 一些通用的缓存配置 + +缓存key命名规范: + +服务名:业务名:方法名:key, 大小写以下划线分割 如 +mall4cloud_oauth:token:access: +mall4cloud_oauth:token:refresh_to_access: +mall4cloud_oauth:token:uid_to_access: + diff --git a/tmerclub-common/tmerclub-common-cache/pom.xml b/tmerclub-common/tmerclub-common-cache/pom.xml new file mode 100644 index 0000000..685d339 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/pom.xml @@ -0,0 +1,27 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-cache + jar + mall4cloud 缓存相关公共代码 + + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + org.redisson + redisson-spring-boot-starter + + + diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/FastJsonRedisSerializer.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/FastJsonRedisSerializer.java new file mode 100644 index 0000000..3492bad --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/FastJsonRedisSerializer.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.common.cache.config; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.filter.Filter; +import org.springframework.data.redis.serializer.RedisSerializer; + +/** + * @author YANG + */ +public class FastJsonRedisSerializer implements RedisSerializer { + static final Filter autoTypeFilter = JSONReader.autoTypeFilter( + // 按需加上需要支持自动类型的类名前缀,范围越小越安全 + "com.moyuer.cloud" + ); + + private Class clazz; + + public FastJsonRedisSerializer(Class clazz) { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) { + if (t == null) { + return new byte[0]; + } + return JSON.toJSONBytes(t, JSONWriter.Feature.WriteClassName); + } + + @Override + public T deserialize(byte[] bytes) { + if (bytes == null || bytes.length <= 0) { + return null; + } +// String s = new String(bytes); + return JSON.parseObject(bytes, clazz, autoTypeFilter); + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/MultiRedisConfig.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/MultiRedisConfig.java new file mode 100644 index 0000000..99942d0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/MultiRedisConfig.java @@ -0,0 +1,96 @@ +package com.tmerclub.cloud.common.cache.config; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.cache.bo.MultiRedisBO; +import com.tmerclub.cloud.common.exception.LuckException; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.redisson.config.SingleServerConfig; +import org.redisson.spring.data.connection.RedissonConnectionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 多个redis管理 + * @author LGH + */ +@Component +@ConditionalOnProperty(value = "redis.multi.enable", havingValue = "true") +public class MultiRedisConfig implements DisposableBean { + + private static final Logger LOGGER = LoggerFactory.getLogger(MultiRedisConfig.class); + + private final List stringRedisTemplates = new ArrayList<>(); + + private final List redissonClients = new ArrayList<>(); + + + public MultiRedisConfig(MultiRedisBO multiRedis) { + + if (CollUtil.isEmpty(multiRedis.getRedisAddrs())) { + throw new LuckException("请在yml配置好 multiRedis 的配置,见 com.tmerclub.cloud.common.cache.bo.MultiRedisBO"); + } + + Config config = new Config(); + + SingleServerConfig singleServerConfig = config.useSingleServer(); + if (StrUtil.isNotBlank(multiRedis.getPassword())) { + singleServerConfig.setPassword(multiRedis.getPassword()); + } + if (multiRedis.getDatabase() != null) { + singleServerConfig.setDatabase(multiRedis.getDatabase()); + } else { + singleServerConfig.setDatabase(0); + } + + for (String addr : multiRedis.getRedisAddrs()) { + singleServerConfig.setAddress("redis://" + addr); + initRedisConnection(config); + } + } + + private void initRedisConnection(Config config) { + RedissonClient redisson = Redisson.create(config); + LOGGER.info("创建redisson, redisson={}", redisson); + + StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(); + stringRedisTemplate.setConnectionFactory(new RedissonConnectionFactory(redisson)); + stringRedisTemplate.setValueSerializer(StringRedisSerializer.UTF_8); + stringRedisTemplate.setKeySerializer(StringRedisSerializer.UTF_8); + + stringRedisTemplate.afterPropertiesSet(); + stringRedisTemplates.add(stringRedisTemplate); + redissonClients.add(redisson); + } + + public int getRedisCount() { + return stringRedisTemplates.size(); + } + + public StringRedisTemplate getRedisByIndex(int index) { + return stringRedisTemplates.get(index); + } + + public int getIndex(Long userId) { + int hashKey = Math.abs(userId.toString().hashCode()); + return hashKey % getRedisCount(); + } + + @Override + public void destroy() throws Exception { + for (RedissonClient redissonClient : redissonClients) { + LOGGER.info("关闭redissonClient, redissonClient={}", redissonClient); + redissonClient.shutdown(); + } + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/RedisCacheConfig.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/RedisCacheConfig.java new file mode 100644 index 0000000..75fccde --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/config/RedisCacheConfig.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.config; + +import com.tmerclub.cloud.common.cache.adapter.CacheTtlAdapter; +import com.tmerclub.cloud.common.cache.bo.CacheNameWithTtlBO; +import com.tmerclub.cloud.common.constant.Constant; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * @author FrozenWatermelon + * @date 2020/7/4 + */ +@EnableCaching +@Configuration +public class RedisCacheConfig { + + public static final int SECONDS = 3600; + + @Bean + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, CacheTtlAdapter cacheTtlAdapter) { + + RedisCacheManager redisCacheManager = new RedisCacheManager( + RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), + // 默认策略,未配置的 key 会使用这个 + this.getRedisCacheConfigurationWithTtl(SECONDS), + // 指定 key 策略 + this.getRedisCacheConfigurationMap(cacheTtlAdapter)); + + redisCacheManager.setTransactionAware(true); + return redisCacheManager; + } + + private Map getRedisCacheConfigurationMap(CacheTtlAdapter cacheTtlAdapter) { + if (null == cacheTtlAdapter) { + return Collections.emptyMap(); + } + Map redisCacheConfigurationMap = new HashMap<>(Constant.INITIAL_CAPACITY); + + for (CacheNameWithTtlBO cacheNameWithTtlBO : cacheTtlAdapter.listCacheNameWithTtl()) { + redisCacheConfigurationMap.put(cacheNameWithTtlBO.getCacheName(), + getRedisCacheConfigurationWithTtl(cacheNameWithTtlBO.getTtl())); + } + return redisCacheConfigurationMap; + } + + private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) { + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); + redisCacheConfiguration = redisCacheConfiguration + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer())) + .entryTtl(Duration.ofSeconds(seconds)); + + return redisCacheConfiguration; + } + + /** + * 自定义redis序列化的机制,重新定义一个ObjectMapper.防止和MVC的冲突 + * ... + */ + @Bean + public RedisSerializer redisSerializer() { + return new FastJsonRedisSerializer<>(Object.class); + } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory, + RedisSerializer redisSerializer) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(redisConnectionFactory); + template.setDefaultSerializer(redisSerializer); + template.setValueSerializer(redisSerializer); + template.setHashValueSerializer(redisSerializer); + template.setKeySerializer(StringRedisSerializer.UTF_8); + template.setHashKeySerializer(StringRedisSerializer.UTF_8); + template.afterPropertiesSet(); + return template; + } + + @Bean + public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + return new StringRedisTemplate(redisConnectionFactory); + } + + @Bean + @ConditionalOnMissingBean + public CacheTtlAdapter cacheTtl() { + return Collections::emptyList; + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/CacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/CacheNames.java new file mode 100644 index 0000000..2a6a34f --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/CacheNames.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * 缓存名字 + * + * @author FrozenWatermelon + * @date 2020/7/9 + */ +public interface CacheNames extends RbacCacheNames, OauthCacheNames, ProductCacheNames, MultishopCacheNames, SupplierCacheNames, CouponCacheNames, PlatformCacheNames, + BizCacheNames, DeliveryCacheNames, FlowCacheNames, DiscountCacheNames, UserCacheNames, ComboCacheNames, PaymentCacheNames, LiveCacheNames { + /** + * 参考CacheKeyPrefix + * cacheNames 与 key 之间的默认连接字符 + */ + String UNION = "::"; + + /** + * key内部的连接字符(自定义) + */ + String UNION_KEY = ":"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ComboCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ComboCacheNames.java new file mode 100644 index 0000000..57e6b73 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/ComboCacheNames.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author xxw + * @date 2022/12/13 9:06 + */ +public interface ComboCacheNames { + + /** + * 前缀 + */ + String COMBO_PREFIX = "mall4cloud_combo:"; + + /** + * 商品套餐信息缓存key + */ + String SPU_COMBO = COMBO_PREFIX + "spu_combo:"; + + /** + * 仅套餐相关信息,不包含具体商品数据的缓存key + */ + String SINGLE_COMBO_INFO = COMBO_PREFIX + "single_combo_info:"; + + /** + * 提交订单的套餐状态 + */ + String ORDER_COMBO_STATUS = COMBO_PREFIX + "order_combo_Status:"; + + /** + * 提交订单的套餐过期时间 + */ + String ORDER_COMBO_EXPIRATION_TIME = COMBO_PREFIX + "order_combo_Expiration_Time:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DeliveryCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DeliveryCacheNames.java new file mode 100644 index 0000000..0110c6a --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DeliveryCacheNames.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author lhd + * @date 2020/12/08 + */ +public interface DeliveryCacheNames { + + /** + * 前缀 + */ + String DELIVERY_PREFIX = "mall4cloud_delivery:"; + + /** + * 根据运费模板id获取运费模板的缓存key + */ + String TRANSPORT_BY_ID_PREFIX = DELIVERY_PREFIX + "transport:by_id:"; + + /** + * 根据运费模板id获取运费模板的缓存key + */ + String SAME_CITY_BY_ID_PREFIX = DELIVERY_PREFIX + "same_city:by_id:"; + + /** + * 店铺或者供应商仓库列表缓存key + */ + String SHOP_WAREHOUSE_LIST_PREFIX = DELIVERY_PREFIX + "shop_warehouse:list:"; + + + /** + * 店铺分类列表缓存key + */ + String AREA_KEY = DELIVERY_PREFIX + "area:"; + + /** + * 店铺分类列表缓存key + */ + String AREA_INFO_KEY = DELIVERY_PREFIX + "area_info:"; + + /** + * 网点信息列表缓存 + */ + String OUTLET_CONFIG_LIST_KEY = DELIVERY_PREFIX + "outlet_config_list:"; + + /** + * 打印机列表缓存 + */ + String PRINTER_LIST_KEY = DELIVERY_PREFIX + "printer_list:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DistributionCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DistributionCacheNames.java new file mode 100644 index 0000000..e5e7eaf --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/DistributionCacheNames.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author cl + * @date 2021-08-14 10:27:01 + */ +public interface DistributionCacheNames { + + /** + * + * 参考CacheKeyPrefix + * DistributionCacheNames 与 key 之间的默认连接字符 + */ + String UNION = "::"; + + /** + * 前缀 + */ + String DISTRIBUTION_PREFIX = "mall4cloud_distribution:"; + + /** + * 用户默认地址缓存key + */ + String DISTRIBUTION_INFO = DISTRIBUTION_PREFIX + "info:"; + + /** + * 根据userId缓存分销员的缓存key + */ + String DISTRIBUTION_USER_ID = DISTRIBUTION_PREFIX + "distribution_user:user_id:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/GroupCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/GroupCacheNames.java new file mode 100644 index 0000000..9d5b150 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/GroupCacheNames.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface GroupCacheNames { + + /** + * 前缀 + */ + String GROUP_PREFIX = "mall4cloud_group:"; + + /** + * 用户默认地址缓存key + */ + String GROUP_BY_SPU_KEY = GROUP_PREFIX + "group_by_spu:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LiveCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LiveCacheNames.java new file mode 100644 index 0000000..f0dddb6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LiveCacheNames.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author TRACK + */ +public interface LiveCacheNames { + + /** + * 直播间信息缓存 + */ + String LIVE_ROOM_INFO = "live:info:"; + + /** + * 直播间商品缓存 + */ + String LIVE_ROOM_PROD = "live:room_prod:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LockCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LockCacheNames.java new file mode 100644 index 0000000..3b425ae --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/LockCacheNames.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface LockCacheNames { + + /** + * 前缀 + */ + String LOCK_PREFIX = "mall4cloud_lock:"; + + /** + * 确认订单信息缓存 + */ + String LOCK_ORDER_PREFIX = LOCK_PREFIX + "order:"; + + /** + * 进行秒杀库存分片锁定的信息,seckillSkuId + */ + String LOCK_SECKILL_ZONE_PERFIX = LOCK_PREFIX + "seckill_zone:"; + + /** + * 进行优惠券库存分片锁定的信息,couponId + */ + String LOCK_COUPON_ZONE_PERFIX = LOCK_PREFIX + "coupon_zone:"; + /** + * 订单支付成功/取消后的分布式锁,userId + */ + String LOCK_SECKILL_ORDER_PAY_SUCCESS_PERFIX = LOCK_PREFIX + "seckill_order_pay_success:"; + /** + * 团购订单开团成功/取消后的分布式锁,userId + */ + String LOCK_GROUP_ORDER_SUCCESS_PERFIX = LOCK_PREFIX + "group_order_success:"; + + /** + * 退款超时|发放退款分布式锁,refundId + */ + String LOCK_REFUND_HANDLE_PREFIX = LOCK_PREFIX + "refund_handle:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/MultishopCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/MultishopCacheNames.java new file mode 100644 index 0000000..557e77e --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/MultishopCacheNames.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface MultishopCacheNames { + + /** + * 前缀 + */ + String MULTISHOP_PREFIX = "mall4cloud_multishop:"; + + /** + * 店铺分类列表缓存key + */ + String SHOP_DETAIL_ID_KEY = MULTISHOP_PREFIX + "shop_detail:getById:"; + + /** + * 开通通联支付的状态 + */ + String ALLINPAY_CONFIG_KEY = MULTISHOP_PREFIX + "allinpay_config:"; + + /** + * 店铺分类列表缓存key + */ + String INDEX_IMG_KEY = MULTISHOP_PREFIX + "index_img:"; + + /** + * 店铺分类列表缓存key + */ + String NOTICES_KEY = MULTISHOP_PREFIX + "notices:"; + + /** + * 店铺退货地址列表缓存key + */ + String SHOP_REFUND_ADDR = MULTISHOP_PREFIX + "shop_refund_addr:list:"; + + + String MULTISHOP_SIMPLE_INFO_KEY = MULTISHOP_PREFIX + "simple_info:"; + + + String HOT_SEARCH_LIST_KEY = MULTISHOP_PREFIX + "hot_search_list:"; + + String GET_BY_SHOP_RENOVATION_ID_KEY = MULTISHOP_PREFIX + "get_by_shop_renovation_id:"; + + String GET_SHOP_HOME_RENOVATION_KEY = MULTISHOP_PREFIX + "get_shop_home_renovation:"; + + String GET_BY_SHOP_TEMPLATE_ID_KEY = MULTISHOP_PREFIX + "get_by_shop_template_id:"; + + /** + * 店铺代销设置信息缓存 + */ + String SHOP_SUBSTITUTE_SALES_KEY = MULTISHOP_PREFIX + "shop_substitute_sales:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/OrderCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/OrderCacheNames.java new file mode 100644 index 0000000..aa7c137 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/OrderCacheNames.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface OrderCacheNames { + + /** + * 前缀 + */ + String ORDER_PREFIX = "mall4cloud_order:"; + + /** + * 确认订单信息缓存 + */ + String ORDER_CONFIRM_KEY = ORDER_PREFIX + "order:confirm"; + + /** + * 订单uuid + */ + String ORDER_CONFIRM_UUID_KEY = ORDER_PREFIX + "order:uuid_confirm"; + + /** + * 订单留存分析 + */ + String ORDER_TRADE_RETAINED_KEY = ORDER_PREFIX + "order:trade_retained"; + + /** + * 开通通联支付的状态 + */ + String ALLINPAY_CONFIG_KEY = ORDER_PREFIX + "allinpay_config:"; + + /** + * 单个商品退款时,主商品订单项对应的赠品订单项信息 + */ + String REFUND_GIVEAWAY_ORDER_ITEM = ORDER_PREFIX + "refund_giveaway_order_item:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/PaymentCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/PaymentCacheNames.java new file mode 100644 index 0000000..7fd1782 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/PaymentCacheNames.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author lanhai + */ +public interface PaymentCacheNames { + + /** + * 前缀 + */ + String PAYMENT_PREFIX = "mall4cloud_payment:"; + + /** + * 企业信息返回缓存 + */ + String COMPANY_INFO = PAYMENT_PREFIX + "company:info:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/RbacCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/RbacCacheNames.java new file mode 100644 index 0000000..6a22ecc --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/RbacCacheNames.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author FrozenWatermelon + * @date 2020/11/23 + */ +public interface RbacCacheNames { + + + /** + * 前缀 + */ + String RBAC_PREFIX = "mall4cloud_rbac:"; + + /** + * 所有权限列表缓存key + */ + String PERMISSIONS_KEY = RBAC_PREFIX + RBAC_PREFIX + "permission:permissions:"; + + /** + * 用户拥有的权限列表缓存key + */ + String USER_PERMISSIONS_KEY = RBAC_PREFIX + "permission:user_permissions:"; + + /** + * uri对应的权限缓存key + */ + String URI_PERMISSION_KEY = RBAC_PREFIX + "permission:uri_permissions:"; + + /** + * uri对应的权限缓存key + */ + String MENU_LIST_KEY = RBAC_PREFIX + "menu:list:"; + + /** + * 菜单id key + */ + String MENU_ID_LIST_KEY = RBAC_PREFIX + "menu:id_list:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/SeckillCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/SeckillCacheNames.java new file mode 100644 index 0000000..60bf2f3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/SeckillCacheNames.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author lhd + * @date 2021/03/31 + */ +public interface SeckillCacheNames { + + /** + * 前缀 + */ + String SECKILL_PREFIX = "mall4cloud_seckill:"; + + /** + * 秒杀信息 + */ + String SECKILL_BY_SECKILL_ID = SECKILL_PREFIX + "seckill_by_seckill_id:"; + + /** + * 秒杀sku信息 + */ + String SECKILL_SKU_BY_SECKILL_ID = SECKILL_PREFIX + "skulist_by_seckill_id:"; + + /** + * 秒杀sku信息 + */ + String SECKILL_SKU_BY_ID = SECKILL_PREFIX + "sku_by_id:"; + + /** + * 根据商品id获取秒杀信息 + */ + String SECKILL_BY_SPU_ID = "seckill_by_spu_id:"; + + String CATEGORY_LIST = SECKILL_PREFIX + "category:list:"; + + /** + * 秒杀sku库存信息 + */ + String SECKILL_SKU_STOCK = SECKILL_PREFIX + "sku_stock:"; + + /** + * 秒杀sku可用分片数量 + */ + String SECKILL_SKU_AVAILABLE_ZONE = SECKILL_PREFIX + "sku_available_zone:"; + /** + * 秒杀sku库存信息 + */ + public static final String STOCK = "stock:"; +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/SupplierCacheNames.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/SupplierCacheNames.java new file mode 100644 index 0000000..88dc735 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/constant/SupplierCacheNames.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.constant; + +/** + * @author Chiley + * @date 2022/7/15 17:30 + */ +public interface SupplierCacheNames { + /** + * 前缀 + */ + String SUPPLIER_PREFIX = "mall4cloud_supplier:"; + + /** + * 供应商店铺详情缓存key + */ + String SUPPLIER_DETAIL_ID_KEY = SUPPLIER_PREFIX + "shop_detail:getById:"; + + /** + * 开通通联支付的状态 + */ + String ALLINPAY_CONFIG_KEY = SUPPLIER_PREFIX + "allinpay_config:"; + + /** + * 供应商通知缓存key + */ + String SUPPLIER_NOTICES_KEY = SUPPLIER_PREFIX + "notices:"; + + /** + * 供应商退货地址列表缓存key + */ + String SUPPLIER_REFUND_ADDR = SUPPLIER_PREFIX + "shop_refund_addr:list:"; + + + String SUPPLIER_SIMPLE_INFO_KEY = SUPPLIER_PREFIX + "simple_info:"; + + + String SUPPLIER_HOT_SEARCH_LIST_KEY = SUPPLIER_PREFIX + "hot_search_list:"; + +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/manager/MultiRedisStockManager.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/manager/MultiRedisStockManager.java new file mode 100644 index 0000000..86e08e1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/manager/MultiRedisStockManager.java @@ -0,0 +1,729 @@ +package com.tmerclub.cloud.common.cache.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.cache.bo.MultiDecrementBO; +import com.tmerclub.cloud.common.cache.config.MultiRedisConfig; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.util.RedisLuaUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.util.Arith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.redis.core.*; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author LGH + */ +@Component +@ConditionalOnProperty(value = "redis.multi.enable", havingValue = "true") +public class MultiRedisStockManager { + + private static final Logger LOG = LoggerFactory.getLogger(MultiRedisStockManager.class); + + @Autowired + private MultiRedisConfig multiRedisConfig; + + public static final String STOCK = "stock:"; + public static final String RECEIVE = "receive:"; + + /** + * 库存不足 + */ + public static final String NOT_ENOUGH = "-1"; + /** + * 超过购买上限 + */ + public static final String MAX_RESULT = "-2"; + + /** + * 秒杀sku扣减库存 + */ + public static final byte[] SECKILL_DECREMENT_STOCK_BYTES = RedisLuaUtil.initByte("lua/multistock/SeckillSkuStock.lua"); + + /** + * 秒杀sku合并扣减库存 + */ + public static final byte[] SECKILL_MERGE_STOCK_BYTES = RedisLuaUtil.initByte("lua/multistock/SeckillSkuStockMerge.lua"); + + /** + * 秒杀锁定库存 + */ + public static final byte[] SECKILL_ORDER_STOCK_BYTES = RedisLuaUtil.initByte("lua/multistock/DecrementStock.lua"); + /** + * 秒杀订单取消,回退库存 + */ + public static final byte[] SECKILL_ORDER_CANCEL_STOCK_BYTES = RedisLuaUtil.initByte("lua/multistock/ReturnStock.lua"); + /** + * 秒杀订单支付成功,删除锁定信息,删除订单 + */ + public static final byte[] SECKILL_ORDER_PAY_SUCCESS_STOCK_BYTES = RedisLuaUtil.initByte("lua/multistock/PaySuccessToStock.lua"); + + /** + * 优惠券扣减库存 + */ + public static final byte[] COUPON_DECREMENT_STOCK_BYTES = RedisLuaUtil.initByte("lua/multistock/coupon/DecrementCouponStock.lua"); + + /** + * 优惠券还原库存 + */ + public static final byte[] COUPON_ROLLBACK_BYTES = RedisLuaUtil.initByte("lua/multistock/coupon/ReturnCouponStock.lua"); + + /** + * 优惠券删除,还原库存 + */ + public static final byte[] COUPON_ADD_STOCK_BYTES = RedisLuaUtil.initByte("lua/multistock/coupon/AddCouponStock.lua"); + + /** + * 进行分片,分片是啥意思呢?就是将一个1000个库存的秒杀商品,分到n个redis当中,每个redis有1000/n个库存,用户进行抢购的时候, + * 可以用到n个redis,性能相对一个redis提高n倍 + * @param totalStock 要分片的库存数量 + */ + public void doZone(MultiDecrementBO multiDecrementBO) { + int zoneNum = multiRedisConfig.getRedisCount(); + List stockPointList = multiDecrementBO.getStockPointList(); + // Map<对应redis编号, Map<仓库id, 库存数量>>, Map<仓库id, 库存数量>就是每个sku区域库存分片后的库存map + Map> map = new HashMap<>(); + for (String stockPointSkuVO: stockPointList) { + String[] split = stockPointSkuVO.split(String.valueOf(StrUtil.C_UNDERLINE)); + // 库存点id + Long stockPointId = Long.parseLong(split[0]); + // 库存点库存 + Integer totalStock = Integer.parseInt(split[1]); + // 每个分片至少的库存数量(目前是想分片出来的结果要么是这个数量,要么是0) + // 比如 ( 10,10,5,0,0,0,0,) 这种结果 + int avgStock = getAvgStock(zoneNum,totalStock); + // 获取要存进缓存的每个分片库存数量 + for (int i = 0; i < zoneNum; i++) { + Map stockMap = map.containsKey(i) ? map.get(i) : new HashMap<>(); + Integer stock = avgStock; + // 更新缓存 + if (totalStock <= avgStock) { + stock = totalStock; + } + // 每个区域的分片库存 + stockMap.put(stockPointId, stock); + map.put(i, stockMap); + } + } + // 计算总库存 + for (int i = 0; i < zoneNum; i++) { + Map stockMap = map.get(i); + // 计算当前redis中的sku总库存数量 + AtomicInteger skuStock = new AtomicInteger(); + stockMap.forEach((key, stock) -> { + skuStock.addAndGet(stock); + }); + stockMap.put(0L, skuStock.intValue()); + } + + // 批量保存 + for (int i = 0; i < zoneNum; i++) { + Map stockMap = map.get(i); + // + Map keyMap = new HashMap<>(); + // 转换为key,value + stockMap.forEach((point, stock) -> { + multiDecrementBO.setStockPointId(point); + keyMap.put(getStockKey(multiDecrementBO), String.valueOf(stock)); + }); + getStockOpsForValue(i).multiSet(keyMap); + } + } + + /** + * 进行分片,分片是啥意思呢?就是将一个1000个库存的秒杀商品,分到n个redis当中,每个redis有1000/n个库存,用户进行抢购的时候, + * 可以用到n个redis,性能相对一个redis提高n倍 + * @param totalStock 要分片的库存数量 + */ + public void doCouponZone(MultiDecrementBO multiDecrementBO, Integer totalStock) { + int zoneNum = multiRedisConfig.getRedisCount(); + + // 每个分片至少的库存数量(目前是想分片出来的结果要么是这个数量,要么是0) + // 比如 ( 10,10,5,0,0,0,0,) 这种结果 + int avgStock = getAvgStock(zoneNum, totalStock); + // 获取要存进缓存的每个分片库存数量 + for (int i = 0; i < zoneNum; i++) { + // 更新缓存 + if (totalStock - avgStock >= 0) { + getStockOpsForValue(i).set(getStockKey(multiDecrementBO), String.valueOf(avgStock)); + totalStock -= avgStock; + } else { + getStockOpsForValue(i).set(getStockKey(multiDecrementBO), String.valueOf(totalStock)); + totalStock = 0; + } + } + } + + private int getAvgStock(int zoneNum, Integer totalStock) { + // 每个分片可以分配的库存数量,可能小于10(这里的平均库存并不是真正的平均库存,因为这里进行了线上取整) + // 比如平均库存是 333.33 可以能会变成334 + int everyZoneStockRoundUp = Arith.divToRoundUp(totalStock, zoneNum); + + // 平均库存向上取整,因为就算是平均库存 + return Math.max(everyZoneStockRoundUp, 1); + } + + /** + * 扣减库存,返回扣减的分片id方便发mq的时候知道从哪里找到锁定的记录并且删除 + *

+ * 返回锁定记录所在的位置。因为redis有很多台,不知道这个锁定记录在哪里,所以要返回去,到时候生成订单成功的时候好把这条记录删掉 + */ + public void decrStocks(MultiDecrementBO multiDecrementBO) { + // 获取当前库存所使用的redis + int redisIndex = multiRedisConfig.getIndex(multiDecrementBO.getUserId()); + + // 1.通过分片扣减,如果没有扣减成功会抛异常 + String result = ""; + if (Objects.equals(multiDecrementBO.getMultiStockEnum(), MultiStockEnum.SECKILL)) { + result = reduceSeckillStockByZone(multiDecrementBO, redisIndex); + } + else if (Objects.equals(multiDecrementBO.getMultiStockEnum(), MultiStockEnum.COUPON)) { + result = reduceCouponStockByZone(multiDecrementBO, redisIndex); + } + // 扣减成功直接return + if (!NOT_ENOUGH.equals(result)) { + return; + } + + // 只有一台redis,没库存就是没库存了 + int redisCount = multiRedisConfig.getRedisCount(); + if (redisCount == 1) { + LOG.info("只有一台redis,没库存就是没库存了"); + throw new LuckException("库存不足"); + } + + // 2. 因为秒杀绝大部分是一件一件的买的,所以先判断一下是不是要买一件 + if (Objects.equals(multiDecrementBO.getProdCount(), 1)) { + LOG.info("扣减失败,尝试使用其他分片进行扣减,此次扣减数量为1,multiDecrementBO:{} ", multiDecrementBO); + decrementOtherRedis(multiDecrementBO, redisCount, redisIndex); + return; + } + + LOG.info("扣减失败,聚合扣减进行,multiDecrementBO:{} ", multiDecrementBO); + // 2.次分片无库存或扣减失败,聚合所有分片扣减库存 + // 2.1 统计所有库存数量还剩多少 + int totalStock = 0; + // 遍历redis + for (int i = 0; i < redisCount; i++) { + // 就是因为库存扣减失败才会来到这里,所以不用再从自己这里获取库存了 + if (redisIndex == i) { + continue; + } + int zoneStock = Integer.parseInt(Objects.requireNonNull(getStockOpsForValue(i).get(getStockKey(multiDecrementBO)))); + totalStock += zoneStock; + } + // 2.2 库存不够扣减了 + if (totalStock < multiDecrementBO.getProdCount()) { + LOG.info("扣减失败,尝试使用所有分片进行扣减,此次扣减数量为{},其他分片也无法完成,总库存剩余{} multiDecrementBO:{} ", multiDecrementBO.getProdCount(), totalStock, multiDecrementBO); + throw new LuckException("库存不足"); + } + + // 进行全redis的扣减 + decrementAllRedis(multiDecrementBO, redisCount, redisIndex); + } + + /** + * 获取秒杀有多少库存 + */ + public Integer getSeckillStock(MultiDecrementBO multiDecrementBO) { + int redisCount = multiRedisConfig.getRedisCount(); + + LOG.info("扣减失败,聚合扣减进行,multiDecrementBO:{} ", multiDecrementBO); + // 2.1 统计所有库存数量还剩多少 + int totalStock = 0; + // 遍历redis + for (int i = 0; i < redisCount; i++) { + multiDecrementBO.setStockPointId(multiDecrementBO.getStockPointId() == null ? 0L : multiDecrementBO.getStockPointId()); + String stockStr = getStockOpsForValue(i).get(getStockKey(multiDecrementBO)); + int zoneStock; + if (StrUtil.isNotBlank(stockStr)) { + zoneStock = Integer.parseInt(stockStr); + } else { + zoneStock = 0; + } + totalStock += zoneStock; + } + return totalStock; + } + + /** + * 获取优惠券库存 + */ + public Integer getCouponStock(MultiDecrementBO multiDecrementBO) { + int redisCount = multiRedisConfig.getRedisCount(); + + int totalStock = 0; + // 遍历redis + for (int i = 0; i < redisCount; i++) { + String stock = getStockOpsForValue(i).get(getStockKey(multiDecrementBO)); + if (Objects.isNull(stock)) { + // 缓存未创建 + return null; + } + int zoneStock = Integer.parseInt(stock); + totalStock += zoneStock; + } + return totalStock; + } + + /** + * 获取秒杀仓库有多少库存 + */ + public Map getSeckillStockPointMap(MultiDecrementBO multiDecrementBO) { + int redisCount = multiRedisConfig.getRedisCount(); + Map pointMap = new HashMap<>(); + LOG.info("扣减失败,聚合扣减进行,multiDecrementBO:{} ", multiDecrementBO); + // 2.1 统计所有库存数量还剩多少 + List stockPointList = multiDecrementBO.getStockPointList(); + for (String pointId : stockPointList) { + int totalStock = 0; + // 遍历redis + for (int i = 0; i < redisCount; i++) { + multiDecrementBO.setStockPointId(Long.parseLong(pointId)); + int zoneStock = Integer.parseInt(Objects.requireNonNull(getStockOpsForValue(i).get(getStockKey(multiDecrementBO)))); + totalStock += zoneStock; + } + pointMap.put(Long.parseLong(pointId), totalStock); + } + return pointMap; + } + + /** + * 通过分片扣减秒杀商品库存并记录日志 + */ + public String reduceSeckillStockByZone(MultiDecrementBO multiDecrementBO, Integer redisIndex) { + String result = RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(redisIndex), + SECKILL_ORDER_STOCK_BYTES, + Arrays.asList(multiDecrementBO.getCachePrefix(), + multiDecrementBO.getOrderId().toString(), + multiDecrementBO.getActivityId().toString(), + multiDecrementBO.getProdCount().toString(), + multiDecrementBO.getUserId().toString(), + multiDecrementBO.getOrderInfo(), + multiDecrementBO.getMaxNum().toString(), + multiDecrementBO.getSkuId().toString(), + multiDecrementBO.getStockPointId().toString() + ) + ); + + if (Objects.equals(result, MAX_RESULT)) { + throw new LuckException("已经到达购买上限"); + } + return result; + } + + /** + * 通过分配扣减优惠券库存并记录日志 + */ + public String reduceCouponStockByZone(MultiDecrementBO multiDecrementBO, Integer redisIndex) { + String result = RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(redisIndex), + COUPON_DECREMENT_STOCK_BYTES, + Arrays.asList(multiDecrementBO.getCachePrefix(), + multiDecrementBO.getOrderId().toString(), + multiDecrementBO.getActivityId().toString(), + multiDecrementBO.getProdCount().toString(), + multiDecrementBO.getUserId().toString(), + multiDecrementBO.getMaxNum().toString())); + + if (Objects.equals(result, MAX_RESULT)) { + throw new LuckException("该优惠券已达个人领取上限,无法继续领取"); + } + return result; + } + + /** + * 获取用户的秒杀商品购买数量 + */ + public Integer getSeckillProdBuyCount(MultiDecrementBO multiDecrementBO) { + // 获取当前key所使用的redis + int redisIndex = multiRedisConfig.getIndex(multiDecrementBO.getUserId()); + String key = MultiStockEnum.SECKILL.value() + "buy:" + multiDecrementBO.getActivityId() + StrUtil.C_UNDERLINE + multiDecrementBO.getUserId(); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(redisIndex); + String count = stringRedisTemplate.opsForValue().get(key); + if (StrUtil.isBlank(count)) { + return 0; + } + return Integer.valueOf(count); + } + + /** + * 获取用户优惠券领券数量 + */ + public Integer getCouponReceiveCount(Long userId, Long activityId) { + // 获取当前key所使用的redis + int redisIndex = multiRedisConfig.getIndex(userId); + String key = MultiStockEnum.COUPON.value() + RECEIVE + activityId + StrUtil.C_UNDERLINE + userId; + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(redisIndex); + String count = stringRedisTemplate.opsForValue().get(key); + if (StrUtil.isBlank(count)) { + return null; + } + return Integer.valueOf(count); + } + + /** + * 初始用户优惠券领券数量,兼容旧数据 + */ + public void setCouponReceiveCount(Long userId, Long activityId, Long receiveCount) { + int redisIndex = multiRedisConfig.getIndex(userId); + String key = MultiStockEnum.COUPON.value() + RECEIVE + activityId + StrUtil.C_UNDERLINE + userId; + getStockOpsForValue(redisIndex).set(key, String.valueOf(receiveCount)); + } + + /** + * 扣减其他redis的库存,但是扣减记录和订单的记录还是在userId的hash上 + */ + private void decrementOtherRedis(MultiDecrementBO multiDecrementBO, int redisCount, int redisIndex) { + // 遍历redis + for (int i = 0; i < redisCount; i++) { + // 就是因为库存扣减失败才会来到这里,所以不用再从自己这里扣库存了 + if (redisIndex == i) { + continue; + } + // 扣减其他redis的库存 + String hasStock = RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(i), + SECKILL_DECREMENT_STOCK_BYTES, + Arrays.asList( + // TODO stock sku总库存和sku区域库存的key + getStockKey(multiDecrementBO), + getStockKey(multiDecrementBO), + // 要扣除的库存数量 + multiDecrementBO.getProdCount().toString() + )); + + if (StrUtil.isBlank(hasStock) && Long.parseLong(hasStock) < 0) { + continue; + } +// // dev +// // 扣减其他redis的库存 +// Long hasStock = multiRedisConfig.getRedisByIndex(i).execute(new DefaultRedisScript<>(RedisLuaUtil.DECREMENT_SCRIPT, Long.class), +// Collections.singletonList(getStockKey(multiDecrementBO)), +// multiDecrementBO.getProdCount().toString()); +// if (hasStock != null && hasStock < 0) { +// continue; +// } + LOG.info("扣减失败,尝试使用其他分片进行扣减,此次扣减数量为1,在redisIndex:{} 完成扣减 multiDecrementBO: {}", redisIndex, multiDecrementBO); + try { + // 但是扣减记录和订单的记录还是在userId的hash上 + // 此处应该要把商品数量变为0,因为在上一步已经扣除过库存了 + multiDecrementBO.setProdCount(0); + if (Objects.equals(multiDecrementBO.getMultiStockEnum(), MultiStockEnum.SECKILL)) { + reduceSeckillStockByZone(multiDecrementBO, redisIndex); + } + else if (Objects.equals(multiDecrementBO.getMultiStockEnum(), MultiStockEnum.COUPON)) { + reduceCouponStockByZone(multiDecrementBO, redisIndex); + } + } catch (Exception e) { + e.printStackTrace(); + // 因为这个秒杀并发很高,所以很可能根本就没扣库存,就库存不足了,所以只还原已经扣了库存的redis + RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(i), + SECKILL_DECREMENT_STOCK_BYTES, + Arrays.asList( + // TODO stock sku总库存和sku区域库存的key + getStockKey(multiDecrementBO), + getStockKey(multiDecrementBO), + // 增加回库存,所以是负数 + String.valueOf(-1) + )); + throw e; + } + return; + } + LOG.info("扣减失败,尝试使用其他分片进行扣减,此次扣减数量为1,其他分片也无法完成,均无库存 multiDecrementBO: {}", multiDecrementBO); + throw new LuckException("库存不足"); + } + + + /** + * 逐个扣减redis的库存,但是扣减记录和订单的记录还是在userId的hash上 + */ + private void decrementAllRedis(MultiDecrementBO multiDecrementBO, int redisCount, int redisIndex) { + //1.执行多个分片的扣除扣减,对该商品的库存操作上锁,保证原子性 + Map fallbackMap = new HashMap<>(redisCount); + // 记录下来需要扣减的总库存,后面要使用,用int类型,防止对象被改变 + int totalNeedDecrementStock = multiDecrementBO.getProdCount(); + Integer prodCount = multiDecrementBO.getProdCount(); + try { + // 开始循环扣减库存 + for (int i = 0; i < redisCount; i++) { + + // 负数代表还欠多少库存没扣减 + String hasStock = RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(i), + SECKILL_MERGE_STOCK_BYTES, + Arrays.asList( + // TODO stock sku总库存和sku区域库存的key + getStockKey(multiDecrementBO), + getStockKey(multiDecrementBO), + prodCount.toString() + ) + ); + // 如果这个分片本身的库存为0,这里有问题? + // 库存足够了 + if (Objects.nonNull(hasStock) && Integer.parseInt(hasStock) >= 0) { + // dev +// if (hasStock >= 0) { + LOG.info("扣减失败,尝试使用所有分片进行扣减,总共需要扣减{} 此次扣减数量为{},扣减足够结束扣减。 multiDecrementBO: {}",totalNeedDecrementStock, prodCount, multiDecrementBO); + // 记住当前扣减的库存数量,防止最终程序出现异常进行回滚 + fallbackMap.put(i, prodCount); + prodCount = 0; + break; + } + + // 剩余需要扣的库存数量 + int needDecrementStock = -Integer.parseInt(hasStock); + + // 记录日志, + LOG.info("扣减失败,尝试使用所有分片进行扣减,总共需要扣减{} 此次扣减数量为{},不足扣减,剩余扣减数量为{}。 multiDecrementBO: {}", totalNeedDecrementStock, prodCount, needDecrementStock, multiDecrementBO); + // 记住当前扣减的库存数量,发现不够扣的时候可以还原回滚 + fallbackMap.put(i, prodCount - needDecrementStock); + + prodCount = needDecrementStock; + } + + // 成功通过多个redis扣减完全部的库存 + if (prodCount == 0) { + multiDecrementBO.setProdCount(0); + // 但是扣减记录和订单的记录还是在userId的hash上 + if (Objects.equals(multiDecrementBO.getMultiStockEnum(), MultiStockEnum.SECKILL)) { + reduceSeckillStockByZone(multiDecrementBO, redisIndex); + } + else if (Objects.equals(multiDecrementBO.getMultiStockEnum(), MultiStockEnum.COUPON)) { + reduceCouponStockByZone(multiDecrementBO, redisIndex); + } + return; + } + + throw new LuckException("库存不足"); + + } catch (Exception e) { + e.printStackTrace(); + // 完全扣除所有的分片库存后,还是未清零,则回退库存返回各自分区 + fallbackMap.forEach((k, v) -> { + // 因为这个秒杀并发很高,所以很可能根本就没扣库存,就库存不足了,所以只还原已经扣了库存的redis + if (v != 0){ + RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(k), + SECKILL_DECREMENT_STOCK_BYTES, + Arrays.asList( + // TODO stock sku总库存和sku区域库存的key + getStockKey(multiDecrementBO), + getStockKey(multiDecrementBO), + // 增加回库存,所以是负数 + String.valueOf(-v) + ) + ); + } +// // dev +// // 因为这个秒杀并发很高,所以很可能根本就没扣库存,就库存不足了,所以只还原已经扣了库存的redis +// if (v != 0) { +// multiRedisConfig.getRedisByIndex(k).execute(new DefaultRedisScript<>(RedisLuaUtil.DECREMENT_SCRIPT, Long.class), +// Collections.singletonList(getStockKey(multiDecrementBO)), +// // 增加回库存,所以是负数 +// String.valueOf(-v)); +// } + }); + throw e; + } + } + + /** + * 因为库存需要长期增减,所以用到所有的redis,每个redis都扣减或者新增 + */ + private ValueOperations getStockOpsForValue(int i) { + return multiRedisConfig.getRedisByIndex(i).opsForValue(); + } + + + /** + * 获取库存的key + */ + private static String getStockKey(MultiDecrementBO multiDecrementBO) { + String key = multiDecrementBO.getCachePrefix() + STOCK + multiDecrementBO.getActivityId() + StrUtil.C_UNDERLINE + multiDecrementBO.getSkuId(); + if (Objects.nonNull(multiDecrementBO.getStockPointId()) && multiDecrementBO.getStockPointId() > 0) { + key = key + StrUtil.C_UNDERLINE + multiDecrementBO.getStockPointId(); + } + return key; + } + + /** + * 取消订单,还原秒杀库存 + */ + public void rollbackSecKillStock(Long activityId, Long skuId, Integer count, Long orderId, Long userId, Integer zoneNo, Long stockPointId) { + // 幂等保证,还是写成lua比较好 + // 获取当前库存所使用的redis + int redisIndex = multiRedisConfig.getIndex(userId); + RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(redisIndex), + SECKILL_ORDER_CANCEL_STOCK_BYTES, + Arrays.asList(MultiStockEnum.SECKILL.value(), + orderId.toString(), + activityId.toString(), + count.toString(), + userId.toString(), + skuId.toString(), + stockPointId.toString())); + } + + /** + * 领券失败,还原优惠券库存 + */ + public void rollbackCouponStock(MultiDecrementBO multiDecrementBO) { + int redisIndex = multiRedisConfig.getIndex(multiDecrementBO.getUserId()); + RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(redisIndex), + COUPON_ROLLBACK_BYTES, + Arrays.asList(multiDecrementBO.getCachePrefix(), + multiDecrementBO.getOrderId().toString(), + multiDecrementBO.getActivityId().toString(), + multiDecrementBO.getProdCount().toString(), + multiDecrementBO.getUserId().toString(), + multiDecrementBO.getSkuId().toString())); + } + + /** + * 订单支付成功时,删除订单和订单锁定信息 + * @param count + * @param orderId + * @param userId + */ + public void handlePaySuccessSecKillStock(Integer count, Long orderId, Long userId) { + int redisIndex = multiRedisConfig.getIndex(userId); + RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(redisIndex), + SECKILL_ORDER_PAY_SUCCESS_STOCK_BYTES, + Arrays.asList(MultiStockEnum.SECKILL.value(), + orderId.toString(), + count.toString(), + userId.toString())); + } + + /** + * 领券记录存储成功,删除优惠券锁定信息 + */ + public void handleReceiveSuccessCouponStock(Long orderId, Long userId, Long couponId) { + int redisIndex = multiRedisConfig.getIndex(userId); + String key = MultiStockEnum.COUPON.value() + "lock:" + couponId + Constant.UNDERLINE + userId + Constant.UNDERLINE + orderId; + // 删除锁定记录 + try { + multiRedisConfig.getRedisByIndex(redisIndex).delete(key); + } catch (Exception e) { + LOG.error("锁定记录删除失败{},原因{}", key, e.getMessage()); + } + } + + /** + * 删除优惠券,还原优惠券库存 + */ + public void addCouponStock(MultiDecrementBO multiDecrementBO) { + int redisIndex = multiRedisConfig.getIndex(multiDecrementBO.getUserId()); + RedisLuaUtil.executeList(multiRedisConfig.getRedisByIndex(redisIndex), + COUPON_ADD_STOCK_BYTES, + Arrays.asList(multiDecrementBO.getCachePrefix(), + multiDecrementBO.getOrderId().toString(), + multiDecrementBO.getActivityId().toString(), + multiDecrementBO.getProdCount().toString(), + multiDecrementBO.getUserId().toString(), + multiDecrementBO.getSkuId().toString())); + } + + public Set handleOutTimeSeckillOrder(String orderKeyCachePrefix, StringRedisTemplate stringRedisTemplate) { + List list = new ArrayList<>(); + Integer count = 0; + while (true) { + List result = stringRedisTemplate.execute(new DefaultRedisScript<>(RedisLuaUtil.GET_CANCEL_ORDER_SCRIPT, List.class), + Collections.singletonList(orderKeyCachePrefix), + count.toString()); + // 第一个是count,第二个是list,如果直接每次都是从0开始scan这里就有问题,所以在使用scan命令的时候,需要迭代的遍历, + // 每次调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。 + count = Integer.valueOf(result.get(0).toString()); + list = (List) result.get(1); + if (count == 0 || list.size() == 0) { + break; + } + } + // 可能有重复的,去除一下 + return new HashSet<>(list); + } + + /** + * 优惠券取消投放,删除缓存 + */ + public void removeCancelPutCouponKey(List couponIds) { + int redisCount = multiRedisConfig.getRedisCount(); + String couponReceiveKey = MultiStockEnum.COUPON.value() + RECEIVE; + for (int i = 0; i < redisCount; i++) { + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(i); + for (Long couponId : couponIds) { + // 库存key + String couponStockKey = MultiStockEnum.COUPON.value() + STOCK + couponId + StrUtil.C_UNDERLINE + couponId; + keys.add(couponStockKey); + // 用户领券数量key + List list = RedisUtil.hScan(stringRedisTemplate, couponReceiveKey + couponId + Constant.UNDERLINE); + if (CollUtil.isEmpty(list)) { + continue; + } + keys.addAll(list); + } + stringRedisTemplate.delete(keys); + } + } + public Map> scan(String key) { + Map> stockMap = new HashMap<>(); + int redisCount = multiRedisConfig.getRedisCount(); + for (int i = 0; i < redisCount; i++) { + Map keyMap = new HashMap<>(); + stockMap.put(i, keyMap); + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(i); + + Cursor cursor = null; + try { + List keys = new ArrayList<>(); + ScanOptions options = ScanOptions.scanOptions() + .count(1000) + .match(key + "*") + .build(); + RedisSerializer redisSerializer = (RedisSerializer) stringRedisTemplate.getKeySerializer(); + cursor = stringRedisTemplate.executeWithStickyConnection(redisConnection -> + new ConvertingCursor<>(redisConnection.keyCommands().scan(options), redisSerializer::deserialize)); + if(Objects.isNull(cursor)){ + continue; + } + while (cursor.hasNext()) { + keys.add(cursor.next()); + } + if (keys.isEmpty()) { + continue; + } + List values = stringRedisTemplate.opsForValue().multiGet(keys); + for (int j = 0; j < keys.size(); j++) { + String stock = values.get(j); + if (StrUtil.isNotBlank(stock)) { + keyMap.put(keys.get(j), stock); + } + } + } finally { + if(Objects.nonNull(cursor)) { + cursor.close(); + } + } + } + return stockMap; + } + + public void mset(Integer index, Map msetMap) { + if (MapUtil.isEmpty(msetMap)) { + return; + } + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(index); + stringRedisTemplate.opsForValue().multiSet(msetMap); + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/CacheManagerUtil.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/CacheManagerUtil.java new file mode 100644 index 0000000..e375e39 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/CacheManagerUtil.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.util; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.common.cache.config.RedisCacheConfig; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.CacheManager; +import org.springframework.stereotype.Component; + +/** + * @author FrozenWatermelon + * @date 2020/09/03 + */ +@Component +public class CacheManagerUtil { + + private final CacheManager cacheManager; + + @Autowired + public CacheManagerUtil(CacheManager cacheManager) { + this.cacheManager = cacheManager; + } + + public T getCache(String cacheName, String key, Class clazz) { + String data = RedisUtil.get(cacheName + CacheNames.UNION + key); + return JSON.parseObject(data, clazz); + } + + public void putCache(String cacheName, String key, Object value) { + RedisUtil.set(cacheName + CacheNames.UNION + key, JSON.toJSONString(value), RedisCacheConfig.SECONDS); + } + + public void evictCache(String cacheName, String key) { + RedisUtil.del(cacheName + CacheNames.UNION + key); + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/RedisLuaUtil.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/RedisLuaUtil.java new file mode 100644 index 0000000..0562bc1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/RedisLuaUtil.java @@ -0,0 +1,142 @@ +package com.tmerclub.cloud.common.cache.util; + +import cn.hutool.core.util.StrUtil; +import org.springframework.core.io.ClassPathResource; +import org.springframework.data.redis.connection.ReturnType; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.scripting.ScriptSource; +import org.springframework.scripting.support.ResourceScriptSource; + +import java.util.List; + +/** + * @author LGH + */ +public class RedisLuaUtil { + + /** + * 扣减库存(必须足够扣除的时候才会扣除,如果不够扣除返回负数,如果足够扣除返回剩余库存数量,否则不进行扣减) + */ + public static final String DECREMENT_SCRIPT = + "local stock = tonumber(redis.call('get', KEYS[1]))" + + "local num = tonumber(ARGV[1])" + + "local canUse = (stock - num)" + + "if (canUse < 0) then" + + " return -1 " + + "end " + + "redis.call('set', KEYS[1], canUse)" + + "return canUse"; + + /** + * 合并扣减库存,在通过合并扣减库存的时候,无论库存有多少都会扣减,直到扣减到0为止,返回扣减的数量 + */ + public static final String MERGE_SCRIPT = + "local stock = tonumber(redis.call('get', KEYS[1]))" + + "if (stock == 0) then" + + " return 0" + + "end" + + "local num = tonumber(ARGV[1])" + + "local canUse = stock - num" + + "if (canUse > 0) then" + + " redis.call('set', KEYS[1], canUse)" + + "else" + // 直到扣减到0为止 + + " redis.call('set', KEYS[1], 0)" + + "end" + + "return canUse"; + /** + * 用scan命令来获取所有的lock的订单key + * -- 返回每次的游标用于下次循环 + * return resp + */ + public static final String GET_CANCEL_ORDER_SCRIPT = + "local cachePrefix = KEYS[1]" + + "local index = tonumber(ARGV[1])" + + "local resp = redis.call('SCAN',index,'MATCH',cachePrefix,'COUNT',10000)" + // 返回每次的游标和数据用于下次循环,数组resp[1]是游标,resp[2]是数据 + + "return resp"; + + /** + * 将脚本初始化为byte数组,方便后续传输 + * 静态参数,仅在启动服务时初始化一次 + */ + public static byte[] initByte(String luaPath){ + DefaultRedisScript script = new DefaultRedisScript<>(); + //读取脚本文件,设置到script对象 + ClassPathResource resource = new ClassPathResource(luaPath); + ScriptSource scriptSource = new ResourceScriptSource(resource); + script.setScriptSource(scriptSource); + String scriptAsString = script.getScriptAsString(); + // 匹配替换掉lua中所有的注释、换行、多个空格,可以减少1/2到2/3的字节 + // 删除所有注释 + String luaData = scriptAsString.replaceAll("--.*", ""); + // 匹配多个空白字符替换成一个空格 + luaData = luaData.replaceAll("(\r)+", " "); +// System.out.println("文件名称:" + luaPath); +// System.out.println("正则替换前的字节长度:" + scriptAsString.getBytes().length); +// System.out.println("正则替换后的字节长度:" + luaData.getBytes().length); + return luaData.getBytes(); + } + + /** + * 根据脚本执行结果返回一个字符串 + */ + public static String execute(StringRedisTemplate stringRedisTemplate, byte[] script, List dataList) { + byte[][] bss = getRequestBytes(dataList); + + return stringRedisTemplate.execute((RedisCallback) connection -> { + //执行Lua + byte[] result = connection.eval(script, + ReturnType.fromJavaType(byte.class), + dataList.size(), + bss); + return result == null ? null : new String(result); + }); + } + + /** + * 真正调用redis来执行Lua的参数转换成bytes + */ + public static byte[][] getRequestBytes(List dataList) { + + int byteSize = dataList.size(); + + byte[][] bss = new byte[byteSize][]; + + for (int i = 0; i < byteSize; i++) { + String[] arrays = dataList.get(i); + StringBuilder stringBuilder = new StringBuilder(); + for (int j = 0; j < arrays.length; j++) { + // 第一个数据不需要拼接符号,后面的需要 + if (j != 0) { + stringBuilder.append(StrUtil.C_UNDERLINE); + } + stringBuilder.append(arrays[j]); + } + bss[i] = stringBuilder.toString().getBytes(); + } + return bss; + } + + /** + * 根据脚本执行结果返回一个字符串 + */ + public static String executeList(StringRedisTemplate stringRedisTemplate, byte[] script, List dataList) { + int byteSize = dataList.size(); + byte[][] bss = new byte[byteSize][]; + for (int i = 0; i < byteSize; i++) { + bss[i] = dataList.get(i).getBytes(); + } + + return stringRedisTemplate.execute((RedisCallback) connection -> { + //执行Lua + byte[] result = connection.eval(script, + ReturnType.fromJavaType(byte.class), + dataList.size(), + bss); + return result == null ? null : new String(result); + }); + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/RedisUtil.java b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/RedisUtil.java new file mode 100644 index 0000000..3d5f8e8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/java/com/tmerclub/cloud/common/cache/util/RedisUtil.java @@ -0,0 +1,526 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.cache.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.util.SpringContextUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.*; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.RedisSerializer; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/7/11 + */ +public class RedisUtil { + + private static final Logger logger = LoggerFactory.getLogger(RedisUtil.class); + + @SuppressWarnings("unchecked") + private static final RedisTemplate REDIS_TEMPLATE = SpringContextUtils.getBean("redisTemplate", + RedisTemplate.class); + + public static final StringRedisTemplate STRING_REDIS_TEMPLATE = SpringContextUtils.getBean("stringRedisTemplate", + StringRedisTemplate.class); + + public static final String CAD_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + + // =============================common============================ + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + */ + public static void expire(String key, long time) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + try { + if (time > 0) { + REDIS_TEMPLATE.expire(key, time, TimeUnit.SECONDS); + } + } catch (Exception e) { + logger.error("Set expire error: {}", e.getMessage()); + } + } + + /** + * 根据key 获取过期时间 + * @param key 键 不能为null + * @return 时间(秒) 返回-1代表为永久有效 失效时间为0,说明该主键未设置失效时间(失效时间默认为-1) + */ + public static Long getExpire(String key) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return REDIS_TEMPLATE.getExpire(key, TimeUnit.SECONDS); + } + + + /** + * 判断key是否存在 + * @param key 键 + * @return true 存在 false 不存在 + */ + public static Boolean hasKey(String key) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + try { + return REDIS_TEMPLATE.hasKey(key); + } catch (Exception e) { + logger.error("Error getting hasKey: {}", e.getMessage()); + return Boolean.FALSE; + } + } + + /** + * 删除缓存 + * @param key 可以传一个值 或多个 + */ + public static void del(String... key) { + if (key != null && key.length > 0) { + for (String s : key) { + if (s.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + if (key.length == 1) { + REDIS_TEMPLATE.delete(key[0]); + } else { + REDIS_TEMPLATE.delete(Arrays.asList(key)); + } + } + } + + /** + * 删除缓存 + * @param keys 可以传一个值 或多个 + */ + public static void del(List keys) { + if (CollUtil.isEmpty(keys)) { + return; + } + REDIS_TEMPLATE.delete(keys); + } + + // ============================String============================= + + /** + * 普通缓存获取 + * @param key 键 + * @return 值 + */ + @SuppressWarnings("unchecked") + public static T get(String key) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return (T) REDIS_TEMPLATE.opsForValue().get(key); + } + /** + * 批量缓存获取 + * @param keys 键 + * @return 值 + */ + @SuppressWarnings("unchecked") + public static List list(Collection keys) { + for (String key : keys) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + return (List) STRING_REDIS_TEMPLATE.opsForValue().multiGet(keys); + } + /** + * 批量缓存获取 + * @param keyName 键名 + * @param ids + * @return 值 + */ + @SuppressWarnings("unchecked") + public static Map mapByIds(String keyName, List ids, Class tClass) { + ids = CollUtil.distinct(ids); + List keys = new ArrayList<>(ids.size()); + for (Long id : ids) { + keys.add(keyName + CacheNames.UNION + id); + } + Map map = new HashMap<>(Constant.INITIAL_CAPACITY); + for (Object o : STRING_REDIS_TEMPLATE.opsForValue().multiGet(keys)) { + Long id = ids.remove(0); + if (o != null) { + T t = JSONObject.parseObject(o.toString(), tClass); + map.put(id, t); + } + } + return map; + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + */ + public static void set(String key, Object value, long time) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + try { + if (time > 0) { + REDIS_TEMPLATE.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + REDIS_TEMPLATE.opsForValue().set(key, value); + } + } catch (Exception e) { + logger.error("Redis opsForValue error: {}", e.getMessage()); + } + } + + /** + * list缓存放入并设置时间 + * + * @param key 键 + * @param list 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + public static void setRightPushAll(String key, List list, long time) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + try { + if (time > 0) { + REDIS_TEMPLATE.opsForList().rightPushAll(key, list); + expire(key, time); + } else { + REDIS_TEMPLATE.opsForList().rightPushAll(key, list); + } + } catch (Exception e) { + logger.error("Redis opsForList error: {}", e.getMessage()); + } + } + + /** + * 获取list缓存的size + * @param key 键 + * @return true成功 false 失败 + */ + public static Long getListSize(String key) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + try { + return REDIS_TEMPLATE.opsForList().size(key); + } catch (Exception e) { + logger.error("Redis opsForList error: {}", e.getMessage()); + return 0L; + } + } + + /** + * 根据key 获取list指定范围的内容 + * @param key 键 不能为null + * @param start + * @param end + * @return 时间(秒) 返回-1代表为永久有效 失效时间为0,说明该主键未设置失效时间(失效时间默认为-1) + */ + @SuppressWarnings("rawtypes") + public static List getListRange(String key, Long start, Long end) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return REDIS_TEMPLATE.opsForList().range(key, start, end); + } + + /** + * map放入缓存,HMSET操作 + * @param key 键 不能为null + * @param map + */ + public static void hmSet(StringRedisTemplate redisTemplate, String key, Map map) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if(Objects.nonNull(redisTemplate)){ + redisTemplate.opsForHash().putAll(key, map); + }else { + STRING_REDIS_TEMPLATE.opsForHash().putAll(key, map); + } + } + + /** + * field放入缓存,HSET操作 + * @param key 键 不能为null + * @param hashKey + * @param value + */ + public static void hSet(StringRedisTemplate redisTemplate, String key, String hashKey, String value) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if(Objects.nonNull(redisTemplate)){ + redisTemplate.opsForHash().put(key, hashKey, value); + }else { + STRING_REDIS_TEMPLATE.opsForHash().put(key, hashKey, value); + } + } + + /** + * 删除map缓存中的键值对 + * @param key 键 不能为null + * @param hashKeys + */ + public static void hDelete(StringRedisTemplate redisTemplate, String key, Object... hashKeys) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if(Objects.nonNull(redisTemplate)){ + redisTemplate.opsForHash().delete(key, hashKeys); + }else { + STRING_REDIS_TEMPLATE.opsForHash().delete(key, hashKeys); + } + } + + /** + * map缓存获取,HGET操作 + * @param key 键 不能为null + * @param hashKey + */ + public static Object hGet(StringRedisTemplate redisTemplate, String key, String hashKey) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if(Objects.nonNull(redisTemplate)){ + return redisTemplate.opsForHash().get(key, hashKey); + }else { + return STRING_REDIS_TEMPLATE.opsForHash().get(key, hashKey); + } + } + + + /** + * 获取field有多少个 + * @param key 键 不能为null + * @return 数量 + */ + public static Long hSize(StringRedisTemplate redisTemplate, String key) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if(Objects.nonNull(redisTemplate)){ + return redisTemplate.opsForHash().size(key); + }else { + return STRING_REDIS_TEMPLATE.opsForHash().size(key); + } + } + + /** + * 获取所有的field和value, + * @param key 键 不能为null + * @return 所有field + */ + public static Map entries(StringRedisTemplate redisTemplate, String key) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if(Objects.nonNull(redisTemplate)){ + return redisTemplate.opsForHash().entries(key); + }else { + return STRING_REDIS_TEMPLATE.opsForHash().entries(key); + } + } + + /** + * 获取模糊匹配的的所有key + * @return 所有field + */ + public static List hScan(StringRedisTemplate redisTemplate,String cachePrefix) { + if(Objects.nonNull(redisTemplate)){ + Cursor cursor = null; + List list = new ArrayList<>(); + try { + ScanOptions options = ScanOptions.scanOptions() + .count(1000) + .match(cachePrefix + "*") + .build(); + RedisSerializer redisSerializer = (RedisSerializer) redisTemplate.getKeySerializer(); + cursor = redisTemplate.executeWithStickyConnection(redisConnection -> + new ConvertingCursor<>(redisConnection.scan(options), redisSerializer::deserialize)); + if(Objects.isNull(cursor)){ + return list; + } + while (cursor.hasNext()) { + list.add(cursor.next()); + } + return list; + } finally { + if(Objects.nonNull(cursor)) { + cursor.close(); + } + } + } + return new ArrayList<>(); + } + + + /** + * 递增 此时value值必须为int类型 否则报错 + * @param key 键 + * @param delta 要增加几(大于0) + * @return 自增后的值 + */ + public static Long incr(String key, long delta) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return STRING_REDIS_TEMPLATE.opsForValue().increment(key, delta); + } + + /** + * 递减 + * + * @param key 键 + * @param delta 要减少几(小于0) + */ + public static void decr(String key, long delta) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if (delta < 0) { + throw new RuntimeException("递减因子必须小于0"); + } + STRING_REDIS_TEMPLATE.opsForValue().increment(key, -delta); + } + + public static void setLongValue(String key, Long value, long time) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + try { + if (time > 0) { + STRING_REDIS_TEMPLATE.opsForValue().set(key, String.valueOf(value), time, TimeUnit.SECONDS); + } else { + STRING_REDIS_TEMPLATE.opsForValue().set(key, String.valueOf(value)); + } + } catch (Exception e) { + logger.error("setLongValue() error: {}", e.getMessage()); + } + } + + /** + * 普通缓存获取 + * @param key 键 + * @return 值 + */ + public static Long getLongValue(String key) { + if (key == null) { + return null; + } + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + String result = STRING_REDIS_TEMPLATE.opsForValue().get(key); + if (result == null) { + return null; + } + return Long.valueOf(result); + } + + /** + * 批量删除缓存 + * @param keys + */ + public static void deleteBatch(List keys) { + if (CollUtil.isEmpty(keys)) { + return; + } + for (String key : keys) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + REDIS_TEMPLATE.delete(keys); + } + + /** + * 批量删除缓存 + * @param cacheName 缓存名 + * @param cacheKeys 缓存key + */ + public static void deleteBatch(String cacheName, List cacheKeys) { + if (StrUtil.isBlank(cacheName) || CollUtil.isEmpty(cacheKeys)) { + return; + } + List strCacheKeys = cacheKeys.stream().map(Object::toString).collect(Collectors.toList()); + List keys = new ArrayList<>(1); + for (String cacheKey : strCacheKeys) { + String key = cacheName + CacheNames.UNION + cacheKey; + keys.add(key); + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + REDIS_TEMPLATE.delete(keys); + } + + /** + * 比较和删除标记,原子性 + * @return 是否成功 + */ + public static boolean cad(String key, String value) { + + if (key.contains(StrUtil.SPACE) || value.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + + //通过lure脚本原子验证令牌和删除令牌 + Long result = eval(CAD_SCRIPT, key, value, Long.class); + + return !Objects.equals(result, 0L); + } + + public static Set keys(String pattern) { + throw new RuntimeException("请不要使用keys"); + } + + /** + * 比较和删除标记,原子性 + * @return 是否成功 + */ + public static T eval(String script, String key, String arg, Class resultType) { + if (key.contains(StrUtil.SPACE) || arg.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + return STRING_REDIS_TEMPLATE.execute(new DefaultRedisScript<>(script, resultType), + Collections.singletonList(key), + arg); + } +} diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/PaySuccessToStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/PaySuccessToStock.lua new file mode 100644 index 0000000..413a627 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/PaySuccessToStock.lua @@ -0,0 +1,19 @@ +-- 订单支付成功时,删除订单和订单锁定信息,对于redis来说,lua是原子性的,有事务的 + +-- 检验库存信息 这里的key是 +local cachePrefix = KEYS[1] +local orderId = KEYS[2] +local prodCount = tonumber(KEYS[3]) +local userId = KEYS[4] + + +-- 删除订单锁定记录,删除订单 +if (redis.call('exists', cachePrefix.."lock:"..orderId, tostring(prodCount)) == "1") then + local isDelete = redis.call('del', cachePrefix.."lock:"..orderId) + -- 删除锁定标记成功才进行还原购买数量,让方法幂等 + if isDelete > 0 then + -- 删除订单记录map key=userId value={(status+订单id):1未付款, (info+订单id):orderInfo} + redis.call('HDEL',cachePrefix.."order:"..userId, "status:"..orderId,"info:"..orderId) + end +end + diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/AddCouponStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/AddCouponStock.lua new file mode 100644 index 0000000..fc2e04a --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/multistock/coupon/AddCouponStock.lua @@ -0,0 +1,31 @@ +-- 删除用户优惠券等传入的数据格式,对于redis来说,lua是原子性的,有事务的 + +-- 检验库存信息 这里的key是 +local cachePrefix = KEYS[1] +local orderId = KEYS[2] +local activityId = KEYS[3] +local prodCount = tonumber(KEYS[4]) +local userId = KEYS[5] +local skuId = KEYS[6] +local receiveNum = 0 +-- 如果存在锁定记录则不做库存回退 +if (redis.call('exists', cachePrefix.."addLock:"..activityId.."_"..userId.."_"..orderId) ~= "1") then + + -- 如果有限购,则用户领券数量回退 + if (redis.call('exists', cachePrefix.."receive:".. activityId.."_"..userId) == "1") then + -- 用户领券数量 + receiveNum = redis.call('get', cachePrefix.."receive:".. activityId.."_"..userId) + redis.call('set',cachePrefix.."receive:"..activityId.."_"..userId, receiveNum - prodCount) + end + + -- 库存回退 + if prodCount ~= 0 then + -- 下面通过get获取当前的库存数量 + local stock = tonumber(redis.call('get', cachePrefix.."stock:".. activityId.."_"..skuId )) + redis.call('set',cachePrefix.."stock:".. activityId.."_"..skuId,tostring(stock + prodCount)) + end + + -- 添加锁定记录 + redis.call('set',cachePrefix.."addLock:"..activityId.."_"..userId.."_"..orderId, tostring(prodCount)) +end + diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/OrderBatchMakerUseStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/OrderBatchMakerUseStock.lua new file mode 100644 index 0000000..993885a --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/OrderBatchMakerUseStock.lua @@ -0,0 +1,87 @@ +-- Desc: 减少锁定库存,增加销量 -用于订单支付成功 +--订单支付成功,增加销量 +local params = {} +-- 用于批量获取sku库存信息的key集合 +local mgetSkuKeys = {} + +-- skuId列表 去重后的sku数据 +local skuIdSet = {} + +local result = "" +local skuCheck = {} +-- 检验库存信息 这里的key是 +-- 入参 KEYS 订单id_仓库id_skuId_lockNum 订单id_仓库id_skuId_lockNum... +for index,paramStr in ipairs(KEYS) do + local param = {} + + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + -- key 仓库id_skuId + local key = "mall4cloud_product:sku_sock:".. param[2].."_"..param[3] + if skuCheck[param[3]] == nil then + table.insert(mgetSkuKeys, key) + table.insert(skuIdSet, param[3]) + skuCheck[param[3]] = true + --result = result.."sku:"..param[3].."," + end +end +skuCheck = nil + +-- 下面通过mget获取所有key的值,call后面是可变长参数,unpack是将数组变成可变长参数 +local skuStr = redis.call('mget', unpack(mgetSkuKeys)); +-- 用于批量设置sku库存信息的key和value集合 +local skuMap = {} +for i = 1,#skuIdSet do + local skuId = skuIdSet[i] + local skuNum = {} + local skuData = tostring(skuStr[i]) + --result = result.."skuId:"..skuId..tostring(skuData).."," + if skuData ~= 'false' and skuData ~= 'nil' and skuData ~= '' then + for data in string.gmatch(skuData, "%d+") do + table.insert(skuNum, data) + end + skuMap[skuId] = skuNum + end +end +skuIdSet = nil + +local msetSkuKV = {} +--按照订单来计算sku解锁的数据 +for i = 1,#params do + -- 订单id_仓库id_skuId_lockNum + local param = params[i] + + -- 删除锁定标记 + -- key-订单id_仓库id_skuId + local isDelete = redis.call('del',"mall4cloud_product:order_sku_lock:"..param[1].."_"..param[2].."_"..param[3]) + -- 删除锁定标记成功再添加销量,让方法幂等 + if isDelete ~= 0 then + -- 扣除sku的锁定库存,增加可售库存 ----- 可售数量_锁定数量_已售数量 + local skuNum = skuMap[param[3]] + local lockNum = tonumber(param[4]) + -- 修改sku库存记录 + -- 增加销量 + skuNum[3] = tonumber(skuNum[3]) + lockNum + -- 减少锁定 + skuNum[2] = tonumber(skuNum[2]) - lockNum + skuMap[param[3]] = skuNum + end +end + +-- sku库存数据计算完成后,拼接mset更新的key和value +for skuId,skuNum in pairs(skuMap) do + -- mset key 目前的仓库id都是0,所以这个可以直接写死,后面有多个仓库时,把key替换为:skuId+仓库id 的方式即可 + table.insert(msetSkuKV, "mall4cloud_product:sku_sock:".."0".."_"..skuId) + -- mset value 可售数量_锁定数量_已售数量 + table.insert(msetSkuKV, skuNum[1].."_"..skuNum[2].."_"..skuNum[3].."_"..skuNum[4]) + + -- skuId_当前sku库存_仓库id_销量,skuId_当前sku库存_仓库id_销量... + result = result..skuId.."_"..skuNum[1].."_"..skuNum[2].."_"..skuNum[3].."," +end + +-- 修改回redis +redis.call('mset',unpack(msetSkuKV)) + +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/OrderBatchUnlockStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/OrderBatchUnlockStock.lua new file mode 100644 index 0000000..59b9404 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/OrderBatchUnlockStock.lua @@ -0,0 +1,86 @@ +-- Desc: 减少锁定库存,增加可售库存 -用于取消订单还原库存 +--取消订单还原库存 +local params = {} +-- 用于批量获取sku库存信息的key集合 +local mgetSkuKeys = {} + +-- skuId列表 去重后的sku数据 +local skuIdSet = {} + +local result = "" +local skuCheck = {} +-- 检验库存信息 这里的key是 +-- 入参 KEYS 订单id_仓库id_skuId_lockNum 订单id_仓库id_skuId_lockNum... +for index,paramStr in ipairs(KEYS) do + local param = {} + + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + -- key 仓库id_skuId + local key = "mall4cloud_product:sku_sock:".. param[2].."_"..param[3] + if skuCheck[param[3]] == nil then + table.insert(mgetSkuKeys, key) + table.insert(skuIdSet, param[3]) + skuCheck[param[3]] = true + --result = result.."sku:"..param[3].."," + end +end +skuCheck = nil +-- 下面通过mget获取所有key的值,call后面是可变长参数,unpack是将数组变成可变长参数 +local skuStr = redis.call('mget', unpack(mgetSkuKeys)); +-- 用于批量设置sku库存信息的key和value集合 +local skuMap = {} +for i = 1,#skuIdSet do + local skuId = skuIdSet[i] + local skuNum = {} + local skuData = tostring(skuStr[i]) + --result = result.."skuId:"..skuId..tostring(skuData).."," + if skuData ~= 'false' and skuData ~= 'nil' and skuData ~= '' then + for data in string.gmatch(skuData, "%d+") do + table.insert(skuNum, data) + end + skuMap[skuId] = skuNum + end +end +skuIdSet = nil + +local msetSkuKV = {} +--按照订单来计算sku解锁的数据 +for i = 1,#params do + -- 订单id_仓库id_skuId_lockNum + local param = params[i] + + -- 删除锁定标记 + -- key-订单id_仓库id_skuId + local isDelete = redis.call('del',"mall4cloud_product:order_sku_lock:"..param[1].."_"..param[2].."_"..param[3]) + -- 删除锁定标记成功才进行还原库存,让方法幂等 + if isDelete ~= 0 then + -- 扣除sku的锁定库存,增加可售库存 ----- 可售数量_锁定数量_已售数量 + local skuNum = skuMap[param[3]] + local lockNum = tonumber(param[4]) + -- 修改sku库存记录 + -- 增加可售 + skuNum[1] = tonumber(skuNum[1]) + lockNum + -- 减少锁定 + skuNum[2] = tonumber(skuNum[2]) - lockNum + skuMap[param[3]] = skuNum + end +end + +-- sku库存数据计算完成后,拼接mset更新的key和value +for skuId,skuNum in pairs(skuMap) do + -- mset key 目前的仓库id都是0,所以这个可以直接写死,后面有多个仓库时,把key替换为:skuId+仓库id 的方式即可 + table.insert(msetSkuKV, "mall4cloud_product:sku_sock:".."0".."_"..skuId) + -- mset value 可售数量_锁定数量_已售数量 + table.insert(msetSkuKV, skuNum[1].."_"..skuNum[2].."_"..skuNum[3].."_"..skuNum[4]) + + -- skuId_当前sku库存_仓库id_销量,skuId_当前sku库存_仓库id_销量... + result = result..skuId.."_"..skuNum[1].."_"..skuNum[2].."_"..skuNum[3].."," +end + +-- 修改回redis +redis.call('mset',unpack(msetSkuKV)) + +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/RefundIncreaseStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/RefundIncreaseStock.lua new file mode 100644 index 0000000..350eb47 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/RefundIncreaseStock.lua @@ -0,0 +1,102 @@ +-- Desc: 减少销量,增加可售库存 -用于订单退款还原库存 +-- 传入的数据格式,对于redis来说,lua是原子性的,有事务的 +local params = {} +-- 用于批量获取sku库存信息的key集合 +local mgetSkuKeys = {} +-- sku键数组 +local skuKey = {} + +-- 步骤一 入参 KEYS skuId_退款数量_库存id 订单id_仓库id_skuId_lockNum... +for index, paramStr in ipairs(KEYS) do + -- {skuId, 退款数量, 库存id} + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + + -- 避免一个sku同时进行多个操作时,查询和计算的库存数据操作,所以这里要对区域库存和总库存的key去重 + local key = param[1].."_"..param[3] + local skuId = tonumber(param[1]) + local notExistsKey = true + local notExistsSku = true + for index, value in ipairs(skuKey) do + if not notExistsKey and not notExistsSku then break end + if key == value then + notExistsKey = false + elseif skuId == value then + notExistsSku = false + end + end + -- 数组没有的sku数组再添加到数组,skuKey用于批量查询后的sku数据绑定 + if notExistsKey then + -- sku区域库存key格式: key名称:skuId_仓库id + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..key) + table.insert(skuKey, key) + --总库存去重 + if notExistsSku then + -- sku总库存key格式: key名称:skuId + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..param[1]) + -- 用数字类型区分总库存 + table.insert(skuKey, skuId) + end + end +end + +-- 下面通过mget获取所有key的值,call后面是可变长参数,unpack是将数组变成可变长参数 +local skuStr = redis.call('mget', unpack(mgetSkuKeys)); + +-- 拆分mget中获取到的sku库存信息。 skuStocks: map skukey:区域库存=skuId_仓库id; 总库存=skuId +local skuStocks = {} +for index, key in ipairs(skuKey) do + -- {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = {} + for value in string.gmatch(skuStr[index], "%d+") do + table.insert(skuStock, tonumber(value)) + end + -- sku库存列表 + skuStocks[key] = skuStock +end + +local result = "" +--按照订单来还原库存 +for i = 1,#params do + -- skuId_refundNum(退货数量)_库存id + local param = params[i] + + -- 可售库存数量_锁定库存数量_销量_sku库存状态 + local skuPointStock = skuStocks[param[1].."_"..param[3]] + local skuStock = skuStocks[tonumber(param[1])] + + + local refundNum = tonumber(param[2]) + --修改sku库存记录 + -- 减少销量数量 + skuPointStock[3] = tonumber(skuPointStock[3]) - refundNum + skuStock[3] = tonumber(skuStock[3]) - refundNum + -- 增加可售数量 + skuPointStock[1] = tonumber(skuPointStock[1]) + refundNum + skuStock[1] = tonumber(skuStock[1]) + refundNum + + -- skuId_仓库id_可售库存_当前销量... + result = result..param[1].."_"..param[3].."_"..skuPointStock[1].."_"..skuPointStock[3].."," + result = result..param[1].."_0_"..skuPointStock[1].."_"..skuPointStock[3].."," +end + + +-- 用于批量设置sku库存信息的key和value集合 +local msetSkuKV = {} +for index, key in ipairs(skuKey) do + -- 库存信息 {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = skuStocks[key] + -- mset sku库存key 总库存格式: key名称:skuId; 区域库存格式: key名称:skuId_仓库id + table.insert(msetSkuKV, "mall4cloud_product:sku_sock:"..key) + -- mset sku库存value 格式: 可售库存数量_锁定库存数量_销量_sku库存状态 + table.insert(msetSkuKV, skuStock[1].."_"..skuStock[2].."_"..skuStock[3].."_"..skuStock[4]) +end + +-- 修改回redis +redis.call('mset',unpack(msetSkuKV)) + + +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/allot/AllotLockStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/allot/AllotLockStock.lua new file mode 100644 index 0000000..3d7d42a --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/allot/AllotLockStock.lua @@ -0,0 +1,78 @@ +-- Desc: 调拨订单锁定库存(减少可用库存,增加锁定库存) +-- tips: 不仅要减少区域库存,还要减少总库存数据 + +local params = {} +local skuStockKeys = {} +local totalSkuStockKeys = {} + +-- 将入参KEYS([订单id_仓库id_skuId_lockNum, ...])封装为params二元数组([[订单id, 仓库id, skuId, lockNum], ...]) +-- 并获取对应sku区域库存key和总库存key +for index, paramStr in ipairs(KEYS) do + -- 将paramStr解析成param数组 + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + -- 获取sku区域库存key和总库存key + table.insert(skuStockKeys, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(totalSkuStockKeys, "mall4cloud_product:sku_sock:"..param[3]) +end + +-- 执行redis的mget指令,批量获取sku区域库存key和总库存key对应的value值(unpack是将数组变成可变长参数) +local valueStrArr = redis.call('mget', unpack(skuStockKeys)); +local totalValueStrArr = redis.call('mget', unpack(totalSkuStockKeys)) + +-- 将valueStr数组([可用数量_锁定数量_已售数量_状态, ...])转成skuStockValues二元数组([[可用数量, 锁定数量, 已售数量, 状态], ...]) +-- 并校验库存是否充足 +local skuStockValues = {} +local totalSkuStockValues = {} +for i = 1, #params do + -- 数组转换 + local skuStockValue = {} + for value in string.gmatch(valueStrArr[i], "%d+") do + table.insert(skuStockValue, value) + end + table.insert(skuStockValues, skuStockValue) + local totalSkuStockValue = {} + for value in string.gmatch(totalValueStrArr[i], "%d+") do + table.insert(totalSkuStockValue, value) + end + table.insert(totalSkuStockValues, totalSkuStockValue) + -- 库存校验,若不足,返回不足的skuId + local param = params[i] + if tonumber(param[4]) > tonumber(skuStockValue[1]) then + return param[3] + end +end + +-- 添加库存锁定记录,并更新redis-sku库存数据(lua'..'相当于java'+') +-- 将新的key-value封装为数组,方便后续mset +-- 记录执行结果,用于返回(订单id_仓库id_skuId_可用库存) +local result = "" +local skuStockKV = {} +for i = 1, #params do + local skuStockValue = skuStockValues[i] + local totalSkuStockValue = totalSkuStockValues[i] + local param = params[i] + -- 执行redis的set指令,添加库存锁定记录 + local lockNum = tonumber(param[4]) + redis.call('set', "mall4cloud_product:allot_order_sku_lock:"..param[1].."_"..param[2].."_"..param[3], lockNum) + -- 将新的sku库存的key-value封装成数组(减少可用,增加锁定) + local canUse = tonumber(skuStockValue[1]) - lockNum + local lock = tonumber(skuStockValue[2]) + lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(skuStockKV, canUse.."_"..lock.."_"..skuStockValue[3].."_"..skuStockValue[4]) + canUse = tonumber(totalSkuStockValue[1]) - lockNum + lock = tonumber(totalSkuStockValue[2]) + lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3]) + table.insert(skuStockKV, canUse.."_"..lock.."_"..totalSkuStockValue[3].."_"..totalSkuStockValue[4]) + -- 拼接执行结果 + result = result..param[1].."_"..param[2].."_"..param[3].."_"..skuStockValue[1].."," +end + +-- 执行redis的mset指令,更新库存数据 +redis.call('mset', unpack(skuStockKV)) + +-- 返回执行结果 +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderUnlockStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderUnlockStock.lua new file mode 100644 index 0000000..af738d1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/order/OrderUnlockStock.lua @@ -0,0 +1,147 @@ +-- Desc: 取消订单,减少锁定库存,增加可售库存 + + +-- KEYS入参格式: 订单id_仓库id_skuId_lockNum_默认仓库id, 订单id_仓库id_skuId_lockNum_默认仓库id... +-- params格式: {{订单id, 仓库id, skuId, lockNum,defaultId}, {订单id, 仓库id, skuId, lockNum,defaultId}} +-- sku总库存key格式-redis: mall4cloud_product:sku_sock:skuId +-- sku区域库存key格式-redis: mall4cloud_product:sku_sock:skuId_仓库id +-- sku库存value格式-redis: 可售库存数量_锁定库存数量_销量_sku库存状态 + + +-- 取消订单处理流程: +-- 步骤一 将参数字符串(KEYS)拆分为数组(params), 拆分过程中根据库存操作类型处理: +-- 拼接区域库存和总库存的key(mgetSkuKeys:用于批量查询库存数据。 总库存key格式 key名称:skuId; 区域库存key格式 key名称:skuId_仓库id), +-- skuKey:根据数组中的存放的skuId以及仓库id,与批量获取的数据进行匹配(redis mget响应数据顺序对应查询时的key顺序) +-- skuKey中的数据有两种类型,一种是字符类型代表区域库存的skuId和仓库id,数据格式为: skuId_仓库id; 一种是数字类型代表总库存的skuId, 数据格式为:skuId +-- 步骤二 批量查询库存信息, 使用步骤一中拼接的key数组(mgetSkuKeys)进行查询 +-- 步骤三 拆分步骤三mget获取的sku库存信息: +-- mget获取的sku库存信息格式为:可售库存数量_锁定库存数量_销量_sku库存状态 +-- 拆分成数组(skuStock)后的格式为:{可售库存数量, 锁定库存数量, 销量,sku库存状态} +-- 库存集合(skuStocks)的数据格式为:map, 其中skukey还可以细分 -- 区域库存:skuId_仓库id(字符串); 总库存:skuId(数字类型) +-- 步骤四 根据订单数据,减少sku锁定库存,增加对应的sku可售库存, 以及拼接sku库存变动结果(result) +-- 步骤五 判断步骤四中是否有改动sku库存信息,有改动则拼接要更新的sku库存key、value,并批量保存修改后的sku库存信息 + + +-- sku键数组 +local skuKey = {} +-- 传参数据 +local params = {} +-- 用于批量获取sku库存信息的key集合 +local mgetSkuKeys = {} +-- 步骤一 入参 KEYS 订单id_仓库id_skuId_lockNum 订单id_仓库id_skuId_lockNum... +for index, paramStr in ipairs(KEYS) do + -- {订单id, 仓库id, skuId, lockNum} + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + + -- 避免一个sku同时进行多个操作时,查询和计算的库存数据操作,所以这里要对区域库存和总库存的key去重 + local key = param[3].."_"..param[2] + local defaultKey = param[3].."_"..param[5] + if tonumber(param[5]) > 0 then + key = defaultKey + end + local skuId = tonumber(param[3]) + local notExistsKey = true + local notExistsSku = true + for index, value in ipairs(skuKey) do + if not notExistsKey and not notExistsSku then break end + if key == value then + notExistsKey = false + elseif skuId == value then + notExistsSku = false + end + end + -- 数组没有的sku数组再添加到数组,skuKey用于批量查询后的sku数据绑定 + if notExistsKey then + -- sku区域库存key格式: key名称:skuId_仓库id + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..key) + table.insert(skuKey, key) + --总库存去重 + if notExistsSku then + -- sku总库存key格式: key名称:skuId + table.insert(mgetSkuKeys, "mall4cloud_product:sku_sock:"..param[3]) + -- 用数字类型区分总库存 + table.insert(skuKey, skuId) + end + end +end + + +-- 步骤二 通过mget获取所有key的值,call后面是可变长参数,unpack是将数组变成可变长参数 +local skuStr = redis.call('mget', unpack(mgetSkuKeys)); + + +-- 步骤三 拆分mget中获取到的sku库存信息。 skuStocks: map skukey:区域库存=skuId_仓库id; 总库存=skuId +local skuStocks = {} +for index, key in ipairs(skuKey) do + -- {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = {} + for value in string.gmatch(skuStr[index], "%d+") do + table.insert(skuStock, tonumber(value)) + end + -- sku库存列表 + skuStocks[key] = skuStock +end + +local result = "" +-- 用于批量设置sku库存信息的key和value集合 +local msetSkuKV = {} +local updateNum = 0 +-- 步骤四 取消订单 - 减少sku锁定库存, 增加对应的sku可售库存 +for i = 1,#params do + -- 订单id_仓库id_skuId_lockNum_库存操作 + local param = params[i] + -- 可售库存数量_锁定库存数量_销量_sku库存状态 + local skuPointStock = skuStocks[param[3].."_"..param[2]] + if tonumber(param[5]) > 0 then + skuPointStock = skuStocks[param[3].."_"..param[5]] + end + local skuStock = skuStocks[tonumber(param[3])] + + -- 删除锁定标记 + -- key-订单id_仓库id_skuId + local isDelete = redis.call('del',"mall4cloud_product:order_sku_lock:"..param[1].."_"..param[2].."_"..param[3]) + + -- 删除锁定标记成功才进行还原库存,让方法幂等, 没有删除锁定标记就跳过本次循环 + if isDelete > 0 then + local changeStock = tonumber(param[4]) + -- 修改sku库存记录 + -- 增加可售 + skuPointStock[1] = tonumber(skuPointStock[1]) + changeStock + skuStock[1] = tonumber(skuStock[1]) + changeStock + -- 减少锁定 + skuPointStock[2] = tonumber(skuPointStock[2]) - changeStock + skuStock[2] = tonumber(skuStock[2]) - changeStock + + -- 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存... + if tonumber(param[5]) > 0 then + result = result..param[1].."_"..param[5].."_"..param[3].."_"..skuPointStock[1].."," + else + result = result..param[1].."_"..param[2].."_"..param[3].."_"..skuPointStock[1].."," + end + result = result..param[1].."_0_"..param[3].."_"..skuStock[1].."," + updateNum = updateNum + 1 + end +end + + +-- 步骤五 如果更新数量大于0,添加sku库存的key、value +if updateNum > 0 then + for index, key in ipairs(skuKey) do + -- 库存信息 {可售库存数量, 锁定库存数量, 销量, sku库存状态} + local skuStock = skuStocks[key] + -- mset sku库存key 总库存格式: key名称:skuId; 区域库存格式: key名称:skuId_仓库id + table.insert(msetSkuKV, "mall4cloud_product:sku_sock:"..key) + -- mset sku库存value 格式: 可售库存数量_锁定库存数量_销量_sku库存状态 + table.insert(msetSkuKV, skuStock[1].."_"..skuStock[2].."_"..skuStock[3].."_"..skuStock[4]) + end + + -- 修改回redis + redis.call('mset',unpack(msetSkuKV)) +end + + +return result diff --git a/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/purchase/PurchaseLockStock.lua b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/purchase/PurchaseLockStock.lua new file mode 100644 index 0000000..25b7a8b --- /dev/null +++ b/tmerclub-common/tmerclub-common-cache/src/main/resources/lua/product/purchase/PurchaseLockStock.lua @@ -0,0 +1,78 @@ +-- Desc: 采购订单锁定库存(减少可用库存,增加锁定库存) +-- tips: 不仅要减少区域库存,还要减少总库存数据 + +local params = {} +local skuStockKeys = {} +local totalSkuStockKeys = {} + +-- 将入参KEYS([订单id_仓库id_skuId_lockNum, ...])封装为params二元数组([[订单id, 仓库id, skuId, lockNum], ...]) +-- 并获取对应sku区域库存key和总库存key +for index, paramStr in ipairs(KEYS) do + -- 将paramStr解析成param数组 + local param = {} + for value in string.gmatch(paramStr, "%d+") do + table.insert(param, value) + end + table.insert(params, param) + -- 获取sku区域库存key和总库存key + table.insert(skuStockKeys, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(totalSkuStockKeys, "mall4cloud_product:sku_sock:"..param[3]) +end + +-- 执行redis的mget指令,批量获取sku区域库存key和总库存key对应的value值(unpack是将数组变成可变长参数) +local valueStrArr = redis.call('mget', unpack(skuStockKeys)); +local totalValueStrArr = redis.call('mget', unpack(totalSkuStockKeys)) + +-- 将valueStr数组([可用数量_锁定数量_已售数量_状态, ...])转成skuStockValues二元数组([[可用数量, 锁定数量, 已售数量, 状态], ...]) +-- 并校验库存是否充足 +local skuStockValues = {} +local totalSkuStockValues = {} +for i = 1, #params do + -- 数组转换 + local skuStockValue = {} + for value in string.gmatch(valueStrArr[i], "%d+") do + table.insert(skuStockValue, value) + end + table.insert(skuStockValues, skuStockValue) + local totalSkuStockValue = {} + for value in string.gmatch(totalValueStrArr[i], "%d+") do + table.insert(totalSkuStockValue, value) + end + table.insert(totalSkuStockValues, totalSkuStockValue) + -- 库存校验,若不足,返回不足的skuId + local param = params[i] + if tonumber(param[4]) > tonumber(skuStockValue[1]) then + return param[3] + end +end + +-- 添加库存锁定记录,并更新redis-sku库存数据(lua'..'相当于java'+') +-- 将新的key-value封装为数组,方便后续mset +-- 记录执行结果,用于返回(订单id_仓库id_skuId_可用库存) +local result = "" +local skuStockKV = {} +for i = 1, #params do + local skuStockValue = skuStockValues[i] + local totalSkuStockValue = totalSkuStockValues[i] + local param = params[i] + -- 执行redis的set指令,添加库存锁定记录 + local lockNum = tonumber(param[4]) + redis.call('set', "mall4cloud_product:purchase_order_sku_lock:"..param[1].."_"..param[2].."_"..param[3], lockNum) + -- 将新的sku库存的key-value封装成数组(减少可用,增加锁定) + local canUse = tonumber(skuStockValue[1]) - lockNum + local lock = tonumber(skuStockValue[2]) + lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3].."_"..param[2]) + table.insert(skuStockKV, canUse.."_"..lock.."_"..skuStockValue[3].."_"..skuStockValue[4]) + canUse = tonumber(totalSkuStockValue[1]) - lockNum + lock = tonumber(totalSkuStockValue[2]) + lockNum + table.insert(skuStockKV, "mall4cloud_product:sku_sock:"..param[3]) + table.insert(skuStockKV, canUse.."_"..lock.."_"..totalSkuStockValue[3].."_"..totalSkuStockValue[4]) + -- 拼接执行结果 + result = result..param[1].."_"..param[2].."_"..param[3].."_"..skuStockValue[1].."," +end + +-- 执行redis的mset指令,更新库存数据 +redis.call('mset', unpack(skuStockKV)) + +-- 返回执行结果 +return result diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/AliLive.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/AliLive.java new file mode 100644 index 0000000..83dcc91 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/AliLive.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * 阿里视频直播配置 + * @author TRACK + */ +public class AliLive { + + /** + * 推流域名 + */ + private String pushDomain; + + /** + * 播流域名 + */ + private String pullDomain; + + /** + * 应用名称 + */ + private String appName; + + /** + * 推流鉴权url key + */ + private String pushAuthKey; + + /** + * 播流鉴权url key + */ + private String pullAuthKey; + + /** + * 是否配置https 1是0否 + */ + private Integer isHttps; + + public String getPushDomain() { + return pushDomain; + } + + public void setPushDomain(String pushDomain) { + this.pushDomain = pushDomain; + } + + public String getPullDomain() { + return pullDomain; + } + + public void setPullDomain(String pullDomain) { + this.pullDomain = pullDomain; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getPushAuthKey() { + return pushAuthKey; + } + + public void setPushAuthKey(String pushAuthKey) { + this.pushAuthKey = pushAuthKey; + } + + public String getPullAuthKey() { + return pullAuthKey; + } + + public void setPullAuthKey(String pullAuthKey) { + this.pullAuthKey = pullAuthKey; + } + + public Integer getIsHttps() { + return isHttps; + } + + public void setIsHttps(Integer isHttps) { + this.isHttps = isHttps; + } + + @Override + public String toString() { + return "AliLive{" + + "pushDomain='" + pushDomain + '\'' + + ", pullDomain='" + pullDomain + '\'' + + ", appName='" + appName + '\'' + + ", pushAuthKey='" + pushAuthKey + '\'' + + ", pullAuthKey='" + pullAuthKey + '\'' + + ", isHttps=" + isHttps + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/AliQuick.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/AliQuick.java new file mode 100644 index 0000000..7829776 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/AliQuick.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * 阿里物流详情查询 + * @author SJL + */ +public class AliQuick extends SwitchBaseModel { + + /** + * 阿里物流中的顺丰编号 + */ + public static final String SF_CODE = "SFEXPRESS"; + + private String aliCode; + private String reqUrl; + + public String getReqUrl() { + return reqUrl; + } + + public void setReqUrl(String reqUrl) { + this.reqUrl = reqUrl; + } + + public String getAliCode() { + return aliCode; + } + + public void setAliCode(String aliCode) { + this.aliCode = aliCode; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/DaYu.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/DaYu.java new file mode 100644 index 0000000..bc51f85 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/DaYu.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * 阿里配置信息 + * @author FrozenWatermelon + */ +public class DaYu { + + private String accessKeyId; + + private String accessKeySecret; + + private String signName; + + public String getAccessKeyId() { + return accessKeyId; + } + + public void setAccessKeyId(String accessKeyId) { + this.accessKeyId = accessKeyId; + } + + public String getAccessKeySecret() { + return accessKeySecret; + } + + public void setAccessKeySecret(String accessKeySecret) { + this.accessKeySecret = accessKeySecret; + } + + public String getSignName() { + return signName; + } + + public void setSignName(String signName) { + this.signName = signName; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/PaySettlementConfig.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/PaySettlementConfig.java new file mode 100644 index 0000000..8a24a27 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/PaySettlementConfig.java @@ -0,0 +1,26 @@ +package com.tmerclub.cloud.common.bean; + +/** + * @author TRACK + */ +public class PaySettlementConfig { + /** + * 支付结算类型 0.原生结算 1.通联结算 + */ + private Integer paySettlementType; + + public Integer getPaySettlementType() { + return paySettlementType; + } + + public void setPaySettlementType(Integer paySettlementType) { + this.paySettlementType = paySettlementType; + } + + @Override + public String toString() { + return "PaySettlementConfig{" + + "paySettlementType=" + paySettlementType + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Quick100.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Quick100.java new file mode 100644 index 0000000..ab5af8f --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/Quick100.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * 快递鸟物流详情查询 + * @author SJL + */ +public class Quick100 extends SwitchBaseModel { + + /** + * 快递100中顺丰编码 + */ + @JsonIgnore + public static final String SF_CODE = "shunfeng"; + /** + * 快递100中丰网速运编码 + */ + @JsonIgnore + public static final String FENGWANG_CODE = "fengwang"; + + private String customer; + private String key; + private String secret; + private String reqUrl; + + /** + * 是否开启电子面单 + */ + private Boolean isPrint; + /** + * 电子面单请求接口 + */ + private String printReqUrl; + /** + * 电子面单沙箱模式 + */ + private Boolean mock; + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getReqUrl() { + return reqUrl; + } + + public void setReqUrl(String reqUrl) { + this.reqUrl = reqUrl; + } + + public Boolean getIsPrint() { + return isPrint; + } + + public void setIsPrint(Boolean print) { + isPrint = print; + } + + public String getPrintReqUrl() { + return printReqUrl; + } + + public void setPrintReqUrl(String printReqUrl) { + this.printReqUrl = printReqUrl; + } + + public Boolean getMock() { + return mock; + } + + public void setMock(Boolean mock) { + this.mock = mock; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxMp.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxMp.java new file mode 100644 index 0000000..c2df55d --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/bean/WxMp.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.bean; + +/** + * @author FrozenWatermelon + */ +public class WxMp { + /** + * 设置微信公众号的appid + */ + private String appId; + + /** + * 设置微信公众号的Secret + */ + private String secret; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/AopConfig.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/AopConfig.java new file mode 100644 index 0000000..cb21129 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/AopConfig.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +/** + * @author FrozenWatermelon + * @date 2020/9/21 + */ +@EnableAspectJAutoProxy(exposeProxy = true) +@Configuration +public class AopConfig { +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/CommonsRequestLoggingConfig.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/CommonsRequestLoggingConfig.java new file mode 100644 index 0000000..754e587 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/CommonsRequestLoggingConfig.java @@ -0,0 +1,23 @@ +package com.tmerclub.cloud.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.CommonsRequestLoggingFilter; + +/** + * @author LGH + * 请求日志打印 + */ +@Configuration +public class CommonsRequestLoggingConfig { + + @Bean + public CommonsRequestLoggingFilter requestLoggingFilter() { + CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter(); + loggingFilter.setIncludeClientInfo(true); + loggingFilter.setIncludeQueryString(true); + loggingFilter.setIncludePayload(true); + loggingFilter.setMaxPayloadLength(2000); + return loggingFilter; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/WebConfig.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/WebConfig.java new file mode 100644 index 0000000..8666721 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/config/WebConfig.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.config; + +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.LuckLocaleChangeInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * 格式处理-导出excel配置 + * + * @author YXF + * @date 2021/03/09 + */ +@SuppressWarnings("NullableProblems") +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Autowired + private LuckLocaleChangeInterceptor mall4cloudLocaleChangeInterceptor; + + @Override + public void configureMessageConverters(List> converters) { + //调用父类的配置 + WebMvcConfigurer.super.configureMessageConverters(converters); + //创建FastJson的消息转换器 + FastJsonHttpMessageConverter convert = new FastJsonHttpMessageConverter(); + convert.setSupportedMediaTypes(getSupportedMediaTypes()); + converters.add(convert); + } + + public List getSupportedMediaTypes() { + //创建fastJson消息转换器 + List supportedMediaTypes = new ArrayList<>(Constant.INITIAL_CAPACITY); + supportedMediaTypes.add(MediaType.ALL); + return supportedMediaTypes; + } + + + @Bean + public WebMvcConfigurer webMvcConfigurer() { + return new WebMvcConfigurer() { + //拦截器 + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(mall4cloudLocaleChangeInterceptor).addPathPatterns("/**"); + } + }; + } + + @Bean + public SessionLocaleResolver localeResolver() { + SessionLocaleResolver localeResolver = new SessionLocaleResolver(); + localeResolver.setDefaultLocale(Locale.CHINESE); + return localeResolver; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayRechargeStatusType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayRechargeStatusType.java new file mode 100644 index 0000000..3a78496 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayRechargeStatusType.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 通联充值状态 0.待支付 1.申请成功(还没确认) 2.充值成功 3.充值失败 + * @author TRACK + */ +public enum AllinpayRechargeStatusType { + + /** + * 待支付 + * 仅针对收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + */ + WAIT_PAY(0), + /** + * 申请成功(还没确认) + */ + APPLY_SUCCESS(1), + + /** + * 充值成功 + */ + RECHARGE_SUCCESS(2), + + /** + * 充值失败 + */ + RECHARGE_FAIL(3); + + private final Integer value; + + public Integer value() { + return value; + } + + AllinpayRechargeStatusType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayShopStatus.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayShopStatus.java new file mode 100644 index 0000000..156e426 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayShopStatus.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 通联店铺状态 0未开通 1营业中 2平台下线 3上线待审核 4开店待审核 + * @author TRACK + */ +public enum AllinpayShopStatus { + + /** + * 未开通 + */ + UN_AVAILABLE(0), + + /** + * 营业中 + */ + OPEN(1), + + /** + * 平台下线 + */ + OFFLINE(2), + + /** + * 上线待审核 + */ + WAIT_AUDIT(3), + + /** + * 开店待审核 + */ + OPEN_WAIT_AUDIT(4); + + private final Integer num; + + public Integer value() { + return num; + } + + AllinpayShopStatus(Integer num) { + this.num = num; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayWithdrawCashStatusType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayWithdrawCashStatusType.java new file mode 100644 index 0000000..fdee415 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/AllinpayWithdrawCashStatusType.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 通联提现状态 0.待支付 1.申请成功(还没确认) 2.提现成功 3.提现失败 + * @author TRACK + */ +public enum AllinpayWithdrawCashStatusType { + + /** + * 待支付 + * 仅针对收银宝快捷短信验证码输入错误场景,允许商户继续调用确认支付 + */ + WAIT_PAY(0), + /** + * 申请成功(还没确认) + */ + APPLY_SUCCESS(1), + + /** + * 提现成功 + */ + CASH_SUCCESS(2), + + /** + * 提现失败 + */ + CASH_FAIL(3); + + private final Integer value; + + public Integer value() { + return value; + } + + AllinpayWithdrawCashStatusType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/CardType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/CardType.java new file mode 100644 index 0000000..a8a0bcc --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/CardType.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.common.constant; + +/** + * @author LGH + */ + +public enum CardType { + + /** + * 借记卡 + */ + DEBIT(1, "借记卡"), + + /** + * 信用卡 + */ + CREDIT(2, "信用卡"); + + private final Integer code; + + private final String desc; + + public Integer getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + public static String getDescByCode(Integer code) { + if (DEBIT.getCode().equals(code)) { + return DEBIT.getDesc(); + } else if (CREDIT.getCode().equals(code)) { + return CREDIT.getDesc(); + } + return ""; + } + + CardType(Integer code, String desc) { + this.code = code; + this.desc = desc; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/ConfigNameConstant.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/ConfigNameConstant.java new file mode 100644 index 0000000..d838b5d --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/ConfigNameConstant.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +/** + * 配置缓存名字 + * + * @author lhd + * @date 2020/12/30 + */ +public interface ConfigNameConstant { + + /** + * 配置KEY名称 + */ + String SCORE_CONFIG = "SCORE_CONFIG"; + String SECKILL_TIME_CONFIG = "SECKILL_TIME_CONFIG"; + String SCORE_REMARKS = "积分获取比例和积分抵现规则"; + String SCORE_EXPLAIN = "SCORE_EXPLAIN"; + String GROWTH_CONFIG = "GROWTH_CONFIG"; + String GROWTH_REMARKS = "成长值获取规则"; + String LEVEL_SHOW = "LEVEL_SHOW"; + String SCORE_EXPIRE = "SCORE_EXPIRE"; + String SCORE_EXPIRE_REMARKS = "积分过期规则"; + String SCORE_QUESTION = "SCORE_QUESTION"; + String MEMBER_GROWTH_DESCRIPTION = "MEMBER_GROWTH_DESCRIPTION"; + String SHOP_PROTOCOL_CN = "SHOP_PROTOCOL_CN"; + String SHOP_PROTOCOL_EN = "SHOP_PROTOCOL_EN"; + String SUPPLIER_SHOP_PROTOCOL_CN = "SUPPLIER_SHOP_PROTOCOL_CN"; + String SUPPLIER_SHOP_PROTOCOL_EN = "SUPPLIER_SHOP_PROTOCOL_EN"; + String SERVICE_PROTOCOL_CN = "SERVICE_PROTOCOL_CN"; + String SERVICE_PROTOCOL_EN = "SERVICE_PROTOCOL_EN"; + String PRIVACY_PROTOCOL_CN = "PRIVACY_PROTOCOL_CN"; + String PRIVACY_PROTOCOL_EN = "PRIVACY_PROTOCOL_EN"; + String MERCHANT_REGISTER_PROTOCOL_CN = "MERCHANT_REGISTER_PROTOCOL_CN"; + String MERCHANT_REGISTER_PROTOCOL_EN = "MERCHANT_REGISTER_PROTOCOL_EN"; + String SUPPLIER_REGISTER_PROTOCOL_CN = "SUPPLIER_REGISTER_PROTOCOL_CN"; + String SUPPLIER_REGISTER_PROTOCOL_EN = "SUPPLIER_REGISTER_PROTOCOL_EN"; + String DISTRIBUTION_REMARKS = "分销配置"; + String DISTRIBUTION_RECRUIT_REMARKS = "分销招募推广配置"; +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/Constant.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/Constant.java new file mode 100644 index 0000000..873df5d --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/Constant.java @@ -0,0 +1,500 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + + +import com.tmerclub.cloud.common.i18n.LanguageEnum; + +import java.util.Arrays; +import java.util.List; + +/** + * 常量 + * @author FrozenWatermelon + */ +public class Constant { + + /** 超级管理员ID */ + public static final int SUPER_ADMIN_ID = 1; + + /** + * 如果需要部署在同一套中间件的情况下,通过修改 NAME_SPACE 和 ENV的形式 + * 命名空间 如 mall4cloud-test-(最后有个-) + */ + public static final String NAME_SPACE = ""; + + /** + * 环境 如 _test + */ + public static final String UNDERLINE_ENV = ""; + + /** + * 环境 如 -test + */ + public static final String DASHED_ENV = ""; + + + /** + * dubbo传参的用户key + */ + public static final String DUBBO_USER_KEY = "DUBBO_USER_KEY"; + + public static final String DUBBO_TOKEN_KEY = "DUBBO_TOKEN_KEY"; + + public static final String DUBBO_PREMS_KEY = "DUBBO_PREMS_KEY"; + public static final String DUBBO_LANG_KEY = "DUBBO_LANG_KEY"; + + public static final Integer INITIAL_CAPACITY = 16; + /** + * 自营店id + */ + public static final long MAIN_SHOP = 1L; + + /** + * 商家端用户如果注册了,而没有申请创建店铺创建时的shopId + */ + public static final long DEFAULT_SHOP_ID = -1L; + + /** + * 如果把平台的数据也保存在店铺里面,如分类,热搜之类的,保存的店铺id + */ + public static final long PLATFORM_SHOP_ID = 0L; + + /** + * 仅注册供应商用户账户,还没有创建供应商公司信息账户时所分配的supplierId + */ + public static final long DEFAULT_SUPPLIER_ID = -1L; + + /** + * 默认初始id + */ + public static final long DEFAULT_ID = 0L; + /** + * 平台条件标签上限 + */ + public static final long TAG_LIMIT_NUM = 20; + /** + * 店铺签约的平台分类数量上限 + */ + public static final int SIGNING_CATEGORY_LIMIT_NUM = 200; + /** + * 店铺签约的品牌数量上限 + */ + public static final int SIGNING_BRAND_LIMIT_NUM = 50; + /** + * 店铺可以绑定的银行卡上限 + */ + public static final int SHOP_BANK_CARD_LIMIT_NUM = 5; + /** + * 平台店名称 + */ + public static final String PLATFORM_SHOP_NAME = "官方店"; + + /** + * 积分名称 + */ + public static final String SCORE_CONFIG = "SCORE_CONFIG"; + public static final String SCORE_EXPLAIN = "SCORE_EXPLAIN"; + public static final String LEVEL_SHOW = "LEVEL_SHOW"; + public static final String SCORE_EXPIRE = "SCORE_EXPIRE"; + public static final String SCORE_QUESTION = "SCORE_QUESTION"; + /** + * 商城缺失sku属性时的字符描述 + */ + public static final String SKU_PREFIX = "规格:"; + public static final String DEFAULT_SKU = "规格"; + /** + * 成长值名称 + */ + public static final String GROWTH_CONFIG = "GROWTH_CONFIG"; + + /** 会员初始等级id*/ + public static final int USER_LEVEL_INIT = 1; + + + /** 系统菜单最大id */ + public static final int SYS_MENU_MAX_ID = 30; + + /** + * 最大确认收货退款时间7天 + */ + public static final int MAX_FINALLY_REFUND_TIME = 7; + + /** + * 退款最长申请时间,当申请时间过了这个时间段之后,会取消退款申请 + */ + public static final int MAX_REFUND_APPLY_TIME = 7; + /** + * 平台介入退款最长申请时间,当申请时间过了这个时间段之后,会取消平台介入申请 + */ + public static final int MAX_INTERVENTION_REFUND_APPLY_TIME = 7; + /** + * 离即将退款超时x小时时提醒 + */ + public static final int MAX_REFUND_HOUR = 12; + /** + * 直播间置顶上限个数 + */ + public static final int MAX_TOP_NUM = 10; + + /** + * 分销佣金结算在确认收货后的时间,维权期过后(7+7+1) + */ + public static final int DISTRIBUTION_SETTLEMENT_TIME = MAX_FINALLY_REFUND_TIME + MAX_REFUND_APPLY_TIME + 1; + + /** + * 查询订单成功状态 + */ + public static final String SUCCESS = "SUCCESS"; + + public static final String ERROR = "error"; + + /** + * 一级分类id + */ + public static final Long CATEGORY_ID = 0L; + + /** + * 优惠券、店铺列表中的 3件商品 + */ + public static final Integer SIZE_OF_THREE = 3; + + /** + * 店铺收藏返回的商品数量 + */ + public static final Integer SPU_SIZE_FIVE = 5; + /** + * 一个月天数 + */ + public static final Integer MONTH_DAY = 30; + /** + * 半个月天数 + */ + public static final Integer HALF_MONTH_DAY = 15; + /** + * 一天小时数 + */ + public static final Integer DAY_HOUR = 24; + /** + * 一天的秒数 + */ + public static final Integer DAY_SECOND = 24 * 60 * 60; + + /** + * 配置名称 + */ + public static final String ALIPAY_CONFIG = "ALIPAY_CONFIG"; + public static final String WXPAY_CONFIG = "WXPAY_CONFIG"; + public static final String QUICKBIRD_CONFIG = "QUICKBIRD_CONFIG"; + public static final String QUICK100_CONFIG = "QUICK100_CONFIG"; + public static final String ALI_QUICK_CONFIG = "ALI_QUICK_CONFIG"; + public static final String ALI_LIVE_CONFIG = "ALI_LIVE_CONFIG"; + public static final String MA_CONFIG = "MA_CONFIG"; + public static final String MP_CONFIG = "MP_CONFIG"; + public static final String PAY_SETTLEMENT_CONFIG = "PAY_SETTLEMENT_CONFIG"; + public static final String ALIDAYU_CONFIG = "ALIDAYU_CONFIG"; + public static final String MX_APP_CONFIG = "MX_APP_CONFIG"; + public static final String SENSITIVE_WORDS = "SENSITIVE_WORDS"; + public static final String SPU_SWITCH_CONFIG = "SPU_SWITCH_CONFIG"; + public static final String SHOP_WITHDRWA = "SHOP_WITHDRWA"; + public static final String SUPPLIE_WITHDRWA = "SUPPLIER_WITHDRWA"; + public static final String ALLINPAY_CONFIG = "ALLINPAY_CONFIG"; + public static final String UPLOAD_FILE_CONFIG = "UPLOAD_FILE_CONFIG"; + + /** + * 分销相关配置 + */ + public static final String DISTRIBUTION_CONFIG = "DISTRIBUTION_CONFIG"; + public static final String DISTRIBUTION_RECRUIT_CONFIG = "DISTRIBUTION_RECRUIT_CONFIG"; + + /** + * 记录缓存名称 + */ + public static final String FLOW_ANALYSIS_LOG = "flowAnalysisLog"; + + /** + * 已评论 + */ + public static final Integer IS_COMM = 1; + + /** + * 消息类型,100为分界线,大于100为发送给用户的,小于100为发送给商家的 + */ + public static final Integer MSG_TYPE = 100; + + /** + * 最大比例,100为100% + */ + public static final Integer MAX_RATIO = 100; + + /** + * 分类间隔 + */ + public static final String CATEGORY_INTERVAL = "-"; + + /** + * 逗号 + */ + public static final String COMMA = ","; + + /** + * 中文逗号 + */ + public static final String CN_COMMA = ","; + + /** + * 句号(英文符号) + */ + public static final String PERIOD = "."; + /** + * 冒号 + */ + public static final String COLON = ":"; + /** + * 分号 + */ + public static final String SEMICOLON = ";"; + /** + * 下划线 + */ + public static final String UNDERLINE = "_"; + + /** + * 星号 + */ + public static final String ASTERISK = "*"; + + /** + * 默认金额 + */ + public static final Long DEFAULT_AMOUNT = 0L; + + + /** + * 字符串最大长度限制 + */ + public static final Integer MAX_FIELD_LIMIT = 500; + + + /** + * 中评 + */ + public static final Integer MEDIUM_RATING = 3; + + /** + * 价格倍率 + */ + public static final Double PRICE_MAGNIFICATION = 100.0D; + + /** + * 待支付 + */ + public static final String UNPAID = "待支付"; + + /** + * 待支付 + */ + public static final String OFFLINE_PAID = "线下交易"; + + /** + * 暂无售后 + */ + public static final String NO_AFTER_SALES = "暂无售后"; + /** + * 商品最小金额(一分钱) + */ + public static final Long MIN_SPU_AMOUNT = 1L; + /** + * 商品最大金额(十万) + */ + public static final Long MAX_SPU_AMOUNT = 10000000L; + + /** + * excel下拉框行开始行 + */ + public static final Integer START_ROW = 2; + + + /** + * 最大的excel下拉框行 + */ + public static final Integer LAST_ROW = 10000; + + /** + * 订单取消时间(分钟) + */ + public static final Integer CANCEL_ORDER = 30; + + /** + * 分销提现频率 + */ + public static final Integer FREQUENCY_DAY = 30; + + + /** + * 团购队伍-系统参团 + */ + public static final String GROUP_SYSTEM_USER = "系统参团"; + + + /** + * 使用商品浏览记录进行推荐时,使用的数据数量 + */ + public static final Integer MAX_SPU_BROWSE_NUM = 50; + /** + * 置顶品牌显示数量 + */ + public static final Integer BRAND_TOP_NUM = 24; + public static final Integer DEFAULT_LANG = LanguageEnum.LANGUAGE_ZH_CN.getLang(); + /** + * 语言请求头字段 + */ + public static final String LOCALE = "locale"; + /** + * 流量订单数据统计延后处理时间(单位:分钟)-支付最迟需要30分钟才处理完成订单,所以延后处理时间要大于30 + */ + public static final Integer FLOW_ORDER_HANDLE_TIME = 40; + /** + * 数据量大时,系统单次处理数据的数量 + */ + public static final Long MAX_DATA_HANDLE_NUM = 10000L; + /** + * 0-Integer类型 + */ + public static final Integer ZERO_INTEGER = 0; + /** + * 0-Long类型 + */ + public static final Long ZERO_LONG = 0L; + /** + * 3个月 + */ + public static final Integer THREE_MONTH = 3; + /** + * 6个月 + */ + public static final Integer SIX_MONTH = 6; + /** + * 12个月 + */ + public static final Integer TWELVE_MONTH = 12; + + public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public static final String DATE_FORMAT_YMD = "yyyy-MM-dd"; + + + /** + * 商品分组中的商品数量 + */ + public static final Integer TAG_SPU_NUM = 3; + /** + * 订单最小金额 + * 单位:分 + */ + public static final Long MIN_ORDER_AMOUNT = 1L; + /** + * 一天中最大的小时数 + */ + public static final int MAX_HOUR_NUM_BY_DAY = 24; + /** + * 100及以上则为店铺消息 + */ + public static final Integer MULTI_SHOP_MESSAGE_TYPE = 100; + /** + * 用户未关注公众号的错误码 + */ + public static final int WX_MAX_NOT_FOLLOW = 43004; + public static final Integer MAX_PAGE_SIZE = 10000; + /** + * 用户拥有的最大余额 + */ + public static final long MAX_USER_BALANCE = 99999999999L; + public static final Long MAX_WECHA_TPAY_AMOUNT = 1000000000L; + /** + * 最大轮播图数量 + */ + public static final int MAX_INDEX_IMG_NUM = 10; + + /** + * 元和分相差100 + */ + public static final Integer ONE_HUNDRED = 100; + + public static final String CONTENT_TYPE = "content-type"; + + /** + * 出入库的编号前缀 + */ + public static final String OB = "OB"; + public static final String IB = "IB"; + + /** + * 最多可绑定十张对公户 + */ + public static final int MAX_COMPANY_CARD_NUM = 10; + + + /** + * 数字 + */ + public static final Integer TWO = 2; + + public static final Integer THREE = 3; + public static final Integer FOUR = 4; + public static final Integer FIVE = 5; + public static final Integer SIX = 6; + public static final Integer EIGHT = 8; + public static final Integer NINE = 9; + public static final Integer FIFTY = 50; + public static final Integer SIXTY = 60; + public static final Integer HUNDRED = 100; + + /** + * uuid正则校验表达式 + */ + public static final String UUID_PATTERN = "([0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12})"; + + /** + * 暂时的线上演示供应商id + */ + public static final Long ON_LINE_SUPPLIER_ID = 69L; + + /** + * 暂时的线上演示自提点id + */ + public static final Long ON_LINE_STATION_ID = 1L; + + /** + * 自提码前缀 + */ + public static final String PICKUP_CODE_PREFIX = "0"; + + /** + * 虚拟核销码前缀 + */ + public static final String VIRTUAL_CODE_PREFIX = "1"; + + /** + * aws s3预签名url有效时间(单位:秒)【默认:3分钟】 + */ + public static final Long S3_URL_DURATION_SECONDS = 180L; + + /** + * 允许上传的文件后缀名 + */ + public static final List FILE_SUFFIX_NAMES = Arrays.asList( + // 图片 + "gif", "jpeg", "png", "jpg", "bmp", + // 视频 + "mp4", "mov", "wmv", + // 其他文件 + "pdf" + ); +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/IdCardCollectProcessStatus.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/IdCardCollectProcessStatus.java new file mode 100644 index 0000000..a7cf3c6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/IdCardCollectProcessStatus.java @@ -0,0 +1,60 @@ +package com.tmerclub.cloud.common.constant; + +/** + * 影印件采集审核状态 0.未上传 1.待审核 2.只有工商认证通过 3.只有法人信息通过 4.均审核通过 + * + * @author TRACK + */ +public enum IdCardCollectProcessStatus { + + /** + * 未上传 + */ + UN_COMMITTED(0, "未上传"), + + /** + * 待审核 + */ + WAIT_AUDIT(1, "待审核"), + + /** + * 只有工商认证通过 + */ + REG(2, "只有工商认证通过"), + + /** + * 只有法人信息通过 + */ + ID_CARD(3, "只有法人信息通过"), + + /** + * 均审核通过 + */ + ALL(4, "均审核通过"); + + private final Integer num; + private final String str; + + public Integer value() { + return num; + } + + public String str() { + return str; + } + + IdCardCollectProcessStatus(Integer num, String name) { + this.num = num; + this.str = name; + } + + public static IdCardCollectProcessStatus instance(Integer value) { + IdCardCollectProcessStatus[] enums = values(); + for (IdCardCollectProcessStatus cardCollectProcessStatus : enums) { + if (cardCollectProcessStatus.value().equals(value)) { + return cardCollectProcessStatus; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/IsPassShopEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/IsPassShopEnum.java new file mode 100644 index 0000000..e79a0eb --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/IsPassShopEnum.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +/** + * @Author lth + * @Date 2021/5/12 11:19 + */ +public enum IsPassShopEnum { + /** + * 管理员 + */ + YES(1), + /** + * 用户 + */ + NO(0), + ; + + private final Integer value; + + public Integer value() { + return value; + } + + public Integer getValue() { + return value; + } + + + IsPassShopEnum(Integer value) { + this.value = value; + } + + public static IsPassShopEnum instance(Integer value) { + IsPassShopEnum[] enums = values(); + for (IsPassShopEnum statusEnum : enums) { + if (statusEnum.getValue().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PurchaseAmountType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PurchaseAmountType.java new file mode 100644 index 0000000..4fa6a07 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/PurchaseAmountType.java @@ -0,0 +1,54 @@ +package com.tmerclub.cloud.common.constant; + +import java.util.Objects; + +/** + * 采购金额类型 + * @author gaozijie + * @date 2023-08-28 + */ +public enum PurchaseAmountType { + /** + * 作废 + */ + CANCEL(-1, "采购作废金额", "采购作废金额"), + /** + * 收入/支出 + * 对商家来说是“支出” + * 对供应商来说是“收入” + */ + IN_OR_OUT(0, "采购支出金额", "采购收入金额"); + + private final int value; + + private final String shopDesc; + + private final String supplierDesc; + + PurchaseAmountType(int value, String shopDesc, String supplierDesc) { + this.value = value; + this.shopDesc = shopDesc; + this.supplierDesc = supplierDesc; + } + + public int getValue() { + return value; + } + + public String getShopDesc() { + return shopDesc; + } + + public String getSupplierDesc() { + return supplierDesc; + } + + public static PurchaseAmountType instance(Integer value) { + for (PurchaseAmountType type : PurchaseAmountType.values()) { + if (Objects.equals(value, type.getValue())) { + return type; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/QRCodeType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/QRCodeType.java new file mode 100644 index 0000000..f0d928e --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/QRCodeType.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +/** + * @author cl + * @date 2021-08-13 10:06:42 + */ +public enum QRCodeType { + /** + * 小程序团购商品 + */ + GROUP(1), + + /** + * 小程序分销商品二维码 + */ + DISTRIBUTION(2), + + /** + * 秒杀商品 + */ + SECKILL(3); + + private final Integer num; + + public Integer value() { + return num; + } + + QRCodeType(Integer num) { + this.num = num; + } + + public static QRCodeType instance(Integer value) { + QRCodeType[] enums = values(); + for (QRCodeType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/QiniuZone.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/QiniuZone.java new file mode 100644 index 0000000..c301fc0 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/QiniuZone.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +/** + * 七牛云zone的选择 + * + * @author FrozenWatermelon + */ +public enum QiniuZone { + + /** + * 华东机房相关 + */ + HUA_DONG(), + + /** + * 华北机房相关 + */ + HUA_BEI(), + + /** + * 华南机房相关 + */ + HUA_NAN(), + + /** + * 北美机房相关 + */ + BEI_MEI(), + + /** + * 新加坡机房相关 + */ + XIN_JIA_PO(), + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SearchPayType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SearchPayType.java new file mode 100644 index 0000000..c62fe8c --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SearchPayType.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +/** + * @author lhd + */ +public enum SearchPayType { + + /** + * 积分支付 + */ + SCOREPAY(0, "积分支付"), + + /** + * 微信支付 + */ + WECHATPAY(1, "微信支付"), + + /** + * 支付宝支付 + */ + ALIPAY(2, "支付宝支付"), + + /** + * 余额支付 + */ + BALANCE(3, "余额支付"); + + + private final Integer num; + + private final String payTypeName; + + public Integer value() { + return num; + } + + public String getPayTypeName() { + return payTypeName; + } + + SearchPayType(Integer num, String payTypeName) { + this.num = num; + this.payTypeName = payTypeName; + } + + public static SearchPayType instance(Integer value) { + SearchPayType[] enums = values(); + for (SearchPayType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getPayTypeName(Integer value) { + SearchPayType[] enums = values(); + for (SearchPayType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.payTypeName; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SignAcctType.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SignAcctType.java new file mode 100644 index 0000000..652fe05 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SignAcctType.java @@ -0,0 +1,32 @@ +package com.tmerclub.cloud.common.constant; + +/** + * @author track + */ +public enum SignAcctType { + + /** + * 个人 + */ + PERSONAL(1), + + /** + * 法人 + */ + LEGAL_PERSON(2), + + /** + * 企业 + */ + COMPANY(3); + + private final Integer value; + + public Integer getValue() { + return value; + } + + SignAcctType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SysTypeEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SysTypeEnum.java new file mode 100644 index 0000000..560860f --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/constant/SysTypeEnum.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.constant; + +/** + * 系统类型 + * + * @author FrozenWatermelon + * @date 2020/7/2 + */ +public enum SysTypeEnum { + + /** + * 普通用户系统 + */ + ORDINARY(0), + + /** + * 商家端 + */ + MULTISHOP(1), + + /** + * 平台端 + */ + PLATFORM(2), + + /** + * 供应商端 + */ + SUPPLIER(3), + + /** + * 自提门店端 + */ + STATION(4); + + private final Integer value; + + public Integer value() { + return value; + } + + SysTypeEnum(Integer value) { + this.value = value; + } + + public static SysTypeEnum instance(String value) { + SysTypeEnum[] enums = values(); + for (SysTypeEnum statusEnum : enums) { + if (String.valueOf(statusEnum.value()).equals(value)) { + return statusEnum; + } + } + return null; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dubbo/CoreConfigFeignClient.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dubbo/CoreConfigFeignClient.java new file mode 100644 index 0000000..cc7d319 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/dubbo/CoreConfigFeignClient.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.dubbo; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author TRACK + */ +public interface CoreConfigFeignClient { + + + /** + * 获取配置信息 + * + * @param key key + * @return 配置信息json + */ + ServerResponseEntity getConfig(@RequestParam("key") String key); + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/exception/LuckException.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/exception/LuckException.java new file mode 100644 index 0000000..28c4a2f --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/exception/LuckException.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.exception; + +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; + +/** + * @author FrozenWatermelon + * @date 2020/7/11 + */ +public class LuckException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** + * http状态码 + */ + private String code; + + private Object object; + + private ResponseEnum responseEnum; + + private ServerResponseEntity serverResponseEntity; + + public LuckException(String msg) { + super(msg); + } + + public LuckException(String msg, Object object) { + super(msg); + this.object = object; + } + + public LuckException(String msg, String code) { + super(msg); + this.code = code; + } + + public LuckException(String msg, Throwable cause) { + super(msg, cause); + } + + + public LuckException(ResponseEnum responseEnum) { + super(responseEnum.getMsg()); + this.responseEnum = responseEnum; + this.code = responseEnum.value(); + } + + public LuckException(ResponseEnum responseEnum, Object object) { + super(responseEnum.getMsg()); + this.responseEnum = responseEnum; + this.object = object; + this.code = responseEnum.value(); + } + + public LuckException(ServerResponseEntity serverResponseEntity) { + this.serverResponseEntity = serverResponseEntity; + } + + public ServerResponseEntity getServerResponseEntity() { + return serverResponseEntity; + } + + public Object getObject() { + return object; + } + + public ResponseEnum getResponseEnum() { + return responseEnum; + } + + public String getCode() { + return code; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/DefaultExceptionHandlerConfig.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/DefaultExceptionHandlerConfig.java new file mode 100644 index 0000000..af66b49 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/DefaultExceptionHandlerConfig.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.handler; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import io.seata.core.context.RootContext; +import io.seata.core.exception.TransactionException; +import io.seata.tm.api.GlobalTransactionContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.ArrayList; +import java.util.List; + +/** + * 自定义错误处理器,除了授权只要请求服务器成功,就返回200,错误根据错误码前端进行处理 + * + * @author FrozenWatermelon + * @date 2020/7/11 + */ +@RestController +@RestControllerAdvice +public class DefaultExceptionHandlerConfig { + + private static final Logger logger = LoggerFactory.getLogger(DefaultExceptionHandlerConfig.class); + + @ExceptionHandler({MethodArgumentNotValidException.class, BindException.class}) + public ResponseEntity>> methodArgumentNotValidExceptionHandler(Exception e) { + logger.error("methodArgumentNotValidExceptionHandler", e); + List fieldErrors = null; + if (e instanceof MethodArgumentNotValidException) { + fieldErrors = ((BindException) e).getBindingResult().getFieldErrors(); + } + if (e instanceof BindException) { + fieldErrors = ((BindException) e).getBindingResult().getFieldErrors(); + } + if (fieldErrors == null) { + return ResponseEntity.status(HttpStatus.OK) + .body(ServerResponseEntity.fail(ResponseEnum.METHOD_ARGUMENT_NOT_VALID)); + } + + List defaultMessages = new ArrayList<>(fieldErrors.size()); + for (FieldError fieldError : fieldErrors) { + defaultMessages.add(fieldError.getField() + ":" + fieldError.getDefaultMessage()); + } + return ResponseEntity.status(HttpStatus.OK) + .body(ServerResponseEntity.fail(ResponseEnum.METHOD_ARGUMENT_NOT_VALID, defaultMessages)); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResponseEntity>> methodArgumentNotValidExceptionHandler( + HttpMessageNotReadableException e) { + logger.error("methodArgumentNotValidExceptionHandler", e); + return ResponseEntity.status(HttpStatus.OK) + .body(ServerResponseEntity.fail(ResponseEnum.HTTP_MESSAGE_NOT_READABLE)); + } + + @ExceptionHandler(LuckException.class) + public ResponseEntity> luckExceptionHandler(LuckException e) throws TransactionException { + logger.error("mall4cloudExceptionHandler: {}", e.getServerResponseEntity(), e); + logger.info("RootContext.getXID(): {}", RootContext.getXID()); + if (StrUtil.isNotBlank(RootContext.getXID())) { + GlobalTransactionContext.reload(RootContext.getXID()).rollback(); + } + + ResponseEnum responseEnum = e.getResponseEnum(); + // 失败返回失败消息 + 状态码 + if (responseEnum != null) { + return ResponseEntity.status(HttpStatus.OK).body(ServerResponseEntity.fail(responseEnum, e.getObject())); + } + ServerResponseEntity serverResponseEntity = e.getServerResponseEntity(); + if (serverResponseEntity != null) { + return ResponseEntity.status(HttpStatus.OK).body(serverResponseEntity); + } + // 失败返回消息 状态码固定为直接显示消息的状态码 + return ResponseEntity.status(HttpStatus.OK).body(ServerResponseEntity.showFailMsg(e.getMessage())); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity> exceptionHandler(Exception e) throws TransactionException { + Throwable cause = e.getCause(); + if (cause != null && e.getCause() instanceof LuckException) { + return luckExceptionHandler((LuckException)cause); + } + logger.error("exceptionHandler", e); + logger.info("RootContext.getXID(): {}", RootContext.getXID()); + if (StrUtil.isNotBlank(RootContext.getXID())) { + GlobalTransactionContext.reload(RootContext.getXID()).rollback(); + } + return ResponseEntity.status(HttpStatus.OK).body(ServerResponseEntity.fail(ResponseEnum.EXCEPTION)); + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/SheetWrite.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/SheetWrite.java new file mode 100644 index 0000000..0514675 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/handler/SheetWrite.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.handler; + +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import com.tmerclub.cloud.common.constant.Constant; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Map; + +/** + * excel配置信息 + * + * @author YXF + * @date 2021-03-03 09:00:09 + */ +public class SheetWrite implements SheetWriteHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(SheetWrite.class); + public static final int LAST_ROW = 100000; + public static final int MAX_LENGTH = 255; + public static final double TWENTY_FIVE_DOUBLE = 25.0; + public static final double TWENTY_SIX_DOUBLE = 26.0; + public static final int TWENTY_SIX = 26; + public static final int TWENTY_FIVE = 25; + public static final int SIXTY_FIVE = 65; + private Map mapDropDown; + private Integer firstRow; + + public SheetWrite() { + } + + public SheetWrite(Map mapDropDown, Integer firstRow) { + this.mapDropDown = mapDropDown; + this.firstRow = 0 > firstRow ? 0 : firstRow; + } + + @Override + public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + + } + + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper(); + // 区间设置 第一列第一行和第二行的数据。 + // 由于第一行是头,所以第一、二行的数据实际上是第二三行 + //从第五行开始 100行都是这个 + //fristRow表示 从第几行开始 到第几行结束 表格行从0开始的 + //firstCol表示 从第几列开始 到第几列结束 表格列从0开始的 + for (Map.Entry entry : mapDropDown.entrySet()) { + CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(this.firstRow, LAST_ROW, entry.getKey(), entry.getKey()); + DataValidation dataValidation; + //设置下拉框数据 + if (useSheet(entry.getValue())) { + LOGGER.info("超过255字符下拉框数据为:{}", Arrays.toString(entry.getValue())); + dataValidation = create(writeWorkbookHolder, helper, entry, cellRangeAddressList); + } else { + LOGGER.info("下拉框数据为:{}", Arrays.toString(entry.getValue())); + DataValidationConstraint constraint = helper.createExplicitListConstraint(entry.getValue()); + dataValidation = helper.createValidation(constraint, cellRangeAddressList); + } + //处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + writeSheetHolder.getSheet().addValidationData(dataValidation); + } + } + + private static boolean useSheet(String[] value) { + // excel下拉框允许的最大长度, 超过此长度则不显示下拉框的内容 + StringBuilder stringBuilder = new StringBuilder(10); + for (String s : value) { + stringBuilder.append(s); + // XSSFDataValidationConstraint在校验长度的时候会加上逗号,所以这里也要加上 + stringBuilder.append(","); + if (stringBuilder.length() >= MAX_LENGTH) { + return true; + } + } + return false; + } + + private DataValidation create(WriteWorkbookHolder writeWorkbookHolder, DataValidationHelper helper, Map.Entry entry, CellRangeAddressList cellRangeAddressList) { + /* 解决办法从这里开始 */ + //获取一个workbook + //定义sheet的名称 + Workbook workbook = writeWorkbookHolder.getWorkbook(); + String hiddenName = "hidden" + entry.getKey(); + //1.创建一个隐藏的sheet 名称为 hidden + Sheet hidden = workbook.createSheet(hiddenName); + //2.循环赋值(为了防止下拉框的行数与隐藏域的行数相对应,将隐藏域加到结束行之后) + int index = 0; + for (String value : entry.getValue()) { + // 3:表示你开始的行数 3表示 你开始的列数 + hidden.createRow(firstRow + index).createCell(entry.getKey()).setCellValue(value); + index++; + } + Name name = workbook.createName(); + name.setNameName(hiddenName); + //4 A1:A代表隐藏域创建第N列createCell(N)时。以A1列开始A行数据获取下拉数组 + String columnLabel = getExcelColumnLabel(entry.getKey()); + name.setRefersToFormula(hiddenName + "!$" + columnLabel + "$1:$" + columnLabel + "$65535"); + //5 将刚才设置的sheet引用到你的下拉列表中 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hiddenName); + return helper.createValidation(constraint, cellRangeAddressList); + } + + private static String getExcelColumnLabel(int num) { + StringBuilder temp = new StringBuilder(Constant.INITIAL_CAPACITY); + double number = Math.floor(StrictMath.log(TWENTY_FIVE_DOUBLE * (num) / TWENTY_SIX_DOUBLE + 1) / StrictMath.log(TWENTY_SIX)) + 1; + if (1 < number) { + double sub = num - TWENTY_SIX * (StrictMath.pow(TWENTY_SIX, number - 1) - 1) / TWENTY_FIVE; + for (double d = number; 0 < d; d--) { + temp.append((char) (sub / StrictMath.pow(TWENTY_SIX, d - 1) + SIXTY_FIVE)); + sub = sub % StrictMath.pow(TWENTY_SIX, d - 1); + } + } else { + temp.append((char) (num + SIXTY_FIVE)); + } + return temp.toString(); + + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/model/BaseModel.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/model/BaseModel.java new file mode 100644 index 0000000..537bab7 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/model/BaseModel.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.model; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 阿里java开发手册: 【强制】表必备三字段:id, create_time, update_time。 说明:其中 id 必为主键,类型为 bigint + * unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime + * 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。 + * + * @author FrozenWatermelon + */ +public class BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 创建时间 + */ + protected Date createTime; + + /** + * 更新时间 + */ + protected Date updateTime; + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BaseModel{" + "createTime=" + createTime + ", updateTime=" + updateTime + '}'; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/model/ExcelModel.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/model/ExcelModel.java new file mode 100644 index 0000000..e6b3962 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/model/ExcelModel.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.model; + +import java.io.Serial; +import java.io.Serializable; + +/** + * excel类模板 + * + * @author YXF + * + */ +public class ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "excel"; + public static final String SHEET_NAME = "sheet"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/response/ResponseEnum.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/response/ResponseEnum.java new file mode 100644 index 0000000..7cb562f --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/response/ResponseEnum.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.response; + +/** + * @author FrozenWatermelon + * @date 2020/7/9 + */ +public enum ResponseEnum { + + /** + * ok + */ + OK("00000", "ok"), + + /** + * 用于直接显示提示用户的错误,内容由输入内容决定 + */ + SHOW_FAIL("A00001", ""), + + /** + * 方法参数没有校验,内容由输入内容决定 + */ + METHOD_ARGUMENT_NOT_VALID("A00002", ""), + + /** + * 无法读取获取请求参数 + */ + HTTP_MESSAGE_NOT_READABLE("A00003", "请求参数格式有误"), + + /** + * 未授权 + */ + UNAUTHORIZED("A00004", "Unauthorized"), + + /** + * 服务器出了点小差 + */ + EXCEPTION("A00005", "服务器出了点小差"), + + /** + * 验证码有误 + */ + VERIFICATION_CODE_ERROR("A00006", "验证码有误或已过期"), + + /** + * 数据异常 + */ + DATA_ERROR("A00007", "数据异常,请刷新后重新操作"), + + /** + * 一些需要登录的接口,而实际上因为前端无法知道token是否已过期,导致token已失效时, + * 应该返回一个状态码,告诉前端token已经失效了,及时清理 + */ + CLEAN_TOKEN("A00008", "clean token"), + + /** + * 刷新token已过期 + */ + REFRESH_TOKEN_EXIST("A00009", "refresh token exist"), + + /** + * 数据不完整 + */ + DATA_INCOMPLETE("A00010", "数据不完整"), + + /** + * 有敏感词 + */ + SENSITIVE_WORD("A00011", "存在敏感词,请重新输入"), + + /** + * TempUid异常 + * 一般不会出现这个异常,出现这个异常会有两种已知可能 + * 1. 一种是旧的tempUid + * 2. 一种是同域名的localstorage 有个也叫tempUid的存储覆盖了(有的人测试环境和正式环境放在同一个域名不同子目录下) + * 如果前端看到返回了这个异常,为了让用户能够顺利登录,需要重新获取一遍code,重新获取tempUid + */ + TEMP_UID_ERROR("A00012", "TempUid Error"), + + /** + * 01开头代表商品 + * 商品已下架,返回特殊的状态码,用于渲染商品下架的页面 + */ + SPU_NOT_EXIST("A01000", "商品不存在"), + + /** + * 02开头代表购物车 + */ + SHOP_CART_NOT_EXIST("A02000", "商品已下架"), + + /** + * 03开头代表订单 + */ + ORDER_NOT_EXIST("A03000", "订单不存在"), + + /** + * 订单不支持该配送方式 + */ + ORDER_DELIVERY_NOT_SUPPORTED("A03001", "The delivery method is not supported"), + + /** + * 请勿重复提交订单, + * 1.当前端遇到该异常时,说明前端防多次点击没做好 + * 2.提示用户 订单已发生改变,请勿重复下单 + */ + REPEAT_ORDER("A03002", "please don't repeat order"), + + /** + * 库存不足,body会具体返回那个skuid的库存不足,后台通过skuId知道哪个商品库存不足,前端不需要判断 + */ + NOT_STOCK("A03010", "not stock"), + + /** + * 积分不足,用户拥有的积分小于购买商品所需的积分(积分订单使用) + */ + NOT_SCORE("A03020", "not score"), + + /** + * 提交订单时判断商品下架 + */ + SPU_STATUS_ERROR("A03030", "商品已下架"), + + /** + * 04 开头代表注册登录之类的异常状态 + * 社交账号未绑定,当前端看到该异常时,应该在合适的时间(比如在购买的时候跳)根据社交账号的类型,跳转到绑定系统账号的页面 + */ + SOCIAL_ACCOUNT_NOT_BIND("A04001", "social account not bind"), + + /** + * 该社交账号被其他用户绑定了,如果返回这个状态码,前端应该提示用户解绑已经绑定的账号重新绑定 + */ + SOCIAL_ACCOUNT_BIND_BY_OTHER("A04002", "social account bind by other"), + + /** + * 为了避免定时任务过慢,而商品活动实际已过期时,获取活动时异常信息用特殊的状态码返回,防止服务渲染出现错误 + */ + ACTIVITY_END("A05001", "activity end"), + + /** + * 存在未完成订单不能注销 + */ + DESTROY_USER_FAIL("A06001", "您的账户当前有未完成的订单,请待所有订单完成后再注销账户"), + + /** + * 用户收货地址超过配送范围 + */ + DELIVERY_OVER("A07001", "当前区域不支持配送"), + + /** + * 该提货码,没有对应的订单 + */ + STATION_NULL("A08001", "该提货码,没有对应的订单"); + + private final String code; + + private final String msg; + + public String value() { + return code; + } + + public String getMsg() { + return msg; + } + + ResponseEnum(String code, String msg) { + this.code = code; + this.msg = msg; + } + + @Override + public String toString() { + return "ResponseEnum{" + "code='" + code + '\'' + ", msg='" + msg + '\'' + "} " + super.toString(); + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/response/ServerResponseEntity.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/response/ServerResponseEntity.java new file mode 100644 index 0000000..028be3b --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/response/ServerResponseEntity.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.response; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.tmerclub.cloud.common.serializer.SensitiveJsonSerializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 统一的返回数据 + * + * @author FrozenWatermelon + * @date 2020/7/3 + */ +@SuppressWarnings("rawtypes") +public class ServerResponseEntity implements Serializable { + + private static final Logger log = LoggerFactory.getLogger(ServerResponseEntity.class); + + /** + * 状态码 + */ + private String code; + + /** + * 信息 + */ + private String msg; + + /** + * 数据 + */ + @JsonSerialize(using = SensitiveJsonSerializer.class) + private T data; + + /** + * 版本 + */ + private String version; + + /** + * 时间 + */ + private Long timestamp; + + private String sign; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public ServerResponseEntity setData(T data) { + this.data = data; + return this; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public ServerResponseEntity() { + // 版本号 + this.version = "mall4j.v240108"; + } + + public boolean isSuccess() { + return Objects.equals(ResponseEnum.OK.value(), this.code); + } + + public static ServerResponseEntity success(T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setData(data); + serverResponseEntity.setCode(ResponseEnum.OK.value()); + return serverResponseEntity; + } + + public static ServerResponseEntity success() { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(ResponseEnum.OK.value()); + serverResponseEntity.setMsg(ResponseEnum.OK.getMsg()); + return serverResponseEntity; + } + + public static ServerResponseEntity success(Integer code, T data) { + return success(String.valueOf(code), data); + } + + public static ServerResponseEntity success(String code, T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(code); + serverResponseEntity.setData(data); + return serverResponseEntity; + } + + /** + * 前端显示失败消息 + * + * @param msg 失败消息 + * @return + */ + public static ServerResponseEntity showFailMsg(String msg) { + log.error(msg); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(msg); + serverResponseEntity.setCode(ResponseEnum.SHOW_FAIL.value()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(ResponseEnum responseEnum) { + log.error(responseEnum.toString()); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(responseEnum.getMsg()); + serverResponseEntity.setCode(responseEnum.value()); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(ResponseEnum responseEnum, T data) { + log.error(responseEnum.toString()); + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(responseEnum.getMsg()); + serverResponseEntity.setCode(responseEnum.value()); + serverResponseEntity.setData(data); + return serverResponseEntity; + } + + public static ServerResponseEntity fail(Integer code, T data) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setCode(String.valueOf(code)); + serverResponseEntity.setData(data); + return serverResponseEntity; + } + + @SuppressWarnings("unchecked") + public static ServerResponseEntity transform(ServerResponseEntity oldServerResponseEntity) { + ServerResponseEntity serverResponseEntity = new ServerResponseEntity<>(); + serverResponseEntity.setMsg(oldServerResponseEntity.getMsg()); + serverResponseEntity.setCode(oldServerResponseEntity.getCode()); + serverResponseEntity.setData((T) oldServerResponseEntity.getData()); + log.error(serverResponseEntity.toString()); + return serverResponseEntity; + } + + @Override + public String toString() { + return "ServerResponseEntity{" + + "code='" + code + '\'' + + ", msg='" + msg + '\'' + + ", data=" + data + + ", version='" + version + '\'' + + ", timestamp=" + timestamp + + ", sign='" + sign + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/serializer/SensitiveJsonSerializer.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/serializer/SensitiveJsonSerializer.java new file mode 100644 index 0000000..c3c041a --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/serializer/SensitiveJsonSerializer.java @@ -0,0 +1,86 @@ +package com.tmerclub.cloud.common.serializer; + +import cn.hutool.core.collection.CollectionUtil; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.handler.SensitiveHandler; +import jakarta.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +/** + * @author TRACK + */ +@Component +public class SensitiveJsonSerializer extends JsonSerializer { + + private static final Logger logger = LoggerFactory.getLogger(SensitiveJsonSerializer.class); + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private SensitiveHandler sensitiveHandler; + + private static final String MENU_PERMISSION_USER_LIST = "/mp/menu_permission/list"; + private static final String MENU_PERMISSION_USER_PAGE = "/mp/menu_permission/page"; + private static final String SENSITIVE_WORD_SEARCH_URL = "/p/sys_config/info/SENSITIVE_WORDS"; + private static final String GET_CAPTCHA = "/ua/captcha/get"; + private static final String CHECK_CAPTCHA = "/ua/captcha/check"; + + static final Set SENSITIVE_WHITE_SET; + + static { + SENSITIVE_WHITE_SET = new HashSet<>(Constant.INITIAL_CAPACITY); + SENSITIVE_WHITE_SET.add(SENSITIVE_WORD_SEARCH_URL); + SENSITIVE_WHITE_SET.add(GET_CAPTCHA); + SENSITIVE_WHITE_SET.add(CHECK_CAPTCHA); + SENSITIVE_WHITE_SET.add(MENU_PERMISSION_USER_LIST); + SENSITIVE_WHITE_SET.add(MENU_PERMISSION_USER_PAGE); + } + + + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (Objects.isNull(requestAttributes)) { + gen.writeObject(value); + return; + } + HttpServletRequest request = requestAttributes.getRequest(); + + AntPathMatcher antPathMatcher = new AntPathMatcher(); + if (CollectionUtil.isNotEmpty(SENSITIVE_WHITE_SET)) { + for (String sensitiveUrl : SENSITIVE_WHITE_SET) { + if (antPathMatcher.match(sensitiveUrl, request.getRequestURI())) { + gen.writeObject(value); + return; + } + } + } + if (Objects.isNull(value)) { + return; + } + try { + String jsonData = objectMapper.writeValueAsString(value); + String sensitiveText = sensitiveHandler.replaceSensitiveWord(jsonData, SensitiveHandler.MIN_MATCH_TYPE, "*"); + + gen.writeObject(objectMapper.readValue(sensitiveText, value.getClass())); + } catch (Exception e) { + logger.error("敏感词替换错误:", e); + } + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/BooleanUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/BooleanUtil.java new file mode 100644 index 0000000..06ea3d9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/BooleanUtil.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Field; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/9/2 + */ +public class BooleanUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(BooleanUtil.class); + + /** + * 判断一个数字是否为true(等于1就是true) + * @param num 输入的数字 + * @return 是否为true + */ + public static boolean isTrue(Integer num) { + if (num == null) { + return false; + } + return Objects.equals(num, 1); + } + + /** + * 判断对象中属性值是否全为空 + * + * @param object + * @return + */ + public static boolean checkObjAllFieldsIsNull(Object object) { + if (null == object) { + return true; + } + + try { + for (Field f : object.getClass().getDeclaredFields()) { + f.setAccessible(true); + + if (f.get(object) != null && StringUtils.isNotBlank(f.get(object).toString())) { + return false; + } + + } + } catch (Exception e) { + LOGGER.error("异常:", e); + } + + return true; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/DateUtils.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/DateUtils.java new file mode 100644 index 0000000..87a3220 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/DateUtils.java @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.vo.DateVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 时间工具类 + * @author lhd + */ +public class DateUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(DateUtils.class); + public static final int MONTHS = 12; + public static final int LAST_HOUR = 23; + public static final int LAST_MIN = 59; + public static final int MAX_MILLISECOND = 999; + + public static Long dateToNumber(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String format = sdf.format(date); + long value = 0L; + try { + value = Long.parseLong(format); + } catch (Exception e) { + return value; + } + return value; + } + + public static String dateToStrYmd(Date date) { + String format = "yyyy-MM-dd"; + return DateUtil.format(date, format); + } + + public static List findDates(Date dBegin, Date dEnd) { + List lDate = new ArrayList<>(Constant.INITIAL_CAPACITY); + lDate.add(dBegin); + Calendar cBegin = Calendar.getInstance(); + Calendar cEnd = Calendar.getInstance(); + // 使用给定的 Date 设置此 Calendar 的时间 + cBegin.setTime(dBegin); + cEnd.setTime(dEnd); + + cEnd.add(Calendar.DAY_OF_MONTH, -2); + // 测试此日期是否在指定日期之后 + while (cEnd.getTime().after(cBegin.getTime())) { + // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 + cBegin.add(Calendar.DAY_OF_MONTH, 1); + lDate.add(dateToLast(cBegin.getTime())); + } + return lDate; + } + + public static List findEveryDays(Date dBegin, Date dEnd) { + List params = new ArrayList<>(Constant.INITIAL_CAPACITY); + Calendar calBegin = Calendar.getInstance(); + // 使用给定的 Date 设置此 Calendar 的时间 + calBegin.setTime(dBegin); + Calendar calEnd = Calendar.getInstance(); + // 使用给定的 Date 设置此 Calendar 的时间 + calEnd.setTime(dEnd); + calEnd.add(Calendar.DAY_OF_MONTH, -2); + // 判断两个时间是否为同一天 + if (!DateUtil.isSameDay(dBegin, dEnd)) { + DateVO first = new DateVO(); + first.setStartTime(dBegin); + first.setEndTime(dateToLast(dBegin)); + params.add(first); + } + // 测试此日期是否在指定日期之后 + while (calEnd.getTime().after(calBegin.getTime())) { + DateVO res = new DateVO(); + // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 + calBegin.add(Calendar.DAY_OF_MONTH, 1); + res.setEndTime(dateToLast(calBegin.getTime())); + res.setStartTime(dateToFast(calBegin.getTime())); + params.add(res); + } + DateVO last = new DateVO(); + last.setStartTime(dateToFast(dEnd)); + last.setEndTime(dEnd); + params.add(last); + return params; + } + + public static Date dateToFast(Date date) { + return dateToFastOrLast(date, 1); + } + + public static Date dateToLast(Date date) { + return dateToFastOrLast(date, 2); + } + + /** + * 获取传入时间的前一天的初始和结束时间 + */ + public static Date getBeforeDate(Date date) { + Calendar instance = Calendar.getInstance(); + instance.setTime(date); + instance.add(Calendar.DATE, -1); + return instance.getTime(); + } + + /** + * 获取传入时间的前n年时间点 + * @param n 例如: n = -1 表示当前时间的前一年, n = 1 表示获取后一年 + */ + public static Date getBeforeYear(Date date, int n) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.YEAR, n); + return calendar.getTime(); + } + + /** + * 获取传入时间的前n月时间点 + * @param n 例如: n = -1 表示当前时间的前一月, n = 1 表示获取后一月 + */ + public static Date getBeforeOrNextNumMonth(Date date, int n) { + Calendar instance = Calendar.getInstance(); + instance.setTime(date); + instance.add(Calendar.MONTH, n); + return instance.getTime(); + } + + /** + * 获取传入时间的前n天时间点 + * @param n 例如: n = -1 表示当前时间的前一天, n = 1 表示获取后一天 + */ + public static Date getBeforeDay(Date date, int n) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, n); + return calendar.getTime(); + } + + public static String dateToString(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(date); + } + + /** + * + * @param date 2020-06-12 15:00:00 + * @param type 1 date 的开始时间例如: 2020-06-12 00:00:00 + * 2 date 的结束时间例如: 2020-06-12 23:59:59 + * @return + */ + public static Date dateToFastOrLast(Date date, Integer type) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int y = calendar.get(Calendar.YEAR); + int m = calendar.get(Calendar.MONTH) + 1; + int day = calendar.get(Calendar.DAY_OF_MONTH); + String dateStr; + if (Objects.equals(1, type)) { + dateStr = y + "-" + m + "-" + day + " 00:00:00"; + } else { + dateStr = y + "-" + m + "-" + day + " 23:59:59"; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date parse = sdf.parse(dateStr); + calendar.setTime(parse); + } catch (ParseException e) { + LOGGER.info("解析异常:", e); + } + return calendar.getTime(); + } + + public static List getMonthBetweenStartTimeAndEndTime(Date startTime, Date endTime) { + List monthBetween = getMonthBetween(startTime, endTime); + if (monthBetween.isEmpty()) { + DateVO param = new DateVO(); + param.setStartTime(startTime); + param.setEndTime(endTime); + monthBetween.add(param); + return monthBetween; + } + if (1 == monthBetween.size()) { + DateVO param = monthBetween.get(0); + param.setEndTime(endTime); + monthBetween.set(0, param); + return monthBetween; + } + DateVO param = monthBetween.get(0); + param.setStartTime(startTime); + DateVO last = monthBetween.get(monthBetween.size() - 1); + last.setEndTime(endTime); + monthBetween.set(0, param); + monthBetween.set(monthBetween.size() - 1, last); + return monthBetween; + } + + public static List getMonthBetween(Date minDate, Date maxDate) { + List res = new ArrayList<>(1); + Calendar min = Calendar.getInstance(); + Calendar max = Calendar.getInstance(); + + min.setTime(minDate); + min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1); + + max.setTime(maxDate); + max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2); + + while (min.before(max)) { + DateVO param = new DateVO(); + Date time = min.getTime(); + param.setStartTime(getMonthFirstOrLastDay(time, 0)); + param.setEndTime(getMonthFirstOrLastDay(time, 1)); + res.add(param); + min.add(Calendar.MONTH, 1); + } + return res; + } + + public static int countMonthNumBetweenDate(Date startTime, Date endTime) { + Calendar min = Calendar.getInstance(); + min.setTime(startTime); + Calendar max = Calendar.getInstance(); + max.setTime(endTime); + int year = max.get(Calendar.YEAR) - min.get(Calendar.YEAR); + //开始日期若小月结束日期 + if (0 > year) { + year = -year; + return year * MONTHS + min.get(Calendar.MONTH) - max.get(Calendar.MONTH); + } + return year * MONTHS + max.get(Calendar.MONTH) - min.get(Calendar.MONTH); + } + + /** + * @param date 传入的时间点 2020-03-12 15:30:00 + * @param type 0 获取传入时间的月份开始时间 2020-03-01 00:00:00 + * 1 获取传入时间的月份最后一天的时刻 2020-03-31 23:59:59 + * @return date + */ + public static Date getMonthFirstOrLastDay(Date date, Integer type) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + if (Objects.equals(0, type)) { + // 获取传入时间的月份的第一天 yyyy-MM-dd 00:00:00 + calendar.add(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + } else { + // 获取传入时间的月份的最后一天 yyyy-MM-dd 23:59:59 + calendar.add(Calendar.MONTH, 1); + calendar.set(Calendar.DAY_OF_MONTH, 0); + calendar.set(Calendar.HOUR_OF_DAY, LAST_HOUR); + calendar.set(Calendar.MINUTE, LAST_MIN); + calendar.set(Calendar.SECOND, LAST_MIN); + } + return calendar.getTime(); + } + + + /** + * 时间转换成iso格式 + * @param date + * @return + */ + public static Date dateToIsoDate(Date date) { + //T代表后面跟着时间,Z代表UTC统一时间 + SimpleDateFormat format = + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT"))); + String isoDate = format.format(date); + try { + return format.parse(isoDate); + } catch (ParseException e) { + LOGGER.info("转换错误", e); + } + return null; + } + + /** + * 获取本周开始时间 + */ + public static Date getCurrentWeekStartTimes(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0); + cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + return cal.getTime(); + } + + /** + * 获取本周结束时间 + */ + public static Date getCurrentWeekEndTimes(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(getCurrentWeekStartTimes(date)); + cal.add(Calendar.DAY_OF_WEEK, 6); + cal.set(Calendar.HOUR_OF_DAY, LAST_HOUR); + cal.set(Calendar.MINUTE, LAST_MIN); + cal.set(Calendar.SECOND, LAST_MIN); + cal.set(Calendar.MILLISECOND, MAX_MILLISECOND); + return cal.getTime(); + } + + /** + * 获取当年的开始时间戳 + * + * @return + */ + public static Date getCurrentYearStartTime(Date date) { + // 获取当前日期 + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(date.getTime()); + calendar.add(Calendar.YEAR, 0); + calendar.add(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_YEAR, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + /** + * 获取当年的最后时间戳 + * + * @return + */ + public static Date getCurrentYearEndTime(Date date) { + // 获取当前日期 + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(date.getTime()); + int year = calendar.get(Calendar.YEAR); + calendar.clear(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.HOUR_OF_DAY, LAST_HOUR); + calendar.set(Calendar.MINUTE, LAST_MIN); + calendar.set(Calendar.SECOND, LAST_MIN); + calendar.set(Calendar.MILLISECOND, MAX_MILLISECOND); + calendar.roll(Calendar.DAY_OF_YEAR, -1); + return calendar.getTime(); + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/ImageUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/ImageUtil.java new file mode 100644 index 0000000..da9cb2b --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/ImageUtil.java @@ -0,0 +1,145 @@ +package com.tmerclub.cloud.common.util; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +/** + * 图片处理工具类 + * + * @author lanhai + */ +public class ImageUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(ImageUtil.class); + + private static final String JPG = "jpg"; + public static final String PNG = "png"; + private static final String JPEG = "jpeg"; + + /** + * 将图片转为二进制数组 + * + * @param imgUrl + * @return + */ + public static byte[] imgToBinary(String imgUrl, String fileType) { + try { + BufferedImage bufferedImage = ImageIO.read(new URL(imgUrl)); + if (bufferedImage == null) { + // 图片格式不兼容,可能是webp格式,推荐使用jpg或png + throw new LuckException("图片格式不兼容,可能是webp格式,推荐使用jpg或png"); + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + //ImageIO无法写入jpeg文件 报Invalid argument to native writeImage,需重画 + if (JPG.equalsIgnoreCase(fileType) || JPEG.equalsIgnoreCase(fileType)) { + BufferedImage tag; + tag = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_INT_BGR); + Graphics g = tag.getGraphics(); + g.drawImage(bufferedImage, 0, 0, null); + g.dispose(); + bufferedImage = tag; + } + ImageIO.write(bufferedImage, fileType, baos); + return baos.toByteArray(); + } catch (IOException e) { + // 图片丢失,请重新上传图片 + throw new LuckException("图片丢失,请重新上传图片"); + } + } + + /** + * @param imgUrl + * @return 文件得后缀,文件类型 jpg , png , ... + */ + public static String imgUrlFileType(String imgUrl) { + if (StrUtil.isBlank(imgUrl)) { + return imgUrl; + } + imgUrl = imgUrl.trim(); + String[] split = imgUrl.split("\\."); + return split[split.length - 1]; + } + + /** + * @param imgUrl + * @return 获取文件名称 + */ + public static String imgUrlFileName(String imgUrl) { + if (StrUtil.isBlank(imgUrl)) { + return imgUrl; + } + imgUrl = imgUrl.trim(); + String[] split = imgUrl.split("/"); + return split[split.length - 1]; + } + + /** + * @param imgUrl + * @return 获取文件名称 45d3631e97d8438d80f9db1369595b8c + */ + public static String imgUrlFileNameNoSuffix(String imgUrl) { + if (StrUtil.isBlank(imgUrl)) { + return imgUrl; + } + imgUrl = imgUrl.trim(); + String[] split = imgUrl.split("/"); + String s = split[split.length - 1]; + String[] split1 = s.split("\\."); + return split1[0]; + } + + /** + * 将图片转为base64处理后的字符串 + * + * @param imageFile + * @param imageType + * @return + */ + public static String encodeImageToBase64(InputStream imageFile, String imageType) { + if (!imageType.equalsIgnoreCase(JPG) && !imageType.equalsIgnoreCase(PNG)) { + throw new LuckException("仅支持上传jpg、png格式的图片"); + } + try { + BufferedImage bufferedImage = ImageIO.read(imageFile); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ImageIO.write(bufferedImage, imageType, outputStream); + return Base64.encode(outputStream.toByteArray()); + } catch (IOException e) { + throw new LuckException("图片丢失,请重新上传图片"); + } + } + + /** + * 将图片转为base64处理后的字符串 + * + * @param imgUrl 图片路径 + * @param imageType + * @return + */ + public static String encodeImageToBase64(String imgUrl, String imageType) { + if (!imageType.equalsIgnoreCase(JPG) && !imageType.equalsIgnoreCase(PNG)) { + throw new LuckException("仅支持上传jpg、png格式的图片"); + } + try { + LOGGER.info("开始把图片{}转换为base64", imgUrl); + BufferedImage bufferedImage = ImageIO.read(new URL(imgUrl)); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ImageIO.write(bufferedImage, imageType, outputStream); + String encode = Base64.encode(outputStream.toByteArray()); + LOGGER.info("图片转换base64转换结果{}", encode); + return encode; + } catch (IOException e) { + throw new LuckException("图片丢失,请重新上传图片"); + } + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/Json.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/Json.java new file mode 100644 index 0000000..91448ee --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/Json.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/7/11 + */ +public class Json { + + private static final Logger logger = LoggerFactory.getLogger(Json.class); + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + static { + // 如果为空则不输出 + OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + // 对于空的对象转json的时候不抛出错误 + OBJECT_MAPPER.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + // 禁用序列化日期为timestamps + OBJECT_MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + // 禁用遇到未知属性抛出异常 + OBJECT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + // jsr310 + OBJECT_MAPPER.registerModule(new JavaTimeModule()); + } + + /** + * 对象转json + * + * @param object 对象 + * @return json + */ + public static String toJsonString(Object object) { + try { + return OBJECT_MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + logger.error("toJsonString() error: {}", e.getMessage()); + } + return ""; + } + + /** + * json转换换成对象 + * + * @param json json + * @param clazz clazz + * @return Class + */ + public static T parseObject(String json, Class clazz) { + if (json == null) { + return null; + } + T result = null; + try { + result = OBJECT_MAPPER.readValue(json, clazz); + } catch (Exception e) { + logger.error("parseObject() error: {}", e.getMessage()); + } + return result; + } + + /** + * json转换换成对象 + * + * @param src src + * @param clazz clazz + * @return Class + */ + public static T parseObject(byte[] src, Class clazz) { + T result = null; + try { + result = OBJECT_MAPPER.readValue(src, clazz); + } catch (Exception e) { + logger.error("parseObject() error: {}", e.getMessage()); + } + return result; + } + + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } + + /** + * * + * ... + * * List MyClass myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class)) + * * works up to 10 time faster than TypeRefence. + * + * @return List数组 + */ + public static List parseArray(String json, Class clazz) { + if (json == null) { + return null; + } + T[] result = null; + try { + result = OBJECT_MAPPER.readValue(json, clazz); + } catch (Exception e) { + logger.error("parseArray() error: {}", e.getMessage()); + } + if (Objects.isNull(result)) { + return Collections.emptyList(); + } + return Arrays.asList(result); + } + + public static List parseArray(byte[] src, Class clazz) { + T[] result = null; + try { + result = OBJECT_MAPPER.readValue(src, clazz); + } catch (Exception e) { + logger.error("parseArray() error: {}", e.getMessage()); + } + if (null == result) { + return Collections.emptyList(); + } + return Arrays.asList(result); + } + + + /** + * 转换成json节点,即map + * + * @param jsonStr jsonStr + * @return JsonNode + */ + public static JsonNode parseJson(String jsonStr) { + if (jsonStr == null) { + return null; + } + JsonNode jsonNode = null; + try { + jsonNode = OBJECT_MAPPER.readTree(jsonStr); + } catch (Exception e) { + logger.error("parseJson() error: {}", e.getMessage()); + } + return jsonNode; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PasswordUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PasswordUtil.java new file mode 100644 index 0000000..a50ecb9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/PasswordUtil.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + + +import com.tmerclub.cloud.common.exception.LuckException; + +import java.util.regex.Pattern; + +/** + * 密码检验 + * @author YXF + */ +public class PasswordUtil { + + /** + * 密码由字母、数字和特殊符号三种字符组成8-20位半角字符,区分大小写(检验时) + */ + private static final Pattern PASSWORD_PATTERN = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d)(?=.*(\\W|_))[A-Za-z\\d(\\W|_)]{8,20}$"); + + public static void check(String password) { + if (!checkFormat(password)) { + // 这个异常是提示前端的,要在页面判断密码格式是否正确 + throw new LuckException("密码由字母、数字和特殊符号三种字符组成8-20位半角字符,区分大小写"); + } + } + + public static boolean checkFormat(String password) { + return PASSWORD_PATTERN.matcher(password).matches(); + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/SheetUtil.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/SheetUtil.java new file mode 100644 index 0000000..bd44221 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/SheetUtil.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2023/11/22 15:46 + */ +public class SheetUtil { + + /** + * 判断execl文档是否为空 + * @param file + * @return + */ + public static Boolean sheetIsNull(MultipartFile file) { + InputStream inputStream = null; + XSSFWorkbook workbook; + try { + inputStream = file.getInputStream(); + workbook = new XSSFWorkbook(inputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + + try { + XSSFSheet sheetAt = workbook.getSheetAt(0); + } catch (Exception e) { + return true; + } + return false; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/SpringContextUtils.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/SpringContextUtils.java new file mode 100644 index 0000000..a6ee584 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/util/SpringContextUtils.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * Spring Context 工具类 + * + * @author FrozenWatermelon + * @date 2020/7/11 + */ +@Component +public class SpringContextUtils implements ApplicationContextAware { + + public static ApplicationContext applicationContext; + + @SuppressWarnings("NullableProblems") + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtils.applicationContext = applicationContext; + } + + public static Object getBean(String name) { + return applicationContext.getBean(name); + } + + public static T getBean(Class requiredType) { + return applicationContext.getBean(requiredType); + } + + public static T getBean(String name, Class requiredType) { + return applicationContext.getBean(name, requiredType); + } + + public static boolean containsBean(String name) { + return applicationContext.containsBean(name); + } + + public static boolean isSingleton(String name) { + return applicationContext.isSingleton(name); + } + + public static Class getType(String name) { + return applicationContext.getType(name); + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/BaseVO.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/BaseVO.java new file mode 100644 index 0000000..ce4dc8c --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/BaseVO.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 阿里java开发手册: 【强制】表必备三字段:id, create_time, update_time。 说明:其中 id 必为主键,类型为 bigint + * unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime + * 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。 + * + * @author FrozenWatermelon + */ +public class BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 创建时间 + */ + @Schema(description = "创建时间") + protected Date createTime; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + protected Date updateTime; + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BaseDTO{" + "createTime=" + createTime + ", updateTime=" + updateTime + '}'; + } + +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/DateVO.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/DateVO.java new file mode 100644 index 0000000..219b3b9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/vo/DateVO.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 时间参数 + * @author lhd + */ +public class DateVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Date startTime; + + private Date endTime; + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "DateVO{" + + "startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/wrapper/ResponseWrapper.java b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/wrapper/ResponseWrapper.java new file mode 100644 index 0000000..8cdd021 --- /dev/null +++ b/tmerclub-common/tmerclub-common-core/src/main/java/com/tmerclub/cloud/common/wrapper/ResponseWrapper.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.wrapper; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Objects; + +/** + * 返回值输出代理类 + * + * @author Citrus + * @date 2021/8/11 14:09 + */ +public class ResponseWrapper extends HttpServletResponseWrapper { + + private final ByteArrayOutputStream buffer; + + private final ServletOutputStream outputStream; + + public ResponseWrapper(HttpServletResponse response) { + super(response); + buffer = new ByteArrayOutputStream(); + outputStream = new WrapperOutPutStream(buffer); + } + + @Override + public ServletOutputStream getOutputStream() { + return outputStream; + } + + @Override + public void flushBuffer() throws IOException { + if (Objects.nonNull(outputStream)) { + outputStream.flush(); + } + } + + public byte[] getContent() throws IOException { + flushBuffer(); + return buffer.toByteArray(); + } + + static class WrapperOutPutStream extends ServletOutputStream { + + private final ByteArrayOutputStream bos; + + public WrapperOutPutStream(ByteArrayOutputStream bos) { + this.bos = bos; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + + @Override + public void write(int b) { + bos.write(b); + } + } +} diff --git a/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/dto/PageDTO.java b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/dto/PageDTO.java new file mode 100644 index 0000000..ac76dde --- /dev/null +++ b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/dto/PageDTO.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.database.dto; + +import com.github.pagehelper.IPage; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.util.Arrays; +import java.util.Locale; + +/** + * @author FrozenWatermelon + * @date 2020/9/8 + */ +@Schema +public class PageDTO implements IPage { + + public static final String ASC = "ASC"; + + public static final String DESC = "DESC"; + + /** + * 最大分页大小,如果分页大小大于500,则用500作为分页的大小。防止有人直接传入一个较大的数,导致服务器内存溢出宕机 + */ + public static final Integer MAX_PAGE_SIZE = 500; + + /** + * 最大分页大小,如果分页大小大于500,则用500作为分页的大小。防止有人直接传入一个较大的数,导致服务器内存溢出宕机 + */ + public static final Integer DEFAULT_PAGE_NUM = 1; + + /** + * 当前页 + */ + @NotNull(message = "pageNum 不能为空") + @Schema(description = "当前页", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer pageNum; + + @NotNull(message = "pageSize 不能为空") + @Schema(description = "每页大小", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer pageSize; + + @Schema(description = "排序字段数组,用逗号分割") + private String[] columns; + + @Schema(description = "排序字段方式,用逗号分割,ASC正序,DESC倒序") + private String[] orders; + + @Override + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + @Override + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + if (pageSize > MAX_PAGE_SIZE) { + this.pageSize = MAX_PAGE_SIZE; + return; + } + this.pageSize = pageSize; + } + + @Override + public String getOrderBy() { + return order(this.columns, this.orders); + } + + public String[] getColumns() { + return columns; + } + + public void setColumns(String[] columns) { + this.columns = columns; + } + + public String[] getOrders() { + return orders; + } + + public void setOrders(String[] orders) { + this.orders = orders; + } + + public static String order(String[] columns, String[] orders) { + + if (columns == null || columns.length == 0) { + return ""; + } + + StringBuilder stringBuilder = new StringBuilder(Constant.INITIAL_CAPACITY); + + for (int x = 0; x < columns.length; x++) { + + String column = columns[x]; + String order; + + if (orders != null && orders.length > x) { + order = orders[x].toUpperCase(Locale.ROOT); + if (!(order.equals(ASC) || order.equals(DESC))) { + throw new IllegalArgumentException("非法的排序策略:" + column); + } + } else { + order = ASC; + } + + // 判断列名称的合法性,防止SQL注入。只能是【字母,数字,下划线】 + if (PrincipalUtil.isField(column)) { + throw new IllegalArgumentException("非法的排序字段名称:" + column); + } + + // 驼峰转换为下划线 + column = humpConversionUnderscore(column); + + if (x != 0) { + stringBuilder.append(", "); + } + stringBuilder.append("`").append(column).append("` ").append(order); + } + return stringBuilder.toString(); + } + + public static String humpConversionUnderscore(String value) { + StringBuilder stringBuilder = new StringBuilder(Constant.INITIAL_CAPACITY); + char[] chars = value.toCharArray(); + for (char character : chars) { + if (Character.isUpperCase(character)) { + stringBuilder.append("_"); + character = Character.toLowerCase(character); + } + stringBuilder.append(character); + } + return stringBuilder.toString(); + } + + @Override + public String toString() { + return "PageDTO{" + + "pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", columns=" + Arrays.toString(columns) + + ", orders=" + Arrays.toString(orders) + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/util/PageAdapter.java b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/util/PageAdapter.java new file mode 100644 index 0000000..00d045b --- /dev/null +++ b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/util/PageAdapter.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.database.util; + + +import com.tmerclub.cloud.common.database.dto.PageDTO; + +/** + * 分页适配 + * @author FrozenWatermelon + */ +public class PageAdapter { + + private int begin; + + private int size; + + public PageAdapter(PageDTO page) { + this.begin = getStart(page.getPageNum() - 1, page.getPageSize()); + this.size = page.getPageSize(); + } + + public PageAdapter(Integer pageNum, Integer pageSize) { + this.begin = getStart(pageNum - 1, pageSize); + this.size = pageSize; + } + + public int getBegin() { + return begin; + } + + public void setBegin(int begin) { + this.begin = begin; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public static int getStart(int pageNo, int pageSize) { + if (pageNo < 0) { + pageNo = 0; + } + + if (pageSize < 1) { + pageSize = 0; + } + + return pageNo * pageSize; + } +} diff --git a/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/util/PageUtil.java b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/util/PageUtil.java new file mode 100644 index 0000000..a99925d --- /dev/null +++ b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/util/PageUtil.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.database.util; + +import com.github.pagehelper.ISelect; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageSerializable; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +/** + * @author FrozenWatermelon + * @date 2020/9/8 + */ +public class PageUtil { + + /** + * 使用pagehelper进行分页,该分页只能一对一 + */ + public static PageVO doPage(PageDTO pageDTO, ISelect select) { + + PageSerializable simplePageInfo = PageHelper.startPage(pageDTO).doSelectPageSerializable(select); + + PageVO pageVO = new PageVO<>(); + pageVO.setList(simplePageInfo.getList()); + pageVO.setTotal(simplePageInfo.getTotal()); + pageVO.setPages(getPages(simplePageInfo.getTotal(), pageDTO.getPageSize())); + return pageVO; + } + + + public static Integer getPages(long total, Integer pageSize) { + + if (total == -1) { + return 1; + } + if (pageSize > 0) { + return (int) (total / pageSize + ((total % pageSize == 0) ? 0 : 1)); + } + return 0; + } +} diff --git a/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/vo/PageVO.java b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/vo/PageVO.java new file mode 100644 index 0000000..a91f09c --- /dev/null +++ b/tmerclub-common/tmerclub-common-database/src/main/java/com/tmerclub/cloud/common/database/vo/PageVO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.database.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/8 + */ +public class PageVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "总页数") + private Integer pages; + + @Schema(description = "总条目数") + private Long total; + + @Schema(description = "结果集") + private List list; + + public Integer getPages() { + return pages; + } + + public void setPages(Integer pages) { + this.pages = pages; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @Override + public String toString() { + return "PageVO{" + + ", pages=" + pages + + ", total=" + total + + ", list=" + list + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/IDGen.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/IDGen.java new file mode 100644 index 0000000..e0cb53f --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/IDGen.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf; + +import com.tmerclub.cloud.common.leaf.common.Result; + +/** + * @author leaf + */ +public interface IDGen { + + /** + * get + * + * @param key key + * @param size + * @return Result + */ + Result get(String key, int size); +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/common/Result.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/common/Result.java new file mode 100644 index 0000000..2faecc8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/common/Result.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.common; + +/** + * @author leaf + */ +public class Result { + + private long id; + + private Status status; + + public Result() { + + } + + public Result(long id, Status status) { + this.id = id; + this.status = status; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + @Override + public String toString() { + return "Result{" + "id=" + id + + ", status=" + status + + '}'; + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/constant/DistributedIdSysType.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/constant/DistributedIdSysType.java new file mode 100644 index 0000000..368bd6b --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/constant/DistributedIdSysType.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.constant; + +/** + * 全局的分布式id键 + * 多个模块共用的 + * 不要直接使用这里面的常量,可以通过赋值给DistributedIdKey中的常量 + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public enum DistributedIdSysType { + + /** + * 团购服务 + */ + MALL4CLOUD_GROUP(1, "mall4cloud-group"), + + /** + * 秒杀服务 + */ + MALL4CLOUD_SECKILL(2, "mall4cloud-seckill"), + /** + * 商品服务 + */ + MALL4CLOUD_PRODUCT(3, "mall4cloud-product"), + /** + * 订单服务 + */ + MALL4CLOUD_ORDER(4, "mall4cloud-order"), + /** + * admin服务 + */ + MALL4CLOUD_ADMIN(5, "mall4cloud-admin"), + + /** + * payment服务 + */ + MALL4CLOUD_PAYMENT(6, "mall4cloud-payment"); + + private final Integer id; + private final String sysName; + + + public String value() { + return sysName; + } + + DistributedIdSysType(Integer id, String key) { + this.id = id; + this.sysName = key; + } + + public static Integer getId(String value) { + DistributedIdSysType[] enums = values(); + for (DistributedIdSysType globalDistributedIdKey : enums) { + if (globalDistributedIdKey.sysName.equals(value)) { + return globalDistributedIdKey.id; + } + } + return null; + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/constant/GlobalDistributedIdKey.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/constant/GlobalDistributedIdKey.java new file mode 100644 index 0000000..f0e1bfd --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/constant/GlobalDistributedIdKey.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.constant; + +/** + * 全局的分布式id键 + * 多个模块共用的 + * 不要直接使用这里面的常量,可以通过赋值给DistributedIdKey中的常量 + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public enum GlobalDistributedIdKey { + + /** + * 订单号 + */ + MALL4CLOUD_ORDER("mall4cloud-order"), + + /** + * 退款单号 + */ + MALL4CLOUD_REFUND("mall4cloud-refund"), + + /** + * 钱包日志id + */ + MALL4CLOUD_SHOP_WALLET_LOG("mall4cloud-shop-wallet-log"), + + /** + * 库存入库单号 + */ + MALL4CLOUD_PRODUCT_STOCK_IN("mall4cloud-product-stock-in"), + + /** + * 库存出库单号 + */ + MALL4CLOUD_PRODUCT_STOCK_OUT("mall4cloud-product-stock-out"), + + /** + * 库存出入库日志id + */ + MALL4CLOUD_STOCK_BILL_LOG("mall4cloud-stock-bill-log"), + + /** + * 库存点id + */ + MALL4CLOUD_STOCK_POINT("mall4cloud-stock-point"); + + private final String key; + + + public String value() { + return key; + } + + GlobalDistributedIdKey(String key) { + this.key = key; + } + + public static boolean containKey(String value) { + GlobalDistributedIdKey[] enums = values(); + for (GlobalDistributedIdKey globalDistributedIdKey : enums) { + if (globalDistributedIdKey.key.equals(value)) { + return true; + } + } + return false; + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/dto/SegmentDTO.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/dto/SegmentDTO.java new file mode 100644 index 0000000..524c8fb --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/dto/SegmentDTO.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.dto; + + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分布式id请求参数 + * + * @author YXF + * @date 2022-08-17 15:25:19 + */ +public class SegmentDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String key; + + /** + * 所需的id数量 + */ + private Integer count; + + /** + * id, null: 不需要用户id + */ + private Long id; + + /** + * id长度 + */ + private Integer length; + + public SegmentDTO() { + } + + public SegmentDTO(String key, Long id, Integer count) { + this.key = key; + this.id = id; + this.count = count; + } + + public SegmentDTO(String key, Integer count, Integer length) { + this.key = key; + this.count = count; + this.length = length; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getLength() { + return length; + } + + public void setLength(Integer length) { + this.length = length; + } + + @Override + public String toString() { + return "SegmentItemDTO{" + + "key='" + key + '\'' + + ", count=" + count + + ", id=" + id + + ", length=" + length + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/InitException.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/InitException.java new file mode 100644 index 0000000..060e21a --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/InitException.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.exception; + +/** + * @author leaf + */ +public class InitException extends Exception { + + public InitException(String msg) { + super(msg); + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/LeafServerException.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/LeafServerException.java new file mode 100644 index 0000000..ed9e703 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/exception/LeafServerException.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +/** + * @author leaf + */ +@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) +public class LeafServerException extends RuntimeException { + + public LeafServerException(String msg) { + super(msg); + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/dao/impl/IDAllocDaoImpl.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/dao/impl/IDAllocDaoImpl.java new file mode 100644 index 0000000..272f735 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/dao/impl/IDAllocDaoImpl.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.segment.dao.impl; + +import com.tmerclub.cloud.common.leaf.segment.dao.IDAllocDao; +import com.tmerclub.cloud.common.leaf.segment.mapper.IDAllocMapper; +import com.tmerclub.cloud.common.leaf.segment.model.LeafAlloc; +import io.seata.spring.annotation.GlobalTransactional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author leaf + */ +@Component +public class IDAllocDaoImpl implements IDAllocDao { + + @Autowired + private IDAllocMapper idAllocMapper; + + @Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) + @GlobalTransactional(propagation = io.seata.tm.api.transaction.Propagation.NOT_SUPPORTED) + public List getAllLeafAllocs() { + return idAllocMapper.getAllLeafAllocs(); + } + + @Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) + @GlobalTransactional(propagation = io.seata.tm.api.transaction.Propagation.NOT_SUPPORTED) + public LeafAlloc updateMaxIdAndGetLeafAlloc(String tag, int length) { + idAllocMapper.updateMaxId(tag); + LeafAlloc result = idAllocMapper.getLeafAlloc(tag); + // 长度过长,要重新初始化成step + if (String.valueOf(result.getMaxId()).length() > length) { + idAllocMapper.updateMaxIdToStep(tag); + result.setMaxId(result.getStep()); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) + @GlobalTransactional(propagation = io.seata.tm.api.transaction.Propagation.NOT_SUPPORTED) + public LeafAlloc updateMaxIdByCustomStepAndGetLeafAlloc(LeafAlloc leafAlloc, int length) { + idAllocMapper.updateMaxIdByCustomStep(leafAlloc); + LeafAlloc result = idAllocMapper.getLeafAlloc(leafAlloc.getKey()); + // 长度过长,要重新初始化成step + if (String.valueOf(result.getMaxId()).length() > length) { + // 如果超过最大值,就按最大值的id来返回即可 + long maxValue = Math.round(Math.pow(10, length)) - 1; + result.setValue(result.getMaxId() - leafAlloc.getStep()); + result.setMaxId(maxValue); + // 初始化id的获取数量 + leafAlloc.setStep(result.getStep()); + // 初始化表中的id数据 + idAllocMapper.updateMaxIdToStep(leafAlloc.getKey()); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) + @GlobalTransactional(propagation = io.seata.tm.api.transaction.Propagation.NOT_SUPPORTED) + public List getAllTags() { + return idAllocMapper.getAllTags(); + } + +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/mapper/IDAllocMapper.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/mapper/IDAllocMapper.java new file mode 100644 index 0000000..85b1a58 --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/mapper/IDAllocMapper.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.segment.mapper; + + +import com.tmerclub.cloud.common.leaf.segment.model.LeafAlloc; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + * @author leaf + */ +public interface IDAllocMapper { + + /** + * 获取所有 + * @return + */ + @Select("SELECT biz_tag, max_id, step, update_time FROM leaf_alloc") + @Results({ + @Result(column = "biz_tag", property = "key"), + @Result(column = "max_id", property = "maxId"), + @Result(column = "step", property = "step"), + @Result(column = "update_time", property = "updateTime") + }) + List getAllLeafAllocs(); + + /** + * 根据tag获取 + * @param tag + * @return + */ + @Select("SELECT biz_tag, max_id, step FROM leaf_alloc WHERE biz_tag = #{tag}") + @Results({ + @Result(column = "biz_tag", property = "key"), + @Result(column = "max_id", property = "maxId"), + @Result(column = "step", property = "step") + }) + LeafAlloc getLeafAlloc(@Param("tag") String tag); + + /** + * 更新max + * @param tag + */ + @Update("UPDATE leaf_alloc SET max_id = max_id + step WHERE biz_tag = #{tag}") + void updateMaxId(@Param("tag") String tag); + + /** + * 更新max + * @param leafAlloc + */ + @Update("UPDATE leaf_alloc SET max_id = max_id + #{leafAlloc.step} WHERE biz_tag = #{leafAlloc.key}") + void updateMaxIdByCustomStep(@Param("leafAlloc") LeafAlloc leafAlloc); + + /** + * 获取所有 + * @return + */ + @Select("SELECT biz_tag FROM leaf_alloc") + List getAllTags(); + + /** + * 更新max + * @param tag + */ + @Update("UPDATE leaf_alloc SET max_id = 1 WHERE biz_tag = #{tag}") + void updateMaxIdToStep(@Param("tag") String tag); +} diff --git a/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/Segment.java b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/Segment.java new file mode 100644 index 0000000..ed2b2fc --- /dev/null +++ b/tmerclub-common/tmerclub-common-leaf/src/main/java/com/tmerclub/cloud/common/leaf/segment/model/Segment.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.leaf.segment.model; + +import java.io.Serial; +import java.io.Serializable; +import java.util.concurrent.atomic.AtomicLong; +/** + * @author lanhai + */ +public class Segment implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private AtomicLong value = new AtomicLong(0); + private volatile long max; + private volatile int step; + private final SegmentBuffer buffer; + + public Segment(SegmentBuffer buffer) { + this.buffer = buffer; + } + + public AtomicLong getValue() { + return value; + } + + public void setValue(AtomicLong value) { + this.value = value; + } + + public long getMax() { + return max; + } + + public void setMax(long max) { + this.max = max; + } + + public int getStep() { + return step; + } + + public void setStep(int step) { + this.step = step; + } + + public SegmentBuffer getBuffer() { + return buffer; + } + + public long getIdle() { + return this.getMax() - getValue().get(); + } + + @Override + public String toString() { + return "Segment(" + "value:" + + value + + ",max:" + + max + + ",step:" + + step + + ")"; + } +} diff --git a/tmerclub-common/tmerclub-common-mongodb/pom.xml b/tmerclub-common/tmerclub-common-mongodb/pom.xml new file mode 100644 index 0000000..4cd0958 --- /dev/null +++ b/tmerclub-common/tmerclub-common-mongodb/pom.xml @@ -0,0 +1,30 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-mongodb + + + 8 + 8 + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + + diff --git a/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderItemBO.java b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderItemBO.java new file mode 100644 index 0000000..84580df --- /dev/null +++ b/tmerclub-common/tmerclub-common-mongodb/src/main/java/com/tmerclub/cloud/common/mongodb/bo/order/MongoOrderItemBO.java @@ -0,0 +1,645 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.mongodb.bo.order; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author YXF + * @date 2022/8/23 + */ +public class MongoOrderItemBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品图片 + */ + private String pic; + + /** + * 商品数量 + */ + private Integer count; + + /** + * 商品价格 + */ + private Long price; + + /** + * 产品购买花费积分 + */ + private Long useScore; + + /** + * skuId + */ + private Long skuId; + + /** + * 订单项id + */ + private Long orderItemId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 平台一级分类id + */ + private Long primaryCategoryId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 积分价格(单价) + */ + private Long scoreFee; + + /** + * 中文商品名称 + */ + private String spuNameZh; + + /** + * 英文商品名称 + */ + private String spuNameEn; + + /** + * 中文sku名称 + */ + private String skuNameZh; + + /** + * 英文sku名称 + */ + private String skuNameEn; + + /** + * 商品图片 + */ + private String supplierPic; + + /** + * 中文供应商商品名称 + */ + private String supplierSpuNameZh; + + /** + * 英文供应商商品名称 + */ + private String supplierSpuNameEn; + + /** + * 中文供应商sku名称 + */ + private String supplierSkuNameZh; + + /** + * 英文供应商sku名称 + */ + private String supplierSkuNameEn; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户Id + */ + private Long userId; + + /** + * 最终的退款id + */ + private Long finalRefundId; + + /** + * 推广员id + */ + private Long distributionUserId; + + /** + * 是否以评价(0.未评价1.已评价) + */ + private Integer isComm; + + /** + * 评论时间 + */ + private Date commTime; + + /** + * 订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败) + */ + private Integer refundStatus; + + /** + * 0全部发货 其他数量为剩余待发货数量 + */ + private Integer beDeliveredNum; + + /** + * 单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送 + */ + private Integer deliveryType; + + /** + * 加入购物车时间 + */ + private Date shopCartTime; + + /** + * 商品总金额 + */ + private Long spuTotalAmount; + + /** + * 商品实际金额 = 商品总金额 - 分摊的优惠金额 + */ + private Long actualTotal; + + /** + * 分摊的优惠金额 + */ + private Long shareReduce; + + /** + * 平台优惠金额 + */ + private Long platformShareReduce; + + /** + * 推广员佣金 + */ + private Long distributionAmount; + + /** + * 上级推广员佣金 + */ + private Long distributionParentAmount; + + /** + * 获得积分 + */ + private Long gainScore; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + /** + * 运费减免金额 + */ + private Long freeFreightAmount; + + /** + * 商品编码 + */ + private String spuCode; + + /** + * sku编码 + */ + private String partyCode; + + /** + * 赠品金额 + */ + private Long giveawayAmount; + + /** + * 活动id + */ + private Long activityId; + + /** + * 活动类型 OrderActivityType + */ + private Integer activityType; + + /** + * 平台供应商佣金 + */ + private Long purchasePlatformCommission; + + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public String getSupplierSpuNameZh() { + return supplierSpuNameZh; + } + + public void setSupplierSpuNameZh(String supplierSpuNameZh) { + this.supplierSpuNameZh = supplierSpuNameZh; + } + + public String getSupplierSpuNameEn() { + return supplierSpuNameEn; + } + + public void setSupplierSpuNameEn(String supplierSpuNameEn) { + this.supplierSpuNameEn = supplierSpuNameEn; + } + + public String getSupplierSkuNameZh() { + return supplierSkuNameZh; + } + + public void setSupplierSkuNameZh(String supplierSkuNameZh) { + this.supplierSkuNameZh = supplierSkuNameZh; + } + + public String getSupplierSkuNameEn() { + return supplierSkuNameEn; + } + + public void setSupplierSkuNameEn(String supplierSkuNameEn) { + this.supplierSkuNameEn = supplierSkuNameEn; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getFinalRefundId() { + return finalRefundId; + } + + public void setFinalRefundId(Long finalRefundId) { + this.finalRefundId = finalRefundId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public Date getCommTime() { + return commTime; + } + + public void setCommTime(Date commTime) { + this.commTime = commTime; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Date getShopCartTime() { + return shopCartTime; + } + + public void setShopCartTime(Date shopCartTime) { + this.shopCartTime = shopCartTime; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getShareReduce() { + return shareReduce; + } + + public void setShareReduce(Long shareReduce) { + this.shareReduce = shareReduce; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getDistributionParentAmount() { + return distributionParentAmount; + } + + public void setDistributionParentAmount(Long distributionParentAmount) { + this.distributionParentAmount = distributionParentAmount; + } + + public Long getGainScore() { + return gainScore; + } + + public void setGainScore(Long gainScore) { + this.gainScore = gainScore; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + public String getSkuNameEn() { + return skuNameEn; + } + + public void setSkuNameEn(String skuNameEn) { + this.skuNameEn = skuNameEn; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getGiveawayAmount() { + return giveawayAmount; + } + + public void setGiveawayAmount(Long giveawayAmount) { + this.giveawayAmount = giveawayAmount; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + @Override + public String toString() { + return "MongoOrderItemBO{" + + "pic='" + pic + '\'' + + ", count=" + count + + ", price=" + price + + ", useScore=" + useScore + + ", skuId=" + skuId + + ", orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", primaryCategoryId=" + primaryCategoryId + + ", orderId=" + orderId + + ", scoreFee=" + scoreFee + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", skuNameEn='" + skuNameEn + '\'' + + ", supplierSpuNameZh='" + supplierSpuNameZh + '\'' + + ", supplierSpuNameEn='" + supplierSpuNameEn + '\'' + + ", supplierSkuNameZh='" + supplierSkuNameZh + '\'' + + ", supplierSkuNameEn='" + supplierSkuNameEn + '\'' + + ", supplierPic=" + supplierPic + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + ", finalRefundId=" + finalRefundId + + ", distributionUserId=" + distributionUserId + + ", isComm=" + isComm + + ", commTime=" + commTime + + ", refundStatus=" + refundStatus + + ", beDeliveredNum=" + beDeliveredNum + + ", deliveryType=" + deliveryType + + ", shopCartTime=" + shopCartTime + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", shareReduce=" + shareReduce + + ", platformShareReduce=" + platformShareReduce + + ", distributionAmount=" + distributionAmount + + ", distributionParentAmount=" + distributionParentAmount + + ", gainScore=" + gainScore + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", giveawayAmount=" + giveawayAmount + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", purchasePlatformCommission=" + purchasePlatformCommission + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/pom.xml b/tmerclub-common/tmerclub-common-order/pom.xml new file mode 100644 index 0000000..0ddb57a --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/pom.xml @@ -0,0 +1,30 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-order + jar + mall4cloud 订单相关公共代码 + + + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-product + ${project.version} + + + + diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/ComboOrderNotifyBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/ComboOrderNotifyBO.java new file mode 100644 index 0000000..961c7e3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/ComboOrderNotifyBO.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xxw + * @date 2022/9/7 11:35 + */ +public class ComboOrderNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单信息 + */ + private ShopCartOrderMergerVO shopCartOrderMergerVO; + + /** + * 用户id + */ + private Long userId; + + public ShopCartOrderMergerVO getShopCartOrderMergerVO() { + return shopCartOrderMergerVO; + } + + public void setShopCartOrderMergerVO(ShopCartOrderMergerVO shopCartOrderMergerVO) { + this.shopCartOrderMergerVO = shopCartOrderMergerVO; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "ComboOrderNotifyBO{" + + "shopCartOrderMergerVO=" + shopCartOrderMergerVO + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderItemBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderItemBO.java new file mode 100644 index 0000000..8d0f83f --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderItemBO.java @@ -0,0 +1,798 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/2/5 + */ +public class EsOrderItemBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED) + private String pic; + + @Schema(description = "中文商品名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String spuName; + + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer count; + + @Schema(description = "商品价格", requiredMode = Schema.RequiredMode.REQUIRED) + private Long price; + + @Schema(description = "产品购买花费积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long useScore; + + @Schema(description = "skuId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long skuId; + + @Schema(description = "中文skuName", requiredMode = Schema.RequiredMode.REQUIRED) + private String skuName; + + @Schema(description = "订单项id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderItemId; + + @Schema(description = "商品id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long spuId; + + @Schema(description = "退款状态 1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭") + private Integer returnMoneySts; + + /** + * 订单id + */ + private Long orderId; + + /** + * 积分价格(单价) + */ + private Long scoreFee; + + /** + * 中文商品名称 + */ + private String spuNameZh; + + /** + * 英文商品名称 + */ + private String spuNameEn; + + /** + * 中文sku名称 + */ + private String skuNameZh; + + /** + * 英文sku名称 + */ + private String skuNameEn; + + /** + * 中文供应商商品名称 + */ + private String supplierSpuNameZh; + + /** + * 英文供应商商品名称 + */ + private String supplierSpuNameEn; + + /** + * 中文供应商sku名称 + */ + private String supplierSkuNameZh; + + /** + * 英文供应商sku名称 + */ + private String supplierSkuNameEn; + + /** + * 供应商图片 + */ + private String supplierPic; + + /** + * 供应商商品名称 + */ + private String supplierSpuName; + + /** + * 供应商sku名称 + */ + private String supplierSkuName; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户Id + */ + private Long userId; + + /** + * 最终的退款id + */ + private Long finalRefundId; + + /** + * 推广员id + */ + private Long distributionUserId; + + /** + * 是否以评价(0.未评价1.已评价) + */ + private Integer isComm; + + /** + * 评论时间 + */ + private Date commTime; + + /** + * 订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败) + */ + private Integer refundStatus; + + /** + * 0全部发货 其他数量为剩余待发货数量 + */ + private Integer beDeliveredNum; + + /** + * 单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送 + */ + private Integer deliveryType; + + /** + * 加入购物车时间 + */ + private Date shopCartTime; + + /** + * 商品总金额 + */ + private Long spuTotalAmount; + + /** + * 商品实际金额 = 商品总金额 - 分摊的优惠金额 + */ + private Long actualTotal; + + /** + * 分摊的优惠金额 + */ + private Long shareReduce; + + /** + * 平台优惠金额 + */ + private Long platformShareReduce; + + /** + * 推广员佣金 + */ + private Long distributionAmount; + + /** + * 上级推广员佣金 + */ + private Long distributionParentAmount; + + /** + * 获得积分 + */ + private Long gainScore; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + /** + * 运费减免金额 + */ + private Long freeFreightAmount; + + /** + * 赠品金额 + */ + private Long giveawayAmount; + + + /** + * 活动id + */ + private Long activityId; + + /** + * 活动类型 枚举类:OrderActivityType + */ + private Integer activityType; + + /** + * 平台供应商佣金 + */ + private Long purchasePlatformCommission; + + + /** + * 商品编码 + */ + private String spuCode; + /** + * sku编码 + */ + private String partyCode; + + /** + * 平台一级分类id + */ + private Long primaryCategoryId; + + /** + * 订单项国际化信息 + * @return + */ + private List orderItemLangList; + + /** + * 组合名称 + */ + private String comboName; + + /** + * 核销次数 -1.多次核销 0.无需核销 1.单次核销 + */ + private Integer writeOffNum; + + /** + * 多次核销次数 -1.无限次 + */ + private Integer writeOffMultipleCount; + + /** + * 核销开始时间 + */ + private Date writeOffStart; + + /** + * 核销结束时间 + */ + private Date writeOffEnd; + + /** + * 核销结束时间 + */ + private Integer spuMold; + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public String getComboName() { + return comboName; + } + + public void setComboName(String comboName) { + this.comboName = comboName; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + public String getSkuNameEn() { + return skuNameEn; + } + + public void setSkuNameEn(String skuNameEn) { + this.skuNameEn = skuNameEn; + } + + public String getSupplierSpuNameZh() { + return supplierSpuNameZh; + } + + public void setSupplierSpuNameZh(String supplierSpuNameZh) { + this.supplierSpuNameZh = supplierSpuNameZh; + } + + public String getSupplierSpuNameEn() { + return supplierSpuNameEn; + } + + public void setSupplierSpuNameEn(String supplierSpuNameEn) { + this.supplierSpuNameEn = supplierSpuNameEn; + } + + public String getSupplierSkuNameZh() { + return supplierSkuNameZh; + } + + public void setSupplierSkuNameZh(String supplierSkuNameZh) { + this.supplierSkuNameZh = supplierSkuNameZh; + } + + public String getSupplierSkuNameEn() { + return supplierSkuNameEn; + } + + public void setSupplierSkuNameEn(String supplierSkuNameEn) { + this.supplierSkuNameEn = supplierSkuNameEn; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getFinalRefundId() { + return finalRefundId; + } + + public void setFinalRefundId(Long finalRefundId) { + this.finalRefundId = finalRefundId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public Date getCommTime() { + return commTime; + } + + public void setCommTime(Date commTime) { + this.commTime = commTime; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Date getShopCartTime() { + return shopCartTime; + } + + public void setShopCartTime(Date shopCartTime) { + this.shopCartTime = shopCartTime; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getShareReduce() { + return shareReduce; + } + + public void setShareReduce(Long shareReduce) { + this.shareReduce = shareReduce; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getDistributionParentAmount() { + return distributionParentAmount; + } + + public void setDistributionParentAmount(Long distributionParentAmount) { + this.distributionParentAmount = distributionParentAmount; + } + + public Long getGainScore() { + return gainScore; + } + + public void setGainScore(Long gainScore) { + this.gainScore = gainScore; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getGiveawayAmount() { + return giveawayAmount; + } + + public void setGiveawayAmount(Long giveawayAmount) { + this.giveawayAmount = giveawayAmount; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + @Override + public String toString() { + return "EsOrderItemBO{" + + "pic='" + pic + '\'' + + ", spuName='" + spuName + '\'' + + ", count=" + count + + ", price=" + price + + ", useScore=" + useScore + + ", skuId=" + skuId + + ", skuName='" + skuName + '\'' + + ", orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", returnMoneySts=" + returnMoneySts + + ", orderId=" + orderId + + ", scoreFee=" + scoreFee + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", skuNameEn='" + skuNameEn + '\'' + + ", supplierSpuNameZh='" + supplierSpuNameZh + '\'' + + ", supplierSpuNameEn='" + supplierSpuNameEn + '\'' + + ", supplierSkuNameZh='" + supplierSkuNameZh + '\'' + + ", supplierSkuNameEn='" + supplierSkuNameEn + '\'' + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + ", finalRefundId=" + finalRefundId + + ", distributionUserId=" + distributionUserId + + ", isComm=" + isComm + + ", commTime=" + commTime + + ", refundStatus=" + refundStatus + + ", beDeliveredNum=" + beDeliveredNum + + ", deliveryType=" + deliveryType + + ", shopCartTime=" + shopCartTime + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", shareReduce=" + shareReduce + + ", platformShareReduce=" + platformShareReduce + + ", distributionAmount=" + distributionAmount + + ", distributionParentAmount=" + distributionParentAmount + + ", gainScore=" + gainScore + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", giveawayAmount=" + giveawayAmount + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", purchasePlatformCommission=" + purchasePlatformCommission + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", primaryCategoryId=" + primaryCategoryId + + ", orderItemLangList=" + orderItemLangList + + ", comboName='" + comboName + '\'' + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", spuMold=" + spuMold + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderVirtualInfoBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderVirtualInfoBO.java new file mode 100644 index 0000000..abc34ca --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/EsOrderVirtualInfoBO.java @@ -0,0 +1,115 @@ +package com.tmerclub.cloud.common.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +/** + * @author lanhai + */ +public class EsOrderVirtualInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "虚拟核销id") + private Long orderVirtualInfoId; + + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "核销门店id") + private Long stationId; + + @Schema(description = "核销码") + private String writeOffCode; + + @Schema(description = "是否核销 1.已核销 0.未核销") + private Integer isWriteOff; + + @Schema(description = "核销时间") + private Date writeOffTime; + + @Schema(description = "剩余核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + public Long getOrderVirtualInfoId() { + return orderVirtualInfoId; + } + + public void setOrderVirtualInfoId(Long orderVirtualInfoId) { + this.orderVirtualInfoId = orderVirtualInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Integer getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Integer isWriteOff) { + this.isWriteOff = isWriteOff; + } + + public Date getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Date writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + @Override + public String toString() { + return "OrderVirtualInfoVO{" + + "orderVirtualInfoId=" + orderVirtualInfoId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", stationId=" + stationId + + ", writeOffCode='" + writeOffCode + '\'' + + ", isWriteOff=" + isWriteOff + + ", writeOffTime=" + writeOffTime + + ", writeOffMultipleCount=" + writeOffMultipleCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/OrderIdWithRefundIdBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/OrderIdWithRefundIdBO.java new file mode 100644 index 0000000..08694c3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/OrderIdWithRefundIdBO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 订单和退款id + * + * @author FrozenWatermelon + * @date 2021/04/26 + */ +public class OrderIdWithRefundIdBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 关联的退款id + */ + private Long refundId; + + /** + * 关联的支付订单id + */ + private Long orderId; + /** + * 店铺id + */ + private Long shopId; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + @Override + public String toString() { + return "OrderIdWithRefundIdBO{" + + "refundId=" + refundId + + ", orderId=" + orderId + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PayNotifyBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PayNotifyBO.java new file mode 100644 index 0000000..930e594 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PayNotifyBO.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import com.tmerclub.cloud.common.order.vo.OrderSimpleAmountInfoBO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单支付成功通知 + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class PayNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private List orderIds; + + private Integer payType; + + private Long payId; + + /** + * 商家是否同意采购, 1.是 0.否 + */ + private Integer agreePurchase; + + /** + * 商家钱包记录id列表 + */ + private List shopWalletIds; + + /** + * 订单类型 + */ + private Integer orderType; + + /** + * 商品预售类型 + */ + private Integer preSaleType; + + /** + * 订单状态 + */ + private Integer orderStatus; + + /** + * 是否为采购订单 + */ + private Boolean isPurchaseOrder; + /** + * 支付系统类型 + */ + private Integer paySysType; + + private List orderStatusList; + + private List orderSimpleAmountInfos; + private ShopCartOrderMergerVO shopCartOrderMergerVO; + + public ShopCartOrderMergerVO getShopCartOrderMergerVO() { + return shopCartOrderMergerVO; + } + + public void setShopCartOrderMergerVO(ShopCartOrderMergerVO shopCartOrderMergerVO) { + this.shopCartOrderMergerVO = shopCartOrderMergerVO; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Integer getAgreePurchase() { + return agreePurchase; + } + + public void setAgreePurchase(Integer agreePurchase) { + this.agreePurchase = agreePurchase; + } + public PayNotifyBO() { + } + public PayNotifyBO(List orderIds, Integer payType, Long payId, Integer paySysType, ShopCartOrderMergerVO shopCartOrderMergerVO) { + this.orderIds = orderIds; + this.payType = payType; + this.payId = payId; + this.paySysType = paySysType; + this.shopCartOrderMergerVO = shopCartOrderMergerVO; + } + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public List getShopWalletIds() { + return shopWalletIds; + } + + public void setShopWalletIds(List shopWalletIds) { + this.shopWalletIds = shopWalletIds; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Boolean getPurchaseOrder() { + return isPurchaseOrder; + } + + public void setPurchaseOrder(Boolean purchaseOrder) { + isPurchaseOrder = purchaseOrder; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public List getOrderStatusList() { + return orderStatusList; + } + + public void setOrderStatusList(List orderStatusList) { + this.orderStatusList = orderStatusList; + } + + public List getOrderSimpleAmountInfos() { + return orderSimpleAmountInfos; + } + + public void setOrderSimpleAmountInfos(List orderSimpleAmountInfos) { + this.orderSimpleAmountInfos = orderSimpleAmountInfos; + } + + @Override + public String toString() { + return "PayNotifyBO{" + + "orderIds=" + orderIds + + ", payType=" + payType + + ", payId=" + payId + + ", agreePurchase=" + agreePurchase + + ", shopWalletIds=" + shopWalletIds + + ", orderType=" + orderType + + ", preSaleType=" + preSaleType + + ", orderStatus=" + orderStatus + + ", isPurchaseOrder=" + isPurchaseOrder + + ", paySysType=" + paySysType + + ", orderStatusList=" + orderStatusList + + ", orderSimpleAmountInfos=" + orderSimpleAmountInfos + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PurchaseAmountLogBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PurchaseAmountLogBO.java new file mode 100644 index 0000000..5937e64 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/PurchaseAmountLogBO.java @@ -0,0 +1,116 @@ +package com.tmerclub.cloud.common.order.bo; + +/** + * @author gaozijie + * @date 2023-08-28 + */ +public class PurchaseAmountLogBO { + + /** + * 采购订单编号 + */ + private Long purchaseOrderId; + + /** + * 商家id + */ + private Long shopId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 变动金额 + */ + private Long changeAmount; + + /** + * 采购金额类型 + * @see com.tmerclub.cloud.common.constant.PurchaseAmountType + */ + private Integer purchaseAmountType; + + /** + * 采购总金额 + */ + private Long purchaseTotalAmount; + + /** + * 商品数量 + */ + private Integer prodCount; + + public PurchaseAmountLogBO() { + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Integer getPurchaseAmountType() { + return purchaseAmountType; + } + + public void setPurchaseAmountType(Integer purchaseAmountType) { + this.purchaseAmountType = purchaseAmountType; + } + + public Long getPurchaseTotalAmount() { + return purchaseTotalAmount; + } + + public void setPurchaseTotalAmount(Long purchaseTotalAmount) { + this.purchaseTotalAmount = purchaseTotalAmount; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + @Override + public String toString() { + return "PurchaseLogBO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", changeAmount=" + changeAmount + + ", purchaseAmountType=" + purchaseAmountType + + ", purchaseTotalAmount=" + purchaseTotalAmount + + ", prodCount=" + prodCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RedisSeckillOrderBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RedisSeckillOrderBO.java new file mode 100644 index 0000000..c37edf7 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RedisSeckillOrderBO.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2023/8/5 + */ +public class RedisSeckillOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userId; + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + public RedisSeckillOrderBO() { + + } + public RedisSeckillOrderBO(Long userId, Long orderId) { + this.userId = userId; + this.orderId = orderId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + @Override + public String toString() { + return "RedisSeckillOrderBO{" + + "userId=" + userId + + ", orderId=" + orderId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundNotifyBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundNotifyBO.java new file mode 100644 index 0000000..62801f8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundNotifyBO.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 订单退款成功通知 + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class RefundNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderId; + + private Long payId; + + private Long refundId; + + private Long refundAmount; + + /** + * 是否为未成团而退款的团购订单 + */ + private Integer unSuccessGroupOrder; + + /** + * 是否可以退款 + */ + private Boolean canRefund; + + /** + * 订单状态 + */ + private Integer orderStatus; + + /** + * 原订单状态 + */ + private Integer dbOrderStatus; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单使用积分 + */ + private Long orderScore; + + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getUnSuccessGroupOrder() { + return unSuccessGroupOrder; + } + + public void setUnSuccessGroupOrder(Integer unSuccessGroupOrder) { + this.unSuccessGroupOrder = unSuccessGroupOrder; + } + + public Boolean getCanRefund() { + return canRefund; + } + + public void setCanRefund(Boolean canRefund) { + this.canRefund = canRefund; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Integer getDbOrderStatus() { + return dbOrderStatus; + } + + public void setDbOrderStatus(Integer dbOrderStatus) { + this.dbOrderStatus = dbOrderStatus; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + @Override + public String toString() { + return "RefundNotifyBO{" + + "orderId=" + orderId + + ", payId=" + payId + + ", refundId=" + refundId + + ", refundAmount=" + refundAmount + + ", unSuccessGroupOrder=" + unSuccessGroupOrder + + ", canRefund=" + canRefund + + ", orderStatus=" + orderStatus + + ", dbOrderStatus=" + dbOrderStatus + + ", userId=" + userId + + ", orderScore=" + orderScore + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundReductionStockBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundReductionStockBO.java new file mode 100644 index 0000000..6ba9e8c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/bo/RefundReductionStockBO.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 订单退款取消库存 + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class RefundReductionStockBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 是否供应商代销商品,1.是 0.否 + */ + private Integer supplierProd; + /** + * 供应商id + */ + private Long supplierId; + + private Long spuId; + + private Long skuId; + + /** + * 库存点id 自提:自提点id, 其他:仓库id + */ + private Long stockPointId; + + private String spuName; + + private String skuName; + + private Integer count; + + private Long shopId; + + private Long orderId; + + /** + * 活动id + */ + private Long activityId; + + /** + * 产品价格 + */ + private Long price; + + /** + * 产品主图片路径 + */ + private String pic; + /** + * sku编码 + */ + private String partyCode; + + public Integer getSupplierProd() { + return supplierProd; + } + + public void setSupplierProd(Integer supplierProd) { + this.supplierProd = supplierProd; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "RefundReductionStockBO{" + + "supplierProd=" + supplierProd + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", count=" + count + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", supplierId=" + supplierId + + ", activityId=" + activityId + + ", stockPointId=" + stockPointId + + ", price=" + price + + ", pic='" + pic + '\'' + + ", partyCode='" + partyCode + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/DeliveryType.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/DeliveryType.java new file mode 100644 index 0000000..f704619 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/DeliveryType.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * 配送类型 + * + * @author FrozenWatermelon + */ +public enum DeliveryType { + + /** + * 线上发货 + */ + ONLINE(0, "线上发货"), + + /** + * 快递 + */ + DELIVERY(1, "快递配送"), + /** + * 自提 + */ + STATION(2, "用户自提"), + + /** + * 无需快递 + */ + NOT_DELIVERY(3, "无需快递"), + /** + * 同城配送 + */ + SAME_CITY(4, "同城配送"); + + private final Integer num; + private final String description; + + public Integer value() { + return num; + } + + public String description() { + return description; + } + + DeliveryType(Integer num, String name) { + this.num = num; + this.description = name; + } + + public static DeliveryType instance(Integer value) { + DeliveryType[] enums = values(); + for (DeliveryType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getDescription(Integer value) { + DeliveryType[] enums = values(); + for (DeliveryType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum.description; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/FlowSystemTypeEnum.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/FlowSystemTypeEnum.java new file mode 100644 index 0000000..b6f859f --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/FlowSystemTypeEnum.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2023/8/7 9:46 + */ +public enum FlowSystemTypeEnum { + /** + * PC + */ + PC(1), + /** + * H5 + */ + H5(2), + /** + * 小程序 + */ + APPLETS(3), + /** + * 安卓 + */ + ANDROID(4), + /** + * IOS + */ + IOS(5); + + private final Integer id; + + public Integer value() { + return id; + } + + FlowSystemTypeEnum(Integer id) { + this.id = id; + } + + public static FlowSystemTypeEnum instance(Integer value) { + FlowSystemTypeEnum[] enums = values(); + for (FlowSystemTypeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return H5; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderActivityType.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderActivityType.java new file mode 100644 index 0000000..43a6713 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderActivityType.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * 订单活动类型 + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public enum OrderActivityType { + + /** + * 普通订单 + */ + ORDINARY(0), + /** + * 团购活动 + */ + GROUP(1), + /** + * 秒杀活动 + */ + SECKILL(2), +// /** +// * 满减活动 +// */ +// DISCOUNT(3), + /** + * 套餐活动 + */ + COMBO(4), + /** + * 赠品活动(该类型的订单项为赠品订单项) + */ + GIVEAWAY(5), + /** + * 组合商品(该类型的订单项为组合的子订单项) + */ + COMBO_PROD(6); + + + private final Integer type; + + public Integer value() { + return type; + } + + + OrderActivityType(Integer type) { + this.type = type; + } + + public static OrderActivityType instance(Integer value) { + OrderActivityType[] enums = values(); + for (OrderActivityType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderType.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderType.java new file mode 100644 index 0000000..2ebc187 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/OrderType.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * 订单类型 + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public enum OrderType { + + /** + * 普通订单 + */ + ORDINARY(0), + /** + * 团购订单 + */ + GROUP(1), + + /** + * 秒杀订单 + */ + SECKILL(2), + /** + * 积分订单 + */ + SCORE(3); + + private final Integer num; + + public Integer value() { + return num; + } + + OrderType(Integer num) { + this.num = num; + } + + public static OrderType instance(Integer value) { + OrderType[] enums = values(); + for (OrderType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/RefundStatusEnum.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/RefundStatusEnum.java new file mode 100644 index 0000000..5274474 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/RefundStatusEnum.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * 退款状态 + * + * @author FrozenWatermelon + */ +public enum RefundStatusEnum { + /** + * 申请退款 + */ + APPLY(1, "申请退款"), + /** + * 退款成功 + */ + SUCCEED(2, "退款成功"), + /** + * 部分退款成功 + */ + PARTIAL_SUCCESS(3, "部分退款成功"), + /** + * 退款失败 + */ + DISAGREE(4, "退款失败"); + + private final Integer num; + + private final String refundName; + + RefundStatusEnum(Integer num, String refundName) { + this.num = num; + this.refundName = refundName; + } + + public Integer value() { + return num; + } + + public String refundName() { + return refundName; + } + + public static String getRefundName(Integer value) { + RefundStatusEnum[] enums = values(); + for (RefundStatusEnum refundStatus : enums) { + if (refundStatus.value().equals(value)) { + return refundStatus.refundName; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ShopType.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ShopType.java new file mode 100644 index 0000000..05bc21c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/constant/ShopType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.constant; + +/** + * 店铺类型 + * + * @author YXF + */ +public enum ShopType { + + /** + * 自营店 + */ + SELF_SHOP(1), + /** + * 其他店铺 + */ + STOP(2); + + private final Integer num; + + public Integer value() { + return num; + } + + ShopType(Integer num) { + this.num = num; + } + + public static ShopType instance(Integer value) { + ShopType[] enums = values(); + for (ShopType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderInvoiceDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderInvoiceDTO.java new file mode 100644 index 0000000..d64f0a6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderInvoiceDTO.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Pineapple + * @date 2021/8/2 8:52 + */ +public class OrderInvoiceDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单发票ID") + private Long orderInvoiceId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "发票类型 1.电子普通发票") + private Integer invoiceType; + + @Schema(description = "抬头类型 1.单位 2.个人") + private Integer headerType; + + @Schema(description = "抬头名称") + private String headerName; + + @Schema(description = "发票税号") + private String invoiceTaxNumber; + + @Schema(description = "发票内容 1.商品明细") + private Integer invoiceContext; + + @Schema(description = "发票状态 1.申请中 2.已开票") + private Integer invoiceState; + + @Schema(description = "文件id") + private Long fileId; + + @Schema(description = "申请时间") + private Date applicationTime; + + @Schema(description = "上传时间") + private Date uploadTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商Id") + private Long supplierId; + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public Integer getHeaderType() { + return headerType; + } + + public void setHeaderType(Integer headerType) { + this.headerType = headerType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getInvoiceTaxNumber() { + return invoiceTaxNumber; + } + + public void setInvoiceTaxNumber(String invoiceTaxNumber) { + this.invoiceTaxNumber = invoiceTaxNumber; + } + + public Integer getInvoiceContext() { + return invoiceContext; + } + + public void setInvoiceContext(Integer invoiceContext) { + this.invoiceContext = invoiceContext; + } + + public Integer getInvoiceState() { + return invoiceState; + } + + public void setInvoiceState(Integer invoiceState) { + this.invoiceState = invoiceState; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "OrderInvoiceDTO{" + + "orderInvoiceId=" + orderInvoiceId + + ", orderId=" + orderId + + ", invoiceType=" + invoiceType + + ", headerType=" + headerType + + ", headerName='" + headerName + '\'' + + ", invoiceTaxNumber='" + invoiceTaxNumber + '\'' + + ", invoiceContext=" + invoiceContext + + ", invoiceState=" + invoiceState + + ", fileId=" + fileId + + ", applicationTime=" + applicationTime + + ", uploadTime=" + uploadTime + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSearchDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSearchDTO.java new file mode 100644 index 0000000..452bb24 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSearchDTO.java @@ -0,0 +1,813 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + + +/** + * @author FrozenWatermelon + */ +public class OrderSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id + */ + private Long userId; + /** + * 店铺id + */ + private Long shopId; + /** + * 供应商id + */ + private Long supplierId; + + @Schema(description = "订单状态") + private Integer status; + + @Schema(description = "订单状态列表") + private List statusList; + + @Schema(description = "要过滤的订单状态列表") + private List mustNotStatusList; + + @Schema(description = "供应商订单状态") + private List supplierOrderStatus; + + + @Schema(description = "订单类型参考orderType ,0普通商品 1团购订单 2秒杀订单,3积分订单") + private Integer orderType; + + @Schema(description = "排除的订单类型") + private Integer exOrderType; + + @Schema(description = "是否已经支付,1:已经支付过,0:,没有支付过") + private Integer isPayed; + + /** + * 订购流水号 + */ + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "订单号列表") + private List orderIds; + + @Schema(description = "订单项id列表") + private List orderItemIds; + + @Schema(description = "下单的时间范围:开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "下单的时间范围:结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "收货人姓名") + private String consignee; + + @Schema(description = "收货人手机号") + private String mobile; + + @Schema(description = "物流类型 1:快递 2:自提 3:无需快递 4:同城快递") + private Integer deliveryType; + + @Schema(description = "订单退款状态参考refundStatus(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)") + private Integer refundStatus; + + @Schema(description = "不等于订单退款状态") + private Integer notRefundStatus; + + @Schema(description = "自提点名称") + private String stationName; + + @Schema(description = "支付类型 1:积分支付 2:微信支付 3:支付宝支付") + private Integer payType; + + @Schema(description = "是否已评论") + private Integer isComm; + + @Schema(description = "开始页") + private Integer pageNum; + + + @Schema(description = "每页大小") + private Integer pageSize; + + @Schema(description = "是否待采购 1.是 0.否 2.已处理") + private Integer waitPurchase; + + @Schema(description = "是否待采购(1:是, 0:否(包含状态0和2))") + private Integer isWaitPurchase; + + @Schema(description = "是否预售订单 1.是 0.否") + private Integer isPreSale; + + @Schema(description = "供应商商品发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + /** + * 支付时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date payTime; + + /** + * 更新时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 发货时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date deliveryTime; + + /** + * 确认收货时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date finallyTime; + @Schema(description = "商品编码") + private String spuCodes; + + @Schema(description = "sku编码") + private String partyCodes; + + @Schema(description = "是否为虚拟商品订单 1.是 0.否") + private Integer orderMold; + + @Schema(description = "预售类型 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + @Schema(description = "最小尾款金额") + private Long minBalanceAmount; + + @Schema(description = "最大尾款金额") + private Long maxBalanceAmount; + + /** + * 尾款支付开始时间 + */ + private Date balanceStartTime; + + /** + * 尾款结束开始时间 + */ + private Date balanceEndTime; + + /** + * 实际总值 + */ + private Long actualTotal; + + /** + * 实际总值区间,下线 + */ + private Long actualTotalMin; + + /** + * 支付类型列表 + */ + private List payTypeList; + + /** + * es开始的索引 + */ + private Integer begin; + + /** + * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + */ + private Integer deleteStatus; + + /** + * 是否已经进行结算 + */ + private Integer isSettled; + + /** + * 实际总值区间,上线 + */ + private Long actualTotalMax; + + /** + * 响应数据字段数组 + */ + private String[] fetchSource; + + /** + * 自提点id + */ + private Long stationId; + + /** + * 支付时间是否按gte进行过滤 + */ + private Boolean gtePayTime; + + /** + * 自提提货码 + */ + private String stationCode; + + /** + * 核销码 + */ + private String writeOffCode; + + /** + * 订单核销状态 0.待核销 1.核销完成 + */ + private Integer writeOffStatus; + + /** + * 店铺ids + */ + private List shopIds; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 供应商idS + */ + private List supplierIds; + @Schema(description = "主单号,在组合商品拆单时会存在") + private Long mainOrderId; + + public Long getMainOrderId() { + return mainOrderId; + } + + public void setMainOrderId(Long mainOrderId) { + this.mainOrderId = mainOrderId; + } + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + public Boolean getGtePayTime() { + return gtePayTime; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Integer getWriteOffStatus() { + return writeOffStatus; + } + + public void setWriteOffStatus(Integer writeOffStatus) { + this.writeOffStatus = writeOffStatus; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Boolean isGtePayTime() { + return gtePayTime; + } + + public void setGtePayTime(Boolean gtePayTime) { + this.gtePayTime = gtePayTime; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Integer getIsPreSale() { + return isPreSale; + } + + public void setIsPreSale(Integer isPreSale) { + this.isPreSale = isPreSale; + } + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public List getSupplierOrderStatus() { + return supplierOrderStatus; + } + + public void setSupplierOrderStatus(List supplierOrderStatus) { + this.supplierOrderStatus = supplierOrderStatus; + } + + public String getSpuCodes() { + return spuCodes; + } + + public void setSpuCodes(String spuCodes) { + this.spuCodes = spuCodes; + } + + public String getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(String partyCodes) { + this.partyCodes = partyCodes; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getExOrderType() { + return exOrderType; + } + + public void setExOrderType(Integer exOrderType) { + this.exOrderType = exOrderType; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public List getPayTypeList() { + return payTypeList; + } + + public void setPayTypeList(List payTypeList) { + this.payTypeList = payTypeList; + } + + public Integer getBegin() { + return begin; + } + + public void setBegin(Integer begin) { + this.begin = begin; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getActualTotalMin() { + return actualTotalMin; + } + + public void setActualTotalMin(Long actualTotalMin) { + this.actualTotalMin = actualTotalMin; + } + + public Long getActualTotalMax() { + return actualTotalMax; + } + + public void setActualTotalMax(Long actualTotalMax) { + this.actualTotalMax = actualTotalMax; + } + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Integer getIsSettled() { + return isSettled; + } + + public void setIsSettled(Integer isSettled) { + this.isSettled = isSettled; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public String[] getFetchSource() { + return fetchSource; + } + + public void setFetchSource(String[] fetchSource) { + this.fetchSource = fetchSource; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Long getMaxBalanceAmount() { + return maxBalanceAmount; + } + + public void setMaxBalanceAmount(Long maxBalanceAmount) { + this.maxBalanceAmount = maxBalanceAmount; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public List getOrderItemIds() { + return orderItemIds; + } + + public void setOrderItemIds(List orderItemIds) { + this.orderItemIds = orderItemIds; + } + + public List getStatusList() { + return statusList; + } + + public void setStatusList(List statusList) { + this.statusList = statusList; + } + + public Long getMinBalanceAmount() { + return minBalanceAmount; + } + + public void setMinBalanceAmount(Long minBalanceAmount) { + this.minBalanceAmount = minBalanceAmount; + } + + public Integer getNotRefundStatus() { + return notRefundStatus; + } + + public void setNotRefundStatus(Integer notRefundStatus) { + this.notRefundStatus = notRefundStatus; + } + + public List getMustNotStatusList() { + return mustNotStatusList; + } + + public void setMustNotStatusList(List mustNotStatusList) { + this.mustNotStatusList = mustNotStatusList; + } + + public Integer getIsWaitPurchase() { + return isWaitPurchase; + } + + public void setIsWaitPurchase(Integer isWaitPurchase) { + this.isWaitPurchase = isWaitPurchase; + } + + @Override + public String toString() { + return "OrderSearchDTO{" + + "userId=" + userId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", status=" + status + + ", statusList=" + statusList + + ", mustNotStatusList=" + mustNotStatusList + + ", supplierOrderStatus=" + supplierOrderStatus + + ", orderType=" + orderType + + ", exOrderType=" + exOrderType + + ", isPayed=" + isPayed + + ", orderId=" + orderId + + ", orderIds=" + orderIds + + ", orderItemIds=" + orderItemIds + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", shopName='" + shopName + '\'' + + ", spuName='" + spuName + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", deliveryType=" + deliveryType + + ", refundStatus=" + refundStatus + + ", notRefundStatus=" + notRefundStatus + + ", stationName='" + stationName + '\'' + + ", payType=" + payType + + ", isComm=" + isComm + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", waitPurchase=" + waitPurchase + + ", isWaitPurchase=" + isWaitPurchase + + ", isPreSale=" + isPreSale + + ", supplierDeliveryType=" + supplierDeliveryType + + ", payTime=" + payTime + + ", updateTime=" + updateTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", spuCodes='" + spuCodes + '\'' + + ", partyCodes='" + partyCodes + '\'' + + ", orderMold=" + orderMold + + ", preSaleType=" + preSaleType + + ", minBalanceAmount=" + minBalanceAmount + + ", maxBalanceAmount=" + maxBalanceAmount + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", actualTotal=" + actualTotal + + ", actualTotalMin=" + actualTotalMin + + ", payTypeList=" + payTypeList + + ", begin=" + begin + + ", deleteStatus=" + deleteStatus + + ", isSettled=" + isSettled + + ", actualTotalMax=" + actualTotalMax + + ", fetchSource=" + Arrays.toString(fetchSource) + + ", stationId=" + stationId + + ", gtePayTime=" + gtePayTime + + ", stationCode='" + stationCode + '\'' + + ", writeOffCode='" + writeOffCode + '\'' + + ", writeOffStatus=" + writeOffStatus + + ", shopIds=" + shopIds + + ", supplierName='" + supplierName + '\'' + + ", supplierIds=" + supplierIds + + ", mainOrderId=" + mainOrderId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSelfStationDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSelfStationDTO.java new file mode 100644 index 0000000..cb0c53c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/OrderSelfStationDTO.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public class OrderSelfStationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderId; + + @Schema(description = "自提点id") + private Long stationId; + + @Schema(description = "自提点名称") + private String stationName; + + @Schema(description = "自提人的手机") + private String stationUserMobile; + + @Schema(description = "自提人的名字") + private String stationUserName; + + @Schema(description = "自提时间(用户下单时选择)") + private String stationTime; + + @Schema(description = "提货码") + private String stationCode; + + @Schema(description = "自提点的地址") + private String stationAddress; + + @Schema(description = "自提点的联系电话") + private String stationPhone; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getStationUserMobile() { + return stationUserMobile; + } + + public void setStationUserMobile(String stationUserMobile) { + this.stationUserMobile = stationUserMobile; + } + + public String getStationUserName() { + return stationUserName; + } + + public void setStationUserName(String stationUserName) { + this.stationUserName = stationUserName; + } + + public String getStationTime() { + return stationTime; + } + + public void setStationTime(String stationTime) { + this.stationTime = stationTime; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public String getStationAddress() { + return stationAddress; + } + + public void setStationAddress(String stationAddress) { + this.stationAddress = stationAddress; + } + + public String getStationPhone() { + return stationPhone; + } + + public void setStationPhone(String stationPhone) { + this.stationPhone = stationPhone; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "OrderSelfStationDTO{" + + "orderId=" + orderId + + ", stationId=" + stationId + + ", stationName='" + stationName + '\'' + + ", stationUserMobile='" + stationUserMobile + '\'' + + ", stationUserName='" + stationUserName + '\'' + + ", stationTime='" + stationTime + '\'' + + ", stationCode='" + stationCode + '\'' + + ", stationAddress='" + stationAddress + '\'' + + ", stationPhone='" + stationPhone + '\'' + + ", lng=" + lng + + ", lat=" + lat + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/PurchaseOrderSearchDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/PurchaseOrderSearchDTO.java new file mode 100644 index 0000000..c5d465c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/PurchaseOrderSearchDTO.java @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * @author FrozenWatermelon + */ +public class PurchaseOrderSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "采购id") + private Long purchaseOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺id列表") + private List shopIds; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商id列表") + private List supplierIds; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer status; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "商家名称") + private String shopName; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "手机号") + private String mobile; + + @Schema(description = "商品编码") + private String spuCodes; + + @Schema(description = "sku编码") + private String partyCodes; + + /** + * 开始时间 + */ + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + /** + * 结束时间 + */ + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + + @Schema(description = "开始页") + private Integer pageNum; + + @Schema(description = "每页大小") + private Integer pageSize; + + private Integer sysType; + + @Hidden + @Schema(description = "状态集合") + private List statuses; + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getSpuCodes() { + return spuCodes; + } + + public void setSpuCodes(String spuCodes) { + this.spuCodes = spuCodes; + } + + public String getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(String partyCodes) { + this.partyCodes = partyCodes; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public List getSupplierIds() { + return supplierIds; + } + + public void setSupplierIds(List supplierIds) { + this.supplierIds = supplierIds; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public List getStatuses() { + return statuses; + } + + public void setStatuses(List statuses) { + this.statuses = statuses; + } + + @Override + public String toString() { + return "PurchaseOrderSearchDTO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", shopIds=" + shopIds + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", supplierId=" + supplierId + + ", supplierIds=" + supplierIds + + ", supplierName='" + supplierName + '\'' + + ", status=" + status + + ", employeeId=" + employeeId + + ", shopName='" + shopName + '\'' + + ", spuName='" + spuName + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", spuCodes='" + spuCodes + '\'' + + ", partyCodes='" + partyCodes + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", pageNum=" + pageNum + + ", pageSize=" + pageSize + + ", sysType=" + sysType + + ", statuses=" + statuses + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/ShopCartItemDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/ShopCartItemDTO.java new file mode 100644 index 0000000..ab243f7 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/ShopCartItemDTO.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import com.tmerclub.cloud.common.product.dto.CartComboMatchSpuDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 购物车物品参数 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class ShopCartItemDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "产品ID不能为空") + @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long spuId; + + @NotNull(message = "skuId不能为空") + @Schema(description = "skuId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long skuId; + + @Schema(description = "库存点id 自提:自提点id, 其他:仓库id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long stockPointId; + + @NotNull(message = "商品数量不能为空") + @Min(value = 1, message = "商品数量不能为空") + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer count; + + @NotNull(message = "店铺id不能为空") + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "推广员用户id") + private Long distributionUserId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "套餐数量") + private Integer comboCount; + + @Schema(description = "主购物车id(套餐)") + private Integer parentCartItemId; + + @Schema(description = "搭配商品Sku id列表") + private List cartComboMatchSpuDTOS; + + @Schema(description = "主商品起搭数量") + private Integer comboMainLeastNum; + + public Integer getComboMainLeastNum() { + return comboMainLeastNum; + } + + public void setComboMainLeastNum(Integer comboMainLeastNum) { + this.comboMainLeastNum = comboMainLeastNum; + } + + public List getCartComboMatchSpuDTOS() { + return cartComboMatchSpuDTOS; + } + + public void setCartComboMatchSpuDTOS(List matchingSkuIds) { + this.cartComboMatchSpuDTOS = matchingSkuIds; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public Integer getParentCartItemId() { + return parentCartItemId; + } + + public void setParentCartItemId(Integer parentCartItemId) { + this.parentCartItemId = parentCartItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + @Override + public String toString() { + return "ShopCartItemDTO{" + + "spuId=" + spuId + + ", skuId=" + skuId + + ", stockPointId=" + stockPointId + + ", count=" + count + + ", shopId=" + shopId + + ", distributionUserId=" + distributionUserId + + ", comboId=" + comboId + + ", comboCount=" + comboCount + + ", parentCartItemId=" + parentCartItemId + + ", cartComboMatchSpuDTOS=" + cartComboMatchSpuDTOS + + ", comboMainLeastNum=" + comboMainLeastNum + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/SubmitOrderDTO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/SubmitOrderDTO.java new file mode 100644 index 0000000..302209f --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/dto/SubmitOrderDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/18 + */ +public class SubmitOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "每个店铺提交的订单信息", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderShopParam; + + @Schema(description = "订单发票") + private List orderInvoiceList; + + @Schema(description = "自提信息Dto") + private OrderSelfStationDTO orderSelfStationDto; + + @Schema(description = "虚拟商品留言备注") + private List virtualRemarkList; + + public List getVirtualRemarkList() { + return virtualRemarkList; + } + + public void setVirtualRemarkList(List virtualRemarkList) { + this.virtualRemarkList = virtualRemarkList; + } + + public List getOrderShopParam() { + return orderShopParam; + } + + public void setOrderShopParam(List orderShopParam) { + this.orderShopParam = orderShopParam; + } + + public List getOrderInvoiceList() { + return orderInvoiceList; + } + + public void setOrderInvoiceList(List orderInvoiceList) { + this.orderInvoiceList = orderInvoiceList; + } + + public OrderSelfStationDTO getOrderSelfStationDto() { + return orderSelfStationDto; + } + + public void setOrderSelfStationDto(OrderSelfStationDTO orderSelfStationDto) { + this.orderSelfStationDto = orderSelfStationDto; + } + + @Override + public String toString() { + return "SubmitOrderDTO{" + + "orderShopParam=" + orderShopParam + + ", orderInvoiceList=" + orderInvoiceList + + ", orderSelfStationDto=" + orderSelfStationDto + + ", virtualRemarkList=" + virtualRemarkList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ChooseComboItemVo.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ChooseComboItemVo.java new file mode 100644 index 0000000..ba7454f --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ChooseComboItemVo.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 购物车中选中的套餐活动项信息 + * + * @author xxw + * @date 2022/8/23 14:00 + */ +public class ChooseComboItemVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "主商品购物车id") + private Long mainProdBasketId; + + @Schema(description = "套餐总金额") + private Long comboTotalAmount; + + @Schema(description = "套餐金额(套餐单价)") + private Long comboAmount; + + @Schema(description = "套餐优惠金额") + private Long preferentialAmount; + + @Schema(description = "套餐数量") + private Integer comboCount; + + @Schema(description = "套餐名称") + private String name; + + /** + * 套餐序号 + * 套餐可能会进行分单操作,且一个订单中可能包含多个相同套餐不同规格,所以需要一个独立的参数来标识套餐 + */ + private Integer index; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getMainProdBasketId() { + return mainProdBasketId; + } + + public void setMainProdBasketId(Long mainProdBasketId) { + this.mainProdBasketId = mainProdBasketId; + } + + public Long getComboTotalAmount() { + return comboTotalAmount; + } + + public void setComboTotalAmount(Long comboTotalAmount) { + this.comboTotalAmount = comboTotalAmount; + } + + public Long getComboAmount() { + return comboAmount; + } + + public void setComboAmount(Long comboAmount) { + this.comboAmount = comboAmount; + } + + public Long getPreferentialAmount() { + return preferentialAmount; + } + + public void setPreferentialAmount(Long preferentialAmount) { + this.preferentialAmount = preferentialAmount; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ChooseDiscountItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ChooseDiscountItemVO.java new file mode 100644 index 0000000..95a7e08 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ChooseDiscountItemVO.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 购物车中选中的满减活动项信息 + * + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +public class ChooseDiscountItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "活动名称") + private String discountName; + + @Schema(description = "优惠规则(0:满钱减钱 1:满件减钱 2:满钱打折 3:满件打折)") + private Integer discountRule; + + @Schema(description = "优惠项id") + @JsonIgnore + private Long discountItemId; + + @Schema(description = "所需需要金额") + private Long needAmount; + + @Schema(description = "减免类型 0按满足最高层级减一次 1每满一次减一次") + private Integer discountType; + + @Schema(description = "参与满减满折优惠的商品数量") + private Integer count; + + @Schema(description = "参与满减满折优惠的商品金额") + private Long prodsPrice; + + @Schema(description = "优惠(元/折)") + private Long discount; + + @Schema(description = "参与满减满折优惠的金额") + private Long reduceAmount; + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public String getDiscountName() { + return discountName; + } + + public void setDiscountName(String discountName) { + this.discountName = discountName; + } + + public Integer getDiscountRule() { + return discountRule; + } + + public void setDiscountRule(Integer discountRule) { + this.discountRule = discountRule; + } + + public Long getDiscountItemId() { + return discountItemId; + } + + public void setDiscountItemId(Long discountItemId) { + this.discountItemId = discountItemId; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Integer getDiscountType() { + return discountType; + } + + public void setDiscountType(Integer discountType) { + this.discountType = discountType; + } + + public Long getProdsPrice() { + return prodsPrice; + } + + public void setProdsPrice(Long prodsPrice) { + this.prodsPrice = prodsPrice; + } + + public Long getDiscount() { + return discount; + } + + public void setDiscount(Long discount) { + this.discount = discount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "ChooseDiscountItemVO{" + + "discountId=" + discountId + + ", discountName=" + discountName + + ", discountRule=" + discountRule + + ", discountItemId=" + discountItemId + + ", needAmount=" + needAmount + + ", discountType=" + discountType + + ", count=" + count + + ", prodsPrice=" + prodsPrice + + ", discount=" + discount + + ", reduceAmount=" + reduceAmount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/DiscountItemOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/DiscountItemOrderVO.java new file mode 100644 index 0000000..0161667 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/DiscountItemOrderVO.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 满减满折优惠项VO + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:39 + */ +public class DiscountItemOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠项id") + private Long discountItemId; + + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "所需需要金额") + private Long needAmount; + + @Schema(description = "优惠(元/折)") + private Long discount; + + public Long getDiscountItemId() { + return discountItemId; + } + + public void setDiscountItemId(Long discountItemId) { + this.discountItemId = discountItemId; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Long getDiscount() { + return discount; + } + + public void setDiscount(Long discount) { + this.discount = discount; + } + + @Override + public String toString() { + return "DiscountItemVO{" + + "discountItemId=" + discountItemId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",discountId=" + discountId + + ",needAmount=" + needAmount + + ",discount=" + discount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsAllotOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsAllotOrderVO.java new file mode 100644 index 0000000..1e02634 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsAllotOrderVO.java @@ -0,0 +1,219 @@ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author gaozijie + * @since 2023-11-27 + */ +public class EsAllotOrderVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "调拨订单id") + private Long allotOrderId; + + @Schema(description = "调出点仓库id") + private Long outWarehouseId; + + @Schema(description = "调出点仓库名称") + private String outWarehouseName; + + @Schema(description = "调出点库存点类型(1:仓库, 2:门店)") + private Integer outStockPointType; + + @Schema(description = "调入点仓库id") + private Long inWarehouseId; + + @Schema(description = "调入点仓库名称") + private String inWarehouseName; + + @Schema(description = "调入点库存点类型(1:仓库, 2:门店)") + private Integer inStockPointType; + + @Schema(description = "物流公司id") + private Long dvyCompanyId; + + @Schema(description = "物流方式(1:快递, 3:无需快递)") + private Integer dvyType; + + @Schema(description = "物流单号") + private String dvyOrderNumber; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "总调拨数量") + private Integer totalAllotCount; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "调拨订单项") + List allotOrderItems; + + public EsAllotOrderVO() { + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getOutWarehouseId() { + return outWarehouseId; + } + + public void setOutWarehouseId(Long outWarehouseId) { + this.outWarehouseId = outWarehouseId; + } + + public String getOutWarehouseName() { + return outWarehouseName; + } + + public void setOutWarehouseName(String outWarehouseName) { + this.outWarehouseName = outWarehouseName; + } + + public Integer getOutStockPointType() { + return outStockPointType; + } + + public void setOutStockPointType(Integer outStockPointType) { + this.outStockPointType = outStockPointType; + } + + public Long getInWarehouseId() { + return inWarehouseId; + } + + public void setInWarehouseId(Long inWarehouseId) { + this.inWarehouseId = inWarehouseId; + } + + public String getInWarehouseName() { + return inWarehouseName; + } + + public void setInWarehouseName(String inWarehouseName) { + this.inWarehouseName = inWarehouseName; + } + + public Integer getInStockPointType() { + return inStockPointType; + } + + public void setInStockPointType(Integer inStockPointType) { + this.inStockPointType = inStockPointType; + } + + public Long getDvyCompanyId() { + return dvyCompanyId; + } + + public void setDvyCompanyId(Long dvyCompanyId) { + this.dvyCompanyId = dvyCompanyId; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public String getDvyOrderNumber() { + return dvyOrderNumber; + } + + public void setDvyOrderNumber(String dvyOrderNumber) { + this.dvyOrderNumber = dvyOrderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getTotalAllotCount() { + return totalAllotCount; + } + + public void setTotalAllotCount(Integer totalAllotCount) { + this.totalAllotCount = totalAllotCount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public List getAllotOrderItems() { + return allotOrderItems; + } + + public void setAllotOrderItems(List allotOrderItems) { + this.allotOrderItems = allotOrderItems; + } + + @Override + public String toString() { + return "EsAllotOrderVO{" + + "allotOrderId=" + allotOrderId + + ", outWarehouseId=" + outWarehouseId + + ", outWarehouseName='" + outWarehouseName + '\'' + + ", outStockPointType=" + outStockPointType + + ", inWarehouseId=" + inWarehouseId + + ", inWarehouseName='" + inWarehouseName + '\'' + + ", inStockPointType=" + inStockPointType + + ", dvyCompanyId=" + dvyCompanyId + + ", dvyType=" + dvyType + + ", dvyOrderNumber='" + dvyOrderNumber + '\'' + + ", status=" + status + + ", totalAllotCount=" + totalAllotCount + + ", remark='" + remark + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", allotOrderItems=" + allotOrderItems + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderInvoiceVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderInvoiceVO.java new file mode 100644 index 0000000..25806d9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderInvoiceVO.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author YXF + * @date 2022/8/23 + */ +public class EsOrderInvoiceVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单发票ID") + private Long orderInvoiceId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "发票类型 1.电子普通发票") + private Integer invoiceType; + + @Schema(description = "抬头类型 1.单位 2.个人") + private Integer headerType; + + @Schema(description = "抬头名称") + private String headerName; + + @Schema(description = "发票税号") + private String invoiceTaxNumber; + + @Schema(description = "发票内容 1.商品明细") + private Integer invoiceContext; + + @Schema(description = "发票状态 1.申请中 2.已开票") + private Integer invoiceState; + + @Schema(description = "文件id") + private Long fileId; + + @Schema(description = "申请时间") + private Date applicationTime; + + @Schema(description = "上传时间") + private Date uploadTime; + + @Schema(description = "订单状态") + private Integer orderStatus; + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getInvoiceType() { + return invoiceType; + } + + public void setInvoiceType(Integer invoiceType) { + this.invoiceType = invoiceType; + } + + public Integer getHeaderType() { + return headerType; + } + + public void setHeaderType(Integer headerType) { + this.headerType = headerType; + } + + public String getHeaderName() { + return headerName; + } + + public void setHeaderName(String headerName) { + this.headerName = headerName; + } + + public String getInvoiceTaxNumber() { + return invoiceTaxNumber; + } + + public void setInvoiceTaxNumber(String invoiceTaxNumber) { + this.invoiceTaxNumber = invoiceTaxNumber; + } + + public Integer getInvoiceContext() { + return invoiceContext; + } + + public void setInvoiceContext(Integer invoiceContext) { + this.invoiceContext = invoiceContext; + } + + public Integer getInvoiceState() { + return invoiceState; + } + + public void setInvoiceState(Integer invoiceState) { + this.invoiceState = invoiceState; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Override + public String toString() { + return "EsOrderInvoiceVO{" + + "orderInvoiceId=" + orderInvoiceId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", invoiceType=" + invoiceType + + ", headerType=" + headerType + + ", headerName='" + headerName + '\'' + + ", invoiceTaxNumber='" + invoiceTaxNumber + '\'' + + ", invoiceContext=" + invoiceContext + + ", invoiceState=" + invoiceState + + ", fileId=" + fileId + + ", applicationTime=" + applicationTime + + ", uploadTime=" + uploadTime + + ", orderStatus=" + orderStatus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderItemVO.java new file mode 100644 index 0000000..2ca396b --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderItemVO.java @@ -0,0 +1,575 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/2/5 + */ +public class EsOrderItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED) + private String pic; + + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String spuName; + + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer count; + + @Schema(description = "商品价格", requiredMode = Schema.RequiredMode.REQUIRED) + private Long price; + + @Schema(description = "产品购买花费积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long useScore; + + @Schema(description = "skuId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long skuId; + + @Schema(description = "skuName", requiredMode = Schema.RequiredMode.REQUIRED) + private String skuName; + + @Schema(description = "订单项id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderItemId; + + @Schema(description = "商品id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long spuId; + + @Schema(description = "退款状态 1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭") + private Integer returnMoneySts; + + @Schema(description = "采购价") + private Long itemPurchaseAmount; + + /** + * 积分价格(单价) + */ + private Long scoreFee; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 用户Id + */ + private Long userId; + + /** + * 最终的退款id + */ + private Long finalRefundId; + + /** + * 推广员id + */ + private Long distributionUserId; + + /** + * 是否以评价(0.未评价1.已评价) + */ + private Integer isComm; + + /** + * 评论时间 + */ + private Date commTime; + + /** + * 订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败) + */ + private Integer refundStatus; + + /** + * 0全部发货 其他数量为剩余待发货数量 + */ + private Integer beDeliveredNum; + + /** + * 单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送 + */ + private Integer deliveryType; + + /** + * 加入购物车时间 + */ + private Date shopCartTime; + + /** + * 商品总金额 + */ + private Long spuTotalAmount; + + /** + * 商品实际金额 = 商品总金额 - 分摊的优惠金额 + */ + private Long actualTotal; + + /** + * 分摊的优惠金额 + */ + private Long shareReduce; + + /** + * 平台优惠金额 + */ + private Long platformShareReduce; + + /** + * 推广员佣金 + */ + private Long distributionAmount; + + /** + * 上级推广员佣金 + */ + private Long distributionParentAmount; + + /** + * 获得积分 + */ + private Long gainScore; + + /** + * 活动id + */ + private Long activityId; + + /** + * 活动类型 OrderActivityType + */ + private Integer activityType; + + /** + * 订单商品名、sku名 + */ + private List orderItemLangList; + + + @Schema(description = "赠品列表") + private List giveawayList; + + + @Schema(description = "组合商品列表") + private List comboList; + + @Schema(description = "订单类型1团购订单 2秒杀订单 3积分订单") + private Integer orderType; + + @Schema(description = "主商品关联退款赠品id") + private String returnGiveawayIds; + + /** + * 平台供应商佣金 + */ + private Long purchasePlatformCommission; + + /** + * 供应商图片 + */ + private String supplierPic; + + /** + * 供应商商品名称 + */ + private String supplierSpuName; + + /** + * 供应商sku名称 + */ + private String supplierSkuName; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public List getComboList() { + return comboList; + } + + public void setComboList(List comboList) { + this.comboList = comboList; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public List getGiveawayList() { + return giveawayList; + } + + public void setGiveawayList(List giveawayList) { + this.giveawayList = giveawayList; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public String getReturnGiveawayIds() { + return returnGiveawayIds; + } + + public void setReturnGiveawayIds(String returnGiveawayIds) { + this.returnGiveawayIds = returnGiveawayIds; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getFinalRefundId() { + return finalRefundId; + } + + public void setFinalRefundId(Long finalRefundId) { + this.finalRefundId = finalRefundId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public Date getCommTime() { + return commTime; + } + + public void setCommTime(Date commTime) { + this.commTime = commTime; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Date getShopCartTime() { + return shopCartTime; + } + + public void setShopCartTime(Date shopCartTime) { + this.shopCartTime = shopCartTime; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getShareReduce() { + return shareReduce; + } + + public void setShareReduce(Long shareReduce) { + this.shareReduce = shareReduce; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getDistributionParentAmount() { + return distributionParentAmount; + } + + public void setDistributionParentAmount(Long distributionParentAmount) { + this.distributionParentAmount = distributionParentAmount; + } + + public Long getGainScore() { + return gainScore; + } + + public void setGainScore(Long gainScore) { + this.gainScore = gainScore; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Long getItemPurchaseAmount() { + return itemPurchaseAmount; + } + + public void setItemPurchaseAmount(Long itemPurchaseAmount) { + this.itemPurchaseAmount = itemPurchaseAmount; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + @Override + public String toString() { + return "EsOrderItemVO{" + + "pic='" + pic + '\'' + + ", spuName='" + spuName + '\'' + + ", count=" + count + + ", price=" + price + + ", useScore=" + useScore + + ", skuId=" + skuId + + ", skuName='" + skuName + '\'' + + ", orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", returnMoneySts=" + returnMoneySts + + ", itemPurchaseAmount=" + itemPurchaseAmount + + ", scoreFee=" + scoreFee + + ", shopId=" + shopId + + ", userId=" + userId + + ", finalRefundId=" + finalRefundId + + ", distributionUserId=" + distributionUserId + + ", isComm=" + isComm + + ", commTime=" + commTime + + ", refundStatus=" + refundStatus + + ", beDeliveredNum=" + beDeliveredNum + + ", deliveryType=" + deliveryType + + ", shopCartTime=" + shopCartTime + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", shareReduce=" + shareReduce + + ", platformShareReduce=" + platformShareReduce + + ", distributionAmount=" + distributionAmount + + ", distributionParentAmount=" + distributionParentAmount + + ", gainScore=" + gainScore + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", orderItemLangList=" + orderItemLangList + + ", giveawayList=" + giveawayList + + ", comboList=" + comboList + + ", orderType=" + orderType + + ", returnGiveawayIds='" + returnGiveawayIds + '\'' + + ", purchasePlatformCommission=" + purchasePlatformCommission + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", spuMold=" + spuMold + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderRefundVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderRefundVO.java new file mode 100644 index 0000000..c9d56f8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderRefundVO.java @@ -0,0 +1,563 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author YXF + * @date 2022/8/23 + */ +public class EsOrderRefundVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "退款记录ID") + private Long refundId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "买家ID") + private Long userId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "订单项ID(0:为全部订单项)") + private Long orderItemId; + + @Schema(description = "退货数量(0:为全部订单项)") + private Integer refundCount; + + @Schema(description = "退还积分") + private Long refundScore; + + @Schema(description = "退款金额") + private Long refundAmount; + + @Schema(description = "平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)") + private Long platformRefundAmount; + + @Schema(description = "平台退款佣金") + private Long platformRefundCommission; + + @Schema(description = "退款单总分销金额") + private Long distributionTotalAmount; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)") + private Integer refundType; + + @Schema(description = "申请类型:1,仅退款,2退款退货") + private Integer applyType; + + @Schema(description = "是否接收到商品(1:已收到,0:未收到)") + private Integer isReceived; + + @Schema(description = "退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭)") + private Integer closeType; + + /** + * 详情见ReturnMoneyStsType + */ + @Schema(description = "处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)") + private Integer returnMoneySts; + + @Schema(description = "申请原因") + private Integer buyerReason; + + @Schema(description = "申请原因 中文描述") + private String buyerReasonValue; + + @Schema(description = "申请说明") + private String buyerDesc; + + @Schema(description = "联系方式(退款时留下的手机号码)") + private String buyerMobile; + + @Schema(description = "文件凭证(逗号隔开)") + private String imgUrls; + + @Schema(description = "订单创建时间") + private Date createTime; + + @Schema(description = "订单更新时间") + private Date updateTime; + + @Schema(description = "超时时间(超过该时间不处理,系统将自动处理)(保留字段)") + private Date overTime; + + @Schema(description = "拒绝原因") + private String rejectMessage; + + @Schema(description = "卖家备注") + private String sellerMsg; + + @Schema(description = "受理时间") + private Date handelTime; + + @Schema(description = "发货时间") + private Date deliveryTime; + + @Schema(description = "收货时间") + private Date receiveTime; + + @Schema(description = "关闭时间") + private Date closeTime; + + @Schema(description = "确定时间(确定退款时间)") + private Date decisionTime; + + @Schema(description = "退款时间") + private Date refundTime; + + @Schema(description = "移交供应商时间") + private Date supplierTime; + + @Schema(description = "供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝") + private Integer supplierHandleStatus; + + @Schema(description = "采购退款金额") + private Long purchaseRefundAmount; + + @Schema(description = "采购的平台佣金退款金额") + private Long purPlatformRefundCommission; + + @Schema(description = "订单运费") + private Long freightAmount; + + @Schema(description = "是否待采购 1.是 0.否 2.已处理") + private Long waitPurchase; + + @Schema(description = "订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团") + private Integer orderStatus; + + @Schema(description = "退款订单项") + private List orderItems; + + + @Schema(description = "平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功 ") + private Integer platformInterventionStatus; + + public Integer getPlatformInterventionStatus() { + return platformInterventionStatus; + } + + public void setPlatformInterventionStatus(Integer platformInterventionStatus) { + this.platformInterventionStatus = platformInterventionStatus; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public Long getPlatformRefundCommission() { + return platformRefundCommission; + } + + public void setPlatformRefundCommission(Long platformRefundCommission) { + this.platformRefundCommission = platformRefundCommission; + } + + public Long getDistributionTotalAmount() { + return distributionTotalAmount; + } + + public void setDistributionTotalAmount(Long distributionTotalAmount) { + this.distributionTotalAmount = distributionTotalAmount; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Date getOverTime() { + return overTime; + } + + public void setOverTime(Date overTime) { + this.overTime = overTime; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Date getHandelTime() { + return handelTime; + } + + public void setHandelTime(Date handelTime) { + this.handelTime = handelTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getCloseTime() { + return closeTime; + } + + public void setCloseTime(Date closeTime) { + this.closeTime = closeTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Date getSupplierTime() { + return supplierTime; + } + + public void setSupplierTime(Date supplierTime) { + this.supplierTime = supplierTime; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getPurchaseRefundAmount() { + return purchaseRefundAmount; + } + + public void setPurchaseRefundAmount(Long purchaseRefundAmount) { + this.purchaseRefundAmount = purchaseRefundAmount; + } + + public Long getPurPlatformRefundCommission() { + return purPlatformRefundCommission; + } + + public void setPurPlatformRefundCommission(Long purPlatformRefundCommission) { + this.purPlatformRefundCommission = purPlatformRefundCommission; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public String getBuyerReasonValue() { + return buyerReasonValue; + } + + public void setBuyerReasonValue(String buyerReasonValue) { + this.buyerReasonValue = buyerReasonValue; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Long waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + @Override + public String toString() { + return "EsOrderRefundVO{" + + "refundId=" + refundId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", userId=" + userId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", refundCount=" + refundCount + + ", refundScore=" + refundScore + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", platformRefundCommission=" + platformRefundCommission + + ", distributionTotalAmount=" + distributionTotalAmount + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", closeType=" + closeType + + ", returnMoneySts=" + returnMoneySts + + ", buyerReason=" + buyerReason + + ", buyerReasonValue='" + buyerReasonValue + '\'' + + ", buyerDesc='" + buyerDesc + '\'' + + ", buyerMobile='" + buyerMobile + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", overTime=" + overTime + + ", rejectMessage='" + rejectMessage + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + ", handelTime=" + handelTime + + ", deliveryTime=" + deliveryTime + + ", receiveTime=" + receiveTime + + ", closeTime=" + closeTime + + ", decisionTime=" + decisionTime + + ", refundTime=" + refundTime + + ", supplierTime=" + supplierTime + + ", supplierHandleStatus=" + supplierHandleStatus + + ", purchaseRefundAmount=" + purchaseRefundAmount + + ", purPlatformRefundCommission=" + purPlatformRefundCommission + + ", freightAmount=" + freightAmount + + ", waitPurchase=" + waitPurchase + + ", orderStatus=" + orderStatus + + ", orderItems=" + orderItems + + ", platformInterventionStatus=" + platformInterventionStatus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderVO.java new file mode 100644 index 0000000..a5395ff --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsOrderVO.java @@ -0,0 +1,1000 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021/2/5 + */ +public class EsOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项", requiredMode = Schema.RequiredMode.REQUIRED) + private List orderItems; + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "总价", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "使用积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderScore; + + @Schema(description = "订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团 9:待付尾款", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "订单类型(0普通订单 1团购订单 2秒杀订单)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer orderType; + + @Schema(description = "订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer refundStatus; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer deliveryType; + + @Schema(description = "店铺名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String shopName; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "订单运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freightAmount; + + @Schema(description = "订单创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "商品总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer allCount; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "发票订单id") + private Long orderInvoiceId; + + @Schema(description = "用户备注信息") + private String remarks; + + @Schema(description = "收货人姓名") + private String consignee; + + @Schema(description = "收货人手机号") + private String mobile; + + @Schema(description = "收货人地址") + private String receivingAddr; + + @Schema(description = "预售类型 -1.未开启预售 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + @Schema(description = "是否为虚拟商品订单 1.是 0.否") + private Integer orderMold; + + @Schema(description = "预售发货时间") + private Date preSaleDeliveryTime; + + /** + * 运费 + */ + private Long freeFreightAmount; + + /** + * 平台运费减免金额 + */ + private Long platformFreeFreightAmount; + + /** + * 分销金额 + */ + private Long distributionAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + + /** + * 用户订单地址Id + */ + private Long orderAddrId; + + /** + * 总值 + */ + private Long total; + + /** + * 卖家备注 + */ + private String shopRemarks; + + /** + * 支付方式 请参考枚举PayType + */ + private Integer payType; + + /** + * 订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易 + */ + private Integer closeType; + + /** + * 付款时间 + */ + private Date payTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 完成时间 + */ + private Date finallyTime; + + /** + * 取消时间 + */ + private Date cancelTime; + + /** + * 预售发货时间 + */ + private Date bookTime; + + /** + * 是否已支付,1.已支付0.未支付 + */ + private Integer isPayed; + + /** + * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + */ + private Integer deleteStatus; + + /** + * 积分抵扣金额 + */ + private Long scoreAmount; + + /** + * 会员折扣金额 + */ + private Long memberAmount; + + /** + * 平台优惠券优惠金额 + */ + private Long platformCouponAmount; + + /** + * 商家优惠券优惠金额 + */ + private Long shopCouponAmount; + + /** + * 满减优惠金额 + */ + private Long discountAmount; + + /** + * 平台优惠金额 + */ + private Long platformAmount; + + /** + * 优惠总额 + */ + private Long reduceAmount; + + /** + * 能否修改或者查看物流 1.可以,2.不可以 + */ + private Integer updateOrViewDeliveryInfo; + + @Schema(description = "发货数量") + private Integer deliveryCount; + + /** + * 是否待采购 1.是 0.否 2.已处理 + */ + private Integer waitPurchase; + + /** + * 是否待采购 1.是 0.否 2.已处理 + */ + private Integer supplierDeliveryType; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 是否待采购 1.是 0.否 2.已处理 + */ + private Integer purchaseSpreadAmount; + /** + * 店铺联系方式 + */ + private String shopMobile; + + /** + * 供应商联系方式 + */ + private String supplierMobile; + /** + * 商品编码 + */ + private String spuCodes; + /** + * sku编码 + */ + private String partyCodes; + + @Schema(description = "尾款支付开始时间") + private Date balanceStartTime; + + @Schema(description = "尾款支付结束时间") + private Date balanceEndTime; + @Schema(description = "定金金额") + private Long depositAmount; + + @Schema(description = "尾款数额") + private Long balanceAmount; + + @Schema(description = "预售发货类型 -1.固定时间 x.尾款支付后x天发货") + private Integer preSaleDeliveryType; + + @Schema(description = "用户名") + private String userName; + + @Schema(description = "用户是否已注销 0.否 1.是") + private Boolean isWriteOff; + + @Schema(description = "是否以评价(0.未评价1.已评价)") + private Integer isComm; + + @Schema(description = "自提点id") + private Long stationId; + + @Schema(description = "自提提货码") + private String stationCode; + + @Schema(description = "自提订单") + private OrderSelfStationVO orderSelfStationVO; + /** + * 支付系统类型 + */ + private Integer paySysType; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + @Schema(description = "订单核销状态 0.待核销 1.核销完成") + private Integer writeOffStatus; + + @Schema(description = "核销订单") + private List orderVirtualInfoList; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "主单号,在组合商品拆单时会存在") + private Long mainOrderId; + + public Long getMainOrderId() { + return mainOrderId; + } + + public void setMainOrderId(Long mainOrderId) { + this.mainOrderId = mainOrderId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Boolean getWriteOff() { + return isWriteOff; + } + + public void setWriteOff(Boolean writeOff) { + isWriteOff = writeOff; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Boolean getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Boolean isWriteOff) { + this.isWriteOff = isWriteOff; + } + + public List getOrderVirtualInfoList() { + return orderVirtualInfoList; + } + + public void setOrderVirtualInfoList(List orderVirtualInfoList) { + this.orderVirtualInfoList = orderVirtualInfoList; + } + + public Integer getWriteOffStatus() { + return writeOffStatus; + } + + public void setWriteOffStatus(Integer writeOffStatus) { + this.writeOffStatus = writeOffStatus; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public OrderSelfStationVO getOrderSelfStationVO() { + return orderSelfStationVO; + } + + public void setOrderSelfStationVO(OrderSelfStationVO orderSelfStationVO) { + this.orderSelfStationVO = orderSelfStationVO; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public String getSpuCodes() { + return spuCodes; + } + + public void setSpuCodes(String spuCodes) { + this.spuCodes = spuCodes; + } + + public String getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(String partyCodes) { + this.partyCodes = partyCodes; + } + + public String getShopMobile() { + return shopMobile; + } + + public void setShopMobile(String shopMobile) { + this.shopMobile = shopMobile; + } + + public String getSupplierMobile() { + return supplierMobile; + } + + public void setSupplierMobile(String supplierMobile) { + this.supplierMobile = supplierMobile; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getPurchaseSpreadAmount() { + return purchaseSpreadAmount; + } + + public void setPurchaseSpreadAmount(Integer purchaseSpreadAmount) { + this.purchaseSpreadAmount = purchaseSpreadAmount; + } + + public Integer getUpdateOrViewDeliveryInfo() { + return updateOrViewDeliveryInfo; + } + + public void setUpdateOrViewDeliveryInfo(Integer updateOrViewDeliveryInfo) { + this.updateOrViewDeliveryInfo = updateOrViewDeliveryInfo; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getOrderInvoiceId() { + return orderInvoiceId; + } + + public void setOrderInvoiceId(Long orderInvoiceId) { + this.orderInvoiceId = orderInvoiceId; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getBookTime() { + return bookTime; + } + + public void setBookTime(Date bookTime) { + this.bookTime = bookTime; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Integer getDeliveryCount() { + return deliveryCount; + } + + public void setDeliveryCount(Integer deliveryCount) { + this.deliveryCount = deliveryCount; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + @Override + public String toString() { + return "EsOrderVO{" + + "orderItems=" + orderItems + + ", orderId=" + orderId + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", status=" + status + + ", orderType=" + orderType + + ", refundStatus=" + refundStatus + + ", deliveryType=" + deliveryType + + ", shopName='" + shopName + '\'' + + ", shopId=" + shopId + + ", freightAmount=" + freightAmount + + ", createTime=" + createTime + + ", allCount=" + allCount + + ", userId=" + userId + + ", orderInvoiceId=" + orderInvoiceId + + ", remarks='" + remarks + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", preSaleType=" + preSaleType + + ", orderMold=" + orderMold + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", freeFreightAmount=" + freeFreightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", orderAddrId=" + orderAddrId + + ", total=" + total + + ", shopRemarks='" + shopRemarks + '\'' + + ", payType=" + payType + + ", closeType=" + closeType + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", cancelTime=" + cancelTime + + ", bookTime=" + bookTime + + ", isPayed=" + isPayed + + ", deleteStatus=" + deleteStatus + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", platformAmount=" + platformAmount + + ", reduceAmount=" + reduceAmount + + ", updateOrViewDeliveryInfo=" + updateOrViewDeliveryInfo + + ", deliveryCount=" + deliveryCount + + ", waitPurchase=" + waitPurchase + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierId=" + supplierId + + ", purchaseSpreadAmount=" + purchaseSpreadAmount + + ", shopMobile='" + shopMobile + '\'' + + ", supplierMobile='" + supplierMobile + '\'' + + ", spuCodes='" + spuCodes + '\'' + + ", partyCodes='" + partyCodes + '\'' + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", depositAmount=" + depositAmount + + ", balanceAmount=" + balanceAmount + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", userName='" + userName + '\'' + + ", isWriteOff=" + isWriteOff + + ", isComm=" + isComm + + ", stationId=" + stationId + + ", stationCode='" + stationCode + '\'' + + ", orderSelfStationVO=" + orderSelfStationVO + + ", paySysType=" + paySysType + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", writeOffStatus=" + writeOffStatus + + ", orderVirtualInfoList=" + orderVirtualInfoList + + ", supplierName='" + supplierName + '\'' + + ", mainOrderId=" + mainOrderId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsPurchaseOrderItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsPurchaseOrderItemVO.java new file mode 100644 index 0000000..a26539c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsPurchaseOrderItemVO.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 采购商品 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class EsPurchaseOrderItemVO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long purchaseItemId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "sku id") + private Long skuId; + + @Schema(description = "采购金额") + private Long purchaseAmount; + + @Schema(description = "采购价") + private Long purchasePrice; + + @Schema(description = "采购库存数量") + private Integer purchaseStock; + + @Schema(description = "实际库存数量") + private Integer actualStock; + + @Schema(description = "实际库存数量") + private Integer deliveryType; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer status; + + @Schema(description = "商品编码") + private String spuCode; + + @Schema(description = "sku编码") + private String partyCode; + + @Schema(description = "商品图片") + private String pic; + + @Schema(description = "待发货数量") + private Integer beDeliveredNum; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "sku名称") + private String skuName; + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(Long purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public Long getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(Long purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Override + public String toString() { + return "EsPurchaseOrderItemVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", purchaseItemId=" + purchaseItemId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", purchaseAmount=" + purchaseAmount + + ", purchasePrice=" + purchasePrice + + ", purchaseStock=" + purchaseStock + + ", actualStock=" + actualStock + + ", deliveryType=" + deliveryType + + ", status=" + status + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", pic='" + pic + '\'' + + ", beDeliveredNum=" + beDeliveredNum + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsPurchaseOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsPurchaseOrderVO.java new file mode 100644 index 0000000..fa4e39b --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsPurchaseOrderVO.java @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 采购订单信息 + * + * @author YXF + * @date 20222-09-20 + */ +public class EsPurchaseOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "采购id") + private Long purchaseOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "订单创建时间") + private Date createTime; + + @Schema(description = "订单更新时间") + private Date updateTime; + + @Schema(description = "送达时间") + private Date deliverTime; + + @Schema(description = "发货时间") + private Date deliveryTime; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商联系方式") + private String contactPhone; + + @Schema(description = "总采购金额") + private Double totalAmount; + + @Schema(description = "总采购库存数量") + private Integer totalStock; + + @Schema(description = "实际总库存数量") + private Integer actualTotalStock; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer status; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递 4同城配送") + private Integer deliveryType; + + @Schema(description = "收货人姓名") + private String consignee; + + @Schema(description = "收货人手机号") + private String mobile; + + @Schema(description = "商品名称") + private String spuName; + + + @Schema(description = "采购订单项列表") + private List purchaseOrderItems; + + @Schema(description = "付款凭证图片") + private String voucherImgUrls; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "仓库名称") + private String warehouseName; + + @Schema(description = "供应商仓库id") + private Long supplierWarehouseId; + + @Schema(description = "库存点类型(1:仓库, 2:门店)") + private Integer stockPointType; + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getDeliverTime() { + return deliverTime; + } + + public void setDeliverTime(Date deliverTime) { + this.deliverTime = deliverTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Double getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Double totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getActualTotalStock() { + return actualTotalStock; + } + + public void setActualTotalStock(Integer actualTotalStock) { + this.actualTotalStock = actualTotalStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public List getPurchaseOrderItems() { + return purchaseOrderItems; + } + + public void setPurchaseOrderItems(List purchaseOrderItems) { + this.purchaseOrderItems = purchaseOrderItems; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public String getVoucherImgUrls() { + return voucherImgUrls; + } + + public void setVoucherImgUrls(String voucherImgUrls) { + this.voucherImgUrls = voucherImgUrls; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public Long getSupplierWarehouseId() { + return supplierWarehouseId; + } + + public void setSupplierWarehouseId(Long supplierWarehouseId) { + this.supplierWarehouseId = supplierWarehouseId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "EsPurchaseOrderVO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deliverTime=" + deliverTime + + ", deliveryTime=" + deliveryTime + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", totalAmount=" + totalAmount + + ", totalStock=" + totalStock + + ", actualTotalStock=" + actualTotalStock + + ", status=" + status + + ", remark='" + remark + '\'' + + ", employeeId=" + employeeId + + ", deliveryType=" + deliveryType + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", spuName='" + spuName + '\'' + + ", purchaseOrderItems=" + purchaseOrderItems + + ", voucherImgUrls='" + voucherImgUrls + '\'' + + ", warehouseId=" + warehouseId + + ", warehouseName='" + warehouseName + '\'' + + ", supplierWarehouseId=" + supplierWarehouseId + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsSupplierOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsSupplierOrderVO.java new file mode 100644 index 0000000..5296e77 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/EsSupplierOrderVO.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2021/2/5 + */ +public class EsSupplierOrderVO extends EsOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer supplierHandleStatus; + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + @Override + public String toString() { + return "EsSupplierOrderVO{" + + "supplierHandleStatus=" + supplierHandleStatus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderActivityVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderActivityVO.java new file mode 100644 index 0000000..3c12f79 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderActivityVO.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单活动信息VO + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderActivityVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "是否支付") + private Integer isPayed; + + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "商品数量") + private Integer count; + + @Schema(description = "活动id") + private Long activityId; + + /** + * 枚举类:OrderActivityType + */ + @Schema(description = "活动类型") + private Integer activityType; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "订单项列表") + private List orderItems; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + @Override + public String toString() { + return "OrderActivityVO{" + + "orderId=" + orderId + + ", isPayed=" + isPayed + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", count=" + count + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", orderItems=" + orderItems + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderAddrVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderAddrVO.java new file mode 100644 index 0000000..e55b113 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderAddrVO.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户订单配送地址VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long orderAddrId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区域ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "OrderAddrVO{" + + "orderAddrId=" + orderAddrId + + ", userId=" + userId + + ", consignee='" + consignee + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", addr='" + addr + '\'' + + ", postCode='" + postCode + '\'' + + ", mobile='" + mobile + '\'' + + ", lng=" + lng + + ", lat=" + lat + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderAmountInfoBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderAmountInfoBO.java new file mode 100644 index 0000000..151f870 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderAmountInfoBO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2021/1/13 + */ +public class OrderAmountInfoBO extends OrderSimpleAmountInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款成功金额 + */ + private Long refundSuccessAmount; + + /** + * 平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + */ + private Long platformRefundAmount; + + public Long getRefundSuccessAmount() { + return refundSuccessAmount; + } + + public void setRefundSuccessAmount(Long refundSuccessAmount) { + this.refundSuccessAmount = refundSuccessAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + @Override + public String toString() { + return "OrderAmountInfoBO{" + + "refundSuccessAmount=" + refundSuccessAmount + + ", platformRefundAmount=" + platformRefundAmount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderExcelVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderExcelVO.java new file mode 100644 index 0000000..a093a91 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderExcelVO.java @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 订单excel信息 + * + * @author YXF + * @date 2020-3-9 + */ + +@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER) +public class OrderExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "订单信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + + @ExcelProperty(value = {"订单信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"订单信息", "订单ID"}, index = 1) + private String orderId; + + @ColumnWidth(20) + @DateTimeFormat("yyyy-MM-dd") + @ExcelProperty(value = {"订单信息", "下单时间"}, index = 2) + private Date createTime; + + @ExcelProperty(value = {"订单信息", "配送类型"}, index = 3) + private String deliveryType; + + @ExcelProperty(value = {"订单信息", "收货人姓名"}, index = 4) + private String consignee; + + @ExcelProperty(value = {"订单信息", "收货人手机"}, index = 5) + private String mobile; + + @ExcelProperty(value = {"订单信息", "收货地址"}, index = 6) + private String receivingAddr; + + @ExcelProperty(value = {"订单信息", "订单总额"}, index = 7) + private String total; + + @ExcelProperty(value = {"订单信息", "运费金额"}, index = 8) + private String freightAmount; + + @ExcelProperty(value = {"订单信息", "优惠总额"}, index = 9) + private String reduceAmount; + + @ExcelProperty(value = {"订单信息", "使用积分"}, index = 10) + private String orderScore; + + @ExcelProperty(value = {"订单信息", "实际支付"}, index = 11) + private String actualTotal; + + @ExcelProperty(value = {"订单信息", "支付类型"}, index = 12) + private String payType; + + @ExcelProperty(value = {"订单信息", "订单状态"}, index = 13) + private String status; + + @ExcelProperty(value = {"订单信息", "订单售后状态"}, index = 14) + private String refundStatus; + + @ExcelProperty(value = {"订单信息", "订单类别"}, index = 15) + private String orderMold; + + @ExcelProperty({"订单项信息", "商品名称"}) + private String spuName; + + @ExcelProperty({"订单项信息", "sku名称"}) + private String skuName; + + @ExcelProperty({"订单项信息", "商品价格"}) + private String price; + + @ExcelProperty({"订单项信息", "商品数量"}) + private Integer count; + + @ExcelProperty({"订单项信息", "商品总金额"}) + private String spuTotalAmount; + + @ExcelProperty({"订单项信息", "优惠金额"}) + private String shareReduce; + + @ExcelProperty({"订单项信息", "实际金额"}) + private String actualTotalItem; + + @ExcelProperty({"订单项信息", "使用积分"}) + private Long useScore; + + @ExcelProperty({"订单项信息", "售后状态"}) + private String refundStatusItem; + + @ExcelIgnore + private List orderItemLangList; + + public String getOrderMold() { + return orderMold; + } + + public void setOrderMold(String orderMold) { + this.orderMold = orderMold; + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(String deliveryType) { + this.deliveryType = deliveryType; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public String getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(String freightAmount) { + this.freightAmount = freightAmount; + } + + public String getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(String reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public String getOrderScore() { + return orderScore; + } + + public void setOrderScore(String orderScore) { + this.orderScore = orderScore; + } + + public String getActualTotal() { + return actualTotal; + } + + public void setActualTotal(String actualTotal) { + this.actualTotal = actualTotal; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(String refundStatus) { + this.refundStatus = refundStatus; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public String getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(String spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public String getShareReduce() { + return shareReduce; + } + + public void setShareReduce(String shareReduce) { + this.shareReduce = shareReduce; + } + + public String getActualTotalItem() { + return actualTotalItem; + } + + public void setActualTotalItem(String actualTotalItem) { + this.actualTotalItem = actualTotalItem; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public String getRefundStatusItem() { + return refundStatusItem; + } + + public void setRefundStatusItem(String refundStatusItem) { + this.refundStatusItem = refundStatusItem; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + @Override + public String toString() { + return "OrderExcelVO{" + + "seq='" + seq + '\'' + + ", orderId='" + orderId + '\'' + + ", createTime=" + createTime + + ", deliveryType='" + deliveryType + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", total='" + total + '\'' + + ", freightAmount='" + freightAmount + '\'' + + ", reduceAmount='" + reduceAmount + '\'' + + ", orderScore='" + orderScore + '\'' + + ", actualTotal='" + actualTotal + '\'' + + ", payType='" + payType + '\'' + + ", status='" + status + '\'' + + ", refundStatus='" + refundStatus + '\'' + + ", orderMold='" + orderMold + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", price='" + price + '\'' + + ", count=" + count + + ", spuTotalAmount='" + spuTotalAmount + '\'' + + ", shareReduce='" + shareReduce + '\'' + + ", actualTotalItem='" + actualTotalItem + '\'' + + ", useScore=" + useScore + + ", refundStatusItem='" + refundStatusItem + '\'' + + ", orderItemLangList=" + orderItemLangList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderItemLangVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderItemLangVO.java new file mode 100644 index 0000000..f968055 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderItemLangVO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单项-国际化VO + * + * @author YXF + * @date 2021-05-17 10:26:54 + */ +public class OrderItemLangVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项ID") + private Long orderItemId; + + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "供应商商品名称") + private String supplierSpuName; + + @Schema(description = "供应商sku名称") + private String supplierSkuName; + + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Override + public String toString() { + return "OrderItemLangVO{" + + "orderItemId=" + orderItemId + + ", lang=" + lang + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderPreSaleInfoVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderPreSaleInfoVO.java new file mode 100644 index 0000000..1775065 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderPreSaleInfoVO.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单预售信息VO + * + * @author lhd + * @date 2022-08-17 16:36:47 + */ +public class OrderPreSaleInfoVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long orderPreSaleInfoId; + + @Schema(description = "订单编号") + private Long orderId; + + @Schema(description = "定金金额") + private Long depositAmount; + + @Schema(description = "定金膨胀金额") + private Long depositExpansionAmount; + @Schema(description = "定金优惠金额") + private Long depositReduceAmount; + + @Schema(description = "尾款金额") + private Long balanceAmount; + + @Schema(description = "尾款支付开始时间") + private Date balanceStartTime; + + @Schema(description = "尾款支付结束时间") + private Date balanceEndTime; + + @Schema(description = "预售发货类型 -1.固定时间 x.尾款支付后x天发货") + private Integer preSaleDeliveryType; + + @Schema(description = "预售发货时间") + private Date preSaleDeliveryTime; + + @Schema(description = "预售类型 -1.未开启预售 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + @Schema(description = "尾款支付时间") + private Date balancePayTime; + + @Schema(description = "定金预售支付状态 1.已支付定金 2.已支付尾款") + private Integer payStatus; + + public Long getDepositReduceAmount() { + return depositReduceAmount; + } + + public void setDepositReduceAmount(Long depositReduceAmount) { + this.depositReduceAmount = depositReduceAmount; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Date getBalancePayTime() { + return balancePayTime; + } + + public void setBalancePayTime(Date balancePayTime) { + this.balancePayTime = balancePayTime; + } + + public Integer getPayStatus() { + return payStatus; + } + + public void setPayStatus(Integer payStatus) { + this.payStatus = payStatus; + } + + public Long getOrderPreSaleInfoId() { + return orderPreSaleInfoId; + } + + public void setOrderPreSaleInfoId(Long orderPreSaleInfoId) { + this.orderPreSaleInfoId = orderPreSaleInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getDepositExpansionAmount() { + return depositExpansionAmount; + } + + public void setDepositExpansionAmount(Long depositExpansionAmount) { + this.depositExpansionAmount = depositExpansionAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + @Override + public String toString() { + return "OrderPreSaleInfoVO{" + + "orderPreSaleInfoId=" + orderPreSaleInfoId + + ", orderId=" + orderId + + ", depositAmount=" + depositAmount + + ", depositExpansionAmount=" + depositExpansionAmount + + ", depositReduceAmount=" + depositReduceAmount + + ", balanceAmount=" + balanceAmount + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", preSaleType=" + preSaleType + + ", balancePayTime=" + balancePayTime + + ", payStatus=" + payStatus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSelfStationVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSelfStationVO.java new file mode 100644 index 0000000..6d77a8c --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSelfStationVO.java @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 自提订单自提点信息VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderSelfStationVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderSelfStationId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "订单编号") + private Long orderId; + + @Schema(description = "自提点id") + private Long stationId; + + @Schema(description = "自提人的手机") + private String stationUserMobile; + + @Schema(description = "自提人的名字") + private String stationUserName; + + @Schema(description = "自提时间(用户下单时选择)") + private String stationTime; + + @Schema(description = "自提提货码") + private String stationCode; + + @Schema(description = "上门自提点的地址") + private String stationAddress; + + @Schema(description = "上门自提点的联系电话") + private String stationPhone; + + @Schema(description = "自提点时间日期数据") + private String timeInfo; + + @Schema(description = "自提点名称") + private String stationName; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "店铺状态") + private Integer stationStatus; + + @Schema(description = "自提点距离(实时)") + private Double distance; + + @Schema(description = "自提点logo)") + private String stationImgUrl; + + @Schema(description = "订单项列表") + private List orderItems; + + @Schema(description = "订单状态") + private Integer orderStatus; + + @Schema(description = "自提门店状态 0:没有门店 1:门店没有库存 2:库存充足 ") + private Integer stationStockStatus; + + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public String getStationImgUrl() { + return stationImgUrl; + } + + public void setStationImgUrl(String stationImgUrl) { + this.stationImgUrl = stationImgUrl; + } + + public Double getDistance() { + return distance; + } + + public void setDistance(Double distance) { + this.distance = distance; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Integer getStationStatus() { + return stationStatus; + } + + public void setStationStatus(Integer stationStatus) { + this.stationStatus = stationStatus; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public String getTimeInfo() { + return timeInfo; + } + + public void setTimeInfo(String timeInfo) { + this.timeInfo = timeInfo; + } + + public Long getOrderSelfStationId() { + return orderSelfStationId; + } + + public void setOrderSelfStationId(Long orderSelfStationId) { + this.orderSelfStationId = orderSelfStationId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getStationUserMobile() { + return stationUserMobile; + } + + public void setStationUserMobile(String stationUserMobile) { + this.stationUserMobile = stationUserMobile; + } + + public String getStationUserName() { + return stationUserName; + } + + public void setStationUserName(String stationUserName) { + this.stationUserName = stationUserName; + } + + public String getStationTime() { + return stationTime; + } + + public void setStationTime(String stationTime) { + this.stationTime = stationTime; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public String getStationAddress() { + return stationAddress; + } + + public void setStationAddress(String stationAddress) { + this.stationAddress = stationAddress; + } + + public String getStationPhone() { + return stationPhone; + } + + public void setStationPhone(String stationPhone) { + this.stationPhone = stationPhone; + } + + public Integer getStationStockStatus() { + return stationStockStatus; + } + + public void setStationStockStatus(Integer stationStockStatus) { + this.stationStockStatus = stationStockStatus; + } + + @Override + public String toString() { + return "OrderSelfStationVO{" + + "orderSelfStationId=" + orderSelfStationId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", stationId=" + stationId + + ", stationUserMobile='" + stationUserMobile + '\'' + + ", stationUserName='" + stationUserName + '\'' + + ", stationTime='" + stationTime + '\'' + + ", stationCode='" + stationCode + '\'' + + ", stationAddress='" + stationAddress + '\'' + + ", stationPhone='" + stationPhone + '\'' + + ", timeInfo='" + timeInfo + '\'' + + ", stationName='" + stationName + '\'' + + ", lng=" + lng + + ", lat=" + lat + + ", stationStatus=" + stationStatus + + ", distance=" + distance + + ", stationImgUrl='" + stationImgUrl + '\'' + + ", orderItems=" + orderItems + + ", orderStatus=" + orderStatus + + ", stationStockStatus=" + stationStockStatus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSimpleAmountInfoBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSimpleAmountInfoBO.java new file mode 100644 index 0000000..95d827a --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSimpleAmountInfoBO.java @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2020/12/30 + */ +public class OrderSimpleAmountInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺钱包id + */ + private Long walletLogId; + + private Long orderId; + + private Long shopId; + + /** + * 支付系统类型 + */ + private Integer paySysType; + + /** + * 实际总值 + */ + private Long actualTotal; + + /** + * 平台补贴金额 + */ + private Long platformAmount; + + + /** + * 订单状态 + */ + private Integer status; + + /** + * 订单关闭原因 + */ + private Integer closeType; + + /** + * 分销金额 + */ + private Long distributionAmount; + + /** + * 平台佣金 + */ + private Long platformCommission; + /** + * 店铺优惠金额 + */ + private Long shopAmount; + /** + * 总计优惠金额 + */ + private Long reduceAmount; + /** + * 供应商id + */ + private Long supplierId; + /** + * 供应商商品发货方式 1.供应商发货 2.仓库发货 + */ + private Long supplierDeliveryType; + /** + * 采购总价 + */ + private Long purchaseAmount; + /** + * 运费 + */ + private Long freightAmount; + /** + * 运费 + */ + private Long freeFreightAmount; + /** + * 平台供应商佣金 + */ + private Long purchasePlatformCommission; + + /** + * 是否待采购 1.是 0.否 2.已处理 + */ + private Integer waitPurchase; + + /** + * 支付单号 + */ + private Long payId; + + /** + * 第三方订单流水号 + */ + private String bizPayNo; + + public String getBizPayNo() { + return bizPayNo; + } + + public void setBizPayNo(String bizPayNo) { + this.bizPayNo = bizPayNo; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(Long purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public Long getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Long supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Long getShopAmount() { + return shopAmount; + } + + public void setShopAmount(Long shopAmount) { + this.shopAmount = shopAmount; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getWalletLogId() { + return walletLogId; + } + + public void setWalletLogId(Long walletLogId) { + this.walletLogId = walletLogId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "OrderSimpleAmountInfoBO{" + + "walletLogId=" + walletLogId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", paySysType=" + paySysType + + ", actualTotal=" + actualTotal + + ", platformAmount=" + platformAmount + + ", status=" + status + + ", closeType=" + closeType + + ", distributionAmount=" + distributionAmount + + ", platformCommission=" + platformCommission + + ", shopAmount=" + shopAmount + + ", reduceAmount=" + reduceAmount + + ", supplierId=" + supplierId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", purchaseAmount=" + purchaseAmount + + ", freightAmount=" + freightAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", purchasePlatformCommission=" + purchasePlatformCommission + + ", waitPurchase=" + waitPurchase + + ", payId=" + payId + + ", bizPayNo='" + bizPayNo + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSkuLangVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSkuLangVO.java new file mode 100644 index 0000000..6fe97f3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderSkuLangVO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单sku-国际化表VO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class OrderSkuLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "sku名称") + private String skuName; + @Schema(description = "组合主sku名称") + private String comboSkuName; + + public String getComboSkuName() { + return comboSkuName; + } + + public void setComboSkuName(String comboSkuName) { + this.comboSkuName = comboSkuName; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Override + public String toString() { + return "OrderSkuLangVO{" + + "lang=" + lang + + ", skuName='" + skuName + '\'' + + ", comboSkuName='" + comboSkuName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderVO.java new file mode 100644 index 0000000..329682b --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderVO.java @@ -0,0 +1,817 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "用户订单地址Id") + private Long orderAddrId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "买家昵称") + private String nickName; + + @Schema(description = "总值") + private Long total; + + @Schema(description = "实际总值") + private Long actualTotal; + + @Schema(description = "订单使用积分") + private Long orderScore; + + @Schema(description = "买家备注") + private String remarks; + + @Schema(description = "卖家备注") + private String shopRemarks; + + @Schema(description = "订单状态 1:待付款 2:待发货(待自提) 3:待收货(已发货) 5:成功 6:失败 7:待成团") + private Integer status; + + @Schema(description = "支付方式 请参考枚举PayType") + private Integer payType; + + @Schema(description = "配送类型 1:快递 2:自提 3:无需快递 4同城配送") + private Integer deliveryType; + + @Schema(description = "订单类型1团购订单 2秒杀订单 3积分订单") + private Integer orderType; + + @Schema(description = "是否为虚拟商品订单 1.是 0.否") + private Integer orderMold; + + @Schema(description = "订单关闭原因 1-超时未支付 2-退款关闭 4-买家取消 15-已通过货到付款交易") + private Integer closeType; + + @Schema(description = "订单商品总数") + private Integer allCount; + + @Schema(description = "付款时间") + private Date payTime; + + @Schema(description = "发货时间") + private Date deliveryTime; + + @Schema(description = "完成时间") + private Date finallyTime; + + @Schema(description = "取消时间") + private Date cancelTime; + + @Schema(description = "预售发货时间") + private Date bookTime; + + @Schema(description = "是否已支付,1.已支付0.未支付") + private Integer isPayed; + + @Schema(description = "用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除") + private Integer deleteStatus; + + @Schema(description = "订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)") + private Integer refundStatus; + + @Schema(description = "订单运费") + private Long freightAmount; + + @Schema(description = "店铺订单运费") + private Long shopChangeFreeAmount; + + @Schema(description = "积分抵扣金额") + private Long scoreAmount; + + @Schema(description = "会员折扣金额") + private Long memberAmount; + + @Schema(description = "平台优惠券优惠金额") + private Long platformCouponAmount; + + @Schema(description = "商家优惠券优惠金额") + private Long shopCouponAmount; + + @Schema(description = "满减优惠金额") + private Long discountAmount; + + @Schema(description = "分销金额") + private Long distributionAmount; + + @Schema(description = "平台优惠金额") + private Long platformAmount; + + @Schema(description = "平台运费减免金额") + private Long platformFreeFreightAmount; + + @Schema(description = "优惠总额") + private Long reduceAmount; + + @Schema(description = "订单项") + private List orderItems; + + @Schema(description = "订单地址") + private OrderAddrVO orderAddr; + + @Schema(description = "物流Id") + private Long dvyId; + + @Schema(description = "物流单号") + private String dvyFlowId; + + @Schema(description = "商家运费减免金额") + private Long freeFreightAmount; + + @Schema(description = "消费者联系方式") + private String mobile; + + @Schema(description = "供应商联系方式") + private String supplierMobile; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商商品发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "否待采购 1.是 0.否") + private Integer waitPurchase; + + @Schema(description = "是否已经进行结算") + private Integer isSettled; + + @Schema(description = "平台佣金") + private Long platformCommission; + + @Schema(description = "商家采购价差(需要商家从结算金额补上采购价的金额)") + private Long purchaseSpreadAmount; + @Schema(description = "预售类型 -1:未开启 0.全款预售 1.定金预售") + private Integer preSaleType; + + @Schema(description = "预售信息") + private OrderPreSaleInfoVO orderPreSaleInfoVO; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "用户自提信息") + private OrderSelfStationVO orderSelfStationVO; + + @Schema(description = "自提点id") + private Long stationId; + + @Schema(description = "套餐优惠金额") + private Long shopComboAmount; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + @Schema(description = "订单核销状态 0.待核销 1.核销完成") + private Integer writeOffStatus; + + @Schema(description = "核销订单") + private List orderVirtualInfoList; + /** + * 支付系统类型 + */ + private Integer paySysType; + + /** + * 订单被核销次数 + */ + private Integer writeOffCount; + + /** + * 主单号,在组合商品拆单时会存在 + */ + private Long mainOrderId; + + public Long getMainOrderId() { + return mainOrderId; + } + + public void setMainOrderId(Long mainOrderId) { + this.mainOrderId = mainOrderId; + } + public Integer getWriteOffCount() { + return writeOffCount; + } + + public void setWriteOffCount(Integer writeOffCount) { + this.writeOffCount = writeOffCount; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public List getOrderVirtualInfoList() { + return orderVirtualInfoList; + } + + public void setOrderVirtualInfoList(List orderVirtualInfoList) { + this.orderVirtualInfoList = orderVirtualInfoList; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Integer getWriteOffStatus() { + return writeOffStatus; + } + + public void setWriteOffStatus(Integer writeOffStatus) { + this.writeOffStatus = writeOffStatus; + } + + public Long getShopComboAmount() { + return shopComboAmount; + } + + public void setShopComboAmount(Long shopComboAmount) { + this.shopComboAmount = shopComboAmount; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public OrderSelfStationVO getOrderSelfStationVO() { + return orderSelfStationVO; + } + + public void setOrderSelfStationVO(OrderSelfStationVO orderSelfStationVO) { + this.orderSelfStationVO = orderSelfStationVO; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getShopRemarks() { + return shopRemarks; + } + + public void setShopRemarks(String shopRemarks) { + this.shopRemarks = shopRemarks; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public Integer getOrderMold() { + return orderMold; + } + + public void setOrderMold(Integer orderMold) { + this.orderMold = orderMold; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getFinallyTime() { + return finallyTime; + } + + public void setFinallyTime(Date finallyTime) { + this.finallyTime = finallyTime; + } + + public Date getCancelTime() { + return cancelTime; + } + + public void setCancelTime(Date cancelTime) { + this.cancelTime = cancelTime; + } + + public Date getBookTime() { + return bookTime; + } + + public void setBookTime(Date bookTime) { + this.bookTime = bookTime; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Integer getDeleteStatus() { + return deleteStatus; + } + + public void setDeleteStatus(Integer deleteStatus) { + this.deleteStatus = deleteStatus; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public OrderAddrVO getOrderAddr() { + return orderAddr; + } + + public void setOrderAddr(OrderAddrVO orderAddr) { + this.orderAddr = orderAddr; + } + + public Long getDvyId() { + return dvyId; + } + + public void setDvyId(Long dvyId) { + this.dvyId = dvyId; + } + + public String getDvyFlowId() { + return dvyFlowId; + } + + public void setDvyFlowId(String dvyFlowId) { + this.dvyFlowId = dvyFlowId; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getSupplierMobile() { + return supplierMobile; + } + + public void setSupplierMobile(String supplierMobile) { + this.supplierMobile = supplierMobile; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Integer waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Integer getIsSettled() { + return isSettled; + } + + public void setIsSettled(Integer isSettled) { + this.isSettled = isSettled; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getPurchaseSpreadAmount() { + return purchaseSpreadAmount; + } + + public void setPurchaseSpreadAmount(Long purchaseSpreadAmount) { + this.purchaseSpreadAmount = purchaseSpreadAmount; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public OrderPreSaleInfoVO getOrderPreSaleInfoVO() { + return orderPreSaleInfoVO; + } + + public void setOrderPreSaleInfoVO(OrderPreSaleInfoVO orderPreSaleInfoVO) { + this.orderPreSaleInfoVO = orderPreSaleInfoVO; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + @Override + public String toString() { + return "OrderVO{" + + "orderId=" + orderId + + ", shopId=" + shopId + + ", userId=" + userId + + ", orderAddrId=" + orderAddrId + + ", shopName='" + shopName + '\'' + + ", nickName='" + nickName + '\'' + + ", total=" + total + + ", actualTotal=" + actualTotal + + ", orderScore=" + orderScore + + ", remarks='" + remarks + '\'' + + ", shopRemarks='" + shopRemarks + '\'' + + ", status=" + status + + ", payType=" + payType + + ", deliveryType=" + deliveryType + + ", orderType=" + orderType + + ", orderMold=" + orderMold + + ", closeType=" + closeType + + ", allCount=" + allCount + + ", payTime=" + payTime + + ", deliveryTime=" + deliveryTime + + ", finallyTime=" + finallyTime + + ", cancelTime=" + cancelTime + + ", bookTime=" + bookTime + + ", isPayed=" + isPayed + + ", deleteStatus=" + deleteStatus + + ", refundStatus=" + refundStatus + + ", freightAmount=" + freightAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", distributionAmount=" + distributionAmount + + ", platformAmount=" + platformAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", reduceAmount=" + reduceAmount + + ", orderItems=" + orderItems + + ", orderAddr=" + orderAddr + + ", dvyId=" + dvyId + + ", dvyFlowId='" + dvyFlowId + '\'' + + ", freeFreightAmount=" + freeFreightAmount + + ", mobile='" + mobile + '\'' + + ", supplierMobile='" + supplierMobile + '\'' + + ", supplierId=" + supplierId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", waitPurchase=" + waitPurchase + + ", isSettled=" + isSettled + + ", platformCommission=" + platformCommission + + ", purchaseSpreadAmount=" + purchaseSpreadAmount + + ", preSaleType=" + preSaleType + + ", orderPreSaleInfoVO=" + orderPreSaleInfoVO + + ", supplierName='" + supplierName + '\'' + + ", orderSelfStationVO=" + orderSelfStationVO + + ", stationId=" + stationId + + ", shopComboAmount=" + shopComboAmount + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", writeOffStatus=" + writeOffStatus + + ", orderVirtualInfoList=" + orderVirtualInfoList + + ", paySysType=" + paySysType + + ", writeOffCount=" + writeOffCount + + ", mainOrderId=" + mainOrderId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderVirtualInfoVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderVirtualInfoVO.java new file mode 100644 index 0000000..c328259 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/OrderVirtualInfoVO.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单虚拟商品信息VO + * + * @author FrozenWatermelon + * @date 2023-02-24 13:55:55 + */ +public class OrderVirtualInfoVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderVirtualInfoId; + + @Schema(description = "订单ID") + private Long orderId; + + @Schema(description = "订单ID") + private Long orderItemId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "核销门店id") + private Long stationId; + + @Schema(description = "核销门店") + private String stationName; + + @Schema(description = "核销码") + private String writeOffCode; + + @Schema(description = "是否核销 1.已核销 0.未核销") + private Integer isWriteOff; + + @Schema(description = "核销时间是否过期 1是 0 否") + private Integer isExpired; + + @Schema(description = "核销时间") + private Date writeOffTime; + + @Schema(description = "剩余核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getOrderVirtualInfoId() { + return orderVirtualInfoId; + } + + public void setOrderVirtualInfoId(Long orderVirtualInfoId) { + this.orderVirtualInfoId = orderVirtualInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Integer getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Integer isWriteOff) { + this.isWriteOff = isWriteOff; + } + + public Date getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Date writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Integer getIsExpired() { + return isExpired; + } + + public void setIsExpired(Integer isExpired) { + this.isExpired = isExpired; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + @Override + public String toString() { + return "OrderVirtualInfoVO{" + + "orderVirtualInfoId=" + orderVirtualInfoId + + ", orderId=" + orderId + + ", shopId=" + shopId + + ", stationId=" + stationId + + ", stationName='" + stationName + '\'' + + ", writeOffCode='" + writeOffCode + '\'' + + ", isWriteOff=" + isWriteOff + + ", isExpired=" + isExpired + + ", writeOffTime=" + writeOffTime + + ", writeOffMultipleCount=" + writeOffMultipleCount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/SendNotifyBO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/SendNotifyBO.java new file mode 100644 index 0000000..a0de219 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/SendNotifyBO.java @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lhd + * @date 2021/05/08 + */ +public class SendNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单id + */ + private Long bizId; + /** + * 用户id + */ + private Long userId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 自提门店名称 + */ + private String stationName; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 是否待采购 1.是 0.否 2.已处理 + */ + private Integer supplierDeliveryType; + + /** + * 商品名称 + */ + private String spuName; + + /** + * 手机号 + */ + private String mobile; + /** + * 发送类型 + */ + private Integer sendType; + + /** + * 实付金额 + */ + private Long actualTotal; + + /** + * 实付金额转换成string并除以100 + */ + private String actualTotalStr; + + /** + * 物流公司名称 + */ + private String dvyName; + /** + * 退款金额、拼团金额、实付金额 + */ + private String price; + /** + * 物流单号 + */ + private String dvyFlowId; + /** + * 退款备注 + */ + private String remark; + /** + * 等级名称 + */ + private String levelName; + /** + * 退款原因 + */ + private String rejectMessage; + /** + * 退款原因 + */ + private Integer hour; + + /** + * 关联商品id + */ + private Long spuId; + + /** + * 关联营销活动id + */ + private Long activityId; + + private String activityName; + + /** + * 商品数量 + */ + private Integer prodNum; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + public String getActivityName() { + return activityName; + } + + public void setActivityName(String activityName) { + this.activityName = activityName; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getHour() { + return hour; + } + + public void setHour(Integer hour) { + this.hour = hour; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getDvyName() { + return dvyName; + } + + public void setDvyName(String dvyName) { + this.dvyName = dvyName; + } + + public String getDvyFlowId() { + return dvyFlowId; + } + + public void setDvyFlowId(String dvyFlowId) { + this.dvyFlowId = dvyFlowId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public String getActualTotalStr() { + return actualTotalStr; + } + + public void setActualTotalStr(String actualTotalStr) { + this.actualTotalStr = actualTotalStr; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getProdNum() { + return prodNum; + } + + public void setProdNum(Integer prodNum) { + this.prodNum = prodNum; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + @Override + public String toString() { + return "SendNotifyBO{" + + "bizId=" + bizId + + ", userId=" + userId + + ", shopId=" + shopId + + ", stationName='" + stationName + '\'' + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", supplierDeliveryType=" + supplierDeliveryType + + ", spuName='" + spuName + '\'' + + ", mobile='" + mobile + '\'' + + ", sendType=" + sendType + + ", actualTotal=" + actualTotal + + ", actualTotalStr='" + actualTotalStr + '\'' + + ", dvyName='" + dvyName + '\'' + + ", price='" + price + '\'' + + ", dvyFlowId='" + dvyFlowId + '\'' + + ", remark='" + remark + '\'' + + ", levelName='" + levelName + '\'' + + ", rejectMessage='" + rejectMessage + '\'' + + ", hour=" + hour + + ", spuId=" + spuId + + ", activityId=" + activityId + + ", activityName='" + activityName + '\'' + + ", prodNum=" + prodNum + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartItemVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartItemVO.java new file mode 100644 index 0000000..83e668a --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartItemVO.java @@ -0,0 +1,1305 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.order.bo.DeliveryModeBO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +public class ShopCartItemVO implements Serializable { + public ShopCartItemVO() { + } + + public ShopCartItemVO(Long userId, Long spuId, Long skuId, Integer count) { + this.userId = userId; + this.spuId = spuId; + this.skuId = skuId; + this.count = count; + } + + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "加入购物车时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "购物车ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long cartItemId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "产品ID") + private Long spuId; + + @Schema(description = "SkuID") + private Long skuId; + + @Schema(description = "库存点id 自提:自提点id, 其他:仓库id") + private Long stockPointId; + + @Schema(description = "库存点类型 1仓库 2门店 ") + private Integer stockPointType; + + @Schema(description = "关联供应商商品id") + private Long supplierSpuId; + + @Schema(description = "关联供应商skuId") + private Long supplierSkuId; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "商品编码") + private String spuCode; + + @Schema(description = "sku编码") + private String partyCode; + + @Schema(description = "购物车产品个数") + private Integer count; + + @Schema(description = "满减活动ID") + private Long discountId; + + @Schema(description = "是否已经勾选") + private Integer isChecked; + +// @Schema(description = "售价,加入购物车时的商品价格") +// private Long priceFee; + + @Schema(description = "当前商品价格") + private Long skuPriceFee; + + @Schema(description = "当前总价格(商品价格 * 数量)") + private Long totalPriceFee; + + @Schema(description = "当前总价格(商品价格 * 数量)(带小数)") + private Long totalPrice; + + @Schema(description = "配送方式json") + private String deliveryMode; + + @Schema(description = "配送方式对象") + private DeliveryModeBO deliveryModeBO; + + @Schema(description = "运费模板id") + private Long deliveryTemplateId; + + @Schema(description = "固定运费金额") + private Long deliveryAmount; + + @Schema(description = "供应商的运费模板id") + private Long supplierDeliveryTemplateId; + + @Schema(description = "供应商的固定运费金额") + private Long supplierDeliveryAmount; + + @Schema(description = "商品重量") + private BigDecimal weight; + + @Schema(description = "商品体积") + private BigDecimal volume; + + @Schema(description = "商品图片") + private String imgUrl; + + @Schema(description = "是否已收藏") + private String isCollection; + + @Schema(description = "积分价格", requiredMode = Schema.RequiredMode.REQUIRED) + private Long scoreFee; + + @Schema(description = "产品所需积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long scorePrice; + + @Schema(description = "总金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalAmount; + + @Schema(description = "总采购价", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalPurchaseAmount; + + @Schema(description = "采购价", requiredMode = Schema.RequiredMode.REQUIRED) + private Long supplierPriceFee; + + @Schema(description = "商品实际金额 = 商品总金额 - 分摊的优惠金额 - 分摊的积分抵现金额") + private Long actualTotal; + + @Schema(description = "sku规格信息列表") + private List skuLangList; + + @Schema(description = "spu名称列表") + private List spuLangList; + + @Schema(description = "供应商sku规格信息列表") + private List supplierSkuLangList; + + @Schema(description = "供应商spu名称列表") + private List supplierSpuLangList; + + @Schema(description = "分销员用户id") + private Long distributionUserId; + + @Schema(description = "订单项id") + private Long orderItemId; + + /** + * 这里的分摊金额在重算之前,即以下代码执行之前,一直都是商家的分摊金额 + * confirmOrderManager.recalculateAmountWhenFinishingCalculatePlatform(shopCartOrderMerger); + * 执行完毕之后,这里的分摊金额就变成了平台 + 商家的分摊金额 + */ + @Schema(description = "分摊的优惠金额") + private Long shareReduce; + + @Schema(description = "平台分摊的优惠金额") + private Long platformShareReduce; + + @Schema(description = "能否分摊优惠券优惠金额(1可以 0不可以)") + private Integer isShareReduce; + + + @Schema(description = "等级优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long levelReduce; + + @Schema(description = "积分抵扣", requiredMode = Schema.RequiredMode.REQUIRED) + private Long scoreReduce; + + @Schema(description = "平台优惠券优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformCouponAmount; + + @Schema(description = "商家优惠券优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopCouponAmount; + + @Schema(description = "满减优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long discountAmount; + + @Schema(description = "平台运费减免金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformFreeFreightAmount; + + @Schema(description = "商家运费减免金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freeFreightAmount; + @Schema(description = "分账比例", requiredMode = Schema.RequiredMode.REQUIRED) + private Double rate; + @Schema(description = "供应商分账比例", requiredMode = Schema.RequiredMode.REQUIRED) + private Double supplierRate; + + @Schema(description = "平台佣金(商品实际金额 * 分账比例)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long platformCommission; + + @Schema(description = "供应商佣金金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long purchasePlatformCommission; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "商品类型(0普通商品 1拼团 2秒杀 3积分)") + private Integer spuType; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "计量单位") + private String measureUnit; + + @Schema(description = "代销商品规格选择状态,1: 全选 2:部分选择") + private Integer skuChoiceStatus; + + @Schema(description = "赠品信息") + private GiveawayVO giveaway; + + @Schema(description = "赠品退货价") + private Long giveawayRefundPrice; + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "套餐数量") + private Integer comboCount; + + @Schema(description = "主购物车id(套餐)") + private Long parentCartItemId; + + @Schema(description = "预售类型 -1.未开启预售 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + @Schema(description = "定金金额") + private Long depositAmount; + + @Schema(description = "实际定金金额") + private Long actualDepositAmount; + + @Schema(description = "定金膨胀金额") + private Long depositExpansionAmount; + + @Schema(description = "定金优惠金额") + private Long depositReduceAmount; + + @Schema(description = "尾款金额") + private Long balanceAmount; + + @Schema(description = "实际尾款金额") + private Long actualBalanceAmount; + + @Schema(description = "尾款支付开始时间") + private Date balanceStartTime; + + @Schema(description = "尾款支付结束时间") + private Date balanceEndTime; + + @Schema(description = "预售发货类型 -1.固定时间 x.尾款支付后x天发货") + private Integer preSaleDeliveryType; + + @Schema(description = "预售发货时间") + private Date preSaleDeliveryTime; + + @Schema(description = "是否为主商品(套餐)1 是 -1 搭配商品") + private Integer isMainProd; + + @Schema(description = "sku 套餐价格") + private Long matchingPrice; + + @Schema(description = "套餐优惠金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long comboAmount; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer mold; + + @Schema(description = "是否可以退款 1.可以 0不可以") + private Integer isRefund; + + @Schema(description = "虚拟商品的留言备注") + private String virtualRemark; + + @Schema(description = "虚拟商品留言备注") + private List virtualRemarkList; + + @Schema(description = "是否在配送范围内)否") + private Boolean isDelivery; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销有效期 -1.长期有效 0.自定义 x.x天内有效") + private Integer writeOffTime; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "供应商商品图片") + private String supplierUrl; + + @Schema(description = "组合商品信息") + private List comboShopCartItems; + + @Schema(description = "主sku,组合商品独有") + private Long mainComboSkuId; + + @Schema(description = "主spu,组合商品独有") + private Long mainComboSpuId; + + @Schema(description = "主spu名称,组合商品独有") + private Long mainComboSpuNmae; + + @Schema(description = "主sku名称,组合商品独有") + private Long mainComboSkuName; + + @Schema(description = "库存关联列表") + private List stockPointList; + + @Schema(description = "仓库列表") + private List warehouseList; + + @Schema(description = "赠品列表") + private List giveawayShopCartItemList; + + + public Long getMainComboSkuName() { + return mainComboSkuName; + } + + public void setMainComboSkuName(Long mainComboSkuName) { + this.mainComboSkuName = mainComboSkuName; + } + + public Long getMainComboSpuNmae() { + return mainComboSpuNmae; + } + + public void setMainComboSpuNmae(Long mainComboSpuNmae) { + this.mainComboSpuNmae = mainComboSpuNmae; + } + + public Long getMainComboSpuId() { + return mainComboSpuId; + } + + public void setMainComboSpuId(Long mainComboSpuId) { + this.mainComboSpuId = mainComboSpuId; + } + + public Long getMainComboSkuId() { + return mainComboSkuId; + } + + public void setMainComboSkuId(Long mainComboSkuId) { + this.mainComboSkuId = mainComboSkuId; + } + + public List getComboShopCartItems() { + return comboShopCartItems; + } + + public void setComboShopCartItems(List combSpus) { + this.comboShopCartItems = combSpus; + } + + public Long getDeliveryAmount() { + return deliveryAmount; + } + + public void setDeliveryAmount(Long deliveryAmount) { + this.deliveryAmount = deliveryAmount; + } + + public Long getSupplierDeliveryAmount() { + return supplierDeliveryAmount; + } + + public void setSupplierDeliveryAmount(Long supplierDeliveryAmount) { + this.supplierDeliveryAmount = supplierDeliveryAmount; + } + + public String getSupplierUrl() { + return supplierUrl; + } + + public void setSupplierUrl(String supplierUrl) { + this.supplierUrl = supplierUrl; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Boolean getDelivery() { + return isDelivery; + } + + public void setDelivery(Boolean delivery) { + isDelivery = delivery; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Integer getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Integer writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Long getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Long matchingPrice) { + this.matchingPrice = matchingPrice; + } + + public Integer getMold() { + return mold; + } + + public void setMold(Integer mold) { + this.mold = mold; + } + + public Long getComboAmount() { + return comboAmount; + } + + public void setComboAmount(Long comboAmount) { + this.comboAmount = comboAmount; + } + + + public Integer getIsMainProd() { + return isMainProd; + } + + public void setIsMainProd(Integer isMainProd) { + this.isMainProd = isMainProd; + } + + public Boolean getIsDelivery() { + return isDelivery; + } + + public void setIsDelivery(Boolean delivery) { + isDelivery = delivery; + } + + public List getVirtualRemarkList() { + return virtualRemarkList; + } + + public void setVirtualRemarkList(List virtualRemarkList) { + this.virtualRemarkList = virtualRemarkList; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public Long getActualDepositAmount() { + return actualDepositAmount; + } + + public void setActualDepositAmount(Long actualDepositAmount) { + this.actualDepositAmount = actualDepositAmount; + } + + public Long getActualBalanceAmount() { + return actualBalanceAmount; + } + + public void setActualBalanceAmount(Long actualBalanceAmount) { + this.actualBalanceAmount = actualBalanceAmount; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public Long getParentCartItemId() { + return parentCartItemId; + } + + public void setParentCartItemId(Long parentCartItemId) { + this.parentCartItemId = parentCartItemId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + private List discounts; + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getDepositExpansionAmount() { + return depositExpansionAmount; + } + + public void setDepositExpansionAmount(Long depositExpansionAmount) { + this.depositExpansionAmount = depositExpansionAmount; + } + + public Long getDepositReduceAmount() { + return depositReduceAmount; + } + + public void setDepositReduceAmount(Long depositReduceAmount) { + this.depositReduceAmount = depositReduceAmount; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public GiveawayVO getGiveaway() { + return giveaway; + } + + public void setGiveaway(GiveawayVO giveaway) { + this.giveaway = giveaway; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + public Double getSupplierRate() { + return supplierRate; + } + + public void setSupplierRate(Double supplierRate) { + this.supplierRate = supplierRate; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getSupplierPriceFee() { + return supplierPriceFee; + } + + public void setSupplierPriceFee(Long supplierPriceFee) { + this.supplierPriceFee = supplierPriceFee; + } + + public Long getTotalPurchaseAmount() { + return totalPurchaseAmount; + } + + public void setTotalPurchaseAmount(Long totalPurchaseAmount) { + this.totalPurchaseAmount = totalPurchaseAmount; + } + + public Long getSupplierDeliveryTemplateId() { + return supplierDeliveryTemplateId; + } + + public void setSupplierDeliveryTemplateId(Long supplierDeliveryTemplateId) { + this.supplierDeliveryTemplateId = supplierDeliveryTemplateId; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Integer getSkuChoiceStatus() { + return skuChoiceStatus; + } + + public void setSkuChoiceStatus(Integer skuChoiceStatus) { + this.skuChoiceStatus = skuChoiceStatus; + } + + public Long getShareReduce() { + return shareReduce; + } + + public void setShareReduce(Long shareReduce) { + this.shareReduce = shareReduce; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public String getIsCollection() { + return isCollection; + } + + public void setIsCollection(String isCollection) { + this.isCollection = isCollection; + } + + public Long getCartItemId() { + return cartItemId; + } + + public void setCartItemId(Long cartItemId) { + this.cartItemId = cartItemId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + +// public Long getPriceFee() { +// return priceFee; +// } +// +// public void setPriceFee(Long priceFee) { +// this.priceFee = priceFee; +// } + + public Long getSkuPriceFee() { + return skuPriceFee; + } + + public void setSkuPriceFee(Long skuPriceFee) { + this.skuPriceFee = skuPriceFee; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getScorePrice() { + return scorePrice; + } + + public void setScorePrice(Long scorePrice) { + this.scorePrice = scorePrice; + } + + public List getSkuLangList() { + return skuLangList; + } + + public void setSkuLangList(List skuLangList) { + this.skuLangList = skuLangList; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public List getSupplierSkuLangList() { + return supplierSkuLangList; + } + + public void setSupplierSkuLangList(List supplierSkuLangList) { + this.supplierSkuLangList = supplierSkuLangList; + } + + public List getSupplierSpuLangList() { + return supplierSpuLangList; + } + + public void setSupplierSpuLangList(List supplierSpuLangList) { + this.supplierSpuLangList = supplierSpuLangList; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public Long getTotalPriceFee() { + return totalPriceFee; + } + + public void setTotalPriceFee(Long totalPriceFee) { + this.totalPriceFee = totalPriceFee; + } + + public Long getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(Long totalPrice) { + this.totalPrice = totalPrice; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getLevelReduce() { + return levelReduce; + } + + public void setLevelReduce(Long levelReduce) { + this.levelReduce = levelReduce; + } + + public Long getScoreReduce() { + return scoreReduce; + } + + public void setScoreReduce(Long scoreReduce) { + this.scoreReduce = scoreReduce; + } + + public DeliveryModeBO getDeliveryModeBO() { + return deliveryModeBO; + } + + public void setDeliveryModeBO(DeliveryModeBO deliveryModeBO) { + this.deliveryModeBO = deliveryModeBO; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public List getDiscounts() { + return discounts; + } + + public void setDiscounts(List discounts) { + this.discounts = discounts; + } + + public Integer getIsChecked() { + return isChecked; + } + + public void setIsChecked(Integer isChecked) { + this.isChecked = isChecked; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + public BigDecimal getWeight() { + return weight; + } + + public void setWeight(BigDecimal weight) { + this.weight = weight; + } + + public BigDecimal getVolume() { + return volume; + } + + public void setVolume(BigDecimal volume) { + this.volume = volume; + } + + public Integer getIsShareReduce() { + return isShareReduce; + } + + public void setIsShareReduce(Integer isShareReduce) { + this.isShareReduce = isShareReduce; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public List getStockPointList() { + return stockPointList; + } + + public void setStockPointList(List stockPointList) { + this.stockPointList = stockPointList; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Long getGiveawayRefundPrice() { + return giveawayRefundPrice; + } + + public void setGiveawayRefundPrice(Long giveawayRefundPrice) { + this.giveawayRefundPrice = giveawayRefundPrice; + } + + public List getGiveawayShopCartItemList() { + return giveawayShopCartItemList; + } + + public void setGiveawayShopCartItemList(List giveawayShopCartItemList) { + this.giveawayShopCartItemList = giveawayShopCartItemList; + } + + public List getWarehouseList() { + return warehouseList; + } + + public void setWarehouseList(List warehouseList) { + this.warehouseList = warehouseList; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "ShopCartItemVO{" + + "createTime=" + createTime + + ", cartItemId=" + cartItemId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + ", supplierSpuId=" + supplierSpuId + + ", supplierSkuId=" + supplierSkuId + + ", categoryId=" + categoryId + + ", userId=" + userId + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", count=" + count + + ", discountId=" + discountId + + ", isChecked=" + isChecked + +// ", priceFee=" + priceFee + + ", skuPriceFee=" + skuPriceFee + + ", totalPriceFee=" + totalPriceFee + + ", totalPrice=" + totalPrice + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryModeBO=" + deliveryModeBO + + ", deliveryTemplateId=" + deliveryTemplateId + + ", deliveryAmount=" + deliveryAmount + + ", supplierDeliveryTemplateId=" + supplierDeliveryTemplateId + + ", supplierDeliveryAmount=" + supplierDeliveryAmount + + ", weight=" + weight + + ", volume=" + volume + + ", imgUrl='" + imgUrl + '\'' + + ", isCollection='" + isCollection + '\'' + + ", scoreFee=" + scoreFee + + ", scorePrice=" + scorePrice + + ", totalAmount=" + totalAmount + + ", totalPurchaseAmount=" + totalPurchaseAmount + + ", supplierPriceFee=" + supplierPriceFee + + ", actualTotal=" + actualTotal + + ", skuLangList=" + skuLangList + + ", spuLangList=" + spuLangList + + ", supplierSkuLangList=" + supplierSkuLangList + + ", supplierSpuLangList=" + supplierSpuLangList + + ", distributionUserId=" + distributionUserId + + ", orderItemId=" + orderItemId + + ", shareReduce=" + shareReduce + + ", platformShareReduce=" + platformShareReduce + + ", isShareReduce=" + isShareReduce + + ", levelReduce=" + levelReduce + + ", scoreReduce=" + scoreReduce + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", rate=" + rate + + ", supplierRate=" + supplierRate + + ", platformCommission=" + platformCommission + + ", purchasePlatformCommission=" + purchasePlatformCommission + + ", supplierSpuType=" + supplierSpuType + + ", spuType=" + spuType + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierId=" + supplierId + + ", measureUnit='" + measureUnit + '\'' + + ", skuChoiceStatus=" + skuChoiceStatus + + ", giveaway=" + giveaway + + ", giveawayRefundPrice=" + giveawayRefundPrice + + ", comboId=" + comboId + + ", comboCount=" + comboCount + + ", parentCartItemId=" + parentCartItemId + + ", preSaleType=" + preSaleType + + ", depositAmount=" + depositAmount + + ", actualDepositAmount=" + actualDepositAmount + + ", depositExpansionAmount=" + depositExpansionAmount + + ", depositReduceAmount=" + depositReduceAmount + + ", balanceAmount=" + balanceAmount + + ", actualBalanceAmount=" + actualBalanceAmount + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", isMainProd=" + isMainProd + + ", matchingPrice=" + matchingPrice + + ", comboAmount=" + comboAmount + + ", mold=" + mold + + ", isRefund=" + isRefund + + ", virtualRemark='" + virtualRemark + '\'' + + ", virtualRemarkList=" + virtualRemarkList + + ", isDelivery=" + isDelivery + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffTime=" + writeOffTime + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", shopName='" + shopName + '\'' + + ", supplierUrl='" + supplierUrl + '\'' + + ", stockPointList=" + stockPointList + + ", comboShopCartItems=" + comboShopCartItems + + ", mainComboSkuId=" + mainComboSkuId + + ", mainComboSpuId=" + mainComboSpuId + + ", mainComboSpuNmae=" + mainComboSpuNmae + + ", mainComboSkuName=" + mainComboSkuName + + ", warehouseList=" + warehouseList + + ", giveawayShopCartItemList=" + giveawayShopCartItemList + + ", discounts=" + discounts + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartOrderMergerVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartOrderMergerVO.java new file mode 100644 index 0000000..c5ee1d9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartOrderMergerVO.java @@ -0,0 +1,558 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderInvoiceDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 多个店铺订单合并在一起的合并类 + * "/confirm" 使用 + * + * @author FrozenWatermelon + */ +public class ShopCartOrderMergerVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户地址") + private UserAddrVO userAddr; + + @Schema(description = "自提信息Dto") + private OrderSelfStationVO orderSelfStation; + + @Schema(description = "实际总值", requiredMode = Schema.RequiredMode.REQUIRED) + private Long actualTotal; + + @Schema(description = "商品总值", requiredMode = Schema.RequiredMode.REQUIRED) + private Long total; + + @Schema(description = "商品总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer totalCount; + + @Schema(description = "订单优惠金额(所有店铺优惠金额和使用积分抵现相加)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderReduce; + + @Schema(description = "订单店铺优惠金额(所有店铺优惠金额)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderShopReduce; + + @Schema(description = "用户拥有的积分数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userHasScore; + + @Schema(description = "用户使用积分数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long usableScore; + + @Schema(description = "整个订单可以使用的积分数", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalUsableScore; + + @Schema(description = "整个订单最多可以使用的积分数", requiredMode = Schema.RequiredMode.REQUIRED) + private Long maxUsableScore; + + @Schema(description = "积分抵扣金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalScoreAmount; + + @Schema(description = "购物积分抵现比例(x积分抵扣1元)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shoppingUseScoreRatio; + + @Schema(description = "等级折扣金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalLevelAmount; + + @Schema(description = "免运费金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freeTransfee; + + @Schema(description = "总运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalTransfee; + + @Schema(description = "用户是否选择积分抵现(0不使用 1使用 默认不使用)") + private Integer isScorePay; + + @Schema(description = "多店铺的商品配送方式") + private List dvyTypes; + + @Schema(description = "用户选择的自提id") + private Long stationId; + + @Schema(description = "同城配送可用状态 : 1 可用 -1 不在范围内 -2 商家没有配置同城配送信息 -3 起送费不够", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer shopCityStatus; + + @Schema(description = "过滤掉的商品项", requiredMode = Schema.RequiredMode.REQUIRED) + private List filterShopItems; + + @Schema(description = "每个店铺的订单信息", requiredMode = Schema.RequiredMode.REQUIRED) + private List shopCartOrders; + + @Schema(description = "平台订单可以使用的优惠券列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List coupons; + + @Schema(description = "秒杀skuId") + private Long seckillSkuId; + + @Schema(description = "订单发票") + private List orderInvoiceList; + + @Schema(description = "订单类型") + private OrderType orderType; + + @Schema(description = "预售类型 -1.未开启预售 0.全款预售类型 1.定金预售") + private Integer preSaleType; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer mold; + + @Schema(description = "尾款金额") + private Long balanceAmount; + + @Schema(description = "实际尾款金额") + private Long actualBalanceAmount; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "虚拟商品留言备注") + private List virtualRemarkList; + + @Schema(description = "定金金额") + private Long totalDepositAmount; + + @Schema(description = "定金优惠金额") + private Long totalDepositReduceAmount; + @Schema(description = "所有店铺使用的优惠券列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List shopCoupons; + + private Map> supplierIdWithShopTransFeeMap; + private Map preSaleTransFeeMap; + + /** + * 活动id + */ + private Long activityId; + + /** + * 活动类型 枚举类:OrderActivityType + */ + private Integer activityType; + + /** + * 订单状态,秒杀订单独有 + */ + private Integer status; + /** + * 订单创建时间,秒杀订单独有 + */ + private Date createTime; + /** + * 需要设置主单号的ids + */ + private Set needMainOrderIds; + + public Set getNeedMainOrderIds() { + return needMainOrderIds; + } + + public void setNeedMainOrderIds(Set needMainOrderIds) { + this.needMainOrderIds = needMainOrderIds; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public UserAddrVO getUserAddr() { + return userAddr; + } + + public void setUserAddr(UserAddrVO userAddr) { + this.userAddr = userAddr; + } + + public OrderSelfStationVO getOrderSelfStation() { + return orderSelfStation; + } + + public void setOrderSelfStation(OrderSelfStationVO orderSelfStation) { + this.orderSelfStation = orderSelfStation; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getOrderReduce() { + return orderReduce; + } + + public void setOrderReduce(Long orderReduce) { + this.orderReduce = orderReduce; + } + + public Long getOrderShopReduce() { + return orderShopReduce; + } + + public void setOrderShopReduce(Long orderShopReduce) { + this.orderShopReduce = orderShopReduce; + } + + public Long getUserHasScore() { + return userHasScore; + } + + public void setUserHasScore(Long userHasScore) { + this.userHasScore = userHasScore; + } + + public Long getUsableScore() { + return usableScore; + } + + public void setUsableScore(Long usableScore) { + this.usableScore = usableScore; + } + + public Long getTotalUsableScore() { + return totalUsableScore; + } + + public void setTotalUsableScore(Long totalUsableScore) { + this.totalUsableScore = totalUsableScore; + } + + public Long getMaxUsableScore() { + return maxUsableScore; + } + + public void setMaxUsableScore(Long maxUsableScore) { + this.maxUsableScore = maxUsableScore; + } + + public Long getTotalScoreAmount() { + return totalScoreAmount; + } + + public void setTotalScoreAmount(Long totalScoreAmount) { + this.totalScoreAmount = totalScoreAmount; + } + + public Long getShoppingUseScoreRatio() { + return shoppingUseScoreRatio; + } + + public void setShoppingUseScoreRatio(Long shoppingUseScoreRatio) { + this.shoppingUseScoreRatio = shoppingUseScoreRatio; + } + + public Long getTotalLevelAmount() { + return totalLevelAmount; + } + + public void setTotalLevelAmount(Long totalLevelAmount) { + this.totalLevelAmount = totalLevelAmount; + } + + public Long getFreeTransfee() { + return freeTransfee; + } + + public void setFreeTransfee(Long freeTransfee) { + this.freeTransfee = freeTransfee; + } + + public Long getTotalTransfee() { + return totalTransfee; + } + + public void setTotalTransfee(Long totalTransfee) { + this.totalTransfee = totalTransfee; + } + + public Integer getIsScorePay() { + return isScorePay; + } + + public void setIsScorePay(Integer isScorePay) { + this.isScorePay = isScorePay; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Integer getShopCityStatus() { + return shopCityStatus; + } + + public void setShopCityStatus(Integer shopCityStatus) { + this.shopCityStatus = shopCityStatus; + } + + public List getFilterShopItems() { + return filterShopItems; + } + + public void setFilterShopItems(List filterShopItems) { + this.filterShopItems = filterShopItems; + } + + public List getShopCartOrders() { + return shopCartOrders; + } + + public void setShopCartOrders(List shopCartOrders) { + this.shopCartOrders = shopCartOrders; + } + + public List getCoupons() { + return coupons; + } + + public void setCoupons(List coupons) { + this.coupons = coupons; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public List getOrderInvoiceList() { + return orderInvoiceList; + } + + public void setOrderInvoiceList(List orderInvoiceList) { + this.orderInvoiceList = orderInvoiceList; + } + + public OrderType getOrderType() { + return orderType; + } + + public void setOrderType(OrderType orderType) { + this.orderType = orderType; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getMold() { + return mold; + } + + public void setMold(Integer mold) { + this.mold = mold; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getActualBalanceAmount() { + return actualBalanceAmount; + } + + public void setActualBalanceAmount(Long actualBalanceAmount) { + this.actualBalanceAmount = actualBalanceAmount; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public List getVirtualRemarkList() { + return virtualRemarkList; + } + + public void setVirtualRemarkList(List virtualRemarkList) { + this.virtualRemarkList = virtualRemarkList; + } + + public Long getTotalDepositAmount() { + return totalDepositAmount; + } + + public void setTotalDepositAmount(Long totalDepositAmount) { + this.totalDepositAmount = totalDepositAmount; + } + + public Long getTotalDepositReduceAmount() { + return totalDepositReduceAmount; + } + + public void setTotalDepositReduceAmount(Long totalDepositReduceAmount) { + this.totalDepositReduceAmount = totalDepositReduceAmount; + } + + public List getShopCoupons() { + return shopCoupons; + } + + public void setShopCoupons(List shopCoupons) { + this.shopCoupons = shopCoupons; + } + + public Map> getSupplierIdWithShopTransFeeMap() { + return supplierIdWithShopTransFeeMap; + } + + public void setSupplierIdWithShopTransFeeMap(Map> supplierIdWithShopTransFeeMap) { + this.supplierIdWithShopTransFeeMap = supplierIdWithShopTransFeeMap; + } + + public Map getPreSaleTransFeeMap() { + return preSaleTransFeeMap; + } + + public void setPreSaleTransFeeMap(Map preSaleTransFeeMap) { + this.preSaleTransFeeMap = preSaleTransFeeMap; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + + public List getDvyTypes() { + return dvyTypes; + } + + public void setDvyTypes(List dvyTypes) { + this.dvyTypes = dvyTypes; + } + + @Override + public String toString() { + return "ShopCartOrderMergerVO{" + + "userId=" + userId + + ", userAddr=" + userAddr + + ", orderSelfStation=" + orderSelfStation + + ", actualTotal=" + actualTotal + + ", total=" + total + + ", totalCount=" + totalCount + + ", orderReduce=" + orderReduce + + ", orderShopReduce=" + orderShopReduce + + ", userHasScore=" + userHasScore + + ", usableScore=" + usableScore + + ", totalUsableScore=" + totalUsableScore + + ", maxUsableScore=" + maxUsableScore + + ", totalScoreAmount=" + totalScoreAmount + + ", shoppingUseScoreRatio=" + shoppingUseScoreRatio + + ", totalLevelAmount=" + totalLevelAmount + + ", freeTransfee=" + freeTransfee + + ", totalTransfee=" + totalTransfee + + ", isScorePay=" + isScorePay + + ", dvyTypes=" + dvyTypes + + ", stationId=" + stationId + + ", shopCityStatus=" + shopCityStatus + + ", filterShopItems=" + filterShopItems + + ", shopCartOrders=" + shopCartOrders + + ", coupons=" + coupons + + ", seckillSkuId=" + seckillSkuId + + ", orderInvoiceList=" + orderInvoiceList + + ", orderType=" + orderType + + ", preSaleType=" + preSaleType + + ", mold=" + mold + + ", balanceAmount=" + balanceAmount + + ", actualBalanceAmount=" + actualBalanceAmount + + ", spuMold=" + spuMold + + ", virtualRemarkList=" + virtualRemarkList + + ", totalDepositAmount=" + totalDepositAmount + + ", totalDepositReduceAmount=" + totalDepositReduceAmount + + ", shopCoupons=" + shopCoupons + + ", supplierIdWithShopTransFeeMap=" + supplierIdWithShopTransFeeMap + + ", preSaleTransFeeMap=" + preSaleTransFeeMap + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", status=" + status + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartWithAmountVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartWithAmountVO.java new file mode 100644 index 0000000..752c172 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopCartWithAmountVO.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/14 + */ +public class ShopCartWithAmountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "总额") + private Long totalMoney; + + @Schema(description = "总计") + private Long finalMoney; + + @Schema(description = "减额") + private Long subtractMoney; + + @Schema(description = "商品数量") + private Integer count; + + @Schema(description = "运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freightAmount; + + @Schema(description = "等级免运费金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freeTransfee; + + @Schema(description = "多个店铺的购物车信息") + private List shopCarts; + + @Schema(description = "运费信息") + private UserDeliveryInfoVO userDeliveryInfo; + + public UserDeliveryInfoVO getUserDeliveryInfo() { + return userDeliveryInfo; + } + + public void setUserDeliveryInfo(UserDeliveryInfoVO userDeliveryInfo) { + this.userDeliveryInfo = userDeliveryInfo; + } + + public Long getFreeTransfee() { + return freeTransfee; + } + + public void setFreeTransfee(Long freeTransfee) { + this.freeTransfee = freeTransfee; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getTotalMoney() { + return totalMoney; + } + + public void setTotalMoney(Long totalMoney) { + this.totalMoney = totalMoney; + } + + public Long getFinalMoney() { + return finalMoney; + } + + public void setFinalMoney(Long finalMoney) { + this.finalMoney = finalMoney; + } + + public Long getSubtractMoney() { + return subtractMoney; + } + + public void setSubtractMoney(Long subtractMoney) { + this.subtractMoney = subtractMoney; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public List getShopCarts() { + return shopCarts; + } + + public void setShopCarts(List shopCarts) { + this.shopCarts = shopCarts; + } + + @Override + public String toString() { + return "ShopCartWithAmountVO{" + + "totalMoney=" + totalMoney + + ", finalMoney=" + finalMoney + + ", subtractMoney=" + subtractMoney + + ", count=" + count + + ", freightAmount=" + freightAmount + + ", freeTransfee=" + freeTransfee + + ", shopCarts=" + shopCarts + + ", userDeliveryInfo=" + userDeliveryInfo + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopInfoInOrderVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopInfoInOrderVO.java new file mode 100644 index 0000000..8b2ebdb --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopInfoInOrderVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2021/5/10 + */ +public class ShopInfoInOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺类型1自营店 2普通店") + private Integer type; + + @Schema(description = "店铺名称") + private String shopName; + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + @Override + public String toString() { + return "ShopInfoInOrderVO{" + + "type=" + type + + ", shopName='" + shopName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopTransFeeVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopTransFeeVO.java new file mode 100644 index 0000000..0038201 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/ShopTransFeeVO.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 店铺运费信息 + * + * @author FrozenWatermelon + * @date 2020/12/16 + */ +public class ShopTransFeeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "免运费金额", requiredMode = Schema.RequiredMode.REQUIRED) + private Long freeTransfee; + + @Schema(description = "运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long transfee; + + @Schema(description = "运费模板id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long deliveryTemplateId; + + @Schema(description = "供应商id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long supplierId; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getFreeTransfee() { + return freeTransfee; + } + + public void setFreeTransfee(Long freeTransfee) { + this.freeTransfee = freeTransfee; + } + + public Long getTransfee() { + return transfee; + } + + public void setTransfee(Long transfee) { + this.transfee = transfee; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + @Override + public String toString() { + return "ShopTransFeeVO{" + + "freeTransfee=" + freeTransfee + + ", transfee=" + transfee + + ", deliveryTemplateId=" + deliveryTemplateId + + ", supplierId=" + supplierId + + '}'; + } + + /** + * 店铺运费模板运费 (订单中使用同一个运费模板商品所需的运费) + */ + public static class DeliveryTemplateTransFee implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 免运费金额 + */ + private Long freeTransfee; + + /** + * 运费 + */ + private Long transfee; + + public Long getFreeTransfee() { + return freeTransfee; + } + + public void setFreeTransfee(Long freeTransfee) { + this.freeTransfee = freeTransfee; + } + + public Long getTransfee() { + return transfee; + } + + public void setTransfee(Long transfee) { + this.transfee = transfee; + } + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransportVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransportVO.java new file mode 100644 index 0000000..ba21af2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/TransportVO.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 运费模板VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TransportVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "运费模板id") + private Long transportId; + + @Schema(description = "运费模板名称") + private String transName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "收费方式(0 按件数,1 按重量 2 按体积)") + private Integer chargeType; + + @Schema(description = "是否包邮 0:不包邮 1:包邮") + private Integer isFreeFee; + + @Schema(description = "是否含有包邮条件 0 否 1是") + private Integer hasFreeCondition; + + @Schema(description = "指定条件包邮项") + private List transFeeFrees; + + @Schema(description = "运费项") + private List transFees; + + public List getTransFeeFrees() { + return transFeeFrees; + } + + public void setTransFeeFrees(List transFeeFrees) { + this.transFeeFrees = transFeeFrees; + } + + public List getTransFees() { + return transFees; + } + + public void setTransFees(List transFees) { + this.transFees = transFees; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public String getTransName() { + return transName; + } + + public void setTransName(String transName) { + this.transName = transName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getChargeType() { + return chargeType; + } + + public void setChargeType(Integer chargeType) { + this.chargeType = chargeType; + } + + public Integer getIsFreeFee() { + return isFreeFee; + } + + public void setIsFreeFee(Integer isFreeFee) { + this.isFreeFee = isFreeFee; + } + + public Integer getHasFreeCondition() { + return hasFreeCondition; + } + + public void setHasFreeCondition(Integer hasFreeCondition) { + this.hasFreeCondition = hasFreeCondition; + } + + @Override + public String toString() { + return "TransportVO{" + + "transportId=" + transportId + + ", transName='" + transName + '\'' + + ", shopId=" + shopId + + ", chargeType=" + chargeType + + ", isFreeFee=" + isFreeFee + + ", hasFreeCondition=" + hasFreeCondition + + ", transFeeFrees=" + transFeeFrees + + ", transFees=" + transFees + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserAddrVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserAddrVO.java new file mode 100644 index 0000000..eb54282 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserAddrVO.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户地址VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +public class UserAddrVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long addrId; + + @Schema(description = "手机") + private String mobile; + + @Schema(description = "手机") + private Long userId; + + @Schema(description = "是否默认地址 1是") + private Integer isDefault; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getAddrId() { + return addrId; + } + + public void setAddrId(Long addrId) { + this.addrId = addrId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "UserAddrVO{" + + "addrId=" + addrId + + ", mobile='" + mobile + '\'' + + ", userId=" + userId + + ", isDefault=" + isDefault + + ", consignee='" + consignee + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", postCode='" + postCode + '\'' + + ", addr='" + addr + '\'' + + ", lng=" + lng + + ", lat=" + lat + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserConsigneeVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserConsigneeVO.java new file mode 100644 index 0000000..304c9af --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserConsigneeVO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户提货人信息VO + * + * @author FrozenWatermelon + * @date 2020-12-15 17:18:56 + */ +public class UserConsigneeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提货人姓名") + private String name; + + @Schema(description = "提货人联系方式") + private String mobile; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "UserConsigneeVO{" + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",name=" + name + + ",mobile=" + mobile + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserDeliveryInfoVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserDeliveryInfoVO.java new file mode 100644 index 0000000..f57df8f --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/UserDeliveryInfoVO.java @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author FrozenWatermelon + * @date 2020/12/15 + */ +public class UserDeliveryInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "地址ID,0为默认地址") + private Long addrId; + + @Schema(description = "多店铺的商品配送方式") + private List dvyTypes; + @Schema(description = "用户选择的自提点id") + private Long stationId; + + @Schema(description = "提货人信息") + private UserConsigneeVO userConsignee; + + @Schema(description = "用户地址信息") + private UserAddrVO userAddr; + + @Schema(description = "免运费金额") + private Long totalFreeTransfee; + + @Schema(description = "总运费", requiredMode = Schema.RequiredMode.REQUIRED) + private Long totalTransfee; + + @Schema(description = "同城配送可用状态 : 1 可用 -1 不在范围内 -2 商家没有配置同城配送信息 -3 起送费不够", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer shopCityStatus; + + private Map shopIdWithShopTransFee; + + /** + * 每个店铺的供应商运费都是独立的,跟其他店铺间不能共用 + * 格式:Map<店铺id,Map<供应商id,运费>> + */ + private Map> supplierIdWithShopTransFeeMap; + private Map preSaleTransFeeMap; + + @Schema(description = "常用自提点信息") + private OrderSelfStationVO orderSelfStation; + + + @Schema(description = "同城配送可用状态 : 1 可用 -1 不在范围内 -2 商家没有配置同城配送信息 -3 起送费不够", requiredMode = Schema.RequiredMode.REQUIRED) + private List shopCityStatusVOS; + + + @Schema(description = "多店铺的同城配送起送费") + private Map shopStartDeliveryFees; + + /** + * 商品运费模板 + * 校验配送范围时存储的商品模板,用于计算商品运费(减少查询次数) + */ + private Map transportMap; + + /** + * 订单中的所有物流模板id列表 + */ + private List deliveryTemplateIds; + + public Map getShopStartDeliveryFees() { + return shopStartDeliveryFees; + } + + public void setShopStartDeliveryFees(Map shopStartDeliveryFees) { + this.shopStartDeliveryFees = shopStartDeliveryFees; + } + + public List getShopCityStatusVOS() { + return shopCityStatusVOS; + } + + public void setShopCityStatusVOS(List shopCityStatusVOS) { + this.shopCityStatusVOS = shopCityStatusVOS; + } + + public OrderSelfStationVO getOrderSelfStation() { + return orderSelfStation; + } + + public void setOrderSelfStation(OrderSelfStationVO orderSelfStation) { + this.orderSelfStation = orderSelfStation; + } + + public Map getPreSaleTransFeeMap() { + return preSaleTransFeeMap; + } + + public void setPreSaleTransFeeMap(Map preSaleTransFeeMap) { + this.preSaleTransFeeMap = preSaleTransFeeMap; + } + + public UserConsigneeVO getUserConsignee() { + return userConsignee; + } + + public void setUserConsignee(UserConsigneeVO userConsignee) { + this.userConsignee = userConsignee; + } + + public UserAddrVO getUserAddr() { + return userAddr; + } + + public void setUserAddr(UserAddrVO userAddr) { + this.userAddr = userAddr; + } + + public Long getTotalTransfee() { + return totalTransfee; + } + + public void setTotalTransfee(Long totalTransfee) { + this.totalTransfee = totalTransfee; + } + + public Integer getShopCityStatus() { + return shopCityStatus; + } + + public void setShopCityStatus(Integer shopCityStatus) { + this.shopCityStatus = shopCityStatus; + } + + public Long getTotalFreeTransfee() { + return totalFreeTransfee; + } + + public void setTotalFreeTransfee(Long totalFreeTransfee) { + this.totalFreeTransfee = totalFreeTransfee; + } + + public Map getShopIdWithShopTransFee() { + return shopIdWithShopTransFee; + } + + public void setShopIdWithShopTransFee(Map shopIdWithShopTransFee) { + this.shopIdWithShopTransFee = shopIdWithShopTransFee; + } + + public Map> getSupplierIdWithShopTransFeeMap() { + return supplierIdWithShopTransFeeMap; + } + + public void setSupplierIdWithShopTransFeeMap(Map> supplierIdWithShopTransFeeMap) { + this.supplierIdWithShopTransFeeMap = supplierIdWithShopTransFeeMap; + } + + public Long getAddrId() { + return addrId; + } + + public void setAddrId(Long addrId) { + this.addrId = addrId; + } + + public List getDvyTypes() { + return dvyTypes; + } + + public void setDvyTypes(List dvyTypes) { + this.dvyTypes = dvyTypes; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Map getTransportMap() { + return transportMap; + } + + public void setTransportMap(Map transportMap) { + this.transportMap = transportMap; + } + + public List getDeliveryTemplateIds() { + return deliveryTemplateIds; + } + + public void setDeliveryTemplateIds(List deliveryTemplateIds) { + this.deliveryTemplateIds = deliveryTemplateIds; + } + + + @Override + public String toString() { + return "UserDeliveryInfoVO{" + + "addrId=" + addrId + + ", dvyTypes=" + dvyTypes + + ", stationId=" + stationId + + ", userConsignee=" + userConsignee + + ", userAddr=" + userAddr + + ", totalFreeTransfee=" + totalFreeTransfee + + ", totalTransfee=" + totalTransfee + + ", shopCityStatus=" + shopCityStatus + + ", shopIdWithShopTransFee=" + shopIdWithShopTransFee + + ", supplierIdWithShopTransFeeMap=" + supplierIdWithShopTransFeeMap + + ", preSaleTransFeeMap=" + preSaleTransFeeMap + + ", orderSelfStation=" + orderSelfStation + + ", shopCityStatusVOS=" + shopCityStatusVOS + + ", shopStartDeliveryFees=" + shopStartDeliveryFees + + ", transportMap=" + transportMap + + ", deliveryTemplateIds=" + deliveryTemplateIds + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/WarehouseVO.java b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/WarehouseVO.java new file mode 100644 index 0000000..2bf07a3 --- /dev/null +++ b/tmerclub-common/tmerclub-common-order/src/main/java/com/tmerclub/cloud/common/order/vo/WarehouseVO.java @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.order.vo; + +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public class WarehouseVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "仓库名称") + private String warehouseName; + + @Schema(description = "仓库类型(0默认仓库,1区域仓库)") + private Integer type; + + @Schema(description = "仓库地址") + private String address; + + @Schema(description = "管理人") + private String manage; + + @Schema(description = "管理电话") + private String phone; + + /** + * 系统类型见SysTypeEnum 0.普通用户系统 1.商家端 2平台端 3供应商端 + */ + @Schema(description = "系统类型") + private Integer sysType; + + @Schema(description = "供应城市项") + private List cityList; + + @Schema(description = "供应地址id") + private List areaIds; + + @Schema(description = "库存") + private Integer stock; + + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public List getCityList() { + return cityList; + } + + public void setCityList(List cityList) { + this.cityList = cityList; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getManage() { + return manage; + } + + public void setManage(String manage) { + this.manage = manage; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public List getAreaIds() { + return areaIds; + } + + public void setAreaIds(List areaIds) { + this.areaIds = areaIds; + } + + @Override + public String toString() { + return "WarehouseVO{" + + "warehouseId=" + warehouseId + + ", shopId=" + shopId + + ", warehouseName='" + warehouseName + '\'' + + ", type=" + type + + ", address='" + address + '\'' + + ", manage='" + manage + '\'' + + ", phone='" + phone + '\'' + + ", sysType=" + sysType + + ", cityList=" + cityList + + ", areaIds=" + areaIds + + ", stock=" + stock + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/pom.xml b/tmerclub-common/tmerclub-common-product/pom.xml new file mode 100644 index 0000000..fcccfdc --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/pom.xml @@ -0,0 +1,24 @@ + + + + tmerclub-common + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-common-product + jar + mall4cloud 商品相关公共代码 + + + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsAttrLangBO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsAttrLangBO.java new file mode 100644 index 0000000..de76eb8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsAttrLangBO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public class EsAttrLangBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 规格id + */ + private Integer lang; + + /** + * 规格名 + */ + private String attrName; + + /** + * 规格值名称 + */ + private String attrValueName; + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + @Override + public String toString() { + return "EsAttrLangBO{" + + "lang=" + lang + + ", attrName='" + attrName + '\'' + + ", attrValueName='" + attrValueName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsDistributionInfoBO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsDistributionInfoBO.java new file mode 100644 index 0000000..c44ff63 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/bo/EsDistributionInfoBO.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @Author lth + * @Date 2021/8/10 14:07 + */ +public class EsDistributionInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分销商品表id + */ + private Long distributionSpuId; + + /** + * 状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核) + */ + private Integer state; + + /** + * 奖励方式(0 按比例 1 按固定数值) + */ + private Integer awardMode; + + /** + * 上级奖励设置(0 关闭 1开启) + */ + private Integer parentAwardSet; + + /** + * 奖励数额(奖励方式为0时,代表百分比*100,为1时代表实际奖励金额*100) + */ + private Long awardNumbers; + + /** + * 上级奖励数额(奖励方式为0时,表示百分比*100,为1时代表实际奖励金额*100) + */ + private Long parentAwardNumbers; + + public Long getDistributionSpuId() { + return distributionSpuId; + } + + public void setDistributionSpuId(Long distributionSpuId) { + this.distributionSpuId = distributionSpuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public Integer getParentAwardSet() { + return parentAwardSet; + } + + public void setParentAwardSet(Integer parentAwardSet) { + this.parentAwardSet = parentAwardSet; + } + + public Long getAwardNumbers() { + return awardNumbers; + } + + public void setAwardNumbers(Long awardNumbers) { + this.awardNumbers = awardNumbers; + } + + public Long getParentAwardNumbers() { + return parentAwardNumbers; + } + + public void setParentAwardNumbers(Long parentAwardNumbers) { + this.parentAwardNumbers = parentAwardNumbers; + } + + @Override + public String toString() { + return "EsDistributionInfoBO{" + + "distributionSpuId=" + distributionSpuId + + ", state=" + state + + ", awardMode=" + awardMode + + ", parentAwardSet=" + parentAwardSet + + ", awardNumbers=" + awardNumbers + + ", parentAwardNumbers=" + parentAwardNumbers + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/AttrType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/AttrType.java new file mode 100644 index 0000000..1c86e79 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/AttrType.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * 属性类型 + * + * @author yxf + * @date 2020/11/20 + */ +public enum AttrType { + + /** + * 销售属性 + */ + SALES(0), + + /** + * 基本属性 + */ + BASIC(1); + + private final Integer value; + + public Integer value() { + return value; + } + + AttrType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/BrandType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/BrandType.java new file mode 100644 index 0000000..0d6d9cf --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/BrandType.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @Author lth + * @Date 2021/4/26 9:58 + */ +public enum BrandType { + + /** + * 平台品牌 + */ + PLATFORM(0), + + /** + * 店铺自定义品牌 + */ + CUSTOMIZE(1); + + private final Integer value; + + public Integer value() { + return value; + } + + BrandType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/CommissionSpuStatus.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/CommissionSpuStatus.java new file mode 100644 index 0000000..253f877 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/CommissionSpuStatus.java @@ -0,0 +1,47 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/7/6 15:11 + * 代销商品状态 + */ +public enum CommissionSpuStatus { + + /** + * 上架 + */ + PUT_SHELF(1), + + /** + * 部分上架 + */ + PART_PUT_SHELF(2), + + /** + * 下架 + */ + OFF_SHELF(3), + + /** + * 部分下架 + */ + PART_OFF_SHELF(4); + + private final Integer value; + + CommissionSpuStatus(Integer value) { + this.value = value; + } + + public Integer value() { + return value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ContentKey.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ContentKey.java new file mode 100644 index 0000000..3bb9de6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ContentKey.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/7/13 16:05 + */ +public enum ContentKey { + /** + * 状态变更 + */ + STATUS_CHANGE("状态变更"), + + DESCRIBE_CHANGE("描述变更"), + + ELSE_CHANGE("其他变更"); + + private final String value; + + public String value() { + return value; + } + + ContentKey(String value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ShopCartSpuActivityType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ShopCartSpuActivityType.java new file mode 100644 index 0000000..6aa6600 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/ShopCartSpuActivityType.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * 购物车商品活动类型 + * @date 2022/8/25 11:37 + */ +public enum ShopCartSpuActivityType { + /** + * 无 + */ + NO(0), + + /** + * 满减 + */ + DISCOUNT(1), + + /** + * 套餐 + */ + COMBO(2); + + private final Integer value; + + public Integer value() { + return value; + } + + ShopCartSpuActivityType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SkuIsSell.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SkuIsSell.java new file mode 100644 index 0000000..1720545 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SkuIsSell.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + + +/** + * @author xxw + * @date 2022/7/5 13:52 + * 当前供应商品sku是否可卖 + */ +public enum SkuIsSell { + /** + * 不可售卖 + */ + NO_SELL(0), + + /** + * 可售卖 + */ + CAN_SELL(1); + + private final Integer value; + + SkuIsSell(Integer value) { + this.value = value; + } + + public Integer value() { + return value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuMold.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuMold.java new file mode 100644 index 0000000..8056060 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuMold.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2023/5/31 17:32 + */ +public enum SpuMold { + /** + * 实物商品 + */ + REAL(0), + + /** + * 虚拟商品 + */ + VIRTUAL(1), + /** + * 组合商品 + */ + COMBO(2); + private final Integer value; + + SpuMold(Integer value) { + this.value = value; + } + + public Integer value() { + return this.value; + } + + +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuStatus.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuStatus.java new file mode 100644 index 0000000..89c2636 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SpuStatus.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @Author lth + * @Date 2021/5/25 9:13 + */ +public enum SpuStatus { + + + /** + * 删除 + */ + DELETE(-1), + /** + * 下架 + */ + OFF_SHELF(0), + /** + * 上架 + */ + PUT_SHELF(1), + /** + * 平台下架 + */ + PLATFORM_OFF_SHELF(2), + /** + * 商品提交申请,等待平台审核 + */ + WAITAUDIT(3), + /** + * 发布|上架待审核 + */ + PUBLISH_WAIT_AUDIT(4); + + private final Integer num; + + public Integer value() { + return num; + } + + SpuStatus(Integer num) { + this.num = num; + } + + public static SpuStatus instance(Integer value) { + SpuStatus[] enums = values(); + for (SpuStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockBillStatus.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockBillStatus.java new file mode 100644 index 0000000..9c259af --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/StockBillStatus.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.constant; + +/** + * @Author lth + * @Date 2021/9/9 13:41 + */ +public enum StockBillStatus { + /** + * 已作废 + */ + ABOLISHED(0, "已作废", "Void"), + + /** + * 已 出/入 库 + */ + SUCCESS(1, "已 出/入 库", "Out of storage\n / Stocked"), + + /** + * 待提交 + */ + AWAIT_SUBMIT(2, "待提交", "To be submitted"); + + private final Integer id; + + private final String remark; + + private final String remarkEn; + + public Integer value() { + return id; + } + + public String text() { + return remark; + } + + public String textEn() { + return remarkEn; + } + + StockBillStatus(Integer id, String remark, String remarkEn) { + this.id = id; + this.remark = remark; + this.remarkEn = remarkEn; + } + + public static StockBillStatus instance(Integer value) { + StockBillStatus[] enums = values(); + for (StockBillStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierDeliveryType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierDeliveryType.java new file mode 100644 index 0000000..1934b84 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierDeliveryType.java @@ -0,0 +1,34 @@ +package com.tmerclub.cloud.common.product.constant;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/7/5 11:42 + * 发货方式 + */ +public enum SupplierDeliveryType { + /** + * 供应商发货 + */ + SUPPLIER_DELIVERY(1), + /** + * 商家仓库发货 + */ + SHOP_DELIVERY(2); + private final Integer value; + + SupplierDeliveryType(Integer value) { + this.value = value; + } + + public Integer value() { + return value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierSpuChangeType.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierSpuChangeType.java new file mode 100644 index 0000000..8934528 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/SupplierSpuChangeType.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.common.product.constant; +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/7/13 9:46 + * 供应商品变更类型 + */ +public enum SupplierSpuChangeType { + /** + * 上架 + */ + PUT_SHELF(1), + /** + * 下架 + */ + OFF_SHELF(2), + + /** + * 代销sku信息变更 + */ + SKU_MSG_CHANGE(3), + + /** + * 新增sku + */ + ADD_SKU(4), + + /** + * 代销spu信息变更 + */ + SPU_MSG_CHANGE(5); + + private final Integer value; + + public Integer value() { + return value; + } + + SupplierSpuChangeType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockSpuStatus.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockSpuStatus.java new file mode 100644 index 0000000..b232fe2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/constant/TakeStockSpuStatus.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.common.product.constant; + +/** + * @author lanhai + */ +public enum TakeStockSpuStatus { + + /** + * 盘盈 + */ + PROFIT(1, "盘盈", "PROFIT"), + /** + * 盘亏 + */ + LOSS(2, "盘亏", "LOSS"), + + /** + * 盘平 + */ + EQUAL(0, "盘平", "EQUAL"), + /** + * 异常 + */ + EXCEPTION(-1, "异常", "EXCEPTIONAL"), + ; + + private final Integer num; + private final String str; + private final String strEn; + + public Integer value() { + return num; + } + + public String str() { + return str; + } + + public String strEn() { + return strEn; + } + + TakeStockSpuStatus(Integer num, String str, String strEn) { + this.num = num; + this.str = str; + this.strEn = strEn; + } + + public static TakeStockSpuStatus instance(Integer value) { + TakeStockSpuStatus[] enums = values(); + for (TakeStockSpuStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ComboDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ComboDTO.java new file mode 100644 index 0000000..c03f58e --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/ComboDTO.java @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * @author xxw + * @date 2022/8/19 11:51 + */ +public class ComboDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "套餐名称") + @NotBlank(message = "套餐名称不能为空") + private String name; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "活动开始时间") + @NotNull(message = "活动开始时间不能为空") + private Date startTime; + + @Schema(description = "活动结束时间") + @NotNull(message = "活动结束时间不能为空") + private Date endTime; + + @Schema(description = "状态, -1:已删除 0:已失效 1:开启") + private Integer status; + + @Schema(description = "销量") + private Integer soldNum; + + @Schema(description = "套餐价格") + private Long price; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "主商品id") + private Long mainSpuId; + + @Schema(description = "主商品") + @Valid + private ComboSpuVO mainSpu; + + @Schema(description = "搭配商品列表") + @Valid + private List matchingSpus; + + @Schema(description = "商品数量") + private Integer spuCount; + + @Schema(description = "套餐价") + private Double matchingPrice; + + @Schema(description = "主商品名称") + private String mainSpuName; + + @Schema(description = "搭配商品名称") + private String matchSpuName; + + @Schema(description = "语言") + private Integer lang; + + /** + * 主商品id集合 + */ + private Set mainSpuIdList; + + /** + * 搭配商品id集合 + */ + private Set matchSpuIdList; + + /** + * 商品名称 + */ + private String spuName; + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Set getMatchSpuIdList() { + return matchSpuIdList; + } + + public void setMatchSpuIdList(Set matchSpuIdList) { + this.matchSpuIdList = matchSpuIdList; + } + + public Set getMainSpuIdList() { + return mainSpuIdList; + } + + public void setMainSpuIdList(Set mainSpuIdList) { + this.mainSpuIdList = mainSpuIdList; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSoldNum() { + return soldNum; + } + + public void setSoldNum(Integer soldNum) { + this.soldNum = soldNum; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getMainSpuId() { + return mainSpuId; + } + + public void setMainSpuId(Long mainSpuId) { + this.mainSpuId = mainSpuId; + } + + public ComboSpuVO getMainSpu() { + return mainSpu; + } + + public void setMainSpu(ComboSpuVO mainSpu) { + this.mainSpu = mainSpu; + } + + public List getMatchingSpus() { + return matchingSpus; + } + + public void setMatchingSpus(List matchingSpus) { + this.matchingSpus = matchingSpus; + } + + public Integer getSpuCount() { + return spuCount; + } + + public void setSpuCount(Integer spuCount) { + this.spuCount = spuCount; + } + + public Double getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Double matchingPrice) { + this.matchingPrice = matchingPrice; + } + + public String getMainSpuName() { + return mainSpuName; + } + + public void setMainSpuName(String mainSpuName) { + this.mainSpuName = mainSpuName; + } + + public String getMatchSpuName() { + return matchSpuName; + } + + public void setMatchSpuName(String matchSpuName) { + this.matchSpuName = matchSpuName; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + @Override + public String toString() { + return "ComboDTO{" + + "comboId=" + comboId + + ", name='" + name + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", status=" + status + + ", soldNum=" + soldNum + + ", price=" + price + + ", shopId=" + shopId + + ", mainSpuId=" + mainSpuId + + ", mainSpu=" + mainSpu + + ", matchingSpus=" + matchingSpus + + ", spuCount=" + spuCount + + ", matchingPrice=" + matchingPrice + + ", mainSpuName='" + mainSpuName + '\'' + + ", matchSpuName='" + matchSpuName + '\'' + + ", lang=" + lang + + ", mainSpuIdList=" + mainSpuIdList + + ", matchSpuIdList=" + matchSpuIdList + + ", spuName='" + spuName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuComboDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuComboDTO.java new file mode 100644 index 0000000..1fe1427 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuComboDTO.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * 规格组合商品管理表DTO + * + * @author FrozenWatermelon + * @date 2023-11-08 11:00:41 + */ +public class SkuComboDTO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "规格id") + private Long skuId; + + @Schema(description = "组合的skuid") + private Long comboSkuId; + + @Schema(description = "组合的商品id") + private Long comboSpuId; + + @Schema(description = "组合数量") + private Long comboCount; + + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "skuIds") + private List skuIds; + + public List getSkuIds() { + return skuIds; + } + + public void setSkuIds(List skuIds) { + this.skuIds = skuIds; + } + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getComboCount() { + return comboCount; + } + + public void setComboCount(Long comboCount) { + this.comboCount = comboCount; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getComboSkuId() { + return comboSkuId; + } + + public void setComboSkuId(Long comboSkuId) { + this.comboSkuId = comboSkuId; + } + + @Override + public String toString() { + return "SkuComboDTO{" + + "skuId=" + skuId + + ", comboSkuId=" + comboSkuId + + ", comboSpuId=" + comboSpuId + + ", comboCount=" + comboCount + + ", spuId=" + spuId + + ", skuIds=" + skuIds + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuDTO.java new file mode 100644 index 0000000..cc36e9f --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuDTO.java @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * sku信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SkuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long skuId; + + @Schema(description = "SPU id") + private Long spuId; + + @Schema(description = "sku国际化信息") + private List skuLangList; + + @Schema(description = "sku库存信息") + private List stockPointList; + + @Schema(description = "多个销售属性值id逗号分隔") + private String attrs; + + @Schema(description = "sku名称") + private String skuName; + + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "banner图片") + private String imgUrl; + + @Schema(description = "商品主图片") + private String spuMainImgUrl; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "更新时,变化的库存") + private Integer changeStock; + + @Schema(description = "积分价格") + private Long scoreFee; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商品条形码") + private String modelId; + + @Schema(description = "商品重量") + private Double weight; + + @Schema(description = "商品体积") + private Double volume; + + @Schema(description = "规格列表") + private List spuSkuAttrValues; + + @Schema(description = "sku的组合商品规格列表") + private List skuComboList; + + @Schema(description = "当商品为代销商品时,供应商商品skuId") + private Long supplierSkuId; + + @Schema(description = "库存预警") + private Long stockWarning; + + @Schema(description = "供应商的sku状态") + private Integer supplierSkuStatus; + + @Hidden + @Schema(description = "skuId集合") + private List skuIds; + + @Hidden + @Schema(description = "商品编码集合") + private List partyCodes; + + @Hidden + @Schema(description = "供应商skuId集合") + private List supplierSkuIds; + + @Hidden + @Schema(description = "店铺id") + private Long shopId; + + public List getSkuComboList() { + return skuComboList; + } + + public void setSkuComboList(List skuComboList) { + this.skuComboList = skuComboList; + } + + public List getStockPointList() { + return stockPointList; + } + + public void setStockPointList(List stockPointList) { + this.stockPointList = stockPointList; + } + + public Integer getSupplierSkuStatus() { + return supplierSkuStatus; + } + + public void setSupplierSkuStatus(Integer supplierSkuStatus) { + this.supplierSkuStatus = supplierSkuStatus; + } + + public Long getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Long stockWarning) { + this.stockWarning = stockWarning; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public List getSkuLangList() { + return skuLangList; + } + + public void setSkuLangList(List skuLangList) { + this.skuLangList = skuLangList; + } + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public Double getVolume() { + return volume; + } + + public void setVolume(Double volume) { + this.volume = volume; + } + + public List getSpuSkuAttrValues() { + return spuSkuAttrValues; + } + + public void setSpuSkuAttrValues(List spuSkuAttrValues) { + this.spuSkuAttrValues = spuSkuAttrValues; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getChangeStock() { + return changeStock; + } + + public void setChangeStock(Integer changeStock) { + this.changeStock = changeStock; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getAttrs() { + return attrs; + } + + public void setAttrs(String attrs) { + this.attrs = attrs; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSpuMainImgUrl() { + return spuMainImgUrl; + } + + public void setSpuMainImgUrl(String spuMainImgUrl) { + this.spuMainImgUrl = spuMainImgUrl; + } + + public List getSkuIds() { + return skuIds; + } + + public void setSkuIds(List skuIds) { + this.skuIds = skuIds; + } + + public List getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(List partyCodes) { + this.partyCodes = partyCodes; + } + + public List getSupplierSkuIds() { + return supplierSkuIds; + } + + public void setSupplierSkuIds(List supplierSkuIds) { + this.supplierSkuIds = supplierSkuIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "SkuDTO{" + + "skuId=" + skuId + + ", spuId=" + spuId + + ", skuLangList=" + skuLangList + + ", stockPointList=" + stockPointList + + ", attrs='" + attrs + '\'' + + ", skuName='" + skuName + '\'' + + ", spuName='" + spuName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", spuMainImgUrl='" + spuMainImgUrl + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", status=" + status + + ", stock=" + stock + + ", changeStock=" + changeStock + + ", scoreFee=" + scoreFee + + ", partyCode='" + partyCode + '\'' + + ", modelId='" + modelId + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", spuSkuAttrValues=" + spuSkuAttrValues + + ", skuComboList=" + skuComboList + + ", supplierSkuId=" + supplierSkuId + + ", stockWarning=" + stockWarning + + ", supplierSkuStatus=" + supplierSkuStatus + + ", skuIds=" + skuIds + + ", partyCodes=" + partyCodes + + ", supplierSkuIds=" + supplierSkuIds + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuStockPointSearchDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuStockPointSearchDTO.java new file mode 100644 index 0000000..511f8f7 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SkuStockPointSearchDTO.java @@ -0,0 +1,140 @@ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author gaozijie + * @since 2023-12-05 + */ +public class SkuStockPointSearchDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "spu名称") + private String spuName; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "供应商Id") + private Long supplierId; + + @Hidden + @Schema(description = "店铺id") + private Long shopId; + + @Hidden + @Schema(description = "系统类型") + private Integer sysType; + + @Hidden + @Schema(description = "库存点id集合") + private List stockPointSkuDTOList; + + @Hidden + @Schema(description = "不包含的skuId集合") + private List notInSkuIds; + + @Hidden + @Schema(description = "分类id集合") + private List categoryIds; + + public SkuStockPointSearchDTO() { + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public List getStockPointSkuDTOList() { + return stockPointSkuDTOList; + } + + public void setStockPointSkuDTOList(List stockPointSkuDTOList) { + this.stockPointSkuDTOList = stockPointSkuDTOList; + } + + public List getNotInSkuIds() { + return notInSkuIds; + } + + public void setNotInSkuIds(List notInSkuIds) { + this.notInSkuIds = notInSkuIds; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + @Override + public String toString() { + return "SkuStockPointSearchDTO{" + + "stockPointId=" + stockPointId + + ", spuName='" + spuName + '\'' + + ", partyCode='" + partyCode + '\'' + + ", supplierId=" + supplierId + + ", shopId=" + shopId + + ", sysType=" + sysType + + ", stockPointSkuDTOList=" + stockPointSkuDTOList + + ", notInSkuIds=" + notInSkuIds + + ", categoryIds=" + categoryIds + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuAttrValueDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuAttrValueDTO.java new file mode 100644 index 0000000..0ef97ba --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuAttrValueDTO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品规格属性关联信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuAttrValueDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品属性值关联信息id") + private Long spuAttrValueId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "规格属性id") + private Long attrId; + + @Schema(description = "规格属性名称") + private String attrName; + + @Schema(description = "规格属性值id") + private Long attrValueId; + + @Schema(description = "规格属性值名称") + private String attrValueName; + + public Long getSpuAttrValueId() { + return spuAttrValueId; + } + + public void setSpuAttrValueId(Long spuAttrValueId) { + this.spuAttrValueId = spuAttrValueId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + @Override + public String toString() { + return "SpuAttrValueDTO{" + + "spuAttrValueId=" + spuAttrValueId + + ",spuId=" + spuId + + ",attrId=" + attrId + + ",attrName=" + attrName + + ",attrValueId=" + attrValueId + + ",attrValueName=" + attrValueName + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuAttrValueLangDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuAttrValueLangDTO.java new file mode 100644 index 0000000..5e7498f --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuAttrValueLangDTO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性值-国际化表DTO + * + * @author YXF + * @date 2021-04-15 16:47:33 + */ +public class SpuAttrValueLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性值id") + private Long spuAttrValueId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "属性名称") + private String attrName; + + @Schema(description = "属性值") + private String attrValueName; + + @Schema(description = "属性值") + private String attrDesc; + + public Long getSpuAttrValueId() { + return spuAttrValueId; + } + + public void setSpuAttrValueId(Long spuAttrValueId) { + this.spuAttrValueId = spuAttrValueId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public String getAttrDesc() { + return attrDesc; + } + + public void setAttrDesc(String attrDesc) { + this.attrDesc = attrDesc; + } + + @Override + public String toString() { + return "SpuAttrValueLangDTO{" + + "spuAttrValueId=" + spuAttrValueId + + ",lang=" + lang + + ",attrName=" + attrName + + ",attrValueName=" + attrValueName + + ",attrDesc=" + attrDesc + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuDTO.java new file mode 100644 index 0000000..0c5e3bf --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuDTO.java @@ -0,0 +1,875 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import com.tmerclub.cloud.common.product.vo.SpuDetailVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * spu信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "品牌ID") + private Long brandId; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "店铺分类ID") + private Long shopCategoryId; + + @NotNull(message = "商品国际化信息不能为空") + @Schema(description = "店铺分类ID") + private List spuLangList; + + @Schema(description = "spu名称") + private String name; + + @Schema(description = "卖点") + private String sellingPoint; + + @NotNull(message = "商品轮播图不能为空") + @Schema(description = "商品介绍主图 多个图片逗号分隔") + private String imgUrls; + + @NotNull(message = "商品主图不能为空") + @Schema(description = "商品主图") + private String mainImgUrl; + + @Schema(description = "市场价") + private Long marketPriceFee; + + @NotNull(message = "售价不能为空") + @Schema(description = "售价") + private Long priceFee; + + @Schema(description = "状态 -1:删除, 0:下架, 1:上架, 2:平台下架, 3: 等待审核") + private Integer status; + + @Schema(description = "商品属性值列表") + private List spuAttrValues; + + @NotEmpty(message = "sku信息不能为空") + @Schema(description = "商品规格列表") + private List skuList; + + @Schema(description = "商品详情") + private String detail; + + @NotNull(message = "总库存不能为空") + @Schema(description = "总库存") + private Integer totalStock; + + @NotNull(message = "配送方式不能为空") + @Schema(description = "配送方式json见TransportModeVO") + private String deliveryMode; + + @Schema(description = "运费模板id -1固定运费 0包邮") + private Long deliveryTemplateId; + + @Schema(description = "固定运费金额") + private Long deliveryAmount; + + @Schema(description = "商品类型(0普通商品 1拼团 2秒杀 3积分)") + private Integer spuType; + + @Schema(description = "活动id(关联prod_type)") + private Long activityId; + + @Schema(description = "是否筛选掉活动商品") + private Integer isActive; + + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "是否可以退款 1.可以 0.不可以") + @Min(value = 0, message = "只能为0或1") + @Max(value = 1, message = "只能为0或1") + private Integer isRefund; + + @Schema(description = "虚拟商品的留言备注") + private String virtualRemark; + + @Schema(description = "预售状态 -1:未开启 0.全款预售 1.定金预售") + private Integer preSaleType; + + @Schema(description = "定金收取类型 0.按比例 1.按金额") + private Integer depositType; + + @Schema(description = "定金数值") + private BigDecimal depositValue; + + @Schema(description = "定金膨胀数值") + private BigDecimal depositExpansionValue; + + @Schema(description = "定金支付开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date depositStartTime; + + @Schema(description = "定金支付结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date depositEndTime; + + @Schema(description = "尾款支付开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date balanceStartTime; + + @Schema(description = "尾款支付结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date balanceEndTime; + + @Schema(description = "预售发货类型 0.固定时间 x.尾款支付后x天发货") + private Integer preSaleDeliveryType; + + @Schema(description = "预售发货时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date preSaleDeliveryTime; + @Schema(description = "商品视频") + private String video; + + @Schema(description = "积分价格") + private Long scoreFee; + + @NotNull(message = "sku是否含有图片不能为空") + @Schema(description = "sku是否含有图片 0无 1有") + private Integer hasSkuImg; + + @Schema(description = "分组id") + private Long tagId; + + @Schema(description = "序号") + private Integer seq; + + @Schema(description = "spuId列表(商品上下架:批量操作时,用此参数)(批量处理参数)") + private List spuIds; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "spu编码") + private String spuCode; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "关联商品商品id,只有供应商商品为2才有") + private Long supplierSpuId; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "计量单位") + private String measureUnit; + + @Schema(description = "供应商分类id") + private Long supplierCategoryId; + + @Schema(description = "代销商品规格选择状态,1: 全选 2:部分选择") + private Integer skuChoiceStatus; + + @Schema(description = "供应商商品更新后代销商品是否已同步更新 1:已更新 -1:未更新") + private Integer isSynUpdate; + + @Schema(description = "代销商品名称是否已更改 0未更改,1已更改") + private Integer nameChange; + + @Schema(description = "代销图片是否已更改 0未更改,1已更改") + private Integer imageChange; + + @Schema(description = "代销商品卖点是否已更改, 0未更改,1已更改") + private Integer sellingPointChange; + + @Schema(description = "代销商品视频是否已更改, 0未更改,1已更改") + private Integer videoChange; + + @Schema(description = "代销商品计量单位是否已更改,0未更改,1已更改") + private Integer measureUnitChange; + + @Schema(description = "代销商品品牌是否已更改,0未更改,1已更改") + private Integer brandChange; + + @Schema(description = "代销商品详情是否已更改,0未更改,1已更改") + private Integer detailChange; + + @Schema(description = "代销商品SPU编码是否更改,0未更改,1已更改") + private Integer spuCodeChange; + + @Schema(description = "商品详情列表") + private List detailList; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商品来源,0商家,1供应商") + private Integer spuOrigin; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + @Min(value = -1, message = "只能为-1,0或1") + @Max(value = 1, message = "只能为-1,0或1") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销有效期 -1.长期有效 0.自定义 x.x天内有效") + @Max(value = 9999, message = "核销有效期应该小于{max}天") + private Integer writeOffTime; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + @Schema(description = "是否为全部实物商品的组合商品 1.是 0.否") + private Integer isAllEntity; + + public Integer getIsAllEntity() { + return isAllEntity; + } + + public void setIsAllEntity(Integer isAllEntity) { + this.isAllEntity = isAllEntity; + } + + public Long getDeliveryAmount() { + return deliveryAmount; + } + + public void setDeliveryAmount(Long deliveryAmount) { + this.deliveryAmount = deliveryAmount; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Integer getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Integer writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Integer getSpuOrigin() { + return spuOrigin; + } + + public void setSpuOrigin(Integer spuOrigin) { + this.spuOrigin = spuOrigin; + } + + public Integer getIsActive() { + return isActive; + } + + public void setIsActive(Integer isActive) { + this.isActive = isActive; + } + + public Integer getSpuCodeChange() { + return spuCodeChange; + } + + public void setSpuCodeChange(Integer spuCodeChange) { + this.spuCodeChange = spuCodeChange; + } + + public Integer getNameChange() { + return nameChange; + } + + public void setNameChange(Integer nameChange) { + this.nameChange = nameChange; + } + + public Integer getImageChange() { + return imageChange; + } + + public void setImageChange(Integer imageChange) { + this.imageChange = imageChange; + } + + public Integer getSellingPointChange() { + return sellingPointChange; + } + + public void setSellingPointChange(Integer sellingPointChange) { + this.sellingPointChange = sellingPointChange; + } + + public Integer getVideoChange() { + return videoChange; + } + + public void setVideoChange(Integer videoChange) { + this.videoChange = videoChange; + } + + public Integer getMeasureUnitChange() { + return measureUnitChange; + } + + public void setMeasureUnitChange(Integer measureUnitChange) { + this.measureUnitChange = measureUnitChange; + } + + public Integer getBrandChange() { + return brandChange; + } + + public void setBrandChange(Integer brandChange) { + this.brandChange = brandChange; + } + + public Integer getDetailChange() { + return detailChange; + } + + public void setDetailChange(Integer detailChange) { + this.detailChange = detailChange; + } + + public List getDetailList() { + return detailList; + } + + public void setDetailList(List detailList) { + this.detailList = detailList; + } + + public Integer getIsSynUpdate() { + return isSynUpdate; + } + + public void setIsSynUpdate(Integer isSynUpdate) { + this.isSynUpdate = isSynUpdate; + } + + public Integer getSkuChoiceStatus() { + return skuChoiceStatus; + } + + public void setSkuChoiceStatus(Integer skuChoiceStatus) { + this.skuChoiceStatus = skuChoiceStatus; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Long getSupplierCategoryId() { + return supplierCategoryId; + } + + public void setSupplierCategoryId(Long supplierCategoryId) { + this.supplierCategoryId = supplierCategoryId; + } + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getDepositType() { + return depositType; + } + + public void setDepositType(Integer depositType) { + this.depositType = depositType; + } + + public BigDecimal getDepositValue() { + return depositValue; + } + + public void setDepositValue(BigDecimal depositValue) { + this.depositValue = depositValue; + } + + public BigDecimal getDepositExpansionValue() { + return depositExpansionValue; + } + + public void setDepositExpansionValue(BigDecimal depositExpansionValue) { + this.depositExpansionValue = depositExpansionValue; + } + + public Date getDepositStartTime() { + return depositStartTime; + } + + public void setDepositStartTime(Date depositStartTime) { + this.depositStartTime = depositStartTime; + } + + public Date getDepositEndTime() { + return depositEndTime; + } + + public void setDepositEndTime(Date depositEndTime) { + this.depositEndTime = depositEndTime; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public List getSpuAttrValues() { + return spuAttrValues; + } + + public void setSpuAttrValues(List spuAttrValues) { + this.spuAttrValues = spuAttrValues; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Integer getHasSkuImg() { + return hasSkuImg; + } + + public void setHasSkuImg(Integer hasSkuImg) { + this.hasSkuImg = hasSkuImg; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + @Override + public String toString() { + return "SpuDTO{" + + "spuId=" + spuId + + ", brandId=" + brandId + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", spuLangList=" + spuLangList + + ", name='" + name + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", marketPriceFee=" + marketPriceFee + + ", priceFee=" + priceFee + + ", status=" + status + + ", spuAttrValues=" + spuAttrValues + + ", skuList=" + skuList + + ", detail='" + detail + '\'' + + ", totalStock=" + totalStock + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplateId=" + deliveryTemplateId + + ", deliveryAmount=" + deliveryAmount + + ", spuType=" + spuType + + ", activityId=" + activityId + + ", isActive=" + isActive + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", virtualRemark='" + virtualRemark + '\'' + + ", preSaleType=" + preSaleType + + ", depositType=" + depositType + + ", depositValue=" + depositValue + + ", depositExpansionValue=" + depositExpansionValue + + ", depositStartTime=" + depositStartTime + + ", depositEndTime=" + depositEndTime + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", video='" + video + '\'' + + ", scoreFee=" + scoreFee + + ", hasSkuImg=" + hasSkuImg + + ", tagId=" + tagId + + ", seq=" + seq + + ", spuIds=" + spuIds + + ", shopId=" + shopId + + ", spuCode='" + spuCode + '\'' + + ", supplierSpuType=" + supplierSpuType + + ", supplierSpuId=" + supplierSpuId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierId=" + supplierId + + ", measureUnit='" + measureUnit + '\'' + + ", supplierCategoryId=" + supplierCategoryId + + ", skuChoiceStatus=" + skuChoiceStatus + + ", isSynUpdate=" + isSynUpdate + + ", nameChange=" + nameChange + + ", imageChange=" + imageChange + + ", sellingPointChange=" + sellingPointChange + + ", videoChange=" + videoChange + + ", measureUnitChange=" + measureUnitChange + + ", brandChange=" + brandChange + + ", detailChange=" + detailChange + + ", spuCodeChange=" + spuCodeChange + + ", detailList=" + detailList + + ", partyCode='" + partyCode + '\'' + + ", spuOrigin=" + spuOrigin + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffTime=" + writeOffTime + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", isAllEntity=" + isAllEntity + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuLangDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuLangDTO.java new file mode 100644 index 0000000..b85d537 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuLangDTO.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品-国际化表DTO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class SpuLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public SpuLangDTO() { + } + + public SpuLangDTO(Integer lang, String spuName, String sellingPoint) { + this.lang = lang; + this.spuName = spuName; + this.sellingPoint = sellingPoint; + } + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "简要描述,卖点等") + private String sellingPoint; + + @Schema(description = "详细描述") + private String detail; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + @Override + public String toString() { + return "SpuLangDTO{" + + "spuId=" + spuId + + ",lang=" + lang + + ",spuName=" + spuName + + ",sellingPoint=" + sellingPoint + + ",detail=" + detail + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuSkuAttrValueDTO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuSkuAttrValueDTO.java new file mode 100644 index 0000000..b95e837 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/dto/SpuSkuAttrValueDTO.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 商品sku销售属性关联信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuSkuAttrValueDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品sku销售属性关联信息id") + private Long spuSkuAttrId; + + @Schema(description = "SPU ID") + private Long spuId; + + @Schema(description = "SKU ID") + private Long skuId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "销售属性ID") + private Long attrId; + + @Schema(description = "销售属性名称") + private String attrName; + + @Schema(description = "销售属性值ID") + private Long attrValueId; + + @Schema(description = "销售属性值") + private String attrValueName; + + @Schema(description = "状态 1:enable, 0:disable") + private Integer status; + + private List spuSkuAttrValueLangList; + + public Long getSpuSkuAttrId() { + return spuSkuAttrId; + } + + public void setSpuSkuAttrId(Long spuSkuAttrId) { + this.spuSkuAttrId = spuSkuAttrId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getSpuSkuAttrValueLangList() { + return spuSkuAttrValueLangList; + } + + public void setSpuSkuAttrValueLangList(List spuSkuAttrValueLangList) { + this.spuSkuAttrValueLangList = spuSkuAttrValueLangList; + } + + @Override + public String toString() { + return "SpuSkuAttrValueDTO{" + + "spuSkuAttrId=" + spuSkuAttrId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", lang=" + lang + + ", attrId=" + attrId + + ", attrName='" + attrName + '\'' + + ", attrValueId=" + attrValueId + + ", attrValueName='" + attrValueName + '\'' + + ", status=" + status + + ", spuSkuAttrValueLangList=" + spuSkuAttrValueLangList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrLangVO.java new file mode 100644 index 0000000..5872aae --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrLangVO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性-国际化表VO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class AttrLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "属性名称") + private String name; + + @Schema(description = "属性描述") + private String desc; + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "AttrLangVO{" + + ",lang=" + lang + + ",name=" + name + + ",desc=" + desc + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrValueLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrValueLangVO.java new file mode 100644 index 0000000..6de0d2a --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/AttrValueLangVO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 属性值-国际化表VO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class AttrValueLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性值id") + private Long attrValueId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "属性值") + private String value; + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "AttrValueLangVO{" + + "attrValueId=" + attrValueId + + ",lang=" + lang + + ",value=" + value + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/BrandLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/BrandLangVO.java new file mode 100644 index 0000000..d88843e --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/BrandLangVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 品牌-国际化表VO + * + * @author YXF + * @date 2021-04-26 15:17:37 + */ +public class BrandLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "品牌名称") + private String name; + + @Schema(description = "品牌描述") + private String desc; + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "BrandLangVO{" + + "brandId=" + brandId + + ",lang=" + lang + + ",name=" + name + + ",desc=" + desc + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/CategoryVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/CategoryVO.java new file mode 100644 index 0000000..4cec1ee --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/CategoryVO.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 分类信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class CategoryVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "父ID") + private Long parentId; + + @Schema(description = "父分类名称") + private String parentName; + + @Schema(description = "分类语言") + private List categoryLangList; + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "分类描述") + private String desc; + + @Schema(description = "分类地址{parent_id}-{child_id},...") + private String path; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "分类图标") + private String icon; + + @Schema(description = "分类的显示图片") + private String imgUrl; + + @Schema(description = "分类层级 从0开始") + private Integer level; + + @Schema(description = "分类扣率") + private Double deductionRate; + + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "上级/子分类列表") + private List categories; + + @Schema(description = "平台一级分类id") + private Long primaryCategoryId; + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public List getCategoryLangList() { + return categoryLangList; + } + + public void setCategoryLangList(List categoryLangList) { + this.categoryLangList = categoryLangList; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public List getCategories() { + return categories; + } + + public void setCategories(List categories) { + this.categories = categories; + } + + public Double getDeductionRate() { + return deductionRate; + } + + public void setDeductionRate(Double deductionRate) { + this.deductionRate = deductionRate; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + @Override + public String toString() { + return "CategoryVO{" + + "categoryId=" + categoryId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", parentId=" + parentId + + ", parentName='" + parentName + '\'' + + ", categoryLangList=" + categoryLangList + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", path='" + path + '\'' + + ", status=" + status + + ", icon='" + icon + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", level=" + level + + ", deductionRate=" + deductionRate + + ", seq=" + seq + + ", categories=" + categories + + ", primaryCategoryId=" + primaryCategoryId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboSpuSkuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboSpuSkuVO.java new file mode 100644 index 0000000..cb073e4 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboSpuSkuVO.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套装商品sku项VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpuSkuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐商品sku项id") + private Long comboSpuId; + + @Schema(description = "skuId") + @NotNull(message = "skuId不能为空") + private Long skuId; + + @Schema(description = "搭配价格") + @NotNull(message = "搭配价格不能为空") + private Long matchingPrice; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "sku图片") + private String pic; + + @Schema(description = "sku价格") + private Long priceFee; + + @Schema(description = "sku库存") + private Integer stocks; + + @Schema(description = "sku状态 0 禁用 1 启用 -1 删除") + private Integer skuStatus; + + @Schema(description = "销售属性组合字符串 格式是p1:v1;p2:v2") + private String properties; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "spuId") + private Long spuId; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + /** + * 商品是否必选:1:是 0:否 + */ + private Integer spuRequired; + + public String getSkuName() { + return skuName; + } + + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long price) { + this.priceFee = price; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getSkuStatus() { + return skuStatus; + } + + public void setSkuStatus(Integer skuStatus) { + this.skuStatus = skuStatus; + } + + public String getProperties() { + return properties; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public Integer getSpuRequired() { + return spuRequired; + } + + public void setSpuRequired(Integer spuRequired) { + this.spuRequired = spuRequired; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Long matchingPrice) { + this.matchingPrice = matchingPrice; + } + + @Override + public String toString() { + return "ComboSpuSkuVO{" + + "comboSpuId=" + comboSpuId + + ", skuId=" + skuId + + ", matchingPrice=" + matchingPrice + + ", skuName='" + skuName + '\'' + + ", pic='" + pic + '\'' + + ", priceFee=" + priceFee + + ", stocks=" + stocks + + ", skuStatus=" + skuStatus + + ", properties='" + properties + '\'' + + ", comboId=" + comboId + + ", spuId=" + spuId + + ", spuRequired=" + spuRequired + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboSpuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboSpuVO.java new file mode 100644 index 0000000..e102a9e --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboSpuVO.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 套装商品项VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐商品项id") + private Long comboSpuId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "套餐价格") + private Long comboPrice; + + @Schema(description = "商品价格") + private Long price; + + @Schema(description = "类型:1:主商品 2:搭配商品") + private Integer type; + + @Schema(description = "是否必选:1:是 0:否") + @NotNull(message = "是否必选不能为空") + private Integer required; + + @Schema(description = "起搭数量") + @NotNull(message = "起搭数量不能为空") + private Integer leastNum; + + @Schema(description = "状态, -1:已删除 1:正常") + private Integer status; + + @Schema(description = "商品图片") + private String pic; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品状态") + private Integer spuStatus; + + @Schema(description = "sku项列表") + private List skuList; + + @Schema(description = "商品id") + private Long spuId; + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getComboPrice() { + return comboPrice; + } + + public void setComboPrice(Long comboPrice) { + this.comboPrice = comboPrice; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getRequired() { + return required; + } + + public void setRequired(Integer required) { + this.required = required; + } + + public Integer getLeastNum() { + return leastNum; + } + + public void setLeastNum(Integer leastNum) { + this.leastNum = leastNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "ComboSpuVO{" + + "comboSpuId=" + comboSpuId + + ", comboId=" + comboId + + ", comboPrice=" + comboPrice + + ", price=" + price + + ", type=" + type + + ", required=" + required + + ", leastNum=" + leastNum + + ", status=" + status + + ", pic='" + pic + '\'' + + ", spuName='" + spuName + '\'' + + ", spuStatus=" + spuStatus + + ", skuList=" + skuList + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboVO.java new file mode 100644 index 0000000..e7adbd5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ComboVO.java @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 套装VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "套餐名称") + @NotBlank(message = "套餐名称不能为空") + private String name; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "活动开始时间") + @NotNull(message = "活动开始时间不能为空") + private Date startTime; + + @Schema(description = "活动结束时间") + @NotNull(message = "活动结束时间不能为空") + private Date endTime; + + @Schema(description = "状态, -1:已删除 0:已失效 1:开启") + private Integer status; + + @Schema(description = "销量") + private Integer soldNum; + + @Schema(description = "套餐价格") + private Long price; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "主商品id") + private Long mainSpuId; + + @Schema(description = "主商品") + @Valid + private ComboSpuVO mainSpu; + + @Schema(description = "搭配商品列表") + @Valid + private List matchingSpus; + + @Schema(description = "商品数量") + private Integer spuCount; + + @Schema(description = "套餐价") + private Long matchingPrice; + + @Schema(description = "主商品图片") + private String mainSpuName; + + @Schema(description = "主商品名称") + private String mainSpuImgUrl; + + @Schema(description = "搭配商品名称") + private String matchSpuName; + + @Schema(description = "语言") + private Integer lang; + + @Schema(description = "节省钱") + private Long savePrice; + + public Long getSavePrice() { + return savePrice; + } + + public void setSavePrice(Long savePrice) { + this.savePrice = savePrice; + } + + @Override + public Date getUpdateTime() { + return updateTime; + } + + @Override + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public ComboSpuVO getMainSpu() { + return mainSpu; + } + + public void setMainSpu(ComboSpuVO mainSpu) { + this.mainSpu = mainSpu; + } + + public List getMatchingSpus() { + return matchingSpus; + } + + public void setMatchingSpus(List matchingSpus) { + this.matchingSpus = matchingSpus; + } + + public Integer getSpuCount() { + return spuCount; + } + + public void setSpuCount(Integer spuCount) { + this.spuCount = spuCount; + } + + public Long getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Long matchingPrice) { + this.matchingPrice = matchingPrice; + } + + public String getMainSpuName() { + return mainSpuName; + } + + public void setMainSpuName(String mainSpuName) { + this.mainSpuName = mainSpuName; + } + + public String getMatchSpuName() { + return matchSpuName; + } + + public void setMatchSpuName(String matchSpuName) { + this.matchSpuName = matchSpuName; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + @Override + public Date getCreateTime() { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getMainSpuId() { + return mainSpuId; + } + + public void setMainSpuId(Long mainSpuId) { + this.mainSpuId = mainSpuId; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Integer getSoldNum() { + return soldNum; + } + + public void setSoldNum(Integer soldNum) { + this.soldNum = soldNum; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMainSpuImgUrl() { + return mainSpuImgUrl; + } + + public void setMainSpuImgUrl(String mainSpuImgUrl) { + this.mainSpuImgUrl = mainSpuImgUrl; + } + + @Override + public String toString() { + return "ComboVO{" + + "comboId=" + comboId + + ", name='" + name + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", status=" + status + + ", soldNum=" + soldNum + + ", price=" + price + + ", shopId=" + shopId + + ", mainSpuId=" + mainSpuId + + ", mainSpu=" + mainSpu + + ", matchingSpus=" + matchingSpus + + ", spuCount=" + spuCount + + ", matchingPrice=" + matchingPrice + + ", mainSpuName='" + mainSpuName + '\'' + + ", mainSpuImgUrl='" + mainSpuImgUrl + '\'' + + ", matchSpuName='" + matchSpuName + '\'' + + ", lang=" + lang + + ", savePrice=" + savePrice + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ParentCategoryVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ParentCategoryVO.java new file mode 100644 index 0000000..b640c15 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/ParentCategoryVO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 父级分类信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class ParentCategoryVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "父ID") + private Long parentId; + + @Schema(description = "分类名称") + private String name; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "CategoryVO{" + + "categoryId=" + categoryId + + ", parentId=" + parentId + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/PurchaseSpuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/PurchaseSpuVO.java new file mode 100644 index 0000000..4e7b780 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/PurchaseSpuVO.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +public class PurchaseSpuVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "sku图片") + private String imgUrl; + + @Schema(description = "属性id") + private Long skuId; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "spu名称") + private String name; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "商家库存") + private Integer stock; + + @Schema(description = "采收数量") + private Integer purchaseStock; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "供应商库存") + private Integer supplierStock; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Integer getSupplierStock() { + return supplierStock; + } + + public void setSupplierStock(Integer supplierStock) { + this.supplierStock = supplierStock; + } + + @Override + public String toString() { + return "PurchaseSpuVO{" + + "spuId=" + spuId + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", skuId=" + skuId + + ", skuName='" + skuName + '\'' + + ", name='" + name + '\'' + + ", partyCode='" + partyCode + '\'' + + ", stock=" + stock + + ", purchaseStock=" + purchaseStock + + ", priceFee=" + priceFee + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", supplierStock='" + supplierStock + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SekillActivitySpuVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SekillActivitySpuVO.java new file mode 100644 index 0000000..c30d62c --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SekillActivitySpuVO.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团活动表VO + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public class SekillActivitySpuVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "秒杀活动最低价") + private Long seckillPrice; + + + @Schema(description = "秒杀活动剩余总库存") + private Integer seckillTotalStocks; + + @Schema(description = "秒杀活动原始库存") + private Integer seckillOriginStocks; + + @Schema(description = "秒杀活动原价(最低价sku对应的原价)") + private Long priceFee; + + /** + * skuId(最低秒杀价对应的s'kuId) + * + * @return + */ + private Long skuId; + + @Schema(description = "秒杀活动状态") + private Integer status; + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Integer getSeckillTotalStocks() { + return seckillTotalStocks; + } + + public void setSeckillTotalStocks(Integer seckillTotalStocks) { + this.seckillTotalStocks = seckillTotalStocks; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + @Override + public String toString() { + return "SekillActivitySpuVO{" + + "seckillId=" + seckillId + + ", spuId=" + spuId + + ", seckillPrice=" + seckillPrice + + ", seckillTotalStocks=" + seckillTotalStocks + + ", seckillOriginStocks=" + seckillOriginStocks + + ", skuId=" + skuId + + ", priceFee=" + priceFee + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAttrValueVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAttrValueVO.java new file mode 100644 index 0000000..554122f --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuAttrValueVO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 商品规格属性关联信息VO + * + * @author FrozenWatermelon + * @date 2021-03-03 09:00:00 + */ +public class SpuAttrValueVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品属性值关联信息id") + private Long spuAttrValueId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "规格属性id") + private Long attrId; + + @Schema(description = "规格属性名称") + private String attrName; + + @Schema(description = "规格属性值id") + private Long attrValueId; + + @Schema(description = "规格属性值名称") + private String attrValueName; + + @Schema(description = "搜索类型 0:不需要,1:需要") + private Integer searchType; + + @Schema(description = "规格属性描述") + private String attrDesc; + + @Schema(description = "商品属性多语言列表") + private List spuAttrValueLangList; + + public Long getSpuAttrValueId() { + return spuAttrValueId; + } + + public void setSpuAttrValueId(Long spuAttrValueId) { + this.spuAttrValueId = spuAttrValueId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public Integer getSearchType() { + return searchType; + } + + public void setSearchType(Integer searchType) { + this.searchType = searchType; + } + + public String getAttrDesc() { + return attrDesc; + } + + public void setAttrDesc(String attrDesc) { + this.attrDesc = attrDesc; + } + + public List getSpuAttrValueLangList() { + return spuAttrValueLangList; + } + + public void setSpuAttrValueLangList(List spuAttrValueLangList) { + this.spuAttrValueLangList = spuAttrValueLangList; + } + + @Override + public String toString() { + return "SpuAttrValueVO{" + + "spuAttrValueId=" + spuAttrValueId + + ", spuId=" + spuId + + ", attrId=" + attrId + + ", attrName='" + attrName + '\'' + + ", attrValueId=" + attrValueId + + ", attrValueName='" + attrValueName + '\'' + + ", searchType=" + searchType + + ", attrDesc='" + attrDesc + '\'' + + ", spuAttrValueLangList=" + spuAttrValueLangList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuDetailVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuDetailVO.java new file mode 100644 index 0000000..d7c87fc --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuDetailVO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品详情信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "商品详情") + private String detail; + + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + @Override + public String toString() { + return "SpuDetailVO{" + + ",lang=" + lang + + ",detail=" + detail + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuDiscountAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuDiscountAppVO.java new file mode 100644 index 0000000..a75bdbe --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuDiscountAppVO.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuDiscountItemAppVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * spu满减满折VO + * + * @author YXF + * @date 2021-03-03 09:00:09 + */ +public class SpuDiscountAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "活动名称") + private String discountName; + + @Schema(description = "枚举DiscountRule(0 满钱减钱 3满件打折)") + private Integer discountRule; + + @Schema(description = "减免类型 0按满足最高层级减一次 1每满一次减一次") + private Integer discountType; + + @Schema(description = "最多减多少") + private Long maxReduceAmount; + + @Schema(description = "满减项") + private List discountItemList; + + public List getDiscountItemList() { + return discountItemList; + } + + public void setDiscountItemList(List discountItemList) { + this.discountItemList = discountItemList; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public String getDiscountName() { + return discountName; + } + + public void setDiscountName(String discountName) { + this.discountName = discountName; + } + + public Integer getDiscountRule() { + return discountRule; + } + + public void setDiscountRule(Integer discountRule) { + this.discountRule = discountRule; + } + + public Integer getDiscountType() { + return discountType; + } + + public void setDiscountType(Integer discountType) { + this.discountType = discountType; + } + + public Long getMaxReduceAmount() { + return maxReduceAmount; + } + + public void setMaxReduceAmount(Long maxReduceAmount) { + this.maxReduceAmount = maxReduceAmount; + } + + @Override + public String toString() { + return "SpuDiscountVO{" + + "discountId=" + discountId + + ", discountName='" + discountName + '\'' + + ", discountRule=" + discountRule + + ", discountType=" + discountType + + ", maxReduceAmount=" + maxReduceAmount + + ", discountItemList=" + discountItemList + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuLangVO.java new file mode 100644 index 0000000..4693e28 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuLangVO.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品-国际化表VO + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class SpuLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "语言 1.中文 2.英文") + private Integer lang; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "简要描述,卖点等") + private String sellingPoint; + + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + @Override + public String toString() { + return "SpuLangVO{" + + "spuId=" + spuId + + ", lang=" + lang + + ", spuName='" + spuName + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuSkuAttrValueLangVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuSkuAttrValueLangVO.java new file mode 100644 index 0000000..1863315 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/SpuSkuAttrValueLangVO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品sku属性值-国际化表VO + * + * @author YXF + * @date 2021-04-09 17:30:44 + */ +public class SpuSkuAttrValueLangVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "语言 0.通用 1.中文 2.英文") + private Integer lang; + + @Schema(description = "销售属性名称") + private String attrName; + + @Schema(description = "销售属性值ID") + private Integer attrValueId; + + @Schema(description = "销售属性值") + private String attrValueName; + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Integer getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Integer attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + @Override + public String toString() { + return "SpuSkuAttrValueLangVO{" + + "lang=" + lang + + ", attrName='" + attrName + '\'' + + ", attrValueId=" + attrValueId + + ", attrValueName='" + attrValueName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockBillLogItemVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockBillLogItemVO.java new file mode 100644 index 0000000..8043ed9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockBillLogItemVO.java @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 出入库商品项VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockBillLogItemVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "出入库商品项id") + private Long stockBillLogItemId; + + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "实际出入库数量") + private Integer stockCount; + + @Schema(description = "商品库存剩余量") + private Integer afterStock; + + @Schema(description = "成本单价") + private Long unitPrice; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "sku总库存") + private Integer stock; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "主图:sku有图片使用sku图片,否则使用商品主图") + private String mainImgUrl; + + @Schema(description = "sku图片") + private String imgUrl; + + @Schema(description = "单位") + private String measureUnit; + + @Schema(description = "1:出库 2:入库") + private Integer stockType; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @Schema(description = "规格") + private String skuName; + + @Schema(description = "制单开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createStartTime; + + @Schema(description = "制单结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createEndTime; + + @Schema(description = "库存点类型") + private Integer stockPointType; + + @Schema(description = "仓库类型 0默认仓库,1区域仓库") + private Integer warehouseType; + + public Integer getWarehouseType() { + return warehouseType; + } + + public void setWarehouseType(Integer warehouseType) { + this.warehouseType = warehouseType; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getStockBillLogItemId() { + return stockBillLogItemId; + } + + public void setStockBillLogItemId(Long stockBillLogItemId) { + this.stockBillLogItemId = stockBillLogItemId; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Integer getAfterStock() { + return afterStock; + } + + public void setAfterStock(Integer afterStock) { + this.afterStock = afterStock; + } + + public Long getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(Long unitPrice) { + this.unitPrice = unitPrice; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Integer getStockType() { + return stockType; + } + + public void setStockType(Integer stockType) { + this.stockType = stockType; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Date getCreateStartTime() { + return createStartTime; + } + + public void setCreateStartTime(Date createStartTime) { + this.createStartTime = createStartTime; + } + + public Date getCreateEndTime() { + return createEndTime; + } + + public void setCreateEndTime(Date createEndTime) { + this.createEndTime = createEndTime; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + @Override + public String toString() { + return "StockBillLogItemVO{" + + "stockBillLogItemId=" + stockBillLogItemId + + ", stockBillLogId=" + stockBillLogId + + ", stockCount=" + stockCount + + ", afterStock=" + afterStock + + ", unitPrice=" + unitPrice + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", stockPointId=" + stockPointId + + ", remark='" + remark + '\'' + + ", partyCode='" + partyCode + '\'' + + ", stock=" + stock + + ", spuName='" + spuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", measureUnit='" + measureUnit + '\'' + + ", stockType=" + stockType + + ", stockBillType=" + stockBillType + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", makerMobile='" + makerMobile + '\'' + + ", skuName='" + skuName + '\'' + + ", createStartTime=" + createStartTime + + ", createEndTime=" + createEndTime + + ", stockPointType=" + stockPointType + + ", warehouseType=" + warehouseType + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockPointVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockPointVO.java new file mode 100644 index 0000000..f5fa708 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/StockPointVO.java @@ -0,0 +1,62 @@ +package com.tmerclub.cloud.common.product.vo; + + +import com.tmerclub.cloud.common.vo.BaseVO; + +/** + * VO + * + * @author zp + * @date 2023-11-09 18:00:43 + */ +public class StockPointVO extends BaseVO { + private static final long serialVersionUID = 1L; + + /** + * 默认仓库id + */ + private Long defaultWarehouseId; + + /** + * 仓库数量 + */ + private Integer warehouseSize; + + /** + * 独立营销门店数量 + */ + private Integer stationSize; + + public Long getDefaultWarehouseId() { + return defaultWarehouseId; + } + + public void setDefaultWarehouseId(Long defaultWarehouseId) { + this.defaultWarehouseId = defaultWarehouseId; + } + + public Integer getWarehouseSize() { + return warehouseSize; + } + + public void setWarehouseSize(Integer warehouseSize) { + this.warehouseSize = warehouseSize; + } + + public Integer getStationSize() { + return stationSize; + } + + public void setStationSize(Integer stationSize) { + this.stationSize = stationSize; + } + + @Override + public String toString() { + return "StockPointVO{" + + "defaultWarehouseId=" + defaultWarehouseId + + ", warehouseSize=" + warehouseSize + + ", stationSize=" + stationSize + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/CategorySearchAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/CategorySearchAppVO.java new file mode 100644 index 0000000..ec37020 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/CategorySearchAppVO.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.app; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 分类-搜索头部信息信息VO + * + * @author YXF + * @date 2021-03-04 + */ +public class CategorySearchAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "一级分类信息") + private CategoryAppVO primaryCategory; + + @Schema(description = "二级分类信息") + private List secondaryCategory; + + @Schema(description = "三级分类信息") + private List categoryVO; + + public CategoryAppVO getPrimaryCategory() { + return primaryCategory; + } + + public void setPrimaryCategory(CategoryAppVO primaryCategory) { + this.primaryCategory = primaryCategory; + } + + public List getSecondaryCategory() { + return secondaryCategory; + } + + public void setSecondaryCategory(List secondaryCategory) { + this.secondaryCategory = secondaryCategory; + } + + public List getCategoryVO() { + return categoryVO; + } + + public void setCategoryVO(List categoryVO) { + this.categoryVO = categoryVO; + } + + @Override + public String toString() { + return "CategorySearchAppVO{" + + "primaryCategory=" + primaryCategory + + ", secondaryCategory=" + secondaryCategory + + ", categoryVO=" + categoryVO + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuAppVO.java new file mode 100644 index 0000000..fbc688e --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuAppVO.java @@ -0,0 +1,646 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.app; + +import com.tmerclub.cloud.common.product.vo.ComboVO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.SpuActivityAppVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * spu信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spu id") + private Long spuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "spu名称") + private String spuName; + + @Schema(description = "卖点") + private String sellingPoint; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "店铺分类ID") + private Long shopCategoryId; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "商品介绍主图 多个图片逗号分隔") + private String imgUrls; + + @Schema(description = "商品视频") + private String video; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "商品详情") + private String detail; + + @Schema(description = "总库存") + private Integer totalStock; + + @Schema(description = "规格属性") + private List spuAttrValues; + + @Schema(description = "sku列表") + private List skus; + + @Schema(description = "配送方式json见TransportModeVO") + private String deliveryMode; + + @Schema(description = "运费模板id") + private Long deliveryTemplateId; + + @Schema(description = "商品类型(0普通商品 1拼团 2秒杀 3积分)") + private Integer spuType; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "是否可以退款 1.可以 0.不可以") + private Integer isRefund; + + @Schema(description = "虚拟商品的留言备注") + private String virtualRemark; + + @Schema(description = "活动id(关联prod_type)") + private Long activityId; + + @Schema(description = "商品销量") + private Integer saleNum; + + @Schema(description = "评论数量") + private Integer commentNum; + + @Schema(description = "商品活动信息(JSON)") + private SpuActivityAppVO spuActivity; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "关联商品商品id,只有供应商商品为2才有") + private Long supplierSpuId; + + @Schema(description = "spu编码") + private String spuCode; + + @Schema(description = "计量单位") + private String measureUnit; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "商品赠品") + private GiveawayVO giveaway; + + + @Schema(description = "预售类型 -1:未开启 0.全款预售 1.定金预售") + private Integer preSaleType; + + @Schema(description = "定金收取类型 0.按比例 1.按金额") + private Integer depositType; + + @Schema(description = "定金数额") + private Long depositAmount; + @Schema(description = "定金膨胀数额") + private Long depositExpansionAmount; + + @Schema(description = "定金支付开始时间") + private Date depositStartTime; + + @Schema(description = "定金支付结束时间") + private Date depositEndTime; + + @Schema(description = "尾款支付开始时间") + private Date balanceStartTime; + + @Schema(description = "尾款支付结束时间") + private Date balanceEndTime; + + @Schema(description = "预售发货类型 -1.固定时间 x.尾款支付后x天发货") + private Integer preSaleDeliveryType; + + @Schema(description = "预售发货时间") + private Date preSaleDeliveryTime; + + @Schema(description = "商品套餐列表") + private List comboList; + + @Schema(description = "是否在配送范围内") + private Boolean isDelivery; + + @Schema(description = "核销次数 -1.多次核销 0.无需核销 1.单次核销") + private Integer writeOffNum; + + @Schema(description = "多次核销次数 -1.无限次") + private Integer writeOffMultipleCount; + + @Schema(description = "核销有效期 -1.长期有效 0.自定义 x.x天内有效") + private Integer writeOffTime; + + @Schema(description = "核销开始时间") + private Date writeOffStart; + + @Schema(description = "核销结束时间") + private Date writeOffEnd; + + + @Schema(description = "是否开启同城配送") + private Boolean cityDelivery; + + public Boolean getCityDelivery() { + return cityDelivery; + } + + public void setCityDelivery(Boolean cityDelivery) { + this.cityDelivery = cityDelivery; + } + + public Boolean getDelivery() { + return isDelivery; + } + + public void setDelivery(Boolean delivery) { + isDelivery = delivery; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Integer getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Integer writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public Boolean getIsDelivery() { + return isDelivery; + } + + public void setIsDelivery(Boolean delivery) { + isDelivery = delivery; + } + + public List getComboList() { + return comboList; + } + + public void setComboList(List comboList) { + this.comboList = comboList; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getDepositExpansionAmount() { + return depositExpansionAmount; + } + + public void setDepositExpansionAmount(Long depositExpansionAmount) { + this.depositExpansionAmount = depositExpansionAmount; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public List getSkus() { + return skus; + } + + public void setSkus(List skus) { + this.skus = skus; + } + + public List getSpuAttrValues() { + return spuAttrValues; + } + + public void setSpuAttrValues(List spuAttrValues) { + this.spuAttrValues = spuAttrValues; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + public SpuActivityAppVO getSpuActivity() { + return spuActivity; + } + + public void setSpuActivity(SpuActivityAppVO spuActivity) { + this.spuActivity = spuActivity; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public GiveawayVO getGiveaway() { + return giveaway; + } + + public void setGiveaway(GiveawayVO giveaway) { + this.giveaway = giveaway; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getDepositType() { + return depositType; + } + + public void setDepositType(Integer depositType) { + this.depositType = depositType; + } + + public Date getDepositStartTime() { + return depositStartTime; + } + + public void setDepositStartTime(Date depositStartTime) { + this.depositStartTime = depositStartTime; + } + + public Date getDepositEndTime() { + return depositEndTime; + } + + public void setDepositEndTime(Date depositEndTime) { + this.depositEndTime = depositEndTime; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + @Override + public String toString() { + return "SpuAppVO{" + + "spuId=" + spuId + + ", shopId=" + shopId + + ", spuName='" + spuName + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", video='" + video + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", detail='" + detail + '\'' + + ", totalStock=" + totalStock + + ", spuAttrValues=" + spuAttrValues + + ", skus=" + skus + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplateId=" + deliveryTemplateId + + ", spuType=" + spuType + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", virtualRemark='" + virtualRemark + '\'' + + ", activityId=" + activityId + + ", saleNum=" + saleNum + + ", commentNum=" + commentNum + + ", spuActivity=" + spuActivity + + ", status=" + status + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierSpuId=" + supplierSpuId + + ", spuCode='" + spuCode + '\'' + + ", measureUnit='" + measureUnit + '\'' + + ", supplierSpuType=" + supplierSpuType + + ", giveaway=" + giveaway + + ", preSaleType=" + preSaleType + + ", depositType=" + depositType + + ", depositAmount=" + depositAmount + + ", depositExpansionAmount=" + depositExpansionAmount + + ", depositStartTime=" + depositStartTime + + ", depositEndTime=" + depositEndTime + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", comboList=" + comboList + + ", isDelivery=" + isDelivery + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffTime=" + writeOffTime + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", cityDelivery=" + cityDelivery + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuAttrValueAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuAttrValueAppVO.java new file mode 100644 index 0000000..af9eeba --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuAttrValueAppVO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.app; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品规格属性关联信息VO + * + * @author FrozenWatermelon + * @date 2021-03-03 09:00:00 + */ +public class SpuAttrValueAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "规格属性名称") + private String attrName; + + @Schema(description = "规格属性值名称") + private String attrValueName; + + @Schema(description = "规格属性描述") + private String attrDesc; + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public String getAttrDesc() { + return attrDesc; + } + + public void setAttrDesc(String attrDesc) { + this.attrDesc = attrDesc; + } + + @Override + public String toString() { + return "SpuAttrValueAppVO{" + + "attrName='" + attrName + '\'' + + ", attrValueName='" + attrValueName + '\'' + + ", attrDesc='" + attrDesc + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuTagAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuTagAppVO.java new file mode 100644 index 0000000..813acd5 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/app/SpuTagAppVO.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.app; + +import com.tmerclub.cloud.common.product.vo.SpuVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 商品分组表VO + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public class SpuTagAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分组标签id") + private Long id; + + @Schema(description = "分组标题") + private String title; + + @Schema(description = "店铺Id") + private Long shopId; + + @Schema(description = "商品列表") + private List spus; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public List getSpus() { + return spus; + } + + public void setSpus(List spus) { + this.spus = spus; + } + + @Override + public String toString() { + return "SpuTagAppVO{" + + "id=" + id + + ", title='" + title + '\'' + + ", shopId=" + shopId + + ", spus=" + spus + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/AttrSearchVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/AttrSearchVO.java new file mode 100644 index 0000000..0cf66a8 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/AttrSearchVO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public class AttrSearchVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "规格id") + private Long attrId; + + @Schema(description = "规格名") + private String attrName; + + @Schema(description = "规格值列表") + private List attrValues; + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public List getAttrValues() { + return attrValues; + } + + public void setAttrValues(List attrValues) { + this.attrValues = attrValues; + } + + @Override + public String toString() { + return "AttrVO{" + + "attrId=" + attrId + + ", attrName='" + attrName + '\'' + + ", attrValues=" + attrValues + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/BrandSearchVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/BrandSearchVO.java new file mode 100644 index 0000000..db3cbf9 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/BrandSearchVO.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public class BrandSearchVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "品牌名称") + private String brandName; + + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "品牌图片") + private String brandImg; + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getBrandImg() { + return brandImg; + } + + public void setBrandImg(String brandImg) { + this.brandImg = brandImg; + } + + @Override + public String toString() { + return "BrandVO{" + + "brandName='" + brandName + '\'' + + ", brandId=" + brandId + + ", brandImg='" + brandImg + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SearchItemVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SearchItemVO.java new file mode 100644 index 0000000..35945f6 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SearchItemVO.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public class SearchItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "品牌列表信息") + private List brands; + + public List getBrands() { + return brands; + } + + public void setBrands(List brands) { + this.brands = brands; + } + + @Override + public String toString() { + return "SearchItemVO{" + + "brands=" + brands + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SearchSpuTagVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SearchSpuTagVO.java new file mode 100644 index 0000000..162480b --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SearchSpuTagVO.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品分组信息 + * + * @author YXF + * @date 2021-06-18 15:27:24 + */ +public class SearchSpuTagVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分组id") + private Long tagId; + + @Schema(description = "序号") + private Integer seq; + + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "SpuTagVO{" + + "tagId=" + tagId + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuAdminVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuAdminVO.java new file mode 100644 index 0000000..36c8755 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuAdminVO.java @@ -0,0 +1,597 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import com.tmerclub.cloud.common.product.bo.EsBrandBO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author YXF + * @date 2021/03/16 + */ +public class SpuAdminVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "卖点" ) + private String sellingPoint; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品类型(0普通商品 1拼团 2秒杀 3积分)") + private Integer spuType; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + @Schema(description = "商品售价") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "销量") + private Integer saleNum; + + @Schema(description = "实际销量") + private Integer actualSoldNum; + + @Schema(description = "注水销量") + private Integer waterSoldNum; + + @Schema(description = "状态 -1:删除, 0:下架, 1:上架, 2:平台下架, 3: 等待审核") + private Integer spuStatus; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "序号") + private Integer seq; + + @Schema(description = "是否置顶") + private Integer isTop; + + @Schema(description = "积分价格") + private Long scoreFee; + + @Schema(description = "分销信息") + private DistributionInfoVO distributionInfo; + + @Schema(description = "分组") + private List tags; + + @Schema(description = "平台分类") + private String platformCategory; + + @Schema(description = "品牌名称") + private String brandName; + + @Schema(description = "供货价") + private Long supplyPriceFee; + + @Schema(description = "是否已导入供应商商品 0 未导入 1 已导入") + private Integer isCommission; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "代销商品规格选择状态,1: 全选 2:部分选择") + private Integer skuChoiceStatus; + + @Schema(description = "代销商品状态 1:上架 2:部分上架 3:下架 4:部分下架 ") + private Integer commissionSpuStatus; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "平台分类名称") + private String categoryNames; + + @Schema(description = "供应商商品id,只有供应商商品类型为2时才会有") + private Long supplierSpuId; + + @Schema(description = "SKU列表") + private List skuList; + + @Schema(description = "导入的商品是否已上架了,1:上架了,0:未上架") + private Integer isPut; + + @Schema(description = "代销商品id") + private Long commissionSpuId; + + @Schema(description = "品牌信息") + private EsBrandBO brand; + + @Schema(description = "品牌名称") + private EsBrandBO brandNameZh; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "代销商品上架是否提示 请完善该商品信息 1 是,0 否") + private Integer perfect; + + @Schema(description = "供应商商品更新后代销商品是否已同步更新 1:已更新 -1:未更新") + private Integer isSynUpdate; + + @Schema(description = "商家代销设置类型,0智能设价,1手动设价") + private Integer salesType; + + @Schema(description = "商家二级分类id") + private Long secondaryCategoryId; + + @Schema(description = "商品分类id") + private Long shopCategoryId; + + @Schema(description = "平台分类id") + private Long categoryId; + + @Schema(description = "SPU编码") + private String spuCode; + + @Schema(description = "SKU编码") + private String skuCode; + + @Schema(description = "平台一级分类id") + private Long primaryCategoryId; + + @Schema(description = "物流信息") + private SpuVO.DeliveryModeVO deliveryMode; + + public SpuVO.DeliveryModeVO getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(SpuVO.DeliveryModeVO deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public Long getSecondaryCategoryId() { + return secondaryCategoryId; + } + + public void setSecondaryCategoryId(Long shopSecondaryCategoryId) { + this.secondaryCategoryId = shopSecondaryCategoryId; + } + + public Integer getSalesType() { + return salesType; + } + + public void setSalesType(Integer salesType) { + this.salesType = salesType; + } + + public Integer getIsSynUpdate() { + return isSynUpdate; + } + + public void setIsSynUpdate(Integer isSynUpdate) { + this.isSynUpdate = isSynUpdate; + } + + public Integer getPerfect() { + return perfect; + } + + public void setPerfect(Integer perfect) { + this.perfect = perfect; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public EsBrandBO getBrand() { + return brand; + } + + public void setBrand(EsBrandBO brand) { + this.brand = brand; + } + + public Long getCommissionSpuId() { + return commissionSpuId; + } + + public void setCommissionSpuId(Long commissionSpuId) { + this.commissionSpuId = commissionSpuId; + } + + public Integer getIsPut() { + return isPut; + } + + public void setIsPut(Integer isPut) { + this.isPut = isPut; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Integer getCommissionSpuStatus() { + return commissionSpuStatus; + } + + public void setCommissionSpuStatus(Integer commissionSpuStatus) { + this.commissionSpuStatus = commissionSpuStatus; + } + + public String getCategoryNames() { + return categoryNames; + } + + public void setCategoryNames(String categoryNames) { + this.categoryNames = categoryNames; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + + public Integer getSkuChoiceStatus() { + return skuChoiceStatus; + } + + public void setSkuChoiceStatus(Integer skuChoiceStatus) { + this.skuChoiceStatus = skuChoiceStatus; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Integer getIsCommission() { + return isCommission; + } + + public void setIsCommission(Integer isCommission) { + this.isCommission = isCommission; + } + + public Long getSupplyPriceFee() { + return supplyPriceFee; + } + + public void setSupplyPriceFee(Long supplyPriceFee) { + this.supplyPriceFee = supplyPriceFee; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getPlatformCategory() { + return platformCategory; + } + + public void setPlatformCategory(String platformCategory) { + this.platformCategory = platformCategory; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getSkuCode() { + return skuCode; + } + + public void setSkuCode(String skuCode) { + this.skuCode = skuCode; + } + + public DistributionInfoVO getDistributionInfo() { + return distributionInfo; + } + + public void setDistributionInfo(DistributionInfoVO distributionInfo) { + this.distributionInfo = distributionInfo; + } + + public Integer getActualSoldNum() { + return actualSoldNum; + } + + public void setActualSoldNum(Integer actualSoldNum) { + this.actualSoldNum = actualSoldNum; + } + + public Integer getWaterSoldNum() { + return waterSoldNum; + } + + public void setWaterSoldNum(Integer waterSoldNum) { + this.waterSoldNum = waterSoldNum; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public EsBrandBO getBrandNameZh() { + return brandNameZh; + } + + public void setBrandNameZh(EsBrandBO brandNameZh) { + this.brandNameZh = brandNameZh; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + @Override + public String toString() { + return "SpuAdminVO{" + + "spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", spuType=" + spuType + + ", spuMold=" + spuMold + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", saleNum=" + saleNum + + ", actualSoldNum=" + actualSoldNum + + ", waterSoldNum=" + waterSoldNum + + ", spuStatus=" + spuStatus + + ", stock=" + stock + + ", seq=" + seq + + ", isTop=" + isTop + + ", scoreFee=" + scoreFee + + ", distributionInfo=" + distributionInfo + + ", tags=" + tags + + ", platformCategory='" + platformCategory + '\'' + + ", brandName='" + brandName + '\'' + + ", supplyPriceFee=" + supplyPriceFee + + ", isCommission=" + isCommission + + ", supplierName='" + supplierName + '\'' + + ", skuChoiceStatus=" + skuChoiceStatus + + ", commissionSpuStatus=" + commissionSpuStatus + + ", supplierId=" + supplierId + + ", categoryNames='" + categoryNames + '\'' + + ", supplierSpuId=" + supplierSpuId + + ", skuList=" + skuList + + ", isPut=" + isPut + + ", commissionSpuId=" + commissionSpuId + + ", brand=" + brand + + ", brandNameZh=" + brandNameZh + + ", supplierSpuType=" + supplierSpuType + + ", supplierDeliveryType=" + supplierDeliveryType + + ", perfect=" + perfect + + ", isSynUpdate=" + isSynUpdate + + ", salesType=" + salesType + + ", secondaryCategoryId=" + secondaryCategoryId + + ", shopCategoryId=" + shopCategoryId + + ", categoryId=" + categoryId + + ", spuCode='" + spuCode + '\'' + + ", skuCode='" + skuCode + '\'' + + ", primaryCategoryId=" + primaryCategoryId + + ", deliveryMode=" + deliveryMode + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuDiscountItemAppVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuDiscountItemAppVO.java new file mode 100644 index 0000000..d3fde49 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuDiscountItemAppVO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 满减满折优惠项VO + * + * @author FrozenWatermelon + * @date 2020-12-16 16:25:09 + */ +public class SpuDiscountItemAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠项id") + private Long discountItemId; + + @Schema(description = "所需需要金额") + private Long needAmount; + + @Schema(description = "优惠(元/折)9.5折就是95、9.5元就是950") + private Long discount; + + public Long getDiscountItemId() { + return discountItemId; + } + + public void setDiscountItemId(Long discountItemId) { + this.discountItemId = discountItemId; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Long getDiscount() { + return discount; + } + + public void setDiscount(Long discount) { + this.discount = discount; + } + + @Override + public String toString() { + return "DiscountItemVO{" + + "discountItemId=" + discountItemId + + ",needAmount=" + needAmount + + ",discount=" + discount + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuSearchUpdateVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuSearchUpdateVO.java new file mode 100644 index 0000000..0266022 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuSearchUpdateVO.java @@ -0,0 +1,53 @@ +package com.tmerclub.cloud.common.product.vo.search; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * es更新商品库存 + * + * @author TRACK + */ +public class SpuSearchUpdateVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "产品ID") + private Long spuId; + + @Schema(description = "商品数量") + private Integer count; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "SpuSearchUpdateVO{" + + "spuId=" + spuId + + ", count=" + count + + '}'; + } + + public SpuSearchUpdateVO() { + } + + public SpuSearchUpdateVO(Long spuId, Integer count) { + this.spuId = spuId; + this.count = count; + } +} diff --git a/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuSearchVO.java b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuSearchVO.java new file mode 100644 index 0000000..a28df48 --- /dev/null +++ b/tmerclub-common/tmerclub-common-product/src/main/java/com/tmerclub/cloud/common/product/vo/search/SpuSearchVO.java @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.product.vo.search; + +import com.tmerclub.cloud.common.product.vo.SpuActivityAppVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author FrozenWatermelon + * @date 2020/11/17 + */ +public class SpuSearchVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "卖点") + private String sellingPoint; + + @Schema(description = "店铺id") + private Long shopId; + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "商品售价") + private Long priceFee; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "是否有库存") + private Boolean hasStock; + + @Schema(description = "库存") + private Integer stock; + + @Schema(description = "销量") + private Integer saleNum; + + @Schema(description = "评论数") + private Integer commentNum; + + @Schema(description = "好评数") + private Integer goodReviewNum; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "积分价格") + private Long scoreFee; + + @Schema(description = "商品活动(满减、优惠券)") + private SpuActivityAppVO spuActivity; + + @Schema(description = "活动id(团购、秒杀)") + private Long activityId; + + @Schema(description = "活动价格") + private Long activityPrice; + + @Schema(description = "商品状态") + private Integer spuStatus; + + @Schema(description = "商品类型 0普通商品 1拼团 2秒杀 3积分") + private Integer spuType; + + @Schema(description = "商品类别") + private Integer spuMold; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "序号") + private Integer seq; + + @Schema(description = "分销信息") + private DistributionInfoVO distributionInfo; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "自营店 1:自营店 2:非自营店") + private Integer shopType; + + @Schema(description = "活动开始时间") + private Long activityStartTime; + + @Schema(description = "供应商商品id,只有供应商商品类型为2时才会有") + private Long supplierSpuId; + + @Schema(description = "发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "spu编码") + private String spuCode; + + @Schema(description = "品牌名称") + private String brandName; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "活动状态") + private Integer activityStatus; + + public Integer getActivityStatus() { + return activityStatus; + } + + public void setActivityStatus(Integer activityStatus) { + this.activityStatus = activityStatus; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public DistributionInfoVO getDistributionInfo() { + return distributionInfo; + } + + public void setDistributionInfo(DistributionInfoVO distributionInfo) { + this.distributionInfo = distributionInfo; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Boolean getHasStock() { + return hasStock; + } + + public void setHasStock(Boolean hasStock) { + this.hasStock = hasStock; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + public SpuActivityAppVO getSpuActivity() { + return spuActivity; + } + + public void setSpuActivity(SpuActivityAppVO spuActivity) { + this.spuActivity = spuActivity; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Long getActivityPrice() { + return activityPrice; + } + + public void setActivityPrice(Long activityPrice) { + this.activityPrice = activityPrice; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getGoodReviewNum() { + return goodReviewNum; + } + + public void setGoodReviewNum(Integer goodReviewNum) { + this.goodReviewNum = goodReviewNum; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getShopType() { + return shopType; + } + + public void setShopType(Integer shopType) { + this.shopType = shopType; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Long getActivityStartTime() { + return activityStartTime; + } + + public void setActivityStartTime(Long activityStartTime) { + this.activityStartTime = activityStartTime; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + @Override + public String toString() { + return "SpuSearchVO{" + + "spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", shopName='" + shopName + '\'' + + ", brandId=" + brandId + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", hasStock=" + hasStock + + ", stock=" + stock + + ", saleNum=" + saleNum + + ", commentNum=" + commentNum + + ", goodReviewNum=" + goodReviewNum + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", scoreFee=" + scoreFee + + ", spuActivity=" + spuActivity + + ", activityId=" + activityId + + ", activityPrice=" + activityPrice + + ", spuStatus=" + spuStatus + + ", spuType=" + spuType + + ", spuMold=" + spuMold + + ", supplierSpuType=" + supplierSpuType + + ", seq=" + seq + + ", distributionInfo=" + distributionInfo + + ", updateTime=" + updateTime + + ", shopType=" + shopType + + ", activityStartTime=" + activityStartTime + + ", supplierSpuId=" + supplierSpuId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", spuCode='" + spuCode + '\'' + + ", brandName='" + brandName + '\'' + + ", supplierName='" + supplierName + '\'' + + '}'; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/AuthTokenContext.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/AuthTokenContext.java new file mode 100644 index 0000000..8e18d32 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/AuthTokenContext.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security; + +import com.alibaba.ttl.TransmittableThreadLocal; + +/** + * @author xxw + * @version 1.0 + * @description: + * @since 2024/1/4 11:23 + */ +public class AuthTokenContext { + private static final ThreadLocalTOKEN_LOCAL = new TransmittableThreadLocal<>(); + + public static String getToken() { + return TOKEN_LOCAL.get(); + } + + public static void setToken(String request) { + TOKEN_LOCAL.set(request); + } + + public static void cleanToken() { + TOKEN_LOCAL.remove(); + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/AuthUserContext.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/AuthUserContext.java new file mode 100644 index 0000000..3f8ebc2 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/AuthUserContext.java @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.ttl.TransmittableThreadLocal; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.common.cache.constant.OauthCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/7/16 + */ +public class AuthUserContext { + private static final ThreadLocal UID_HOLDER = new TransmittableThreadLocal<>(); + + /** + * 获取用户登录信息 + * + * 用户端(请求一次):通过token获取uid,拆分得到 sysType、userId、accountUid(账号全局唯一id) + * 其他端(请求一次):通过token获取uid, 拆分得到 sysType、userId、accountUid(账号全局唯一id)、userName、tenantId、isAdmin、isPassShop + * + * 所以用户端的UidInfoBO中没有 bizUserId、 socialType 数据 + * 如果需要用到 bizUserId、 socialType这些数据, 请使用 TokenFeignClient.getLoginInfo() 方法 + * 设计思路: + * 1.用户端除了支付的接口外,仅用到userId, userId可以在uid中拆解获得,没有必要再去redis中获取用户的数据 + * 2.由1可知,用户端每个接口能减少一次redis请求 + */ + public static UidInfoBO get() { + return UID_HOLDER.get(); + } + + public static void set(String uid) { + UID_HOLDER.set(getUidInfo(uid)); + } + + public static void clean() { + if (UID_HOLDER.get() != null) { + UID_HOLDER.remove(); + } + } + + public static void set(UidInfoBO uidInfoBo) { + UID_HOLDER.set(uidInfoBo); + } + + /** + * 获取系统类型 + * @return + */ + public static Integer getSysType() { + return get().getSysType(); + } + + /** + * 获取系统内账号唯一id + * @return + */ + public static Long getAccountUid() { + return get().getAccountUid(); + } + + /** + * 获取userId(用户端) + * @return + */ + public static Long getUserId() { + return get().getUserId(); + } + + /** + * 获取商家端EmployeeId + * @return + */ + public static Long getEmployeeId() { + return getUserId(); + } + + /** + * 获取平台端系统用户id + * @return + */ + public static Long getSysUserId() { + return getUserId(); + } + + /** + * 获取店铺Id + * @return + */ + public static Long getShopId() { + return get().getTenantId(); + } + + /** + * 获取供应商id + * @return + */ + public static Long getSupplierId() { + return get().getTenantId(); + } + + /** + * 获取自提点Id + * @return + */ + public static Long getStationId() { + return getUserId(); + } + + public static String getUid() { + return getUid(get()); + } + + public static Integer getIsAdmin() { + return get().getIsAdmin(); + } + + /** + * 获取用户名称 + * @return + */ + public static String getUserName() { + String uid = getUid(get()); + UidInfoBO infoBO = JSONObject.parseObject(RedisUtil.get(OauthCacheNames.USER_INFO + uid), UidInfoBO.class); + return infoBO.getUsername(); + } + + + /** + * 生成各系统唯一uid + * @param uidInfoBo uid含有的信息 + * @return + */ + public static String getUid(UidInfoBO uidInfoBo) { + + StringBuilder sb = new StringBuilder(); + // uidInfoArray[0] + sb.append(uidInfoBo.getSysType()) + // uidInfoArray[1] + .append(Constant.UNDERLINE).append(uidInfoBo.getAccountUid()) + // uidInfoArray[2] + .append(Constant.UNDERLINE).append(uidInfoBo.getUserId()); + + if (Objects.equals(uidInfoBo.getSysType(), SysTypeEnum.ORDINARY.value())) { + return sb.toString(); + } + // uidInfoArray[3] + sb.append(Constant.UNDERLINE).append(uidInfoBo.getTenantId()) + // uidInfoArray[4] + .append(Constant.UNDERLINE).append(uidInfoBo.getIsAdmin()) + // uidInfoArray[5] + .append(Constant.UNDERLINE).append(uidInfoBo.getIsPassShop()); + return sb.toString(); + } + + /** + * 根据uid获取用户信息 + * @param uid + * @return + */ + public static UidInfoBO getUidInfo(String uid) { + String[] uidInfoArray = uid.split(Constant.UNDERLINE); + UidInfoBO uidInfoBO = new UidInfoBO(Integer.valueOf(uidInfoArray[0]), Long.parseLong(uidInfoArray[1]),Long.parseLong(uidInfoArray[2])); + + if (Objects.equals(uidInfoBO.getSysType(), SysTypeEnum.ORDINARY.value())) { + return uidInfoBO; + } + Long tenantId = Long.valueOf(uidInfoArray[3]); + // 未注册的商家端、供应商端从缓存获取最新数据 + if (tenantId == -1) { + UidInfoBO infoBO = JSONObject.parseObject(RedisUtil.get(OauthCacheNames.USER_INFO + uid), UidInfoBO.class); + return infoBO; + } + uidInfoBO.setTenantId(Long.valueOf(uidInfoArray[3])); + uidInfoBO.setIsAdmin(Integer.valueOf(uidInfoArray[4])); + uidInfoBO.setIsPassShop(Integer.valueOf(uidInfoArray[5])); + return uidInfoBO; + } + +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/DefaultAuthConfigAdapter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/DefaultAuthConfigAdapter.java new file mode 100644 index 0000000..3d2840c --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/DefaultAuthConfigAdapter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.adapter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + * @author FrozenWatermelon + * @date 2020/7/16 + */ +public class DefaultAuthConfigAdapter implements AuthConfigAdapter { + + static final Set SET; + + static { + SET = new CopyOnWriteArraySet<>(); + SET.add(EXTERNAL_URI); + SET.add(DOC_URI); + // 容器存活检查探针、容器就绪检查探针 + SET.add("/actuator/health/liveness"); + SET.add("/actuator/health/readiness"); + // 生成jsapi签名接口不需要授权 + SET.add("/wx/jsapi/createJsapiSignature"); + } + + private static final Logger logger = LoggerFactory.getLogger(DefaultAuthConfigAdapter.class); + + public DefaultAuthConfigAdapter() { + logger.info("not implement other AuthConfigAdapter, use DefaultAuthConfigAdapter... all url need auth..."); + } + + + @Override + public List pathPatterns() { + return Collections.singletonList("/*"); + } + + @Override + public Set excludePathPatterns(String... paths) { + if (paths.length == 0) { + return SET; + } + SET.addAll(Arrays.asList(paths)); + return SET; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/DefaultSignAuthAdapter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/DefaultSignAuthAdapter.java new file mode 100644 index 0000000..c708293 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/DefaultSignAuthAdapter.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.adapter; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.Objects; + +/** + * @author TRACK + */ +@Component +public class DefaultSignAuthAdapter { + private static final Logger logger = LoggerFactory.getLogger(DefaultSignAuthAdapter.class); + + @DubboReference + private AccountFeignClient accountFeignClient; + + public ServerResponseEntity loadUserInfoInToken(Map dataMap) { + UidInfoBO uidInfoBO = new UidInfoBO(); + if (dataMap.isEmpty()) { + return ServerResponseEntity.success(uidInfoBO); + } + Object sysType = dataMap.get("sysType"); + if (Objects.isNull(sysType) || Objects.isNull(SysTypeEnum.instance(sysType.toString()))) { + return ServerResponseEntity.showFailMsg("sysType is empty or wrong"); + } + SysTypeEnum sysTypeEnum = SysTypeEnum.instance(sysType.toString()); + ServerResponseEntity response = getUserInfoInTokenServerResponseEntity(dataMap, uidInfoBO, sysTypeEnum); + if (Objects.nonNull(response)) { + return response; + } + return ServerResponseEntity.success(uidInfoBO); + } + + private ServerResponseEntity getUserInfoInTokenServerResponseEntity(Map dataMap, UidInfoBO uidInfoBO, SysTypeEnum sysTypeEnum) { + // 用户端 + if (Objects.equals(sysTypeEnum, SysTypeEnum.ORDINARY)) { + logger.info("用户端签名验签:{}", dataMap); + Object userIdObj = dataMap.get("userId"); + if (Objects.nonNull(userIdObj) && StrUtil.isNotBlank(userIdObj.toString())) { + ServerResponseEntity response = accountFeignClient.getByUserIdAndType(Long.valueOf(userIdObj.toString()), SysTypeEnum.ORDINARY.value()); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg(response.getMsg()); + } + if (Objects.isNull(response.getData())) { + return ServerResponseEntity.showFailMsg("userId is error"); + } + getUserToken(uidInfoBO, response); + } + } + // 商家 + else if (Objects.equals(sysTypeEnum, SysTypeEnum.MULTISHOP)) { + logger.info("商家端签名验签:{}", dataMap); + long shopId = getShopId(dataMap); + // 默认是店铺超级管理员 + ServerResponseEntity response = accountFeignClient.getBySysTypeAndIsAdminAndTenantId(SysTypeEnum.MULTISHOP.value(), 1, shopId); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg(response.getMsg()); + } + if (Objects.isNull(response.getData())) { + return ServerResponseEntity.showFailMsg("shopId is error"); + } + getTenantUserInfoToken(uidInfoBO, sysTypeEnum, response, shopId); + } + // 平台 + else if (Objects.equals(sysTypeEnum, SysTypeEnum.PLATFORM)) { + logger.info("平台端签名验签:{}", dataMap); + long sysUserId = getSysUserId(dataMap); + ServerResponseEntity response = accountFeignClient.getByUserIdAndType(sysUserId, SysTypeEnum.PLATFORM.value()); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg(response.getMsg()); + } + if (Objects.isNull(response.getData())) { + return ServerResponseEntity.showFailMsg("sysUserId is error"); + } + getPlatformToken(uidInfoBO, response); + } + // 供应商 + else if (Objects.equals(sysTypeEnum, SysTypeEnum.SUPPLIER)) { + logger.info("供应商端签名验签:{}", dataMap); + Object supplierIdObj = dataMap.get("supplierId"); + if (Objects.nonNull(supplierIdObj) && StrUtil.isNotBlank(supplierIdObj.toString())) { + Long supplierId = Long.valueOf(supplierIdObj.toString()); + // 默认是超级管理员 + ServerResponseEntity response = accountFeignClient.getBySysTypeAndIsAdminAndTenantId(SysTypeEnum.SUPPLIER.value(), 1, supplierId); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg(response.getMsg()); + } + if (Objects.isNull(response.getData())) { + return ServerResponseEntity.showFailMsg("supplierId is error"); + } + getTenantUserInfoToken(uidInfoBO, sysTypeEnum, response, supplierId); + } + } + // 自提 + else if (Objects.equals(sysTypeEnum, SysTypeEnum.STATION)) { + logger.info("自提端签名验签:{}", dataMap); + Object stationIdObj = dataMap.get("stationId"); + if (Objects.nonNull(stationIdObj) && StrUtil.isNotBlank(stationIdObj.toString())) { + Long stationId = Long.valueOf(stationIdObj.toString()); + // 默认是超级管理员 + ServerResponseEntity response = accountFeignClient.getBySysTypeAndIsAdminAndTenantId(sysTypeEnum.value(), 1, stationId); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg(response.getMsg()); + } + if (Objects.isNull(response.getData())) { + return ServerResponseEntity.showFailMsg("stationId is error"); + } + getTenantUserInfoToken(uidInfoBO, sysTypeEnum, response, stationId); + } + } + return null; + } + + private static long getShopId(Map dataMap) { + Object shopIdObj = dataMap.get("shopId"); + long shopId = Constant.MAIN_SHOP; + if (Objects.nonNull(shopIdObj) && StrUtil.isNotBlank(shopIdObj.toString())) { + shopId = Long.parseLong(shopIdObj.toString()); + } + return shopId; + } + + private static long getSysUserId(Map dataMap) { + Object sysUserIdObj = dataMap.get("sysUserId"); + // 默认是平台超级管理员 + long sysUserId = Constant.SUPER_ADMIN_ID; + if (Objects.nonNull(sysUserIdObj) && StrUtil.isNotBlank(sysUserIdObj.toString())) { + sysUserId = Long.parseLong(sysUserIdObj.toString()); + } + return sysUserId; + } + + private static void getUserToken(UidInfoBO uidInfoBO, ServerResponseEntity response) { + AuthAccountVO authAccountVO = response.getData(); + uidInfoBO.setUserId(authAccountVO.getUserId()); + uidInfoBO.setAccountUid(authAccountVO.getUid()); + uidInfoBO.setIsAdmin(0); + uidInfoBO.setUsername(authAccountVO.getUsername()); + uidInfoBO.setSysType(SysTypeEnum.ORDINARY.value()); + } + + private static void getPlatformToken(UidInfoBO uidInfoBO, ServerResponseEntity response) { + AuthAccountVO authAccountVO = response.getData(); + uidInfoBO.setUserId(authAccountVO.getUserId()); + uidInfoBO.setTenantId(Constant.PLATFORM_SHOP_ID); + uidInfoBO.setAccountUid(authAccountVO.getUid()); + uidInfoBO.setIsAdmin(authAccountVO.getIsAdmin()); + uidInfoBO.setUsername(authAccountVO.getUsername()); + uidInfoBO.setSysType(SysTypeEnum.PLATFORM.value()); + } + + private static void getTenantUserInfoToken(UidInfoBO uidInfoBO, SysTypeEnum sysTypeEnum, ServerResponseEntity response, Long tenantId) { + AuthAccountVO authAccountVO = response.getData(); + uidInfoBO.setUserId(authAccountVO.getUserId()); + uidInfoBO.setTenantId(tenantId); + uidInfoBO.setAccountUid(authAccountVO.getUid()); + uidInfoBO.setIsAdmin(1); + uidInfoBO.setUsername(authAccountVO.getUsername()); + uidInfoBO.setIsPassShop(authAccountVO.getIsPassShop()); + uidInfoBO.setSysType(sysTypeEnum.value()); + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/LuckWebSecurityConfigurerAdapter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/LuckWebSecurityConfigurerAdapter.java new file mode 100644 index 0000000..7a89da1 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/adapter/LuckWebSecurityConfigurerAdapter.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.adapter; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.web.cors.CorsUtils; + +/** + * 使用security的防火墙功能,但不使用security的认证授权登录 + * + * @author FrozenWatermelon + */ +@Configuration +@EnableWebSecurity +public class LuckWebSecurityConfigurerAdapter { + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + // We don't need CSRF for token based authentication + return http.csrf().disable().cors() + .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and().authorizeHttpRequests().requestMatchers(CorsUtils::isPreFlightRequest).permitAll() + .and() + .authorizeHttpRequests().requestMatchers( + "/**").permitAll().and().build(); + } +} \ No newline at end of file diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/AuthAccountInVerifyBO.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/AuthAccountInVerifyBO.java new file mode 100644 index 0000000..9754a07 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/bo/AuthAccountInVerifyBO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.bo; + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用于校验的用户信息 + * + * @author FrozenWatermelon + * @date 2020/7/3 + */ +public class AuthAccountInVerifyBO extends UidInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String password; + + private Integer status; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "AuthAccountInVerifyBO{" + + "password='" + password + '\'' + + ", status=" + status + + "} " + super.toString(); + } + + +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/AuthConfig.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/AuthConfig.java new file mode 100644 index 0000000..68447cf --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/config/AuthConfig.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.config; + +import cn.hutool.core.util.ArrayUtil; +import com.tmerclub.cloud.common.security.adapter.AuthConfigAdapter; +import com.tmerclub.cloud.common.security.adapter.DefaultAuthConfigAdapter; +import com.tmerclub.cloud.common.security.filter.AuthFilter; +import jakarta.servlet.DispatcherType; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * 授权配置 + * + * @author FrozenWatermelon + * @date 2020/7/11 + */ +@Configuration +public class AuthConfig { + + @Bean + @ConditionalOnMissingBean + public AuthConfigAdapter authConfigAdapter() { + return new DefaultAuthConfigAdapter(); + } + + @Bean + @Lazy + public FilterRegistrationBean filterRegistration(AuthConfigAdapter authConfigAdapter, AuthFilter authFilter) { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + // 添加过滤器 + registration.setFilter(authFilter); + // 设置过滤路径,/*所有路径 + registration.addUrlPatterns(ArrayUtil.toArray(authConfigAdapter.pathPatterns(), String.class)); + registration.setName("authFilter"); + // 设置优先级 + registration.setOrder(0); + registration.setDispatcherTypes(DispatcherType.REQUEST); + return registration; + } + +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/constant/InputUserNameEnum.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/constant/InputUserNameEnum.java new file mode 100644 index 0000000..fa4adab --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/constant/InputUserNameEnum.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.common.security.constant; + +/** + * 输入的用户名类型枚举 1.username 2.mobile 3.email + * + * @author FrozenWatermelon + * @date 2020/7/3 + */ +public enum InputUserNameEnum { + + /** + * 用户名 + */ + USERNAME(1), + + /** + * 手机号 + */ + PHONE(2), + + /** + * 邮箱 + */ + EMAIL(3), + ; + + private final Integer value; + + public Integer value() { + return value; + } + + InputUserNameEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/UserInfoConsumerFilter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/UserInfoConsumerFilter.java new file mode 100644 index 0000000..ceabf05 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/UserInfoConsumerFilter.java @@ -0,0 +1,46 @@ +package com.tmerclub.cloud.common.security.filter.dubbo; + + +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.platform.vo.UriPermissionVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.security.AuthTokenContext; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.security.PmsContext; +import io.seata.core.constants.DubboConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.rpc.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + + +/** + * @author lanhai + */ +@Activate(group = DubboConstants.CONSUMER) +public class UserInfoConsumerFilter implements Filter { + + private static final Logger LOGGER = LoggerFactory.getLogger(UserInfoConsumerFilter.class); + + @Override + public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + UidInfoBO uidInfoBO = AuthUserContext.get(); + String token = AuthTokenContext.getToken(); + List uriPermissionVOList = PmsContext.get(); + invocation.setObjectAttachment(Constant.DUBBO_LANG_KEY, I18nMessage.getLang()); + if (uriPermissionVOList != null) { + invocation.setObjectAttachment(Constant.DUBBO_PREMS_KEY, uriPermissionVOList); + } + if (token != null) { + invocation.setObjectAttachment(Constant.DUBBO_TOKEN_KEY, token); + } + if (uidInfoBO != null) { + invocation.setObjectAttachment(Constant.DUBBO_USER_KEY, uidInfoBO); + } + Result invoke = invoker.invoke(invocation); + return invoke; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/UserInfoProviderFilter.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/UserInfoProviderFilter.java new file mode 100644 index 0000000..5776882 --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/filter/dubbo/UserInfoProviderFilter.java @@ -0,0 +1,56 @@ +package com.tmerclub.cloud.common.security.filter.dubbo; + +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.platform.vo.UriPermissionVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.security.AuthTokenContext; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.security.PmsContext; +import io.seata.core.constants.DubboConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.rpc.Filter; +import org.apache.dubbo.rpc.Invocation; +import org.apache.dubbo.rpc.Invoker; +import org.apache.dubbo.rpc.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.i18n.LocaleContextHolder; + +import java.util.Locale; +import java.util.Objects; + + +/** + * @author lanhai + */ +@Activate(group = DubboConstants.PROVIDER) +public class UserInfoProviderFilter implements Filter { + + private static final Logger LOGGER = LoggerFactory.getLogger(UserInfoConsumerFilter.class); + + @Override + public Result invoke(Invoker invoker, Invocation invocation) { + UidInfoBO uidInfoBO = (UidInfoBO) invocation.getObjectAttachment(Constant.DUBBO_USER_KEY); + Object lang = invocation.getObjectAttachment(Constant.DUBBO_LANG_KEY); + Object token = invocation.getObjectAttachment(Constant.DUBBO_TOKEN_KEY); + Object premsObject = invocation.getObjectAttachment(Constant.DUBBO_PREMS_KEY); + if (Objects.nonNull(lang)) { + // 设置国际化语言 + Locale locale = new Locale(LanguageEnum.valueOf(Integer.parseInt(lang.toString())).getLanguage()); + LocaleContextHolder.setLocale(locale); + } + if (premsObject != null) { + PmsContext.set(JSON.parseArray(premsObject.toString(), UriPermissionVO.class)); + } + if (token != null) { + AuthTokenContext.setToken(token.toString()); + } + if (uidInfoBO != null) { + AuthUserContext.set(uidInfoBO); + } + Result invoke = invoker.invoke(invocation); + return invoke; + } +} diff --git a/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/util/SignUtils.java b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/util/SignUtils.java new file mode 100644 index 0000000..f7a412b --- /dev/null +++ b/tmerclub-common/tmerclub-common-security/src/main/java/com/tmerclub/cloud/common/security/util/SignUtils.java @@ -0,0 +1,194 @@ +package com.tmerclub.cloud.common.security.util; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestAlgorithm; +import cn.hutool.crypto.digest.Digester; +import cn.hutool.http.ContentType; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.platform.feign.SysAccessKeyFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysAccessKeyVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.bo.SignResponse; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.wrapper.RequestWrapper; +import jakarta.servlet.http.HttpServletRequest; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.TreeMap; + +/** + * 签名工具类 + * + * @author TRACK + */ +@SuppressWarnings("unchecked") +@Component +public class SignUtils { + + private static final Logger logger = LoggerFactory.getLogger(SignUtils.class); + + public static final String GRANT_TYPE = "grantType"; + + public static final String GRANT_TYPE_VALUE = "sign"; + + private static final long TEN_MINUTES = 1000 * 60 * 10; + + /** + * 签名,通过签名机制,防止应用的请求参数被非法篡改,业务系统必须保证该值不被泄露。 + */ + public static final String SIGN = "sign"; + + /** + * 分配给应用的系统编号 + */ + public static final String APP_ID = "appId"; + + /** + * 分配给应用的系统密钥 + */ + public static final String APP_SECRET = "appSecret"; + + /** + * 请求的时间戳,接入系统的时间误差不能超过 10 分钟 + */ + public static final String TIMESTAMP = "timestamp"; + + /** + * 真正请求的数据 + */ + public static final String DATA = "data"; + + @DubboReference + private SysAccessKeyFeignClient sysAccessKeyFeignClient; + + + /** + * 验签方法 + */ + public ServerResponseEntity verify(HttpServletRequest req) throws IOException { + // 这里的param map是包含sign, timestamp等信息的,如果是json形式那么data在下一层,如果不是就在同一层 + TreeMap paramMap; + // data所在那一层的map数据 + Map dataMap; + if (StrUtil.isNotBlank(req.getContentType()) && req.getContentType().contains(ContentType.JSON.getValue())) { + RequestWrapper requestWrapper = new RequestWrapper(req); + String body = requestWrapper.getBody(); + // 签名是有顺序的 + paramMap = Json.parseObject(body, TreeMap.class); + dataMap = (Map) paramMap.get(DATA); + requestWrapper.setBody(Json.toJsonString(dataMap)); + // 这里改写了请求将data里面的数据发送到controller + req = requestWrapper; + } else { + paramMap = new TreeMap<>(req.getParameterMap()); + for (Map.Entry objectEntry : paramMap.entrySet()) { + String[] list = (String[]) objectEntry.getValue(); + if (list.length == 1) { + paramMap.put(objectEntry.getKey(), list[0]); + continue; + } + Arrays.sort(list); + } + dataMap = paramMap; + } + ServerResponseEntity verifyResponse = verify(paramMap); + if (!verifyResponse.isSuccess()) { + return verifyResponse; + } + SignResponse signResponse = verifyResponse.getData(); + signResponse.setReq(req); + signResponse.setDataMap(dataMap); + return ServerResponseEntity.success(signResponse); + } + + /** + * 校验参数,如果校验成功则返回data数据信息 + * + * @return + */ + public ServerResponseEntity verify(TreeMap paramMap) { + SignResponse signResponse = new SignResponse(); + + try { + String appId = (String) paramMap.get(APP_ID); + if (StrUtil.isBlank(appId)) { + return ServerResponseEntity.showFailMsg("appid missing").setData(signResponse); + } + ServerResponseEntity response = sysAccessKeyFeignClient.getByAccessId(appId); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg("sign error").setData(signResponse); + } + SysAccessKeyVO sysAccessKey = response.getData(); + if (sysAccessKey == null) { + return ServerResponseEntity.showFailMsg("appid error").setData(signResponse); + } + signResponse.setSysAccessKeyVO(sysAccessKey); + // 签名 + String sign = (String) paramMap.get(SIGN); + // 移除签名 + paramMap.remove(SIGN); + // 移除appId + paramMap.remove(APP_ID); + // 用密钥来做签名 + paramMap.put(APP_SECRET, sysAccessKey.getAccessKey()); + signResponse.setAppSecret(sysAccessKey.getAccessKey()); + + + long currentTimeMillis = System.currentTimeMillis(); + long timestamp = Long.parseLong(paramMap.get(TIMESTAMP).toString()); + // 签名时间大于十分钟,提示签名超时 + if (timestamp + TEN_MINUTES < currentTimeMillis) { + return ServerResponseEntity.showFailMsg("The request time has exceeded ten minutes").setData(signResponse); + } + // 生成签名 + Digester sha256 = new Digester(DigestAlgorithm.SHA256); + String sysSign = sha256.digestHex(Json.toJsonString(paramMap)); + + // 进行验签 + if (!Objects.equals(sign, sysSign)) { + return ServerResponseEntity.showFailMsg("sign error").setData(signResponse); + } + + if (Objects.equals(sysAccessKey.getSysType(), SysTypeEnum.MULTISHOP.value())) { + // 有没有这加店铺的管理权限 + if(!Objects.equals(sysAccessKey.getUsabilityShopId(),0L) + && !Objects.equals(sysAccessKey.getUsabilityShopId(),Long.valueOf(paramMap.get("shopId").toString()))){ + return ServerResponseEntity.showFailMsg("shop unauthorized").setData(signResponse); + } + } + if (Objects.equals(sysAccessKey.getSysType(), SysTypeEnum.SUPPLIER.value())) { + // 有没有这加供应商的管理权限 + if(!Objects.equals(sysAccessKey.getUsabilityShopId(),0L) + && !Objects.equals(sysAccessKey.getUsabilityShopId(),Long.valueOf(paramMap.get("supplierId").toString()))){ + return ServerResponseEntity.showFailMsg("supplier unauthorized").setData(signResponse); + } + } + } catch (Exception e) { + logger.info("sign verify error : {}", e.getMessage()); + return ServerResponseEntity.showFailMsg("system error").setData(signResponse); + } + return ServerResponseEntity.success(signResponse); + } + + public static String sign(String appSecret, Long timestamp, Object data) { + + Map requestMap = new TreeMap<>(); + requestMap.put(TIMESTAMP, timestamp); + requestMap.put(APP_SECRET, appSecret); + requestMap.put(DATA, data); + + // 签名 + Digester sha256 = new Digester(DigestAlgorithm.SHA256); + String sign = sha256.digestHex(Json.toJsonString(requestMap)); + // 请求数据添加签名和账号id + requestMap.put("sign", sign); + return sign; + } +} diff --git a/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/order/CustomTableComplexKeysShardingAlgorithm.java b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/order/CustomTableComplexKeysShardingAlgorithm.java new file mode 100644 index 0000000..e018b08 --- /dev/null +++ b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/order/CustomTableComplexKeysShardingAlgorithm.java @@ -0,0 +1,109 @@ +package com.tmerclub.cloud.common.sharding.proxy.order; + +import com.tmerclub.cloud.common.sharding.proxy.ShardingAlgorithmHelper; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm; +import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue; + +import java.util.Collection; + +/** + * 自定义复合分表策略算法 + * @author FrozenWatermelon + * @version 1.0 + */ +public class CustomTableComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm { + + /** + * 分片键优先级依次为: + * order_id、user_id、refund_id + * 维度,订单号、售后单号,他们的三个字段的后三位都是userid后三位 + * 虽然是多字段路由,但最后都是取的userId的后三位 + * + * @param tableNames 表名 + * @param shardingValue 分片键信息 + * @return 匹配的数据源集合 + */ + @Override + public Collection doSharding(Collection tableNames, + ComplexKeysShardingValue shardingValue) { + Collection orderIds = shardingValue.getColumnNameAndShardingValuesMap().get("order_id"); + if (CollectionUtils.isNotEmpty(orderIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderIds); + } + Collection orderItemIds = shardingValue.getColumnNameAndShardingValuesMap().get("order_item_id"); + if (CollectionUtils.isNotEmpty(orderItemIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderItemIds); + } + Collection orderInvoiceIds = shardingValue.getColumnNameAndShardingValuesMap().get("order_invoice_id"); + if (CollectionUtils.isNotEmpty(orderInvoiceIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderInvoiceIds); + } + Collection giveawayOrderItemIds = shardingValue.getColumnNameAndShardingValuesMap().get("giveaway_order_item_id"); + if (CollectionUtils.isNotEmpty(giveawayOrderItemIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, giveawayOrderItemIds); + } + Collection settlementIds = shardingValue.getColumnNameAndShardingValuesMap().get("settlement_id"); + if (CollectionUtils.isNotEmpty(settlementIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, settlementIds); + } + Collection userIds = shardingValue.getColumnNameAndShardingValuesMap().get("user_id"); + if (CollectionUtils.isNotEmpty(userIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, userIds); + } + Collection refundIds = shardingValue.getColumnNameAndShardingValuesMap().get("refund_id"); + if (CollectionUtils.isNotEmpty(refundIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, refundIds); + } + Collection orderAddrIds = shardingValue.getColumnNameAndShardingValuesMap().get("order_addr_id"); + if (CollectionUtils.isNotEmpty(orderAddrIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderAddrIds); + } + Collection orderPreSaleInfoIds = shardingValue.getColumnNameAndShardingValuesMap().get("order_pre_sale_info_id"); + if (CollectionUtils.isNotEmpty(orderPreSaleInfoIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderPreSaleInfoIds); + } + Collection purchaseOrderIds = shardingValue.getColumnNameAndShardingValuesMap().get("purchase_order_id"); + if (CollectionUtils.isNotEmpty(purchaseOrderIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, purchaseOrderIds); + } + Collection purchaseItemIds = shardingValue.getColumnNameAndShardingValuesMap().get("purchase_item_id"); + if (CollectionUtils.isNotEmpty(purchaseItemIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, purchaseItemIds); + } + Collection purchaseOrderAddrIds = shardingValue.getColumnNameAndShardingValuesMap().get("purchase_order_addr_id"); + if (CollectionUtils.isNotEmpty(purchaseOrderAddrIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, purchaseOrderAddrIds); + } + Collection orderSelfStationIds = shardingValue.getColumnNameAndShardingValuesMap().get("order_self_station_id"); + if (CollectionUtils.isNotEmpty(orderSelfStationIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderSelfStationIds); + } + Collection orderVirtualInfoIds = shardingValue.getColumnNameAndShardingValuesMap().get("order_virtual_info_id"); + if (CollectionUtils.isNotEmpty(orderVirtualInfoIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderVirtualInfoIds); + } + Collection deliveryOrderIds = shardingValue.getColumnNameAndShardingValuesMap().get("delivery_order_id"); + if (CollectionUtils.isNotEmpty(deliveryOrderIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, deliveryOrderIds); + } + Collection deliveryOrderItemIds = shardingValue.getColumnNameAndShardingValuesMap().get("delivery_order_item_id"); + if (CollectionUtils.isNotEmpty(deliveryOrderItemIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, deliveryOrderItemIds); + } + Collection shopIds = shardingValue.getColumnNameAndShardingValuesMap().get("shop_id"); + if (CollectionUtils.isNotEmpty(shopIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, shopIds); + } + Collection allotOrderIds = shardingValue.getColumnNameAndShardingValuesMap().get("allot_order_id"); + if (CollectionUtils.isNotEmpty(allotOrderIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, allotOrderIds); + } + Collection allotOrderItemIds = shardingValue.getColumnNameAndShardingValuesMap().get("allot_order_item_id"); + if (CollectionUtils.isNotEmpty(allotOrderItemIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, allotOrderItemIds); + } + return null; + } + +} diff --git a/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/payment/CustomTableComplexKeysShardingAlgorithm.java b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/payment/CustomTableComplexKeysShardingAlgorithm.java new file mode 100644 index 0000000..d21b97d --- /dev/null +++ b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/java/com/tmerclub/cloud/common/sharding/proxy/payment/CustomTableComplexKeysShardingAlgorithm.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.common.sharding.proxy.payment; + +import com.tmerclub.cloud.common.sharding.proxy.ShardingAlgorithmHelper; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm; +import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue; + +import java.util.Collection; + +/** + * 自定义复合分表策略算法 + * @author FrozenWatermelon + * @version 1.0 + */ +public class CustomTableComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm { + + /** + * 分片键优先级依次为: + * order_id、user_id、refund_id + * 维度,订单号、售后单号,他们的三个字段的后三位都是userid后三位 + *

+ * 虽然是多字段路由,但最后都是取的userId的后三位 + * + * @param tableNames 表名 + * @param shardingValue 分片键信息 + * @return 匹配的数据源集合 + */ + @Override + public Collection doSharding(Collection tableNames, + ComplexKeysShardingValue shardingValue) { + Collection orderIdList = shardingValue.getColumnNameAndShardingValuesMap().get("order_id"); + Collection payIds = shardingValue.getColumnNameAndShardingValuesMap().get("pay_id"); + Collection userIds = shardingValue.getColumnNameAndShardingValuesMap().get("user_id"); + Collection refundIds = shardingValue.getColumnNameAndShardingValuesMap().get("refund_id"); + + if (CollectionUtils.isNotEmpty(orderIdList)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, orderIdList); + } + if (CollectionUtils.isNotEmpty(payIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, payIds); + } + + if (CollectionUtils.isNotEmpty(userIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, userIds); + } + + if (CollectionUtils.isNotEmpty(refundIds)) { + return ShardingAlgorithmHelper.getTableNames(tableNames, refundIds); + } + return null; + } + + + +} diff --git a/tmerclub-common/tmerclub-common-sharding-proxy/src/main/resources/META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/resources/META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm new file mode 100644 index 0000000..38f3a03 --- /dev/null +++ b/tmerclub-common/tmerclub-common-sharding-proxy/src/main/resources/META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm @@ -0,0 +1,3 @@ +com.tmerclub.cloud.common.sharding.proxy.order.CustomTableComplexKeysShardingAlgorithm + +com.tmerclub.cloud.common.sharding.proxy.payment.CustomTableComplexKeysShardingAlgorithm \ No newline at end of file diff --git a/tmerclub-flow/Dockerfile b/tmerclub-flow/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-flow/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/FlowApplication.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/FlowApplication.java new file mode 100644 index 0000000..b8e88c2 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/FlowApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/11/19 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class FlowApplication { + + public static void main(String[] args) { + SpringApplication.run(FlowApplication.class, args); + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowLogBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowLogBO.java new file mode 100644 index 0000000..acc0533 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowLogBO.java @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户流量记录 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@Document("flow_user_log") +public class FlowLogBO implements Serializable{ + + /** + * operateId + */ + private Long oid; + + /** + * systemType: 系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios + */ + private Integer st; + + /** + * pageId: 页面id + */ + private Integer pid; + + /** + * visitEvent: 访问事件 1:页面访问 2:加购 3:收藏 4:提交订单 5:支付成功 6: 申请退款 + */ + private Integer ve; + + /** + * 店铺id, 平台传0 + */ + private Integer sid; + + /** + * 业务id + */ + private Long bid; + + /** + * step: 用户操作步骤数 + */ + private Integer s; + + /** + * nums: 用户操作数量 + */ + private Integer n; + + /** + * 用户id + */ + private Long uid; + + /** + * 用户登陆ip + */ + private Long ip; + + /** + * 日期时间 datetime + */ + private Date dt; + + public Long getOid() { + return oid; + } + + public void setOid(Long oid) { + this.oid = oid; + } + + public Integer getSt() { + return st; + } + + public void setSt(Integer st) { + this.st = st; + } + + public Integer getPid() { + return pid; + } + + public void setPid(Integer pid) { + this.pid = pid; + } + + public Integer getVe() { + return ve; + } + + public void setVe(Integer ve) { + this.ve = ve; + } + + public Integer getSid() { + return sid; + } + + public void setSid(Integer sid) { + this.sid = sid; + } + + public Long getBid() { + return bid; + } + + public void setBid(Long bid) { + this.bid = bid; + } + + public Integer getS() { + return s; + } + + public void setS(Integer s) { + this.s = s; + } + + public Integer getN() { + return n; + } + + public void setN(Integer n) { + this.n = n; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Long getIp() { + return ip; + } + + public void setIp(Long ip) { + this.ip = ip; + } + + public Date getDt() { + return dt; + } + + public void setDt(Date dt) { + this.dt = dt; + } + + @Override + public String toString() { + return "FlowLogBO{" + + "oid=" + oid + + ", st=" + st + + ", pid=" + pid + + ", ve=" + ve + + ", sid=" + sid + + ", bid='" + bid + '\'' + + ", s=" + s + + ", n=" + n + + ", uid='" + uid + '\'' + + ", ip=" + ip + + ", dt=" + dt + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowRegionalBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowRegionalBO.java new file mode 100644 index 0000000..b05f803 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowRegionalBO.java @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 区域统计 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "data_type_province_idx", def = "{'dateType':1, 'provinceId':1}") +}) +@Document("flow_regional") +public class FlowRegionalBO extends BaseModel implements Serializable { + + public static final Integer ID_LENGTH = 9; + + /** + * id: 日期(yyMMdd)+ 时间类型 + 省id + * 长度:8位 + */ + @Id + private Integer id; + + /** + * 日、周、月 + */ + private Integer dateType; + + /** + * 省id + */ + private Integer provinceId; + + /** + * 浏览量 + */ + private Integer visitNum; + + /** + * 访客数 + */ + private Integer visitUserNum; + + /** + * 商品浏览量 + */ + private Integer spuVisitNum; + + /** + * 商品访客数 + */ + private Integer spuVisitUserNum; + + /** + * 加购用户数量 + */ + private Integer plusShopCartUserNum; + + /** + * 加购数量 + */ + private Long plusShopCartNum; + + /** + * 下单用户数 + */ + private Integer placeOrderUserNum; + + /** + * 支付用户数 + */ + private Integer payUserNum; + + /** + * 下单金额 + */ + private Long placeOrderAmount; + + /** + * 支付金额 + */ + private Long payAmount; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Integer getProvinceId() { + return provinceId; + } + + public void setProvinceId(Integer provinceId) { + this.provinceId = provinceId; + } + + public Integer getVisitNum() { + return visitNum; + } + + public void setVisitNum(Integer visitNum) { + this.visitNum = visitNum; + } + + public Integer getVisitUserNum() { + return visitUserNum; + } + + public void setVisitUserNum(Integer visitUserNum) { + this.visitUserNum = visitUserNum; + } + + public Integer getSpuVisitNum() { + return spuVisitNum; + } + + public void setSpuVisitNum(Integer spuVisitNum) { + this.spuVisitNum = spuVisitNum; + } + + public Integer getSpuVisitUserNum() { + return spuVisitUserNum; + } + + public void setSpuVisitUserNum(Integer spuVisitUserNum) { + this.spuVisitUserNum = spuVisitUserNum; + } + + public Integer getPlusShopCartUserNum() { + return plusShopCartUserNum; + } + + public void setPlusShopCartUserNum(Integer plusShopCartUserNum) { + this.plusShopCartUserNum = plusShopCartUserNum; + } + + public Long getPlusShopCartNum() { + return plusShopCartNum; + } + + public void setPlusShopCartNum(Long plusShopCartNum) { + this.plusShopCartNum = plusShopCartNum; + } + + public Integer getPlaceOrderUserNum() { + return placeOrderUserNum; + } + + public void setPlaceOrderUserNum(Integer placeOrderUserNum) { + this.placeOrderUserNum = placeOrderUserNum; + } + + public Integer getPayUserNum() { + return payUserNum; + } + + public void setPayUserNum(Integer payUserNum) { + this.payUserNum = payUserNum; + } + + public Long getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Long placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "FlowRegionalBO{" + + "id=" + id + + ", dateType=" + dateType + + ", provinceId=" + provinceId + + ", visitNum=" + visitNum + + ", visitUserNum=" + visitUserNum + + ", spuVisitNum=" + spuVisitNum + + ", spuVisitUserNum=" + spuVisitUserNum + + ", plusShopCartUserNum=" + plusShopCartUserNum + + ", plusShopCartNum=" + plusShopCartNum + + ", placeOrderUserNum=" + placeOrderUserNum + + ", payUserNum=" + payUserNum + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSystemBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSystemBO.java new file mode 100644 index 0000000..acd4a65 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowSystemBO.java @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 用户端记录 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "date_type_system_type_idx", def = "{'dateType':1, 'systemType':1}"), + @CompoundIndex(name = "spu_user_idx", def = "{'spuId':1, 'userId':1}") +}) +@Document("flow_system") +public class FlowSystemBO extends BaseModel implements Serializable{ + + public static final Integer ID_LENGTH = 8; + + /** + * id: 日期(yyMMdd)+ 日期类型(日周月) + 系统类型 + * 长度:8位 + */ + @Id + private Integer id; + + /** + * 系统类型 0:全部 1:pc 2:h5 3:小程序 4:安卓 5:ios + */ + private Integer systemType; + + /** + * 日、周、月 + */ + private Integer dateType; + + /** + * 浏览量 + */ + private Integer visit; + + /** + * 加购人数 + */ + private Integer plusShopCartUser; + + /** + * 访客数 + */ + private Integer visitUser; + + /** + * 新访客数 + */ + private Integer newVisitUser; + + /** + * 跳失人数 + */ + private Integer lossUser; + + /** + * 下单人数 + */ + private Integer placeOrderUser; + + /** + * 支付人数 + */ + private Integer payUser; + + /** + * 下单金额 + */ + private Integer placeOrderAmount; + + /** + * 支付金额 + */ + private Integer payAmount; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Integer getVisit() { + return visit; + } + + public void setVisit(Integer visit) { + this.visit = visit; + } + + public Integer getPlusShopCartUser() { + return plusShopCartUser; + } + + public void setPlusShopCartUser(Integer plusShopCartUser) { + this.plusShopCartUser = plusShopCartUser; + } + + public Integer getVisitUser() { + return visitUser; + } + + public void setVisitUser(Integer visitUser) { + this.visitUser = visitUser; + } + + public Integer getNewVisitUser() { + return newVisitUser; + } + + public void setNewVisitUser(Integer newVisitUser) { + this.newVisitUser = newVisitUser; + } + + public Integer getLossUser() { + return lossUser; + } + + public void setLossUser(Integer lossUser) { + this.lossUser = lossUser; + } + + public Integer getPlaceOrderUser() { + return placeOrderUser; + } + + public void setPlaceOrderUser(Integer placeOrderUser) { + this.placeOrderUser = placeOrderUser; + } + + public Integer getPayUser() { + return payUser; + } + + public void setPayUser(Integer payUser) { + this.payUser = payUser; + } + + public Integer getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Integer placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Integer getPayAmount() { + return payAmount; + } + + public void setPayAmount(Integer payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "FlowSystemBO{" + + "id=" + id + + ", systemType=" + systemType + + ", dateType=" + dateType + + ", visit=" + visit + + ", plusShopCartUser=" + plusShopCartUser + + ", visitUser=" + visitUser + + ", newVisitUser=" + newVisitUser + + ", lossUser=" + lossUser + + ", placeOrderUser=" + placeOrderUser + + ", payUser=" + payUser + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserFootprintBO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserFootprintBO.java new file mode 100644 index 0000000..b432aa0 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/bo/FlowUserFootprintBO.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.bo; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + + +/** + * 用户访问足迹统计 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +@CompoundIndexes({ + @CompoundIndex(name = "date_type_idx", def = "{'dateType':1}") +}) +@Document("flow_user_footprint") +public class FlowUserFootprintBO extends BaseModel implements Serializable{ + + public static final Integer ID_LENGTH = 9; + + /** + * id: 日期(yyMMdd)+ 时间类型 + visitId + 0 + * 长度:9位 (多留一个0,方便以后扩展) + */ + @Id + private Integer id; + + /** + * 时间类型 1:日 2:周 3:月 + */ + private Integer dateType; + /** + * 用户数量 + */ + private Integer userNums; + /** + * 访问页面数量 (编号:访问页面数量)1:1 2:2 3:3 4:4 5:5 6:6-10 7:11-20 8:20+ + */ + private Integer visitId; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserNums() { + return userNums; + } + + public void setUserNums(Integer userNums) { + this.userNums = userNums; + } + + public Integer getVisitId() { + return visitId; + } + + public void setVisitId(Integer visitId) { + this.visitId = visitId; + } + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + @Override + public String toString() { + return "UserFootprintStatisticsBO{" + + "id=" + id + + ", dateType=" + dateType + + ", userNums=" + userNums + + ", visitId=" + visitId + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/config/XxlJobConfig.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/config/XxlJobConfig.java new file mode 100644 index 0000000..744a980 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appName; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appName + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/DistributedIdKey.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/DistributedIdKey.java new file mode 100644 index 0000000..2d5b954 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/DistributedIdKey.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + + /** + * 用户操作编号 + */ + String MALL4CLOUD_FLOW_USER_ID = "mall4cloud-flow-user-id"; +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowDateTypeEnum.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowDateTypeEnum.java new file mode 100644 index 0000000..a8e74ef --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowDateTypeEnum.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + + +import java.util.Objects; + +/** + * 流量筛选的时间类型 + * + * @author YXF + * @date 2021-05-21 + */ +public enum FlowDateTypeEnum { + /** + * 日 + */ + DAY(1, 1), + /** + * 周 + */ + WEEK(2, 1), + /** + * 月 + */ + MONTH(3, 1), + /** + * 今日实时 + */ + REAL_TIME(4, 1), + /** + * 近七天 + */ + NEARLY_WEEK(5, 7), + /** + * 近30天 + */ + NEARLY_MONTH(6, 30), + /** + * 自定义 + */ + CUSTOM(7, 0); + + private final Integer id; + + private final Integer num; + + public Integer value() { + return id; + } + + public Integer getNum() { + return num; + } + + FlowDateTypeEnum(Integer id, Integer num) { + this.id = id; + this.num = num; + } + + public static FlowDateTypeEnum instance(Integer value) { + FlowDateTypeEnum[] enums = values(); + for (FlowDateTypeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return DAY; + } + + public static FlowDateTypeEnum[] allEnum() { + return values(); + } + + /** + * 日、周或者月 + * @return + */ + public static boolean dayOrWeekOrMonth(Integer id) { + if (Objects.equals(DAY.id, id) || Objects.equals(WEEK.id, id) || Objects.equals(MONTH.id, id)) { + return true; + } + return false; + } + + /** + * 周或者月 + * @return + */ + public static boolean weekOrMonth(Integer id) { + return Objects.equals(WEEK.id, id) || Objects.equals(MONTH.id, id); + } + + /** + * 周或者月 + * @return + */ + public static boolean nearlyTime(Integer id) { + return Objects.equals(NEARLY_WEEK.id, id) || Objects.equals(NEARLY_MONTH.id, id); + } + + /** + * 是否为今日实时 + * @return + */ + public static boolean isRealTime(Integer id) { + return Objects.equals(REAL_TIME.id, id); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowSpuSortEnum.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowSpuSortEnum.java new file mode 100644 index 0000000..86c4062 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/constant/FlowSpuSortEnum.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.constant; + + +import java.util.Objects; + +/** + * 页面操作 + * + * @author yxf + */ +public enum FlowSpuSortEnum { + /** + * 曝光次数 + */ + VISIT(0, "visit"), + /** + * 曝光人数 + */ + VISIT_USER(1, "visitUser"), + /** + * 加购人数 + */ + PLUS_SHOP_CART_USER(2, "plusShopCartUser"), + /** + * 加购件数 + */ + PLUS_SHOP_CART(3, "plusShopCart"), + /** + * 下单人数 + */ + PLACE_ORDER_USER(4, "placeOrderUser"), + /** + * 支付人数 + */ + PAY_USER(5, "payUser"), + /** + * 支付人数 + */ + PLACE_ORDER_NUM(6, "placeOrderNum"), + /** + * 支付人数 + */ + PAY_NUM(7, "payNum"), + /** + * 下单金额 + */ + PLACE_ORDER_AMOUNT(8, "placeOrderAmount"), + /** + * 支付金额 + */ + PAY_AMOUNT(9, "payAmount"), + /** + * 申请退款订单数 + */ + APPLY_REFUND_ORDER(10, "applyRefundOrder"), + /** + * 申请退款人数 + */ + APPLY_REFUND_USER(11, "applyRefundUser"), + /** + * 成功退款订单数 + */ + SUCCESS_REFUND_ORDER(12, "successRefundOrder"), + /** + * 成功退款人数 + */ + SUCCESS_REFUND_USER(13, "successRefundUser"), + /** + * 成功退款金额 + */ + SUCCESS_REFUND_AMOUNT(14, "successRefundAmount"), + /** + * 成功退款率 + */ + success_Refund_Rate(15, "successRefundRate") + ; + + private final Integer id; + private final String name; + + public Integer value() { + return id; + } + + public String getName() { + return name; + } + + FlowSpuSortEnum(Integer id, String name) { + this.id = id; + this.name = name; + } + + public static FlowSpuSortEnum instance(String value) { + FlowSpuSortEnum[] enums = values(); + for (FlowSpuSortEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static FlowSpuSortEnum[] allEnum() { + FlowSpuSortEnum[] enums = values(); + return enums; + } + + + public static Boolean isVisitOrShare(Integer id) { + return id.equals(VISIT.value()); + } + + + public static String getFieldName(Integer id) { + for (FlowSpuSortEnum value : values()) { + if (Objects.equals(value.id, id)){ + return value.name; + } + } + return VISIT.name; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/admin/CustomerAnalysisController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/admin/CustomerAnalysisController.java new file mode 100644 index 0000000..9f7ada5 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/admin/CustomerAnalysisController.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.admin; + +import com.tmerclub.cloud.api.order.dto.CustomerRetainedDTO; +import com.tmerclub.cloud.api.order.vo.CustomerRetainVO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.user.vo.MemberContributeRespVO; +import com.tmerclub.cloud.api.user.vo.MemberDealRespVO; +import com.tmerclub.cloud.api.user.vo.MemberTrendRespVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.flow.service.CustomerAnalysisService; +import com.tmerclub.cloud.flow.vo.MemberSurveyRespVO; +import com.tmerclub.cloud.flow.vo.MemberTrendExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 顾客分析接口 + * + * @author + */ +@Tag(name = "顾客分析接口") +@RestController("adminCustomerAnalysisController") +@RequestMapping("/mp/customer_analysis") +public class CustomerAnalysisController { + + @Autowired + private CustomerAnalysisService customerAnalysisService; + + /** + * 会员分析,会员概况 + */ + @Operation(summary = "会员分析,会员概况", description = "会员分析,会员概况") + @GetMapping("/get_member_survey") + public ServerResponseEntity getMemberSurvey(MemberReqDTO param) { + MemberSurveyRespVO memberSurveyRespVO = customerAnalysisService.getMemberSurvey(param); + return ServerResponseEntity.success(memberSurveyRespVO); + } + + /** + * 会员分析,会员人数趋势/ 会员占比趋势 + */ + @Operation(summary = "会员分析,会员人数趋势/ 会员占比趋势", description = "会员分析,会员人数趋势/ 会员占比趋势") + @GetMapping("/get_member_trend") + public ServerResponseEntity> getMemberTrend(MemberReqDTO param) { + List resList = customerAnalysisService.getMemberTrend(param); + return ServerResponseEntity.success(resList); + } + + /** + * 会员分析,会员贡献价值分析 + */ + @Operation(summary = "会员分析,会员贡献价值分析", description = "会员分析,会员贡献价值分析") + @GetMapping("/get_member_vontribute_value") + public ServerResponseEntity getMemberContributeValue(MemberReqDTO param) { + MemberContributeRespVO contributeRespVO = customerAnalysisService.getMemberContributeValue(param); + return ServerResponseEntity.success(contributeRespVO); + } + + /** + * 会员分析,新老会员成交分析 + */ + @GetMapping("/get_member_deal") + @Operation(summary = "会员分析,新老会员成交分析", description = "会员分析,新老会员成交分析") + public ServerResponseEntity getMemberDeal(MemberReqDTO param) { + MemberDealRespVO respParam = customerAnalysisService.getMemberDeal(param); + return ServerResponseEntity.success(respParam); + } + + /** + * 客户分析,客户留存分析 + */ + @Operation(summary = "客户分析-客户留存分析", description = "客户分析,客户留存分析,不做周留存数据") + @GetMapping("/get_customer_retained") + public ServerResponseEntity> getCustomerRetained(CustomerRetainedDTO customerRetainedDTO) { + // + Integer dateType = customerRetainedDTO.getDateType(); + Integer dateRetainType = customerRetainedDTO.getDateRetainType(); + List respList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(1, dateType) && !Objects.equals(1, dateRetainType)) { + // 最近一月,月留存。此时不显示数据 + return ServerResponseEntity.success(respList); + } + respList = customerAnalysisService.getCustomerRetained(customerRetainedDTO); + + return ServerResponseEntity.success(respList); + } + + @GetMapping("/member_trend_export") + @Operation(summary = "导出excel", description = "导出导出会员分析,会员人数趋势/ 会员占比趋势") + public ServerResponseEntity memberTrendExport(HttpServletResponse response, MemberReqDTO param) { + List list = customerAnalysisService.listMemberTrend(param); + ExcelUtil.soleExcel(response, list, MemberTrendExcelVO.EXCEL_NAME, MemberTrendExcelVO.MERGE_ROW_INDEX, MemberTrendExcelVO.MERGE_COLUMN_INDEX, MemberTrendExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/multishop/ProductAnalyseController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/multishop/ProductAnalyseController.java new file mode 100644 index 0000000..8b183e9 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/multishop/ProductAnalyseController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.multishop; + +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.api.product.vo.ProdEffectRespVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.flow.service.ProductAnalyseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 YXF + * @date 2021-05-21 15:25:19 + */ +@RestController("multishopProductAnalyseController") +@RequestMapping("/m/product_analyse") +@Tag(name = "流量分析—商品分析") +public class ProductAnalyseController { + + @Autowired + private ProductAnalyseService productAnalyseService; + + @GetMapping("/get_product_effect") + @Operation(summary = "获取商家端商品洞察数据", description = "获取商品洞察数据") + public ServerResponseEntity> getProductEffect(@Valid PageDTO pageDTO, ProdEffectDTO prodEffectDTO) { + prodEffectDTO.setShopId(AuthUserContext.get().getTenantId()); + prodEffectDTO.setLang(I18nMessage.getLang()); + return ServerResponseEntity.success(productAnalyseService.getProductEffect(pageDTO,prodEffectDTO)); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/FormController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/FormController.java new file mode 100644 index 0000000..e56a64e --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/controller/platform/FormController.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.controller.platform; + +import com.tmerclub.cloud.api.order.vo.FormExcelParamVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.flow.dto.FormDTO; +import com.tmerclub.cloud.flow.model.Form; +import com.tmerclub.cloud.flow.service.FormService; +import com.tmerclub.cloud.flow.vo.FormExcelVO; +import com.tmerclub.cloud.flow.vo.FormItemVO; +import com.tmerclub.cloud.flow.vo.FormVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 数据表格 + * + * @author TRACK + */ +@RestController("platformFormController") +@RequestMapping("/p/form") +@Tag(name = "数据表格") +public class FormController { + + @Autowired + private FormService formService; + + + @GetMapping("/page") + @Operation(summary = "获取数据表格列表", description = "分页获取数据表格列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, FormDTO formParam) { + formParam.setShopId(Constant.PLATFORM_SHOP_ID); + PageVO

formPage = formService.page(pageDTO, formParam); + return ServerResponseEntity.success(formPage); + } + + @GetMapping + @Operation(summary = "获取数据表格", description = "根据formId获取数据表格") + public ServerResponseEntity getByFormId(@RequestParam Long formId) { + Form form = formService.getByFormId(formId); + if (Objects.isNull(form)) { + throw new LuckException("当前报表不存在,请刷新页面重试"); + } + return ServerResponseEntity.success(form); + } + + @PostMapping + @Operation(summary = "保存数据表格", description = "保存数据表格") + public ServerResponseEntity save(@Valid @RequestBody FormDTO formDTO) { + Form form = BeanUtil.map(formDTO, Form.class); + form.setFormId(null); + if (!formDTO.getRecommendForm()) { + form.setShopId(Constant.PLATFORM_SHOP_ID); + } + formService.save(form); + //如果是推荐报表,则清除缓存 + if (formDTO.getRecommendForm()) { + formService.removeCache(); + } + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新数据表格", description = "更新数据表格") + public ServerResponseEntity update(@Valid @RequestBody FormDTO formDTO) { + if (!formDTO.getRecommendForm()) { + Form formDb = formService.getByFormId(formDTO.getFormId()); + if (!Objects.equals(formDb.getShopId(), Constant.PLATFORM_SHOP_ID)) { + throw new LuckException("该报表数据有误,请刷新后重新输入"); + } + } + Form form = BeanUtil.map(formDTO, Form.class); + formService.update(form); + //如果是推荐报表,则清除缓存 + if (formDTO.getRecommendForm()) { + formService.removeCache(); + } + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除数据表格", description = "根据数据表格id删除数据表格") + public ServerResponseEntity delete(@RequestParam Long formId) { + Form form = formService.getByFormId(formId); + formService.deleteById(formId); + //如果是推荐报表,则清除缓存 + if (Objects.isNull(form.getShopId())) { + formService.removeCache(); + } + return ServerResponseEntity.success(); + } + + @GetMapping("/get_form_item") + @Operation(summary = "获取报表项列表", description = "获取报表项列表") + @Parameter(name = "type", description = "1:平台端 2:商家端") + public ServerResponseEntity> getFormItem(@RequestParam("type") Integer type) { + List formItemEnumList = formService.getFormItem(type, I18nMessage.getLang()); + return ServerResponseEntity.success(formItemEnumList); + } + + @GetMapping("/form_excel") + @Operation(summary = "生成报表", description = "生成报表") + public void formExcel(@RequestParam("formId") Long formId, HttpServletResponse response) { + Form form = formService.getByFormId(formId); + if (Objects.isNull(form)) { + throw new LuckException("报表不存在"); + } + FormExcelParamVO excelParam = formService.getExcelParam(form); + List list = formService.listExcel(form, excelParam); + ExcelUtil.soleExcel(response, list, form.getFormName(), FormExcelVO.MERGE_ROW_INDEX, FormExcelVO.MERGE_COLUMN_INDEX, excelParam.getFormItemNames(), FormExcelVO.class); + } + + @GetMapping("/get_recommend_form_page") + @Operation(summary = "分页获取推荐报表", description = "分页获取推荐报表") + public ServerResponseEntity> getRecommendFormPage(FormDTO form, PageDTO page) { + PageVO formPage = formService.getRecommendFormPage(page, form); + return ServerResponseEntity.success(formPage); + } + + @GetMapping("/get_recommend_form_list") + @Operation(summary = "获取推荐报表", description = "获取推荐报表") + public ServerResponseEntity> getRecommendFormList() { + List formList = formService.getRecommendFormList(); + return ServerResponseEntity.success(formList); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FlowLogDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FlowLogDTO.java new file mode 100644 index 0000000..9268558 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FlowLogDTO.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户流量记录 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +public class FlowLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * operateId + */ + @Schema(description = "用户操作编号") + private Long oid; + + /** + * systemType + */ + @Schema(description = "系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios") + private Integer st; + + /** + * pageId + */ + @Schema(description = "页面id") + private Integer pid; + + /** + * visitEvent + */ + @Schema(description = "访问事件 1:页面访问 2:加购 3:收藏 4:提交订单 5:支付成功") + private Integer ve; + + @Schema(description = "店铺id, 平台传0") + private Integer sid; + + @Schema(description = "业务id") + private String bid; + + /** + * step + */ + @Schema(description = "用户操作步骤数") + private Integer s; + + /** + * nums + */ + @Schema(description = "用户操作数量") + private Integer n; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户登陆ip + */ + private String ip; + + /** + * 创建时间 + */ + private Date createTime; + + public Long getOid() { + return oid; + } + + public void setOid(Long oid) { + this.oid = oid; + } + + public Integer getSt() { + return st; + } + + public void setSt(Integer st) { + this.st = st; + } + + public Integer getPid() { + return pid; + } + + public void setPid(Integer pid) { + this.pid = pid; + } + + public Integer getVe() { + return ve; + } + + public void setVe(Integer ve) { + this.ve = ve; + } + + public Integer getSid() { + return sid; + } + + public void setSid(Integer sid) { + this.sid = sid; + } + + public String getBid() { + return bid; + } + + public void setBid(String bid) { + this.bid = bid; + } + + public Integer getS() { + return s; + } + + public void setS(Integer s) { + this.s = s; + } + + public Integer getN() { + return n; + } + + public void setN(Integer n) { + this.n = n; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "FlowLogDTO{" + + "oid='" + oid + '\'' + + ", st=" + st + + ", pid=" + pid + + ", ve=" + ve + + ", sid=" + sid + + ", bid='" + bid + '\'' + + ", s=" + s + + ", n=" + n + + ", userId='" + userId + '\'' + + ", ip='" + ip + '\'' + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FormDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FormDTO.java new file mode 100644 index 0000000..59bc9b4 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/FormDTO.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 数据表格DTO + * + * @author TRACK + */ +public class FormDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long formId; + + @Schema(description = "店铺Id") + private Long shopId; + + @Schema(description = "报表名称") + private String formName; + + @Schema(description = "推荐报表介绍内容") + private String content; + + @Schema(description = "报表类型 1:店铺报表 2:商品报表") + private Integer fromType; + + @Schema(description = "时间类型 1:天 2:周 3:月") + private Integer timeType; + + @Schema(description = "时间格式 1:固定时间区间 2:指定时间范围") + private Integer timeFormat; + + @Schema(description = "报表项id数组") + private String formItemIds; + + @Schema(description = "开始时间(固定时间区间)") + private Date startTime; + + @Schema(description = "结束时间(固定时间区间)") + private Date endTime; + + @Schema(description = "时间范围 1:近1天 2:近7天 3: 近30天") + private Integer timeRange; + + @Schema(description = "序号") + private Integer seq; + + @Schema(description = "推荐报表 true:推荐报表 false:店铺报表") + private Boolean recommendForm; + + public Long getFormId() { + return formId; + } + + public void setFormId(Long formId) { + this.formId = formId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getFormName() { + return formName; + } + + public void setFormName(String formName) { + this.formName = formName; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getFromType() { + return fromType; + } + + public void setFromType(Integer fromType) { + this.fromType = fromType; + } + + public Integer getTimeType() { + return timeType; + } + + public void setTimeType(Integer timeType) { + this.timeType = timeType; + } + + public Integer getTimeFormat() { + return timeFormat; + } + + public void setTimeFormat(Integer timeFormat) { + this.timeFormat = timeFormat; + } + + public String getFormItemIds() { + return formItemIds; + } + + public void setFormItemIds(String formItemIds) { + this.formItemIds = formItemIds; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getTimeRange() { + return timeRange; + } + + public void setTimeRange(Integer timeRange) { + this.timeRange = timeRange; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Boolean getRecommendForm() { + return recommendForm; + } + + public void setRecommendForm(Boolean recommendForm) { + this.recommendForm = recommendForm; + } + + @Override + public String toString() { + return "FormDTO{" + + "formId=" + formId + + ", shopId=" + shopId + + ", formName='" + formName + '\'' + + ", content='" + content + '\'' + + ", fromType=" + fromType + + ", timeType=" + timeType + + ", timeFormat=" + timeFormat + + ", formItemIds='" + formItemIds + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", timeRange=" + timeRange + + ", seq=" + seq + + ", recommendForm=" + recommendForm + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/ProductAnalyseUserDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/ProductAnalyseUserDTO.java new file mode 100644 index 0000000..8875350 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/ProductAnalyseUserDTO.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—页面数据统计表DTO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class ProductAnalyseUserDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long productAnalyseUserId; + + @Schema(description = "页面分析id") + private Long productAnalyseId; + + @Schema(description = "uuid") + private String uuid; + + @Schema(description = "创建日期") + private Date createDate; + + @Schema(description = "商品id") + private String spuId; + + @Schema(description = "访问") + private Integer isVisit; + + @Schema(description = "页面点击") + private Integer isClick; + + @Schema(description = "分享访问") + private Integer isShareVisit; + + @Schema(description = "下单") + private Integer isPlaceOrder; + + @Schema(description = "支付") + private Integer isPay; + + @Schema(description = "加购") + private Integer isPlusShopCart; + + public Long getProductAnalyseUserId() { + return productAnalyseUserId; + } + + public void setProductAnalyseUserId(Long productAnalyseUserId) { + this.productAnalyseUserId = productAnalyseUserId; + } + + public Long getProductAnalyseId() { + return productAnalyseId; + } + + public void setProductAnalyseId(Long productAnalyseId) { + this.productAnalyseId = productAnalyseId; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getSpuId() { + return spuId; + } + + public void setSpuId(String spuId) { + this.spuId = spuId; + } + + public Integer getIsVisit() { + return isVisit; + } + + public void setIsVisit(Integer isVisit) { + this.isVisit = isVisit; + } + + public Integer getIsClick() { + return isClick; + } + + public void setIsClick(Integer isClick) { + this.isClick = isClick; + } + + public Integer getIsShareVisit() { + return isShareVisit; + } + + public void setIsShareVisit(Integer isShareVisit) { + this.isShareVisit = isShareVisit; + } + + public Integer getIsPlaceOrder() { + return isPlaceOrder; + } + + public void setIsPlaceOrder(Integer isPlaceOrder) { + this.isPlaceOrder = isPlaceOrder; + } + + public Integer getIsPay() { + return isPay; + } + + public void setIsPay(Integer isPay) { + this.isPay = isPay; + } + + public Integer getIsPlusShopCart() { + return isPlusShopCart; + } + + public void setIsPlusShopCart(Integer isPlusShopCart) { + this.isPlusShopCart = isPlusShopCart; + } + + @Override + public String toString() { + return "ProductAnalyseUserDTO{" + + "productAnalyseUserId=" + productAnalyseUserId + + ",productAnalyseId=" + productAnalyseId + + ",uuid=" + uuid + + ",createDate=" + createDate + + ",spuId=" + spuId + + ",isVisit=" + isVisit + + ",isClick=" + isClick + + ",isShareVisit=" + isShareVisit + + ",isPlaceOrder=" + isPlaceOrder + + ",isPay=" + isPay + + ",isPlusShopCart=" + isPlusShopCart + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserAnalysisDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserAnalysisDTO.java new file mode 100644 index 0000000..bd31912 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserAnalysisDTO.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—用户数据DTO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class UserAnalysisDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long userAnalysisId; + + @Schema(description = "创建时间") + private Date createDate; + + @Schema(description = "用户Id(用户未登陆时,为uuid)") + private String userId; + + @Schema(description = "省Id") + private Long provinceId; + + @Schema(description = "加购数量") + private Integer plusShopCart; + + @Schema(description = "下单金额") + private Long placeOrderAmount; + + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "浏览量") + private Integer visitNums; + + @Schema(description = "0:旧用户, 1:新用户, 2.未登陆用户") + private Integer userType; + + @Schema(description = "会话数") + private Integer sessionNums; + + @Schema(description = "系统类型 (1:pc 2:h5 3:小程序 4:安卓 5:ios)") + private Integer systemType; + + public Long getUserAnalysisId() { + return userAnalysisId; + } + + public void setUserAnalysisId(Long userAnalysisId) { + this.userAnalysisId = userAnalysisId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Long getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Long placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getVisitNums() { + return visitNums; + } + + public void setVisitNums(Integer visitNums) { + this.visitNums = visitNums; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Integer getSessionNums() { + return sessionNums; + } + + public void setSessionNums(Integer sessionNums) { + this.sessionNums = sessionNums; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + @Override + public String toString() { + return "UserAnalysisDTO{" + + "userAnalysisId=" + userAnalysisId + + ",createDate=" + createDate + + ",userId=" + userId + + ",provinceId=" + provinceId + + ",plusShopCart=" + plusShopCart + + ",placeOrderAmount=" + placeOrderAmount + + ",payAmount=" + payAmount + + ",visitNums=" + visitNums + + ",userType=" + userType + + ",sessionNums=" + sessionNums + + ",systemType=" + systemType + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserVisitDTO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserVisitDTO.java new file mode 100644 index 0000000..e40e9a2 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/dto/UserVisitDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Pineapple + * @date 2021/6/3 15:35 + */ +public class UserVisitDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 时间类型 1.日 2.周 3.月 4.今日实时 5.近七天 6.近30天 7.自定义 + * FlowTimeTypeEnum + */ + @Schema(description = "时间类型 1.日 3.月 4.今日实时 5.近七天 6.近30天") + private Integer dateType; + /** + * 开始时间 + */ + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + /** + * 结束时间 + */ + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + public Integer getDateType() { + return dateType; + } + + public void setDateType(Integer dateType) { + this.dateType = dateType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "UserVisitDTO{" + + "dateType=" + dateType + + ", startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/feign/FlowFeignController.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/feign/FlowFeignController.java new file mode 100644 index 0000000..01d0c7a --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/feign/FlowFeignController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.feign; + +import com.tmerclub.cloud.api.flow.feign.FlowFeignClient; +import com.tmerclub.cloud.flow.service.FlowService; +import com.tmerclub.cloud.flow.service.ProductAnalyseService; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author YXF + * @date 2021/07/01 + */ +@DubboService +public class FlowFeignController implements FlowFeignClient { + private static final Logger logger = LoggerFactory.getLogger(FlowFeignController.class); + @Autowired + private ProductAnalyseService productAnalyseService; + @Autowired + private FlowService flowService; + + + @Override + public void deleteSpuDataBySpuId(Long spuId) { + try { + productAnalyseService.deleteSpuDataBySpuId(spuId); + } catch (Exception e) { + logger.error("删除商品id:{}的统计数据失败", spuId); + } + } + + @Override + public void paySuccessLog(Integer sysType, String orderIds, Long userId) { + try { + flowService.paySuccessLog(sysType, orderIds, userId); + } catch (Exception e) { + logger.error("记录支付日志失败,系统类型:{},订单号:{},用户id:{}", sysType, orderIds, userId); + } + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/FlowLog.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/FlowLog.java new file mode 100644 index 0000000..9095009 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/FlowLog.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.model; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户流量记录 + * + * @author YXF + * @date 2020-07-13 13:18:33 + */ +public class FlowLog implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 会话uuid + */ + private String uuid; + /** + * uuid + */ + private String uuidSession; + /** + * 用户id + */ + private String userId; + /** + * 系统类型 1:pc 2:h5 3:小程序 4:安卓 5:ios + */ + private Integer systemType; + /** + * 用户登陆ip + */ + private String ip; + /** + * 页面id + */ + private Integer pageId; + /** + * 创建时间 + */ + private Date createTime; + /** + * 1:页面访问 2:分享访问 3:页面点击 4:加购 + */ + private Integer visitType; + /** + * 业务数据(商品页:商品id;支付界面:订单编号数组;支付成功界面:订单编号数组) + */ + private String bizData; + + /** + * 业务数据(商品页:商品类型) + */ + private String bizType; + /** + * 用户操作步骤数 + */ + private Integer step; + /** + * 用户操作数量 + */ + private Integer nums; + + /** + * 页面结束时间(跳转页面时间) + */ + private Date endTime; + + /** + * 用户下一操作页面编号 + */ + private Integer nextPageId; + /** + * 用户下一操作页面编号 + */ + private Long stopTime; + + /** + * 小时(该数据为第几小时的) + */ + private Integer hour; + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/Form.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/Form.java new file mode 100644 index 0000000..902fb4b --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/Form.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 数据表格 + * + * @author TRACK + */ +public class Form extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long formId; + + /** + * 店铺Id + */ + private Long shopId; + + /** + * 报表名称 + */ + private String formName; + + /** + * 推荐报表介绍内容 + */ + private String content; + + /** + * 报表类型 1:店铺报表 2:商品报表 + */ + private Integer fromType; + + /** + * 时间类型 1:天 2:周 3:月 + */ + private Integer timeType; + + /** + * 时间格式 1:固定时间区间 2:指定时间范围 + */ + private Integer timeFormat; + + /** + * 报表项id数组 + */ + private String formItemIds; + + /** + * 开始时间(固定时间区间) + */ + private Date startTime; + + /** + * 结束时间(固定时间区间) + */ + private Date endTime; + + /** + * 时间范围 1:近1天 2:近7天 3: 近30天 + */ + private Integer timeRange; + + /** + * 序号 + */ + private Integer seq; + + public Long getFormId() { + return formId; + } + + public void setFormId(Long formId) { + this.formId = formId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getFormName() { + return formName; + } + + public void setFormName(String formName) { + this.formName = formName; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getFromType() { + return fromType; + } + + public void setFromType(Integer fromType) { + this.fromType = fromType; + } + + public Integer getTimeType() { + return timeType; + } + + public void setTimeType(Integer timeType) { + this.timeType = timeType; + } + + public Integer getTimeFormat() { + return timeFormat; + } + + public void setTimeFormat(Integer timeFormat) { + this.timeFormat = timeFormat; + } + + public String getFormItemIds() { + return formItemIds; + } + + public void setFormItemIds(String formItemIds) { + this.formItemIds = formItemIds; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getTimeRange() { + return timeRange; + } + + public void setTimeRange(Integer timeRange) { + this.timeRange = timeRange; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "Form{" + + "formId=" + formId + + ",shopId=" + shopId + + ",formName=" + formName + + ",content=" + content + + ",fromType=" + fromType + + ",timeType=" + timeType + + ",timeFormat=" + timeFormat + + ",formItemIds=" + formItemIds + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",timeRamge=" + timeRange + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",seq=" + seq + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/ProductAnalyseUser.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/ProductAnalyseUser.java new file mode 100644 index 0000000..f744c1e --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/ProductAnalyseUser.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class ProductAnalyseUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long productAnalyseUserId; + + /** + * 页面分析id + */ + private Long productAnalyseId; + + /** + * 用户id-未登陆的用户为uuId + */ + private String userId; + + /** + * 创建日期 + */ + private Date createDate; + + /** + * 商品id + */ + private Long spuId; + + /** + * 访问 + */ + private Integer isVisit; + + /** + * 页面点击 + */ + private Integer isClick; + + /** + * 加购 + */ + private Integer isPlusShopCart; + + public Long getProductAnalyseUserId() { + return productAnalyseUserId; + } + + public void setProductAnalyseUserId(Long productAnalyseUserId) { + this.productAnalyseUserId = productAnalyseUserId; + } + + public Long getProductAnalyseId() { + return productAnalyseId; + } + + public void setProductAnalyseId(Long productAnalyseId) { + this.productAnalyseId = productAnalyseId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getIsVisit() { + return isVisit; + } + + public void setIsVisit(Integer isVisit) { + this.isVisit = isVisit; + } + + public Integer getIsClick() { + return isClick; + } + + public void setIsClick(Integer isClick) { + this.isClick = isClick; + } + + public Integer getIsPlusShopCart() { + return isPlusShopCart; + } + + public void setIsPlusShopCart(Integer isPlusShopCart) { + this.isPlusShopCart = isPlusShopCart; + } + + @Override + public String toString() { + return "ProductAnalyseUser{" + + "productAnalyseUserId=" + productAnalyseUserId + + ",productAnalyseId=" + productAnalyseId + + ",userId=" + userId + + ",createDate=" + createDate + + ",spuId=" + spuId + + ",isVisit=" + isVisit + + ",isClick=" + isClick + + ",isPlusShopCart=" + isPlusShopCart + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/UserVisitProdAnalysis.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/UserVisitProdAnalysis.java new file mode 100644 index 0000000..cba85d3 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/model/UserVisitProdAnalysis.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—用户访问商品数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class UserVisitProdAnalysis extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户访问商品id + */ + private Long userVisitProdAnalysisId; + + + /** + * 用户统计id + */ + private Long userAnalysisId; + + /** + * 创建日期 + */ + private Date createDate; + + /** + * 商品id + */ + private Long spuId; + + /** + * 是否有改变 + */ + private Boolean isChange; + + public Long getUserVisitProdAnalysisId() { + return userVisitProdAnalysisId; + } + + public void setUserVisitProdAnalysisId(Long userVisitProdAnalysisId) { + this.userVisitProdAnalysisId = userVisitProdAnalysisId; + } + + public Long getUserAnalysisId() { + return userAnalysisId; + } + + public void setUserAnalysisId(Long userAnalysisId) { + this.userAnalysisId = userAnalysisId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Boolean getIsChange() { + return isChange; + } + + public void setIsChange(Boolean isChange) { + this.isChange = isChange; + } + + @Override + public String toString() { + return "UserVisitProdAnalysis{" + + "userVisitProdAnalysisId=" + userVisitProdAnalysisId + + ", userAnalysisId=" + userAnalysisId + + ", createDate=" + createDate + + ", spuId=" + spuId + + ", isChange=" + isChange + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowService.java new file mode 100644 index 0000000..e1ecfda --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowService.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import com.tmerclub.cloud.flow.dto.FlowLogDTO; + +/** + * 流量分析 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface FlowService { + /** + * 用户流量记录 + * + * @param flowLogDTO + */ + void log(FlowLogDTO flowLogDTO); + + /** + * 支付成功记录 + * @param sysType + * @param orderIds + * @param userId + */ + void paySuccessLog(Integer sysType, String orderIds, Long userId); + + + /** + * 统计用户流量记录 + */ + void statisticalFlowUserLog(); + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowUserAnalysisService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowUserAnalysisService.java new file mode 100644 index 0000000..ebe58ee --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowUserAnalysisService.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import com.tmerclub.cloud.flow.dto.FlowAnalysisDTO; +import com.tmerclub.cloud.flow.vo.FlowAnalysisDataExcelVO; +import com.tmerclub.cloud.flow.vo.FlowAnalysisVO; +import com.tmerclub.cloud.flow.vo.FlowSourDataExcelVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface FlowUserAnalysisService { + /** + * 流量总览 + * + * @param flowAnalysisDTO + * @return + */ + FlowAnalysisVO getFlowAnalysisData(FlowAnalysisDTO flowAnalysisDTO); + + /** + * 流量趋势 + * + * @param flowAnalysisDTO + * @return + */ + List flowTrend(FlowAnalysisDTO flowAnalysisDTO); + + /** + * 流量来源构成 + * + * @param flowAnalysisDTO + * @return + */ + List flowSour(FlowAnalysisDTO flowAnalysisDTO); + + /** + * 获取流量总览导出列表 + * + * @param flowAnalysisDTO + * @return + */ + List listFlowAnalysisDataExcel(FlowAnalysisDTO flowAnalysisDTO); + + /** + * 导出流量趋势 + * + * @param response + * @param flowAnalysisDTO + */ + void exportFlowTrend(HttpServletResponse response, FlowAnalysisDTO flowAnalysisDTO); + + /** + * 导出成交转换 + * + * @param flowAnalysisDTO + * @return + */ + List listFlowSourDataExcel(FlowAnalysisDTO flowAnalysisDTO); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowUserMongoService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowUserMongoService.java new file mode 100644 index 0000000..192a6af --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/FlowUserMongoService.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import com.tmerclub.cloud.flow.bo.FlowLogBO; + +import java.util.Date; +import java.util.List; + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface FlowUserMongoService { + + /** + * 获取开始时间 + * @return + */ + Date getBeginDate(); + + /** + * 获取支付页面记录 + * @param pid + * @param userId + * @param orderIds + * @return + */ + List getFlowLogByOrderIds(Integer pid, Long userId, String orderIds); + + /** + * 获取用户最后的操作流量日志 + * @param userId + * @return + */ + FlowLogBO getUserLastLog(Long userId); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SpuAnalyseMongoService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SpuAnalyseMongoService.java new file mode 100644 index 0000000..f0ada07 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SpuAnalyseMongoService.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.flow.bo.FlowSpuBO; +import com.tmerclub.cloud.flow.vo.ProductFlowInfoVO; +import com.tmerclub.cloud.flow.vo.ShopFlowInfoVO; + +import java.util.Date; +import java.util.List; + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface SpuAnalyseMongoService { + + /** + * 统计当天商品数据 + * + * 统计数据存储表:flow_spu_user + * 数据统计来源表:flow_user_log + * @param beginDate + * @param endDate + */ + void statisticsAndSaveSpuUserOfDay(Date beginDate, Date endDate); + + /** + * 统计当天的商品数据 + * + * 统计数据存储表:flow_spu_user + * 数据统计来源表:flow_user_log + * @param dateType + * @param beginDate + * @param endDate + */ + void statisticsAndSaveSpuOfDay(Integer dateType, Date beginDate, Date endDate); + + /** + * 获取当天时间段内的商品统计数据列表 + * + * 数据统计来源表:flow_user_log + * @param beginDate + * @param endDate + * @param spuIds + * @return + */ + List listSpuStatisticsOfDay(Date beginDate, Date endDate, List spuIds); + + /** + * 保存 + * + * 统计数据存储表:flow_spu + * 数据统计来源表:flow_spu、flow_spu_user + * @param dateType + * @param beginDate + * @param endDate + */ + void statisticsAndSaveSpuOfTime(int dateType, Date beginDate, Date endDate); + + /** + * 获取商品洞察分页数据 + * @param pageDTO + * @param prodEffectDTO + * @return + */ + PageVO pageSpuEffect(PageDTO pageDTO, ProdEffectDTO prodEffectDTO); + + /** + * 统计实时的商品数据 + */ + void statisticsRealSpuData(); + + /** + * 获取店铺近10天的访客用户Id + * @param startTime + * @param endTime + * @param supplierId + * @return + */ + ShopFlowInfoVO countVisitUserInPastTenDays(Date startTime, Date endTime, Long supplierId); + + /** + * 统计商品浏览量 + * @param startTime + * @param endTime + * @param supplierId + * @return + */ + Long countProductVisitCount(Date startTime, Date endTime, Long supplierId); + + /** + * 获取店铺流量排行榜 + * @param startTime + * @param endTime + * @param limit + * @return + */ + List listShopRankIngByFlow(Date startTime, Date endTime, Integer limit); + + /** + * 获取供应商商品访问流量排行榜 + * @param startTime + * @param endTime + * @param supplierId + * @return + */ + List listSupplierProdRankIngByFlow(Date startTime, Date endTime, Long supplierId); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SystemAnalyseMongoService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SystemAnalyseMongoService.java new file mode 100644 index 0000000..54865aa --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/SystemAnalyseMongoService.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + +import com.tmerclub.cloud.flow.bo.FlowSystemBO; + +import java.util.Date; +import java.util.List; + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface SystemAnalyseMongoService { + + /** + * 统计各端的流量数据(日) + * + * 统计数据存储表:system_analyse + * 数据统计来源表:flow_user_log + * @param beginDate + * @param endDate + * @return 统计的数据 + */ + void statisticsAndSaveSystemOfDay(Date beginDate, Date endDate); + + /** + * 统计 flow_user_log 流量数据 + * + * 接口用途: + * 1.每天定时统计前一天的数据到 flow_system 表, 统计的方法为:statisticsAndSaveSystemOfDay() + * 2.平台端 -> 流量概括 -> 流量总览、成交转换的实时数据 + * + * 数据统计来源表:flow_user_log + * @param beginDate 开始时间, 默认为执行日的开始时间 + * @param endDate 结束时间, 默认为执行日的结束时间 + * @param systemType 指定要统计的系统类型,如果为null则返回所有类型的统计结果 + * @return 统计的数据 + */ + List listRealTimeStatistics(Date beginDate, Date endDate, Integer systemType); + + /** + * 插入系统统计数据(周、月) + * @param dateType + * @param beginDate + * @param endDate + */ + void statisticsAndSaveSystemOfTime(int dateType, Date beginDate, Date endDate); + + /** + * 插入系统统计数据(周、月) + * @param beginDate 开始时间 + * @param endDate 结束时间 + * @param systemType 系统类型 SystemTypeEnum 不填默认查询所有的用户端 + * @return + */ + List statisticsSystemTypeListOfTime(Date beginDate, Date endDate, Integer systemType); + + + /** + * 查询指定的时间的数据 + * @param startTime + * @param endTiem + * @param dateType + * @param systemType + * @return + */ + List listFlowSystemByDateTypeAndSystemType(Date startTime, Date endTiem, Integer dateType, Integer systemType); + + /** + * 获取系统类型的数据列表 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param dateType 时间类型 + * @return + */ + List listFlowSystem(Date startTime, Date endTime, Integer dateType); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/UserVisitAnalysisService.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/UserVisitAnalysisService.java new file mode 100644 index 0000000..80fe6dd --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/UserVisitAnalysisService.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service; + + +import com.tmerclub.cloud.flow.dto.FlowAnalysisDTO; +import com.tmerclub.cloud.flow.vo.FlowUserAnalysisVO; +import com.tmerclub.cloud.flow.vo.UserAnalysisDataExcelVO; + +import java.util.List; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public interface UserVisitAnalysisService { + + /** + * 获取用户分析数据 + * @param flowAnalysisDTO + * @return + */ + FlowUserAnalysisVO getUserAnalysisData(FlowAnalysisDTO flowAnalysisDTO); + + /** + * 获取导出的用户分析数据 + * @param flowAnalysisDTO + * @return + */ + List listUserAnalysisDataExcel(FlowAnalysisDTO flowAnalysisDTO); +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SpuAnalyseMongoServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SpuAnalyseMongoServiceImpl.java new file mode 100644 index 0000000..cad0343 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/SpuAnalyseMongoServiceImpl.java @@ -0,0 +1,980 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import com.tmerclub.cloud.api.delivery.feign.AreaFeignClient; +import com.tmerclub.cloud.api.product.dto.ProdEffectDTO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.user.dto.CustomerReqDTO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.common.cache.constant.FlowCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.flow.bo.FlowSpuBO; +import com.tmerclub.cloud.flow.bo.FlowSpuUserBO; +import com.tmerclub.cloud.flow.constant.FlowDateTypeEnum; +import com.tmerclub.cloud.flow.constant.FlowLogPageEnum; +import com.tmerclub.cloud.flow.constant.FlowSpuSortEnum; +import com.tmerclub.cloud.flow.constant.FlowVisitEnum; +import com.tmerclub.cloud.flow.service.SpuAnalyseMongoService; +import com.tmerclub.cloud.flow.util.FlowUtil; +import com.tmerclub.cloud.flow.util.IpSearchUtil; +import com.tmerclub.cloud.flow.vo.ProductFlowInfoVO; +import com.tmerclub.cloud.flow.vo.ShopFlowInfoVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.BulkOperations; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class SpuAnalyseMongoServiceImpl implements SpuAnalyseMongoService { + + private static final Logger LOG = LoggerFactory.getLogger(SpuAnalyseMongoServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + @DubboReference + private AreaFeignClient areaFeignClient; + @Autowired + private MongoPageUtil mongoPageUtil; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + + private static final int SPU_STATISTICS_TIME = 2 * 60 * 1000; + + @Override + public void statisticsAndSaveSpuUserOfDay(Date beginDate, Date endDate) { + // 用户id、省id、商品id、店铺id,商品浏览量 + List spuAnalyseLogList = this.statisticsSpuUserOfDay(beginDate, endDate); + + // 根据oid来分组. 获取用户id, 新用户,用户/访客 + List newUserIds = userFeignClient.listNewUserIdByTime(new CustomerReqDTO(beginDate, endDate)); + + Map> map = spuAnalyseLogList.stream().collect(Collectors.groupingBy(FlowSpuUserBO::getOid)); + map.forEach((oid, list) -> { + List userIds = list.stream().map(FlowSpuUserBO::getUserId).filter(Objects::nonNull).collect(Collectors.toList()); + Long userId = oid; + // 新用户也算是新访客 + int newVisit = 1; + if (CollUtil.isNotEmpty(userIds) && Objects.nonNull(userIds.get(0))) { + userId = userIds.get(0); + if (!newUserIds.contains(userId)) { + newVisit = 0; + } + } + for (FlowSpuUserBO flowSpuUserBO : list) { + flowSpuUserBO.setUserId(userId); + flowSpuUserBO.setNewVisit(newVisit); + flowSpuUserBO.setOid(null); + } + }); + + if (CollUtil.isEmpty(spuAnalyseLogList)) { + return; + } + + // 获取省名称列表 + List areaList = areaFeignClient.listProvinceArea(); + Map areaMap = areaList.stream().collect(Collectors.toMap(AreaVO::getAreaName, AreaVO::getAreaId)); + + int index = 1; + Date currentTime = new Date(); + String date = DateUtil.format(beginDate, "yyMMdd"); + + List spuIds = spuAnalyseLogList.stream().map(FlowSpuUserBO::getSpuId).collect(Collectors.toList()); + + ServerResponseEntity> spuResponseEntity = spuFeignClient.listSpuBySpuIds(spuIds); + + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity.getMsg()); + } + Map spuMap; + if (CollUtil.isEmpty(spuResponseEntity.getData())) { + spuMap = Collections.emptyMap(); + } else { + spuMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, s -> s)); + } + + for (FlowSpuUserBO flowSpuUserBO : spuAnalyseLogList) { + flowSpuUserBO.setId(FlowUtil.getId(date, index++)); + flowSpuUserBO.setCreateTime(beginDate); + flowSpuUserBO.setUpdateTime(currentTime); + if (Objects.nonNull(flowSpuUserBO.getPlusShopCartNum()) && flowSpuUserBO.getPlusShopCartNum() > 0) { + flowSpuUserBO.setPlusShopCart(1); + } + if (Objects.nonNull(flowSpuUserBO.getVisitNum()) && flowSpuUserBO.getVisitNum() > 0) { + flowSpuUserBO.setVisit(1); + } + // 设置省id + flowSpuUserBO.setProvinceId(IpSearchUtil.getProvinceIdByUserIp(flowSpuUserBO.getProvinceId(), areaMap)); + + if (spuMap.containsKey(flowSpuUserBO.getSpuId())) { + SpuVO spuVO = spuMap.get(flowSpuUserBO.getSpuId()); + if (Objects.nonNull(spuVO)) { + flowSpuUserBO.setShopId(spuVO.getShopId()); + flowSpuUserBO.setSupplierSpuId(spuVO.getSupplierSpuId()); + flowSpuUserBO.setSupplierId(spuVO.getSupplierId()); + } + } + } + + // 批量插入 + this.batchInsertFlowSpuUserBO(beginDate, endDate, spuAnalyseLogList); + } + + @Override + public void statisticsAndSaveSpuOfDay(Integer dateType, Date beginDate, Date endDate) { + // 获取商品id列表 + // 获取商品总数量 + List flowSpuList = this.listSpuStatisticsOfDay(beginDate, endDate, null); + LOG.info("statisticsAndSaveSpuOfDay-统计商品总数量:{}", flowSpuList.size()); + if (CollUtil.isEmpty(flowSpuList)) { + return; + } + // 批量插入 + this.batchInsertFlowSpuBO(dateType, beginDate, endDate, flowSpuList); + } + + @Override + public List listSpuStatisticsOfDay(Date beginDate, Date endDate, List spuIds) { + // 插入商品数据 + Map spuStatisticsMap = new HashMap<>(15); + + // 曝光次数、曝光人数、加购人数、加购件数 + LOG.info("listSpuStatisticsOfDay-统计曝光次数、曝光人数、加购人数、加购件数"); + this.statisticsSpuFlowOfDay(beginDate, endDate, spuStatisticsMap, spuIds); + + // 统计订单和退款信息 + LOG.info("listSpuStatisticsOfDay-统计订单和退款信息"); + this.statisticsSpuOrderAndRefundInfo(beginDate, endDate, spuStatisticsMap, spuIds); + + // + if (MapUtil.isEmpty(spuStatisticsMap)) { + LOG.info("listSpuStatisticsOfDay spuStatisticsMap is empty"); + return new ArrayList<>(0); + } + + if (CollUtil.isNotEmpty(spuIds)) { + LOG.info("listSpuStatisticsOfDay-删除指定范围外的商品"); + spuStatisticsMap.keySet().removeIf(spuId -> !spuIds.contains(spuId)); + } + + // 插入商品的店铺id、供应商商品id、供应商id + LOG.info("listSpuStatisticsOfDay-插入商品的店铺id、供应商商品id、供应商id"); + this.setSpuInfo(spuStatisticsMap); + return new ArrayList<>(spuStatisticsMap.values()); + } + + @Override + public void statisticsAndSaveSpuOfTime(int dateType, Date beginDate, Date endDate) { + // 统计商品的曝光次数、曝光人数、加购人数、加购件数 + Map spuStatisticsMap = this.statisticsSpuFlowOfTime(beginDate, endDate); + // 统计商品的订单和退款信息 + this.statisticsSpuOrderAndRefundInfo(beginDate, endDate, spuStatisticsMap, null); + // 插入商品的店铺id、供应商商品id、供应商id + this.setSpuInfo(spuStatisticsMap); + List flowSpuBOList = new ArrayList<>(spuStatisticsMap.values()); + if (CollUtil.isEmpty(flowSpuBOList)) { + return; + } + + // 批量保存 + this.batchInsertFlowSpuBO(dateType, beginDate, endDate, flowSpuBOList); + } + + @Override + public PageVO pageSpuEffect(PageDTO pageDTO, ProdEffectDTO prodEffectDTO) { + // 类型为今日实时,要替换为当天,保存时使用的类型为日,表中没有今日实时的类型 + if (Objects.equals(prodEffectDTO.getDateType(), FlowDateTypeEnum.REAL_TIME.value())) { + prodEffectDTO.setDateType(FlowDateTypeEnum.DAY.value()); + } + Long beginId = FlowUtil.stringToId(FlowUtil.dateToString(prodEffectDTO.getStartTime()), FlowSpuBO.ID_LENGTH); + Long endId = FlowUtil.stringToId(FlowUtil.dateToString(prodEffectDTO.getEndTime()), FlowSpuBO.ID_LENGTH); + + Criteria criteria = Criteria.where("_id").gte(beginId).lt(endId).and("dateType").is(prodEffectDTO.getDateType()); + + if (Objects.nonNull(prodEffectDTO.getShopId())) { + criteria.and("shopId").is(prodEffectDTO.getShopId()); + } + + + Query query = new Query(criteria); + if (Objects.nonNull(prodEffectDTO.getSortParam())) { + Sort.Direction direction; + if (Objects.equals(prodEffectDTO.getSortType(), 1)) { + direction = Sort.Direction.ASC; + } else { + direction = Sort.Direction.DESC; + } + + query.with(Sort.by(direction, FlowSpuSortEnum.getFieldName(prodEffectDTO.getSortParam()))); + } + LOG.info("pageSpuEffect-query:{}", query); + return mongoPageUtil.doPage(FlowSpuBO.class, pageDTO, query); + } + + @Override + public void statisticsRealSpuData() { + Date endTime = new Date(); + Date beginTime = DateUtil.beginOfDay(endTime); + + // 获取上次统计的时间 + String timeValue = RedisUtil.get(FlowCacheNames.SPU_STATISTICS_TIME); + Date cacheTime = null; + if (Objects.nonNull(timeValue)) { + long timeMillis = Long.parseLong(timeValue); + if (System.currentTimeMillis() - timeMillis < SPU_STATISTICS_TIME) { + LOG.info("流量分析-商品洞察的今日实时统计时间小于两分钟,不进行统计"); + return; + } + // 缓存时间为当天时间时,初始化cacheTime + if (timeMillis >= beginTime.getTime()) { + LOG.info("初始化cacheTime:赋值为上一次统计缓存的时间"); + cacheTime = new Date(timeMillis); + } + } + + // ******************** 时间不存在或者不是当天,统计当天全部的数据 ******************** + if (Objects.isNull(cacheTime)) { + LOG.info("商品洞察实时统计当天全部的数据"); + endTime = DateUtil.offsetDay(beginTime, 1); + this.statisticsAndSaveSpuOfDay(FlowDateTypeEnum.DAY.value(), beginTime, endTime); + } + // ******************** 时间大于当天的开始时间,统计缓存时间到当前的数据 ******************** + else { + LOG.info("商品洞察实时统计刚操作的数据"); + // 统计结束时间为第二天开始时间 + Date statisticsEndDate= DateUtil.beginOfDay(DateUtil.offsetDay(beginTime, 1)); + this.statisticsLatestData(statisticsEndDate, beginTime, cacheTime); + } + // 添加统计时间的缓存数据,缓存时间为一天 + RedisUtil.set(FlowCacheNames.SPU_STATISTICS_TIME, String.valueOf(System.currentTimeMillis()), Constant.DAY_SECOND); + } + + @Override + public ShopFlowInfoVO countVisitUserInPastTenDays(Date startTime, Date endTime, Long supplierId) { + Criteria criteria = Criteria.where("_id") + .gte(FlowUtil.timeToId(startTime)) + .lt(FlowUtil.timeToId(endTime)) + .and("supplierId").is(supplierId); + + GroupOperation userGroupOperation = Aggregation.group("userId") + .max("newVisit").as("newVisit"); + + GroupOperation groupOperation = Aggregation.group("newVisit") + .last("newVisit").as("newVisit") + .count().as("visitNum"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSpuUserBO.class, + Aggregation.match(criteria), + userGroupOperation, + groupOperation + ); + List flowAnalysisList = mongoTemplate + .aggregate(typedAggregation, FlowSpuUserBO.class) + .getMappedResults(); + + Map map; + if (CollUtil.isNotEmpty(flowAnalysisList)) { + flowAnalysisList = flowAnalysisList.stream().filter(flowSpuUserBO -> Objects.nonNull(flowSpuUserBO.getNewVisit())).collect(Collectors.toList()); + map = flowAnalysisList.stream().collect(Collectors.toMap(FlowSpuUserBO::getNewVisit, FlowSpuUserBO::getVisitNum)); + } else { + map = Collections.emptyMap(); + } + + ShopFlowInfoVO shopFlowInfoVO = new ShopFlowInfoVO(); + shopFlowInfoVO.setOldVisitUserCount(map.getOrDefault(0, 0)); + shopFlowInfoVO.setNewVisitUserCount(map.getOrDefault(1, 0)); + shopFlowInfoVO.setVisitUserCount(shopFlowInfoVO.getOldVisitUserCount() + shopFlowInfoVO.getNewVisitUserCount()); + return shopFlowInfoVO; + } + + @Override + public Long countProductVisitCount(Date startTime, Date endTime, Long supplierId) { + Criteria criteria = Criteria.where("_id") + .gte(FlowUtil.timeToId(startTime, FlowSpuBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endTime, FlowSpuBO.ID_LENGTH)) + .and("supplierId").is(supplierId) + .and("dateType").is(FlowDateTypeEnum.DAY.value()); + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSpuBO.class, + Aggregation.match(criteria), + Aggregation.group().sum("visit").as("visit") + + ); + List flowAnalysisList = mongoTemplate + .aggregate(typedAggregation, "flow_spu", FlowSpuBO.class) + .getMappedResults(); + if (CollUtil.isEmpty(flowAnalysisList)) { + return 0L; + } + return flowAnalysisList.get(0).getVisit(); + } + + @Override + public List listShopRankIngByFlow(Date startTime, Date endTime, Integer limit) { + Criteria criteria = Criteria.where("_id") + .gte(FlowUtil.timeToId(startTime, FlowSpuBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endTime, FlowSpuBO.ID_LENGTH)) + .and("dateType").is(FlowDateTypeEnum.DAY.value()); + + GroupOperation userGroupOperation = Aggregation.group("shopId", "userId") + .first("shopId").as("shopId") + .sum("visit").as("visit"); + + GroupOperation groupOperation = Aggregation.group("shopId") + .first("shopId").as("shopId") + .sum("visit").as("visitCount") + .count().as("visitUserCount"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSpuBO.class, + Aggregation.match(criteria), + userGroupOperation, + groupOperation, + Aggregation.sort(Sort.Direction.DESC, "visitCount"), + Aggregation.limit(limit) + ); + List flowAnalysisList = mongoTemplate + .aggregate(typedAggregation, "flow_spu", ShopFlowInfoVO.class) + .getMappedResults(); + if (CollUtil.isEmpty(flowAnalysisList)) { + return new ArrayList<>(0); + } + + return new ArrayList<>(flowAnalysisList); + } + + @Override + public List listSupplierProdRankIngByFlow(Date startTime, Date endTime, Long supplierId) { + Criteria criteria = Criteria.where("_id") + .gte(FlowUtil.timeToId(startTime, FlowSpuBO.ID_LENGTH)) + .lt(FlowUtil.timeToId(endTime, FlowSpuBO.ID_LENGTH)) + .and("dateType").is(FlowDateTypeEnum.DAY.value()) + .and("supplierId").is(supplierId); + + // 商品和访问用户的去重 + GroupOperation userGroupOperation = Aggregation.group("spuId", "userId") + .first("spuId").as("spuId"); + + // 商品的去重 + GroupOperation groupOperation = Aggregation.group("spuId") + .first("spuId").as("spuId") + .count().as("visitUserCount"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + ProductFlowInfoVO.class, + Aggregation.match(criteria), + userGroupOperation, + groupOperation, + Aggregation.sort(Sort.Direction.DESC, "visitUserCount"), + Aggregation.limit(10)); + + List flowAnalysisList = mongoTemplate + .aggregate(typedAggregation, "flow_spu", ProductFlowInfoVO.class) + .getMappedResults(); + + List spuIds = flowAnalysisList.stream().map(ProductFlowInfoVO::getSpuId).filter(Objects::nonNull).collect(Collectors.toList()); + if (CollUtil.isEmpty(flowAnalysisList) || CollUtil.isEmpty(spuIds)) { + return new ArrayList<>(0); + } + + List orderPayList = this.listProductFlowInfoList(startTime, endTime, spuIds); + + Map payMap = orderPayList.stream().collect(Collectors.toMap(ProductFlowInfoVO::getSpuId, ProductFlowInfoVO::getPayUserCount)); + + for (ProductFlowInfoVO productFlowInfoVO : flowAnalysisList) { + productFlowInfoVO.setPayUserCount(payMap.getOrDefault(productFlowInfoVO.getSpuId(), Constant.ZERO_LONG)); + } + + return flowAnalysisList; + } + + private List listProductFlowInfoList(Date startTime, Date endTime, List spuIds) { + + + Criteria criteria = Criteria.where("createTime") + .gte(startTime) + .lt(endTime) + .and("isPayed").is(1) + .and("orderItems.spuId").in(spuIds); + + ProjectionOperation projectionOperation = Aggregation.project("userId").and("orderItems.spuId").as("spuId"); + + // 商品和访问用户的去重 + GroupOperation userGroupOperation = Aggregation.group("spuId", "userId") + .first("spuId").as("spuId"); + + // 商品的去重 + GroupOperation groupOperation = Aggregation.group("spuId") + .first("spuId").as("spuId") + .count().as("payUserCount"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + ProductFlowInfoVO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + projectionOperation, + userGroupOperation, + groupOperation); + + return mongoTemplate + .aggregate(typedAggregation, "order", ProductFlowInfoVO.class) + .getMappedResults(); + } + + private void statisticsLatestData(Date endTime, Date beginTime, Date cacheTime) { + // 1.统计时间段内数据 + // 获取需要统计的商品id列表 + List spuIds = this.listSpuId(cacheTime, endTime); + if (CollUtil.isEmpty(spuIds)) { + return; + } + // 统计商品数据 + List flowSpuList = this.listSpuStatisticsOfDay(beginTime, endTime, spuIds); + if (CollUtil.isEmpty(flowSpuList)) { + return; + } + + String date = DateUtil.format(beginTime, "yyMMdd"); + Long beginId = FlowUtil.timeToId(beginTime, FlowSpuBO.ID_LENGTH); + Long endId = FlowUtil.timeToId(endTime, FlowSpuBO.ID_LENGTH); + Query idQuery = new Query(Criteria.where("dateType").is(FlowDateTypeEnum.DAY.value()).and("_id").gte(beginId).lt(endId)); + idQuery.with(Sort.by(Sort.Order.desc("_id"))).limit(1); + // 获取最大的id,然后递增 + List flowSpus = mongoTemplate.find(idQuery, FlowSpuBO.class); + long index; + if (CollUtil.isNotEmpty(flowSpus) && Objects.nonNull(flowSpus.get(0).getId())) { + index = flowSpus.get(0).getId(); + } else { + index = FlowUtil.getId(date, 0, FlowSpuBO.ID_LENGTH); + } + + // 完善统计的数据 + for (FlowSpuBO flowSpuBO : flowSpuList) { + flowSpuBO.setCreateTime(beginTime); + flowSpuBO.setUpdateTime(endTime); + flowSpuBO.setDateType(FlowDateTypeEnum.DAY.value()); + } + + + // 2.查询已存在的商品数据id + Criteria criteria = Criteria.where("dateType").is(FlowDateTypeEnum.DAY.value()) + .and("_id").gte(FlowUtil.timeToId(beginTime, FlowDateTypeEnum.DAY.value(), FlowSpuBO.ID_LENGTH)) + .and("spuId").in(spuIds); + Query query = new Query(criteria); + query.fields().include("_id", "spuId"); + List spuList = mongoTemplate.find(query, FlowSpuBO.class); + + + // 3.插入新统计数据 + // 没有已保存的数据,就全部插入 + if (CollUtil.isEmpty(spuList)) { + for (FlowSpuBO spus : flowSpuList) { + spus.setId(++index); + } + mongoTemplate.insertAll(flowSpuList); + return; + } + // 有部分数据已保存到表中,不能直接批量插入,只能通过BulkOperations批量更新或者插入数据 + Map spuMap = spuList.stream().collect(Collectors.toMap(FlowSpuBO::getSpuId, Function.identity())); + Set ids = spuMap.keySet(); + BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, FlowSpuBO.class); + + Iterator iterator = flowSpuList.iterator(); + while (iterator.hasNext()) { + FlowSpuBO flowSpuBO = iterator.next(); + // 表中不存在的商品数据->插入 + if (!ids.contains(flowSpuBO.getSpuId())) { + flowSpuBO.setId(++index); + continue; + } + // 表中存在的商品数据->根据id来替换 + FlowSpuBO flowSpuDb = spuMap.get(flowSpuBO.getSpuId()); + flowSpuBO.setId(flowSpuDb.getId()); + bulkOperations.replaceOne(new Query(Criteria.where("_id").is(flowSpuBO.getId())), flowSpuBO); + // 移除替换的数据 + iterator.remove(); + } + // 如果有剩余的数据,就添加批量插入操作 + if (CollUtil.isNotEmpty(flowSpuList)) { + bulkOperations.insert(flowSpuList); + } + // 执行批量操作 + bulkOperations.execute(); + } + + private List listSpuId(Date beginDate, Date endDate) { + + // 订单关联 + Criteria orderCriteria = Criteria.where(null).orOperator( + Criteria.where("createTime").gte(beginDate).lt(endDate), + Criteria.where("payTime").gte(beginDate).lt(endDate) + ); + + ProjectionOperation orderProjectionOperation = Aggregation.project("_id") + .and("orderItems.spuId").as("spuId"); + + UnionWithOperation orderUnionWithOperation = UnionWithOperation + .unionWith("order") + .pipeline( + Aggregation.match(orderCriteria), + Aggregation.unwind("orderItems"), + orderProjectionOperation, + Aggregation.group("spuId").first("spuId").as("spuId") + ); + + // 退款订单关联 + Criteria refundCriteria = Criteria.where("_id").gt(0).orOperator(Criteria.where("createTime").gte(beginDate).lt(endDate), Criteria.where("refundTime").gte(beginDate).lt(endDate)); + + ProjectionOperation refundProjectionOperation = Aggregation.project("_id") + .and("orderItems.spuId").as("spuId"); + UnionWithOperation refundUnionWithOperation = UnionWithOperation + .unionWith("order_refund") + .pipeline( + Aggregation.match(refundCriteria), + Aggregation.unwind("orderItems"), + refundProjectionOperation, + Aggregation.group("spuId").first("spuId").as("spuId") + ); + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSpuBO.class, + Aggregation.match(Criteria.where("dt").gte(beginDate).lt(endDate).and("pid").is(FlowLogPageEnum.PROD_INFO.value())), + Aggregation.group("bid").first("bid").as("spuId"), +// Aggregation.project("_id").and("bid").as("spuId"), + Aggregation.group("spuId").first("spuId").as("spuId"), + orderUnionWithOperation, + refundUnionWithOperation, + Aggregation.group("spuId").first("spuId").as("spuId") + + ); + LOG.info("listSpuId.typedAggregation:{}", typedAggregation); + List flowAnalysisList = mongoTemplate + .aggregate(typedAggregation, "flow_user_log", FlowSpuBO.class) + .getMappedResults(); + if (CollUtil.isEmpty(flowAnalysisList)) { + return new ArrayList<>(); + } + + return flowAnalysisList.stream().map(FlowSpuBO::getSpuId).collect(Collectors.toList()); + } + + private Map statisticsSpuFlowOfTime(Date beginDate, Date endDate) { + // 曝光次数、曝光人数、加购人数、加购件数 + Long beginId = FlowUtil.timeToId(beginDate); + Long endId = FlowUtil.timeToId(endDate); + + // 分组,统计商品的用户浏览量 + GroupOperation userGroupOperation = Aggregation.group("spuId", "userId") + .first("spuId").as("spuId") + .max("visit").as("visit") + .sum("visitNum").as("visitNum") + .max("plusShopCart").as("plusShopCart") + .sum("plusShopCartNum").as("plusShopCartNum"); + + + GroupOperation groupOperation = Aggregation.group("spuId") + .first("spuId").as("spuId") + .sum("visit").as("visitUser") + .sum("visitNum").as("visit") + .sum("plusShopCart").as("plusShopCartUser") + .sum("plusShopCartNum").as("plusShopCart"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSpuBO.class, + Aggregation.match(Criteria.where("_id").gte(beginId).lt(endId)), + userGroupOperation, + groupOperation + ); + LOG.info("statisticsSpuFlowOfTime:typedAggregation:{}", typedAggregation); + + List spuStatisticsList = mongoTemplate + .aggregate(typedAggregation, "flow_spu_user", FlowSpuBO.class) + .getMappedResults(); + Map spuStatisticsMap = new HashMap<>(); + for (FlowSpuBO flowSpuBO : spuStatisticsList) { + spuStatisticsMap.put(flowSpuBO.getSpuId(), flowSpuBO); + } + return spuStatisticsMap; + } + + private void statisticsSpuOrderAndRefundInfo(Date beginDate, Date endDate, Map spuStatisticsMap, List spuIds) { + // 下单人数、下单件数、下单金额、支付人数、支付件数、支付金额 + this.statisticsSpuOrderInfo(beginDate, endDate, spuStatisticsMap, spuIds); + + // 申请退款订单数、申请退款人数、申请退款金额 + this.statisticsSpuRefundInfo(beginDate, endDate, spuStatisticsMap, spuIds, true); + + // 成功退款订单数、成功退款人数、退款金额 + this.statisticsSpuRefundInfo(beginDate, endDate, spuStatisticsMap, spuIds, false); + + // 计算退款率 + for (FlowSpuBO flowSpuBO : spuStatisticsMap.values()) { + if (Objects.isNull(flowSpuBO.getSuccessRefundUser())) { + flowSpuBO.setRefundRate(0D); + continue; + } + if (Objects.isNull(flowSpuBO.getPayUser())) { + flowSpuBO.setRefundRate(100D); + continue; + } + double refundRate = Arith.mul(Arith.div(flowSpuBO.getSuccessRefundUser(), flowSpuBO.getPayUser(), 4), 100); + flowSpuBO.setRefundRate(refundRate); + } + } + + private void statisticsSpuFlowOfDay(Date beginDate, Date endDate, Map spuStatisticsMap, List spuIds) { + // 曝光次数、曝光人数 + List aggregationList = new ArrayList<>(); + Criteria visitCriteria = Criteria.where("dt").gte(beginDate).lt(endDate) + .and("pid").is(FlowLogPageEnum.PROD_INFO.value()); + if (CollUtil.isNotEmpty(spuIds)) { + visitCriteria.and("bid").in(spuIds); + } + // 过滤 + aggregationList.add(Aggregation.match(visitCriteria)); + + // 分组,统计商品的用户浏览量 + aggregationList.add(Aggregation.group("bid", "oid") + .first("bid").as("spuId") + .count().as("visit")); + + // 分组,统计商品的浏览量和浏览用户数 + aggregationList.add(Aggregation.group("bid") + .first("spuId").as("spuId") + .sum("visit").as("visit") + .count().as("visitUser")); + + List visitSpuStatisticsList = loadSpuStatisticsByFlowUserLog(aggregationList); + + for (FlowSpuBO flowSpuBO : visitSpuStatisticsList) { + spuStatisticsMap.put(flowSpuBO.getSpuId(), flowSpuBO); + } + + aggregationList.clear(); + + + Criteria criteria = Criteria.where("dt").gte(beginDate).lt(endDate) + .and("ve").is(FlowVisitEnum.SHOP_CAT.value()); + if (CollUtil.isNotEmpty(spuIds)) { + criteria.and("bid").in(spuIds); + } + // 加购人数、加购件数 + aggregationList.add(Aggregation.match(criteria)); + + // 分组,统计商品的用户加购件数 + aggregationList.add(Aggregation.group("bid", "uid") + .first("bid").as("spuId") + .count().as("plusShopCart")); + + // 分组,统计商品的加购人数、加购件数 + aggregationList.add(Aggregation.group("bid") + .first("spuId").as("spuId") + .sum("plusShopCart").as("plusShopCart") + .count().as("plusShopCartUser")); + + List plusShopCartSpuStatisticsList = this.loadSpuStatisticsByFlowUserLog(aggregationList); + + for (FlowSpuBO flowSpuBO : plusShopCartSpuStatisticsList) { + if (spuStatisticsMap.containsKey(flowSpuBO.getSpuId())) { + FlowSpuBO visitFlowSpuBO = spuStatisticsMap.get(flowSpuBO.getSpuId()); + visitFlowSpuBO.setPlusShopCart(flowSpuBO.getPlusShopCart()); + visitFlowSpuBO.setPlusShopCartUser(flowSpuBO.getPlusShopCartUser()); + } else { + spuStatisticsMap.put(flowSpuBO.getSpuId(), flowSpuBO); + } + } + } + + private void statisticsSpuRefundInfo(Date beginDate, Date endDate, Map spuStatisticsMap, List spuIds, boolean applyRefund) { + // 申请退款订单数、申请退款人数、申请退款金额、成功退款订单数、成功退款人数、退款金额 +// List aggregationList = new ArrayList<>(); + String timeStr; + if (applyRefund) { + timeStr = "createTime"; + } else { + timeStr = "refundTime"; + } + + Criteria criteria = Criteria.where(timeStr).gte(beginDate).lt(endDate); + + if (CollUtil.isNotEmpty(spuIds)) { + criteria.and("orderItems.spuId").in(spuIds); + } + + ProjectionOperation projectionOperation = Aggregation.project("userId") + .and("orderItems.spuId").as("spuId") + .and("orderItems.count").as("applyRefundOrder") + .and("orderItems.refundAmount").as("applyRefundAmount"); + + GroupOperation userGroupOperation = Aggregation.group("spuId", "userId") + .first("spuId").as("spuId") + .sum("applyRefundOrder").as("applyRefundOrder") + .sum("applyRefundAmount").as("applyRefundAmount"); + + GroupOperation groupOperation = Aggregation.group("spuId") + .first("spuId").as("spuId") + .sum("applyRefundOrder").as("applyRefundOrder") + .sum("applyRefundAmount").as("applyRefundAmount") + .count().as("applyRefundUser"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSpuBO.class, + Aggregation.match(criteria), + Aggregation.unwind("orderItems"), + projectionOperation, + userGroupOperation, + groupOperation + ); + + List spuStatisticsList = mongoTemplate + .aggregate(typedAggregation, "order_refund", FlowSpuBO.class) + .getMappedResults(); + + // 插入订单数据 + for (FlowSpuBO flowSpuBO : spuStatisticsList) { + FlowSpuBO spuStatistics = spuStatisticsMap.get(flowSpuBO.getSpuId()); + if (Objects.isNull(spuStatistics)) { + spuStatisticsMap.put(flowSpuBO.getSpuId(), flowSpuBO); + spuStatistics = flowSpuBO; + } + if (applyRefund) { + spuStatistics.setApplyRefundUser(flowSpuBO.getApplyRefundUser()); + spuStatistics.setApplyRefundOrder(flowSpuBO.getApplyRefundOrder()); + spuStatistics.setApplyRefundAmount(flowSpuBO.getApplyRefundAmount()); + } else { + spuStatistics.setSuccessRefundUser(flowSpuBO.getApplyRefundUser()); + spuStatistics.setSuccessRefundOrder(flowSpuBO.getApplyRefundOrder()); + spuStatistics.setSuccessRefundAmount(flowSpuBO.getApplyRefundAmount()); + } + spuStatistics.setPlaceOrderNum(flowSpuBO.getPlaceOrderNum()); + spuStatistics.setPlaceOrderAmount(flowSpuBO.getPlaceOrderAmount()); + spuStatistics.setPayNum(flowSpuBO.getPayNum()); + spuStatistics.setPayAmount(flowSpuBO.getPayAmount()); + spuStatistics.setPayUser(flowSpuBO.getPayUser()); + } + } + + private List loadSpuStatisticsByFlowUserLog(List aggregationList) { + TypedAggregation typedAggregation = Aggregation.newAggregation(FlowSpuBO.class, aggregationList); + LOG.info("loadSpuStatisticsByFlowUserLog aggregationList:{}", typedAggregation); + return mongoTemplate + .aggregate(typedAggregation, "flow_user_log", FlowSpuBO.class) + .getMappedResults(); + } + + private void statisticsSpuOrderInfo(Date beginDate, Date endDate, Map spuStatisticsMap, List spuIds) { + // 下单人数、下单件数、下单金额、支付人数、支付件数、支付金额 + List aggregationList = new ArrayList<>(); + Criteria criteria = Criteria.where("createTime").gte(beginDate).lt(endDate); + if (CollUtil.isNotEmpty(spuIds)) { + criteria.and("orderItems.spuId").in(spuIds); + } + // 过滤 + aggregationList.add(Aggregation.match(criteria)); + // 展开 + aggregationList.add(Aggregation.unwind("orderItems")); + + aggregationList.add(Aggregation.project("userId", "isPayed") + .and("orderItems.spuId").as("spuId") + .and("orderItems.actualTotal").as("placeOrderAmount") + .and("orderItems.count").as("placeOrderNum") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then("$orderItems.actualTotal").otherwise(0)).as("payAmount") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then("$orderItems.count").otherwise(0)).as("payNum") + .and(ConditionalOperators.when(Criteria.where("isPayed").is(1)).then(1).otherwise(0)).as("payUser") + ); + + // 根据用户和商品id分组,统计商品的用户数据 + aggregationList.add(Aggregation.group("spuId", "userId") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("placeOrderNum").as("placeOrderNum") + .sum("payAmount").as("payAmount") + .sum("payNum").as("payNum") + .sum("payUser").as("payUser") + .count().as("placeOrderUser")); + + + // 分组,统计商品的订单数据 + aggregationList.add(Aggregation.group("_id.spuId") + .first("_id.spuId").as("spuId") + .sum("placeOrderAmount").as("placeOrderAmount") + .sum("placeOrderNum").as("placeOrderNum") + .sum("payAmount").as("payAmount") + .sum("payNum").as("payNum") + .sum("payUser").as("payUser") + .sum("placeOrderUser").as("placeOrderUser")); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + FlowSpuBO.class, + aggregationList); + LOG.info("statisticsSpuOrderInfo.typedAggregation:{}", typedAggregation); + + List spuStatisticsList = mongoTemplate + .aggregate(typedAggregation, "order", FlowSpuBO.class) + .getMappedResults(); + + // 插入订单数据 + for (FlowSpuBO flowSpuBO : spuStatisticsList) { + if (spuStatisticsMap.containsKey(flowSpuBO.getSpuId())) { + FlowSpuBO spuStatistics = spuStatisticsMap.get(flowSpuBO.getSpuId()); + spuStatistics.setPlaceOrderUser(flowSpuBO.getPlaceOrderUser()); + spuStatistics.setPlaceOrderNum(flowSpuBO.getPlaceOrderNum()); + spuStatistics.setPlaceOrderAmount(flowSpuBO.getPlaceOrderAmount()); + spuStatistics.setPayNum(flowSpuBO.getPayNum()); + spuStatistics.setPayAmount(flowSpuBO.getPayAmount()); + spuStatistics.setPayUser(flowSpuBO.getPayUser()); + } else { + spuStatisticsMap.put(flowSpuBO.getSpuId(), flowSpuBO); + } + } + } + + private void batchInsertFlowSpuBO(Integer dateType, Date beginDate, Date endDate, List flowSpuUserList) { + String date = DateUtil.format(beginDate, "yyMMdd"); + Date currentTime = new Date(); + + Long beginId = FlowUtil.timeToId(beginDate, FlowSpuBO.ID_LENGTH); + Long endId = FlowUtil.timeToId(endDate, FlowSpuBO.ID_LENGTH); + Query idQuery = new Query(Criteria.where("_id").gte(beginId).lt(endId)); + idQuery.with(Sort.by(Sort.Order.desc("_id"))).limit(1); + // 获取最大的id,然后递增 + List flowSpus = mongoTemplate.find(idQuery, FlowSpuBO.class); + long index = 0; + if (CollUtil.isNotEmpty(flowSpus) && Objects.nonNull(flowSpus.get(0).getId())) { + index = flowSpus.get(0).getId(); + } else { + index = FlowUtil.getId(date, 0, FlowSpuBO.ID_LENGTH); + } + + for (FlowSpuBO flowSpuBO : flowSpuUserList) { + index ++; + flowSpuBO.setCreateTime(beginDate); + flowSpuBO.setUpdateTime(currentTime); + flowSpuBO.setDateType(dateType); + flowSpuBO.setId(index); + } + Query query = FlowUtil.getRemoveQuery(beginDate, endDate, FlowSpuBO.ID_LENGTH, dateType); + LOG.info("batchInsertFlowSpuBO query:{}", query); + // 先删除再更新 + mongoTemplate.remove(query, FlowSpuBO.class); + + // 统计的数据批量保存到flow_spu + mongoTemplate.insertAll(flowSpuUserList); + } + + private void setSpuInfo(Map spuStatisticsMap) { + ServerResponseEntity> spuResponseEntity = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuStatisticsMap.keySet())); + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity.getMsg()); + } + if (CollUtil.isEmpty(spuResponseEntity.getData())) { + return; + } + + Map spuMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, s -> s)); + + Iterator iterator = spuStatisticsMap.keySet().iterator(); + + while (iterator.hasNext()) { + Long spuId = iterator.next(); + SpuVO spuVO = spuMap.get(spuId); + // 删除的商品不统计 + if (!spuMap.containsKey(spuId) || Objects.equals(spuVO.getStatus(), SpuStatus.DELETE.value())) { + iterator.remove(); + continue; + } + FlowSpuBO flowSpuBO = spuStatisticsMap.get(spuId); + flowSpuBO.setShopId(spuVO.getShopId()); + flowSpuBO.setSupplierSpuId(spuVO.getSupplierSpuId()); + flowSpuBO.setSupplierId(spuVO.getSupplierId()); + } + } + + + private void batchInsertFlowSpuUserBO(Date beginDate, Date endDate, List flowSpuUserList) { + Long beginId = FlowUtil.timeToId(beginDate); + Long endId = FlowUtil.timeToId(endDate); + // 先删除再更新-mongo没有事务,如果之前保存后程序报错了,数据还是保存在数据库中 + mongoTemplate.remove(new Query(Criteria.where("_id").gte(beginId).lt(endId)), FlowSpuUserBO.class); + + // 统计的数据批量保存到flow_system + mongoTemplate.insertAll(flowSpuUserList); + } + + private List statisticsSpuUserOfDay(Date beginDate, Date endDate) { + MatchOperation matchOperation = Aggregation.match(Criteria.where("dt").gte(beginDate).lt(endDate) + .orOperator(Criteria.where("pid").is(FlowLogPageEnum.PROD_INFO.value()), + Criteria.where("ve").is(FlowVisitEnum.SHOP_CAT.value())) + ); + + // 根据oid和bid分组,初步去重 + GroupOperation initGroupOperation = Aggregation.group("oid", "bid") + .first("ip").as("ip") + .last("uid").as("uid") + .last("bid").as("bid") + .sum("n").as("plusShopCartNum") + .count().as("visitNum"); + + GroupOperation groupOperation = Aggregation.group("uid", "bid") + .first("ip").as("provinceId") + .last("uid").as("userId") + .last("oid").as("oid") + .last("bid").as("spuId") + .sum("plusShopCartNum").as("plusShopCartNum") + .sum("visitNum").as("visitNum"); + + TypedAggregation typedAggregation = Aggregation.newAggregation ( + FlowSpuUserBO.class, + matchOperation, + initGroupOperation, + groupOperation, + Aggregation.project("provinceId", "userId", "spuId", "plusShopCartNum", "visitNum", "oid").andExclude("_id") + ); + + LOG.info("statisticsSpuUserOfDay.typedAggregation:{}", typedAggregation); + + return mongoTemplate + .aggregate(typedAggregation, "flow_user_log", FlowSpuUserBO.class) + .getMappedResults(); + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/UserVisitAnalysisServiceImpl.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/UserVisitAnalysisServiceImpl.java new file mode 100644 index 0000000..cd94d8e --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/service/impl/UserVisitAnalysisServiceImpl.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.service.impl; + +import com.tmerclub.cloud.api.delivery.feign.AreaFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.flow.bo.FlowRegionalBO; +import com.tmerclub.cloud.flow.bo.FlowSystemBO; +import com.tmerclub.cloud.flow.bo.FlowUserFootprintBO; +import com.tmerclub.cloud.flow.constant.SystemTypeEnum; +import com.tmerclub.cloud.flow.dto.FlowAnalysisDTO; +import com.tmerclub.cloud.flow.service.SystemAnalyseMongoService; +import com.tmerclub.cloud.flow.service.UserAnalyseMongoService; +import com.tmerclub.cloud.flow.service.UserVisitAnalysisService; +import com.tmerclub.cloud.flow.util.FlowUtil; +import com.tmerclub.cloud.flow.vo.FlowUserAnalysisVO; +import com.tmerclub.cloud.flow.vo.UserAnalysisDataExcelVO; +import com.tmerclub.cloud.flow.vo.UserAnalysisVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 流量分析—用户访问数据 + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +@Service +public class UserVisitAnalysisServiceImpl implements UserVisitAnalysisService { + + @DubboReference + private AreaFeignClient areaFeignClient; + @Autowired + private UserAnalyseMongoService userAnalyseMongoService; + @Autowired + private SystemAnalyseMongoService systemAnalyseMongoService; + + @Override + public FlowUserAnalysisVO getUserAnalysisData(FlowAnalysisDTO flowAnalysisDTO) { + FlowUtil.handleTime(flowAnalysisDTO); + // 访问深度 + List flowUserFootprintList = userAnalyseMongoService.listUserFootprint(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getEndTime(), flowAnalysisDTO.getDateType()); + // 访问地域 + List flowRegionalList = userAnalyseMongoService.listFlowRegional(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getEndTime(), flowAnalysisDTO.getDateType()); + // 系统设备 + List flowSystemList = systemAnalyseMongoService.listFlowSystem(flowAnalysisDTO.getStartTime(), flowAnalysisDTO.getEndTime(), flowAnalysisDTO.getDateType()); + // 拼接数据 + FlowUserAnalysisVO flowUserAnalysisVO = new FlowUserAnalysisVO(); + + // 处理访问深度的数据 + flowUserAnalysisVO.setVisitPageList(this.getVisitPageList(flowUserFootprintList)); + + // 处理访问地域分布的数据 + List areaList = areaFeignClient.listProvinceArea(); + Map areaMap = areaList.stream().collect(Collectors.toMap(AreaVO::getAreaId, AreaVO::getAreaName)); + flowUserAnalysisVO.setVisitUserList(this.getUserAccessData(flowRegionalList, areaMap)); + flowSystemList.forEach(flowSystemBO -> { + if(Objects.isNull(flowSystemBO.getVisitUser())){ + flowSystemBO.setVisitUser(0); + } + }); + Map flowSystemMap = flowSystemList.stream().collect(Collectors.toMap(FlowSystemBO::getSystemType, FlowSystemBO::getVisitUser)); + // 系统设备访问情况 + for (SystemTypeEnum systemTypeEnum : SystemTypeEnum.values()) { + Integer visitUser = flowSystemMap.getOrDefault(systemTypeEnum.value(), 0); + + switch (Objects.requireNonNull(SystemTypeEnum.instance(systemTypeEnum.value()))) { + case H5: + flowUserAnalysisVO.setH5(visitUser); + break; + case PC: + flowUserAnalysisVO.setPc(visitUser); + break; + case IOS: + flowUserAnalysisVO.setIos(visitUser); + break; + case ANDROID: + flowUserAnalysisVO.setAndroid(visitUser); + break; + case APPLETS: + flowUserAnalysisVO.setApplets(visitUser); + break; + default: + break; + } + } + return flowUserAnalysisVO; + } + + @Override + public List listUserAnalysisDataExcel(FlowAnalysisDTO flowAnalysisDTO) { + FlowUserAnalysisVO userAnalysisData = getUserAnalysisData(flowAnalysisDTO); + List visitUserList = userAnalysisData.getVisitUserList(); + List userAnalysisDataExcelList = BeanUtil.mapAsList(visitUserList, UserAnalysisDataExcelVO.class); + for (UserAnalysisDataExcelVO userAnalysisVO : userAnalysisDataExcelList) { + if (Objects.isNull(userAnalysisVO.getPlusShopCart())) { + userAnalysisVO.setPlusShopCart(0L); + } + if (Objects.isNull(userAnalysisVO.getVisitNums())) { + userAnalysisVO.setVisitNums(0); + } + if (Objects.isNull(userAnalysisVO.getClickNums())) { + userAnalysisVO.setClickNums(0); + } + if (Objects.isNull(userAnalysisVO.getProdVisitUser())) { + userAnalysisVO.setProdVisitUser(0); + } + if (Objects.isNull(userAnalysisVO.getProdVisitNums())) { + userAnalysisVO.setProdVisitNums(0); + } + if (Objects.isNull(userAnalysisVO.getPayAmount())) { + userAnalysisVO.setPayAmount(0D); + } + if (Objects.isNull(userAnalysisVO.getPlaceOrderAmount())) { + userAnalysisVO.setPlaceOrderAmount(0D); + } + userAnalysisVO.setPayAmount(Arith.div(userAnalysisVO.getPayAmount(), 100, 2)); + userAnalysisVO.setPlaceOrderAmount(Arith.div(userAnalysisVO.getPlaceOrderAmount(), 100, 2)); + } + return userAnalysisDataExcelList; + } + + /** + * 获取访问深度数据 + * @param flowUserFootprintList + * @return + */ + private List getVisitPageList(List flowUserFootprintList) { + // 访问深度Map + Map map = flowUserFootprintList.stream() + .collect(Collectors.toMap(FlowUserFootprintBO::getVisitId, FlowUserFootprintBO::getUserNums)); + + List visitNumList = new ArrayList<>(); + for (int i = 1; i <= Constant.EIGHT; i++) { + FlowUserAnalysisVO.VisitNum visitNum; + visitNum = new FlowUserAnalysisVO.VisitNum(i, map.getOrDefault(i, 0)); + visitNumList.add(visitNum); + } + return visitNumList; + } + + /** + * 获取访问地域分布数据 + * @param flowRegionalList + * @param areaMap + * @return + */ + private List getUserAccessData(List flowRegionalList, Map areaMap) { + List userAnalysisList = new ArrayList<>(); + for (FlowRegionalBO flowRegionalBO : flowRegionalList) { + UserAnalysisVO userAnalysisVO = new UserAnalysisVO(); + // 省名称 + if (Objects.nonNull(flowRegionalBO.getProvinceId())) { + userAnalysisVO.setProvinceName(areaMap.getOrDefault(flowRegionalBO.getProvinceId().longValue(), "未知")); + } + // 浏览量、浏览用户 + userAnalysisVO.setVisitNums(flowRegionalBO.getVisitNum()); + userAnalysisVO.setVisitUserNum(flowRegionalBO.getVisitUserNum()); + // 商品访客数、商品浏览量 + userAnalysisVO.setProdVisitNums(flowRegionalBO.getSpuVisitNum()); + userAnalysisVO.setProdVisitUser(flowRegionalBO.getSpuVisitUserNum()); + // 加购数量 + userAnalysisVO.setPlusShopCart(flowRegionalBO.getPlusShopCartNum()); + // 下单金额、支付金额 + userAnalysisVO.setPlaceOrderAmount(flowRegionalBO.getPlaceOrderAmount()); + userAnalysisVO.setPayAmount(flowRegionalBO.getPayAmount()); + userAnalysisList.add(userAnalysisVO); + } + return userAnalysisList; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/IpSearchUtil.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/IpSearchUtil.java new file mode 100644 index 0000000..1f4f5fe --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/util/IpSearchUtil.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.util; + +import cn.hutool.core.io.IoUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.util.IpHelper; +import org.lionsoul.ip2region.xdb.Searcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Objects; + +/** + * 流量统计计算工具类 + * + * @author YXF + */ +public class IpSearchUtil { + + private static final Logger LOG = LoggerFactory.getLogger(IpSearchUtil.class); + + private static Searcher searcher; + + static { + // 获取ip库路径 + ClassPathResource classPathResource = new ClassPathResource("ip2region.xdb"); + if (classPathResource.getClassLoader() == null){ + LOG.error("ip2region.xdb 存储路径发生错误,没有被发现"); + searcher = null; + } + InputStream inputStream = null; + try { + inputStream = classPathResource.getInputStream(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + // 1、从 dbPath 加载整个 xdb 到内存。 + byte[] cBuff = IoUtil.readBytes(inputStream); + + // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 + Searcher searcherNew = null; + try { + searcherNew = Searcher.newWithBuffer(cBuff); + } catch (Exception e) { + System.out.printf("failed to create content cached searcher: %s\n", e); + } + searcher = searcherNew; + } + + + + + + public static Long getProvinceIdByUserIp(Long ipNum, Map areaMap) { + if (Objects.isNull(ipNum) || ipNum == 0L) { + return 0L; + } + + String province = ""; + // 根据IP搜索地址信息 + try { + String ip = IpHelper.longToIp(ipNum); + String region = searcher.search(ip); + province = region.split("\\|")[2]; + } catch (Exception e) { + LOG.info("ip查询异常: {}", e.toString()); + return 0L; + } + if (areaMap.containsKey(province)) { + return areaMap.get(province); + } + LOG.info("ip地区名称与数据库省名称不匹配: {}", province); + return 0L; + } + +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisRatioVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisRatioVO.java new file mode 100644 index 0000000..8e4baef --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisRatioVO.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 流量数据比例 + * + * @author YXF + * @date 2021-06-02 + */ +public class FlowAnalysisRatioVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "访客数比例") + private Double userNumsRatio; + + @Schema(description = "新访客数比例") + private Double newUserNumsRatio; + + @Schema(description = "跳失率比例") + private Double lossUserRatio; + + @Schema(description = "访问量比例") + private Double visitNumsRatio; + + @Schema(description = "人均访问量比例") + private Double averageVisitNumsRatio; + + @Schema(description = "加购人数比例") + private Double plusShopCartUserRatio; + + @Schema(description = "访问-下单比例") + private Double placeOrderRatio; + + @Schema(description = "下单用户比例") + private Double placeOrderUserRatio; + + @Schema(description = "访问-支付比例") + private Double payRatio; + + @Schema(description = "支付用户比例") + private Double payUserRatio; + + public Double getUserNumsRatio() { + return userNumsRatio; + } + + public void setUserNumsRatio(Double userNumsRatio) { + this.userNumsRatio = userNumsRatio; + } + + public Double getNewUserNumsRatio() { + return newUserNumsRatio; + } + + public void setNewUserNumsRatio(Double newUserNumsRatio) { + this.newUserNumsRatio = newUserNumsRatio; + } + + public Double getLossUserRatio() { + return lossUserRatio; + } + + public void setLossUserRatio(Double lossUserRatio) { + this.lossUserRatio = lossUserRatio; + } + + public Double getVisitNumsRatio() { + return visitNumsRatio; + } + + public void setVisitNumsRatio(Double visitNumsRatio) { + this.visitNumsRatio = visitNumsRatio; + } + + public Double getAverageVisitNumsRatio() { + return averageVisitNumsRatio; + } + + public void setAverageVisitNumsRatio(Double averageVisitNumsRatio) { + this.averageVisitNumsRatio = averageVisitNumsRatio; + } + + public Double getPlusShopCartUserRatio() { + return plusShopCartUserRatio; + } + + public void setPlusShopCartUserRatio(Double plusShopCartUserRatio) { + this.plusShopCartUserRatio = plusShopCartUserRatio; + } + + public Double getPlaceOrderRatio() { + return placeOrderRatio; + } + + public void setPlaceOrderRatio(Double placeOrderRatio) { + this.placeOrderRatio = placeOrderRatio; + } + + public Double getPlaceOrderUserRatio() { + return placeOrderUserRatio; + } + + public void setPlaceOrderUserRatio(Double placeOrderUserRatio) { + this.placeOrderUserRatio = placeOrderUserRatio; + } + + public Double getPayRatio() { + return payRatio; + } + + public void setPayRatio(Double payRatio) { + this.payRatio = payRatio; + } + + public Double getPayUserRatio() { + return payUserRatio; + } + + public void setPayUserRatio(Double payUserRatio) { + this.payUserRatio = payUserRatio; + } + + @Override + public String toString() { + return "FlowAnalysisRatioVO{" + + "userNumsRatio=" + userNumsRatio + + ", newUserNumsRatio=" + newUserNumsRatio + + ", lossUserRatio=" + lossUserRatio + + ", visitNumsRatio=" + visitNumsRatio + + ", averageVisitNumsRatio=" + averageVisitNumsRatio + + ", plusShopCartUserRatio=" + plusShopCartUserRatio + + ", placeOrderRatio=" + placeOrderRatio + + ", placeOrderUserRatio=" + placeOrderUserRatio + + ", payRatio=" + payRatio + + ", payUserRatio=" + payUserRatio + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisVO.java new file mode 100644 index 0000000..a9bbeb5 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowAnalysisVO.java @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-06-02 + */ +public class FlowAnalysisVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "日期时间") + private String dateTime; + + @Schema(description = "UV价值 (支付金额/访客数)") + private Long uvAmount; + + @Schema(description = "客单价") + private Long customerAmount; + + @Schema(description = "流失用户") + private Integer lossUser; + + @Schema(description = "跳失率") + private Double lossUserRate; + + @Schema(description = "加购数量") + private Integer plusShopCart; + + @Schema(description = "加购人数") + private Integer plusShopCartUser; + + @Schema(description = "下单金额") + private Long placeOrderAmount; + + @Schema(description = "下单用户") + private Integer placeOrderUser; + + @Schema(description = "访问-下单率") + private Double placeOrderRate; + + @Schema(description = "支付金额") + private Long payAmount; + + @Schema(description = "支付用户") + private Integer payUser; + + @Schema(description = "访问-支付率") + private Double payRate; + + @Schema(description = "访问量") + private Integer visitNums; + + @Schema(description = "人均访问量") + private Double averageVisitNums; + + @Schema(description = "访客数") + private Integer userNums; + + @Schema(description = "新访客数") + private Integer newUserNums; + + @Schema(description = "新访客数") + private Integer oldUserNum; + + @Schema(description = "系统类型 0:全部 1:pc 2:h5 3:小程序 4:安卓 5:ios") + private Integer systemType; + + @Schema(description = "增长率") + private FlowAnalysisRatioVO ratio; + + /** + * 数据类型 1:新数据 2:旧数据 + */ + private Boolean newData; + /** + * 时间(周、月) + */ + private Integer createDate; + /** + * 时间(日) + */ + private Date day; + + + public Boolean getNewData() { + return newData; + } + + public void setNewData(Boolean newData) { + this.newData = newData; + } + + public String getDateTime() { + return dateTime; + } + + public void setDateTime(String dateTime) { + this.dateTime = dateTime; + } + + public Integer getCreateDate() { + return createDate; + } + + public void setCreateDate(Integer createDate) { + this.createDate = createDate; + } + + public Date getDay() { + return day; + } + + public void setDay(Date day) { + this.day = day; + } + + public Long getUvAmount() { + return uvAmount; + } + + public void setUvAmount(Long uvAmount) { + this.uvAmount = uvAmount; + } + + public Long getCustomerAmount() { + return customerAmount; + } + + public void setCustomerAmount(Long customerAmount) { + this.customerAmount = customerAmount; + } + + public Integer getLossUser() { + return lossUser; + } + + public void setLossUser(Integer lossUser) { + this.lossUser = lossUser; + } + + public Double getLossUserRate() { + return lossUserRate; + } + + public void setLossUserRate(Double lossUserRate) { + this.lossUserRate = lossUserRate; + } + + public Integer getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Integer plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Integer getPlusShopCartUser() { + return plusShopCartUser; + } + + public void setPlusShopCartUser(Integer plusShopCartUser) { + this.plusShopCartUser = plusShopCartUser; + } + + public Long getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Long placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Integer getPlaceOrderUser() { + return placeOrderUser; + } + + public void setPlaceOrderUser(Integer placeOrderUser) { + this.placeOrderUser = placeOrderUser; + } + + public Double getPlaceOrderRate() { + return placeOrderRate; + } + + public void setPlaceOrderRate(Double placeOrderRate) { + this.placeOrderRate = placeOrderRate; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getPayUser() { + return payUser; + } + + public void setPayUser(Integer payUser) { + this.payUser = payUser; + } + + public Double getPayRate() { + return payRate; + } + + public void setPayRate(Double payRate) { + this.payRate = payRate; + } + + public Integer getVisitNums() { + return visitNums; + } + + public void setVisitNums(Integer visitNums) { + this.visitNums = visitNums; + } + + public Double getAverageVisitNums() { + return averageVisitNums; + } + + public void setAverageVisitNums(Double averageVisitNums) { + this.averageVisitNums = averageVisitNums; + } + + public Integer getUserNums() { + return userNums; + } + + public void setUserNums(Integer userNums) { + this.userNums = userNums; + } + + public Integer getNewUserNums() { + return newUserNums; + } + + public void setNewUserNums(Integer newUserNums) { + this.newUserNums = newUserNums; + } + + public Integer getOldUserNum() { + return oldUserNum; + } + + public void setOldUserNum(Integer oldUserNum) { + this.oldUserNum = oldUserNum; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + + public FlowAnalysisRatioVO getRatio() { + return ratio; + } + + public void setRatio(FlowAnalysisRatioVO ratio) { + this.ratio = ratio; + } + + @Override + public String toString() { + return "FlowAnalysisVO{" + + "newData=" + newData + + ", dateTime='" + dateTime + '\'' + + ", createDate=" + createDate + + ", day=" + day + + ", UVAmount=" + uvAmount + + ", customerAmount=" + customerAmount + + ", lossUser=" + lossUser + + ", lossUserRate=" + lossUserRate + + ", plusShopCart=" + plusShopCart + + ", plusShopCartUser=" + plusShopCartUser + + ", placeOrderAmount=" + placeOrderAmount + + ", placeOrderUser=" + placeOrderUser + + ", placeOrderRate=" + placeOrderRate + + ", payAmount=" + payAmount + + ", payUser=" + payUser + + ", payRate=" + payRate + + ", visitNums=" + visitNums + + ", averageVisitNums=" + averageVisitNums + + ", userNums=" + userNums + + ", newUserNums=" + newUserNums + + ", oldUserNum=" + oldUserNum + + ", systemType=" + systemType + + ", ratio=" + ratio + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowUserAnalysisVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowUserAnalysisVO.java new file mode 100644 index 0000000..32dbeb1 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FlowUserAnalysisVO.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/6/3 10:03 + */ +public class FlowUserAnalysisVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "访问深度") + private List visitPageList; + + @Schema(description = "访客地域分布") + private List visitUserList; + + @Schema(description = "系统设备-pc") + private Integer pc; + + @Schema(description = "系统设备-h5") + private Integer h5; + + @Schema(description = "系统设备-小程序") + private Integer applets; + + @Schema(description = "系统设备-安卓") + private Integer android; + + @Schema(description = "系统设备-ios") + private Integer ios; + + public static class VisitNum implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 访问页面数量 (编号:访问页面数量)1:1 2:2 3:3 4:4 5:5 6:6-10 7:11-20 8:20+ + */ + private Integer visitId; + + /** + * 用户数 + */ + private Integer userNums; + + public Integer getVisitId() { + return visitId; + } + + public void setVisitId(Integer visitId) { + this.visitId = visitId; + } + + public Integer getUserNums() { + return userNums; + } + + public void setUserNums(Integer userNums) { + this.userNums = userNums; + } + + @Override + public String toString() { + return "VisitNum{" + + "visitId=" + visitId + + ", userNums=" + userNums + + '}'; + } + + public VisitNum(Integer visitId, Integer userNums) { + this.visitId = visitId; + this.userNums = userNums; + } + + public VisitNum() { + } + } + + public List getVisitPageList() { + return visitPageList; + } + + public void setVisitPageList(List visitPageList) { + this.visitPageList = visitPageList; + } + + public List getVisitUserList() { + return visitUserList; + } + + public void setVisitUserList(List visitUserList) { + this.visitUserList = visitUserList; + } + + public Integer getPc() { + return pc; + } + + public void setPc(Integer pc) { + this.pc = pc; + } + + public Integer getH5() { + return h5; + } + + public void setH5(Integer h5) { + this.h5 = h5; + } + + public Integer getApplets() { + return applets; + } + + public void setApplets(Integer applets) { + this.applets = applets; + } + + public Integer getAndroid() { + return android; + } + + public void setAndroid(Integer android) { + this.android = android; + } + + public Integer getIos() { + return ios; + } + + public void setIos(Integer ios) { + this.ios = ios; + } + + @Override + public String toString() { + return "FlowUserAnalysisVO{" + + "visitPageList=" + visitPageList + + ", visitUserList=" + visitUserList + + ", pc=" + pc + + ", h5=" + h5 + + ", applets=" + applets + + ", android=" + android + + ", ios=" + ios + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormExcelVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormExcelVO.java new file mode 100644 index 0000000..fc8ab77 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormExcelVO.java @@ -0,0 +1,268 @@ +package com.tmerclub.cloud.flow.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class FormExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty("日期") + private String date; + + @ExcelProperty("客单价") + private String customerUnitPrice; + + @ExcelProperty("总成交金额") + private String totalTransactionAmount; + + @ExcelProperty("自营客单价") + private String selfCustomerUnitPrice; + + @ExcelProperty("自营金额") + private String selfAmount; + + @ExcelProperty("自营订单数") + private Integer selfOrders; + + @ExcelProperty("自营商品数") + private Integer selfProducts; + + @ExcelProperty("自营下单人数") + private Integer selfNums; + + @ExcelProperty("下单金额") + private String orderAmount; + + @ExcelProperty("下单人数") + private Integer peopleOrderNums; + + @ExcelProperty("下单笔数") + private Integer orderNums; + + @ExcelProperty("下单商品数") + private Integer orderProducts; + + @ExcelProperty("支付金额") + private String paymentAmount; + + @ExcelProperty("支付人数") + private Integer payPeopleNums; + + @ExcelProperty("支付订单数") + private Integer payOrderNums; + + @ExcelProperty("支付商品数") + private Integer payProductNums; + + @ExcelProperty("成功退款金额") + private String successRefundAmount; + + @ExcelProperty("退款订单数量") + private Integer refundOrderNums; + + @ExcelProperty("下单-支付转化率") + private String orderPaymentRate; + + @ExcelProperty("退款率") + private String refundRate; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public String getCustomerUnitPrice() { + return customerUnitPrice; + } + + public void setCustomerUnitPrice(String customerUnitPrice) { + this.customerUnitPrice = customerUnitPrice; + } + + public String getTotalTransactionAmount() { + return totalTransactionAmount; + } + + public void setTotalTransactionAmount(String totalTransactionAmount) { + this.totalTransactionAmount = totalTransactionAmount; + } + + public String getSelfCustomerUnitPrice() { + return selfCustomerUnitPrice; + } + + public void setSelfCustomerUnitPrice(String selfCustomerUnitPrice) { + this.selfCustomerUnitPrice = selfCustomerUnitPrice; + } + + public String getSelfAmount() { + return selfAmount; + } + + public void setSelfAmount(String selfAmount) { + this.selfAmount = selfAmount; + } + + public Integer getSelfOrders() { + return selfOrders; + } + + public void setSelfOrders(Integer selfOrders) { + this.selfOrders = selfOrders; + } + + public Integer getSelfProducts() { + return selfProducts; + } + + public void setSelfProducts(Integer selfProducts) { + this.selfProducts = selfProducts; + } + + public Integer getSelfNums() { + return selfNums; + } + + public void setSelfNums(Integer selfNums) { + this.selfNums = selfNums; + } + + public String getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(String orderAmount) { + this.orderAmount = orderAmount; + } + + public Integer getPeopleOrderNums() { + return peopleOrderNums; + } + + public void setPeopleOrderNums(Integer peopleOrderNums) { + this.peopleOrderNums = peopleOrderNums; + } + + public Integer getOrderNums() { + return orderNums; + } + + public void setOrderNums(Integer orderNums) { + this.orderNums = orderNums; + } + + public Integer getOrderProducts() { + return orderProducts; + } + + public void setOrderProducts(Integer orderProducts) { + this.orderProducts = orderProducts; + } + + public String getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(String paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public Integer getPayPeopleNums() { + return payPeopleNums; + } + + public void setPayPeopleNums(Integer payPeopleNums) { + this.payPeopleNums = payPeopleNums; + } + + public Integer getPayOrderNums() { + return payOrderNums; + } + + public void setPayOrderNums(Integer payOrderNums) { + this.payOrderNums = payOrderNums; + } + + public Integer getPayProductNums() { + return payProductNums; + } + + public void setPayProductNums(Integer payProductNums) { + this.payProductNums = payProductNums; + } + + public String getSuccessRefundAmount() { + return successRefundAmount; + } + + public void setSuccessRefundAmount(String successRefundAmount) { + this.successRefundAmount = successRefundAmount; + } + + public Integer getRefundOrderNums() { + return refundOrderNums; + } + + public void setRefundOrderNums(Integer refundOrderNums) { + this.refundOrderNums = refundOrderNums; + } + + public String getOrderPaymentRate() { + return orderPaymentRate; + } + + public void setOrderPaymentRate(String orderPaymentRate) { + this.orderPaymentRate = orderPaymentRate; + } + + public String getRefundRate() { + return refundRate; + } + + public void setRefundRate(String refundRate) { + this.refundRate = refundRate; + } + + @Override + public String toString() { + return "FormExcelVO{" + + "date='" + date + '\'' + + ", customerUnitPrice='" + customerUnitPrice + '\'' + + ", totalTransactionAmount='" + totalTransactionAmount + '\'' + + ", selfCustomerUnitPrice='" + selfCustomerUnitPrice + '\'' + + ", selfAmount='" + selfAmount + '\'' + + ", selfOrders=" + selfOrders + + ", selfProducts=" + selfProducts + + ", selfNums=" + selfNums + + ", orderAmount='" + orderAmount + '\'' + + ", peopleOrderNums=" + peopleOrderNums + + ", orderNums=" + orderNums + + ", orderProducts=" + orderProducts + + ", paymentAmount='" + paymentAmount + '\'' + + ", payPeopleNums=" + payPeopleNums + + ", payOrderNums=" + payOrderNums + + ", payProductNums=" + payProductNums + + ", successRefundAmount='" + successRefundAmount + '\'' + + ", refundOrderNums=" + refundOrderNums + + ", orderPaymentRate='" + orderPaymentRate + '\'' + + ", refundRate='" + refundRate + '\'' + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormVO.java new file mode 100644 index 0000000..7b494cb --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/FormVO.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 数据表格VO + * + * @author TRACK + */ +public class FormVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long formId; + + @Schema(description = "店铺Id") + private Long shopId; + + @Schema(description = "报表名称") + private String formName; + + @Schema(description = "推荐报表介绍内容") + private String content; + + @Schema(description = "报表类型 1:店铺报表 2:商品报表") + private Integer fromType; + + @Schema(description = "时间类型 1:天 2:周 3:月") + private Integer timeType; + + @Schema(description = "时间格式 1:固定时间区间 2:指定时间范围") + private Integer timeFormat; + + @Schema(description = "报表项id数组") + private String formItemIds; + + @Schema(description = "开始时间(固定时间区间)") + private Date startTime; + + @Schema(description = "结束时间(固定时间区间)") + private Date endTime; + + @Schema(description = "时间范围 1:近1天 2:近7天 3: 近30天") + private Integer timeRange; + + @Schema(description = "序号") + private Integer seq; + + @Schema(description = "报表项列表") + private List formItemList; + + public Long getFormId() { + return formId; + } + + public void setFormId(Long formId) { + this.formId = formId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getFormName() { + return formName; + } + + public void setFormName(String formName) { + this.formName = formName; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getFromType() { + return fromType; + } + + public void setFromType(Integer fromType) { + this.fromType = fromType; + } + + public Integer getTimeType() { + return timeType; + } + + public void setTimeType(Integer timeType) { + this.timeType = timeType; + } + + public Integer getTimeFormat() { + return timeFormat; + } + + public void setTimeFormat(Integer timeFormat) { + this.timeFormat = timeFormat; + } + + public String getFormItemIds() { + return formItemIds; + } + + public void setFormItemIds(String formItemIds) { + this.formItemIds = formItemIds; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getTimeRange() { + return timeRange; + } + + public void setTimeRange(Integer timeRange) { + this.timeRange = timeRange; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public List getFormItemList() { + return formItemList; + } + + public void setFormItemList(List formItemList) { + this.formItemList = formItemList; + } + + @Override + public String toString() { + return "FormVO{" + + "formId=" + formId + + ", shopId=" + shopId + + ", formName='" + formName + '\'' + + ", content='" + content + '\'' + + ", fromType=" + fromType + + ", timeType=" + timeType + + ", timeFormat=" + timeFormat + + ", formItemIds='" + formItemIds + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", timeRange=" + timeRange + + ", seq=" + seq + + ", formItemList=" + formItemList + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/MemberSurveyRespVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/MemberSurveyRespVO.java new file mode 100644 index 0000000..785d7c4 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/MemberSurveyRespVO.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import com.tmerclub.cloud.api.user.vo.MemberOverviewVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lhd + */ +public class MemberSurveyRespVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private MemberOverviewVO memberOverviewModel; + + private List memberOverviewModelList; + + public MemberOverviewVO getMemberOverviewModel() { + return memberOverviewModel; + } + + public void setMemberOverviewModel(MemberOverviewVO memberOverviewModel) { + this.memberOverviewModel = memberOverviewModel; + } + + public List getMemberOverviewModelList() { + return memberOverviewModelList; + } + + public void setMemberOverviewModelList(List memberOverviewModelList) { + this.memberOverviewModelList = memberOverviewModelList; + } + + @Override + public String toString() { + return "MemberSurveyRespVO{" + + "memberOverviewModel=" + memberOverviewModel + + ", memberOverviewModelList=" + memberOverviewModelList + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/MemberTrendExcelVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/MemberTrendExcelVO.java new file mode 100644 index 0000000..2d66a42 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/MemberTrendExcelVO.java @@ -0,0 +1,69 @@ +package com.tmerclub.cloud.flow.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class MemberTrendExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "会员分析"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"会员分析", "日期"}) + private String date; + + @ExcelProperty({"会员分析", "普通会员增加人数"}) + private Integer normal; + + @ExcelProperty({"会员分析", "付费会员增加人数"}) + private Integer pay; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public Integer getNormal() { + return normal; + } + + public void setNormal(Integer normal) { + this.normal = normal; + } + + public Integer getPay() { + return pay; + } + + public void setPay(Integer pay) { + this.pay = pay; + } + + @Override + public String toString() { + return "MemberTrendExcelVO{" + + "date='" + date + '\'' + + ", normal=" + normal + + ", pay=" + pay + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductAnalyseUserVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductAnalyseUserVO.java new file mode 100644 index 0000000..dba904d --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ProductAnalyseUserVO.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—页面数据统计表VO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class ProductAnalyseUserVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long productAnalyseUserId; + + @Schema(description = "页面分析id") + private Long productAnalyseId; + + @Schema(description = "uuid") + private String uuid; + + @Schema(description = "创建日期") + private Date createDate; + + @Schema(description = "商品id") + private String spuId; + + @Schema(description = "访问") + private Integer isVisit; + + @Schema(description = "页面点击") + private Integer isClick; + + @Schema(description = "分享访问") + private Integer isShareVisit; + + @Schema(description = "下单") + private Integer isPlaceOrder; + + @Schema(description = "支付") + private Integer isPay; + + @Schema(description = "加购") + private Integer isPlusShopCart; + + public Long getProductAnalyseUserId() { + return productAnalyseUserId; + } + + public void setProductAnalyseUserId(Long productAnalyseUserId) { + this.productAnalyseUserId = productAnalyseUserId; + } + + public Long getProductAnalyseId() { + return productAnalyseId; + } + + public void setProductAnalyseId(Long productAnalyseId) { + this.productAnalyseId = productAnalyseId; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getSpuId() { + return spuId; + } + + public void setSpuId(String spuId) { + this.spuId = spuId; + } + + public Integer getIsVisit() { + return isVisit; + } + + public void setIsVisit(Integer isVisit) { + this.isVisit = isVisit; + } + + public Integer getIsClick() { + return isClick; + } + + public void setIsClick(Integer isClick) { + this.isClick = isClick; + } + + public Integer getIsShareVisit() { + return isShareVisit; + } + + public void setIsShareVisit(Integer isShareVisit) { + this.isShareVisit = isShareVisit; + } + + public Integer getIsPlaceOrder() { + return isPlaceOrder; + } + + public void setIsPlaceOrder(Integer isPlaceOrder) { + this.isPlaceOrder = isPlaceOrder; + } + + public Integer getIsPay() { + return isPay; + } + + public void setIsPay(Integer isPay) { + this.isPay = isPay; + } + + public Integer getIsPlusShopCart() { + return isPlusShopCart; + } + + public void setIsPlusShopCart(Integer isPlusShopCart) { + this.isPlusShopCart = isPlusShopCart; + } + + @Override + public String toString() { + return "ProductAnalyseUserVO{" + + "productAnalyseUserId=" + productAnalyseUserId + + ",productAnalyseId=" + productAnalyseId + + ",uuid=" + uuid + + ",createDate=" + createDate + + ",spuId=" + spuId + + ",isVisit=" + isVisit + + ",isClick=" + isClick + + ",isShareVisit=" + isShareVisit + + ",isPlaceOrder=" + isPlaceOrder + + ",isPay=" + isPay + + ",isPlusShopCart=" + isPlusShopCart + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ShopFlowInfoVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ShopFlowInfoVO.java new file mode 100644 index 0000000..6f10365 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/ShopFlowInfoVO.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/5/25 14:31 + */ +public class ShopFlowInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "浏览量") + private Long visitCount; + + @Schema(description = "昨天浏览量") + private Long yesterdayVisitCount; + @Schema(description = "访客数") + private Integer visitUserCount; + + @Schema(description = "新访客数量") + private Integer newVisitUserCount; + + @Schema(description = "老访客数量") + private Integer oldVisitUserCount; + + @Schema(description = "商品访问流量排行榜") + private List prodRanking; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getVisitCount() { + return visitCount; + } + + public void setVisitCount(Long visitCount) { + this.visitCount = visitCount; + } + + public Long getYesterdayVisitCount() { + return yesterdayVisitCount; + } + + public void setYesterdayVisitCount(Long yesterdayVisitCount) { + this.yesterdayVisitCount = yesterdayVisitCount; + } + + public Integer getVisitUserCount() { + return visitUserCount; + } + + public void setVisitUserCount(Integer visitUserCount) { + this.visitUserCount = visitUserCount; + } + + public Integer getNewVisitUserCount() { + return newVisitUserCount; + } + + public void setNewVisitUserCount(Integer newVisitUserCount) { + this.newVisitUserCount = newVisitUserCount; + } + + public Integer getOldVisitUserCount() { + return oldVisitUserCount; + } + + public void setOldVisitUserCount(Integer oldVisitUserCount) { + this.oldVisitUserCount = oldVisitUserCount; + } + + public List getProdRanking() { + return prodRanking; + } + + public void setProdRanking(List prodRanking) { + this.prodRanking = prodRanking; + } + + @Override + public String toString() { + return "ShopFlowInfoVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", visitCount=" + visitCount + + ", yesterdayVisitCount=" + yesterdayVisitCount + + ", visitUserCount=" + visitUserCount + + ", newVisitUserCount=" + newVisitUserCount + + ", oldVisitUserCount=" + oldVisitUserCount + + ", prodRanking=" + prodRanking + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/SingleProdTrendVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/SingleProdTrendVO.java new file mode 100644 index 0000000..dfddf9d --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/SingleProdTrendVO.java @@ -0,0 +1,80 @@ +package com.tmerclub.cloud.flow.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 单个商品趋势图 + * @author gaozijie + * @date 2023-10-09 + */ +public class SingleProdTrendVO { + + @Schema(description = "当前日期") + private String currentDay; + + @Schema(description = "访客数") + private Integer visitor; + + @Schema(description = "浏览量") + private Long browse; + + @Schema(description = "支付人数") + private Integer payPerson; + + @Schema(description = "支付商品件数") + private Integer payNum; + + public SingleProdTrendVO() { + } + + public String getCurrentDay() { + return currentDay; + } + + public void setCurrentDay(String currentDay) { + this.currentDay = currentDay; + } + + public Integer getVisitor() { + return visitor; + } + + public void setVisitor(Integer visitor) { + this.visitor = visitor; + } + + public Long getBrowse() { + return browse; + } + + public void setBrowse(Long browse) { + this.browse = browse; + } + + public Integer getPayPerson() { + return payPerson; + } + + public void setPayPerson(Integer payPerson) { + this.payPerson = payPerson; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + @Override + public String toString() { + return "SingleProdTrendVO{" + + "currentDay='" + currentDay + '\'' + + ", visitor=" + visitor + + ", browse=" + browse + + ", payPerson=" + payPerson + + ", payNum=" + payNum + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/SystemVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/SystemVO.java new file mode 100644 index 0000000..18005de --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/SystemVO.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 流量分析—页面数据统计表 + * + * @author YXF + * @date 2021-06-02 + */ +public class SystemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Integer userNums; + private Integer systemType; + /** + * 全部 + */ + private Integer all; + /** + * pc + */ + private Integer pc; + /** + * h5 + */ + private Integer h5; + /** + * 小程序 + */ + private Integer applets; + /** + * 安卓 + */ + private Integer android; + /** + * ios + */ + private Integer ios; + + public Integer getUserNums() { + return userNums; + } + + public void setUserNums(Integer userNums) { + this.userNums = userNums; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public Integer getAll() { + return all; + } + + public void setAll(Integer all) { + this.all = all; + } + + public Integer getPc() { + return pc; + } + + public void setPc(Integer pc) { + this.pc = pc; + } + + public Integer getH5() { + return h5; + } + + public void setH5(Integer h5) { + this.h5 = h5; + } + + public Integer getApplets() { + return applets; + } + + public void setApplets(Integer applets) { + this.applets = applets; + } + + public Integer getAndroid() { + return android; + } + + public void setAndroid(Integer android) { + this.android = android; + } + + public Integer getIos() { + return ios; + } + + public void setIos(Integer ios) { + this.ios = ios; + } + + @Override + public String toString() { + return "SystemVO{" + + "userNums=" + userNums + + ", systemType=" + systemType + + ", all=" + all + + ", pc=" + pc + + ", h5=" + h5 + + ", applets=" + applets + + ", android=" + android + + ", ios=" + ios + + '}'; + } + + public SystemVO() { + pc = 0; + h5 = 0; + applets = 0; + android = 0; + ios = 0; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserAnalysisDataExcelVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserAnalysisDataExcelVO.java new file mode 100644 index 0000000..95539bd --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserAnalysisDataExcelVO.java @@ -0,0 +1,129 @@ +package com.tmerclub.cloud.flow.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class UserAnalysisDataExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "会员地域分布信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"会员地域分布信息", "地区"}) + private String provinceName; + + @ExcelProperty({"会员地域分布信息", "加购数量"}) + private Long plusShopCart; + + @ExcelProperty({"会员地域分布信息", "下单金额"}) + private Double placeOrderAmount; + + @ExcelProperty({"会员地域分布信息", "支付金额"}) + private Double payAmount; + + @ExcelProperty({"会员地域分布信息", "浏览量"}) + private Integer visitNums; + + @ExcelProperty({"会员地域分布信息", "点击量"}) + private Integer clickNums; + + @ExcelProperty({"会员地域分布信息", "访客数"}) + private Integer prodVisitUser; + + @ExcelProperty({"会员地域分布信息", "商品浏览量"}) + private Integer prodVisitNums; + + public String getProvinceName() { + return provinceName; + } + + public void setProvinceName(String provinceName) { + this.provinceName = provinceName; + } + + public Long getPlusShopCart() { + return plusShopCart; + } + + public void setPlusShopCart(Long plusShopCart) { + this.plusShopCart = plusShopCart; + } + + public Double getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Double placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getVisitNums() { + return visitNums; + } + + public void setVisitNums(Integer visitNums) { + this.visitNums = visitNums; + } + + public Integer getClickNums() { + return clickNums; + } + + public void setClickNums(Integer clickNums) { + this.clickNums = clickNums; + } + + public Integer getProdVisitUser() { + return prodVisitUser; + } + + public void setProdVisitUser(Integer prodVisitUser) { + this.prodVisitUser = prodVisitUser; + } + + public Integer getProdVisitNums() { + return prodVisitNums; + } + + public void setProdVisitNums(Integer prodVisitNums) { + this.prodVisitNums = prodVisitNums; + } + + @Override + public String toString() { + return "UserAnalysisDataExcelVO{" + + "provinceName='" + provinceName + '\'' + + ", plusShopCart=" + plusShopCart + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", visitNums='" + visitNums + '\'' + + ", clickNums=" + clickNums + + ", prodVisitUser='" + prodVisitUser + '\'' + + ", prodVisitNums='" + prodVisitNums + '\'' + + '}'; + } +} diff --git a/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserVisitProdAnalysisVO.java b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserVisitProdAnalysisVO.java new file mode 100644 index 0000000..66fbfd7 --- /dev/null +++ b/tmerclub-flow/src/main/java/com/tmerclub/cloud/flow/vo/UserVisitProdAnalysisVO.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.flow.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流量分析—用户流量商品数据VO + * + * @author YXF + * @date 2021-05-21 15:25:19 + */ +public class UserVisitProdAnalysisVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户访问商品id") + private Long userVisitProdAnalysisId; + + @Schema(description = "用户路径id") + private Long userAnalysisId; + + @Schema(description = "创建日期") + private Date createDate; + + @Schema(description = "商品id") + private Long spuId; + + public Long getUserVisitProdAnalysisId() { + return userVisitProdAnalysisId; + } + + public void setUserVisitProdAnalysisId(Long userVisitProdAnalysisId) { + this.userVisitProdAnalysisId = userVisitProdAnalysisId; + } + + public Long getUserAnalysisId() { + return userAnalysisId; + } + + public void setUserAnalysisId(Long userAnalysisId) { + this.userAnalysisId = userAnalysisId; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "UserVisitProdAnalysisVO{" + + "userVisitProdAnalysisId=" + userVisitProdAnalysisId + + ", userAnalysisId=" + userAnalysisId + + ", createDate=" + createDate + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-flow/src/main/resources/ip2region.xdb b/tmerclub-flow/src/main/resources/ip2region.xdb new file mode 100644 index 0000000..c78b792 Binary files /dev/null and b/tmerclub-flow/src/main/resources/ip2region.xdb differ diff --git a/tmerclub-gateway/Dockerfile b/tmerclub-gateway/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-gateway/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-gateway/pom.xml b/tmerclub-gateway/pom.xml new file mode 100644 index 0000000..b381ad2 --- /dev/null +++ b/tmerclub-gateway/pom.xml @@ -0,0 +1,59 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-gateway + jar + + 网关 + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + org.springframework.boot + spring-boot-starter-actuator + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + com.github.xiaoymin + knife4j-gateway-spring-boot-starter + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/GatewayApplication.java b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/GatewayApplication.java new file mode 100644 index 0000000..66fb1f6 --- /dev/null +++ b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/GatewayApplication.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.gateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/7/23 + */ +@SpringBootApplication(scanBasePackages = "com.tmerclub.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +public class GatewayApplication { + + public static void main(String[] args) { + SpringApplication.run(GatewayApplication.class, args); + } + +} diff --git a/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevReactiveLoadBalancerClientFilter.java b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevReactiveLoadBalancerClientFilter.java new file mode 100644 index 0000000..21c2bf5 --- /dev/null +++ b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevReactiveLoadBalancerClientFilter.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.gateway.dev; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.gateway.config.GatewayLoadBalancerProperties; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * @author FrozenWatermelon + * @date 2021/3/4 + */ +@Component +@ConditionalOnProperty(value = "dubbo.consumer.loadbalance", havingValue = "dev") +public class DevReactiveLoadBalancerClientFilter extends ReactiveLoadBalancerClientFilter { + public DevReactiveLoadBalancerClientFilter(LoadBalancerClientFactory clientFactory, + GatewayLoadBalancerProperties properties) { + super(clientFactory, properties); + } + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + try { + DevWebFluxContext.set(exchange); + return super.filter(exchange, chain); + } finally { + DevWebFluxContext.clean(); + + } + + } +} diff --git a/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevRoundRobinLoadBalancer.java b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevRoundRobinLoadBalancer.java new file mode 100644 index 0000000..3836966 --- /dev/null +++ b/tmerclub-gateway/src/main/java/com/tmerclub/cloud/gateway/dev/DevRoundRobinLoadBalancer.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.gateway.dev; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.DefaultResponse; +import org.springframework.cloud.client.loadbalancer.EmptyResponse; +import org.springframework.cloud.client.loadbalancer.Request; +import org.springframework.cloud.client.loadbalancer.Response; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer; +import org.springframework.cloud.loadbalancer.core.SelectedInstanceCallback; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * dev的时候,如果本地起了服务,着负载均衡到本地的服务,免得开发的时候找不到日志 + * + * @author FrozenWatermelon + * @date 2021/3/4 + */ +@Component +@ConditionalOnProperty(value = "dubbo.consumer.loadbalance", havingValue = "dev") +public class DevRoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer { + + private static final Log log = LogFactory.getLog(DevRoundRobinLoadBalancer.class); + + + final Environment environment; + + final LoadBalancerClientFactory loadBalancerClientFactory; + + final AtomicInteger position; + + public final String hostAddress; + + public DevRoundRobinLoadBalancer(Environment environment, + LoadBalancerClientFactory loadBalancerClientFactory, InetUtils inetUtils) { + this.environment = environment; + this.loadBalancerClientFactory = loadBalancerClientFactory; + this.position = new AtomicInteger(new Random().nextInt(1000)); + hostAddress = inetUtils.findFirstNonLoopbackAddress().getHostAddress(); + } + + @Override + public Mono> choose(Request request) { + URI requestUri = DevWebFluxContext.get().getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); + String name = Objects.requireNonNull(requestUri).getHost(); + + ObjectProvider serviceInstanceListSupplierProvider = loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class); + + + ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider + .getIfAvailable(NoopServiceInstanceListSupplier::new); + return supplier.get(request).next() + .map(serviceInstances -> processInstanceResponse(supplier, serviceInstances, name)); + } + + private Response processInstanceResponse(ServiceInstanceListSupplier supplier, + List serviceInstances, String serviceId) { + Response serviceInstanceResponse = getInstanceResponse(serviceInstances, serviceId); + if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) { + ((SelectedInstanceCallback) supplier).selectedServiceInstance(serviceInstanceResponse.getServer()); + } + return serviceInstanceResponse; + } + + private Response getInstanceResponse(List instances, String serviceId) { + if (instances.isEmpty()) { + if (log.isWarnEnabled()) { + log.warn("No servers available for service: " + serviceId); + } + return new EmptyResponse(); + } + int pos = Math.abs(this.position.incrementAndGet()); + + for (ServiceInstance instance : instances) { + if (Objects.equals(hostAddress, instance.getHost())) { + return new DefaultResponse(instance); + } + } + + + ServiceInstance instance = instances.get(pos % instances.size()); + + return new DefaultResponse(instance); + } + +} diff --git a/tmerclub-group/pom.xml b/tmerclub-group/pom.xml new file mode 100644 index 0000000..851c7e9 --- /dev/null +++ b/tmerclub-group/pom.xml @@ -0,0 +1,89 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-group + tmerclub 团购服务 + jar + + + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-group + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.xuxueli + xxl-job-core + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + + diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupOrderBO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupOrderBO.java new file mode 100644 index 0000000..881eb0a --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupOrderBO.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + * @date 2021/4/12 + */ +public class GroupOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 拼团活动id + */ + private Long groupActivityId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 拼团团队id + */ + private Long groupTeamId; + + /** + * user_id(当user_id为0时标识为机器人) + */ + private Long userId; + + /** + * 团长id + */ + private Long shareUserId; + + /** + * 活动商品金额 + */ + private Long activityProdPrice; + + /** + * 支付金额 + */ + private Long payPrice; + + /** + * 订单编号 + */ + private Long orderId; + + /** + * 商品数量 + */ + private Integer count; + + private Long spuId; + + public Long getUserId() { + return userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShareUserId() { + return shareUserId; + } + + public void setShareUserId(Long shareUserId) { + this.shareUserId = shareUserId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getActivityProdPrice() { + return activityProdPrice; + } + + public void setActivityProdPrice(Long activityProdPrice) { + this.activityProdPrice = activityProdPrice; + } + + public Long getPayPrice() { + return payPrice; + } + + public void setPayPrice(Long payPrice) { + this.payPrice = payPrice; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "GroupOrderBO{" + + ", groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", groupTeamId=" + groupTeamId + + ", userId=" + userId + + ", shareUserId=" + shareUserId + + ", activityProdPrice=" + activityProdPrice + + ", payPrice=" + payPrice + + ", orderId=" + orderId + + ", count=" + count + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupSaveNotifyBO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupSaveNotifyBO.java new file mode 100644 index 0000000..8829425 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/GroupSaveNotifyBO.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.bo; + +import com.tmerclub.cloud.group.bo.mongo.MongoGroupOrderBO; +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +public class GroupSaveNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private MongoGroupTeamBO mongoGroupTeamBO; + + private MongoGroupOrderBO mongoGroupOrderBO; + + public MongoGroupTeamBO getMongoGroupTeamBO() { + return mongoGroupTeamBO; + } + + public void setMongoGroupTeamBO(MongoGroupTeamBO mongoGroupTeamBO) { + this.mongoGroupTeamBO = mongoGroupTeamBO; + } + + public MongoGroupOrderBO getMongoGroupOrderBO() { + return mongoGroupOrderBO; + } + + public void setMongoGroupOrderBO(MongoGroupOrderBO mongoGroupOrderBO) { + this.mongoGroupOrderBO = mongoGroupOrderBO; + } + + @Override + public String toString() { + return "GroupSaveNotifyBO{" + + "mongoGroupTeamBO=" + mongoGroupTeamBO + + ", mongoGroupOrderBO=" + mongoGroupOrderBO + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/mongo/MongoGroupOrderBO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/mongo/MongoGroupOrderBO.java new file mode 100644 index 0000000..45d5313 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/bo/mongo/MongoGroupOrderBO.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.bo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * Mongodb拼团订单表 + * @author TRACK + */ +@CompoundIndexes({ + @CompoundIndex(name = "user_idx", def = "{'userId':1}"), + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}"), + @CompoundIndex(name = "group_activity_idx", def = "{'groupActivityId':1}") +}) +@Document("group_order") +public class MongoGroupOrderBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Id + @Schema(description = "拼团订单id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long groupOrderId; + + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "拼团团队id") + private Long groupTeamId; + + @Schema(description = "user_id(当user_id为0时标识为机器人)") + private Long userId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "身份标识(0:成员 1:团长)") + private Integer identityType; + + @Schema(description = "活动商品金额") + private Long activityProdPrice; + + @Schema(description = "支付金额") + private Long payPrice; + + @Schema(description = "订单编号") + private Long orderId; + + @Schema(description = "状态(0:待支付、1:支付成功、-1:失效)") + private Integer status; + + @Schema(description = "商品数量") + private Integer count; + + public Long getGroupOrderId() { + return groupOrderId; + } + + public void setGroupOrderId(Long groupOrderId) { + this.groupOrderId = groupOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public Long getActivityProdPrice() { + return activityProdPrice; + } + + public void setActivityProdPrice(Long activityProdPrice) { + this.activityProdPrice = activityProdPrice; + } + + public Long getPayPrice() { + return payPrice; + } + + public void setPayPrice(Long payPrice) { + this.payPrice = payPrice; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "MongoGroupOrderBO{" + + "groupOrderId=" + groupOrderId + + ", groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", groupTeamId=" + groupTeamId + + ", userId=" + userId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", identityType=" + identityType + + ", activityProdPrice=" + activityProdPrice + + ", payPrice=" + payPrice + + ", orderId=" + orderId + + ", status=" + status + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/DistributedIdKey.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/DistributedIdKey.java new file mode 100644 index 0000000..455c444 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/DistributedIdKey.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.constant; + +import com.tmerclub.cloud.common.leaf.constant.GlobalDistributedIdKey; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + + /** + * 团购订单号 + */ + String MALL4CLOUD_GROUP_ORDER = "mall4cloud-group-order"; + + /** + * 团购队伍id + */ + String MALL4CLOUD_GROUP_TEAM = "mall4cloud-group-team"; + + /** + * 订单id + */ + String MALL4CLOUD_ORDER = GlobalDistributedIdKey.MALL4CLOUD_ORDER.value(); + + /** + * 订单退款id + */ + String MALL4CLOUD_REFUND = GlobalDistributedIdKey.MALL4CLOUD_REFUND.value(); +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/GroupOrderStatusEnum.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/GroupOrderStatusEnum.java new file mode 100644 index 0000000..8861f36 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/constant/GroupOrderStatusEnum.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.constant; + + +/** + * 拼团订单状态类型 + * @author FrozenWatermelon + */ +public enum GroupOrderStatusEnum { + + /** 待支付 */ + WAITING_PAY(0, "待支付"), + + /** 支付成功 */ + SUCCESS(1, "支付成功"), + + /** 失效 */ + FAIL(-1, "失效"); + + private Integer code; + + private String title; + + GroupOrderStatusEnum(Integer code, String title) { + this.code = code; + this.title = title; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer value() { + return code; + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/admin/GroupActivityController.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/admin/GroupActivityController.java new file mode 100644 index 0000000..cb0f538 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/admin/GroupActivityController.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.group.constant.GroupActivityStatusEnum; +import com.tmerclub.cloud.group.dto.GroupActivityDTO; +import com.tmerclub.cloud.group.service.GroupActivityService; +import com.tmerclub.cloud.group.vo.GroupActivityVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Objects; + +/** + * 拼团活动表 + * + * @author YXF + * @date 2021-03-19 11:26:37 + */ +@RestController("adminGroupActivityController") +@RequestMapping("/mp/group_activity") +@Tag(name = "admin-拼团活动表") +public class GroupActivityController { + + @Autowired + private GroupActivityService groupActivityService; + + /** + * 分页查询 + * + * @param pageDTO 分页对象 + * @param groupActivityDTO 拼团活动表 + * @return 分页数据 + */ + @GetMapping("/page") + public ServerResponseEntity> getGroupActivityPage(PageDTO pageDTO, GroupActivityDTO groupActivityDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + groupActivityDTO.setShopId(shopId); + return ServerResponseEntity.success(groupActivityService.page(pageDTO, groupActivityDTO)); + } + + /** + * 平台管理分页查询 + * + * @param pageDTO 分页对象 + * @param groupActivityDTO 拼团活动表 + * @return 分页数据 + */ + @GetMapping("/platform_page") + public ServerResponseEntity> platformPage(PageDTO pageDTO, GroupActivityDTO groupActivityDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + return ServerResponseEntity.success(groupActivityService.platformPage(pageDTO, groupActivityDTO)); + } + + /** + * 通过id查询拼团活动表 + * + * @param groupActivityId id + * @return 单个数据 + */ + @GetMapping + public ServerResponseEntity getById(@RequestParam("groupActivityId") Long groupActivityId) { + return ServerResponseEntity.success(groupActivityService.getGroupActivityInfo(groupActivityId)); + } + + /** + * 新增拼团活动表 + * + * @param groupActivityDTO 拼团活动表 + * @return 是否新增成功 + */ + @PostMapping + public ServerResponseEntity save(@RequestBody @Valid GroupActivityDTO groupActivityDTO) { + if (Objects.isNull(groupActivityDTO.getSpuId())) { + throw new LuckException("请选择商品"); + } + if (CollUtil.isEmpty(groupActivityDTO.getGroupSkuList())) { + throw new LuckException("sku列表不能为空"); + } + Long shopId = AuthUserContext.get().getTenantId(); + groupActivityDTO.setShopId(shopId); + groupActivityService.save(groupActivityDTO); + groupActivityService.removeCache(groupActivityDTO.getSpuId()); + return ServerResponseEntity.success(); + } + + /** + * 修改拼团活动表 + * + * @param groupActivityDTO 拼团活动表 + * @return 是否修改成功 + */ + @PutMapping + public ServerResponseEntity updateById(@RequestBody GroupActivityDTO groupActivityDTO) { + if (CollUtil.isEmpty(groupActivityDTO.getGroupSkuList())) { + throw new LuckException("sku列表不能为空"); + } + groupActivityService.update(groupActivityDTO); + groupActivityService.removeCache(groupActivityDTO.getSpuId()); + return ServerResponseEntity.success(); + } + + /** + * 通过id启用拼团活动 + * + * @param groupActivityDTO + * @return 是否启用拼团活动 + */ + @PutMapping("/active") + public ServerResponseEntity activeGroupActivity(@RequestBody GroupActivityDTO groupActivityDTO) { + GroupActivityVO groupActivity = groupActivityService.getByGroupActivityId(groupActivityDTO.getGroupActivityId()); + Date currentDate = new Date(); + if (groupActivity == null) { + throw new LuckException("未找到此活动,请稍后重试"); + } else if (groupActivity.getEndTime().getTime() < currentDate.getTime()) { + throw new LuckException("您不能启用一个结束时间小于当前时间的活动"); + } else if (!Objects.equals(groupActivity.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } else if (!Objects.equals(groupActivity.getStatus(), GroupActivityStatusEnum.DISABLE.value())) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + // 启用状态 + groupActivityService.activeGroupActivity(groupActivityDTO.getGroupActivityId(), groupActivity.getSpuId()); + groupActivityService.removeCache(groupActivity.getSpuId()); + return ServerResponseEntity.success(true); + } + + /** + * 通过id删除拼团活动表 + * + * @param groupActivityId id + * @return 通过id删除拼团活动表 + */ + @DeleteMapping + public ServerResponseEntity removeById(@RequestParam("groupActivityId") Long groupActivityId) { + // 查看活动是否为失效状态或者活动结束 + GroupActivityVO groupActivity = groupActivityService.getByGroupActivityId(groupActivityId); + if (Objects.isNull(groupActivity)) { + throw new LuckException("未找到此活动,请稍后重试"); + } + if (Objects.equals(groupActivity.getStatus(), GroupActivityStatusEnum.ENABLE.value())) { + throw new LuckException("该活动启用中,不能删除"); + } + if (Objects.equals(groupActivity.getStatus(), GroupActivityStatusEnum.EXPIRED.value())) { + groupActivityService.updateStatus(groupActivityId, GroupActivityStatusEnum.DELETE); + } else { + groupActivityService.deleteGroupActivity(groupActivityId, groupActivity.getSpuId()); + } + groupActivityService.removeCache(groupActivity.getSpuId()); + return ServerResponseEntity.success(true); + } + + /** + * 失效进行中的拼团活动 + */ + @PutMapping("/invalid") + public ServerResponseEntity invalidActivity(@RequestBody GroupActivityDTO groupActivityDTO) { + // 查看活动 + GroupActivityVO groupActivity = groupActivityService.getByGroupActivityId(groupActivityDTO.getGroupActivityId()); + if (groupActivity == null) { + throw new LuckException("未找到此活动,请稍后重试"); + } else if (!Objects.equals(groupActivity.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!Objects.equals(groupActivity.getStatus(), GroupActivityStatusEnum.ENABLE.value())) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + groupActivityService.invalidGroupActivity(groupActivity.getGroupActivityId(), groupActivity.getSpuId()); + groupActivityService.removeCache(groupActivity.getSpuId()); + return ServerResponseEntity.success(true); + } + + @PostMapping("/offline") + @Operation(summary = "下线团购活动", description = "下线团购活动") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + GroupActivityVO groupActivityVO = groupActivityService.getByGroupActivityId(offlineHandleEventDto.getHandleId()); + if (Objects.isNull(groupActivityVO)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + groupActivityService.offline(offlineHandleEventDto); + groupActivityService.removeCache(groupActivityVO.getSpuId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event/{groupActivityId}") + @Operation(summary = "获取最新下线的事件", description = "获取最新下线的事件") + public ServerResponseEntity getOfflineHandleEvent(@PathVariable Long groupActivityId) { + return ServerResponseEntity.success(groupActivityService.getOfflineHandleEvent(groupActivityId)); + } + + @PostMapping("/audit") + @Operation(summary = "审核活动", description = "审核活动") + public ServerResponseEntity audit(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + groupActivityService.audit(offlineHandleEventDto); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规活动提交审核", description = "违规活动提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + groupActivityService.auditApply(offlineHandleEventDto); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupActivityController.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupActivityController.java new file mode 100644 index 0000000..9d29d0c --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupActivityController.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.controller.app; + + +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.group.constant.GroupActivityStatusEnum; +import com.tmerclub.cloud.group.service.GroupActivityService; +import com.tmerclub.cloud.group.service.GroupTeamService; +import com.tmerclub.cloud.group.vo.app.AppGroupActivityVO; +import com.tmerclub.cloud.group.vo.app.AppGroupTeamVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.List; +import java.util.Objects; + + +/** + * 拼团活动表 + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +@RestController("appGroupActivityController") +@RequestMapping("/ua/group_activity") +@Tag(name = "app-拼团活动表") +public class GroupActivityController { + + @Autowired + private GroupActivityService groupActivityService; + + @Autowired + private GroupTeamService groupTeamService; + + @GetMapping("/info") + @Operation(summary = "拼团活动详情", description = "获取对应商品的拼团活动信息") + public ServerResponseEntity activityInfo(@RequestParam("spuId") Long spuId) { + + // 查询拼团活动信息 + AppGroupActivityVO groupActivity = groupActivityService.getAppGroupActivityInfo(spuId); + + // 前端看到这个状态码的时候,不用渲染活动页面了 + if (groupActivity == null || !Objects.equals(groupActivity.getStatus(), GroupActivityStatusEnum.ENABLE.value())) { + return ServerResponseEntity.fail(ResponseEnum.ACTIVITY_END); + } + + long now = System.currentTimeMillis(); + int activityStatus = 2; + // 活动还没开始 + if (groupActivity.getStartTime().getTime() > now) { + // 距离活动开始还有 + groupActivity.setStartIn((groupActivity.getStartTime().getTime() - now) / 1000); + activityStatus = 1; + } + // 活动还没结束 + if (groupActivity.getEndTime().getTime() > now) { + // 距离活动开始还有 + groupActivity.setExpiresIn((groupActivity.getEndTime().getTime() - now) / 1000); + } else { + activityStatus = 3; + } + groupActivity.setActivityStatus(activityStatus); + return ServerResponseEntity.success(groupActivity); + } + + @GetMapping("/join_group_list") + @Operation(summary = "可加入的团列表", description = "只显示最近n个团列表(默认10)") + public ServerResponseEntity> joinGroupList( + @Parameter(description = "拼团活动ID", required = true) @RequestParam("groupActivityId") Long groupActivityId, + @Parameter(description = "显示数量(默认10)") @RequestParam(value = "showSize", defaultValue = "10") Integer showSize) { + List list = groupTeamService.listJoinGroup(groupActivityId, showSize); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupOrderController.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupOrderController.java new file mode 100644 index 0000000..90e2876 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/controller/app/GroupOrderController.java @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.controller.app; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.order.manager.ConfirmOrderManager; +import com.tmerclub.cloud.api.order.manager.SubmitOrderManager; +import com.tmerclub.cloud.api.product.manager.ShopCartAdapter; +import com.tmerclub.cloud.api.product.manager.ShopCartItemAdapter; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.group.bo.GroupOrderBO; +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; +import com.tmerclub.cloud.group.constant.DistributedIdKey; +import com.tmerclub.cloud.group.constant.GroupActivityStatusEnum; +import com.tmerclub.cloud.group.constant.TeamStatusEnum; +import com.tmerclub.cloud.group.dto.GroupOrderDTO; +import com.tmerclub.cloud.group.dto.SubmitGroupOrderDTO; +import com.tmerclub.cloud.group.service.GroupActivityService; +import com.tmerclub.cloud.group.service.GroupOrderService; +import com.tmerclub.cloud.group.service.GroupTeamService; +import com.tmerclub.cloud.group.vo.app.AppGroupActivityVO; +import com.tmerclub.cloud.group.vo.app.AppGroupSkuVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 团购的代码其实可以和订单的代码一起写的,不过 + * + * @author FrozenWatermelon + * @date 2021-04-07 10:39:32 + */ +@RestController("appGroupOrderController") +@RequestMapping("/group_order") +@Tag(name = "拼团订单表") +public class GroupOrderController { + + @Autowired + private GroupOrderService groupOrderService; + + @Autowired + private GroupTeamService groupTeamService; + + @Autowired + private GroupActivityService groupActivityService; + + @Autowired + private ShopCartAdapter shopCartAdapter; + + @Autowired + private ShopCartItemAdapter shopCartItemAdapter; + + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + + @Autowired + private ConfirmOrderManager confirmOrderManager; + + @Autowired + private SubmitOrderManager submitOrderManager; + + @Autowired + private RocketMQTemplate groupOrderCreateTemplate; + + @Autowired + private SegmentManager segmentManager; + + + @PostMapping("/confirm") + @Operation(summary = "确认订单", description = "传入参团/开团所需要的参数进行下单,如果用户为开团时拼团团队Id(groupTeamId)为0,如用户为开团则需要将拼团团队Id(groupTeamId)需要带上") + public ServerResponseEntity confirm(@Valid @RequestBody GroupOrderDTO orderParam) { + Long userId = AuthUserContext.get().getUserId(); + Long spuId = orderParam.getShopCartItem().getSpuId(); + + AppGroupActivityVO activityVO = groupActivityService.getBySpuId(spuId); + + // 校验活动 + if (Objects.isNull(activityVO) || !Objects.equals(activityVO.getStatus(), GroupActivityStatusEnum.ENABLE.value()) || activityVO.getEndTime().getTime() < System.currentTimeMillis()) { + // 拼团活动不在进行中,请稍后重试 + return ServerResponseEntity.showFailMsg("拼团活动已结束"); + } + + + AppGroupSkuVO appGroupSkuVO = null; + List groupSkuList = activityVO.getGroupSkuList(); + for (AppGroupSkuVO dbAppGroupSkuVO : groupSkuList) { + if (Objects.equals(dbAppGroupSkuVO.getGroupSkuId(), orderParam.getGroupSkuId())) { + appGroupSkuVO = dbAppGroupSkuVO; + break; + } + } + if (appGroupSkuVO == null) { + throw new LuckException("sku 信息有误"); + } + List shopCartItemsDb = shopCartItemAdapter.conversionShopCartItem(orderParam.getShopCartItem(), appGroupSkuVO.getPriceFee(), userId, orderParam.getDvyTypes()); + // 获取用户地址信息 + UserDeliveryInfoVO userDeliveryInfoVO = confirmOrderManager.getUserDeliveryInfoVO(shopCartItemsDb, userId, orderParam); + OrderLangUtil.shopCartItemList(shopCartItemsDb); + + // 将要返回给前端的完整的订单信息 + ShopCartOrderMergerVO shopCartOrderMerger = new ShopCartOrderMergerVO(); + shopCartOrderMerger.setDvyTypes(orderParam.getDvyTypes()); + shopCartOrderMerger.setOrderType(OrderType.GROUP); + // 筛选过滤掉不同配送的商品 + List shopCartItems = confirmOrderManager.filterShopItemsByType(shopCartOrderMerger, userDeliveryInfoVO, shopCartItemsDb); + + // 该商品不满足任何的配送方式 + if (CollectionUtil.isEmpty(shopCartItems)) { + return ServerResponseEntity.success(shopCartOrderMerger); + } + + // 自提订单处理 + confirmOrderManager.handleStationOrder(shopCartOrderMerger, shopCartItems, userDeliveryInfoVO); + + // 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 + int mold = 0; + if (shopCartItemsDb.stream().filter(shopCartItemDto -> Objects.nonNull(shopCartItemDto.getMold()) && shopCartItemDto.getMold() == 1).count() == shopCartItemsDb.size()) { + // 订单项中的所有商品都为虚拟商品时,才是虚拟订单 + mold = 1; + shopCartOrderMerger.getDvyTypes().forEach(s -> s.setDvyType(DeliveryType.NOT_DELIVERY.value())); + } + shopCartOrderMerger.setSpuMold(mold); + + // 购物车 + List shopCarts = shopCartAdapter.conversionShopCart(shopCartItems); + + // 计算运费,获取用户地址,自提信息 + ServerResponseEntity userDeliveryInfoResponseEntity = deliveryFeignClient.calculateAndGetDeliverInfo(new CalculateAndGetDeliverInfoDTO(shopCartItems, userDeliveryInfoVO)); + + userDeliveryInfoVO = userDeliveryInfoResponseEntity.getData(); + + // 组装完购物车后,插入订单项库存区域id + confirmOrderManager.handleShopCartStockPoint(userDeliveryInfoVO, shopCarts, shopCartItemsDb, shopCartOrderMerger.getSpuMold()); + + // 计算一遍订单金额 + confirmOrderManager.recalculateAmountWhenFinishingCalculateShop(shopCartOrderMerger, shopCarts, userDeliveryInfoVO); + + // 结束平台优惠的计算之后,还要重算一遍金额 + confirmOrderManager.recalculateAmountWhenFinishingCalculatePlatform(shopCartOrderMerger, userDeliveryInfoVO); + + // 计算平台佣金-跟订单其他金额是独立的,可以单独计算 + confirmOrderManager.confirmPlatformCommission(shopCartOrderMerger); + // 缓存计算新 + confirmOrderManager.cacheCalculatedInfo(userId, shopCartOrderMerger); + return ServerResponseEntity.success(shopCartOrderMerger); + } + + @PostMapping("/submit") + @Operation(summary = "提交订单,返回支付流水号", description = "根据传入的参数判断是否为购物车提交订单,同时对购物车进行删除,用户开始进行支付") + public ServerResponseEntity> submitOrders(@Valid @RequestBody SubmitGroupOrderDTO submitOrderParam) { + Long userId = AuthUserContext.get().getUserId(); + // 在这里面已经生成了订单id了 + ServerResponseEntity checkResult = submitOrderManager.checkSubmitInfo(submitOrderParam, userId); + if (!checkResult.isSuccess()) { + return ServerResponseEntity.transform(checkResult); + } + ShopCartOrderMergerVO mergerOrder = checkResult.getData(); + mergerOrder.setUserId(userId); + + ShopCartOrderVO shopCartOrderVO = mergerOrder.getShopCartOrders().get(0); + // 生成订单id + Long orderId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER, mergerOrder.getUserId()); + shopCartOrderVO.setOrderId(orderId); + + // 设置为团购订单 + shopCartOrderVO.setOrderType(OrderType.GROUP.value()); + // 上面已经校验过订单信息了,所以商品信息从缓存中获取没有错 + ShopCartItemVO shopCartItemVO = shopCartOrderVO.getShopCartItemDiscounts().get(0).getShopCartItems().get(0); + Long spuId = Objects.nonNull(shopCartItemVO.getMainComboSpuId()) ? shopCartItemVO.getMainComboSpuId() : shopCartItemVO.getSpuId(); + Integer count = Objects.nonNull(shopCartItemVO.getComboCount()) ? shopCartItemVO.getComboCount() : shopCartItemVO.getCount(); + + // 校验活动 + AppGroupActivityVO activityVO = groupActivityService.getBySpuId(spuId); + if (Objects.isNull(activityVO) || !Objects.equals(activityVO.getStatus(), GroupActivityStatusEnum.ENABLE.value()) || activityVO.getEndTime().getTime() < System.currentTimeMillis()) { + // 拼团活动不在进行中,不能参与拼团 + return ServerResponseEntity.showFailMsg("拼团活动不在进行中,不能参与拼团"); + } + Integer groupOrderCount = groupOrderService.getOrderBySpuIdAndUserId(activityVO.getGroupActivityId(), spuId, userId); + if (groupOrderCount > 0) { + throw new LuckException("您已有拼团中的订单,请耐心等待拼团成功"); + } + + // 购买数量限制 + if (Objects.equals(activityVO.getHasMaxNum(), 1)) { + Integer dbSpuCount = groupOrderService.getUserHadSpuCountByGroupActivityId(userId, activityVO.getGroupActivityId()); + if (dbSpuCount + count > activityVO.getMaxNum()) { + return ServerResponseEntity.showFailMsg("您购买数量已超过活动限购数量,无法提交订单"); + } + } + + // 校验活动商品是否处于失效状态 + if (activityVO.getStatus() != 1) { + // 活动商品已失效或不存在 + return ServerResponseEntity.showFailMsg("活动商品已失效或不存在"); + } + + MongoGroupTeamBO groupTeam; + // 校验拼团团队是否可以参团 + if (!Objects.equals(submitOrderParam.getGroupTeamId(), 0L)) { + groupTeam = groupTeamService.getByGroupTeamId(submitOrderParam.getGroupTeamId()); + if (Objects.isNull(groupTeam)) { + // 未找到拼团团队信息 + return ServerResponseEntity.showFailMsg("未找到拼团团队信息"); + } + if (!TeamStatusEnum.IN_GROUP.value().equals(groupTeam.getStatus())) { + // 拼团团队不在拼团中,不能参与拼团 + return ServerResponseEntity.showFailMsg("拼团团队不在拼团中,不能参与拼团"); + } + if (groupTeam.getEndTime() != null && System.currentTimeMillis() > groupTeam.getEndTime().getTime()) { + // 该拼团单不存在 + return ServerResponseEntity.showFailMsg("该拼团单不存在"); + } + } + // 锁定库存 + submitOrderManager.tryLockStock(mergerOrder); + GroupOrderBO groupOrderBO = getGroupOrderBO(submitOrderParam, userId, mergerOrder, shopCartOrderVO, spuId, activityVO); + mergerOrder.setActivityType(OrderActivityType.GROUP.value()); + mergerOrder.setActivityId(activityVO.getGroupActivityId()); + + // 开启事务消息,通知订单订单服务开始创建订单 + TransactionSendResult transactionSendResult = groupOrderCreateTemplate.sendMessageInTransaction(RocketMqConstant.GROUP_ORDER_CREATE_TOPIC, new GenericMessage<>(groupOrderBO), mergerOrder); + + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } + + return ServerResponseEntity.success(Collections.singletonList(shopCartOrderVO.getOrderId())); + } + + private static GroupOrderBO getGroupOrderBO(SubmitGroupOrderDTO submitOrderParam, Long userId, ShopCartOrderMergerVO mergerOrder, ShopCartOrderVO shopCartOrderVO, Long spuId, AppGroupActivityVO activityVO) { + GroupOrderBO groupOrderBO = new GroupOrderBO(); + groupOrderBO.setGroupTeamId(submitOrderParam.getGroupTeamId()); + groupOrderBO.setGroupActivityId(activityVO.getGroupActivityId()); + groupOrderBO.setShopId(activityVO.getShopId()); + groupOrderBO.setUserId(userId); + groupOrderBO.setShareUserId(userId); + groupOrderBO.setActivityProdPrice(mergerOrder.getTotal()); + groupOrderBO.setPayPrice(mergerOrder.getActualTotal()); + groupOrderBO.setOrderId(shopCartOrderVO.getOrderId()); + groupOrderBO.setCount(shopCartOrderVO.getTotalCount()); + groupOrderBO.setSpuId(spuId); + return groupOrderBO; + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupSkuDTO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupSkuDTO.java new file mode 100644 index 0000000..da50d21 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/GroupSkuDTO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团活动商品规格DTO + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupSkuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团活动商品规格id") + private Long groupSkuId; + + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "商品规格id") + private Long skuId; + + @Schema(description = "活动价格") + private Long actPrice; + + @Schema(description = "已售数量") + private Long sellNum; + + public Long getGroupSkuId() { + return groupSkuId; + } + + public void setGroupSkuId(Long groupSkuId) { + this.groupSkuId = groupSkuId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getActPrice() { + return actPrice; + } + + public void setActPrice(Long actPrice) { + this.actPrice = actPrice; + } + + public Long getSellNum() { + return sellNum; + } + + public void setSellNum(Long sellNum) { + this.sellNum = sellNum; + } + + @Override + public String toString() { + return "GroupSkuDTO{" + + "groupSkuId=" + groupSkuId + + ",groupActivityId=" + groupActivityId + + ",skuId=" + skuId + + ",actPrice=" + actPrice + + ",sellNum=" + sellNum + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/SubmitGroupOrderDTO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/SubmitGroupOrderDTO.java new file mode 100644 index 0000000..3203eb3 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/dto/SubmitGroupOrderDTO.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.dto; + +import com.tmerclub.cloud.common.order.dto.SubmitOrderDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 拼团订单 + * + * @author FrozenWatermelon + * @date 2021-04-07 10:39:32 + */ +public class SubmitGroupOrderDTO extends SubmitOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团团队id,(如果用户为参团则需要填写对应的拼团团队Id(groupTeamId),如果为用户为开团,拼团团队Id(groupTeamId)为0)") + @NotNull(message = "拼团团队id不能为空") + private Long groupTeamId; + + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + @Override + public String toString() { + return "GroupOrderDTO{" + + "groupTeamId=" + groupTeamId + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCancelOrderGroupConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCancelOrderGroupConsumer.java new file mode 100644 index 0000000..b597518 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCancelOrderGroupConsumer.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.api.group.vo.GroupOrderVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.group.constant.GroupOrderStatusEnum; +import com.tmerclub.cloud.group.service.GroupOrderService; +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; +import java.util.Objects; + +/** + * 取消团购订单 订单操作 + * 用mq来保证最终一致性,同步发送消息更新团队状态 + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_CANCEL_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_CANCEL_ORDER_GROUP) +public class GroupOrderCancelOrderGroupConsumer implements RocketMQListener> { + + @Autowired + private GroupOrderService groupOrderService; + + /** + * 取消团购订单 + */ + @Override + public void onMessage(List orderIds) { + GroupOrderVO groupOrder = groupOrderService.getByOrderId(orderIds.get(0)); + if (!Objects.equals(groupOrder.getStatus(), GroupOrderStatusEnum.WAITING_PAY.value())) { + return; + } + groupOrderService.cancelGroupOrder(groupOrder, orderIds); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCancelTeamGroupConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCancelTeamGroupConsumer.java new file mode 100644 index 0000000..d8a0f5f --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderCancelTeamGroupConsumer.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.api.group.vo.GroupOrderVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.group.constant.GroupOrderStatusEnum; +import com.tmerclub.cloud.group.service.GroupOrderService; +import com.tmerclub.cloud.group.service.GroupTeamService; +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; +import java.util.Objects; + +/** + * 取消团购订单 团队操作 + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_CANCEL_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_CANCEL_TEAM_GROUP) +public class GroupOrderCancelTeamGroupConsumer implements RocketMQListener> { + + @Autowired + private GroupOrderService groupOrderService; + @Autowired + private GroupTeamService groupTeamService; + + /** + * 取消团购订单 + */ + @Override + public void onMessage(List orderIds) { + GroupOrderVO groupOrder = groupOrderService.getByOrderId(orderIds.get(0)); + if (!Objects.equals(groupOrder.getStatus(), GroupOrderStatusEnum.WAITING_PAY.value())) { + return; + } + // 如果是待成团的状态就取消拼团活动 + groupTeamService.cancelGroupTeam(groupOrder.getGroupTeamId()); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderOpenAndJoinListener.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderOpenAndJoinListener.java new file mode 100644 index 0000000..d3f7196 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderOpenAndJoinListener.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.group.bo.GroupOpenNotifyBO; +import com.tmerclub.cloud.group.service.GroupOrderService; +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; + + +/** + * 参团or开团 订单更新 + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_OPEN_AND_JOIN_GROUP_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_OPEN_AND_JOIN_GROUP_TOPIC) +public class GroupOrderOpenAndJoinListener implements RocketMQListener { + + @Autowired + private GroupOrderService groupOrderService; + + @Override + public void onMessage(GroupOpenNotifyBO groupOpenNotifyBO) { + groupOrderService.updateToPaySuccess(groupOpenNotifyBO.getOrderId(), groupOpenNotifyBO.getIdentityType(), groupOpenNotifyBO.getGroupTeamId()); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderOpenAndJoinTransactionListener.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderOpenAndJoinTransactionListener.java new file mode 100644 index 0000000..4c5cb8d --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderOpenAndJoinTransactionListener.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; +import com.tmerclub.cloud.group.service.GroupTeamService; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + + +/** + * 拼团参团或开团,团队信息更新或保存到mongodb + * 需要确保团队信息更新成功,否则其他mq消息可能会有幂等性问题 + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "sendGroupOrderOpenAndJoinGroupTemplate", maximumPoolSize = 20) +public class GroupOrderOpenAndJoinTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private GroupTeamService groupTeamService; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object groupTeam) { + groupTeamService.saveToMongodb((MongoGroupTeamBO) groupTeam); + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + // 直接回滚,防止异步出现aba的问题 + // 第二个原因是因为上面那个事务消息会重复发送多次,因为GROUP_ORDER_UN_SUCCESS_TOPIC 这个会回调多次 + return RocketMQLocalTransactionState.ROLLBACK; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveOrderGroupConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveOrderGroupConsumer.java new file mode 100644 index 0000000..7ae3f47 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSaveOrderGroupConsumer.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.group.bo.GroupSaveNotifyBO; +import com.tmerclub.cloud.group.service.GroupOrderService; +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.Objects; + +/** + * 提交订单 保存订单到mongodb + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_SAVE_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_SAVE_ORDER_GROUP) +public class GroupOrderSaveOrderGroupConsumer implements RocketMQListener { + + @Autowired + private GroupOrderService groupOrderService; + + /** + * 团购活动订单保存mongodb + */ + @Override + public void onMessage(GroupSaveNotifyBO groupSaveNotifyBO) { + if (Objects.nonNull(groupSaveNotifyBO.getMongoGroupOrderBO())) { + groupOrderService.saveToMongodb(groupSaveNotifyBO.getMongoGroupOrderBO()); + } + + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSuccessTransactionListener.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSuccessTransactionListener.java new file mode 100644 index 0000000..b11ebf9 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderSuccessTransactionListener.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; +import com.tmerclub.cloud.group.service.GroupTeamService; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +/** + * 拼团成功事务监听 + * @author TRAKC + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "groupOrderSuccessTemplate", maximumPoolSize = 20) +public class GroupOrderSuccessTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private GroupTeamService groupTeamService; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object groupTeam) { + // 确保团队更新成功 + groupTeamService.updateToSuccess((MongoGroupTeamBO) groupTeam); + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + // 直接回滚,防止异步出现aba的问题 + // 第二个原因是因为上面那个事务消息会重复发送多次,因为GROUP_ORDER_SUCCESS_TOPIC这个会回调多次 + return RocketMQLocalTransactionState.ROLLBACK; + } + +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderUnSuccessConsumer.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderUnSuccessConsumer.java new file mode 100644 index 0000000..b3f8e11 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/listener/GroupOrderUnSuccessConsumer.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.listener; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.group.service.GroupOrderService; +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; + +/** + * 取消团购订单 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_UN_SUCCESS_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_UN_SUCCESS_TOPIC) +public class GroupOrderUnSuccessConsumer implements RocketMQListener { + + @Autowired + private GroupOrderService groupOrderService; + + /** + * 取消团购订单 + */ + @Override + public void onMessage(Long groupTeamId) { + groupOrderService.unSuccess(groupTeamId); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupOrder.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupOrder.java new file mode 100644 index 0000000..357f44c --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/model/GroupOrder.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 拼团订单表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupOrder extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 拼团订单id + */ + private Long groupOrderId; + + /** + * 拼团活动id + */ + private Long groupActivityId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 拼团团队id + */ + private Long groupTeamId; + + /** + * user_id(当user_id为0时标识为机器人) + */ + private Long userId; + + /** + * 身份标识(0:成员 1:团长) + */ + private Integer identityType; + + /** + * 活动商品金额 + */ + private Long activityProdPrice; + + /** + * 支付金额 + */ + private Long payPrice; + + /** + * 订单编号 + */ + private Long orderId; + + /** + * 状态(0:待支付、1:支付成功、-1:失效) + */ + private Integer status; + + /** + * 商品数量 + */ + private Integer count; + + public Long getGroupOrderId() { + return groupOrderId; + } + + public void setGroupOrderId(Long groupOrderId) { + this.groupOrderId = groupOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public Long getActivityProdPrice() { + return activityProdPrice; + } + + public void setActivityProdPrice(Long activityProdPrice) { + this.activityProdPrice = activityProdPrice; + } + + public Long getPayPrice() { + return payPrice; + } + + public void setPayPrice(Long payPrice) { + this.payPrice = payPrice; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "GroupOrder{" + + "groupOrderId=" + groupOrderId + + ", groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", groupTeamId=" + groupTeamId + + ", userId='" + userId + '\'' + + ", identityType=" + identityType + + ", activityProdPrice=" + activityProdPrice + + ", payPrice=" + payPrice + + ", orderId=" + orderId + + ", status=" + status + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupActivityService.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupActivityService.java new file mode 100644 index 0000000..d8708ed --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupActivityService.java @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.GroupActivitySpuVO; +import com.tmerclub.cloud.group.constant.GroupActivityStatusEnum; +import com.tmerclub.cloud.group.dto.GroupActivityDTO; +import com.tmerclub.cloud.group.model.GroupActivity; +import com.tmerclub.cloud.group.vo.GroupActivityVO; +import com.tmerclub.cloud.group.vo.app.AppGroupActivityVO; + +import java.util.List; + +/** + * 拼团活动表 + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public interface GroupActivityService { + + /** + * 分页获取拼团活动表列表 + * + * @param pageDTO 分页参数 + * @param groupActivityDTO 搜索参数 + * @return 拼团活动表列表分页数据 + */ + PageVO page(PageDTO pageDTO, GroupActivityDTO groupActivityDTO); + + /** + * 平台管理分页查询 + * + * @param pageDTO 分页参数 + * @param groupActivityDTO 搜索参数 + * @return 拼团活动表列表分页数据 + */ + PageVO platformPage(PageDTO pageDTO, GroupActivityDTO groupActivityDTO); + + /** + * 根据拼团活动表id获取拼团活动信息 + * + * @param groupActivityId 拼团活动表id + * @return 拼团活动表 + */ + GroupActivityVO getByGroupActivityId(Long groupActivityId); + + /** + * 根据拼团活动表id获取拼团活动及商品信息 + * + * @param groupActivityId 拼团活动表id + * @return 拼团活动表 + */ + GroupActivityVO getGroupActivityInfo(Long groupActivityId); + + /** + * 保存拼团活动表 + * + * @param groupActivityDTO 拼团活动信息 + */ + void save(GroupActivityDTO groupActivityDTO); + + /** + * 更新拼团活动表 + * + * @param groupActivityDTO 拼团活动信息 + */ + void update(GroupActivityDTO groupActivityDTO); + + /** + * 更改活动的状态 + * + * @param groupActivityId + * @param status + */ + void updateStatus(Long groupActivityId, GroupActivityStatusEnum status); + + /** + * 失效活动 + * + * @param groupActivityId + * @param spuId + */ + void invalidGroupActivity(Long groupActivityId, Long spuId); + + /** + * 删除活动 + * + * @param groupActivityId + * @param spuId + */ + void deleteGroupActivity(Long groupActivityId, Long spuId); + + /** + * 启动活动 + * + * @param groupActivityId + * @param spuId + */ + void activeGroupActivity(Long groupActivityId, Long spuId); + + /** + * 平台下线活动 + * + * @param groupActivityId + */ + void offlineGroupActivity(Long groupActivityId); + + /** + * 平台下架优惠券 + * + * @param offlineHandleEventDto + */ + void offline(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 获取下线的事件记录 + * + * @param groupActivityId + * @return + */ + OfflineHandleEventVO getOfflineHandleEvent(Long groupActivityId); + + /** + * 平台审核商家提交的申请 + * + * @param offlineHandleEventDto + */ + void audit(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 违规活动提交审核 + * + * @param offlineHandleEventDto + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 拼团活动详情 + * + * @param spuId + * @return + */ + AppGroupActivityVO getAppGroupActivityInfo(Long spuId); + + /** + * 根据spuId获取团购信息 + * + * @param spuId + * @return + */ + AppGroupActivityVO getBySpuId(Long spuId); + + /** + * 根据商品id获取团购商品信息 + * + * @param spuIds + * @return + */ + List groupSpuListBySpuIds(List spuIds); + + /** + * 获取应该结束但是没有结束的拼团列表 + * + * @return 应该结束但是没有结束的拼团列表 + */ + List listUnEndButNeedEndActivity(); + + /** + * 改变商品类型,结束正在进行的拼团 + * + * @param groupActivityList + */ + void changeProdTypeByGroupActivityIdList(List groupActivityList); + + /** + * 根据商品ids下线所有的团购活动 + * + * @param spuIds 商品ids + * @return 返回结果 + */ + void offlineGroupBySpuIds(List spuIds); + + /** + * 清除团购缓存 + * + * @param spuId + */ + void removeCache(Long spuId); + + /** + * 拼团活动详情(可以获取已失效的) + * + * @param groupActivityId + * @return + */ + AppGroupActivityVO getAppGroupActivityByGroupActivityId(Long groupActivityId); + + /** + * 根据skuIds列表更新团购活动price + * + * @param skuIds + * @param spuId + */ + void updateGroupActivityPrice(List skuIds, Long spuId); + + /** + * 获取团购优惠价 + * @param groupActivityId + * @return + */ + List getGroupPriceFree(Long groupActivityId); + + /** + * 根据商品id失效活动 + * + * @param spuId 商品id + */ + void updateGroupActivityStatus(Long spuId); +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupOrderService.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupOrderService.java new file mode 100644 index 0000000..bd006e4 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupOrderService.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service; + +import com.tmerclub.cloud.api.group.vo.GroupOrderVO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.group.bo.GroupOrderBO; +import com.tmerclub.cloud.group.bo.mongo.MongoGroupOrderBO; +import com.tmerclub.cloud.group.vo.mongo.MongoAppGroupUserVO; + +import java.util.List; + +/** + * 拼团订单表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public interface GroupOrderService { + + /** + * 保存到mongodb + * @param mongoGroupOrderBO + */ + void saveToMongodb(MongoGroupOrderBO mongoGroupOrderBO); + + /** + * 批量保存到mongodb + * @param list + */ + void saveBatchToMongodb(List list); + + /** + * 根据 + * @param orderId + * @return + */ + GroupOrderVO getByOrderId(Long orderId); + + /** + * 获取参团的用户列表 + * @param groupTeamId + * @return + */ + List listApiGroupUserDto(Long groupTeamId); + + /** + * 获取用户团购订单信息 + * @param groupTeamId + * @return + */ + GroupOrderVO getUserGroupOrderByGroupTeamId(Long groupTeamId); + + /** + * 用户在该活动中有的商品数量 + * @param userId + * @param groupActivityId + * @return + */ + Integer getUserHadSpuCountByGroupActivityId(Long userId, Long groupActivityId); + + /** + * 团购活动提交订单 + * @param groupOrderBO + */ + void submit(GroupOrderBO groupOrderBO); + + /** + * 取消团购订单 + * @param groupOrder + * @param orderIds 团购订单ids + */ + void cancelGroupOrder(GroupOrderVO groupOrder, List orderIds); + + /** + * 订单支付成功通知 + * @param message + */ + void payNotifyGroupOrder(PayNotifyBO message); + + /** + * 拼团失败 + * @param groupTeamId + */ + void unSuccess(Long groupTeamId); + + /** + * 根据商品及用户id,获取用户订单数量 + * @param groupActivityId 团购id + * @param spuId 商品id + * @param userId 用户id + * @return + */ + Integer getOrderBySpuIdAndUserId(Long groupActivityId, Long spuId, Long userId); + + /** + * 根据活动id更新活动订单数 + * @param groupActivityId + */ + void updateGroupOrderInfo(Long groupActivityId); + + /** + * 更新订单状态为待成团 + * + * @param orderId 订单id + * @param identityType 1代表开团 + * @param groupTeamId 拼团团队id + */ + void updateToPaySuccess(Long orderId, Integer identityType, Long groupTeamId); + + /** + * 初始化拼团数据到mongodb + */ + void initGroupOrderToMongo(); +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupSkuService.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupSkuService.java new file mode 100644 index 0000000..4d634f8 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupSkuService.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.group.model.GroupSku; +import com.tmerclub.cloud.group.vo.GroupSkuVO; + +import java.util.List; + +/** + * 拼团活动商品规格 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public interface GroupSkuService { + + /** + * 分页获取拼团活动商品规格列表 + * + * @param pageDTO 分页参数 + * @return 拼团活动商品规格列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据拼团活动商品规格id获取拼团活动商品规格 + * + * @param groupSkuId 拼团活动商品规格id + * @return 拼团活动商品规格 + */ + GroupSku getByGroupSkuId(Long groupSkuId); + + /** + * 保存拼团活动商品规格 + * + * @param groupSku 拼团活动商品规格 + */ + void save(GroupSku groupSku); + + /** + * 更新拼团活动商品规格 + * + * @param groupSku 拼团活动商品规格 + */ + void update(GroupSku groupSku); + + /** + * 根据拼团活动商品规格id删除拼团活动商品规格 + * + * @param groupSkuId 拼团活动商品规格id + */ + void deleteById(Long groupSkuId); + + /** + * 批量保存 + * + * @param groupSkuList + * @param groupActivityId + */ + void batchSave(List groupSkuList, Long groupActivityId); + + /** + * 根据活动id,删除团购sku信息 + * + * @param groupActivityId + */ + void removeGroupSkuByGroupActivityId(Long groupActivityId); + + /** + * 批量更新 + * + * @param groupSkuList + * @param groupActivityId + */ + void batchUpdate(List groupSkuList, Long groupActivityId); + + /** + * 根据活动id,获取团购sku列表信息 + * + * @param groupActivityId + * @return + */ + List listByGroupActivityId(Long groupActivityId); + + /** + * 根据拼团活动id和活动价格获取对应的skuId + * + * @param groupActivityId + * @param actPrice + * @return + */ + List getSkuIdByActivityIdAndActPrice(Long groupActivityId, Long actPrice); +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupTeamService.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupTeamService.java new file mode 100644 index 0000000..7873e0a --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/GroupTeamService.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service; + +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; +import com.tmerclub.cloud.group.model.GroupTeam; +import com.tmerclub.cloud.group.vo.app.AppGroupTeamVO; + +import java.util.List; + +/** + * 拼团团队表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public interface GroupTeamService { + + /** + * 保存到mongodb + * @param mongoGroupTeamBO + */ + void saveToMongodb(MongoGroupTeamBO mongoGroupTeamBO); + + /** + * 批量保存到mongodb + * @param list + */ + void saveBatchToMongodb(List list); + + /** + * 更新 + * @param groupTeam + */ + void update(GroupTeam groupTeam); + + /** + * 根据拼团团队表id获取拼团团队表 + * + * @param groupTeamId 拼团团队表id + * @return 拼团团队表 + */ + MongoGroupTeamBO getByGroupTeamId(Long groupTeamId); + + /** + * 可加入的团列表 + * + * @param groupActivityId + * @param showSize + * @return + */ + List listJoinGroup(Long groupActivityId, Integer showSize); + + /** + * 获取拼团团队信息 + * @param groupTeamId + * @return + */ + AppGroupTeamVO getAppGroupTeam(Long groupTeamId); + + /** + * 取消拼团队伍 + * @param groupTeamId + */ + void cancelGroupTeam(Long groupTeamId); + + /** + * 更新成成团状态 + * @param groupTeam + */ + void updateToSuccess(MongoGroupTeamBO groupTeam); + + /** + * 团购订单失败 + * + * @param groupTeamId + */ + void updateToUnSuccess(Long groupTeamId); + + /** + * 初始化拼团数据到mongodb + */ + void initGroupTeamToMongo(); +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupActivityServiceImpl.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupActivityServiceImpl.java new file mode 100644 index 0000000..c84c5bc --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupActivityServiceImpl.java @@ -0,0 +1,552 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.GroupCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.GroupActivitySpuVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.group.constant.GroupActivityStatusEnum; +import com.tmerclub.cloud.group.dto.GroupActivityDTO; +import com.tmerclub.cloud.group.dto.GroupSkuDTO; +import com.tmerclub.cloud.group.mapper.GroupActivityMapper; +import com.tmerclub.cloud.group.model.GroupActivity; +import com.tmerclub.cloud.group.model.GroupSku; +import com.tmerclub.cloud.group.service.GroupActivityService; +import com.tmerclub.cloud.group.service.GroupSkuService; +import com.tmerclub.cloud.group.vo.GroupActivityVO; +import com.tmerclub.cloud.group.vo.GroupSkuVO; +import com.tmerclub.cloud.group.vo.app.AppGroupActivityVO; +import com.tmerclub.cloud.group.vo.app.AppGroupSkuVO; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 拼团活动表 + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +@Service +public class GroupActivityServiceImpl implements GroupActivityService { + + + private static final Logger logger = LoggerFactory.getLogger(GroupActivityServiceImpl.class); + + @Autowired + private GroupActivityMapper groupActivityMapper; + @Autowired + private GroupSkuService groupSkuService; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @Autowired + private RocketMQTemplate sendActivityOfflineNotifyToShopTemplate; + + @Autowired + protected RocketMQTemplate sendActivityAuditNotifyToShopTemplate; + + + + @Override + public PageVO page(PageDTO pageDTO, GroupActivityDTO groupActivityDTO) { + if (StrUtil.isNotBlank(groupActivityDTO.getSpuName())) { + SpuSimpleBO spuSimpleBO = new SpuSimpleBO(); + spuSimpleBO.setSpuName(groupActivityDTO.getSpuName()); + spuSimpleBO.setSeq(1); + spuSimpleBO.setLang(I18nMessage.getLang()); + ServerResponseEntity> spuRes = spuFeignClient.listSimple(spuSimpleBO); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + if (CollUtil.isNotEmpty(spuRes.getData())) { + Set spuIds = spuRes.getData().stream().map(SpuSimpleBO::getSpuId).collect(Collectors.toSet()); + groupActivityDTO.setSpuIds(new ArrayList<>(spuIds)); + } + } + PageVO page = PageUtil.doPage(pageDTO, () -> groupActivityMapper.list(groupActivityDTO)); + Set spuIdSet = page.getList().stream().map(GroupActivityVO::getSpuId).collect(Collectors.toSet()); + if (CollUtil.isEmpty(spuIdSet)) { + return page; + } + ServerResponseEntity> spuResponseEntity = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIdSet)); + if (CollUtil.isEmpty(spuResponseEntity.getData())) { + return page; + } + Map spuNameMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getName)); + Map imgUrlMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getMainImgUrl)); + for (GroupActivityVO groupActivity : page.getList()) { + groupActivity.setSpuName(spuNameMap.get(groupActivity.getSpuId())); + groupActivity.setMainImgUrl(imgUrlMap.get(groupActivity.getSpuId())); + } + return page; + } + + @Override + public PageVO platformPage(PageDTO pageDTO, GroupActivityDTO groupActivityDTO) { + if (StringUtils.isNotBlank(groupActivityDTO.getShopName())) { + List data = shopDetailFeignClient.getShopIdsByLikeShopName(groupActivityDTO.getShopName()).getData(); + groupActivityDTO.setShopIds(data); + } + PageVO page = PageUtil.doPage(pageDTO, () -> groupActivityMapper.list(groupActivityDTO)); + Set shopIdSet = page.getList().stream().map(GroupActivityVO::getShopId).collect(Collectors.toSet()); + Set spuIdSet = page.getList().stream().map(GroupActivityVO::getSpuId).collect(Collectors.toSet()); + ServerResponseEntity> spuResponseEntity = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIdSet)); + ServerResponseEntity> responseEntity = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopIdSet)); + if (CollUtil.isEmpty(responseEntity.getData())) { + return page; + } + Map shopMap = responseEntity.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + Map spuNameMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getName)); + Map imgUrlMap = spuResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getMainImgUrl)); + for (GroupActivityVO groupActivity : page.getList()) { + groupActivity.setShopName(shopMap.get(groupActivity.getShopId())); + groupActivity.setSpuName(spuNameMap.get(groupActivity.getSpuId())); + groupActivity.setMainImgUrl(imgUrlMap.get(groupActivity.getSpuId())); + } + return page; + } + + @Override + public GroupActivityVO getByGroupActivityId(Long groupActivityId) { + return groupActivityMapper.getByGroupActivityId(groupActivityId); + } + + @Override + public GroupActivityVO getGroupActivityInfo(Long groupActivityId) { + GroupActivityVO groupActivityVO = groupActivityMapper.getByGroupActivityId(groupActivityId); + ServerResponseEntity spuResponse = spuFeignClient.getSpuAndSkuBySpuId(groupActivityVO.getSpuId()); + groupActivityVO.setGroupSkuList(groupSkuService.listByGroupActivityId(groupActivityId)); + SpuVO spuVO = spuResponse.getData(); + // 商品不存在 + if (Objects.isNull(spuVO)) { + groupActivityVO.setSpuId(null); + return groupActivityVO; + } + Map skuMap = groupActivityVO.getGroupSkuList().stream().collect(Collectors.toMap(GroupSkuVO::getSkuId, g -> g)); + for (SkuVO sku : spuVO.getSkus()) { + GroupSkuVO groupSkuVO = skuMap.get(sku.getSkuId()); + if (groupSkuVO == null) { + continue; + } + groupSkuVO.setSkuName(sku.getSkuName()); + groupSkuVO.setPrice(sku.getPriceFee()); + } + groupActivityVO.setMainImgUrl(spuVO.getMainImgUrl()); + groupActivityVO.setSpuName(spuVO.getName()); + return groupActivityVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void save(GroupActivityDTO groupActivityDTO) { + // 判断是否是普通商品 + ServerResponseEntity spuResponseEntity = spuFeignClient.getDetailById(groupActivityDTO.getSpuId()); + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity.getMsg()); + } + SpuVO spuVO = spuResponseEntity.getData(); + if (!Objects.equals(spuVO.getSpuType(), SpuType.NORMAL.value())) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + // 保存团购信息 + GroupActivity groupActivity = BeanUtil.map(groupActivityDTO, GroupActivity.class); + // 默认为未启用状态 + groupActivity.setStatus(GroupActivityStatusEnum.DISABLE.value()); + groupActivity.setShopId(AuthUserContext.get().getTenantId()); + groupActivity.setPrice(getGroupSpuPrice(groupActivityDTO.getGroupSkuList())); + groupActivityMapper.save(groupActivity); + groupSkuService.batchSave(BeanUtil.mapAsList(groupActivityDTO.getGroupSkuList(), GroupSku.class), groupActivity.getGroupActivityId()); + + changeSpuType(groupActivity.getGroupActivityId(), groupActivity.getSpuId(), SpuType.GROUP, StatusEnum.ENABLE); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void update(GroupActivityDTO groupActivityDTO) { + GroupActivityVO dbGroupActivity = groupActivityMapper.getByGroupActivityId(groupActivityDTO.getGroupActivityId()); + if (!Objects.equals(dbGroupActivity.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + groupActivityDTO.setSpuId(dbGroupActivity.getSpuId()); + GroupActivity groupActivity = BeanUtil.map(groupActivityDTO, GroupActivity.class); + groupActivity.setPrice(getGroupSpuPrice(groupActivityDTO.getGroupSkuList())); + // 不更新的字段-预防非法修改 + groupActivity.setStatus(null); + groupActivity.setSpuId(null); + groupActivityMapper.update(groupActivity); + // 更新团购商品信息 + changeSpuType(dbGroupActivity.getGroupActivityId(), dbGroupActivity.getSpuId(), null, null); + // 状态为未启用可以更新sku + if (Objects.equals(GroupActivityStatusEnum.DISABLE.value(), dbGroupActivity.getStatus())) { + List groupSkuList = BeanUtil.mapAsList(groupActivityDTO.getGroupSkuList(), GroupSku.class); + groupSkuService.batchUpdate(groupSkuList, groupActivity.getGroupActivityId()); + } + } + + + @Override + public void updateStatus(Long groupActivityId, GroupActivityStatusEnum status) { + GroupActivity groupActivity = new GroupActivity(); + groupActivity.setStatus(status.value()); + groupActivity.setGroupActivityId(groupActivityId); + groupActivityMapper.update(groupActivity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void invalidGroupActivity(Long groupActivityId, Long spuId) { + updateStatus(groupActivityId, GroupActivityStatusEnum.EXPIRED); + changeSpuType(0L, spuId, SpuType.NORMAL, StatusEnum.ENABLE); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void deleteGroupActivity(Long groupActivityId, Long spuId) { + changeSpuType(groupActivityId, spuId, SpuType.NORMAL, StatusEnum.ENABLE); + updateStatus(groupActivityId, GroupActivityStatusEnum.DELETE); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void activeGroupActivity(Long groupActivityId, Long spuId) { + //获取活动sku最低价 + GroupActivityVO groupActivity = groupActivityMapper.getByGroupActivityId(groupActivityId); + List skuIds = groupSkuService.getSkuIdByActivityIdAndActPrice(groupActivityId, groupActivity.getPrice()); + //根据skuId获取对应原价最低的值 + ServerResponseEntity minPriceFees = skuFeignClient.getMinPriceFeeByIds(skuIds); + Long minPriceFee = minPriceFees.getData(); + //将最低活动价对应的sku原价存入redis + RedisUtil.set(CacheNames.GROUP_SPU_PRICE_FREE + groupActivityId, minPriceFee, 3600); + // 失效掉状态为(禁用/等待审核/违规下架)的同商品 + List groupActivityIds = groupActivityMapper.listNoFailureBySpuId(groupActivity.getSpuId(), groupActivityId); + for (Long activityId : groupActivityIds) { + updateStatus(activityId, GroupActivityStatusEnum.EXPIRED); + } + + updateStatus(groupActivityId, GroupActivityStatusEnum.ENABLE); + changeSpuType(groupActivityId, spuId, null, StatusEnum.ENABLE); + } + + @Override + public void offlineGroupActivity(Long groupActivityId) { + GroupActivityVO groupActivity = getByGroupActivityId(groupActivityId); + updateStatus(groupActivityId, GroupActivityStatusEnum.OFFLINE); + changeSpuType(groupActivityId, groupActivity.getSpuId(), null, StatusEnum.ENABLE); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(OfflineHandleEventDTO offlineHandleEventDto) { + OfflineHandleEventDTO offlineHandleEvent = new OfflineHandleEventDTO(); + offlineHandleEvent.setHandleId(offlineHandleEventDto.getHandleId()); + offlineHandleEvent.setHandleType(OfflineHandleEventType.GROUP_BUY.getValue()); + offlineHandleEvent.setOfflineReason(offlineHandleEventDto.getOfflineReason()); + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.save(offlineHandleEvent); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新活动状态为下线状态 + offlineGroupActivity(offlineHandleEventDto.getHandleId()); + + //发送活动下线消息给店铺 + GroupActivityVO groupActivity = getByGroupActivityId(offlineHandleEventDto.getHandleId()); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.ACTIVITY_OFFLINE.getValue()); + sendNotifyBO.setShopId(groupActivity.getShopId()); + sendNotifyBO.setActivityName(groupActivity.getActivityName()); + sendNotifyBO.setActivityId(groupActivity.getGroupActivityId()); + SendStatus sendStockStatus = sendActivityOfflineNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public OfflineHandleEventVO getOfflineHandleEvent(Long couponId) { + ServerResponseEntity offlineHandleEventResponse = + offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.GROUP_BUY.getValue(), couponId, null); + return offlineHandleEventResponse.getData(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(OfflineHandleEventDTO offlineHandleEventDto) { + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + Long groupActivityId = offlineHandleEventDto.getHandleId(); + GroupActivityVO dbGroupActivityVO = getByGroupActivityId(groupActivityId); + // 审核通过 + if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + updateStatus(groupActivityId, GroupActivityStatusEnum.DISABLE); + changeSpuType(groupActivityId, dbGroupActivityVO.getSpuId(), null, StatusEnum.ENABLE); + // 清除缓存 + GroupActivityServiceImpl groupActivityService = (GroupActivityServiceImpl) AopContext.currentProxy(); + groupActivityService.removeCache(dbGroupActivityVO.getSpuId()); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + updateStatus(offlineHandleEventDto.getHandleId(), GroupActivityStatusEnum.OFFLINE); + } + //发送活动审核结果消息给店铺 + GroupActivityVO groupActivity = getByGroupActivityId(offlineHandleEventDto.getHandleId()); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.ACTIVITY_AUDIT.getValue()); + sendNotifyBO.setShopId(groupActivity.getShopId()); + sendNotifyBO.setActivityName(groupActivity.getActivityName()); + sendNotifyBO.setActivityId(groupActivity.getGroupActivityId()); + SendStatus sendStockStatus = sendActivityAuditNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void auditApply(OfflineHandleEventDTO offlineHandleEventDto) { + // 更新事件状态 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新为待审核状态 + updateStatus(offlineHandleEventDto.getHandleId(), GroupActivityStatusEnum.WAIT_AUDIT); + } + + @Override + public AppGroupActivityVO getAppGroupActivityInfo(Long spuId) { + + GroupActivityServiceImpl groupActivityService = (GroupActivityServiceImpl) AopContext.currentProxy(); + + // 从缓存获取团购的数据 + AppGroupActivityVO appGroupActivityVO = groupActivityService.getBySpuId(spuId); + if (Objects.isNull(appGroupActivityVO)) { + return null; + } + setAppGroupActivityInfo(appGroupActivityVO); + return appGroupActivityVO; + } + + private void setAppGroupActivityInfo(AppGroupActivityVO appGroupActivityVO) { + ServerResponseEntity> skuResponse = skuFeignClient.listBySpuId(appGroupActivityVO.getSpuId()); + if (!Objects.equals(skuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(skuResponse.getMsg()); + } + Map skuMap = skuResponse.getData().stream().collect(Collectors.toMap(SkuAppVO::getSkuId, s -> s)); + List groupSkuList = appGroupActivityVO.getGroupSkuList(); + + Iterator groupSkuIterator = groupSkuList.iterator(); + while (groupSkuIterator.hasNext()) { + AppGroupSkuVO groupSkuVO = groupSkuIterator.next(); + SkuAppVO skuAppVO = skuMap.get(groupSkuVO.getSkuId()); + if (skuAppVO == null) { + groupSkuIterator.remove(); + continue; + } + groupSkuVO.setSkuName(skuAppVO.getSkuName()); + groupSkuVO.setProperties(skuAppVO.getProperties()); + groupSkuVO.setImgUrl(skuAppVO.getImgUrl()); + // 如果没有市场价,就用售价当作市场价 + groupSkuVO.setMarketPriceFee(skuAppVO.getPriceFee()); + groupSkuVO.setStock(skuAppVO.getStock()); + groupSkuVO.setSpuId(skuAppVO.getSpuId()); + groupSkuVO.setSkuComboList(skuAppVO.getSkuComboList()); + groupSkuVO.setStatus(1); + } + } + + + @Override + @Cacheable(cacheNames = GroupCacheNames.GROUP_BY_SPU_KEY, key = "#spuId") + public AppGroupActivityVO getBySpuId(Long spuId) { + return groupActivityMapper.getBySpuId(spuId); + } + + @Override + public List groupSpuListBySpuIds(List spuIds) { + return groupActivityMapper.groupSpuListBySpuIds(spuIds); + } + + @Override + public List listUnEndButNeedEndActivity() { + return groupActivityMapper.listUnEndButNeedEndActivity(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeProdTypeByGroupActivityIdList(List groupActivityList) { + // 失效团购活动 + groupActivityMapper.expiredGroupActivityByGroupActivityIdList(groupActivityList); + List spuIds = groupActivityList.stream().map(GroupActivity::getSpuId).collect(Collectors.toList()); + spuFeignClient.changeToNormalSpu(spuIds); + } + + @Override + @CacheEvict(cacheNames = GroupCacheNames.GROUP_BY_SPU_KEY, key = "#spuId") + public void removeCache(Long spuId) { + + } + + @Override + public AppGroupActivityVO getAppGroupActivityByGroupActivityId(Long groupActivityId) { + AppGroupActivityVO appGroupActivityVO = groupActivityMapper.getAppGroupActivityByGroupActivityId(groupActivityId); + + if (Objects.isNull(appGroupActivityVO)) { + return null; + } + setAppGroupActivityInfo(appGroupActivityVO); + return appGroupActivityVO; + } + + @Override + public void updateGroupActivityPrice(List skuIds, Long spuId) { + GroupActivityVO activityInfoBySpuId = groupActivityMapper.getGroupActivityInfoBySpuId(spuId); + if (Objects.isNull(activityInfoBySpuId)) { + return; + } + //重新计算price + List skuList = activityInfoBySpuId.getGroupSkuList(); + List groupSkuList = BeanUtil.mapAsList(skuList, GroupSkuDTO.class); + groupSkuList.removeIf(sku -> !skuIds.contains(sku.getSkuId())); + Long groupSpuPrice = getGroupSpuPrice(groupSkuList); + GroupActivity groupActivity = BeanUtil.map(activityInfoBySpuId, GroupActivity.class); + groupActivity.setPrice(groupSpuPrice); + groupActivityMapper.update(groupActivity); + } + + @Override + public List getGroupPriceFree(Long groupActivityId) { + //获取活动sku最低价 + GroupActivityVO groupActivity = groupActivityMapper.getByGroupActivityId(groupActivityId); + return groupSkuService.getSkuIdByActivityIdAndActPrice(groupActivityId, groupActivity.getPrice()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void updateGroupActivityStatus(Long spuId) { + AppGroupActivityVO groupActivityVO = groupActivityMapper.getBySpuId(spuId); + if (Objects.isNull(groupActivityVO)) { + logger.info("团购活动为空,spuId={}", spuId); + return; + } + updateStatus(groupActivityVO.getGroupActivityId(), GroupActivityStatusEnum.EXPIRED); + spuFeignClient.changeToNormalSpu(Arrays.asList(spuId)); + } + + @Override + public void offlineGroupBySpuIds(List spuIds) { + groupActivityMapper.expiredGroupActivityBySpuIds(spuIds); + } + + /** + * 更改商品类型 + * + * @param groupActivityId + * @param spuId + * @param spuType + * @param status + */ + private void changeSpuType(Long groupActivityId, Long spuId, SpuType spuType, StatusEnum status) { + SpuDTO spuDTO = new SpuDTO(); + spuDTO.setSpuId(spuId); + spuDTO.setActivityId(groupActivityId); + if (Objects.nonNull(spuType)) { + spuDTO.setSpuType(spuType.value()); + } else { + spuDTO.setSpuType(SpuType.GROUP.value()); + } + if (Objects.nonNull(status)) { + spuDTO.setStatus(status.value()); + } + ServerResponseEntity spuResponse = spuFeignClient.changeSpuType(spuDTO); + if (!Objects.equals(spuResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(spuResponse.getMsg()); + } + } + + /** + * 获取sku中的最低价格 + * + * @param groupSkuList + * @return + */ + private Long getGroupSpuPrice(List groupSkuList) { + Long minPrice = null; + for (GroupSkuDTO groupSku : groupSkuList) { + if (Objects.isNull(minPrice) || groupSku.getActPrice() < minPrice) { + minPrice = groupSku.getActPrice(); + } + } + return minPrice; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupOrderServiceImpl.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupOrderServiceImpl.java new file mode 100644 index 0000000..26b91d2 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/service/impl/GroupOrderServiceImpl.java @@ -0,0 +1,644 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.group.bo.GroupOrderNotifyBO; +import com.tmerclub.cloud.api.group.vo.GroupOrderVO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.vo.GroupInfoVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.constant.GroupCacheNames; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.OrderIdWithRefundIdBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.group.bo.GroupOpenNotifyBO; +import com.tmerclub.cloud.group.bo.GroupOrderBO; +import com.tmerclub.cloud.group.bo.GroupSaveNotifyBO; +import com.tmerclub.cloud.group.bo.mongo.MongoGroupOrderBO; +import com.tmerclub.cloud.group.bo.mongo.MongoGroupTeamBO; +import com.tmerclub.cloud.group.constant.DistributedIdKey; +import com.tmerclub.cloud.group.constant.GroupOrderStatusEnum; +import com.tmerclub.cloud.group.constant.TeamStatusEnum; +import com.tmerclub.cloud.group.mapper.GroupActivityMapper; +import com.tmerclub.cloud.group.mapper.GroupOrderMapper; +import com.tmerclub.cloud.group.service.GroupOrderService; +import com.tmerclub.cloud.group.service.GroupTeamService; +import com.tmerclub.cloud.group.vo.GroupActivityVO; +import com.tmerclub.cloud.group.vo.mongo.MongoAppGroupUserVO; +import com.tmerclub.cloud.group.vo.mongo.MongoGroupOrderCountVO; +import com.tmerclub.cloud.group.vo.mongo.MongoGroupOrderVO; +import com.tmerclub.cloud.group.vo.mongo.MongoSuccessGroupOrderVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 拼团订单表 + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +@Service +public class GroupOrderServiceImpl implements GroupOrderService { + private static final Logger logger = LoggerFactory.getLogger(GroupOrderServiceImpl.class); + + @Autowired + private GroupOrderMapper groupOrderMapper; + @DubboReference + private UserFeignClient userFeignClient; + @Autowired + private GroupTeamService groupTeamService; + @Autowired + private GroupActivityMapper groupActivityMapper; + @Autowired + private CacheManagerUtil cacheManagerUtil; + @Autowired + private RocketMQTemplate groupOrderSuccessTemplate; + @Autowired + private RocketMQTemplate groupOrderUnSuccessTemplate; + @Autowired + private RocketMQTemplate sendGroupNotifyToUserTemplate; + @Autowired + private RocketMQTemplate groupOrderUnSuccessRefundTemplate; + @Autowired + private RocketMQTemplate sendGroupOrderSaveTemplate; + @Autowired + private RocketMQTemplate sendGroupOrderOpenAndJoinGroupTemplate; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @Autowired + private MongoTemplate mongoTemplate; + + @Override + public void saveToMongodb(MongoGroupOrderBO mongoGroupOrderBO) { + if (Objects.isNull(mongoGroupOrderBO) || Objects.isNull(mongoGroupOrderBO.getGroupOrderId())) { + throw new LuckException("拼团团队信息不全"); + } + mongoGroupOrderBO.setCreateTime(new Date()); + mongoGroupOrderBO.setUpdateTime(new Date()); + logger.info("保存拼团订单到mongodb{}", mongoGroupOrderBO); + mongoTemplate.save(mongoGroupOrderBO); + } + + @Override + public void saveBatchToMongodb(List list) { + logger.info("批量保存拼团订单到mongodb{}", list); + for (MongoGroupOrderBO mongoGroupOrderBO : list) { + if (Objects.isNull(mongoGroupOrderBO) || Objects.isNull(mongoGroupOrderBO.getGroupOrderId())) { + throw new LuckException("拼团团队信息不全"); + } + mongoGroupOrderBO.setCreateTime(new Date()); + mongoGroupOrderBO.setUpdateTime(new Date()); + } + mongoTemplate.insertAll(list); + } + + @Override + public GroupOrderVO getByOrderId(Long orderId) { + MongoGroupOrderBO mongoGroupOrderBO = mongoTemplate.findOne(new Query(Criteria.where("orderId").is(orderId)), MongoGroupOrderBO.class); + return BeanUtil.map(mongoGroupOrderBO, GroupOrderVO.class); + } + + @Override + public List listApiGroupUserDto(Long groupTeamId) { + Criteria criteria = Criteria.where("groupTeamId").is(groupTeamId).and("status").is(GroupOrderStatusEnum.SUCCESS.value()); + ProjectionOperation projectionOperation = Aggregation.project() + .and("userId").as("userId") + .and("identityType").as("identityType") + .and("createTime").as("createTime"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoAppGroupUserVO.class, + Aggregation.match(criteria), + projectionOperation + ); + logger.info("listApiGroupUserDto()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoAppGroupUserVO.class); + // 取出最终结果 + List appGroupUserList = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(appGroupUserList)) { + return null; + } + Set userIds = appGroupUserList.stream().map(MongoAppGroupUserVO::getUserId).collect(Collectors.toSet()); + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(new ArrayList<>(userIds)); + List data = userResponse.getData(); + Map userMap = data.stream().collect(Collectors.toMap(UserApiVO::getUserId, u -> u)); + for (MongoAppGroupUserVO groupUserVO : appGroupUserList) { + // 机器人参团 + if (Objects.isNull(groupUserVO.getUserId()) || Objects.equals(groupUserVO.getUserId(), 0L)) { + groupUserVO.setNickName(Constant.GROUP_SYSTEM_USER); + } else { + UserApiVO userApiVO = userMap.get(groupUserVO.getUserId()); + groupUserVO.setNickName(userApiVO.getNickName()); + groupUserVO.setPic(userApiVO.getPic()); + } + } + return appGroupUserList; + } + + @Override + public GroupOrderVO getUserGroupOrderByGroupTeamId(Long groupTeamId) { + Long userId = AuthUserContext.get().getUserId(); + Criteria criteria = Criteria.where("groupTeamId").is(groupTeamId) + .and("userId").is(userId) + .and("status").is(GroupOrderStatusEnum.SUCCESS.value()); + MongoGroupOrderBO mongoGroupOrderBO = mongoTemplate.findOne(new Query(criteria), MongoGroupOrderBO.class); + return BeanUtil.map(mongoGroupOrderBO, GroupOrderVO.class); + } + + @Override + public Integer getUserHadSpuCountByGroupActivityId(Long userId, Long groupActivityId) { + Criteria criteria = Criteria.where("groupActivityId").is(groupActivityId) + .and("userId").is(userId) + .and("status").ne(GroupOrderStatusEnum.FAIL.value()); + ProjectionOperation projectionOperation = Aggregation.project("orderId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoGroupOrderVO.class, + Aggregation.match(criteria), + projectionOperation + ); + logger.info("getUserHadSpuCountByGroupActivityId()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoGroupOrderVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0; + } + List orderIds = list.stream().map(MongoGroupOrderVO::getOrderId).collect(Collectors.toList()); + if (CollUtil.isEmpty(orderIds)) { + return 0; + } + ServerResponseEntity orderResponse = orderFeignClient.countNormalOrderByOrderIds(orderIds); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + return orderResponse.getData(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submit(GroupOrderBO groupOrderBO) { + // 插入拼团订单 + MongoGroupOrderBO groupOrder = new MongoGroupOrderBO(); + MongoGroupTeamBO groupTeam; + if (Objects.equals(groupOrderBO.getGroupTeamId(), 0L)) { + // 如果为团长,则需新建拼团团队 + groupTeam = new MongoGroupTeamBO(); + Long groupTeamId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_GROUP_TEAM, groupOrderBO.getGroupActivityId()); + groupTeam.setGroupTeamId(groupTeamId); + groupTeam.setShareUserId(groupOrderBO.getShareUserId()); + groupTeam.setGroupSpuId(groupOrderBO.getSpuId()); + groupTeam.setGroupActivityId(groupOrderBO.getGroupActivityId()); + groupTeam.setJoinNum(1); + groupTeam.setShopId(groupOrderBO.getShopId()); + groupTeam.setStatus(TeamStatusEnum.WAITING_GROUP.value()); + groupTeam.setTotalPrice(groupOrder.getPayPrice()); + + groupOrder.setGroupTeamId(groupTeam.getGroupTeamId()); + } else { + groupTeam = groupTeamService.getByGroupTeamId(groupOrderBO.getGroupTeamId()); + groupOrder.setGroupTeamId(groupOrderBO.getGroupTeamId()); + } + + Long groupOrderId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_GROUP_ORDER, groupOrderBO.getGroupActivityId()); + groupOrder.setGroupOrderId(groupOrderId); + groupOrder.setGroupActivityId(groupOrderBO.getGroupActivityId()); + groupOrder.setUserId(groupOrderBO.getUserId()); + groupOrder.setOrderId(groupOrderBO.getOrderId()); + groupOrder.setActivityProdPrice(groupOrderBO.getActivityProdPrice()); + groupOrder.setPayPrice(groupOrderBO.getPayPrice()); + groupOrder.setShopId(groupOrderBO.getShopId()); + groupOrder.setIdentityType(Objects.equals(groupOrderBO.getGroupTeamId(), 0L) ? 1 : 0); + groupOrder.setStatus(GroupOrderStatusEnum.WAITING_PAY.value()); + groupOrder.setCount(groupOrderBO.getCount()); + + GroupSaveNotifyBO groupSaveNotifyBO = new GroupSaveNotifyBO(); + groupSaveNotifyBO.setMongoGroupTeamBO(groupTeam); + groupSaveNotifyBO.setMongoGroupOrderBO(groupOrder); + SendStatus sendStatus = sendGroupOrderSaveTemplate.syncSend(RocketMqConstant.GROUP_ORDER_SAVE_TOPIC, new GenericMessage<>(groupSaveNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void cancelGroupOrder(GroupOrderVO groupOrder, List orderIds) { + logger.info("拼团订单取消{}", groupOrder); + Update update = new Update(); + update.set("status", GroupOrderStatusEnum.FAIL.value()); + Query query = new Query(Criteria.where("groupActivityId").is(groupOrder.getGroupActivityId()) + .and("status").is(GroupOrderStatusEnum.WAITING_PAY.value()) + .and("orderId").in(orderIds)); + mongoTemplate.updateFirst(query, update, MongoGroupOrderBO.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void payNotifyGroupOrder(PayNotifyBO message) { + Long orderId = message.getOrderIds().get(0); + // 获取用户拼团订单信息 + GroupOrderVO groupOrder = getByOrderId(orderId); + if (Objects.equals(groupOrder.getStatus(), GroupOrderStatusEnum.SUCCESS.value())) { + return; + } + // 如果为团长则直接开团,否则判断是否拼团已满 + if (Objects.equals(groupOrder.getIdentityType(), 1)) { + logger.info("拼团开团" + orderId); + // 开团 + openGroup(orderId, groupOrder); + } else { + // 获取拼团团队订单 + MongoGroupTeamBO groupTeam = groupTeamService.getByGroupTeamId(groupOrder.getGroupTeamId()); + // 如果团已满,或回调的时候团已经失败了(之前的团退款了)则开新团 + // 否则加入该团 + if (Objects.equals(groupTeam.getStatus(), TeamStatusEnum.SUCCESS.value()) + || Objects.equals(groupTeam.getStatus(), TeamStatusEnum.FAIL.value())) { + logger.info("拼团开新团" + orderId); + // 开新团 + openNewGroup(orderId, groupOrder, groupTeam); + } else if (Objects.equals(groupTeam.getStatus(), TeamStatusEnum.IN_GROUP.value())) { + // 参团 + logger.info("拼团参团" + orderId); + joinGroup(orderId, groupOrder, groupTeam); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void unSuccess(Long groupTeamId) { + Date nowDate = new Date(); + // 机器人列表 + List robot = new ArrayList<>(Constant.INITIAL_CAPACITY); + MongoGroupTeamBO groupTeam = groupTeamService.getByGroupTeamId(groupTeamId); + if (!Objects.equals(groupTeam.getStatus(), TeamStatusEnum.IN_GROUP.value())) { + return; + } + GroupActivityVO groupActivity = groupActivityMapper.getByGroupActivityId(groupTeam.getGroupActivityId()); + + List successGroupOrders = listSuccessOrderIdByTeamId(groupTeam.getGroupTeamId(), false); + + if (CollectionUtil.isEmpty(successGroupOrders)) { + return; + } + List orderIds = successGroupOrders.stream().map(MongoSuccessGroupOrderVO::getOrderId).collect(Collectors.toList()); + + // 如果未成团,有机器人可以成团,不需要进行退款的操作 + if (groupActivity.getHasRobot() == 1) { + logger.info("机器人成团" + groupTeamId); + addRobot(nowDate, robot, groupTeam, groupActivity, orderIds); + return; + } + logger.info("订单拼团失败,退款" + groupTeamId); + + List orderIdWithRefundIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (MongoSuccessGroupOrderVO successGroupOrder : successGroupOrders) { + // 由于用户id不一定相同,不能批量获取id + Long segmentId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_REFUND, successGroupOrder.getUserId()); + OrderIdWithRefundIdBO orderIdWithRefundIdBO = new OrderIdWithRefundIdBO(); + orderIdWithRefundIdBO.setOrderId(successGroupOrder.getOrderId()); + orderIdWithRefundIdBO.setRefundId(segmentId); + orderIdWithRefundIdBO.setShopId(successGroupOrder.getShopId()); + orderIdWithRefundIds.add(orderIdWithRefundIdBO); + } + + // 发送退款服务进行退款的通知 - 事务消息,更改拼团队伍的状态和更新订单退款相关信息 + TransactionSendResult transactionSendResult = groupOrderUnSuccessRefundTemplate.sendMessageInTransaction(RocketMqConstant.GROUP_ORDER_UN_SUCCESS_REFUND_TOPIC, new GenericMessage<>(orderIdWithRefundIds), groupTeamId); + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 消息推送-拼团失败 + for (Long orderId : orderIds) { + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.GROUP_FAIL.getValue()); + sendNotifyBO.setBizId(orderId); + SendStatus sendBizStatus = sendGroupNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_GROUP_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + } + + } + + private List listSuccessOrderIdByTeamId(Long groupTeamId, boolean isNeedUnPay) { + Criteria criteria = Criteria.where("groupTeamId").is(groupTeamId); + if (isNeedUnPay) { + // 参团需要获取还未更新成功的,因为这是到后面用mq去保证成功 + criteria.and("status").in(0, 1); + } else { + criteria.and("status").is(GroupOrderStatusEnum.SUCCESS.value()); + } + ProjectionOperation projectionOperation = Aggregation.project("orderId", "userId", "shopId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoSuccessGroupOrderVO.class, + Aggregation.match(criteria), + projectionOperation + ); + logger.info("listSuccessOrderIdByTeamId()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoSuccessGroupOrderVO.class); + // 取出最终结果 + return aggregationResults.getMappedResults(); + } + + /** + * 如果未成团,有机器人可以成团,则添加机器人 + * + * @param nowDate 当前时间 + * @param robot 机器人列表 + * @param groupTeam 拼团队伍 + * @param groupActivity 团购活动 + * @param orderIds 订单id列表 + */ + private void addRobot(Date nowDate, List robot, MongoGroupTeamBO groupTeam, GroupActivityVO groupActivity, List orderIds) { + + // 模拟参团操作(添加机器人) + for (int i = 0; i < groupActivity.getGroupNumber() - groupTeam.getJoinNum(); i++) { + GroupOrderVO groupOrder = new GroupOrderVO(); + groupOrder.setShopId(groupTeam.getShopId()); + groupOrder.setGroupTeamId(groupTeam.getGroupTeamId()); + groupOrder.setGroupActivityId(groupActivity.getGroupActivityId()); + groupOrder.setUserId(0L); + groupOrder.setIdentityType(0); + groupOrder.setStatus(GroupOrderStatusEnum.SUCCESS.value()); + groupOrder.setCreateTime(nowDate); + robot.add(groupOrder); + } + if (CollectionUtil.isNotEmpty(robot)) { + for (GroupOrderVO groupOrder : robot) { + Long id = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_GROUP_ORDER, groupTeam.getGroupActivityId()); + groupOrder.setGroupOrderId(id); + } + } + + // 更新已成团人数 + updateGroupOrderInfo(groupActivity.getGroupActivityId()); + + GroupOrderNotifyBO groupOrderNotifyBO = new GroupOrderNotifyBO(); + groupOrderNotifyBO.setOrderIds(orderIds); + groupOrderNotifyBO.setGroupOrders(robot); + groupOrderNotifyBO.setIsJoin(0); + // 消息-更改团队状态-发送通知更新拼团订单,发送通知给订单,将订单状态变为待发货 + TransactionSendResult transactionSendResult = groupOrderSuccessTemplate.sendMessageInTransaction(RocketMqConstant.GROUP_ORDER_SUCCESS_TOPIC, new GenericMessage<>(groupOrderNotifyBO), groupTeam); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + for (Long orderId : orderIds) { + // 消息推送-拼团成功 + SendStatus sendBizStatus = sendGroupNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_GROUP_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(orderId)).getSendStatus(); + } + } + + @Override + public Integer getOrderBySpuIdAndUserId(Long groupActivityId, Long spuId, Long userId) { + Criteria criteria = Criteria.where("userId").is(userId).and("groupActivityId").is(groupActivityId).and("status").ne(GroupOrderStatusEnum.FAIL.value()); + ProjectionOperation projectionOperation = Aggregation.project("groupTeamId", "groupActivityId"); + LookupOperation lookupOperation = Aggregation.lookup("group_team", "groupTeamId", "_id", "groupTeam"); + Criteria teamCriteria = Criteria.where("groupTeam.status").in(0, 1).and("groupTeam.groupSpuId").is(spuId); + GroupOperation groupOperation = Aggregation.group("groupActivityId").count().as("count"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoGroupOrderCountVO.class, + Aggregation.match(criteria), + projectionOperation, + lookupOperation, + Aggregation.match(teamCriteria), + groupOperation + ); + logger.info("getOrderBySpuIdAndUserId()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoGroupOrderCountVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0; + } + return Objects.isNull(list.get(0).getCount()) ? 0 : list.get(0).getCount(); + } + + @Override + public void updateGroupOrderInfo(Long groupActivityId) { + // mongo数据更新存在一定延迟,导致统计的成团数据不准确,稍微加点延迟等待mongo更新 + try { + TimeUnit.SECONDS.sleep(1L); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + ServerResponseEntity serverResponse = orderFeignClient.getGroupInfoById(groupActivityId); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + GroupInfoVO groupInfo = serverResponse.getData(); + if (Objects.nonNull(groupInfo)) { + groupActivityMapper.updateGroupOrderInfo(groupActivityId, groupInfo.getOrderCount(), groupInfo.getNumberCount()); + } + } + + @Override + public void updateToPaySuccess(Long orderId, Integer identityType, Long groupTeamId) { + logger.info("拼团订单更新为支付成功" + orderId); + Update update = new Update(); + update.set("status", GroupOrderStatusEnum.SUCCESS.value()); + if (Objects.nonNull(groupTeamId)) { + update.set("groupTeamId", groupTeamId); + } + if (Objects.nonNull(identityType)) { + update.set("identityType", identityType); + } + Query query = new Query(Criteria.where("orderId").is(orderId) + .and("status").ne(GroupOrderStatusEnum.SUCCESS.value())); + mongoTemplate.updateFirst(query, update, MongoGroupOrderBO.class); + } + + + private void openGroup(Long orderId, GroupOrderVO groupOrder) { + updateGroupOrderInfo(groupOrder.getGroupActivityId()); + Date now = new Date(); + MongoGroupTeamBO newGroupTeam = groupTeamService.getByGroupTeamId(groupOrder.getGroupTeamId()); + newGroupTeam.setTotalPrice(groupOrder.getPayPrice()); + newGroupTeam.setGroupTeamId(groupOrder.getGroupTeamId()); + newGroupTeam.setStatus(TeamStatusEnum.IN_GROUP.value()); + newGroupTeam.setStartTime(now); + newGroupTeam.setEndTime(DateUtil.offsetMillisecond(now, RocketMqConstant.CANCEL_TIME_INTERVAL)); + + updateTeamAndOrder(orderId, null, null, newGroupTeam); + + sendMsg(orderId, groupOrder); + } + + private void sendMsg(Long orderId, GroupOrderVO groupOrder) { + // 发送延迟消息 + // 发送消息,如果三十分钟后没有成团,则取消订单进行退款 + SendStatus sendStatus = groupOrderUnSuccessTemplate.syncSend(RocketMqConstant.GROUP_ORDER_UN_SUCCESS_TOPIC, new GenericMessage<>(groupOrder.getGroupTeamId()), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 消息推送-开团成功 + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.GROUP_START.getValue()); + sendNotifyBO.setBizId(orderId); + SendStatus sendBizStatus = sendGroupNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_GROUP_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + } + + private void openNewGroup(Long orderId, GroupOrderVO groupOrder, MongoGroupTeamBO groupTeam) { + + // 获取订单id列表 + Long groupTeamId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_GROUP_TEAM, groupTeam.getGroupActivityId()); + Date now = new Date(); + // 满员开团 + MongoGroupTeamBO newGroupTeam = new MongoGroupTeamBO(); + newGroupTeam.setGroupTeamId(groupTeamId); + newGroupTeam.setJoinNum(1); + newGroupTeam.setCreateTime(now); + newGroupTeam.setUpdateTime(now); + newGroupTeam.setStartTime(now); + newGroupTeam.setShopId(groupTeam.getShopId()); + newGroupTeam.setTotalPrice(groupOrder.getPayPrice()); + newGroupTeam.setShareUserId(groupOrder.getUserId()); + newGroupTeam.setStatus(TeamStatusEnum.IN_GROUP.value()); + newGroupTeam.setGroupSpuId(groupTeam.getGroupSpuId()); + newGroupTeam.setGroupActivityId(groupTeam.getGroupActivityId()); + newGroupTeam.setEndTime(DateUtil.offsetMillisecond(now, RocketMqConstant.CANCEL_TIME_INTERVAL)); + + updateGroupOrderInfo(groupOrder.getGroupActivityId()); + + updateTeamAndOrder(orderId, 1, newGroupTeam.getGroupTeamId(), newGroupTeam); + + // 发送延迟消息 + // 发送消息,如果三十分钟后没有成团,则取消订单进行退款 + sendMsg(orderId, groupOrder); + } + + private void updateTeamAndOrder(Long orderId, Integer identityType, Long groupTeamId, MongoGroupTeamBO newGroupTeam) { + GroupOpenNotifyBO groupOpenNotifyBO = new GroupOpenNotifyBO(); + groupOpenNotifyBO.setOrderId(orderId); + groupOpenNotifyBO.setIdentityType(identityType); + groupOpenNotifyBO.setGroupTeamId(groupTeamId); + // 事务消息-更改团队状态-发送通知更新拼团订单 + TransactionSendResult transactionSendResult = sendGroupOrderOpenAndJoinGroupTemplate.sendMessageInTransaction(RocketMqConstant.GROUP_ORDER_OPEN_AND_JOIN_GROUP_TOPIC, + new GenericMessage<>(groupOpenNotifyBO), newGroupTeam); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private void joinGroup(Long orderId, GroupOrderVO groupOrder, MongoGroupTeamBO groupTeam) { + // 拼团活动 + GroupActivityVO groupActivity = groupActivityMapper.getByGroupActivityId(groupTeam.getGroupActivityId()); + MongoGroupTeamBO newGroupTeam = groupTeamService.getByGroupTeamId(groupOrder.getGroupTeamId()); + newGroupTeam.setGroupTeamId(groupOrder.getGroupTeamId()); + // 参团 + newGroupTeam.setJoinNum(groupTeam.getJoinNum() + 1); + newGroupTeam.setTotalPrice(groupTeam.getTotalPrice() + groupOrder.getPayPrice()); + + // 参团人数未满,更新人数,金额 + if (newGroupTeam.getJoinNum() < groupActivity.getGroupNumber()) { + updateTeamAndOrder(orderId, null, null, newGroupTeam); + return; + } + + updateGroupOrderInfo(groupActivity.getGroupActivityId()); + // 清除缓存-更新了已成团订单数及人数 + cacheManagerUtil.evictCache(GroupCacheNames.GROUP_BY_SPU_KEY, String.valueOf(groupActivity.getSpuId())); + // 发送通知给订单,将所有同一个团并且已支付订单的状态变为待发货 + if (newGroupTeam.getJoinNum() >= groupActivity.getGroupNumber()) { + List successGroupOrders = listSuccessOrderIdByTeamId(groupTeam.getGroupTeamId(), true); + List orderIds = successGroupOrders.stream().map(MongoSuccessGroupOrderVO::getOrderId).collect(Collectors.toList()); + + GroupOrderNotifyBO groupOrderNotifyBO = new GroupOrderNotifyBO(); + groupOrderNotifyBO.setOrderIds(orderIds); + groupOrderNotifyBO.setGroupOrders(Collections.singletonList(groupOrder)); + groupOrderNotifyBO.setIsJoin(1); + // 事务消息-更改团队状态-发送通知更新拼团订单,发送通知给订单,将订单状态变为待发货 + TransactionSendResult transactionSendResult = groupOrderSuccessTemplate.sendMessageInTransaction(RocketMqConstant.GROUP_ORDER_SUCCESS_TOPIC, new GenericMessage<>(groupOrderNotifyBO), groupTeam); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + for (Long id : orderIds) { + // 消息推送-拼团成功 + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.GROUP_SUCCESS.getValue()); + sendNotifyBO.setBizId(id); + SendStatus sendBizStatus = sendGroupNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_GROUP_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + } + } + } + + @Override + public void initGroupOrderToMongo() { + int start = 0; + int size = 10000; + mongoTemplate.remove(MongoGroupOrderBO.class); + while (true) { + // 批量以10000条处理 + List mongoGroupOrderList = groupOrderMapper.listToMongodb(start, size); + if (CollUtil.isEmpty(mongoGroupOrderList)) { + break; + } + mongoTemplate.insertAll(mongoGroupOrderList); + if (mongoGroupOrderList.size() <= size) { + break; + } + start = start + size; + } + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/task/GroupTask.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/task/GroupTask.java new file mode 100644 index 0000000..7de4d0c --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/task/GroupTask.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.task; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.group.model.GroupActivity; +import com.tmerclub.cloud.group.service.GroupActivityService; +import com.tmerclub.cloud.group.service.GroupOrderService; +import com.tmerclub.cloud.group.service.GroupTeamService; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 见 ... + * 开发步骤: + * 1、任务开发:在Spring Bean实例中,开发Job方法; + * 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。 + * 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志; + * 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果; + * + * @author FrozenWatermelon + * @date 2021/04/23 + */ +@Component +public class GroupTask { + + @Autowired + private GroupActivityService groupActivityService; + @Autowired + private GroupTeamService groupTeamService; + @Autowired + private GroupOrderService groupOrderService; + + /** + * 结束活动,改变商品类型 + */ + @XxlJob("activityFinishAndProdChange") + public void activityFinishAndProdChange() { + XxlJobHelper.log("拼团活动结束,团购商品恢复为普通商品。。。"); + // 0:未启用、1:启用、2:违规下架、3:等待审核 + // 获取活动结束或团单结束未成团的拼团团队 + List groupActivityList = groupActivityService.listUnEndButNeedEndActivity(); + + if (CollUtil.isEmpty(groupActivityList)) { + return; + } + groupActivityService.changeProdTypeByGroupActivityIdList(groupActivityList); + } + + /** + * 初始化原有数据库记录至mongodb + * 该定时任务成功执行一次即可!!!!!,成功执行完后将任务置为STOP状态或删除 + */ + @XxlJob("initGroupToMongo") + public void initGroupToMongo() { + XxlJobHelper.log("初始化拼团团队原有数据库记录至mongodb"); + groupTeamService.initGroupTeamToMongo(); + + XxlJobHelper.log("初始化拼团订单原有数据库记录至mongodb"); + groupOrderService.initGroupOrderToMongo(); + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupActivityVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupActivityVO.java new file mode 100644 index 0000000..00b2808 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupActivityVO.java @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 拼团活动表VO + * + * @author YXF + * @date 2021-03-20 10:39:31 + */ +public class GroupActivityVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "活动名称") + private String activityName; + + @Schema(description = "活动开始时间(活动状态:未开始、经行中、已结束)") + private Date startTime; + + @Schema(description = "活动结束时间(活动状态:未开始、经行中、已结束)") + private Date endTime; + + @Schema(description = "成团人数") + private Integer groupNumber; + + @Schema(description = "商品是否限购(1:限购、0:不限购)") + private Integer hasMaxNum; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "是否模拟成团(1:模拟参团、0:不模拟)") + private Integer hasRobot; + + @Schema(description = "活动是否预热") + private Integer isPreheat; + + @Schema(description = "是否开启凑团模式(1:凑团、0:不凑团)") + private Integer hasGroupTip; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "已成团订单数(统计)") + private Long groupOrderCount; + + @Schema(description = "已成团人数(统计)") + private Long groupNumberCount; + + @Schema(description = "拼团状态(-1:删除、0:未启用、1:启用、2:违规下架、3:等待审核 4:已失效 5:已结束)") + private Integer status; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "spu名称") + private String spuName; + + @Schema(description = "团购sku列表") + private List groupSkuList; + + @Schema(description = "商品价格(sku最低价)") + private Long price; + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getActivityName() { + return activityName; + } + + public void setActivityName(String activityName) { + this.activityName = activityName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + + public Integer getGroupNumber() { + return groupNumber; + } + + public void setGroupNumber(Integer groupNumber) { + this.groupNumber = groupNumber; + } + + public Integer getHasMaxNum() { + return hasMaxNum; + } + + public void setHasMaxNum(Integer hasMaxNum) { + this.hasMaxNum = hasMaxNum; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getHasRobot() { + return hasRobot; + } + + public void setHasRobot(Integer hasRobot) { + this.hasRobot = hasRobot; + } + + public Integer getIsPreheat() { + return isPreheat; + } + + public void setIsPreheat(Integer isPreheat) { + this.isPreheat = isPreheat; + } + + public Integer getHasGroupTip() { + return hasGroupTip; + } + + public void setHasGroupTip(Integer hasGroupTip) { + this.hasGroupTip = hasGroupTip; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getGroupOrderCount() { + return groupOrderCount; + } + + public void setGroupOrderCount(Long groupOrderCount) { + this.groupOrderCount = groupOrderCount; + } + + public Long getGroupNumberCount() { + return groupNumberCount; + } + + public void setGroupNumberCount(Long groupNumberCount) { + this.groupNumberCount = groupNumberCount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public List getGroupSkuList() { + return groupSkuList; + } + + public void setGroupSkuList(List groupSkuList) { + this.groupSkuList = groupSkuList; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "GroupActivityVO{" + + "groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", activityName='" + activityName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", groupNumber=" + groupNumber + + ", hasMaxNum=" + hasMaxNum + + ", maxNum=" + maxNum + + ", hasRobot=" + hasRobot + + ", isPreheat=" + isPreheat + + ", hasGroupTip=" + hasGroupTip + + ", spuId=" + spuId + + ", groupOrderCount=" + groupOrderCount + + ", groupNumberCount=" + groupNumberCount + + ", status=" + status + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", spuName='" + spuName + '\'' + + ", groupSkuList=" + groupSkuList + + ", price=" + price + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupTeamVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupTeamVO.java new file mode 100644 index 0000000..7b96364 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/GroupTeamVO.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 拼团团队表VO + * + * @author YXF + * @date 2021-03-20 10:39:32 + */ +public class GroupTeamVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团团队id") + private Long groupTeamId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "拼团活动id") + private Long groupActivityId; + + @Schema(description = "活动商品Id") + private Long groupSpuId; + + @Schema(description = "已参团人数") + private Integer joinNum; + + @Schema(description = "拼团状态(0:待成团,1:拼团中,2:拼团成功,3:拼团失败)") + private Integer status; + + @Schema(description = "团队订单总额") + private Long totalPrice; + + @Schema(description = "开始时间(团长支付成功时间)") + private Date startTime; + + @Schema(description = "剩余时间") + private Date endTime; + + @Schema(description = "团长user_Id") + private Long shareUserId; + /** + * 已交易数量 + */ + @Schema(description = "团长user_Id") + private Integer spuCount; + /** + * 团购订单状态 + */ + private Integer groupOrderStatus; + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Long getGroupSpuId() { + return groupSpuId; + } + + public void setGroupSpuId(Long groupSpuId) { + this.groupSpuId = groupSpuId; + } + + public Integer getJoinNum() { + return joinNum; + } + + public void setJoinNum(Integer joinNum) { + this.joinNum = joinNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(Long totalPrice) { + this.totalPrice = totalPrice; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getShareUserId() { + return shareUserId; + } + + public void setShareUserId(Long shareUserId) { + this.shareUserId = shareUserId; + } + + public Integer getGroupOrderStatus() { + return groupOrderStatus; + } + + public void setGroupOrderStatus(Integer groupOrderStatus) { + this.groupOrderStatus = groupOrderStatus; + } + + @Override + public String toString() { + return "GroupTeamVO{" + + "groupTeamId=" + groupTeamId + + ", shopId=" + shopId + + ", groupActivityId=" + groupActivityId + + ", groupSpuId=" + groupSpuId + + ", joinNum=" + joinNum + + ", status=" + status + + ", totalPrice=" + totalPrice + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", shareUserId=" + shareUserId + + ", spuCount=" + spuCount + + ", groupOrderStatus=" + groupOrderStatus + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupTeamInfoVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupTeamInfoVO.java new file mode 100644 index 0000000..3bd6eea --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupTeamInfoVO.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.app; + +import com.tmerclub.cloud.group.vo.mongo.MongoAppGroupUserVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 拼团队伍详情 + * + * @author YXF + * @date 2021/3/30 + */ +public class AppGroupTeamInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团单信息") + private AppGroupTeamVO groupTeam; + + @Schema(description = "拼团活动商品信息") + private AppGroupActivityVO groupActivity; + + @Schema(description = "参团用户列表") + private List groupUserList; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "spu名称") + private String spuName; + + @Schema(description = "spu卖点") + private String sellingPoint; + + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "是否可以退款 1.可以 0.不可以") + private Integer isRefund; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public AppGroupActivityVO getGroupActivity() { + return groupActivity; + } + + public void setGroupActivity(AppGroupActivityVO groupActivity) { + this.groupActivity = groupActivity; + } + + public List getGroupUserList() { + return groupUserList; + } + + public void setGroupUserList(List groupUserList) { + this.groupUserList = groupUserList; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public AppGroupTeamVO getGroupTeam() { + return groupTeam; + } + + public void setGroupTeam(AppGroupTeamVO groupTeam) { + this.groupTeam = groupTeam; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + @Override + public String toString() { + return "AppGroupTeamInfoVO{" + + "groupTeam=" + groupTeam + + ", groupActivity=" + groupActivity + + ", groupUserList=" + groupUserList + + ", orderId=" + orderId + + ", spuName='" + spuName + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", priceFee=" + priceFee + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupTeamVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupTeamVO.java new file mode 100644 index 0000000..ffda279 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppGroupTeamVO.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.app; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author YXF + * @date 2021/3/26 + */ +public class AppGroupTeamVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "拼团团队id") + private Long groupTeamId; + + @Schema(description = "活动成团人数") + private Integer groupNumber; + + @Schema(description = "已参团人数") + private Integer joinNum; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "服务器当前时间") + private Date nowTime; + + @Schema(description = "团长user_Id") + private Long shareUserId; + + @Schema(description = "团长昵称") + private String shareNickName; + + @Schema(description = "团长头像") + private String sharePic; + + @Schema(description = "团订单状态(0:待成团,1:拼团中,2:拼团成功,3:拼团失败)") + private String status; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 拼团活动ID + */ + private Long groupActivityId; + + @Schema(description = "团购活动商品id") + private Long groupSpuId; + + public Long getGroupSpuId() { + return groupSpuId; + } + + public void setGroupSpuId(Long groupSpuId) { + this.groupSpuId = groupSpuId; + } + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Integer getGroupNumber() { + return groupNumber; + } + + public void setGroupNumber(Integer groupNumber) { + this.groupNumber = groupNumber; + } + + public Integer getJoinNum() { + return joinNum; + } + + public void setJoinNum(Integer joinNum) { + this.joinNum = joinNum; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getNowTime() { + return nowTime; + } + + public void setNowTime(Date nowTime) { + this.nowTime = nowTime; + } + + public Long getShareUserId() { + return shareUserId; + } + + public void setShareUserId(Long shareUserId) { + this.shareUserId = shareUserId; + } + + public String getShareNickName() { + return shareNickName; + } + + public void setShareNickName(String shareNickName) { + this.shareNickName = shareNickName; + } + + public String getSharePic() { + return sharePic; + } + + public void setSharePic(String sharePic) { + this.sharePic = sharePic; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + @Override + public String toString() { + return "AppGroupTeamVO{" + + "groupTeamId=" + groupTeamId + + ", groupNumber=" + groupNumber + + ", joinNum=" + joinNum + + ", endTime=" + endTime + + ", nowTime=" + nowTime + + ", shareUserId=" + shareUserId + + ", shareNickName='" + shareNickName + '\'' + + ", sharePic='" + sharePic + '\'' + + ", status='" + status + '\'' + + ", shopId=" + shopId + + ", groupActivityId=" + groupActivityId + + ", groupSpuId=" + groupSpuId + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppJoinGroupTeamVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppJoinGroupTeamVO.java new file mode 100644 index 0000000..e975e4d --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/app/AppJoinGroupTeamVO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.app; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author YXF + * @date 2021/3/26 + */ +public class AppJoinGroupTeamVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 当前用户参团的团队ID(null表示还没有参加该活动) + */ + private Long joinGroupTeamId; + /** + * 已交易数量 + */ + private Integer prodCount; + + public Long getJoinGroupTeamId() { + return joinGroupTeamId; + } + + public void setJoinGroupTeamId(Long joinGroupTeamId) { + this.joinGroupTeamId = joinGroupTeamId; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + @Override + public String toString() { + return "AppJoinGroupTeamVO{" + + "joinGroupTeamId=" + joinGroupTeamId + + ", prodCount=" + prodCount + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoAppGroupUserVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoAppGroupUserVO.java new file mode 100644 index 0000000..8ff0b21 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoAppGroupUserVO.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 拼团活动用户信息 + * @author YXF + */ +@Document("group_order") +public class MongoAppGroupUserVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户ID(当ID为0时标识为机器人)") + private Long userId; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "用户头像") + private String pic; + + @Schema(description = "用户类型(0:成员 1:团长)") + private Integer identityType; + + @Schema(description = "创建时间") + private Date createTime; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "MongoAppGroupUserVO{" + + "userId='" + userId + '\'' + + ", nickName='" + nickName + '\'' + + ", pic='" + pic + '\'' + + ", identityType=" + identityType + + ", createTime=" + createTime + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoGroupOrderCountVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoGroupOrderCountVO.java new file mode 100644 index 0000000..1231bf9 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoGroupOrderCountVO.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.group.vo.mongo; + +import org.springframework.data.mongodb.core.mapping.Document; + +/** + * @author TRACK + */ +@Document("group_order") +public class MongoGroupOrderCountVO { + + /** + * 订单数量 + */ + private Integer count; + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "MongoGroupOrderCountVO{" + + "count=" + count + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoGroupOrderVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoGroupOrderVO.java new file mode 100644 index 0000000..308d489 --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoGroupOrderVO.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.mongo; + +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.Date; + +/** + * Mongodb拼团订单表 + * @author TRACK + */ +@Document("group_order") +public class MongoGroupOrderVO { + /** + * 拼团订单id + */ + private Long groupOrderId; + + /** + * 拼团活动id + */ + private Long groupActivityId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 拼团团队id + */ + private Long groupTeamId; + + /** + * user_id(当user_id为0时标识为机器人) + */ + private Long userId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 身份标识(0:成员 1:团长) + */ + private Integer identityType; + + /** + * 活动商品金额 + */ + private Long activityProdPrice; + + /** + * 支付金额 + */ + private Long payPrice; + + /** + * 订单编号 + */ + private Long orderId; + + /** + * 状态(0:待支付、1:支付成功、-1:失效) + */ + private Integer status; + + /** + * 商品数量 + */ + private Integer count; + + public Long getGroupOrderId() { + return groupOrderId; + } + + public void setGroupOrderId(Long groupOrderId) { + this.groupOrderId = groupOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getGroupTeamId() { + return groupTeamId; + } + + public void setGroupTeamId(Long groupTeamId) { + this.groupTeamId = groupTeamId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public Long getActivityProdPrice() { + return activityProdPrice; + } + + public void setActivityProdPrice(Long activityProdPrice) { + this.activityProdPrice = activityProdPrice; + } + + public Long getPayPrice() { + return payPrice; + } + + public void setPayPrice(Long payPrice) { + this.payPrice = payPrice; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getGroupActivityId() { + return groupActivityId; + } + + public void setGroupActivityId(Long groupActivityId) { + this.groupActivityId = groupActivityId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "MongoGroupOrderVO{" + + "groupOrderId=" + groupOrderId + + ", groupActivityId=" + groupActivityId + + ", shopId=" + shopId + + ", groupTeamId=" + groupTeamId + + ", userId='" + userId + '\'' + + ", identityType=" + identityType + + ", activityProdPrice=" + activityProdPrice + + ", payPrice=" + payPrice + + ", orderId=" + orderId + + ", status=" + status + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoSuccessGroupOrderVO.java b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoSuccessGroupOrderVO.java new file mode 100644 index 0000000..54f731d --- /dev/null +++ b/tmerclub-group/src/main/java/com/tmerclub/cloud/group/vo/mongo/MongoSuccessGroupOrderVO.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.group.vo.mongo; + +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author FrozenWatermelon + */ +@Document("group_order") +public class MongoSuccessGroupOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long orderId; + + private Long userId; + private Long shopId; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "MongoSuccessGroupOrderVO{" + + "orderId=" + orderId + + ", userId=" + userId + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-group/src/main/resources/bootstrap.yml b/tmerclub-group/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..a9044a2 --- /dev/null +++ b/tmerclub-group/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9114} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9514} diff --git a/tmerclub-group/src/main/resources/logback.xml b/tmerclub-group/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-group/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-group/src/main/resources/mapper/GroupActivityMapper.xml b/tmerclub-group/src/main/resources/mapper/GroupActivityMapper.xml new file mode 100644 index 0000000..c2dbece --- /dev/null +++ b/tmerclub-group/src/main/resources/mapper/GroupActivityMapper.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `group_activity_id`, + `create_time`, + `update_time`, + `shop_id`, + `activity_name`, + `start_time`, + `end_time`, + `group_number`, + `has_max_num`, + `max_num`, + `has_robot`, + `is_preheat`, + `has_group_tip`, + `spu_id`, + `group_order_count`, + `group_number_count`, + `status`, + `price` + + + + + insert into group_activity (`shop_id`, `activity_name`, `start_time`, `end_time`, + `group_number`, `has_max_num`, `max_num`, `has_robot`, `is_preheat`, + `has_group_tip`, `spu_id`, `price`, `status`) + values (#{groupActivity.shopId}, #{groupActivity.activityName}, #{groupActivity.startTime}, + #{groupActivity.endTime}, #{groupActivity.groupNumber}, + #{groupActivity.hasMaxNum}, #{groupActivity.maxNum}, #{groupActivity.hasRobot}, + #{groupActivity.isPreheat}, #{groupActivity.hasGroupTip}, #{groupActivity.spuId}, + #{groupActivity.price}, #{groupActivity.status}); + + + update group_activity + + + `shop_id` = #{groupActivity.shopId}, + + + `activity_name` = #{groupActivity.activityName}, + + + `start_time` = #{groupActivity.startTime}, + + + `end_time` = #{groupActivity.endTime}, + + + `group_number` = #{groupActivity.groupNumber}, + + + `has_max_num` = #{groupActivity.hasMaxNum}, + + + `max_num` = #{groupActivity.maxNum}, + + + `price` = #{groupActivity.price}, + + + `has_robot` = #{groupActivity.hasRobot}, + + + `is_preheat` = #{groupActivity.isPreheat}, + + + `has_group_tip` = #{groupActivity.hasGroupTip}, + + + `spu_id` = #{groupActivity.spuId}, + + + `group_order_count` = #{groupActivity.groupOrderCount}, + + + `group_number_count` = #{groupActivity.groupNumberCount}, + + + `status` = #{groupActivity.status}, + + + where group_activity_id = #{groupActivity.groupActivityId} + + + + + + + + + + + UPDATE group_activity SET `status` = 4 WHERE group_activity_id IN + + #{groupActivity.groupActivityId} + + + + + UPDATE group_activity SET `status` = 4 WHERE spu_id IN + + #{spuId} + + + + + + UPDATE group_activity SET + group_order_count = #{orderCount}, + group_number_count = #{numberCount} + WHERE group_activity_id = #{groupActivityId} + + + + diff --git a/tmerclub-group/src/main/resources/mapper/GroupOrderMapper.xml b/tmerclub-group/src/main/resources/mapper/GroupOrderMapper.xml new file mode 100644 index 0000000..76fa902 --- /dev/null +++ b/tmerclub-group/src/main/resources/mapper/GroupOrderMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + `group_order_id`, + group_activity_id, + `create_time`, + `update_time`, + `shop_id`, + `group_team_id`, + `user_id`, + `identity_type`, + `activity_prod_price`, + `pay_price`, + `order_id`, + `status`, + `count` + + + diff --git a/tmerclub-group/src/main/resources/mapper/GroupSkuMapper.xml b/tmerclub-group/src/main/resources/mapper/GroupSkuMapper.xml new file mode 100644 index 0000000..96c7d40 --- /dev/null +++ b/tmerclub-group/src/main/resources/mapper/GroupSkuMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + `group_sku_id`,`group_activity_id`,`sku_id`,`act_price`,`sell_num` + + + + + insert into group_sku (`group_activity_id`,`sku_id`,`act_price`,`sell_num`) + values (#{groupSku.groupActivityId},#{groupSku.skuId},#{groupSku.actPrice},#{groupSku.sellNum}); + + + update group_sku + + + `act_price` = #{groupSku.actPrice}, + + + where group_sku_id = #{groupSku.groupSkuId} + + + delete from group_sku where group_sku_id = #{groupSkuId} + + + + insert into group_sku (`group_activity_id`,`sku_id`,`act_price`) values + + (#{groupSku.groupActivityId},#{groupSku.skuId},#{groupSku.actPrice}) + + + + + delete from group_sku where group_activity_id = #{groupActivityId} + + + + + update group_sku + + + `act_price` = #{groupSku.actPrice}, + + + where group_activity_id = #{groupSku.groupActivityId} and sku_id = #{groupSku.skuId}; + + + + + + + diff --git a/tmerclub-im/pom.xml b/tmerclub-im/pom.xml new file mode 100644 index 0000000..1aa3809 --- /dev/null +++ b/tmerclub-im/pom.xml @@ -0,0 +1,66 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-im + jar + + tmerclub 即时通讯模块 + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + org.springframework.boot + spring-boot-starter-websocket + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-flow + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-im + ${project.version} + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/ImApplication.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/ImApplication.java new file mode 100644 index 0000000..acf0ad9 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/ImApplication.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im; + +import com.tmerclub.cloud.im.socket.app.UserOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.app.UserWebSocketServer; +import com.tmerclub.cloud.im.socket.multishop.ShopOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.multishop.ShopWebSocketServer; +import com.tmerclub.cloud.im.socket.platform.SysOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.platform.SysWebSocketServer; +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * @author FrozenWatermelon + * @date 2020/6/24 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class ImApplication extends SpringBootServletInitializer { + + public static void main(String[] args) { + ConfigurableApplicationContext applicationContext = SpringApplication.run(ImApplication.class, args); + UserWebSocketServer.setApplicationContext(applicationContext); + ShopWebSocketServer.setApplicationContext(applicationContext); + SysWebSocketServer.setApplicationContext(applicationContext); + UserOnlineWebSocketServer.setApplicationContext(applicationContext); + ShopOnlineWebSocketServer.setApplicationContext(applicationContext); + SysOnlineWebSocketServer.setApplicationContext(applicationContext); + SysOnlineWebSocketServer.setApplicationContext(applicationContext); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(ImApplication.class); + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/config/WebSocketConfig.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/config/WebSocketConfig.java new file mode 100644 index 0000000..af7e8b2 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/config/WebSocketConfig.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * WebSocket配置 + * + * @author Lzk + */ +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/Constant.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/Constant.java new file mode 100644 index 0000000..2bfac35 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/Constant.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.constants; + +/** + * @author Lzk + */ +public class Constant { + + public static final String USER_PREFIX = "USER_"; + + public static final String ONLINE_USER_PREFIX = "ONLINE_USER_"; + + public static final String SYS_PREFIX = "SYS_"; + + public static final String ONLINE_SYS_PREFIX = "ONLINE_SYS_"; + + /** + * 客服在线Map + * key格式: SHOP_EMPLOYEE_店铺id_客服id, 如果一个客服账号多次登录的情况,由于没有存储token,所以无法定位到正在连接的具体页面 + * 由于key中包含token,所以一个客服账号多次登录,会有多个key存在 + * 功能:用户端判断客服是否在线、商家端页面中关联新用户消息图标 + */ + public static final String SHOP_EMPLOYEE_PREFIX = "SHOP_EMPLOYEE_"; + + /** + * 客服在线Map + * key格式: ONLINE_SHOP_EMPLOYEE_店铺id_客服id_token,可准确定位到具体的客服连接, + * 由于key中包含token,所以一个客服账号多次登录,会有多个key存在 + * 功能:用户端判断客服是否在线、商家端页面中关联新用户消息图标 + */ + public static final String ONLINE_SHOP_EMPLOYEE_PREFIX = "ONLINE_SHOP_EMPLOYEE_"; + + /** + * 店铺客服关联用户Map + * key格式: IN_CHARGE_SHOP_店铺id_用户id value: test + 客服id, 可以通过用户和店铺id,获取负责该用户的客服id + * 功能:将用户的消息发送给指定客服 + */ + public static final String IN_CHARGE_SHOP = "IN_CHARGE_SHOP_"; + + public static final String IN_CHARGE_SYS = "IN_CHARGE_SYS_"; + + public static final String UNDERLINE = "_"; + + public static final String HEART_BEAT = "HEART_BEAT"; + + public static final String UNREAD_MESSAGE = "UNREAD_MESSAGE"; + + public static final String BRACE_LEFT = "{"; + + public static final String BRACE_RIGHT = "}"; + + public static final String IM = ".im"; + + public static final String UNREAD_SYS_PREFIX = "UNREAD_SYS_PREFIX_"; + + public static final String UNREAD_SHOP_PREFIX = "UNREAD_SHOP_PREFIX_"; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgRead.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgRead.java new file mode 100644 index 0000000..8381491 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgRead.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.constants; + +/** + * @author Lzk + */ +public class MsgRead { + + /** + * 未读 + */ + public static final int UNREAD = 0; + + /** + * 已读 + */ + public static final int READ = 1; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgType.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgType.java new file mode 100644 index 0000000..3861010 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/MsgType.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.constants; + +/** + * @author Lzk + */ +public class MsgType { + + public static final int TEXT = 0; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/SendType.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/SendType.java new file mode 100644 index 0000000..ada2094 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/constants/SendType.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.constants; + +/** + * @author Lzk + */ +public class SendType { + + public static final int PLATFORM = 1; + + public static final int SHOP = 2; + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/app/UserController.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/app/UserController.java new file mode 100644 index 0000000..a46d5d4 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/app/UserController.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.controller.app; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.api.product.feign.SpuBrowseLogFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.model.ImMsgBizUser; +import com.tmerclub.cloud.im.service.ImMsgBizUserService; +import com.tmerclub.cloud.im.socket.multishop.ShopOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.platform.SysOnlineWebSocketServer; +import com.tmerclub.cloud.im.vo.ConversationVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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 java.time.ZoneId; +import java.time.ZoneOffset; +import java.util.*; + +/** + * @author Lzk + */ +@RestController +@RequestMapping("/im") +@Tag(name = "用户聊天接口") +public class UserController { + + @Autowired + private ImMsgBizUserService imMsgBizUserService; + @DubboReference + private SysUserFeignClient sysUserFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SpuBrowseLogFeignClient spuBrowseLogFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + + @PostMapping("/conversations") + @Operation(summary = "最后的对话信息列表项", description = "获取最后的对话信息列表项") + public ResponseEntity> conversations(PageDTO pageDTO) { + Long userId = AuthUserContext.get().getUserId(); + PageVO imMsgBizUserPage = imMsgBizUserService.pageByUserId(pageDTO, userId); + List imMsgBizUserList = imMsgBizUserPage.getList(); + List conversationList = new ArrayList<>(com.tmerclub.cloud.common.constant.Constant.INITIAL_CAPACITY); + for (ImMsgBizUser imMsgBizUser : imMsgBizUserList) { + ConversationVO conversation = new ConversationVO(); + conversation.setChatType(imMsgBizUser.getSendType()); + conversation.setShopId(imMsgBizUser.getBizId()); + conversation.setUserId(imMsgBizUser.getUserId()); + conversation.setLatestMsg(imMsgBizUser.getLastMsgContent()); + conversation.setUnread(imMsgBizUser.getUserUnreadNum()); + // todo 东8区,不应该写死"+8"后续优化 + conversation.setTimestamp(imMsgBizUser.getLastMsgTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()); + conversation.setTimeStr(DateUtil.format(Date.from(imMsgBizUser.getLastMsgTime().atZone(ZoneId.systemDefault()).toInstant()), "yyyy/MM/dd")); + conversation.setLatestMsgTime(imMsgBizUser.getLastMsgTime()); + conversation.setType(imMsgBizUser.getLastMsgType()); + conversation.setEmployeeId(imMsgBizUser.getEmployeeId()); + if (Objects.equals(imMsgBizUser.getSendType(), SendType.PLATFORM)) { + ServerResponseEntity sysUserResponse = sysUserFeignClient.getSysUserByUserId(imMsgBizUser.getEmployeeId()); + if (!sysUserResponse.isSuccess()) { + throw new LuckException(sysUserResponse.getMsg()); + } + SysUserVO sysUser = sysUserResponse.getData(); + if (sysUser != null) { + conversation.setFriendName(sysUser.getNickName()); + } + } else if (Objects.equals(imMsgBizUser.getSendType(), SendType.SHOP)) { + ServerResponseEntity shopResponse = shopDetailFeignClient.getShopByShopId(imMsgBizUser.getBizId()); + if (!shopResponse.isSuccess()) { + throw new LuckException(shopResponse.getMsg()); + } + EsShopDetailBO shopDetail = shopResponse.getData(); + if (shopDetail != null && shopDetail.getShopStatus() != null) { + conversation.setPic(shopDetail.getShopLogo()); + conversation.setFriendName(shopDetail.getShopName()); + conversation.setShopStatus(shopDetail.getShopStatus()); + } + } + if (Objects.equals(conversation.getChatType(), SendType.SHOP)) { + Boolean isExist = MapUtil.isExistKeyPrefix(ShopOnlineWebSocketServer.SHOP_ONLINE_EMPLOYEE_MAP, Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + conversation.getShopId() + Constant.UNDERLINE); + conversation.setIsOnline(isExist); + } else if (Objects.equals(conversation.getChatType(), SendType.PLATFORM)) { + Boolean isExist = MapUtil.isExistKeyPrefix(SysOnlineWebSocketServer.SYS_ONLINE_MAP, Constant.ONLINE_SYS_PREFIX); + conversation.setIsOnline(isExist); + } + conversationList.add(conversation); + } + PageVO conversationPage = new PageVO<>(); + BeanUtils.copyProperties(imMsgBizUserPage, conversationPage); + conversationPage.setList(conversationList); + return ResponseEntity.ok(conversationPage); + } + + @GetMapping("/recentBrowse") + @Operation(summary = "最近浏览的商品", description = "获取最近浏览的商品") + public ResponseEntity> recentBrowse(Long shopId) { + Long userId = AuthUserContext.get().getUserId(); + ServerResponseEntity> serverResponseEntity = spuBrowseLogFeignClient.recentBrowse(userId, shopId); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + List spuIds = serverResponseEntity.getData(); + if (CollectionUtil.isEmpty(spuIds)) { + return ResponseEntity.ok(Collections.emptyList()); + } + ServerResponseEntity> spuResponse = spuFeignClient.listSpuBySpuIds(spuIds); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + List spuVOList = spuResponse.getData(); + return ResponseEntity.ok(spuVOList); + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/multishop/ShopController.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/multishop/ShopController.java new file mode 100644 index 0000000..14b5b8f --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/multishop/ShopController.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.controller.multishop; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.model.ImMsgBizEmployeeRecent; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizEmployeeRecentService; +import com.tmerclub.cloud.im.service.ImMsgBizUserHistoryService; +import com.tmerclub.cloud.im.service.ImMsgBizUserService; +import com.tmerclub.cloud.im.socket.app.UserOnlineWebSocketServer; +import com.tmerclub.cloud.im.vo.ConversationVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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 java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author Lzk + */ +@RestController +@RequestMapping("/m/im") +@Tag(name = "店铺聊天接口") +public class ShopController { + + @Autowired + private ImMsgBizEmployeeRecentService imMsgBizEmployeeRecentService; + @Autowired + private ImMsgBizUserHistoryService imMsgBizUserHistoryService; + @Autowired + private ImMsgBizUserService imMsgBizUserService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + + @PostMapping("/conversations") + @Operation(summary = "最后的对话信息列表项", description = "获取最后的对话信息列表项") + public ResponseEntity> conversations(PageDTO pageDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + PageVO imMsgBizEmployeeRecentPage = imMsgBizEmployeeRecentService.pageBySendTypeAndBizIdAndEmployeeId(pageDTO, SendType.SHOP, uidInfoBO.getTenantId(), uidInfoBO.getUserId()); + List imMsgBizEmployeeRecentList = imMsgBizEmployeeRecentPage.getList(); + List conversationList = new ArrayList<>(com.tmerclub.cloud.common.constant.Constant.INITIAL_CAPACITY); + for (ImMsgBizEmployeeRecent imMsgBizEmployeeRecent : imMsgBizEmployeeRecentList) { + ServerResponseEntity shopResponse = shopDetailFeignClient.getShopByShopId(imMsgBizEmployeeRecent.getBizId()); + if (!shopResponse.isSuccess()) { + throw new LuckException(shopResponse.getMsg()); + } + EsShopDetailBO shopDetail = shopResponse.getData(); + if (shopDetail != null && shopDetail.getShopStatus() != null) { + ImMsgBizUserHistory imMsgBizUserHistoryParam = new ImMsgBizUserHistory(); + imMsgBizUserHistoryParam.setSendType(SendType.SHOP); + imMsgBizUserHistoryParam.setUserId(imMsgBizEmployeeRecent.getUserId()); + imMsgBizUserHistoryParam.setBizId(imMsgBizEmployeeRecent.getBizId()); + imMsgBizUserHistoryParam.setEmployeeId(imMsgBizEmployeeRecent.getEmployeeId()); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.getByParam(imMsgBizUserHistoryParam); + if (Objects.isNull(imMsgBizUserHistory)) { + continue; + } + ConversationVO conversation = new ConversationVO(); + conversation.setChatType(imMsgBizUserHistory.getSendType()); + conversation.setUserId(imMsgBizEmployeeRecent.getUserId()); + conversation.setShopId(imMsgBizEmployeeRecent.getBizId()); + conversation.setLatestMsg(imMsgBizUserHistory.getContent()); + conversation.setUnread(imMsgBizEmployeeRecent.getEmployeeUnreadNum()); + // todo 东8区,不应该写死"+8"后续优化 + conversation.setTimeStr(DateUtil.format(Date.from(imMsgBizUserHistory.getCreateTime().toInstant()), "yyyy/MM/dd")); + conversation.setTimestamp(imMsgBizUserHistory.getCreateTime().toInstant().toEpochMilli()); + conversation.setLatestMsgTime(LocalDateTime.ofInstant(imMsgBizUserHistory.getCreateTime().toInstant(), ZoneId.systemDefault())); + conversation.setType(imMsgBizUserHistory.getType()); + conversation.setEmployeeId(imMsgBizUserHistory.getEmployeeId()); + conversation.setShopStatus(shopDetail.getShopStatus()); + ServerResponseEntity userResponse = userFeignClient.getInsiderUserData(imMsgBizEmployeeRecent.getUserId()); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + UserApiVO user = userResponse.getData(); + if (Objects.nonNull(user)) { + conversation.setFriendName(user.getNickName()); + conversation.setPic(user.getPic()); + } else { + conversation.setFriendName("*用户已注销*"); + } + Boolean isExist = MapUtil.isExistKeyPrefix(UserOnlineWebSocketServer.USER_ONLINE_MAP, Constant.ONLINE_USER_PREFIX + conversation.getUserId() + Constant.UNDERLINE); + conversation.setIsOnline(isExist); + conversationList.add(conversation); + } + } + PageVO conversationPage = new PageVO<>(); + BeanUtils.copyProperties(imMsgBizEmployeeRecentPage, conversationPage); + conversationPage.setList(conversationList); + return ResponseEntity.ok(conversationPage); + } + + @GetMapping("/userInfo") + @Operation(summary = "获取用户信息", description = "获取用户信息") + public ResponseEntity> userInfo(Long userId) { + List conversations = new ArrayList<>(com.tmerclub.cloud.common.constant.Constant.INITIAL_CAPACITY); + ServerResponseEntity userResponse = userFeignClient.getInsiderUserData(userId); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + UserApiVO user = userResponse.getData(); + if (Objects.nonNull(user)) { + ConversationVO conversation = new ConversationVO(); + conversation.setUserId(userId); + conversation.setPic(user.getPic()); + conversation.setFriendName(user.getNickName()); + conversations.add(conversation); + } + return ResponseEntity.ok(conversations); + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/platform/SysController.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/platform/SysController.java new file mode 100644 index 0000000..1c98af4 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/controller/platform/SysController.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.controller.platform; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.model.ImMsgBizEmployeeRecent; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizEmployeeRecentService; +import com.tmerclub.cloud.im.service.ImMsgBizUserHistoryService; +import com.tmerclub.cloud.im.socket.app.UserOnlineWebSocketServer; +import com.tmerclub.cloud.im.vo.ConversationVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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 java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author Lzk + */ +@RestController +@RequestMapping("/p/im") +@Tag(name = "平台聊天接口") +public class SysController { + @Autowired + private ImMsgBizEmployeeRecentService imMsgBizEmployeeRecentService; + + @Autowired + private ImMsgBizUserHistoryService imMsgBizUserHistoryService; + @DubboReference + private UserFeignClient userFeignClient; + + @PostMapping("/conversations") + @Operation(summary = "最后的对话信息列表项", description = "获取最后的对话信息列表项") + public ResponseEntity> conversations(PageDTO pageDTO) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + PageVO imMsgBizEmployeeRecentPage = imMsgBizEmployeeRecentService.pageBySendTypeAndBizIdAndEmployeeId(pageDTO, SendType.PLATFORM, uidInfoBO.getTenantId(), uidInfoBO.getUserId()); + List imMsgBizEmployeeRecentList = imMsgBizEmployeeRecentPage.getList(); + List conversationList = new ArrayList<>(com.tmerclub.cloud.common.constant.Constant.INITIAL_CAPACITY); + for (ImMsgBizEmployeeRecent imMsgBizEmployeeRecent : imMsgBizEmployeeRecentList) { + ImMsgBizUserHistory imMsgBizUserHistoryParam = new ImMsgBizUserHistory(); + imMsgBizUserHistoryParam.setSendType(SendType.PLATFORM); + imMsgBizUserHistoryParam.setBizId(imMsgBizEmployeeRecent.getBizId()); + imMsgBizUserHistoryParam.setEmployeeId(imMsgBizEmployeeRecent.getEmployeeId()); + imMsgBizUserHistoryParam.setUserId(imMsgBizEmployeeRecent.getUserId()); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.getByParam(imMsgBizUserHistoryParam); + ConversationVO conversation = new ConversationVO(); + conversation.setChatType(imMsgBizUserHistory.getSendType()); + conversation.setShopId(imMsgBizEmployeeRecent.getBizId()); + conversation.setUserId(imMsgBizEmployeeRecent.getUserId()); + conversation.setLatestMsg(imMsgBizUserHistory.getContent()); + conversation.setUnread(imMsgBizEmployeeRecent.getEmployeeUnreadNum()); + // todo 东8区,不应该写死"+8"后续优化 + conversation.setTimestamp(imMsgBizUserHistory.getCreateTime().toInstant().toEpochMilli()); + conversation.setTimeStr(DateUtil.format(Date.from(imMsgBizUserHistory.getCreateTime().toInstant()), "yyyy/MM/dd")); + conversation.setLatestMsgTime(LocalDateTime.ofInstant(imMsgBizUserHistory.getCreateTime().toInstant(), ZoneId.systemDefault())); + conversation.setType(imMsgBizUserHistory.getType()); + conversation.setEmployeeId(imMsgBizUserHistory.getEmployeeId()); + UserApiVO user = getUserApiVO(imMsgBizEmployeeRecent.getUserId()); + if (Objects.nonNull(user)) { + conversation.setPic(user.getPic()); + conversation.setFriendName(user.getNickName()); + } else { + conversation.setFriendName("*用户已注销*"); + } + Boolean isExist = MapUtil.isExistKeyPrefix(UserOnlineWebSocketServer.USER_ONLINE_MAP, Constant.ONLINE_USER_PREFIX + conversation.getUserId() + Constant.UNDERLINE); + conversation.setIsOnline(isExist); + conversationList.add(conversation); + } + + PageVO conversationPage = new PageVO<>(); + BeanUtils.copyProperties(imMsgBizEmployeeRecentPage, conversationPage); + conversationPage.setList(conversationList); + return ResponseEntity.ok(conversationPage); + } + + @GetMapping("/userInfo") + @Operation(summary = "获取用户信息", description = "获取用户信息") + public ResponseEntity> userInfo(Long userId) { + List conversations = new ArrayList<>(com.tmerclub.cloud.common.constant.Constant.INITIAL_CAPACITY); + UserApiVO user = getUserApiVO(userId); + if (Objects.nonNull(user)) { + ConversationVO conversation = new ConversationVO(); + conversation.setUserId(userId); + conversation.setFriendName(user.getNickName()); + conversation.setPic(user.getPic()); + conversations.add(conversation); + } + return ResponseEntity.ok(conversations); + } + + private UserApiVO getUserApiVO(Long userId) { + ServerResponseEntity userApiResponse = userFeignClient.getInsiderUserData(userId); + if (!userApiResponse.isSuccess()) { + throw new LuckException(userApiResponse.getMsg()); + } + return userApiResponse.getData(); + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/dto/ImMsgBizSkillsDTO.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/dto/ImMsgBizSkillsDTO.java new file mode 100644 index 0000000..c489751 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/dto/ImMsgBizSkillsDTO.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.dto; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 客服自动回复表VO + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +public class ImMsgBizSkillsDTO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "客服自动回复id") + private Long id; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "关键字") + private String keywords; + + @Schema(description = "回复内容") + private String content; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "备注") + private String remark; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getKeywords() { + return keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "ImMsgBizSkillsVO{" + + "id=" + id + + ",shopId=" + shopId + + ",keywords=" + keywords + + ",content=" + content + + ",status=" + status + + ",remark=" + remark + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizEmployeeRecentMapper.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizEmployeeRecentMapper.java new file mode 100644 index 0000000..a18aa2d --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizEmployeeRecentMapper.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.mapper; + +import com.tmerclub.cloud.im.model.ImMsgBizEmployeeRecent; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 员工最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public interface ImMsgBizEmployeeRecentMapper { + + /** + * 获取员工最近聊天记录表列表 + * @param sendType 分页参数 + * @param bizId 平台或商家id + * @param employeeId 平台或商家的员工id + * @return 员工最近聊天记录表列表 + */ + List listBySendTypeAndBizIdAndEmployeeId(@Param("sendType") Integer sendType, @Param("bizId") Long bizId, @Param("employeeId") Long employeeId); + + /** + * 根据员工最近聊天记录表id获取员工最近聊天记录表 + * + * @param id 员工最近聊天记录表id + * @return 员工最近聊天记录表 + */ + ImMsgBizEmployeeRecent getById(@Param("id") Long id); + + /** + * 获取员工最近聊天记录表列表 + * @param sendType 分页参数 + * @param bizId 平台或商家id + * @param employeeId 平台或商家的员工id + * @param userId 用户id + * @return 员工最近聊天记录表列表 + */ + ImMsgBizEmployeeRecent getBySendTypeBizIdEmployeeIdUserId(@Param("sendType") Integer sendType, @Param("bizId") Long bizId, @Param("employeeId") Long employeeId, @Param("userId") Long userId); + + /** + * 保存员工最近聊天记录表 + * @param imMsgBizEmployeeRecent 员工最近聊天记录表 + */ + void save(@Param("imMsgBizEmployeeRecent") ImMsgBizEmployeeRecent imMsgBizEmployeeRecent); + + /** + * 更新员工最近聊天记录表 + * @param imMsgBizEmployeeRecent 员工最近聊天记录表 + */ + void update(@Param("imMsgBizEmployeeRecent") ImMsgBizEmployeeRecent imMsgBizEmployeeRecent); + + /** + * 根据员工最近聊天记录表id删除员工最近聊天记录表 + * @param id 消息id + */ + void deleteById(@Param("id") Long id); + + /** + * 更新客服未读条数 + * @param sendType + * @param id + * @param shopId + * @param employeeId + * @param userId + */ + void updateEmployeeUnreadMsgNum(@Param("sendType") Integer sendType, @Param("id") Long id, @Param("shopId") Long shopId, @Param("employeeId") Long employeeId, @Param("userId") Long userId); +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizSkillsMapper.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizSkillsMapper.java new file mode 100644 index 0000000..55ce16a --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizSkillsMapper.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.mapper; + +import com.tmerclub.cloud.im.dto.ImMsgBizSkillsDTO; +import com.tmerclub.cloud.im.vo.ImMsgBizSkillsVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 客服自动回复表 + * + * @author FrozenWatermelon + * @date 2023-03-23 17:43:40 + */ +public interface ImMsgBizSkillsMapper { + + /** + * 获取客服自动回复表列表 + * @param imMsgBizSkillsDTO + * @param shopId + * @return + */ + List list(@Param("imMsgBizSkills") ImMsgBizSkillsDTO imMsgBizSkillsDTO, @Param("shopId") Long shopId); + + /** + * 根据客服自动回复表id获取客服自动回复表 + * + * @param id 客服自动回复表id + * @return 客服自动回复表 + */ + ImMsgBizSkillsVO getById(@Param("id") Long id); + + /** + * 保存客服自动回复表 + * + * @param imMsgBizSkills 客服自动回复表 + */ + void save(@Param("imMsgBizSkills") ImMsgBizSkillsVO imMsgBizSkills); + + /** + * 更新客服自动回复表 + * + * @param imMsgBizSkills 客服自动回复表 + */ + void update(@Param("imMsgBizSkills") ImMsgBizSkillsVO imMsgBizSkills); + + /** + * 根据客服自动回复表id软删除客服自动回复表 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 根据店铺id和关键字获取获取数据 + * @param shopId + * @param keywords + * @return + */ + ImMsgBizSkillsVO selectByShopIdAndKey(@Param("shopId") Long shopId, @Param("keywords") String keywords); + + /** + * 根据店铺id获取所有自定义的回复数据 + * + * @param shopId + * @return + */ + List getByShopId(@Param("shopId") Long shopId); +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizUserHistoryMapper.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizUserHistoryMapper.java new file mode 100644 index 0000000..e87d72c --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/mapper/ImMsgBizUserHistoryMapper.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.mapper; + +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 店铺和用户历史聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public interface ImMsgBizUserHistoryMapper { + + /** + * 获取店铺和用户历史聊天记录表列表 + * @param sendType 发送类型 + * @param bizId 平台或商家id + * @param employeeId 员工id + * @param userId 用户id + * @return 店铺和用户历史聊天记录表列表 + */ + List listBySendTypeBizIdUserId(@Param("sendType") Integer sendType, @Param("bizId") Long bizId, @Param("employeeId") Long employeeId, @Param("userId") Long userId); + + /** + * 获取某个用户和店铺的所有的聊天记录(转接客服后共享聊天记录) + * @param sendType + * @param bizId + * @param userId + * @return + */ + List getHistoryByUserId(@Param("sendType") Integer sendType, @Param("bizId") Long bizId, @Param("userId") Long userId); + + /** + * 根据店铺和用户历史聊天记录表id获取店铺和用户历史聊天记录表 + * + * @param id 店铺和用户历史聊天记录表id + * @return 店铺和用户历史聊天记录表 + */ + ImMsgBizUserHistory getById(@Param("id") Long id); + + /** + * 根据店铺和用户历史聊天记录表参数获取店铺和用户历史聊天记录表 + * + * @param imMsgBizUserHistory 店铺和用户历史聊天记录参数 + * @return 店铺和用户历史聊天记录表 + */ + ImMsgBizUserHistory getByParam(@Param("imMsgBizUserHistory") ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 保存店铺和用户历史聊天记录表 + * @param imMsgBizUserHistory 店铺和用户历史聊天记录表 + */ + void save(@Param("imMsgBizUserHistory") ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 更新店铺和用户历史聊天记录表 + * @param imMsgBizUserHistory 店铺和用户历史聊天记录表 + */ + void update(@Param("imMsgBizUserHistory") ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 根据店铺和用户历史聊天记录表id删除店铺和用户历史聊天记录表 + * @param id 消息id + */ + void deleteById(@Param("id") Long id); + + /** + * 获取用户该店铺所有的未读消息 + * @param imMsgBizUserId 聊天对象id + * @param userId 用户id + * @return 未读消息列表 + */ + List getUnreadHistoryByUserId(@Param("imMsgBizUserId") Long imMsgBizUserId, @Param("userId") Long userId); + + /** + * 更新该用户所有的店铺未读消息,变更为已读(用户端) + * @param imMsgBizUserId 聊天对象id + * @param userId 用户id + * @return 变更数量 + */ + int updateUnreadHistoryByUserId(@Param("imMsgBizUserId") Long imMsgBizUserId, @Param("userId") Long userId); + + /** + * 更新该店铺所有的未读用户消息,变更为已读(平台、商家端) + * + * @param id + * @param userId + * @return + */ + int updateUnreadHistoryByShopId(@Param("id") Long id, @Param("userId") Long userId); +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizEmployeeRecent.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizEmployeeRecent.java new file mode 100644 index 0000000..6565337 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizEmployeeRecent.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 员工最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public class ImMsgBizEmployeeRecent extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 自增主键 + */ + private Long id; + + /** + * 发送类型1平台2商家 + */ + private Integer sendType; + + /** + * 平台或商家id + */ + private Long bizId; + + /** + * 用户id + */ + private Long userId; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 员工未读条数 + */ + private Integer employeeUnreadNum; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getEmployeeUnreadNum() { + return employeeUnreadNum; + } + + public void setEmployeeUnreadNum(Integer employeeUnreadNum) { + this.employeeUnreadNum = employeeUnreadNum; + } + + @Override + public String toString() { + return "ImMsgBizEmployeeRecent{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",sendType=" + sendType + + ",bizId=" + bizId + + ",userId=" + userId + + ",employeeId=" + employeeId + + ",employeeUnreadNum=" + employeeUnreadNum + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizUser.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizUser.java new file mode 100644 index 0000000..6728999 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizUser.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 用户最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public class ImMsgBizUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 自增主键 + */ + private Long id; + + /** + * 发送类型1平台2商家 + */ + private Integer sendType; + + /** + * 平台或商家id + */ + private Long bizId; + + /** + * 用户id + */ + private Long userId; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 平台或商家未读条数 + */ + private Integer bizUnreadNum; + + /** + * 用户未读条数 + */ + private Integer userUnreadNum; + + /** + * 最后一条消息id + */ + private Long lastMsgId; + + /** + * 最后一条消息类型,0文字1商品信息2图片 + */ + private Integer lastMsgType; + + /** + * 最后一条消息内容 + */ + private String lastMsgContent; + + /** + * 最后一条消息谁发的0系统1员工2用户 + */ + private Integer lastMsgWhoSend; + + /** + * 最后一条消息时间 + */ + private LocalDateTime lastMsgTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getBizUnreadNum() { + return bizUnreadNum; + } + + public void setBizUnreadNum(Integer bizUnreadNum) { + this.bizUnreadNum = bizUnreadNum; + } + + public Integer getUserUnreadNum() { + return userUnreadNum; + } + + public void setUserUnreadNum(Integer userUnreadNum) { + this.userUnreadNum = userUnreadNum; + } + + public Long getLastMsgId() { + return lastMsgId; + } + + public void setLastMsgId(Long lastMsgId) { + this.lastMsgId = lastMsgId; + } + + public Integer getLastMsgType() { + return lastMsgType; + } + + public void setLastMsgType(Integer lastMsgType) { + this.lastMsgType = lastMsgType; + } + + public String getLastMsgContent() { + return lastMsgContent; + } + + public void setLastMsgContent(String lastMsgContent) { + this.lastMsgContent = lastMsgContent; + } + + public Integer getLastMsgWhoSend() { + return lastMsgWhoSend; + } + + public void setLastMsgWhoSend(Integer lastMsgWhoSend) { + this.lastMsgWhoSend = lastMsgWhoSend; + } + + public LocalDateTime getLastMsgTime() { + return lastMsgTime; + } + + public void setLastMsgTime(LocalDateTime lastMsgTime) { + this.lastMsgTime = lastMsgTime; + } + + @Override + public String toString() { + return "ImMsgBizUser{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",sendType=" + sendType + + ",bizId=" + bizId + + ",userId=" + userId + + ",employeeId=" + employeeId + + ",bizUnreadNum=" + bizUnreadNum + + ",userUnreadNum=" + userUnreadNum + + ",lastMsgId=" + lastMsgId + + ",lastMsgType=" + lastMsgType + + ",lastMsgContent=" + lastMsgContent + + ",lastMsgWhoSend=" + lastMsgWhoSend + + ",lastMsgTime=" + lastMsgTime + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizUserHistory.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizUserHistory.java new file mode 100644 index 0000000..62a0815 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/model/ImMsgBizUserHistory.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 店铺和用户历史聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public class ImMsgBizUserHistory extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 自增主键 + */ + private Long id; + + /** + * 聊天对象id + */ + private Long imMsgBizUserId; + + /** + * 发送类型1平台2商家 + */ + private Integer sendType; + + /** + * 平台或商家id + */ + private Long bizId; + + /** + * 用户id + */ + private Long userId; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 消息类型,0文字1商品信息2图片 + */ + private Integer type; + + /** + * 消息内容 + */ + private String content; + + /** + * 消息谁发的0系统1员工2用户 + */ + private Integer whoSend; + + /** + * 用户是否已读 + */ + private Integer userUnread; + + /** + * 员工是否已读 + */ + private Integer employeeUnread; + + /** + * 消息可见范围:0.所有人可见 1.仅自己可见 + */ + private Integer readRange; + + /** + * 客服昵称 + */ + private String nickName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getImMsgBizUserId() { + return imMsgBizUserId; + } + + public void setImMsgBizUserId(Long imMsgBizUserId) { + this.imMsgBizUserId = imMsgBizUserId; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getWhoSend() { + return whoSend; + } + + public void setWhoSend(Integer whoSend) { + this.whoSend = whoSend; + } + + public Integer getUserUnread() { + return userUnread; + } + + public void setUserUnread(Integer userUnread) { + this.userUnread = userUnread; + } + + public Integer getEmployeeUnread() { + return employeeUnread; + } + + public void setEmployeeUnread(Integer employeeUnread) { + this.employeeUnread = employeeUnread; + } + + public Integer getReadRange() { + return readRange; + } + + public void setReadRange(Integer readRange) { + this.readRange = readRange; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Override + public String toString() { + return "ImMsgBizUserHistory{" + + "id=" + id + + ", imMsgBizUserId=" + imMsgBizUserId + + ", sendType=" + sendType + + ", bizId=" + bizId + + ", userId=" + userId + + ", employeeId=" + employeeId + + ", type=" + type + + ", content='" + content + '\'' + + ", whoSend=" + whoSend + + ", userUnread=" + userUnread + + ", employeeUnread=" + employeeUnread + + ", readRange=" + readRange + + ", nickName='" + nickName + '\'' + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizUserService.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizUserService.java new file mode 100644 index 0000000..53e0397 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/ImMsgBizUserService.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.im.model.ImMsgBizUser; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; + +/** + * 用户最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +public interface ImMsgBizUserService { + + /** + * 分页获取用户最近聊天记录表列表 + * @param pageDTO 分页参数 + * @param userId 用户id + * @return 用户最近聊天记录表列表分页数据 + */ + PageVO pageByUserId(PageDTO pageDTO, Long userId); + + /** + * 根据用户最近聊天记录表id获取用户最近聊天记录表 + * + * @param id 用户最近聊天记录表id + * @return 用户最近聊天记录表 + */ + ImMsgBizUser getById(Long id); + + /** + * 根据用户最近聊天记录表id获取用户最近聊天记录表 + * + * @param sendType 发送类型 + * @param bizId 商家或平台id + * @param userId 用户id + * @return 用户最近聊天记录表 + */ + ImMsgBizUser getBySendTypeBizIdUserId(Integer sendType, Long bizId, Long userId); + + /** + * 保存用户最近聊天记录表 + * @param imMsgBizUser 用户最近聊天记录表 + */ + void save(ImMsgBizUser imMsgBizUser); + + /** + * 更新用户最近聊天记录表 + * @param imMsgBizUser 用户最近聊天记录表 + */ + void update(ImMsgBizUser imMsgBizUser); + + /** + * 根据用户最近聊天记录表id删除用户最近聊天记录表 + * @param id 用户最近聊天记录表id + */ + void deleteById(Long id); + + /** + * 更新用户和店铺最后的消息 + * + * @param imMsgBizUserHistory 消息历史记录实体类 + */ + void updateBizUserLastMsg(ImMsgBizUserHistory imMsgBizUserHistory); + + /** + * 获取用户未读消息数量 + * @param userId + * @return + */ + Integer getImUserUnreadNum(Long userId); + + /** + * 更新用户未读消息数量 + * @param imMsgBizUserId + * @param userUnread + * @param whoSend + */ + void updateUserUnreadHistor(Long imMsgBizUserId, Integer userUnread, Integer whoSend); + + /** + * 更新店铺未读消息数量 + * @param id + * @param unread + * @param whoSend + */ + void updateShopUserUnreadMsgNum(Long id, Integer unread, Integer whoSend); +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizEmployeeRecentServiceImpl.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizEmployeeRecentServiceImpl.java new file mode 100644 index 0000000..552608d --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/service/impl/ImMsgBizEmployeeRecentServiceImpl.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.im.constants.WhoSend; +import com.tmerclub.cloud.im.mapper.ImMsgBizEmployeeRecentMapper; +import com.tmerclub.cloud.im.model.ImMsgBizEmployeeRecent; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizEmployeeRecentService; +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.Objects; + +/** + * 员工最近聊天记录表 + * + * @author FrozenWatermelon + * @date 2021-08-25 13:58:56 + */ +@Service +public class ImMsgBizEmployeeRecentServiceImpl implements ImMsgBizEmployeeRecentService { + + @Autowired + private ImMsgBizEmployeeRecentMapper imMsgBizEmployeeRecentMapper; + + @Override + public PageVO pageBySendTypeAndBizIdAndEmployeeId(PageDTO pageDTO, Integer sendType, Long bizId, Long employeeId) { + return PageUtil.doPage(pageDTO, () -> imMsgBizEmployeeRecentMapper.listBySendTypeAndBizIdAndEmployeeId(sendType, bizId, employeeId)); + } + + @Override + public ImMsgBizEmployeeRecent getById(Long id) { + return imMsgBizEmployeeRecentMapper.getById(id); + } + + @Override + public ImMsgBizEmployeeRecent getBySendTypeBizIdEmployeeIdUserId(Integer sendType, Long bizId, Long employeeId, Long userId) { + return imMsgBizEmployeeRecentMapper.getBySendTypeBizIdEmployeeIdUserId(sendType, bizId, employeeId, userId); + } + + @Override + public void save(ImMsgBizEmployeeRecent imMsgBizEmployeeRecent) { + imMsgBizEmployeeRecentMapper.save(imMsgBizEmployeeRecent); + } + + @Override + public void update(ImMsgBizEmployeeRecent imMsgBizEmployeeRecent) { + imMsgBizEmployeeRecentMapper.update(imMsgBizEmployeeRecent); + } + + @Override + public void deleteById(Long id) { + imMsgBizEmployeeRecentMapper.deleteById(id); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void updateEmployeeRecent(ImMsgBizUserHistory imMsgBizUserHistory) { + ImMsgBizEmployeeRecent imMsgBizEmployeeRecent = this.getBySendTypeBizIdEmployeeIdUserId(imMsgBizUserHistory.getSendType(), imMsgBizUserHistory.getBizId(), imMsgBizUserHistory.getEmployeeId(), imMsgBizUserHistory.getUserId()); + if (Objects.isNull(imMsgBizEmployeeRecent)) { + imMsgBizEmployeeRecent = new ImMsgBizEmployeeRecent(); + imMsgBizEmployeeRecent.setSendType(imMsgBizUserHistory.getSendType()); + imMsgBizEmployeeRecent.setBizId(imMsgBizUserHistory.getBizId()); + imMsgBizEmployeeRecent.setUserId(imMsgBizUserHistory.getUserId()); + imMsgBizEmployeeRecent.setEmployeeId(imMsgBizUserHistory.getEmployeeId()); + imMsgBizEmployeeRecent.setEmployeeUnreadNum(0); + imMsgBizEmployeeRecent.setCreateTime(new Date()); + imMsgBizEmployeeRecent.setUpdateTime(new Date()); + this.save(imMsgBizEmployeeRecent); + } else { + if (Objects.equals(imMsgBizUserHistory.getWhoSend(), WhoSend.USER)) { + imMsgBizEmployeeRecent.setEmployeeUnreadNum(imMsgBizEmployeeRecent.getEmployeeUnreadNum() + 1); + } + imMsgBizEmployeeRecent.setUpdateTime(new Date()); + this.update(imMsgBizEmployeeRecent); + } + } + + @Override + public void updateEmployeeUnreadMsgNum(Integer sendType, Long id, Long shopId, Long employeeId, Long userId) { + imMsgBizEmployeeRecentMapper.updateEmployeeUnreadMsgNum(sendType, id, shopId, employeeId, userId); + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/app/UserOnlineWebSocketServer.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/app/UserOnlineWebSocketServer.java new file mode 100644 index 0000000..3a2dd78 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/app/UserOnlineWebSocketServer.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.socket.app; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.MsgCode; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Lzk + */ +@ServerEndpoint("/ua/im/websocket/online/{token}/{userId}") +@Component +public class UserOnlineWebSocketServer { + + /** + * UUID为key + */ + public static final ConcurrentHashMap USER_ONLINE_MAP = new ConcurrentHashMap<>(256); + + private static TokenFeignClient tokenFeignClient; + + public static void setApplicationContext(ApplicationContext applicationContext) { + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + } + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (uidInfoBO == null) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + } + return; + } + // 如果原来就有token + Session oldSession = USER_ONLINE_MAP.get(Constant.ONLINE_USER_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE + token); + if (oldSession != null) { + // 客户端收到301,关闭ws链接,弹出提示 + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.LOGIN_IN_OTHER_PLACE, "账户已在别处登录,请刷新"))); + oldSession.close(); + } + } + + USER_ONLINE_MAP.put(Constant.ONLINE_USER_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE + token, session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success())); + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(Session session, @PathParam("token") String token, @PathParam("userId") Long userId) { + token = Base64.decodeStr(token); + USER_ONLINE_MAP.remove(Constant.ONLINE_USER_PREFIX + userId + Constant.UNDERLINE + token); + } + + /** + * 连接错误调用的方法 + */ + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, @PathParam("userId") Long userId) { + token = Base64.decodeStr(token); + USER_ONLINE_MAP.remove(Constant.ONLINE_USER_PREFIX + userId + Constant.UNDERLINE + token); + } + + /** + * 收到客户端消息后调用的方法,该消息由用户发过来 + * + * @param sourceMessage 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + } + return; + } + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "用户消息内容格式有误"))); + } + return; + } + + MessageInfoVO messageInfo = Json.parseObject(sourceMessage, MessageInfoVO.class); + + if (Objects.isNull(messageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "内容格式有误"))); + } + return; + } + + // 保持心跳 + if (StrUtil.equals(messageInfo.getContent(), Constant.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "保持心跳"))); + } + } + + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/app/UserWebSocketServer.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/app/UserWebSocketServer.java new file mode 100644 index 0000000..4c376a4 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/app/UserWebSocketServer.java @@ -0,0 +1,692 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.socket.app; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.MsgCode; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizSkillsService; +import com.tmerclub.cloud.im.service.ImMsgBizUserHistoryService; +import com.tmerclub.cloud.im.socket.multishop.ShopOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.multishop.ShopWebSocketServer; +import com.tmerclub.cloud.im.socket.platform.SysOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.platform.SysWebSocketServer; +import com.tmerclub.cloud.im.vo.ImMsgBizSkillsVO; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import com.tmerclub.cloud.im.vo.MsgItemVO; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 用户收到的消息 + * 10,"无法获取用户信息" + * 11,"账户已在别处登录,请刷新" + * 12,"对方不在线" + * 13, "内容格式有误" + * + * @author Lzk + */ +@ServerEndpoint("/ua/im/websocket/{token}/{userId}") +@Component +public class UserWebSocketServer { + private static final Logger log = LoggerFactory.getLogger(UserWebSocketServer.class); + + /** + * UUID为key + */ + public static final ConcurrentHashMap USER_MAP = new ConcurrentHashMap<>(256); + + private static TokenFeignClient tokenFeignClient; + + private static UserFeignClient userFeignClient; + + private static SysUserFeignClient sysUserFeignClient; + + private static ShopDetailFeignClient shopDetailFeignClient; + + private static AccountFeignClient accountFeignClient; + + private static ImMsgBizUserHistoryService imMsgBizUserHistoryService; + + private static ImMsgBizSkillsService imMsgBizSkillsService; + + private static ShopUserFeignClient shopUserFeignClient; + + public static void setApplicationContext(ApplicationContext applicationContext) { + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + userFeignClient = applicationContext.getBean(UserFeignClient.class); + sysUserFeignClient = applicationContext.getBean(SysUserFeignClient.class); + shopDetailFeignClient = applicationContext.getBean(ShopDetailFeignClient.class); + accountFeignClient = applicationContext.getBean(AccountFeignClient.class); + imMsgBizUserHistoryService = applicationContext.getBean(ImMsgBizUserHistoryService.class); + imMsgBizSkillsService = applicationContext.getBean(ImMsgBizSkillsService.class); + shopUserFeignClient = applicationContext.getBean(ShopUserFeignClient.class); + } + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (uidInfoBO == null) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + } + return; + } + + // 如果原来就有token + Session oldSession = USER_MAP.get(Constant.USER_PREFIX + uidInfoBO.getUserId()); + if (oldSession != null) { + // 客户端收到301,关闭ws链接,弹出提示 + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.LOGIN_IN_OTHER_PLACE, "账户已在别处登录,请刷新"))); + oldSession.close(); + } + } + + USER_MAP.put(Constant.USER_PREFIX + uidInfoBO.getUserId(), session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success("ok"))); + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(Session session, @PathParam("token") String token, @PathParam("userId") Long userId) { + USER_MAP.remove(Constant.USER_PREFIX + userId); + } + + /** + * 连接错误调用的方法 + */ + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, @PathParam("userId") Long userId) { + USER_MAP.remove(Constant.USER_PREFIX + userId); + log.error("客服连接错误:{}", error); + } + + /** + * 收到客户端消息后调用的方法,该消息由用户发过来 + * + * @param sourceMessage 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + } + return; + } + + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "内容格式有误"))); + } + return; + } + + MessageInfoVO messageInfo = Json.parseObject(sourceMessage, MessageInfoVO.class); + + if (Objects.isNull(messageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "内容格式有误"))); + } + return; + } + + // 保持心跳 + if (StrUtil.equals(messageInfo.getContent(), Constant.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "保持心跳"))); + } + return; + } + + Long bizId = messageInfo.getToId(); + Long userId = uidInfoBO.getUserId(); + ServerResponseEntity userApiResponse = userFeignClient.getInsiderUserData(uidInfoBO.getUserId()); + if (!userApiResponse.isSuccess()) { + throw new LuckException(userApiResponse.getMsg()); + } + UserApiVO user = userApiResponse.getData(); + // 判断用户是发送给商家客服还是平台客服 + switch (messageInfo.getSendType()) { + case SendType.PLATFORM: + sendToPlatform(bizId, session, messageInfo, userId, user); + break; + case SendType.SHOP: + sendToShop(bizId, session, messageInfo, userId, user); + break; + default: + break; + } + } + + public void sendToPlatform(Long bizId, Session session, MessageInfoVO messageInfo, Long userId, UserApiVO user) throws IOException { + ServerResponseEntity authAccountResponse = accountFeignClient.getBySysTypeAndIsAdminAndTenantId(SysTypeEnum.PLATFORM.value(), 1, bizId); + if (!authAccountResponse.isSuccess()) { + throw new LuckException(authAccountResponse.getMsg()); + } + if (Objects.isNull(authAccountResponse.getData())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.PARAM_ERROR, "参数有误"))); + } + return; + } + AuthAccountVO authAccount = authAccountResponse.getData(); + ServerResponseEntity sysUserResponse = sysUserFeignClient.getSysUserByUserId(authAccount.getUserId()); + if (!sysUserResponse.isSuccess()) { + throw new LuckException(sysUserResponse.getMsg()); + } + SysUserVO sysUser = sysUserResponse.getData(); + if (Objects.isNull(sysUser)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.PARAM_ERROR, "参数有误"))); + } + return; + } + // 获取消息历史 + if (Objects.nonNull(messageInfo.getHistory()) && Objects.equals(messageInfo.getHistory(), true)) { + PageVO msgItemPage = imMsgBizUserHistoryService.getUserPlatformHistory(sysUser, messageInfo, bizId, userId, user); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HISTORY, msgItemPage))); + } + return; + } + // 标记消息已读 + if (Objects.nonNull(messageInfo.getRead()) && Objects.equals(messageInfo.getRead(), true)) { + markIsRead(bizId, session, messageInfo, userId); + return; + } + + // 查出负责该客户的客服id + Long sysUserId = null; + if (Objects.equals(messageInfo.getOnlineOrOffline(), true) || StrUtil.isNotBlank(messageInfo.getContent())) { + String tempSysUserId = RedisUtil.get(Constant.IN_CHARGE_SYS + userId); + if (StrUtil.isNotBlank(tempSysUserId)) { + sysUserId = Long.valueOf(tempSysUserId.substring(4)); + } + } + + // 判断客服是否在线 + if (Objects.equals(messageInfo.getOnlineOrOffline(), true)) { + sendOnlineMsg(bizId, sysUserId, session); + } + // 发送消息 + if (StrUtil.isNotBlank(messageInfo.getContent())) { + log.info("发送消息给平台客服, 租户id:{}, 用户id:{}, 消息:{}", bizId, user.getUserId(), messageInfo.getContent()); + // 查出负责该客户的客服 + if (Objects.nonNull(sysUserId)) { + Session sysSession = SysWebSocketServer.SYS_MAP.get(Constant.SYS_PREFIX + sysUserId); + if (Objects.nonNull(sysSession)) { + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveUserPlatformHistory(messageInfo, bizId, userId, sysUserId); + sendMsgToSysUser(bizId, messageInfo, user, sysUser, sysUserId, sysSession, imMsgBizUserHistory); + return; + } + RedisUtil.del(Constant.IN_CHARGE_SYS + userId); + } + // 如果没有跟进的客服或者跟进的客服不在线 + List keys = MapUtil.getKeysByKeyPrefix(SysWebSocketServer.SYS_MAP, Constant.SYS_PREFIX); + if (CollUtil.isNotEmpty(keys)) { + getNewOnlineSysUser(bizId, messageInfo, userId, user, sysUser, keys); + } else { + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveUserPlatformHistory(messageInfo, bizId, userId, authAccount.getUserId()); + List onlineSysUser = MapUtil.getSessionByKeyPrefix(SysOnlineWebSocketServer.SYS_ONLINE_MAP, Constant.ONLINE_SYS_PREFIX); + sendNewMsg(onlineSysUser, imMsgBizUserHistory.getEmployeeId(), Constant.UNREAD_SYS_PREFIX); + } + } + messagePlatform(bizId, messageInfo, user, (long) com.tmerclub.cloud.common.constant.Constant.SUPER_ADMIN_ID, null); + } + + private void sendMsgToSysUser(Long bizId, MessageInfoVO messageInfo, UserApiVO user, SysUserVO sysUser, Long sysUserId, Session sysSession, ImMsgBizUserHistory imMsgBizUserHistory) throws IOException { + // 发送消息给平台 + imMsgBizUserHistory.setNickName(sysUser.getNickName()); + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserPlatformMsgItem(user, imMsgBizUserHistory); + if (sysSession.isOpen()) { + sysSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + messagePlatform(bizId, messageInfo, user, sysUserId, sysSession); + } + } + + private static Long getNewOnlineSysUser(Long bizId, MessageInfoVO messageInfo, Long userId, UserApiVO user, SysUserVO sysUser, List listSysUser) throws IOException { + // 随机选一个在线客服 + int index = (int) (Math.random() * listSysUser.size()); + long tempLength = (Constant.SYS_PREFIX).length(); + Long sysUserId = Long.valueOf(listSysUser.get(index).substring((int) tempLength)); + Session sysSession = SysWebSocketServer.SYS_MAP.get(Constant.SYS_PREFIX + sysUserId); + RedisUtil.set(Constant.IN_CHARGE_SYS + userId, "test" + sysUserId, 0); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveUserPlatformHistory(messageInfo, bizId, userId, sysUserId); + // 发送消息给平台 + imMsgBizUserHistory.setNickName(sysUser.getNickName()); + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserPlatformMsgItem(user, imMsgBizUserHistory); + if (Objects.nonNull(sysSession)) { + if (sysSession.isOpen()) { + sysSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + } + } + return sysUserId; + } + + private static void sendOnlineMsg(Long bizId, Long sysUserId, Session session) throws IOException { + + // 1.没有指定的客服就直接查店铺中是否有在线的客服(后面发送消息的步骤中会分配一个客服) + String sysUserKey = Constant.ONLINE_SYS_PREFIX; + if (Objects.nonNull(sysUserId)) { + // 2.如果用户有沟通中的客服,则直接查询该客服是否在线 + sysUserKey = sysUserKey + sysUserId + Constant.UNDERLINE; + } + + Boolean isExist = MapUtil.isExistKeyPrefix(SysOnlineWebSocketServer.SYS_ONLINE_MAP, sysUserKey); + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setOnlineOrOffline(isExist); + msgItem.setChatType(SendType.PLATFORM); + msgItem.setShopId(bizId); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.ONLINE_OR_OFFLINE, msgItem))); + } + } + + /** + * 用户-平台消息 + * @param bizId + * @param session + * @param messageInfo + * @param userId + * @throws IOException + */ + private static void markIsRead(Long bizId, Session session, MessageInfoVO messageInfo, Long userId) throws IOException { + if (Objects.nonNull(messageInfo.getMsgIds()) && !messageInfo.getMsgIds().isEmpty()) { + int updateNum = imMsgBizUserHistoryService.markUserPlatformRead(userId); + // 未读消息变更为已读消息的数量大于0 + if (updateNum > 0) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success("ok"))); + } + if (Objects.nonNull(messageInfo.getReadNoticePlatformUserId())) { + Session sysSession = SysWebSocketServer.SYS_MAP.get(Constant.SYS_PREFIX + messageInfo.getReadNoticePlatformUserId()); + if (Objects.nonNull(sysSession)) { + // 如果平台端客服在线,则发送用户消息已读提醒 + if (sysSession.isOpen()) { + sysSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, messageInfo.getMsgIds()))); + } + } + } else { + String tempSysUserId = RedisUtil.get(Constant.IN_CHARGE_SYS + userId); + if (Objects.nonNull(tempSysUserId)) { + long sysUserId = Long.parseLong(tempSysUserId.substring(4)); + Session sysSession = SysWebSocketServer.SYS_MAP.get(Constant.SYS_PREFIX + sysUserId); + if (Objects.nonNull(sysSession)) { + if (sysSession.isOpen()) { + sysSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, messageInfo.getMsgIds()))); + } + } + } + } + } + } + } + + private static void sendNewMsg(List listSysUser2, Long employeeId, String key) throws IOException { + if (!listSysUser2.isEmpty()) { + // 有新消息提示为半个小时 + RedisUtil.set(key + employeeId + Constant.UNDERLINE, 1, 1800); + MsgItemVO msgItem2 = new MsgItemVO(); + msgItem2.setNewMessage(true); + for (Session sysSession2 : listSysUser2) { + if (Objects.nonNull(sysSession2)) { + if (sysSession2.isOpen()) { + sysSession2.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem2))); + RedisUtil.del(key + employeeId + Constant.UNDERLINE); + } + } + } + } + } + + public void sendToShop(Long bizId, Session session, MessageInfoVO messageInfo, Long userId, UserApiVO user) throws IOException { + ServerResponseEntity authAccountResponse = accountFeignClient.getBySysTypeAndIsAdminAndTenantId(SysTypeEnum.MULTISHOP.value(), 1, bizId); + if (!authAccountResponse.isSuccess()) { + throw new LuckException(authAccountResponse.getMsg()); + } + AuthAccountVO authAccount = authAccountResponse.getData(); + + if (Objects.isNull(authAccount)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.PARAM_ERROR, "参数有误"))); + } + return; + } + + ServerResponseEntity shopResponse = shopDetailFeignClient.getShopByShopId(bizId); + if (!shopResponse.isSuccess()) { + throw new LuckException(shopResponse.getMsg()); + } + EsShopDetailBO shopDetail = shopResponse.getData(); + + if (Objects.isNull(shopDetail)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.PARAM_ERROR, "参数有误"))); + } + return; + } + + // 获取消息历史 + if (Objects.nonNull(messageInfo.getHistory()) && Objects.equals(messageInfo.getHistory(), true)) { + PageVO msgItemPage = imMsgBizUserHistoryService.getUserShopHistory(shopDetail, messageInfo, bizId, userId, user); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HISTORY, msgItemPage))); + } + return; + } + + // 标记消息已读 + if (Objects.nonNull(messageInfo.getRead()) && Objects.equals(messageInfo.getRead(), true)) { + markShopMsgIsRead(bizId, session, messageInfo, userId); + return; + } + + + Long employeeId = null; + // 查出负责该客户的客服id + if (Objects.equals(messageInfo.getOnlineOrOffline(), true) || StrUtil.isNotBlank(messageInfo.getContent())) { + String tempEmployeeId = RedisUtil.get(Constant.IN_CHARGE_SHOP + bizId + Constant.UNDERLINE + userId); + if (Objects.nonNull(tempEmployeeId)) { + employeeId = Long.valueOf(tempEmployeeId.substring(4)); + } + } + + // 判断客服是否在线 + if (Objects.equals(messageInfo.getOnlineOrOffline(), true)) { + sendShopOnlineMsg(bizId, employeeId, session); + } + + // 发送消息 + if (StrUtil.isNotBlank(messageInfo.getContent())) { + log.info("发送消息给店铺客服, 租户id:{}, 用户id:{}, 消息:{}", bizId, user.getUserId(), messageInfo.getContent()); + shopSendMessage(bizId, employeeId, messageInfo, userId, user, authAccount, shopDetail); + } + } + + private void shopSendMessage(Long bizId, Long employeeId, MessageInfoVO messageInfo, Long userId, UserApiVO user, AuthAccountVO authAccount, EsShopDetailBO shopDetail) throws IOException { + // 查出负责该客户的客服 + + if (Objects.nonNull(employeeId)) { + Session shopSession = ShopWebSocketServer.SHOP_EMPLOYEE_MAP.get(Constant.SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE + employeeId); + if (Objects.nonNull(shopSession)) { + log.info("客服在线"); + getOnlineShopUser(bizId, messageInfo, userId, user, shopDetail, employeeId, shopSession); + return; + } else { + log.info("客服不在线,给客服发送未读消息"); + List onlineShopEmployee = MapUtil.getSessionByKeyPrefix(ShopOnlineWebSocketServer.SHOP_ONLINE_EMPLOYEE_MAP, + Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE + employeeId + Constant.UNDERLINE); + if (!onlineShopEmployee.isEmpty()) { + imMsgBizUserHistoryService.saveUserShopHistory(messageInfo, bizId, userId, employeeId); + RedisUtil.set(Constant.UNREAD_SHOP_PREFIX + employeeId + Constant.UNDERLINE, 1, 1800); + MsgItemVO newMsg = new MsgItemVO(); + newMsg.setNewMessage(true); + for (Session onlineShopSession : onlineShopEmployee) { + if (Objects.nonNull(onlineShopSession)) { + if (onlineShopSession.isOpen()) { + onlineShopSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(newMsg))); + RedisUtil.del(Constant.UNREAD_SHOP_PREFIX + employeeId + Constant.UNDERLINE); + } + } + } + messageShop(bizId, messageInfo, user, employeeId, null, shopDetail); + return; + } + } + RedisUtil.del(Constant.IN_CHARGE_SHOP + bizId + Constant.UNDERLINE + userId); + } + // 如果没有跟进的客服或者跟进的客服不在线 + log.info("如果没有跟进的客服或者跟进的客服不在线"); + List keys = MapUtil.getKeysByKeyPrefix(ShopWebSocketServer.SHOP_EMPLOYEE_MAP, Constant.SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE); + if (CollUtil.isNotEmpty(keys)) { + // 分配一个客服 + getNewOnlineShopUser(authAccount.getUserId(), bizId, messageInfo, userId, user, shopDetail, keys); + } else { + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveUserShopHistory(messageInfo, bizId, userId, authAccount.getUserId()); + List onlineEmployee = MapUtil.getSessionByKeyPrefix(ShopOnlineWebSocketServer.SHOP_ONLINE_EMPLOYEE_MAP, Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE); + sendNewMsg(onlineEmployee, imMsgBizUserHistory.getEmployeeId(), Constant.UNREAD_SHOP_PREFIX); + } + Long shopUserId = shopUserFeignClient.getShopUserIdByShopId(bizId).getData(); + messageShop(bizId, messageInfo, user, shopUserId, null, shopDetail); + } + + private void getOnlineShopUser(Long bizId, MessageInfoVO messageInfo, Long userId, UserApiVO user, EsShopDetailBO shopDetail, Long employeeId, Session shopSession) throws IOException { + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveUserShopHistory(messageInfo, bizId, userId, employeeId); + + // 获取客服昵称 + ServerResponseEntity shopUserResponse = shopDetailFeignClient.getShopUserByShopUserId(employeeId); + if (!shopUserResponse.isSuccess() || Objects.isNull(shopUserResponse.getData())) { + throw new LuckException(shopUserResponse.getMsg()); + } + ShopUserVO shopUserVO = shopUserResponse.getData(); + imMsgBizUserHistory.setNickName(shopUserVO.getNickName()); + // 发送消息给客服 + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserShopMsgItem(shopDetail, user, imMsgBizUserHistory); + if (shopSession.isOpen()) { + shopSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + messageShop(bizId, messageInfo, user, employeeId, shopSession, shopDetail); + } + } + + private static void getNewOnlineShopUser(Long shopEmployeeId, Long bizId, MessageInfoVO messageInfo, Long userId, UserApiVO user, EsShopDetailBO shopDetail, List listEmployee) throws IOException { + // 随机选一个在线客服 + int index = (int) (Math.random() * listEmployee.size()); + long tempLength = (Constant.SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE).length(); + Long employeeId = Long.valueOf(listEmployee.get(index).substring((int) tempLength)); + Session shopSession = ShopWebSocketServer.SHOP_EMPLOYEE_MAP.get(Constant.SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE + employeeId); + RedisUtil.set(Constant.IN_CHARGE_SHOP + bizId + Constant.UNDERLINE + userId, "test" + employeeId, 0); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveUserShopHistory(messageInfo, bizId, userId, employeeId); + + // 获取客服昵称 + ServerResponseEntity shopUserResponse = shopDetailFeignClient.getShopUserByShopUserId(shopEmployeeId); + if (!shopUserResponse.isSuccess()) { + throw new LuckException(shopUserResponse.getMsg()); + } + ShopUserVO shopUserVO = shopUserResponse.getData(); + imMsgBizUserHistory.setNickName(shopUserVO.getNickName()); + + // 发送消息给客服 + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserShopMsgItem(shopDetail, user, imMsgBizUserHistory); + if (Objects.nonNull(shopSession)) { + if (shopSession.isOpen()) { + shopSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + } + } + } + + private static void sendShopOnlineMsg(Long bizId, Long employeeId, Session session) throws IOException { + // 1.没有指定的客服就直接查店铺中是否有在线的客服(后面发送消息的步骤中会分配一个客服) + String employeeKey = Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE; + if (Objects.nonNull(employeeId)) { + // 2.如果用户有沟通中的客服,则直接查询该客服是否在线 + employeeKey = employeeKey + employeeId + Constant.UNDERLINE; + } + Boolean isExist = MapUtil.isExistKeyPrefix(ShopOnlineWebSocketServer.SHOP_ONLINE_EMPLOYEE_MAP, employeeKey); + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(SendType.SHOP); + msgItem.setShopId(bizId); + msgItem.setOnlineOrOffline(isExist); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.ONLINE_OR_OFFLINE, msgItem))); + } + } + + /** + * 用户-店铺消息 + * @param bizId + * @param session + * @param messageInfo + * @param userId + * @throws IOException + */ + private static void markShopMsgIsRead(Long bizId, Session session, MessageInfoVO messageInfo, Long userId) throws IOException { + if (Objects.nonNull(messageInfo.getMsgIds()) && !messageInfo.getMsgIds().isEmpty()) { + int updateNum = imMsgBizUserHistoryService.markUserShopRead(bizId, userId); + if (updateNum > 0) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, "ok"))); + } + if (Objects.nonNull(messageInfo.getReadNoticeEmployeeId())) { + Session shopSession = ShopWebSocketServer.SHOP_EMPLOYEE_MAP.get(Constant.SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE + messageInfo.getReadNoticeEmployeeId()); + if (Objects.nonNull(shopSession)) { + if (shopSession.isOpen()) { + shopSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, messageInfo.getMsgIds()))); + } + } + } else { + String tempEmployeeId = RedisUtil.get(Constant.IN_CHARGE_SHOP + bizId + Constant.UNDERLINE + userId); + if (Objects.nonNull(tempEmployeeId)) { + long employeeId = Long.parseLong(tempEmployeeId.substring(4)); + Session shopSession = ShopWebSocketServer.SHOP_EMPLOYEE_MAP.get(Constant.SHOP_EMPLOYEE_PREFIX + bizId + Constant.UNDERLINE + employeeId); + if (Objects.nonNull(shopSession)) { + if (shopSession.isOpen()) { + shopSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, messageInfo.getMsgIds()))); + } + } + } + } + } + } + } + + private void messageShop(Long bizId, MessageInfoVO messageInfo, UserApiVO user, Long employeeId, Session shopSession, EsShopDetailBO shopDetail) throws IOException { + String content = messageInfo.getContent(); + if (content != null && !content.contains(Constant.BRACE_LEFT) && !content.contains(Constant.BRACE_RIGHT) && !content.contains(Constant.IM) + && !content.contains(".jpg") && !content.contains(".png") && !content.contains(".gif") + && !"/".equals(content.substring(0, 1))) { + List imMsgBizSkills = imMsgBizSkillsService.getByShopId(bizId); + if (CollUtil.isNotEmpty(imMsgBizSkills)) { + Map collect = imMsgBizSkills.stream().collect(Collectors.toMap(ImMsgBizSkillsVO::getKeywords, ImMsgBizSkillsVO::getContent)); + for (Map.Entry entry : collect.entrySet()) { + if (content.contains(entry.getKey())) { + log.info("商家客服自动回复关键字:{}", entry.getKey()); + MessageInfoVO msg = new MessageInfoVO(); + msg.setMsgType(0); + msg.setToId(user.getUserId()); + msg.setContent(entry.getValue()); + UidInfoBO uidInfoBO = new UidInfoBO(); + uidInfoBO.setTenantId(bizId); + uidInfoBO.setUserId(employeeId); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveShopUserHistory(msg, uidInfoBO); + // 补充自动回复者信息 + AuthAccountVO accountVO = accountFeignClient.getByUserIdAndSysType(employeeId, SysTypeEnum.MULTISHOP.value()).getData(); + if (Objects.nonNull(accountVO)) { + imMsgBizUserHistory.setNickName(accountVO.getUsername()); + } + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserShopMsgItem(shopDetail, user, imMsgBizUserHistory); + // 在线的话发送消息,不在线的话留言 + sendMsgUser(shopSession, msg, msgItem); + } + } + } else { + log.info("客服自动回复列表为空,店铺id:{}", bizId); + } + } + } + + private void messagePlatform(Long bizId, MessageInfoVO messageInfo, UserApiVO user, Long employeeId, Session sysSession) throws IOException { + String content = messageInfo.getContent(); + log.info("平台客服自动回复: {}", content); + if (content != null && !content.contains(Constant.BRACE_LEFT) && !content.contains(Constant.BRACE_RIGHT) && !content.contains(Constant.IM) + && !content.contains(".jpg") && !content.contains(".png") && !content.contains(".gif") + && !"/".equals(content.substring(0, 1))) { + List imMsgBizSkills = imMsgBizSkillsService.getByShopId(bizId); + log.info("平台客服自动回复集合大小:{}, 是否为空:{}", imMsgBizSkills.size(), CollUtil.isNotEmpty(imMsgBizSkills)); + if (CollUtil.isNotEmpty(imMsgBizSkills)) { + Map collect = imMsgBizSkills.stream().collect(Collectors.toMap(ImMsgBizSkillsVO::getKeywords, ImMsgBizSkillsVO::getContent)); + log.info("平台客服自动回复, 关键字回复集合:{}", collect); + for (Map.Entry entry : collect.entrySet()) { + if (content.contains(entry.getKey())) { + log.info("平台客服自动回复关键字:{}", entry.getKey()); + MessageInfoVO msg = new MessageInfoVO(); + msg.setMsgType(0); + msg.setToId(user.getUserId()); + msg.setContent(entry.getValue()); + UidInfoBO uidInfoBO = new UidInfoBO(); + uidInfoBO.setUserId(employeeId); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.savePlatformUserHistory(msg, uidInfoBO); + // 补充自动回复者信息 + AuthAccountVO accountVO = accountFeignClient.getByUserIdAndSysType(employeeId, SysTypeEnum.PLATFORM.value()).getData(); + if (Objects.nonNull(accountVO)) { + imMsgBizUserHistory.setNickName(accountVO.getUsername()); + } + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserPlatformMsgItem(user, imMsgBizUserHistory); + sendMsgUser(sysSession, msg, msgItem); + } + } + } else { + log.info("客服自动回复列表为空,店铺id:{}", bizId); + } + } + } + + private static void sendMsgUser(Session sysSession, MessageInfoVO msg, MsgItemVO msgItem) throws IOException { + Session userSession = USER_MAP.get(Constant.USER_PREFIX + msg.getToId()); + log.info("在线的话发送消息,不在线的话留言, 用户id:{}", msgItem.getUserId()); + if (userSession.isOpen()) { + log.info("发送消息给给用户"); + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + } + if (sysSession != null) { + log.info("发送消息给给平台或商家"); + sysSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + } + } + + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/multishop/ShopOnlineWebSocketServer.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/multishop/ShopOnlineWebSocketServer.java new file mode 100644 index 0000000..d93e4a0 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/multishop/ShopOnlineWebSocketServer.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.socket.multishop; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.MsgCode; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.socket.app.UserWebSocketServer; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import com.tmerclub.cloud.im.vo.MsgItemVO; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Lzk + */ +@ServerEndpoint("/m/ua/im/websocket/online/{token}/{tenantId}/{userId}") +@Component +public class ShopOnlineWebSocketServer { + + private static final Logger logger = LoggerFactory.getLogger(ShopOnlineWebSocketServer.class); + + /** + * shopId为key + */ + public static final ConcurrentHashMap SHOP_ONLINE_EMPLOYEE_MAP = new ConcurrentHashMap<>(256); + + private static TokenFeignClient tokenFeignClient; + + public static void setApplicationContext(ApplicationContext applicationContext) { + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + } + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (uidInfoBO == null) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + logger.info("ShopOnlineWebSocketServer-无法获取用户信息,token:{}", token); + } + return; + } + + // 如果原来就有token + Session oldSession = SHOP_ONLINE_EMPLOYEE_MAP.get(Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE + uidInfoBO.getUserId() + Constant.UNDERLINE + token); + if (oldSession != null) { + // 客户端收到11,关闭ws链接,弹出提示 + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.LOGIN_IN_OTHER_PLACE, "账户已在别处登录,请刷新"))); + oldSession.close(); + logger.info("ShopOnlineWebSocketServer-账户已在别处登录,请刷新,token:{}", token); + } + } + + Boolean isExist = MapUtil.isExistKeyPrefix(SHOP_ONLINE_EMPLOYEE_MAP, Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE); + if (!isExist) { + Set set2 = UserWebSocketServer.USER_MAP.keySet(); + if (!set2.isEmpty()) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(SendType.SHOP); + msgItem.setShopId(uidInfoBO.getTenantId()); + msgItem.setOnlineOrOffline(true); + sendText(set2, msgItem); + } + } + + SHOP_ONLINE_EMPLOYEE_MAP.put(Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE + uidInfoBO.getUserId() + Constant.UNDERLINE + token, session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success())); + } + Integer unRead = RedisUtil.get(Constant.UNREAD_SHOP_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE); + if (Objects.nonNull(unRead) && 1 == unRead) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setNewMessage(true); + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + RedisUtil.del(Constant.UNREAD_SHOP_PREFIX + uidInfoBO.getUserId() + Constant.UNDERLINE); + } + } + + private static void sendText(Set set2, MsgItemVO msgItem) throws IOException { + for (String key : set2) { + Session userSession = UserWebSocketServer.USER_MAP.get(key); + if (Objects.nonNull(userSession)) { + if (userSession.isOpen()) { + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.ONLINE_OR_OFFLINE, msgItem))); + } + } + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(Session session, @PathParam("token") String token, @PathParam("tenantId") Long tenantId, @PathParam("userId") Long userId) throws IOException { + token = Base64.decodeStr(token); + SHOP_ONLINE_EMPLOYEE_MAP.remove(Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + tenantId + Constant.UNDERLINE + userId + Constant.UNDERLINE + token); + + Boolean isExist = MapUtil.isExistKeyPrefix(SHOP_ONLINE_EMPLOYEE_MAP, Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + tenantId + Constant.UNDERLINE); + if (!isExist) { + Set set2 = UserWebSocketServer.USER_MAP.keySet(); + if (CollUtil.isNotEmpty(set2)) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setShopId(tenantId); + msgItem.setChatType(SendType.SHOP); + msgItem.setOnlineOrOffline(false); + sendText(set2, msgItem); + } + } + logger.info("ShopOnlineWebSocketServer-连接关闭 tenantId:{}, userId:{}, token:{}", tenantId, userId, token); + } + + /** + * 连接错误调用的方法 + */ + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, @PathParam("tenantId") Long tenantId, @PathParam("userId") Long userId) throws IOException { + token = Base64.decodeStr(token); + SHOP_ONLINE_EMPLOYEE_MAP.remove(Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + tenantId + Constant.UNDERLINE + userId + Constant.UNDERLINE + token); + + Boolean isExist = MapUtil.isExistKeyPrefix(SHOP_ONLINE_EMPLOYEE_MAP, Constant.ONLINE_SHOP_EMPLOYEE_PREFIX + tenantId + Constant.UNDERLINE); + if (!isExist) { + Set set2 = UserWebSocketServer.USER_MAP.keySet(); + if (!set2.isEmpty()) { + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(SendType.SHOP); + msgItem.setShopId(tenantId); + msgItem.setOnlineOrOffline(false); + sendText(set2, msgItem); + } + } + logger.info("ShopOnlineWebSocketServer-连接错误 tenantId:{}, userId:{}, token:{}, error:{}", tenantId, userId, token, error); + } + + /** + * 收到客户端消息后调用的方法,该消息由商家发过来 + * + * @param sourceMessage 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (uidInfoBO == null) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + logger.info("ShopOnlineWebSocketServer-无法获取用户信息,token:{}", token); + } + return; + } + + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "内容格式有误"))); + logger.info("ShopOnlineWebSocketServer-内容格式有误,token:{}", token); + } + return; + } + + MessageInfoVO messageInfo = Json.parseObject(sourceMessage, MessageInfoVO.class); + + if (Objects.isNull(messageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "内容格式有误"))); + logger.info("ShopOnlineWebSocketServer-内容格式有误,token:{}", token); + } + return; + } + + // 保持心跳 + if (StrUtil.equals(messageInfo.getContent(), Constant.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "保持心跳"))); + logger.info("ShopOnlineWebSocketServer-保持心跳,token:{}", token); + } + } + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/multishop/ShopWebSocketServer.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/multishop/ShopWebSocketServer.java new file mode 100644 index 0000000..8e2f43b --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/socket/multishop/ShopWebSocketServer.java @@ -0,0 +1,386 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.socket.multishop; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.MapUtil; +import com.tmerclub.cloud.im.constants.Constant; +import com.tmerclub.cloud.im.constants.MsgCode; +import com.tmerclub.cloud.im.constants.MsgRead; +import com.tmerclub.cloud.im.constants.SendType; +import com.tmerclub.cloud.im.model.ImMsgBizUserHistory; +import com.tmerclub.cloud.im.service.ImMsgBizUserHistoryService; +import com.tmerclub.cloud.im.socket.app.UserOnlineWebSocketServer; +import com.tmerclub.cloud.im.socket.app.UserWebSocketServer; +import com.tmerclub.cloud.im.vo.MessageInfoVO; +import com.tmerclub.cloud.im.vo.MsgItemVO; +import com.tmerclub.cloud.im.vo.ShopDetailEmployee; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 商家收到的消息 + * 10,"无法获取用户信息" + * 11,"账户已在别处登录,请刷新" + * 12,"对方不在线" + * 13, "内容格式有误" + * + * @author Lzk + */ +@ServerEndpoint("/m/ua/im/websocket/{token}/{tenantId}/{userId}") +@Component +public class ShopWebSocketServer { + + private static final Logger logger = LoggerFactory.getLogger(ShopWebSocketServer.class); + + /** + * shopId为key + */ + public static final ConcurrentHashMap SHOP_EMPLOYEE_MAP = new ConcurrentHashMap<>(256); + + private static TokenFeignClient tokenFeignClient; + + private static UserFeignClient userFeignClient; + + private static ShopDetailFeignClient shopDetailFeignClient; + + private static ShopUserFeignClient shopUserFeignClient; + + private static ImMsgBizUserHistoryService imMsgBizUserHistoryService; + + public static void setApplicationContext(ApplicationContext applicationContext) { + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + userFeignClient = applicationContext.getBean(UserFeignClient.class); + shopDetailFeignClient = applicationContext.getBean(ShopDetailFeignClient.class); + imMsgBizUserHistoryService = applicationContext.getBean(ImMsgBizUserHistoryService.class); + shopUserFeignClient = applicationContext.getBean(ShopUserFeignClient.class); + } + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (uidInfoBO == null) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + logger.info("ShopWebSocketServer-无法获取用户信息,token:{}", token); + } + return; + } + + // 如果原来就有token + Session oldSession = SHOP_EMPLOYEE_MAP.get(Constant.SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE + uidInfoBO.getUserId()); + if (oldSession != null) { + // 客户端收到11,关闭ws链接,弹出提示 + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.LOGIN_IN_OTHER_PLACE, "账户已在别处登录,请刷新"))); + logger.info("ShopWebSocketServer-账户已在别处登录,请刷新,token:{}", token); + oldSession.close(); + } + } + + SHOP_EMPLOYEE_MAP.put(Constant.SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE + uidInfoBO.getUserId(), session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success("ok"))); + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(Session session, @PathParam("token") String token, @PathParam("tenantId") Long tenantId, @PathParam("userId") Long userId) { + SHOP_EMPLOYEE_MAP.remove(Constant.SHOP_EMPLOYEE_PREFIX + tenantId + Constant.UNDERLINE + userId); + logger.info("ShopWebSocketServer-连接关闭 tenantId:{}, userId:{}, token:{}", tenantId, userId, token); + } + + /** + * 连接错误调用的方法 + */ + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, @PathParam("tenantId") Long tenantId, @PathParam("userId") Long userId) { + SHOP_EMPLOYEE_MAP.remove(Constant.SHOP_EMPLOYEE_PREFIX + tenantId + Constant.UNDERLINE + userId); + logger.error("ShopWebSocketServer-连接错误 tenantId:{}, userId:{}, token:{}, error:{}", tenantId, userId, token, error); + } + + /** + * 收到客户端消息后调用的方法,该消息由商家发过来 + * + * @param sourceMessage 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取用户信息"))); + logger.info("ShopWebSocketServer-无法获取用户信息,token:{}", token); + } + return; + } + + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "内容格式有误"))); + logger.info("ShopWebSocketServer-内容格式有误,token:{}", token); + } + return; + } + + MessageInfoVO messageInfo = Json.parseObject(sourceMessage, MessageInfoVO.class); + + if (Objects.isNull(messageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "内容格式有误"))); + logger.info("ShopWebSocketServer-内容格式有误,token:{}", token); + } + return; + } + + // 保持心跳 + if (StrUtil.equals(messageInfo.getContent(), Constant.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "商家ws保持心跳"))); + } + return; + } + + Long userId = messageInfo.getToId(); + ServerResponseEntity userApiResponse = userFeignClient.getInsiderUserData(userId); + if (!userApiResponse.isSuccess()) { + throw new LuckException(userApiResponse.getMsg()); + } + UserApiVO user = userApiResponse.getData(); + if (Objects.isNull(user)) { + user = new UserApiVO(); + user.setUserId(userId); + user.setUserName("*用户已注销*"); + user.setNickName("*用户已注销*"); + } + + sendToUser(messageInfo, uidInfoBO, user, session); + } + + public void sendToUser(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, Session session) throws IOException { + ServerResponseEntity shopResponse = shopDetailFeignClient.getShopByShopId(uidInfoBO.getTenantId()); + if (!shopResponse.isSuccess()) { + throw new LuckException(shopResponse.getMsg()); + } + EsShopDetailBO shopDetail = shopResponse.getData(); + + // 获取消息历史 + if (Objects.nonNull(messageInfo.getHistory()) && Objects.equals(messageInfo.getHistory(), true)) { + PageVO msgItemPage = imMsgBizUserHistoryService.getShopUserHistory(uidInfoBO, messageInfo, user, shopDetail); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HISTORY, msgItemPage))); + } + return; + } + + // 标记消息已读 + if (Objects.nonNull(messageInfo.getRead()) && Objects.equals(messageInfo.getRead(), true)) { + markMsgIsRead(messageInfo, uidInfoBO, user, session); + return; + } + + sendOnlineMsg(messageInfo, user, session); + + String tempString = RedisUtil.get(Constant.IN_CHARGE_SHOP + uidInfoBO.getTenantId() + Constant.UNDERLINE + messageInfo.getToId()); + Long employeeId = null; + if (Objects.nonNull(tempString)) { + employeeId = Long.valueOf(tempString.substring(4)); + if (!Objects.equals(employeeId, uidInfoBO.getUserId())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.NOT_YOUR_CLIENT, "不是你负责的客户"))); + logger.info("ShopWebSocketServer-不是你负责的客户"); + } + return; + } + } + + // 用户注销后不可以进行后面的操作 + if (Objects.isNull(user.getUserId())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.USER_ACCOUNT_CANCELLATION, "无接收消息的联系人"))); + } + return; + } + if (Objects.isNull(user.getStatus())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.USER_ACCOUNT_CANCELLATION, "用户账号已注销"))); + logger.info("ShopWebSocketServer-无法获取用户信息"); + } + return; + } + + // 获取可转接客服列表 + if (Objects.nonNull(messageInfo.getEmployeeList()) && Objects.equals(messageInfo.getEmployeeList(), true)) { + getCanTransferList(uidInfoBO, session, shopDetail); + return; + } + + // 转接客服 + if (Objects.nonNull(messageInfo.getChangeTo()) && Objects.equals(messageInfo.getChangeTo(), true)) { + transfer(messageInfo, uidInfoBO, user, session, shopDetail); + return; + } + + // 发送消息 + if (Objects.nonNull(messageInfo.getContent()) && !messageInfo.getContent().isEmpty()) { + sendMsgToUser(messageInfo, uidInfoBO, user, shopDetail, employeeId); + } + } + + private static void sendMsgToUser(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, EsShopDetailBO shopDetail, Long employeeId) throws IOException { + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveShopUserHistory(messageInfo, uidInfoBO); + // 在线的话发送消息,不在线的话留言 + Session userSession = UserWebSocketServer.USER_MAP.get(Constant.USER_PREFIX + messageInfo.getToId()); + if (Objects.nonNull(userSession)) { + if (Objects.isNull(employeeId)) { + RedisUtil.set(Constant.IN_CHARGE_SHOP + uidInfoBO.getTenantId() + Constant.UNDERLINE + messageInfo.getToId(), "test" + uidInfoBO.getUserId(), 0); + } + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserShopMsgItem(shopDetail, user, imMsgBizUserHistory); + if (userSession.isOpen()) { + ShopUserVO shopUser = shopUserFeignClient.getSimpleByUserId(employeeId); + msgItem.setNickName(shopUser.getNickName()); + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem))); + } + List sessionList = MapUtil.getSessionByKeyPrefix(UserOnlineWebSocketServer.USER_ONLINE_MAP, Constant.ONLINE_USER_PREFIX + messageInfo.getToId() + Constant.UNDERLINE); + if (CollUtil.isNotEmpty(sessionList)) { + MsgItemVO msgItem2 = new MsgItemVO(); + msgItem2.setNewMessage(true); + for (Session userSession2 : sessionList) { + if (userSession2 != null) { + if (userSession2.isOpen()) { + userSession2.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(msgItem2))); + } + } + } + } + } + } + + private static void transfer(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, Session session, EsShopDetailBO shopDetail) throws IOException { + if (Objects.nonNull(messageInfo.getEmployeeId())) { + Session userSession = UserWebSocketServer.USER_MAP.get(Constant.USER_PREFIX + messageInfo.getToId()); + Session shopSession = SHOP_EMPLOYEE_MAP.get(Constant.SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE + messageInfo.getEmployeeId()); + if (Objects.nonNull(shopSession)) { + RedisUtil.set(Constant.IN_CHARGE_SHOP + uidInfoBO.getTenantId() + Constant.UNDERLINE + messageInfo.getToId(), "test" + messageInfo.getEmployeeId(), 0); + ServerResponseEntity shopUserResponse = shopDetailFeignClient.getShopUserByShopUserId(messageInfo.getEmployeeId()); + if (!shopUserResponse.isSuccess()) { + throw new LuckException(shopUserResponse.getMsg()); + } + ShopUserVO shopUserVO = shopUserResponse.getData(); + ImMsgBizUserHistory imMsgBizUserHistory = imMsgBizUserHistoryService.saveShopChangeEmployeeReply(uidInfoBO, shopUserVO, user); + imMsgBizUserHistory.setNickName(shopUserVO.getNickName()); + MsgItemVO msgItem = imMsgBizUserHistoryService.getUserShopMsgItem(shopDetail, user, imMsgBizUserHistory); + if (session.isOpen()) { + msgItem.setEmployeeUnread(MsgRead.UNREAD); + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.CHANGE_EMPLOYEE_SUCCESS, msgItem))); + } + // 在线的话发送消息,不在线的话留言 + if (Objects.nonNull(userSession) && userSession.isOpen()) { + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.CHANGE_EMPLOYEE_SUCCESS, msgItem))); + } + if (shopSession.isOpen()) { + shopSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.CHANGE_EMPLOYEE_SUCCESS, msgItem))); + } + } + } + } + + private static void getCanTransferList(UidInfoBO uidInfoBO, Session session, EsShopDetailBO shopDetail) throws IOException { + List keys = MapUtil.getKeysByPrefixAndExcludeKey(SHOP_EMPLOYEE_MAP, Constant.SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE, + Constant.SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE + uidInfoBO.getUserId()); + List listEmployee = new ArrayList<>(com.tmerclub.cloud.common.constant.Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(keys)) { + return; + } + long tempLength = (Constant.SHOP_EMPLOYEE_PREFIX + uidInfoBO.getTenantId() + Constant.UNDERLINE).length(); + for (String key : keys) { + Long tempEmployeeId = Long.valueOf(key.substring((int) tempLength)); + ServerResponseEntity shopUserResponse = shopDetailFeignClient.getShopUserByShopUserId(tempEmployeeId); + if (!shopUserResponse.isSuccess()) { + throw new LuckException(shopUserResponse.getMsg()); + } + ShopUserVO shopUserVO = shopUserResponse.getData(); + ShopDetailEmployee shopDetailEmployee = new ShopDetailEmployee(); + shopDetailEmployee.setShopName(shopDetail.getShopName()); + shopDetailEmployee.setPic(shopDetail.getShopLogo()); + shopDetailEmployee.setShopId(shopDetail.getShopId()); + shopDetailEmployee.setEmployeeId(shopUserVO.getShopUserId()); + shopDetailEmployee.setEmployeeNickname(shopUserVO.getNickName()); + listEmployee.add(shopDetailEmployee); + } + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.EMPLOYEE_ONLINE, listEmployee))); + } + } + + private static void sendOnlineMsg(MessageInfoVO messageInfo, UserApiVO user, Session session) throws IOException { + if (Objects.nonNull(messageInfo.getOnlineOrOffline()) && Objects.equals(messageInfo.getOnlineOrOffline(), true)) { + Boolean isExist = MapUtil.isExistKeyPrefix(UserOnlineWebSocketServer.USER_ONLINE_MAP, Constant.ONLINE_USER_PREFIX + user.getUserId() + Constant.UNDERLINE); + MsgItemVO msgItem = new MsgItemVO(); + msgItem.setChatType(SendType.SHOP); + msgItem.setUserId(user.getUserId()); + msgItem.setOnlineOrOffline(isExist); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.ONLINE_OR_OFFLINE, msgItem))); + } + } + } + + private static void markMsgIsRead(MessageInfoVO messageInfo, UidInfoBO uidInfoBO, UserApiVO user, Session session) throws IOException { + Integer updateNum = imMsgBizUserHistoryService.markUserReadBySendType(SendType.SHOP, messageInfo, uidInfoBO, user.getUserId()); + if (updateNum > 0) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, "ok"))); + } + Session userSession = UserWebSocketServer.USER_MAP.get(Constant.USER_PREFIX + messageInfo.getToId()); + if (userSession != null) { + if (userSession.isOpen()) { + userSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.READ, messageInfo.getMsgIds()))); + } + } + } + } + +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ConversationVO.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ConversationVO.java new file mode 100644 index 0000000..20b14ca --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ConversationVO.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 最后的对话信息列表项 + * + * @author FrozenWatermelon + * @date 2020/8/18 + */ +public class ConversationVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 聊天类型 + */ + private Integer chatType; + + /** + * 商家id + */ + private Long shopId; + + /** + * 用户id + */ + private Long userId; + + /** + * 好友头像 + */ + private String pic; + + /** + * 好友昵称 + */ + private String friendName; + + /** + * 最新一条消息内容 + */ + private String latestMsg; + + /** + * 未读消息计数 + */ + private Integer unread; + + /** + * 最新消息的时间戳 + */ + private Long timestamp; + + /** + * 最新消息的时间 + */ + private String timeStr; + + /** + * 最后的消息时间 + */ + private LocalDateTime latestMsgTime; + + /** + * 消息类型 + */ + private Integer type; + + /** + * 店铺状态(-1:未开通 0: 停业中 1:营业中),可修改 + */ + private Integer shopStatus; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 是否在线 + */ + private Boolean isOnline; + + public Integer getChatType() { + return chatType; + } + + public void setChatType(Integer chatType) { + this.chatType = chatType; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getFriendName() { + return friendName; + } + + public void setFriendName(String friendName) { + this.friendName = friendName; + } + + public String getLatestMsg() { + return latestMsg; + } + + public void setLatestMsg(String latestMsg) { + this.latestMsg = latestMsg; + } + + public Integer getUnread() { + return unread; + } + + public void setUnread(Integer unread) { + this.unread = unread; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + public String getTimeStr() { + return timeStr; + } + + public void setTimeStr(String timeStr) { + this.timeStr = timeStr; + } + + public LocalDateTime getLatestMsgTime() { + return latestMsgTime; + } + + public void setLatestMsgTime(LocalDateTime latestMsgTime) { + this.latestMsgTime = latestMsgTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Boolean getIsOnline() { + return isOnline; + } + + public void setIsOnline(Boolean isOnline) { + this.isOnline = isOnline; + } + + @Override + public String toString() { + return "ConversationVO{" + + "chatType=" + chatType + + ", shopId=" + shopId + + ", userId='" + userId + '\'' + + ", pic='" + pic + '\'' + + ", friendName='" + friendName + '\'' + + ", latestMsg='" + latestMsg + '\'' + + ", unread=" + unread + + ", timestamp=" + timestamp + + ", timeStr='" + timeStr + '\'' + + ", latestMsgTime=" + latestMsgTime + + ", type=" + type + + ", shopStatus=" + shopStatus + + ", employeeId=" + employeeId + + ", isOnline=" + isOnline + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/MessageInfoVO.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/MessageInfoVO.java new file mode 100644 index 0000000..41814fb --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/MessageInfoVO.java @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/8/15 + */ +public class MessageInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 发往id + */ + private Long toId; + + /** + * 客服消息类型 1.发送给平台 2.发送给商家 + */ + private Integer sendType; + + /** + * 消息内容 + */ + private String content; + + /** + * 消息类型 + */ + private Integer msgType; + + /** + * 可转接客服列表 + */ + private Boolean employeeList; + + /** + * 可转接客服列表 + */ + private Boolean platformUserList; + + /** + * 是否转接客服 + */ + private Boolean changeTo; + + /** + * 转接客服id + */ + private Long employeeId; + + /** + * 转接客服id + */ + private Long platformUserId; + + /** + * 是否已读 + */ + private Boolean read; + + /** + * 已读消息id + */ + private List msgIds; + + /** + * 已读通知客服id + */ + private Long readNoticeEmployeeId; + + /** + * 已读通知客服id + */ + private Long readNoticePlatformUserId; + + /** + * 是否查看历史 + */ + private Boolean history; + + /** + * 消息历史每页大小 + */ + private Integer size; + + /** + * 消息历史第几页 + */ + private Integer current; + + private Boolean onlineOrOffline; + + public Long getToId() { + return toId; + } + + public void setToId(Long toId) { + this.toId = toId; + } + + public Integer getSendType() { + return sendType; + } + + public void setSendType(Integer sendType) { + this.sendType = sendType; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getMsgType() { + return msgType; + } + + public void setMsgType(Integer msgType) { + this.msgType = msgType; + } + + public Boolean getEmployeeList() { + return employeeList; + } + + public void setEmployeeList(Boolean employeeList) { + this.employeeList = employeeList; + } + + public Boolean getPlatformUserList() { + return platformUserList; + } + + public void setPlatformUserList(Boolean platformUserList) { + this.platformUserList = platformUserList; + } + + public Boolean getChangeTo() { + return changeTo; + } + + public void setChangeTo(Boolean changeTo) { + this.changeTo = changeTo; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Long getPlatformUserId() { + return platformUserId; + } + + public void setPlatformUserId(Long platformUserId) { + this.platformUserId = platformUserId; + } + + public Boolean getRead() { + return read; + } + + public void setRead(Boolean read) { + this.read = read; + } + + public List getMsgIds() { + return msgIds; + } + + public void setMsgIds(List msgIds) { + this.msgIds = msgIds; + } + + public Long getReadNoticeEmployeeId() { + return readNoticeEmployeeId; + } + + public void setReadNoticeEmployeeId(Long readNoticeEmployeeId) { + this.readNoticeEmployeeId = readNoticeEmployeeId; + } + + public Long getReadNoticePlatformUserId() { + return readNoticePlatformUserId; + } + + public void setReadNoticePlatformUserId(Long readNoticePlatformUserId) { + this.readNoticePlatformUserId = readNoticePlatformUserId; + } + + public Boolean getHistory() { + return history; + } + + public void setHistory(Boolean history) { + this.history = history; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Integer getCurrent() { + return current; + } + + public void setCurrent(Integer current) { + this.current = current; + } + + public Boolean getOnlineOrOffline() { + return onlineOrOffline; + } + + public void setOnlineOrOffline(Boolean onlineOrOffline) { + this.onlineOrOffline = onlineOrOffline; + } + + @Override + public String toString() { + return "MessageInfoVO{" + + "toId='" + toId + '\'' + + ", sendType=" + sendType + + ", content='" + content + '\'' + + ", msgType=" + msgType + + ", employeeList=" + employeeList + + ", platformUserList=" + platformUserList + + ", changeTo=" + changeTo + + ", employeeId=" + employeeId + + ", platformUserId=" + platformUserId + + ", read=" + read + + ", msgIds=" + msgIds + + ", readNoticeEmployeeId=" + readNoticeEmployeeId + + ", readNoticePlatformUserId=" + readNoticePlatformUserId + + ", history=" + history + + ", size=" + size + + ", current=" + current + + ", onlineOrOffline=" + onlineOrOffline + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/MsgItemVO.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/MsgItemVO.java new file mode 100644 index 0000000..e742df5 --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/MsgItemVO.java @@ -0,0 +1,319 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.vo; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author FrozenWatermelon + * @date 2020/8/19 + */ +public class MsgItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 消息id + */ + private Long itemId; + + /** + * 聊天类型 + */ + private Integer chatType; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名 + */ + private String userName; + + /** + * 客服昵称 + */ + private String nickName; + + /** + * 用户头像 + */ + private String userHeadUrl; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 店铺logo + */ + private String shopLogo; + + /** + * 时间 + */ + private Long timestamp; + + /** + * 时间 + */ + private String timeStr; + + /** + * 消息类型 + */ + private Integer type; + + /** + * 消息内容 + */ + private String content; + + /** + * 谁发的 0:平台,1:商家, 2:用户 + */ + private Integer source; + + /** + * 是否已读 + */ + private Integer userUnread; + + /** + * 是否已读 + */ + private Integer employeeUnread; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * Online新消息提醒 + */ + private Boolean newMessage; + + private Boolean onlineOrOffline; + + public Long getItemId() { + return itemId; + } + + public void setItemId(Long itemId) { + this.itemId = itemId; + } + + public Integer getChatType() { + return chatType; + } + + public void setChatType(Integer chatType) { + this.chatType = chatType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserHeadUrl() { + return userHeadUrl; + } + + public void setUserHeadUrl(String userHeadUrl) { + this.userHeadUrl = userHeadUrl; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + public String getTimeStr() { + return timeStr; + } + + public void setTimeStr(String timeStr) { + this.timeStr = timeStr; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Integer getUserUnread() { + return userUnread; + } + + public void setUserUnread(Integer userUnread) { + this.userUnread = userUnread; + } + + public Integer getEmployeeUnread() { + return employeeUnread; + } + + public void setEmployeeUnread(Integer employeeUnread) { + this.employeeUnread = employeeUnread; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public LocalDateTime getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(LocalDateTime updateTime) { + this.updateTime = updateTime; + } + + public Boolean getNewMessage() { + return newMessage; + } + + public void setNewMessage(Boolean newMessage) { + this.newMessage = newMessage; + } + + public Boolean getOnlineOrOffline() { + return onlineOrOffline; + } + + public void setOnlineOrOffline(Boolean onlineOrOffline) { + this.onlineOrOffline = onlineOrOffline; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Override + public String toString() { + return "MsgItemVO{" + + "itemId=" + itemId + + ", chatType=" + chatType + + ", userId=" + userId + + ", userName='" + userName + '\'' + + ", nickName='" + nickName + '\'' + + ", userHeadUrl='" + userHeadUrl + '\'' + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", employeeId=" + employeeId + + ", shopLogo='" + shopLogo + '\'' + + ", timestamp=" + timestamp + + ", timeStr='" + timeStr + '\'' + + ", type=" + type + + ", content='" + content + '\'' + + ", source=" + source + + ", userUnread=" + userUnread + + ", employeeUnread=" + employeeUnread + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", newMessage=" + newMessage + + ", onlineOrOffline=" + onlineOrOffline + + '}'; + } +} diff --git a/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ShopDetailEmployee.java b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ShopDetailEmployee.java new file mode 100644 index 0000000..7c9b34b --- /dev/null +++ b/tmerclub-im/src/main/java/com/tmerclub/cloud/im/vo/ShopDetailEmployee.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.im.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author Lzk + */ +public class ShopDetailEmployee implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺id + */ + private Long shopId; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 员工昵称 + */ + private String employeeNickname; + + /** + * 头像路径 + */ + private String pic; + + /** + * 昵称 + */ + private String shopName; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getEmployeeNickname() { + return employeeNickname; + } + + public void setEmployeeNickname(String employeeNickname) { + this.employeeNickname = employeeNickname; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + +} diff --git a/tmerclub-im/src/main/resources/mapper/ImMsgBizUserHistoryMapper.xml b/tmerclub-im/src/main/resources/mapper/ImMsgBizUserHistoryMapper.xml new file mode 100644 index 0000000..8ed8f6a --- /dev/null +++ b/tmerclub-im/src/main/resources/mapper/ImMsgBizUserHistoryMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`im_msg_biz_user_id`,`send_type`,`biz_id`,`user_id`,`employee_id`,`type`,`content`,`who_send`,`user_unread`,`employee_unread` + + + + + insert into im_msg_biz_user_history (`im_msg_biz_user_id`,`send_type`,`biz_id`,`user_id`,`employee_id`,`type`,`content`,`who_send`,`user_unread`,`employee_unread`,`read_range`) + values (#{imMsgBizUserHistory.imMsgBizUserId},#{imMsgBizUserHistory.sendType},#{imMsgBizUserHistory.bizId},#{imMsgBizUserHistory.userId},#{imMsgBizUserHistory.employeeId},#{imMsgBizUserHistory.type},#{imMsgBizUserHistory.content},#{imMsgBizUserHistory.whoSend},#{imMsgBizUserHistory.userUnread},#{imMsgBizUserHistory.employeeUnread},#{imMsgBizUserHistory.readRange}); + + + update im_msg_biz_user_history + + + `im_msg_biz_user_id` = #{imMsgBizUserHistory.imMsgBizUserId}, + + + `send_type` = #{imMsgBizUserHistory.sendType}, + + + `biz_id` = #{imMsgBizUserHistory.bizId}, + + + `user_id` = #{imMsgBizUserHistory.userId}, + + + `employee_id` = #{imMsgBizUserHistory.employeeId}, + + + `type` = #{imMsgBizUserHistory.type}, + + + `content` = #{imMsgBizUserHistory.content}, + + + `who_send` = #{imMsgBizUserHistory.whoSend}, + + + `user_unread` = #{imMsgBizUserHistory.userUnread}, + + + `employee_unread` = #{imMsgBizUserHistory.employeeUnread}, + + + where id = #{imMsgBizUserHistory.id} + + + delete from im_msg_biz_user_history where id = #{id} + + + + + + + + + update im_msg_biz_user_history set user_unread = 1 where im_msg_biz_user_id = #{imMsgBizUserId} and user_unread = 0 and user_id = #{userId} + + + + update im_msg_biz_user_history set employee_unread = 1 where im_msg_biz_user_id = #{id} and employee_unread = 0 and user_id = #{userId} + + diff --git a/tmerclub-marketing/pom.xml b/tmerclub-marketing/pom.xml new file mode 100644 index 0000000..fb87c23 --- /dev/null +++ b/tmerclub-marketing/pom.xml @@ -0,0 +1,109 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-marketing + mall4cloud 营销活动 + jar + + + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-core + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.github.binarywang + weixin-java-miniapp + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.xuxueli + xxl-job-core + + + com.github.binarywang + weixin-java-mp + + + com.github.binarywang + weixin-java-pay + + + com.moyuer.cloud + tmerclub-api-biz + ${project.version} + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + com.aliyun + aliyun-java-sdk-live + + + org.springframework.boot + spring-boot-starter-websocket + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + + diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/bo/ComboSkuStatusChangeNotifyBO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/bo/ComboSkuStatusChangeNotifyBO.java new file mode 100644 index 0000000..2e29fc9 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/bo/ComboSkuStatusChangeNotifyBO.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.bo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author xxw + * @date 2022/8/31 10:07 + * + */ +public class ComboSkuStatusChangeNotifyBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 套餐id + */ + private Long comboId; + + /** + * skuId集合 + */ + private List skuList; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public List getSkuList() { + return skuList; + } + + public void setSkuList(List skuList) { + this.skuList = skuList; + } + + @Override + public String toString() { + return "ComboSkuStatusChangeNotifyBO{" + + "comboId=" + comboId + + ", skuList=" + skuList + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboController.java new file mode 100644 index 0000000..92f1d5f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboController.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.controller.app; + +import com.tmerclub.cloud.combo.service.ComboService; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import com.tmerclub.cloud.common.product.vo.ComboVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 套餐 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@RestController("appComboController") +@RequestMapping("/ma/combo") +@Tag(name = "app-商品套餐") +public class ComboController { + + @Autowired + private ComboService comboService; + + + @GetMapping("/page") + @Operation(summary = "获取套餐列表", description = "分页获取套餐列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ComboDTO comboDTO) { + PageVO comboPage = comboService.page(pageDTO, comboDTO); + return ServerResponseEntity.success(comboPage); + } + + @GetMapping + @Operation(summary = "获取套餐", description = "根据comboId获取套餐") + public ServerResponseEntity getByComboId(@RequestParam Long comboId) { + // 用户端系统 + Integer sysType = 0; + return ServerResponseEntity.success(comboService.getByComboId(comboId, sysType)); + } + + @PostMapping + @Operation(summary = "保存套餐", description = "保存套餐") + public ServerResponseEntity save(@Valid @RequestBody ComboDTO comboDTO) { + comboService.save(comboDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/pcGetCombo") + @Operation(summary = "pc端获取套餐信息", description = "pc端获取套餐信息") + public ServerResponseEntity pcGetCombo(@RequestBody ComboDTO comboDTO) { + return ServerResponseEntity.success(comboService.pcGetCombo(comboDTO, AuthUserContext.get().getSysType())); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboSpuController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboSpuController.java new file mode 100644 index 0000000..dbcd75f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboSpuController.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.controller.app; + +import com.tmerclub.cloud.combo.dto.ComboSpuDTO; +import com.tmerclub.cloud.combo.model.ComboSpu; +import com.tmerclub.cloud.combo.service.ComboSpuService; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@RestController("appComboProdController") +@RequestMapping("/combo_prod") +@Tag(name = "套装商品项") +public class ComboSpuController { + + @Autowired + private ComboSpuService comboProdService; + + + @GetMapping("/page") + @Operation(summary = "获取套装商品项列表", description = "分页获取套装商品项列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO comboProdPage = comboProdService.page(pageDTO); + return ServerResponseEntity.success(comboProdPage); + } + + @GetMapping + @Operation(summary = "获取套装商品项", description = "根据comboProdId获取套装商品项") + public ServerResponseEntity getByComboProdId(@RequestParam Long comboProdId) { + return ServerResponseEntity.success(comboProdService.getByComboSpuId(comboProdId)); + } + + @PostMapping + @Operation(summary = "保存套装商品项", description = "保存套装商品项") + public ServerResponseEntity save(@Valid @RequestBody ComboSpuDTO comboProdDTO) { + ComboSpu comboProd = BeanUtil.map(comboProdDTO, ComboSpu.class); + comboProdService.save(comboProd); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新套装商品项", description = "更新套装商品项") + public ServerResponseEntity update(@Valid @RequestBody ComboSpuDTO comboProdDTO) { + ComboSpu comboProd = BeanUtil.map(comboProdDTO, ComboSpu.class); + comboProdService.update(comboProd); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除套装商品项", description = "根据套装商品项id删除套装商品项") + public ServerResponseEntity delete(@RequestParam Long comboProdId) { + comboProdService.deleteById(comboProdId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboSpuSkuController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboSpuSkuController.java new file mode 100644 index 0000000..8bb66ea --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/app/ComboSpuSkuController.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.controller.app; + +import com.tmerclub.cloud.combo.dto.ComboSpuSkuDTO; +import com.tmerclub.cloud.combo.model.ComboSpuSku; +import com.tmerclub.cloud.combo.service.ComboSpuSkuService; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 套餐商品sku项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@RestController("appComboProdSkuController") +@RequestMapping("/combo_prod_sku") +@Tag(name = "app-套餐商品sku项") +public class ComboSpuSkuController { + + @Autowired + private ComboSpuSkuService comboSpuSkuService; + + + @GetMapping("/page") + @Operation(summary = "获取套餐商品sku项列表", description = "分页获取套餐商品sku项列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO comboProdSkuPage = comboSpuSkuService.page(pageDTO); + return ServerResponseEntity.success(comboProdSkuPage); + } + + @PutMapping + @Operation(summary = "更新套餐商品sku项", description = "更新套餐商品sku项") + public ServerResponseEntity update(@Valid @RequestBody ComboSpuSkuDTO comboProdSkuDTO) { + ComboSpuSku comboProdSku = BeanUtil.map(comboProdSkuDTO, ComboSpuSku.class); + comboSpuSkuService.update(comboProdSku); + return ServerResponseEntity.success(); + } + + @PostMapping("/comboSpuSkuList") + @Operation(summary = "根据套餐id和商品id获取套餐商品sku信息", description = "根据套餐id和商品id获取套餐商品sku信息") + public ServerResponseEntity> comboSpuSkuList(@RequestBody ComboSpuSkuDTO comboSpuSkuDTO) { + return ServerResponseEntity.success(comboSpuSkuService.comboSpuSkuListByComboIdAndSpuId(comboSpuSkuDTO)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/multishop/ComboController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/multishop/ComboController.java new file mode 100644 index 0000000..2f50be8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/controller/multishop/ComboController.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.controller.multishop; + +import com.tmerclub.cloud.combo.service.ComboService; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import com.tmerclub.cloud.common.product.vo.ComboVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 商品套餐 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@RestController("multishopComboController") +@RequestMapping("/m/combo") +@Tag(name = "商品套餐") +public class ComboController { + + @Autowired + private ComboService comboService; + + + @GetMapping("/page") + @Operation(summary = "获取商品套餐列表", description = "分页获取商品套餐列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, ComboDTO comboDTO) { + PageVO comboPage = comboService.page(pageDTO, comboDTO); + return ServerResponseEntity.success(comboPage); + } + + @GetMapping + @Operation(summary = "获取商品套餐", description = "根据comboId获取商品套餐") + public ServerResponseEntity getByComboId(@RequestParam Long comboId) { + return ServerResponseEntity.success(comboService.getByComboId(comboId, AuthUserContext.get().getSysType())); + } + + @PostMapping + @Operation(summary = "保存商品套餐", description = "保存商品套餐") + public ServerResponseEntity save(@Valid @RequestBody ComboDTO comboDTO) { + comboDTO.setShopId(AuthUserContext.get().getTenantId()); + comboService.save(comboDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新商品套餐", description = "更新商品套餐") + public ServerResponseEntity update(@Valid @RequestBody ComboDTO comboDTO) { + comboService.update(comboDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_combo_status") + @Operation(summary = "修改商品套餐状态", description = "修改商品套餐状态") + public ServerResponseEntity updateComboStatus(@RequestBody ComboDTO comboDTO) { + comboService.updateComboStatus(comboDTO.getComboId(), comboDTO.getStatus()); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboOrderDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboOrderDTO.java new file mode 100644 index 0000000..27c5cd4 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboOrderDTO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套餐订单表DTO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐订单id") + private Long comboOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "user_id") + private String userId; + + @Schema(description = "套餐数量") + private Integer comboNum; + + @Schema(description = "支付金额") + private Double payPrice; + + @Schema(description = "订单编号") + private String orderNumber; + + @Schema(description = "状态(0:待支付、1:支付成功)") + private Integer status; + + public Long getComboOrderId() { + return comboOrderId; + } + + public void setComboOrderId(Long comboOrderId) { + this.comboOrderId = comboOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Integer getComboNum() { + return comboNum; + } + + public void setComboNum(Integer comboNum) { + this.comboNum = comboNum; + } + + public Double getPayPrice() { + return payPrice; + } + + public void setPayPrice(Double payPrice) { + this.payPrice = payPrice; + } + + public String getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(String orderNumber) { + this.orderNumber = orderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboOrderDTO{" + + "comboOrderId=" + comboOrderId + + ",shopId=" + shopId + + ",comboId=" + comboId + + ",userId=" + userId + + ",comboNum=" + comboNum + + ",payPrice=" + payPrice + + ",orderNumber=" + orderNumber + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboSpuDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboSpuDTO.java new file mode 100644 index 0000000..e2948d8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboSpuDTO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套餐商品项DTO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐商品项id") + private Long comboProdId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "商品id") + private Long prodId; + + @Schema(description = "套餐价") + private Double comboPrice; + + @Schema(description = "类型:1:主商品 2:搭配商品") + private Integer type; + + @Schema(description = "是否必选:1:是 0:否") + private Integer required; + + @Schema(description = "起搭数量") + private Integer leastNum; + + @Schema(description = "状态 -1:删除 0:失效 1:正常") + private Integer status; + + public Long getComboProdId() { + return comboProdId; + } + + public void setComboProdId(Long comboProdId) { + this.comboProdId = comboProdId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getProdId() { + return prodId; + } + + public void setProdId(Long prodId) { + this.prodId = prodId; + } + + public Double getComboPrice() { + return comboPrice; + } + + public void setComboPrice(Double comboPrice) { + this.comboPrice = comboPrice; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getRequired() { + return required; + } + + public void setRequired(Integer required) { + this.required = required; + } + + public Integer getLeastNum() { + return leastNum; + } + + public void setLeastNum(Integer leastNum) { + this.leastNum = leastNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboProdDTO{" + + "comboProdId=" + comboProdId + + ",comboId=" + comboId + + ",prodId=" + prodId + + ",comboPrice=" + comboPrice + + ",type=" + type + + ",required=" + required + + ",leastNum=" + leastNum + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboSpuSkuDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboSpuSkuDTO.java new file mode 100644 index 0000000..8a34221 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/dto/ComboSpuSkuDTO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套餐商品sku项DTO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpuSkuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐商品项id") + private Long comboProdId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "搭配价格") + private Long matchingPrice; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "商品id") + private Long spuId; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getComboProdId() { + return comboProdId; + } + + public void setComboProdId(Long comboProdId) { + this.comboProdId = comboProdId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Long matchingPrice) { + this.matchingPrice = matchingPrice; + } + + @Override + public String toString() { + return "ComboSpuSkuDTO{" + + "comboProdId=" + comboProdId + + ", skuId=" + skuId + + ", matchingPrice=" + matchingPrice + + ", comboId=" + comboId + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboSpuSkuFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboSpuSkuFeignController.java new file mode 100644 index 0000000..df95be7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/feign/ComboSpuSkuFeignController.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.feign; + +import com.tmerclub.cloud.api.combo.feign.ComboSpuSkuFeignClient; +import com.tmerclub.cloud.api.combo.vo.ComboSkuVo; +import com.tmerclub.cloud.combo.service.ComboSpuSkuService; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Set; + +/** + * @author xxw + * @date 2022/8/22 17:57 + */ +@DubboService +public class ComboSpuSkuFeignController implements ComboSpuSkuFeignClient { + @Autowired + private ComboSpuSkuService comboSpuSkuService; + + @Override + public ServerResponseEntity> comboVoListComboAndSkuList(Set comboIdList, List skuIdList) { + return ServerResponseEntity.success(comboSpuSkuService.comboVoListComboAndSkuList(comboIdList, skuIdList)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboSpuCountChangeListener.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboSpuCountChangeListener.java new file mode 100644 index 0000000..365ca0b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/listener/ComboSpuCountChangeListener.java @@ -0,0 +1,39 @@ +package com.tmerclub.cloud.combo.listener;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import com.tmerclub.cloud.api.product.feign.ShopCartFeignClient; +import com.tmerclub.cloud.combo.bo.ComboSpuCountChangeNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author xxw + * @date 2022/11/30 16:39 + * 套餐修改商品起搭数时异步修改以后购物车商品数量 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.COMBO_SPU_COUNT_CHANGE, consumerGroup = RocketMqConstant.COMBO_SPU_COUNT_CHANGE) +public class ComboSpuCountChangeListener implements RocketMQListener> { + + @DubboReference + private ShopCartFeignClient shopCartFeignClient; + + @Override + public void onMessage(List messageList) { + for (ComboSpuCountChangeNotifyBO message : messageList) { + shopCartFeignClient.updateCartComboCount(message.getComboId(), message.getSpuId(), message.getCount()); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboSpuMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboSpuMapper.java new file mode 100644 index 0000000..2bef196 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboSpuMapper.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.mapper; + +import com.tmerclub.cloud.combo.model.ComboSpu; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 套餐商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public interface ComboSpuMapper { + + /** + * 获取套餐商品项列表 + * + * @return 套餐商品项列表 + */ + List list(); + + /** + * 根据套餐商品项id获取套餐商品项 + * + * @param comboSpuId 套餐商品项id + * @return 套餐商品项 + */ + ComboSpuVO getByComboSpuId(@Param("comboSpuId") Long comboSpuId); + + /** + * 保存套餐商品项 + * + * @param comboSpu 套餐商品项 + */ + void save(@Param("comboSpu") ComboSpu comboSpu); + + /** + * 更新套餐商品项 + * + * @param comboSpu 套餐商品项 + */ + void update(@Param("comboSpu") ComboSpu comboSpu); + + /** + * 根据套餐商品项id删除套餐商品项 + * + * @param comboSpuId + */ + void deleteById(@Param("comboSpuId") Long comboSpuId); + + /** + * 改变套餐商品状态 + * + * @param comboSpu + */ + void updateStatus(@Param("comboSpu") ComboSpu comboSpu); + + /** + * 根据套餐ID获取搭配商品信息 + * @param comboId + * @param status + * @return + */ + List matchingSpuByComboId(@Param("comboId") Long comboId, @Param("status") Integer status); + + + /** + * 根据套餐商品项id获取套餐商品项 + * + * @param spuId 套餐商品id + * @param comboId + * @return 套餐商品项 + */ + ComboSpuVO getBySpuId(@Param("spuId") Long spuId, @Param("comboId") Long comboId); + + /** + * 根据套餐id获取主商品信息(状态不为删除的) + * + * @param comboId + * @return + */ + ComboSpuVO getMainSpuByComboId(@Param("comboId") Long comboId); + + /** + * 根据套餐id获取主商品信息(状态不为删除的) + * + * @param comboId + * @return + */ + ComboSpuVO getMainComboSpuId(@Param("comboId") Long comboId); + + /** + * 根据套餐id获取搭配商品信息 + * + * @param comboId + * @return + */ + List getMatchSpuByComboId(@Param("comboId") Long comboId); + + /** + * 根据comboSpuIdList批量删除 + * + * @param comboSpuIdList + */ + void deleteBatch(@Param("comboSpuIdList") List comboSpuIdList); + + /** + * 根据套餐id集合批量将已过期未改变的状态的套餐商品项的状态修改为失效 + * + * @param comboIdList + * @param status + */ + void batchUpdateByComboIdList(@Param("comboIdList") List comboIdList, @Param("status") Integer status); + + /** + * 根据套餐id获取套餐商品项信息 + * + * @param comboIdList + * @return + */ + List comboSpuByComboIds(@Param("comboIdList") List comboIdList); + + /** + * 批量把状态为正常的套餐商品修改为失效状态 + * + * @param spuIdList + */ + void batchComboSpuStatus(@Param("spuIdList") List spuIdList); + + /** + * 获取套餐下的商品和sku信息 + * @param comboId + * @return + */ + List getComboSpuByComboId(@Param("comboId") Long comboId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboSpuSkuMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboSpuSkuMapper.java new file mode 100644 index 0000000..e0d1304 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/mapper/ComboSpuSkuMapper.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.mapper; + +import com.tmerclub.cloud.api.combo.vo.ComboSkuVo; +import com.tmerclub.cloud.combo.model.ComboSpuSku; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * 套餐商品sku项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public interface ComboSpuSkuMapper { + + /** + * 获取套餐商品sku项列表 + * + * @return 套餐商品sku项列表 + */ + List list(); + + /** + * 保存套餐商品sku项 + * + * @param comboSpuSkuList 套餐商品sku项 + * @param comboSpuId + */ + void save(@Param("comboSpuSkuList") List comboSpuSkuList, @Param("comboSpuId") Long comboSpuId); + + /** + * 更新套餐商品sku项 + * + * @param comboSpuSku 套餐商品sku项 + */ + void update(@Param("comboSpuSku") ComboSpuSku comboSpuSku); + + /** + * 根据套餐商品sku项id删除套餐商品sku项 + * + * @param comboSpuId + */ + void delete(@Param("comboSpuId") Long comboSpuId); + + /** + * 保存套餐商品sku项信息 + * + * @param skuList + * @param comboSpuId + */ + void insertBatch(@Param("skuList") List skuList, @Param("comboSpuId") Long comboSpuId); + + /** + * 根据套餐商品项id获取套餐商品sku项(状态为正常的) + * + * @param comboSpuId 套餐商品项id + * @return 套餐商品sku项 + */ + List getByComboSpuId(@Param("comboSpuId") Long comboSpuId); + + /** + * 根据套餐商品项id获取套餐商品sku项(全部) + * + * @param comboSpuId 套餐商品项id + * @return 套餐商品sku项 + */ + List getByComboSpuIdS(@Param("comboSpuId") Long comboSpuId); + + /** + * 根据套餐商品项id获取套餐商品sku项 + * + * @param comboSpuIds 套餐商品项id列表 + * @return 套餐商品sku项 + */ + List batchByComboSpuId(@Param("comboSpuIds") List comboSpuIds); + + /** + * 批量更新 + * + * @param comboSpuSkuList + */ + void batchUpdate(@Param("comboSpuSkuList") List comboSpuSkuList); + + /** + * 根据套餐id列表和sku列表获取套餐信息 + * + * @param comboIdList + * @param skuIdList + * @return + */ + List comboVoListComboAndSkuList(@Param("comboIdList") Set comboIdList, @Param("skuIdList") List skuIdList); + + /** + * 根据套餐商品表id获取套餐商品sku信息 + * + * @param comboSpuId + * @return + */ + List comboVoListByComboSpuId(@Param("comboSpuId") Long comboSpuId); + + /** + * 根据套餐商品sku项id列表批量删除套餐商品sku项 + * + * @param comboSpuIdList + */ + void deleteBatch(@Param("comboSpuIdList") List comboSpuIdList); + + /** + * 根据套餐商品表id集合获取套餐商品sku信息 + * + * @param comboSpuIdList + * @return + */ + List comboSpuSkuList(@Param("comboSpuIdList") List comboSpuIdList); + + /** + * 根据套餐id和商品id获取套餐商品sku信息 + * + * @param comboId + * @param spuId + * @return + */ + List comboSpuSkuListByComboIdAndSpuId(@Param("comboId") Long comboId, @Param("spuId") Long spuId); + + /** + * 根据套餐商品项id集合批量修改套餐商品sku项状态 + * + * @param comboSpuIdList + * @param status + */ + void batchUpdateByComboSpuIdList(@Param("comboSpuIdList") List comboSpuIdList, @Param("status") Integer status); + + /** + * 根据套餐商品项id删除套餐商品sku项 + * @param comboSpuId + */ + void deleteById(@Param("comboSpuId") Long comboSpuId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/Combo.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/Combo.java new file mode 100644 index 0000000..1305f4b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/model/Combo.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 套装 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class Combo extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 套装id + */ + private Long comboId; + + /** + * 套餐名称 + */ + private String name; + + /** + * 活动开始时间 + */ + private Date startTime; + + /** + * 活动结束时间 + */ + private Date endTime; + + /** + * 主商品id + */ + private Long mainSpuId; + + /** + * 套餐价格 + */ + private Long price; + + /** + * 销量 + */ + private Integer soldNum; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 状态 -1:已删除 0:关闭 1:进行中 + */ + private Integer status; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getMainSpuId() { + return mainSpuId; + } + + public void setMainSpuId(Long mainSpuId) { + this.mainSpuId = mainSpuId; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Integer getSoldNum() { + return soldNum; + } + + public void setSoldNum(Integer soldNum) { + this.soldNum = soldNum; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "Combo{" + + "comboId=" + comboId + + ",name=" + name + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",mainProdId=" + mainSpuId + + ",price=" + price + + ",soldNum=" + soldNum + + ",shopId=" + shopId + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboOrderService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboOrderService.java new file mode 100644 index 0000000..e9166cc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboOrderService.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service; + +import java.util.List; + +/** + * 套餐订单表 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public interface ComboOrderService { + + /** + * 订单支付成功,套餐订单状态变为已支付、套餐销量增加 + * @param orderIdS + */ + void comboOrderPaySucceed(List orderIdS); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboService.java new file mode 100644 index 0000000..7d6e548 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboService.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ComboDTO; +import com.tmerclub.cloud.common.product.vo.ComboVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品套餐 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public interface ComboService { + + /** + * 分页获取商品套餐列表 + * @param pageDTO + * @param comboDTO + * @return + */ + PageVO page(PageDTO pageDTO, ComboDTO comboDTO); + + /** + * 根据商品套餐id获取商品套餐 + * @param comboId + * @param sysType + * @return + */ + ComboVO getByComboId(Long comboId, Integer sysType); + + /** + * 根据商品套餐id获取商品套餐 + * @param comboId + * @return + */ + ComboVO getComboInfoByComboId(Long comboId); + + /** + * 获取套餐信息 + * @param comboDTO + * @param sysType + * @return + */ + ComboVO pcGetCombo(ComboDTO comboDTO, Integer sysType); + + /** + * 保存商品套餐 + * + * @param comboDTO 商品套餐 + */ + void save(ComboDTO comboDTO); + + /** + * 更新商品套餐 + * + * @param comboDTO 商品套餐 + */ + void update(ComboDTO comboDTO); + + /** + * 修改商品套餐状态 + * + * @param comboId + * @param status + */ + void updateComboStatus(Long comboId, Integer status); + + /** + * 根据商品id获取套餐信息 + * + * @param spuId + * @return + */ + List comboVoListBySpuId(Long spuId); + + /** + * 根据spuId获取相关的套餐信息 + * + * @param shopId + * @param spuId + * @return + */ + List listComboInfoBySpuId(Long shopId, Long spuId); + + /** + * 定时任务 套餐活动结束,修改套餐状态、套餐商品项状态、套餐商品sku项状态 + */ + void comboEndOperation(); + + /** + * 定时任务 开启 到了活动开始时间未开启的套餐 + */ + void enableCombo(); + + /** + * 套餐销量增加 + * + * @param combo + */ + void comboSoldNumAdd(List combo); + + /** + * 商品下架时如果商品在套餐活动中且为主商品则失效套餐活动 + * + * @param spuId + */ + void offComboMainSpu(Long spuId); + + /** + * 检查商品是否为套餐活动(状态正在进行中的)的商品 + * + * @param spuId + * @param shopId + * @return + */ + Boolean checkComboSpu(Long spuId, Long shopId); + + /** + * 根据套餐id集合检查套餐是否全部可用 + * + * @param comboIdList + * @return 返回不可用套餐数量 0代表全部可用,其它数据代表有不可用的套餐 + */ + Integer checkComboIsUsable(List comboIdList); + + /** + * 根据商品id清除缓存 + * + * @param spuId + */ + void removeComboSpuCache(Long spuId); + + /** + * 根据套餐id集合获取套餐信息 + * @param comboIdList + * @return + */ + List getComboByComboIdList(@Param("comboIdList") List comboIdList); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboSpuService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboSpuService.java new file mode 100644 index 0000000..37fc5e6 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/ComboSpuService.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service; + +import com.tmerclub.cloud.combo.model.ComboSpu; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; + +import java.util.List; + +/** + * 套餐商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public interface ComboSpuService { + + /** + * 分页获取套餐商品项列表 + * @param pageDTO 分页参数 + * @return 套餐商品项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据套餐商品项id获取套餐商品项 + * + * @param comboSpuId 套餐商品项id + * @return 套餐商品项 + */ + ComboSpuVO getByComboSpuId(Long comboSpuId); + + /** + * 保存套餐商品项 + * @param comboSpu 套餐商品项 + */ + void save(ComboSpu comboSpu); + + /** + * 更新套餐商品项 + * @param comboSpu 套餐商品项 + */ + void update(ComboSpu comboSpu); + + /** + * 根据套餐商品项id删除套餐商品项 + * @param comboSpuId 套餐商品项id + */ + void deleteById(Long comboSpuId); + + /** + * 批量保存 + * @param spuList + * @param comboId + */ + void insertBatch(List spuList, Long comboId); + + /** + * 根据comboSpuIdList批量删除 + * @param comboSpuIdList + */ + void deleteBatch(List comboSpuIdList); + + /** + * 根据套餐id获取套餐商品信息 + * @param comboId + * @return + */ + List comboSpuByComboId(Long comboId); + + /** + * 商品下架或者违规下架后套餐商品处理(下架的套餐商品不在用户端显示) + * @param spuIdList + */ + void comboSpuOfflineDispose(List spuIdList); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboSpuServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboSpuServiceImpl.java new file mode 100644 index 0000000..267ecb1 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/service/impl/ComboSpuServiceImpl.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.combo.mapper.ComboSpuMapper; +import com.tmerclub.cloud.combo.model.ComboSpu; +import com.tmerclub.cloud.combo.service.ComboSpuService; +import com.tmerclub.cloud.combo.service.ComboSpuSkuService; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuSkuVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; + +/** + * 套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +@Service +public class ComboSpuServiceImpl implements ComboSpuService { + + @Autowired + private ComboSpuMapper comboSpuMapper; + @Autowired + private ComboSpuSkuService comboSpuSkuService; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> comboSpuMapper.list()); + } + + @Override + public ComboSpuVO getByComboSpuId(Long comboProdId) { + return comboSpuMapper.getByComboSpuId(comboProdId); + } + + @Override + public void save(ComboSpu comboSpu) { + comboSpuMapper.save(comboSpu); + } + + @Override + public void update(ComboSpu comboProd) { + comboSpuMapper.update(comboProd); + } + + @Override + public void deleteById(Long comboProdId) { + comboSpuMapper.deleteById(comboProdId); + } + + @Override + public void insertBatch(List spuList, Long comboId) { + if (CollUtil.isEmpty(spuList)) { + return; + } + for (ComboSpuVO comboSpuVO : spuList) { + List skuListS = comboSpuVO.getSkuList(); + long price = 0L; + for (ComboSpuSkuVO list : skuListS) { + price += list.getMatchingPrice() * comboSpuVO.getLeastNum(); + } + comboSpuVO.setComboPrice(price); + comboSpuVO.setType(2); + comboSpuVO.setStatus(1); + comboSpuVO.setComboId(comboId); + ComboSpu comboSpu = BeanUtil.map(comboSpuVO, ComboSpu.class); + comboSpuMapper.save(comboSpu); + //保存sku信息 + for (ComboSpuSkuVO comboSpuSkuVO : comboSpu.getSkuList()) { + comboSpuSkuVO.setSkuStatus(comboSpuVO.getStatus()); + } + comboSpuSkuService.insertBatch(comboSpu.getSkuList(), comboSpu.getComboSpuId()); + } + } + + @Override + public void deleteBatch(List comboSpuIdList) { + comboSpuMapper.deleteBatch(comboSpuIdList); + } + + @Override + public List comboSpuByComboId(Long comboId) { + return comboSpuMapper.comboSpuByComboIds(Collections.singletonList(comboId)); + } + + @Override + public void comboSpuOfflineDispose(List spuIdList) { + if (spuIdList.size() != 0) { + comboSpuMapper.batchComboSpuStatus(spuIdList); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboOrderVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboOrderVO.java new file mode 100644 index 0000000..2ea0338 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboOrderVO.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套餐订单表VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐订单id") + private Long comboOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "user_id") + private String userId; + + @Schema(description = "套餐数量") + private Integer comboNum; + + @Schema(description = "支付金额") + private Double payPrice; + + @Schema(description = "订单编号") + private String orderNumber; + + @Schema(description = "状态(0:待支付、1:支付成功)") + private Integer status; + + public Long getComboOrderId() { + return comboOrderId; + } + + public void setComboOrderId(Long comboOrderId) { + this.comboOrderId = comboOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Integer getComboNum() { + return comboNum; + } + + public void setComboNum(Integer comboNum) { + this.comboNum = comboNum; + } + + public Double getPayPrice() { + return payPrice; + } + + public void setPayPrice(Double payPrice) { + this.payPrice = payPrice; + } + + public String getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(String orderNumber) { + this.orderNumber = orderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboOrderVO{" + + "comboOrderId=" + comboOrderId + + ",shopId=" + shopId + + ",comboId=" + comboId + + ",userId=" + userId + + ",comboNum=" + comboNum + + ",payPrice=" + payPrice + + ",orderNumber=" + orderNumber + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboSpuSkuVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboSpuSkuVO.java new file mode 100644 index 0000000..9c714f6 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboSpuSkuVO.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 套装商品sku项VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboSpuSkuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐商品sku项id") + private Long comboSpuId; + + @Schema(description = "skuId") + @NotNull(message = "skuId不能为空") + private Long skuId; + + @Schema(description = "搭配价格") + @NotNull(message = "搭配价格不能为空") + private Long matchingPrice; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "sku图片") + private String pic; + + @Schema(description = "sku价格") + private Long price; + + @Schema(description = "sku库存") + private Integer stocks; + + @Schema(description = "sku状态 0 禁用 1 启用 -1 删除") + private Integer skuStatus; + + @Schema(description = "销售属性组合字符串 格式是p1:v1;p2:v2") + private String properties; + + /** + * 商品是否必选:1:是 0:否 + */ + private Integer spuRequired; + + public String getSkuName() { + return skuName; + } + + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getSkuStatus() { + return skuStatus; + } + + public void setSkuStatus(Integer skuStatus) { + this.skuStatus = skuStatus; + } + + public String getProperties() { + return properties; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public Integer getSpuRequired() { + return spuRequired; + } + + public void setSpuRequired(Integer spuRequired) { + this.spuRequired = spuRequired; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getComboSpuId() { + return comboSpuId; + } + + public void setComboSpuId(Long comboSpuId) { + this.comboSpuId = comboSpuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Long matchingPrice) { + this.matchingPrice = matchingPrice; + } + + @Override + public String toString() { + return "ComboSpuSkuVO{" + + "comboSpuId=" + comboSpuId + + ", skuId=" + skuId + + ", matchingPrice=" + matchingPrice + + ", skuName='" + skuName + '\'' + + ", pic='" + pic + '\'' + + ", price=" + price + + ", stocks=" + stocks + + ", skuStatus=" + skuStatus + + ", properties='" + properties + '\'' + + ", spuRequired=" + spuRequired + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboVO.java new file mode 100644 index 0000000..c1e4655 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/combo/vo/ComboVO.java @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.combo.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 套装VO + * + * @author FrozenWatermelon + * @date 2022-08-16 09:18:06 + */ +public class ComboVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "套餐名称") + @NotBlank(message = "套餐名称不能为空") + private String name; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "活动开始时间") + @NotNull(message = "活动开始时间不能为空") + private Date startTime; + + @Schema(description = "活动结束时间") + @NotNull(message = "活动结束时间不能为空") + private Date endTime; + + @Schema(description = "状态, -1:已删除 0:已失效 1:开启") + private Integer status; + + @Schema(description = "销量") + private Integer soldNum; + + @Schema(description = "套餐价格") + private Long price; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "主商品id") + private Long mainSpuId; + + @Schema(description = "主商品") + @Valid + private ComboSpuVO mainSpu; + + @Schema(description = "搭配商品列表") + @Valid + private List matchingSpus; + + @Schema(description = "商品数量") + private Integer spuCount; + + @Schema(description = "套餐价") + private Double matchingPrice; + + @Schema(description = "主商品名称") + private String mainSpuName; + + @Schema(description = "搭配商品名称") + private String matchSpuName; + + @Schema(description = "语言") + private Integer lang; + + @Override + public Date getUpdateTime() { + return updateTime; + } + + @Override + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public ComboSpuVO getMainSpu() { + return mainSpu; + } + + public void setMainSpu(ComboSpuVO mainSpu) { + this.mainSpu = mainSpu; + } + + public List getMatchingSpus() { + return matchingSpus; + } + + public void setMatchingSpus(List matchingSpus) { + this.matchingSpus = matchingSpus; + } + + public Integer getSpuCount() { + return spuCount; + } + + public void setSpuCount(Integer spuCount) { + this.spuCount = spuCount; + } + + public Double getMatchingPrice() { + return matchingPrice; + } + + public void setMatchingPrice(Double matchingPrice) { + this.matchingPrice = matchingPrice; + } + + public String getMainSpuName() { + return mainSpuName; + } + + public void setMainSpuName(String mainSpuName) { + this.mainSpuName = mainSpuName; + } + + public String getMatchSpuName() { + return matchSpuName; + } + + public void setMatchSpuName(String matchSpuName) { + this.matchSpuName = matchSpuName; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + @Override + public Date getCreateTime() { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getMainSpuId() { + return mainSpuId; + } + + public void setMainSpuId(Long mainSpuId) { + this.mainSpuId = mainSpuId; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Integer getSoldNum() { + return soldNum; + } + + public void setSoldNum(Integer soldNum) { + this.soldNum = soldNum; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "ComboVO{" + + "comboId=" + comboId + + ", name='" + name + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", status=" + status + + ", soldNum=" + soldNum + + ", price=" + price + + ", shopId=" + shopId + + ", mainSpuId=" + mainSpuId + + ", mainSpu=" + mainSpu + + ", matchingSpus=" + matchingSpus + + ", spuCount=" + spuCount + + ", matchingPrice=" + matchingPrice + + ", mainSpuName='" + mainSpuName + '\'' + + ", matchSpuName='" + matchSpuName + '\'' + + ", lang=" + lang + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/DubboBeanConfig.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/DubboBeanConfig.java new file mode 100644 index 0000000..fc6bff5 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/DubboBeanConfig.java @@ -0,0 +1,20 @@ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.context.annotation.Configuration; + +/** + * 以下代码看起来无用,实际上根据dubbo3在spring 当中的bean加载变化,这个东西可以为spring的application提供上下文 + * 请勿随意删除!!!! + * 请勿随意删除!!!! + * 请勿随意删除!!!! + * 请勿随意删除!!!! + * @author LGH + */ +@Configuration +public class DubboBeanConfig { + + @DubboReference + private TokenFeignClient tokenFeignClient; +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java new file mode 100644 index 0000000..3d18050 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author xxw + * @date 2022/8/31 10:14 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate comboSkuStatusTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.COMBO_SKU_STATUS_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate comboDeleteOrDisabledTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.COMBO_DELETE_OR_DISABLED); + } + + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate comboSpuCountChangeTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.COMBO_SPU_COUNT_CHANGE); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate couponMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.COUPON_UNLOCK_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate levelUpCouponGiveTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.LEVEL_UP_COUPON_GIVE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate levelDownCouponExpireTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.LEVEL_DOWN_COUPON_EXPIRE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendActivityOfflineNotifyToShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate distributionNotifyOrderShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.DISTRIBUTION_NOTIFY_ORDER_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendNotifyToUserTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendActivityAuditNotifyToShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendAddCouponStockTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ADD_COUPON_STOCK_TOPIC); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/WebSocketConfig.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/WebSocketConfig.java new file mode 100644 index 0000000..d254b08 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/WebSocketConfig.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * WebSocket配置 + * + * @author Lzk + */ +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/WxConfig.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/WxConfig.java new file mode 100644 index 0000000..97c9477 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/config/WxConfig.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceHttpClientImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaRedissonConfigImpl; +import cn.hutool.core.util.StrUtil; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.service.EntPayService; +import com.github.binarywang.wxpay.service.MerchantTransferService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.EntPayServiceImpl; +import com.github.binarywang.wxpay.service.impl.MerchantTransferServiceImpl; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.WxApp; +import com.tmerclub.cloud.common.bean.WxMiniApp; +import com.tmerclub.cloud.common.bean.WxMp; +import com.tmerclub.cloud.common.bean.WxPay; +import com.tmerclub.cloud.common.constant.PayType; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +import java.util.Objects; + + +/** + * 通过微信配置获取微信的支付信息,登陆信息等 + * + * @author FrozenWatermelon + */ +@RefreshScope +@Component +public class WxConfig { + + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private RedissonClient redissonClient; + + private static final String MA_CONFIG_KEY_PREFIX = "mall4cloud:ma_config_key_prefix"; + + public WxMaService getWxMaService() { + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + // access token用redis缓存 + WxMaRedissonConfigImpl maRedissonConfig = new WxMaRedissonConfigImpl(redissonClient, MA_CONFIG_KEY_PREFIX); + maRedissonConfig.setAppid(wxMiniApp.getAppId()); + maRedissonConfig.setSecret(wxMiniApp.getSecret()); + + WxMaServiceHttpClientImpl wxMaServiceHttpClient = new WxMaServiceHttpClientImpl(); + wxMaServiceHttpClient.setWxMaConfig(maRedissonConfig); + return wxMaServiceHttpClient; + } + + /** + * 商家转账返回查询结果 + * + * @param + * @return + */ + public MerchantTransferService getMerchantTransferService() { + String appid = getAppid(); + WxPayService wxPayService = new WxPayServiceImpl(); + wxPayService.setConfig(getWxPay(appid)); + return new MerchantTransferServiceImpl(wxPayService); + } + + private String getAppid() { + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + // 小程序支付 + String appid; + if (wxMiniApp != null && StrUtil.isNotBlank(wxMiniApp.getAppId())) { + appid = wxMiniApp.getAppId(); + } else { + WxMp wxMp = feignShopConfig.getWxMp(); + appid = wxMp.getAppId(); + } + return appid; + } + + private WxPayConfig getWxPay(String appid) { + WxPay wxPay = feignShopConfig.getWxPay(); + WxPayConfig payConfig = new WxPayConfig(); + // 都需要的配置 + payConfig.setAppId(appid); + payConfig.setMchId(wxPay.getMchId()); + // v3需要的配置 + if (Objects.equals(WxPay.VERSION_3, wxPay.getVersion())) { + payConfig.setCertSerialNo(wxPay.getCertSerialNo()); + payConfig.setApiV3Key(wxPay.getApiv3Key()); + if (StrUtil.isBlank(wxPay.getPrivateKeyContent())) { + payConfig.setPrivateKeyPath(wxPay.getPrivateKeyPath()); + } else { + payConfig.setPrivateKeyContent(wxPay.getPrivateKeyContent().getBytes()); + } + if (StrUtil.isBlank(wxPay.getPrivateCertContent())) { + payConfig.setPrivateCertPath(wxPay.getPrivateCertPath()); + } else { + payConfig.setPrivateCertContent(wxPay.getPrivateCertContent().getBytes()); + } + } else { + // v2需要的配置 + payConfig.setMchKey(wxPay.getMchKey()); + payConfig.setKeyPath(wxPay.getKeyPath()); + payConfig.setSignType(WxPayConstants.SignType.HMAC_SHA256); + } + return payConfig; + } + + /** + * 根据支付方式,获取微信支付信息 + * + * @param payType + * @return + */ + public WxPayService getWxPayService(PayType payType) { + + String appid; + // 小程序支付 + if (Objects.equals(payType, PayType.WECHATPAY)) { + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + appid = wxMiniApp.getAppId(); + } else if (Objects.equals(payType, PayType.WECHATPAY_APP)) { + WxApp wxApp = feignShopConfig.getWxApp(); + appid = wxApp.getAppId(); + } else { + WxMp wxMp = feignShopConfig.getWxMp(); + appid = wxMp.getAppId(); + } + + WxPayConfig payConfig = getWxPay(appid); + + WxPayService wxPayService = new WxPayServiceImpl(); + + wxPayService.setConfig(payConfig); + return wxPayService; + } + + + public EntPayService getEntPayService() { + String appid = getAppid(); + WxPayService wxPayService = new WxPayServiceImpl(); + wxPayService.setConfig(getWxPay(appid)); + return new EntPayServiceImpl(wxPayService); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java new file mode 100644 index 0000000..3a96391 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/constant/DistributedIdKey.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.constant; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + + /** + * 直播用户id uid + */ + String MALL4CLOUD_LIVE_ROOM_USER = "mall4cloud-live-room-user"; + + /** + * 分销用户id + */ + String MALL4CLOUD_DISTRIBUTION_USER = "mall4cloud-distribution-user"; + + /** + * 分销提现流水号 + */ + String MALL4CLOUD_DISTRIBUTION_WITHDRAW_ORDER = "mall4cloud-distribution-withdraw-order"; + + /** + * 领券记录id + */ + String MALL4CLOUD_COUPON_USER = "mall4cloud-coupon-user"; +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/bo/AddCouponStockMsgBO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/bo/AddCouponStockMsgBO.java new file mode 100644 index 0000000..54c2ebc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/bo/AddCouponStockMsgBO.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.bo; + +import com.tmerclub.cloud.coupon.bo.mongo.MongoCouponUserBO; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author TRACK + */ +public class AddCouponStockMsgBO { + + private Map couponReturnStockMap; + + private Map> couponUserIdMap; + + public Map getCouponReturnStockMap() { + return couponReturnStockMap; + } + + public void setCouponReturnStockMap(Map couponReturnStockMap) { + this.couponReturnStockMap = couponReturnStockMap; + } + + public Map> getCouponUserIdMap() { + return couponUserIdMap; + } + + public void setCouponUserIdMap(Map> couponUserIdMap) { + this.couponUserIdMap = couponUserIdMap; + } + + @Override + public String toString() { + return "AddCouponStockMsgBO{" + + "couponReturnStockMap=" + couponReturnStockMap + + ", couponUserIdMap=" + couponUserIdMap + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/bo/mongo/MongoCouponUserBO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/bo/mongo/MongoCouponUserBO.java new file mode 100644 index 0000000..dfeef4f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/bo/mongo/MongoCouponUserBO.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.bo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 领券记录mongodb + * @author TRACK + */ +@CompoundIndexes({ + @CompoundIndex(name = "user_idx", def = "{'userId':1}"), + @CompoundIndex(name = "coupon_idx", def = "{'couponId':1}"), + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}") +}) +@Document("coupon_user") +public class MongoCouponUserBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Id + @Schema(description = "优惠券用户ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long couponUserId; + + @Schema(description = "优惠券ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long couponId; + + @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userId; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "领券时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date receiveTime; + + @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date userStartTime; + + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date userEndTime; + + @Schema(description = "优惠券状态 0:失效 1:有效 2:使用过", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "优惠券是否被删除 0:未删除 1:已删除", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer isDelete; + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getUserStartTime() { + return userStartTime; + } + + public void setUserStartTime(Date userStartTime) { + this.userStartTime = userStartTime; + } + + public Date getUserEndTime() { + return userEndTime; + } + + public void setUserEndTime(Date userEndTime) { + this.userEndTime = userEndTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "MongoCouponUserBO{" + + "couponUserId=" + couponUserId + + ", couponId=" + couponId + + ", userId=" + userId + + ", shopId=" + shopId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", receiveTime=" + receiveTime + + ", userStartTime=" + userStartTime + + ", userEndTime=" + userEndTime + + ", status=" + status + + ", isDelete=" + isDelete + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/ValidTimeType.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/ValidTimeType.java new file mode 100644 index 0000000..5ff84da --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/constant/ValidTimeType.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.constant; + +/** + * 优惠券生效时间 + * + * @author yxf + * @date 2020/11/20 + */ +public enum ValidTimeType { + /** + * 固定时间 + */ + FIXED(1), + + /** + * 领取后生效 + */ + RECEIVE(2); + + private final Integer value; + + public Integer value() { + return value; + } + + ValidTimeType(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/UserCouponsDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/UserCouponsDTO.java new file mode 100644 index 0000000..691a3e2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/dto/UserCouponsDTO.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.dto; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 发放用户优惠券DTO + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public class UserCouponsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户id列表 + */ + private List userIds; + /** + * 发放给用户优惠券的数量 + */ + private List sendCoupons; + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public List getSendCoupons() { + return sendCoupons; + } + + public void setSendCoupons(List sendCoupons) { + this.sendCoupons = sendCoupons; + } + + @Override + public String toString() { + return "UserCouponsDTO{" + + "userIds=" + userIds + + ", sendCoupons=" + sendCoupons + + '}'; + } + + public static class SendCoupon implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 优惠券id + */ + private Long couponId; + /** + * 发放给用户优惠券的数量 + */ + private Integer nums; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + @Override + public String toString() { + return "SendCoupon{" + + "couponId=" + couponId + + ", nums=" + nums + + '}'; + } + + public Integer getNums() { + return nums; + } + + public void setNums(Integer nums) { + this.nums = nums; + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/feign/CouponFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/feign/CouponFeignController.java new file mode 100644 index 0000000..36a1e12 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/feign/CouponFeignController.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.feign; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.coupon.constant.PutOnStatus; +import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO; +import com.tmerclub.cloud.api.coupon.dto.ReceiveCouponDTO; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.api.coupon.vo.CouponUserCountDataVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.vo.SpuCouponAppVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.coupon.constant.CouponStatus; +import com.tmerclub.cloud.coupon.constant.SuitableProdType; +import com.tmerclub.cloud.coupon.manager.CouponStockManager; +import com.tmerclub.cloud.coupon.model.Coupon; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; + +/** + * @author FrozenWatermelon + * @date 2020/12/17 + */ +@DubboService +public class CouponFeignController implements CouponFeignClient { + + @Autowired + private CouponService couponService; + @Autowired + private CouponUserService couponUserService; + @Autowired + private CouponStockManager couponStockManager; + + @Override + public ServerResponseEntity> getCouponListByCouponIds(List couponIds) { + List coupons = couponService.getCouponListByCouponIds(couponIds); + List couponDataList = BeanUtil.mapAsList(coupons, CouponDataVO.class); + return ServerResponseEntity.success(couponDataList); + } + + @Override + public ServerResponseEntity> getCouponListByCouponIdsAndPutOnStatus(List couponIds, Integer putOnStatus) { + List coupons = couponService.getCouponListByCouponIdsAndPutOnStatus(couponIds, putOnStatus); + return ServerResponseEntity.success(BeanUtil.mapAsList(coupons, CouponDataVO.class)); + } + + @Override + public ServerResponseEntity batchBindCouponByCouponIds(BindCouponDTO bindCouponDTO) { + couponService.batchBindCouponByCouponIds(bindCouponDTO.getCouponIds(), bindCouponDTO.getUserId()); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity countCanUseCoupon() { + return ServerResponseEntity.success(couponUserService.countCanUseCoupon(AuthUserContext.get().getUserId())); + } + + @Override + public ServerResponseEntity> couponOfSpuDetail(Long shopId, Long spuId) { + // 获取已投放优惠券 + List shopCoupons = couponService.getShopCouponList(shopId); + List coupons = couponService.getShopCouponList(Constant.PLATFORM_SHOP_ID); + coupons.addAll(shopCoupons); + if (CollUtil.isEmpty(coupons)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + coupons.sort(Comparator.comparingLong(CouponAppVO::getCashCondition)); + List couponList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (CouponAppVO coupon : coupons) { + if (Objects.equals(coupon.getSuitableProdType(), SuitableProdType.ALL_SPU.value()) || (coupon.getSpuIds().contains(spuId))) { + if (Objects.equals(coupon.getStatus(), CouponStatus.NO_OVERDUE.value()) && Objects.equals(coupon.getPutonStatus(), PutOnStatus.PUT_ON.value())) { + // 正在投放的优惠券的库存 + Integer stock = couponStockManager.getStockByCouponId(coupon.getCouponId()); + coupon.setStocks(stock); + } + couponList.add(coupon); + } + if (couponList.size() >= Constant.SIZE_OF_THREE) { + break; + } + } + return ServerResponseEntity.success(BeanUtil.mapAsList(couponList, SpuCouponAppVO.class)); + } + + @Override + public ServerResponseEntity countCouponUserByUserId(Long userId, Long shopId) { + CouponUserCountDataVO couponUserCountDataVO = couponUserService.countCouponUserByUserId(userId, shopId); + return ServerResponseEntity.success(couponUserCountDataVO); + } + + @Override + public ServerResponseEntity> countMemberCouponByParam(Long shopId, Date startTime, Date endTime) { + return ServerResponseEntity.success(couponUserService.countMemberCouponByParam(shopId, startTime, endTime)); + } + + @Override + public ServerResponseEntity handleSpuOffline(List spuIds, List shopIds) { + couponService.handleSpuOffline(spuIds, shopIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity handleShopOffline(List shopIds) { + couponService.handleShopOffline(shopIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> userReceiveCouponCount(ReceiveCouponDTO receiveCouponDTO) { + if (CollUtil.isEmpty(receiveCouponDTO.getUserIds())) { + return ServerResponseEntity.success(new ArrayList<>()); + } + List receiveCouponList = couponUserService.userReceiveCouponCount(receiveCouponDTO); + return ServerResponseEntity.success(receiveCouponList); + } + + @Override + public ServerResponseEntity getStockByCouponId(Long couponId) { + return ServerResponseEntity.success(couponStockManager.getStockByCouponId(couponId)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/AddCouponStockConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/AddCouponStockConsumer.java new file mode 100644 index 0000000..f3af865 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/AddCouponStockConsumer.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.listener; + +import com.tmerclub.cloud.common.cache.config.MultiRedisConfig; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.coupon.bo.AddCouponStockMsgBO; +import com.tmerclub.cloud.coupon.bo.mongo.MongoCouponUserBO; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ADD_COUPON_STOCK_TOPIC, consumerGroup = RocketMqConstant.ADD_COUPON_STOCK_TOPIC) +public class AddCouponStockConsumer implements RocketMQListener { + private static final Logger logger = LoggerFactory.getLogger(AddCouponStockConsumer.class); + + @Autowired + private CouponUserService couponUserService; + @Autowired + private MultiRedisConfig multiRedisConfig; + + /** + * 优惠券库存回退 + */ + @Override + public void onMessage(AddCouponStockMsgBO addCouponStockMsgBO) { + Map couponReturnStockMap = addCouponStockMsgBO.getCouponReturnStockMap(); + Map> couponUserIdMap = addCouponStockMsgBO.getCouponUserIdMap(); + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long couponId : couponReturnStockMap.keySet()) { + Integer count = Math.abs(couponReturnStockMap.get(couponId)); + List userIdList = couponUserIdMap.get(couponId); + logger.info("用户删除优惠券{},还原库存{},用户量{}", couponId, count, userIdList.size()); + couponUserService.addCouponStock(couponId, count, userIdList); + for (MongoCouponUserBO mongoCouponUserBO : userIdList) { + keys.add(MultiStockEnum.COUPON.value() + "addLock:" + couponId + Constant.UNDERLINE + mongoCouponUserBO.getUserId() + + Constant.UNDERLINE + mongoCouponUserBO.getCouponUserId()); + } + } + // 在里面加锁定记录,然后全部完成之后再一次删除掉,保证幂等,这里删除异常也没事,有mq重试 + int redisCount = multiRedisConfig.getRedisCount(); + for (int i = 0; i < redisCount; i++) { + StringRedisTemplate stringRedisTemplate = multiRedisConfig.getRedisByIndex(i); + stringRedisTemplate.delete(keys); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/CouponGiveConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/CouponGiveConsumer.java new file mode 100644 index 0000000..e269729 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/CouponGiveConsumer.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.listener; + +import com.tmerclub.cloud.api.coupon.bo.CouponGiveBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.coupon.service.CouponUserService; +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; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.COUPON_GIVE_TOPIC, consumerGroup = RocketMqConstant.COUPON_GIVE_TOPIC) +public class CouponGiveConsumer implements RocketMQListener { + + @Autowired + private CouponUserService couponUserService; + + + /** + * 赠送优惠券给用户 + * + * @param couponGiveBO + */ + @Override + public void onMessage(CouponGiveBO couponGiveBO) { + couponUserService.giveCoupon(couponGiveBO); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/LevelDownCouponExpireConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/LevelDownCouponExpireConsumer.java new file mode 100644 index 0000000..d5ad7b5 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/LevelDownCouponExpireConsumer.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.List; + +/** + * @author cl + * @date 2021-06-05 16:58:36 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.LEVEL_DOWN_COUPON_EXPIRE_TOPIC, consumerGroup = RocketMqConstant.LEVEL_DOWN_COUPON_EXPIRE_TOPIC) +public class LevelDownCouponExpireConsumer implements RocketMQListener> { + private static final Logger logger = LoggerFactory.getLogger(LevelDownCouponExpireConsumer.class); + + @Autowired + private CouponUserService couponUserService; + @Autowired + private CouponService couponService; + + /** + * 等级减低失效用户优惠券 + * + * @param bindCouponDTOList 用户失效优惠券 + */ + @Override + public void onMessage(List bindCouponDTOList) { + logger.info("等级减低失效优惠券{}", bindCouponDTOList); + Collection couponIds = couponUserService.batchDeleteUserCoupon(bindCouponDTOList); + if (CollUtil.isEmpty(couponIds)) { + return; + } + for (Long couponId : couponIds) { + couponService.removeCacheByShopId(null, couponId); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/LevelUpCouponGiveConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/LevelUpCouponGiveConsumer.java new file mode 100644 index 0000000..031831a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/LevelUpCouponGiveConsumer.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.coupon.dto.BindCouponDTO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.service.CouponUserService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.List; + +/** + * @author cl + * @date 2021-05-17 14:58:36 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.LEVEL_UP_COUPON_GIVE_TOPIC, consumerGroup = RocketMqConstant.LEVEL_UP_COUPON_GIVE_TOPIC) +public class LevelUpCouponGiveConsumer implements RocketMQListener> { + private static final Logger logger = LoggerFactory.getLogger(LevelUpCouponGiveConsumer.class); + + @Autowired + private CouponUserService couponUserService; + + @Autowired + private CouponService couponService; + + /** + * 等级提升发送优惠券给客户 + * + * @param bindCouponDTOList 用户绑定优惠券 + */ + @Override + public void onMessage(List bindCouponDTOList) { + logger.info("等级提升发放优惠券给用户{}", bindCouponDTOList); + Collection couponIds = couponUserService.batchBindCoupon(bindCouponDTOList); + if (CollUtil.isEmpty(couponIds)) { + return; + } + for (Long couponId : couponIds) { + couponService.removeCacheByShopId(null, couponId); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/OrderNotifyCouponConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/OrderNotifyCouponConsumer.java new file mode 100644 index 0000000..f1e1ae1 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/OrderNotifyCouponConsumer.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.listener; + +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.coupon.service.CouponLockService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_COUPON_GROUP) +public class OrderNotifyCouponConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifyCouponConsumer.class); + + @Autowired + private CouponLockService couponLockService; + + + /** + * 订单支付成功,将优惠券标记成已使用状态 + * + * @param message + */ + @Override + public void onMessage(PayNotifyBO message) { + // 普通订单和预售订单才能使用优惠券 + if (!Objects.equals(message.getOrderType(), OrderType.ORDINARY.value())) { + return; + } + LOG.info("订单支付成功,将优惠券标记成已使用状态... message: {}", Json.toJsonString(message)); + couponLockService.markerCouponUse(message.getOrderIds()); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/OrderRefundSuccessCouponConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/OrderRefundSuccessCouponConsumer.java new file mode 100644 index 0000000..12f4cf5 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/listener/OrderRefundSuccessCouponConsumer.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.listener; + +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.common.order.bo.RefundNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.coupon.service.CouponLockService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SUCCESS_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SUCCESS_COUPON_GROUP) +public class OrderRefundSuccessCouponConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderRefundSuccessCouponConsumer.class); + + @Autowired + private CouponLockService couponLockService; + + + /** + * 订单退款,还原商家优惠券,平台券无法还原 + * + * @param message + */ + @Override + public void onMessage(RefundNotifyBO message) { + if (message.getCanRefund() && Objects.equals(message.getOrderStatus(), OrderStatus.CLOSE.value())) { + LOG.info("订单退款成功,还原商家优惠券... message: {}", Json.toJsonString(message)); + couponLockService.reductionCoupon(message.getOrderId()); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponLockMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponLockMapper.java new file mode 100644 index 0000000..8bea380 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponLockMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.mapper; + +import com.tmerclub.cloud.coupon.model.CouponLock; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 优惠券使用记录 + * + * @author FrozenWatermelon + * @date 2020-12-28 10:04:50 + */ +public interface CouponLockMapper { + + /** + * 批量保存使用记录 + * + * @param couponLocks + */ + void saveBatch(@Param("couponLocks") List couponLocks); + + /** + * 获取需要解锁的、用户所领取的优惠券 + * + * @param orderId 订单id + * @return 用户所领取的优惠券id + */ + List listCouponUserIdsByOrderId(Long orderId); + + /** + * 将锁定状态标记为已解锁 + * + * @param couponUserIds 用户所领取的优惠券id + * @return + */ + int unLockByIds(@Param("couponUserIds") List couponUserIds); + + /** + * 正式锁定优惠券,标记为使用状态 + * + * @param orderIds 订单ids + */ + void markerCouponUse(@Param("orderIds") List orderIds); + + /** + * 获取用户在该订单使用的优惠 + * + * @param orderId + * @return + */ + List getUserCouponIdByOrderId(@Param("orderId") String orderId); + + /** + * 通过用户优惠券id,获取待确认、已锁定的 优惠券使用记录 + * @param couponUserIds 用户优惠券id集合 + * @return 优惠券使用记录集合 + */ + List getUnConfirmAndLockCoupon(@Param("couponUserIds") List couponUserIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponMapper.java new file mode 100644 index 0000000..f57f6a6 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponMapper.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.mapper; + +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.order.vo.CouponOrderVO; +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.model.Coupon; +import com.tmerclub.cloud.coupon.vo.CouponAppVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 优惠券 + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public interface CouponMapper { + + /** + * 获取优惠券列表 + * + * @param couponDTO + * @return 优惠券列表 + */ + List list(@Param("coupon") CouponDTO couponDTO); + + /** + * 获取优惠券列表 + * + * @param couponDTO + * @return 优惠券列表 + */ + List adminList(@Param("coupon") CouponDTO couponDTO); + + /** + * 获取店铺的可用的优惠券列表 + * + * @param shopId + * @return + */ + List getAvailableShopCouponList(@Param("shopId") Long shopId); + + /** + * 根据优惠券id获取优惠券 + * + * @param couponId 优惠券id + * @return 优惠券 + */ + Coupon getByCouponId(@Param("couponId") Long couponId); + + /** + * 保存优惠券 + * + * @param coupon 优惠券 + */ + void save(@Param("coupon") Coupon coupon); + + /** + * 更新优惠券 + * + * @param coupon 优惠券 + */ + void update(@Param("coupon") Coupon coupon); + + /** + * 更新优惠券 + * + * @param coupon 优惠券 + */ + void updateCoupon(@Param("coupon") CouponDTO coupon); + + /** + * 根据优惠券id,获取优惠券及关联的商品列表信息 + * + * @param couponId + * @return + */ + CouponVO getCouponAndCouponProdsByCouponId(@Param("couponId") Long couponId); + + /** + * 根据优惠券id,获取优惠券列表 + * + * @param couponIds + * @return 优惠券列表 + */ + List getListByCouponIds(@Param("couponIds") List couponIds); + + /** + * 根据用户,返回对应的店铺优惠券列表 + * + * @param userId + * @return + */ + List generalCouponList(@Param("userId") Long userId); + + /** + * 根据优惠券id列表,获取优惠券列表 + * + * @param couponIds + * @param putOnStatus + * @return + */ + List getCouponListByCouponIds(@Param("couponIds") List couponIds, @Param("putOnStatus") Integer putOnStatus); + + /** + * 根据店铺和用户id,获取优惠券列表 + * @param couponIds + * @return + */ + List getCouponListByUserIdAndShopId(@Param("couponIds") List couponIds); + + /** + * 商品优惠券分页 + * + * @param page + * @param userId + * @return + */ + List getProdCouponList(@Param("page") PageAdapter page, @Param("userId") Long userId); + + /** + * 获取商品优惠券的数量 + * + * @return + */ + Long getProdCouponListCount(); + + /** + * 更新活动投放状态、过期状态 + * + * @param couponId + * @param putOnStatus 投放状态 + * @param status 过期状态 + */ + void changeCouponStatusAndPutOnStatus(@Param("couponId") Long couponId, @Param("putOnStatus") Integer putOnStatus, @Param("status") Integer status); + + /** + * 查询已经过期的优惠券的店铺有哪些 + * + * @return 店铺id列表 + */ + List listOverdueStatusShopIds(); + + /** + * 取消投放已过期的优惠券 + */ + void cancelPut(); + + /** + * 投放优惠券 + */ + void putonCoupon(); + + /** + * 根据商品id列表,获取优惠券 + * + * @param spuIds + * @param shopIds + * @return + */ + List listCouponBySpuIds(@Param("spuIds") List spuIds, @Param("shopIds") List shopIds); + + /** + * 根据优惠券id列表,下线优惠券 + * @param couponIds + */ + void batchOfflineByDiscountIdsAndStatus(@Param("couponIds") List couponIds); + + /** + * 获取取消投放的优惠券id + * @return + */ + List cancelPutCouponIds(); + + /** + * 根据店铺id列表,获取满减活动id列表 + * + * @param shopIds 店铺id列表 + * @return 满减活动id列表 + */ + List listIdByShopIds(@Param("shopIds") List shopIds); + + /** + * 根据活动id列表,批量下线活动 + * + * @param couponIds + */ + void batchOfflineByCouponIds(@Param("couponIds") List couponIds); + + /** + * 更新库存 + * @param couponId + * @param changeStock + */ + void updateStockById(@Param("couponId") Long couponId, @Param("changeStock") Integer changeStock); + + /** + * 获取可能需要落库的正在进行的优惠券活动 + * @return + */ + List listMaybeNeedStockPlacementActivity(); + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponSpuMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponSpuMapper.java new file mode 100644 index 0000000..aa0ebab --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponSpuMapper.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.mapper; + +import com.tmerclub.cloud.coupon.model.CouponSpu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 优惠券商品关联信息 + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public interface CouponSpuMapper { + /** + * 批量保存优惠券商品关联信息 + * + * @param couponSpus 优惠券商品关联信息列表 + */ + void saveBatch(@Param("couponSpus") List couponSpus); + + /** + * 根据优惠券id及spuId列表删除优惠券商品关联信息 + * + * @param couponId + * @param spuIds + */ + void deleteByCouponIdAndSpuIds(@Param("couponId") Long couponId, @Param("spuIds") List spuIds); + + /** + * 根据商品id列表,删除优惠券关联商品信息 + * + * @param spuIds + */ + void deleteBySpuIds(@Param("spuIds") List spuIds); + + /** + * 根据优惠券id列表,删除优惠券关联商品信息 + * + * @param couponIds + */ + void deleteBatchByCouponIds(@Param("couponIds") List couponIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponUserMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponUserMapper.java new file mode 100644 index 0000000..2486fef --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/mapper/CouponUserMapper.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.mapper; + +import com.tmerclub.cloud.coupon.model.CouponUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 优惠券用户关联信息 + * @author YXF + */ +public interface CouponUserMapper { + + /** + * 获取保存到mongodb的领券记录 + * @param start + * @param size + * @return + */ + List listToMongodb(@Param("start") int start, @Param("size") int size); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponGiveLog.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponGiveLog.java new file mode 100644 index 0000000..94e7b0b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponGiveLog.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 优惠券赠送记录 + * + * @author FrozenWatermelon + * @date 2021-04-28 16:25:05 + */ +public class CouponGiveLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 赠送业务类型 1充值赠送 + */ + private Integer bizType; + + /** + * 业务id(充值记录id) + */ + private Long bizId; + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + @Override + public String toString() { + return "CouponGiveLog{" + + "bizType=" + bizType + + ",bizId=" + bizId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponLock.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponLock.java new file mode 100644 index 0000000..d819524 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponLock.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 优惠券使用记录 + * + * @author FrozenWatermelon + * @date 2020-12-28 10:04:50 + */ +public class CouponLock extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 优惠券使用记录id + */ + private Long id; + + /** + * 优惠券id + */ + private Long couponId; + + /** + * 用户优惠券id + */ + private Long couponUserId; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单号 + */ + private String orderIds; + + /** + * 优惠金额 + */ + private Long amount; + + /** + * 使用状态(状态-1已解锁 0待确定 1已锁定) + */ + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "CouponLock{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",couponId=" + couponId + + ",couponUserId=" + couponUserId + + ",userId=" + userId + + ",orderIds=" + orderIds + + ",amount=" + amount + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponUser.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponUser.java new file mode 100644 index 0000000..75f2c8b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/model/CouponUser.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 优惠券用户关联信息 + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public class CouponUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 优惠券用户ID + */ + private Long couponUserId; + + /** + * 优惠券ID + */ + private Long couponId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 领券时间 + */ + private Date receiveTime; + + /** + * 开始时间 + */ + private Date userStartTime; + + /** + * 结束时间 + */ + private Date userEndTime; + + /** + * 优惠券状态 0:失效 1:有效 2:使用过 + */ + private Integer status; + + /** + * 优惠券是否被删除 0:未删除 1:已删除 + */ + private Integer isDelete; + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getUserStartTime() { + return userStartTime; + } + + public void setUserStartTime(Date userStartTime) { + this.userStartTime = userStartTime; + } + + public Date getUserEndTime() { + return userEndTime; + } + + public void setUserEndTime(Date userEndTime) { + this.userEndTime = userEndTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "CouponUser{" + + "couponUserId=" + couponUserId + + ", couponId=" + couponId + + ", userId=" + userId + + ", shopId=" + shopId + + ", receiveTime=" + receiveTime + + ", userStartTime=" + userStartTime + + ", userEndTime=" + userEndTime + + ", status=" + status + + ", isDelete=" + isDelete + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponGiveLogService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponGiveLogService.java new file mode 100644 index 0000000..14f6c48 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponGiveLogService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.coupon.model.CouponGiveLog; + +/** + * 优惠券赠送记录 + * + * @author FrozenWatermelon + * @date 2021-04-28 16:25:05 + */ +public interface CouponGiveLogService { + + /** + * 分页获取优惠券赠送记录列表 + * @param pageDTO 分页参数 + * @return 优惠券赠送记录列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据优惠券赠送记录id获取优惠券赠送记录 + * + * @param bizType 优惠券赠送记录id + * @return 优惠券赠送记录 + */ + CouponGiveLog getByBizType(Long bizType); + + /** + * 保存优惠券赠送记录 + * @param couponGiveLog 优惠券赠送记录 + */ + void save(CouponGiveLog couponGiveLog); + + /** + * 更新优惠券赠送记录 + * @param couponGiveLog 优惠券赠送记录 + */ + void update(CouponGiveLog couponGiveLog); + + /** + * 根据优惠券赠送记录id删除优惠券赠送记录 + * @param bizType 优惠券赠送记录id + */ + void deleteById(Long bizType); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponLockService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponLockService.java new file mode 100644 index 0000000..6c269b6 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponLockService.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service; + +import com.tmerclub.cloud.api.coupon.dto.LockCouponDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.coupon.model.CouponLock; + +import java.util.List; + +/** + * 优惠券使用记录 + * + * @author FrozenWatermelon + * @date 2020-12-28 10:04:50 + */ +public interface CouponLockService { + + /** + * 锁定订优惠券状态 + * @param lockCouponParams 订单id和优惠券id关联信息 + * @return void + */ + ServerResponseEntity lockCoupon(List lockCouponParams); + + /** + * 根据订单号进行优惠券解锁 + * @param orderIds 订单ids + */ + void unlockCoupon(List orderIds); + + /** + * 正式锁定优惠券,标记为使用状态 + * @param orderIds 订单ids + */ + void markerCouponUse(List orderIds); + + /** + * 还原订单使用的商家优惠券 + * @param orderId + */ + void reductionCoupon(Long orderId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponSpuService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponSpuService.java new file mode 100644 index 0000000..f752fb6 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/CouponSpuService.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service; + +import com.tmerclub.cloud.coupon.dto.CouponDTO; +import com.tmerclub.cloud.coupon.vo.CouponVO; + +import java.util.List; + +/** + * 优惠券商品关联信息 + * + * @author YXF + * @date 2020-12-08 17:22:57 + */ +public interface CouponSpuService { + /** + * 保存优惠券商品关联信息 + * @param couponId 优惠券id + * @param spuIds 商品id列表 + */ + void save(Long couponId, List spuIds); + + /** + * 更新优惠券商品关联信息 + * @param couponDTO 更新的优惠券信息 + * @param couponDb 旧的优惠券信息 + */ + void update(CouponDTO couponDTO, CouponVO couponDb); + + /** + * 根据商品id列表,删除优惠券关联商品信息 + * @param spuIds + */ + void deleteBySpuIds(List spuIds); + + /** + * 删除优惠券关联商品信息 + * + * @param couponIds + */ + void deleteBatchByCouponIds(List couponIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponGiveLogServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponGiveLogServiceImpl.java new file mode 100644 index 0000000..c612d81 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/service/impl/CouponGiveLogServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.coupon.mapper.CouponGiveLogMapper; +import com.tmerclub.cloud.coupon.model.CouponGiveLog; +import com.tmerclub.cloud.coupon.service.CouponGiveLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 优惠券赠送记录 + * + * @author FrozenWatermelon + * @date 2021-04-28 16:25:05 + */ +@Service +public class CouponGiveLogServiceImpl implements CouponGiveLogService { + + @Autowired + private CouponGiveLogMapper couponGiveLogMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> couponGiveLogMapper.list()); + } + + @Override + public CouponGiveLog getByBizType(Long bizType) { + return couponGiveLogMapper.getByBizType(bizType); + } + + @Override + public void save(CouponGiveLog couponGiveLog) { + couponGiveLogMapper.save(couponGiveLog); + } + + @Override + public void update(CouponGiveLog couponGiveLog) { + couponGiveLogMapper.update(couponGiveLog); + } + + @Override + public void deleteById(Long bizType) { + couponGiveLogMapper.deleteById(bizType); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponAppVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponAppVO.java new file mode 100644 index 0000000..9d6f1d0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponAppVO.java @@ -0,0 +1,369 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 优惠券VO + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public class CouponAppVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户已领取该优惠券 + */ + public static final Integer RECEIVE = 1; + + /** + * 用户未领取该优惠券 + */ + public static final Integer NOT_RECEIVE = 0; + + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "店铺名") + private String shopName; + + @Schema(description = "店铺logo") + private String shopLogo; + + @Schema(description = "优惠券名称") + private String couponName; + + @Schema(description = "副标题") + private String subTitle; + + @Schema(description = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableProdType; + + @Schema(description = "获取方式 0=用户领取 1=店铺发放") + private Integer getWay; + + @Schema(description = "生效类型 1:固定时间 2:领取后生效") + private Integer validTimeType; + + @Schema(description = "使用条件") + private Long cashCondition; + + @Schema(description = "减免金额") + private Long reduceAmount; + + @Schema(description = "折扣额度") + private Double couponDiscount; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "领券后X天起生效") + private Integer afterReceiveDays; + + @Schema(description = "有效天数") + private Integer validDays; + + @Schema(description = "总库存") + private Integer totalStock; + + @Schema(description = "库存") + private Integer stocks; + + @Schema(description = "每个用户领券上限,如不填则默认为1") + private Integer limitNum; + + @Schema(description = "优惠券状态 0:过期 1:未过期") + private Integer status; + + @Schema(description = "优惠券投放状态(-1:取消投放 0:自动投放 1:投放 2:违规下架 3:等待审核 4:暂不投放)") + private Integer putonStatus; + + @Schema(description = "商品Id列表") + private List spuIds; + + @Schema(description = "商品列表") + private List spus; + + @Schema(description = "领券时间") + private Date receiveTime; + + @Schema(description = "已领取优惠券的数量(null/0:没有领取)") + private Integer hasReceive; + + @Schema(description = "领取优惠券id") + private Long couponUserId; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Integer getSuitableProdType() { + return suitableProdType; + } + + public void setSuitableProdType(Integer suitableProdType) { + this.suitableProdType = suitableProdType; + } + + public Integer getGetWay() { + return getWay; + } + + public void setGetWay(Integer getWay) { + this.getWay = getWay; + } + + public Integer getValidTimeType() { + return validTimeType; + } + + public void setValidTimeType(Integer validTimeType) { + this.validTimeType = validTimeType; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAfterReceiveDays() { + return afterReceiveDays; + } + + public void setAfterReceiveDays(Integer afterReceiveDays) { + this.afterReceiveDays = afterReceiveDays; + } + + public Integer getValidDays() { + return validDays; + } + + public void setValidDays(Integer validDays) { + this.validDays = validDays; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getLimitNum() { + return limitNum; + } + + public void setLimitNum(Integer limitNum) { + this.limitNum = limitNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPutonStatus() { + return putonStatus; + } + + public void setPutonStatus(Integer putonStatus) { + this.putonStatus = putonStatus; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getSpus() { + return spus; + } + + public void setSpus(List spus) { + this.spus = spus; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Integer getHasReceive() { + return hasReceive; + } + + public void setHasReceive(Integer hasReceive) { + this.hasReceive = hasReceive; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + @Override + public String toString() { + return "CouponAppVO{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", couponName='" + couponName + '\'' + + ", subTitle='" + subTitle + '\'' + + ", couponType=" + couponType + + ", suitableProdType=" + suitableProdType + + ", getWay=" + getWay + + ", validTimeType=" + validTimeType + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", afterReceiveDays=" + afterReceiveDays + + ", validDays=" + validDays + + ", totalStock=" + totalStock + + ", stocks=" + stocks + + ", limitNum=" + limitNum + + ", status=" + status + + ", putonStatus=" + putonStatus + + ", spuIds=" + spuIds + + ", spus=" + spus + + ", receiveTime=" + receiveTime + + ", hasReceive=" + hasReceive + + ", couponUserId=" + couponUserId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponVO.java new file mode 100644 index 0000000..4938c72 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/CouponVO.java @@ -0,0 +1,349 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 优惠券VO + * + * @author YXF + * @date 2020-12-08 17:22:56 + */ +public class CouponVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "优惠券名称") + private String couponName; + + @Schema(description = "副标题") + private String subTitle; + + @Schema(description = "优惠类型 1:代金券 2:折扣券 3:兑换券") + private Integer couponType; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableProdType; + + @Schema(description = "获取方式 0=用户领取 1=店铺发放") + private Integer getWay; + + @Schema(description = "生效类型 1:固定时间 2:领取后生效") + private Integer validTimeType; + + @Schema(description = "使用条件") + private Long cashCondition; + + @Schema(description = "减免金额") + private Long reduceAmount; + + @Schema(description = "折扣额度") + private Double couponDiscount; + + @Schema(description = "投放时间") + private Date launchTime; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "领券后X天起生效") + private Integer afterReceiveDays; + + @Schema(description = "有效天数") + private Integer validDays; + + @Schema(description = "总库存") + private Integer totalStock; + + @Schema(description = "库存") + private Integer stocks; + + @Schema(description = "每个用户领券上限,如不填则默认为1") + private Integer limitNum; + + @Schema(description = "优惠券状态 0:过期 1:未过期") + private Integer status; + + @Schema(description = "优惠券投放状态(-1:取消投放 0:自动投放 1:投放 2:违规下架 3:等待审核 4:暂不投放)") + private Integer putonStatus; + + @Schema(description = "商品Id列表") + private List spuIds; + + @Schema(description = "商品列表") + private List spus; + + @Schema(description = "用户拥有的优惠券数量") + private Integer couponCount; + + @Schema(description = "领券时间") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date receiveTime; + + @Schema(description = "店铺名称") + private String shopName; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getCouponName() { + return couponName; + } + + public void setCouponName(String couponName) { + this.couponName = couponName; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } + + public Integer getCouponType() { + return couponType; + } + + public void setCouponType(Integer couponType) { + this.couponType = couponType; + } + + public Integer getSuitableProdType() { + return suitableProdType; + } + + public void setSuitableProdType(Integer suitableProdType) { + this.suitableProdType = suitableProdType; + } + + public Integer getGetWay() { + return getWay; + } + + public void setGetWay(Integer getWay) { + this.getWay = getWay; + } + + public Integer getValidTimeType() { + return validTimeType; + } + + public void setValidTimeType(Integer validTimeType) { + this.validTimeType = validTimeType; + } + + public Long getCashCondition() { + return cashCondition; + } + + public void setCashCondition(Long cashCondition) { + this.cashCondition = cashCondition; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Double getCouponDiscount() { + return couponDiscount; + } + + public void setCouponDiscount(Double couponDiscount) { + this.couponDiscount = couponDiscount; + } + + public Date getLaunchTime() { + return launchTime; + } + + public void setLaunchTime(Date launchTime) { + this.launchTime = launchTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAfterReceiveDays() { + return afterReceiveDays; + } + + public void setAfterReceiveDays(Integer afterReceiveDays) { + this.afterReceiveDays = afterReceiveDays; + } + + public Integer getValidDays() { + return validDays; + } + + public void setValidDays(Integer validDays) { + this.validDays = validDays; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getLimitNum() { + return limitNum; + } + + public void setLimitNum(Integer limitNum) { + this.limitNum = limitNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPutonStatus() { + return putonStatus; + } + + public void setPutonStatus(Integer putonStatus) { + this.putonStatus = putonStatus; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getSpus() { + return spus; + } + + public void setSpus(List spus) { + this.spus = spus; + } + + public Integer getCouponCount() { + return couponCount; + } + + public void setCouponCount(Integer couponCount) { + this.couponCount = couponCount; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + @Override + public String toString() { + return "CouponVO{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", couponName='" + couponName + '\'' + + ", subTitle='" + subTitle + '\'' + + ", couponType=" + couponType + + ", suitableProdType=" + suitableProdType + + ", getWay=" + getWay + + ", validTimeType=" + validTimeType + + ", cashCondition=" + cashCondition + + ", reduceAmount=" + reduceAmount + + ", couponDiscount=" + couponDiscount + + ", launchTime=" + launchTime + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", afterReceiveDays=" + afterReceiveDays + + ", validDays=" + validDays + + ", totalStock=" + totalStock + + ", stocks=" + stocks + + ", limitNum=" + limitNum + + ", status=" + status + + ", putonStatus=" + putonStatus + + ", spuIds=" + spuIds + + ", spus=" + spus + + ", couponCount=" + couponCount + + ", receiveTime=" + receiveTime + + ", shopName='" + shopName + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponOrderVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponOrderVO.java new file mode 100644 index 0000000..04bb3f3 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponOrderVO.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author TRACK + */ +@Document("coupon_user") +public class MongoCouponOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "用户优惠券id") + private Long couponUserId; + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + @Override + public String toString() { + return "MongoCouponOrderVO{" + + "couponId=" + couponId + + ", shopId=" + shopId + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", couponUserId=" + couponUserId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponUserVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponUserVO.java new file mode 100644 index 0000000..17d48e9 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/coupon/vo/mongo/MongoCouponUserVO.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.coupon.vo.mongo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import com.tmerclub.cloud.coupon.vo.CouponVO; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * mongodb优惠券用户关联信息VO + * @author YXF + */ +@Document("coupon_user") +public class MongoCouponUserVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "优惠券用户ID") + private Long couponUserId; + + @Schema(description = "优惠券ID") + private Long couponId; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "领券时间") + private Date receiveTime; + + @Schema(description = "开始时间") + private Date userStartTime; + + @Schema(description = "结束时间") + private Date userEndTime; + + @Schema(description = "优惠券状态 0:失效 1:有效 2:使用过") + private Integer status; + + @Schema(description = "优惠券是否被删除 0:未删除 1:已删除") + private Integer isDelete; + + @Schema(description = "优惠券信息") + private CouponVO couponVO; + + public Long getCouponUserId() { + return couponUserId; + } + + public void setCouponUserId(Long couponUserId) { + this.couponUserId = couponUserId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getUserStartTime() { + return userStartTime; + } + + public void setUserStartTime(Date userStartTime) { + this.userStartTime = userStartTime; + } + + public Date getUserEndTime() { + return userEndTime; + } + + public void setUserEndTime(Date userEndTime) { + this.userEndTime = userEndTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public CouponVO getCouponVO() { + return couponVO; + } + + public void setCouponVO(CouponVO couponVO) { + this.couponVO = couponVO; + } + + @Override + public String toString() { + return "CouponUserVO{" + + "couponUserId=" + couponUserId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",couponId=" + couponId + + ",userId=" + userId + + ",receiveTime=" + receiveTime + + ",userStartTime=" + userStartTime + + ",userEndTime=" + userEndTime + + ",status=" + status + + ",isDelete=" + isDelete + + ",couponVO=" + couponVO + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/constant/DiscountStatusEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/constant/DiscountStatusEnum.java new file mode 100644 index 0000000..eb04bd7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/constant/DiscountStatusEnum.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.constant; + +/** + * 满减满折活动状态枚举 + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public enum DiscountStatusEnum { + + /** 关闭 */ + CLOSE(0, "关闭"), + + /** 启动 */ + RUN(1, "启动"), + + /** 违规下线 */ + OFFLINE(2, "违规下线"), + + /** 平台审核 */ + PLATFORM_AUDIT(3, "平台审核"); + + private final Integer value; + private final String desc; + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } + + DiscountStatusEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } +} + diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/constant/SuitableProdTypeEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/constant/SuitableProdTypeEnum.java new file mode 100644 index 0000000..671c30d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/constant/SuitableProdTypeEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.constant; + +/** + * 等级 + * + * @author yxf + * @date 2020/11/20 + */ +public enum SuitableProdTypeEnum { + + /** + * 全部商品参与 + */ + ALL_SPU(0), + + /** + * 指定商品参与 + */ + ASSIGN_SPU(1); + + private final Integer value; + + public Integer value() { + return value; + } + + SuitableProdTypeEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/admin/DiscountController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/admin/DiscountController.java new file mode 100644 index 0000000..7837733 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/admin/DiscountController.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.discount.constant.DiscountStatusEnum; +import com.tmerclub.cloud.discount.dto.DiscountDTO; +import com.tmerclub.cloud.discount.service.DiscountService; +import com.tmerclub.cloud.discount.service.DiscountSpuService; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + + +/** + * @author lhd + * @date 2020-12-17 15:10:00 + */ +@RestController("adminDiscountController") +@RequestMapping("/mp/discount") +public class DiscountController { + + @Autowired + private DiscountService discountService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @Autowired + private DiscountSpuService discountSpuService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取满减活动列表", description = "获取满减活动列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, DiscountDTO transportDTO) { + Long tenantId = AuthUserContext.get().getTenantId(); + transportDTO.setShopId(tenantId); + PageVO transports = discountService.page(pageDTO, transportDTO); + return ServerResponseEntity.success(transports); + } + + @GetMapping("/platform_page") + @Operation(summary = "平台满减活动管理列表", description = "平台满减活动管理列表") + public ServerResponseEntity> platformPage(@Valid PageDTO pageDTO, DiscountDTO transportDTO) { + PageVO transports = discountService.platformPage(pageDTO, transportDTO); + return ServerResponseEntity.success(transports); + } + + /** + * 获取信息 + */ + @GetMapping("/info/{discountId}") + public ServerResponseEntity info(@PathVariable("discountId") Long discountId) { + Long shopId = AuthUserContext.get().getTenantId(); + DiscountVO discount = discountService.getDiscountAndSpu(discountId); + if (Objects.isNull(discount)) { + throw new LuckException("该活动不存在或者已删除"); + } else if (!Objects.equals(shopId, discount.getShopId()) && !Objects.equals(Constant.PLATFORM_SHOP_ID, shopId)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 指定商品 + if (CollUtil.isNotEmpty(discount.getSpuIds())) { + ServerResponseEntity> spuResponse = searchSpuFeignClient.listSpuBySpuIds(discount.getSpuIds()); + discount.setSpuList(spuResponse.getData()); + } + return ServerResponseEntity.success(discount); + } + + /** + * 保存 + */ + @PostMapping + public ServerResponseEntity save(@RequestBody @Valid DiscountDTO discountDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + discountDTO.setShopId(shopId); + discountService.insertDiscountAndItemAndSpu(discountDTO); + discountService.removeDiscountCache(discountDTO.getDiscountId(), shopId); + spuFeignClient.removeSpuActivityCache(discountDTO.getShopId(), discountDTO.getSpuIds()); + return ServerResponseEntity.success(); + } + + + /** + * 修改 + */ + @PutMapping + public ServerResponseEntity update(@RequestBody @Valid DiscountDTO discountDTO) { + DiscountVO discountDb = discountService.getDiscountAndSpu(discountDTO.getDiscountId()); + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(discountDb.getShopId(), shopId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + ServerResponseEntity shopResponEntity = shopDetailFeignClient.getShopByShopId(shopId); + EsShopDetailBO shopDetail = shopResponEntity.getData(); + if (!Objects.equals(shopDetail.getShopStatus(), ShopStatus.OPEN.value())) { + throw new LuckException("店铺状态异常,无法开启满减活动"); + } + List spuIds = discountSpuService.listSpuIdByDiscountId(discountDb.getDiscountId()); + if (discountDb.getStatus() > DiscountStatusEnum.RUN.getValue() && discountDb.getStatus() < DiscountStatusEnum.OFFLINE.getValue()) { + // 该活动已被平台下线,不能再更改状态 + throw new LuckException("该活动已被平台下线,不能再更改状态"); + } + discountService.updateDiscountAndItemAndSpu(discountDTO); + discountService.removeDiscountCache(discountDb.getDiscountId(), discountDb.getShopId()); + + // 适用商品类型发生改变,清除店铺所有商品的缓存(全部商品转指定商品, 指定商品转全部商品) + if (!Objects.equals(discountDb.getSuitableSpuType(), discountDTO.getSuitableSpuType())) { + spuIds.clear(); + } + if (CollUtil.isNotEmpty(spuIds)) { + CollUtil.addAllIfNotContains(spuIds, discountDTO.getSpuIds()); + } + spuFeignClient.removeSpuActivityCache(discountDTO.getShopId(), spuIds); + return ServerResponseEntity.success(); + } + + /** + * 删除 + */ + @DeleteMapping("/{discountId}") + public ServerResponseEntity delete(@PathVariable Long discountId) { + DiscountVO discount = discountService.getDiscountAndSpu(discountId); + discountService.deleteDiscountsAndItemsAndSpuList(discountId, discount.getShopId()); + discountService.removeDiscountCache(discountId, discount.getShopId()); + spuFeignClient.removeSpuActivityCache(discount.getShopId(), discount.getSpuIds()); + return ServerResponseEntity.success(); + } + + + @PostMapping("/offline") + @Operation(summary = "下线活动", description = "下线活动") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + DiscountVO discount = discountService.getDiscountAndSpu(offlineHandleEventDto.getHandleId()); + if (Objects.isNull(discount)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + discountService.offline(offlineHandleEventDto); + // 清除缓存 + discountService.removeDiscountCache(discount.getDiscountId(), discount.getShopId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event/{discountId}") + @Operation(summary = "通过discountId获取最新下线的事件", description = "通过discountId获取最新下线的事件") + public ServerResponseEntity getOfflineHandleEvent(@PathVariable Long discountId) { + return ServerResponseEntity.success(discountService.getOfflineHandleEvent(discountId)); + } + + @PostMapping("/audit") + @Operation(summary = "审核活动", description = "审核活动") + public ServerResponseEntity audit(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + DiscountVO discount = discountService.getDiscountAndSpu(offlineHandleEventDto.getHandleId()); + discountService.audit(offlineHandleEventDto); + // 清除缓存 + discountService.removeDiscountCache(discount.getDiscountId(), discount.getShopId()); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit_apply") + @Operation(summary = "违规活动提交审核", description = "违规活动提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO offlineHandleEventDto) { + discountService.auditApply(offlineHandleEventDto); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/app/DiscountController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/app/DiscountController.java new file mode 100644 index 0000000..a23bd60 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/controller/app/DiscountController.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.controller.app; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.discount.constant.DiscountRule; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.discount.constant.SuitableProdTypeEnum; +import com.tmerclub.cloud.discount.mapper.DiscountSpuMapper; +import com.tmerclub.cloud.discount.model.Discount; +import com.tmerclub.cloud.discount.model.DiscountSpu; +import com.tmerclub.cloud.discount.service.DiscountService; +import com.tmerclub.cloud.discount.vo.DiscountItemVO; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +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 java.util.*; +import java.util.stream.Collectors; + +/** + * 满减满折优惠 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +@RestController("appDiscountController") +@RequestMapping("/ua/discount") +@Tag(name = "满减满折优惠") +public class DiscountController { + + @Autowired + private DiscountService discountService; + + @Autowired + private DiscountSpuMapper discountSpuMapper; + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @GetMapping("/list") + @Operation(summary = "获取促销活动列表", description = "获取促销活动列表") + public ServerResponseEntity> getDiscountList(PageDTO page, Discount discount) { + PageVO spuPage = discountService.getAppDiscountList(page); + return ServerResponseEntity.success(spuPage); + } + + @GetMapping("/info") + @Operation(summary = "获取满减活动信息", description = "获取满减活动信息") + @Parameter(name = "discountId", description = "活动ID", required = true) + public ServerResponseEntity info(@RequestParam("discountId") Long discountId) { + DiscountVO discount = discountService.discountInfo(discountId); + if (Objects.isNull(discount)) { + // 该活动不存在或者已结束 + return ServerResponseEntity.showFailMsg("该活动不存在或者已结束"); + } + discount.setSpuIds(null); + return ServerResponseEntity.success(discount); + } + + @GetMapping("/spu_page_by_discount_id") + @Operation(summary = "获取促销活动商品分页", description = "通过活动id获取促销活动详情") + @Parameter(name = "discountId", description = "活动ID", required = true) + public ServerResponseEntity> getSpuPageByDiscountId(EsPageDTO pageDTO, ProductSearchDTO productSearchDTO, + @RequestParam("discountId") Long discountId) { + DiscountVO discount = discountService.getDiscountInfoById(discountId); + if (!Objects.equals(discount.getStatus(), 1)) { + return ServerResponseEntity.success(null); + } + if (Objects.equals(discount.getSuitableSpuType(), SuitableProdTypeEnum.ALL_SPU.value())) { + productSearchDTO.setShopId(discount.getShopId()); + } else { + productSearchDTO.setSpuIds(discount.getSpuIds()); + } + productSearchDTO.setPageNum(pageDTO.getPageNum()); + productSearchDTO.setPageSize(pageDTO.getPageSize()); + ServerResponseEntity> response = searchSpuFeignClient.search(productSearchDTO); + if (Objects.nonNull(response) && !Objects.equals(response.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(response.getMsg()); + } + List spuList = response.getData().getList().get(0).getSpus(); + if (CollectionUtil.isNotEmpty(spuList)) { + + // 最优惠的那个满减项 + DiscountItemVO discountItem = discount.getDiscountItemList().get(0); + + // 折扣百分比 + double discountProportion; + + // 打折 + if (Objects.equals(discount.getDiscountRule(), DiscountRule.P2D.value())) { + discountProportion = Arith.sub(1, Arith.div(discountItem.getDiscount(), 1000)); + } else { + discountProportion = Arith.div(discountItem.getDiscount(), discountItem.getNeedAmount()); + } + for (SpuSearchVO spuSearchVO : spuList) { + // 将要减去的价格 + Long subPrice = (long) Arith.div(Arith.mul(spuSearchVO.getPriceFee(), discountProportion), 1.0, 0); + // 如果有活动价格上限 + if (discount.getMaxReduceAmount() != null && subPrice > discount.getMaxReduceAmount()) { + subPrice = discount.getMaxReduceAmount(); + } + //价格最低只能为0.01 + long activityPrice = spuSearchVO.getPriceFee() - subPrice; + if (activityPrice < 1L) { + activityPrice = 1L; + } + spuSearchVO.setActivityPrice(activityPrice); + } + if (Objects.equals(discount.getSuitableSpuType(), SuitableProdTypeEnum.ASSIGN_SPU.value()) && Objects.isNull(productSearchDTO.getSort())) { + //根据满减商品id排序 + Map searchMap = spuList.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + List discountSpuList = discountSpuMapper.getDiscountSpuByDiscountId(discountId); + discountSpuList = discountSpuList.stream().sorted(Comparator.comparing(DiscountSpu::getDiscountSpuId)).collect(Collectors.toList()); + LinkedHashMap discountSpuMap = new LinkedHashMap<>(Constant.INITIAL_CAPACITY); + discountSpuList.forEach(s -> discountSpuMap.put(s.getDiscountSpuId(), s.getSpuId())); + List spuVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Map.Entry entry : discountSpuMap.entrySet()) { + if (searchMap.containsKey(entry.getValue())) { + spuVOList.add(searchMap.get(entry.getValue())); + } + } + spuList = spuVOList; + response.getData().getList().get(0).setSpus(spuList); + } + } + return ServerResponseEntity.success(response.getData()); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountSpuDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountSpuDTO.java new file mode 100644 index 0000000..99ee8f7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/dto/DiscountSpuDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 满减满折商品关联表DTO + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public class DiscountSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减 商品 联合id") + private Long discountSpuId; + + @Schema(description = "满减id") + private Long discountId; + + @Schema(description = "商品id") + private Long spuId; + + public Long getDiscountSpuId() { + return discountSpuId; + } + + public void setDiscountSpuId(Long discountSpuId) { + this.discountSpuId = discountSpuId; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "DiscountSpuDTO{" + + "discountSpuId=" + discountSpuId + + ",discountId=" + discountId + + ",spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountMapper.java new file mode 100644 index 0000000..a502a8c --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/mapper/DiscountMapper.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.mapper; + +import com.tmerclub.cloud.common.order.vo.DiscountOrderVO; +import com.tmerclub.cloud.discount.dto.DiscountDTO; +import com.tmerclub.cloud.discount.model.Discount; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 满减满折优惠 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public interface DiscountMapper { + + /** + * 获取满减满折优惠列表 + * + * @param transportDTO + * @return 满减满折优惠列表 + */ + List list(@Param("transportDTO") DiscountDTO transportDTO); + + /** + * 满减活动信息 + * + * @param discountId 满减满折优惠id + * @param status 满减满折状态 + * @return 满减满折优惠 + */ + DiscountVO getDiscountAndSpu(@Param("discountId") Long discountId, @Param("status") Integer status); + + /** + * 保存满减满折优惠 + * + * @param discount 满减满折优惠 + */ + void save(@Param("discount") DiscountDTO discount); + + /** + * 更新满减满折优惠 + * + * @param discount 满减满折优惠 + */ + void update(@Param("discount") DiscountDTO discount); + + /** + * 根据店铺id获取活动信息 + * + * @param shopId 店铺id + * @return 活动信息列表 + */ + List getDiscountsAndItemsByShopId(@Param("shopId") Long shopId); + + /** + * 根据活动id,删除活动 + * + * @param id 活动id + * @param shopId 店铺id + * @return 标识 + */ + int deleteDiscounts(@Param("id") Long id, @Param("shopId") Long shopId); + + /** + * 根据商品id获取正在进行的活动信息 + * + * @param shopId 店铺id + * @param spuId 商品id + * @return 正在进行的活动列表 + */ + List spuDiscountList(@Param("shopId") Long shopId, @Param("spuId") Long spuId); + + /** + * 获取所有正在进行的活动 + * + * @return 正在进行的活动 + */ + List getDiscountList(); + + /** + * 通过活动id获取促销活动详情 + * + * @param discountId 活动id + * @return 促销活动详情 + */ + Discount getDiscountByDiscountId(@Param("discountId") Long discountId); + + /** + * 关闭已经结束的满减折活动 + */ + void closeDiscountBySetStatus(); + + /** + * 获取活动时间已结束且未关闭的活动 + * + * @return + */ + List endDiscountList(); + + /** + * 根据商品id列表,获取满减活动id列表 + * + * @param spuIds 商品id列表 + * @param shopIds 店铺id列表 + * @return 满减活动id列表 + */ + List discountIdsBySpuIds(@Param("spuIds") List spuIds, @Param("shopIds") List shopIds); + + /** + * 根据活动id列表,批量下线活动 + * + * @param discountIds + */ + void batchOfflineByDiscountIds(@Param("discountIds") List discountIds); + + /** + * 根据店铺id列表,获取满减活动id列表 + * + * @param shopIds 店铺id列表 + * @param status + * @return 满减活动id列表 + */ + List listIdByShopIdsAndStatus(@Param("shopIds") List shopIds, @Param("status") Integer status); + + /** + * 获取当前整点的开始满减活动的店铺id + * + * @param time + * @return + */ + List listShopIdsWhichStart(@Param("time") Date time); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/DiscountSpu.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/DiscountSpu.java new file mode 100644 index 0000000..512c623 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/model/DiscountSpu.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 满减满折商品关联表 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public class DiscountSpu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 满减 商品 联合id + */ + private Long discountSpuId; + + /** + * 满减id + */ + private Long discountId; + + /** + * 商品id + */ + private Long spuId; + + public Long getDiscountSpuId() { + return discountSpuId; + } + + public void setDiscountSpuId(Long discountSpuId) { + this.discountSpuId = discountSpuId; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "DiscountSpu{" + + "discountSpuId=" + discountSpuId + + ",discountId=" + discountId + + ",spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/DiscountService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/DiscountService.java new file mode 100644 index 0000000..f814c79 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/DiscountService.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.service; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.DiscountOrderVO; +import com.tmerclub.cloud.discount.dto.DiscountDTO; +import com.tmerclub.cloud.discount.model.Discount; +import com.tmerclub.cloud.discount.vo.DiscountVO; + +import java.util.List; + +/** + * 满减满折优惠 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +public interface DiscountService { + + /** + * 满减活动信息 + * @param discountId + * @return + */ + DiscountVO discountInfo(Long discountId); + + /** + * 满减活动信息 + * @param discountId + * @return + */ + DiscountVO getDiscountAndSpu(Long discountId); + + /** + * 保存活动信息 + * @param discountDTO 活动信息、活动项、商品id列表 + */ + void insertDiscountAndItemAndSpu(DiscountDTO discountDTO); + + /** + * 更新活动信息 + * @param discount 活动信息、活动项、商品id列表 + */ + void updateDiscountAndItemAndSpu(DiscountDTO discount); + + /** + * 删除活动信息 + * @param discountId 活动id + * @param shopId 店铺id + */ + void deleteDiscountsAndItemsAndSpuList(Long discountId, Long shopId); + + /** + * 移除缓存 + * @param discountId 活动id + * @param shopId 店铺id + */ + void removeDiscountCache(Long discountId, Long shopId); + + /** + * 根据店铺id获取活动信息 + * @param shopId 店铺id + * @return 活动信息列表 + */ + List listDiscountsAndItemsByShopId(Long shopId); + + /** + * 根据商品id获取正在进行的活动信息 + * @param shopId 店铺id + * @param spuId 商品id + * @return 正在进行的活动列表 + */ + List spuDiscountList(Long shopId, Long spuId); + + + /** + * 分页获取全部在线满减数据 + * @param page 分页信息 + * @return 在线满减活动分页数据 + */ + PageVO getAppDiscountList(PageDTO page); + + /** + * 通过活动id获取促销活动详情 + * @param discountId 活动id + * @return 促销活动详情 + */ + Discount getDiscountByDiscountId(Long discountId); + + /** + * 更新活动状态 + * @param spuIds 商品ids + * @return 标记 + */ + List updateDiscountSpuByIds(List spuIds); + + /** + * 根据筛选条件获取满减列表 + * @param pageDTO 分页数据 + * @param transportDTO 过滤条件 + * @return 满减列表 + */ + PageVO page(PageDTO pageDTO, DiscountDTO transportDTO); + + /** + * 平台满减活动管理列表 + * @param pageDTO 分页数据 + * @param transportDTO 过滤条件 + * @return 满减列表 + */ + PageVO platformPage(PageDTO pageDTO, DiscountDTO transportDTO); + + /** + * 更新活动状态 + * @param discountId + * @param status + */ + void changeDiscountStatus(Long discountId, Integer status); + + /** + * 平台下架活动 + * @param offlineHandleEventDto + */ + void offline(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 获取下线的事件记录 + * @param discountId + * @return + */ + OfflineHandleEventVO getOfflineHandleEvent(Long discountId); + + /** + * 平台审核商家提交的申请 + * @param offlineHandleEventDto + */ + void audit(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 违规活动提交审核 + * @param offlineHandleEventDto + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 关闭已经结束的满减折活动 + */ + void closeDiscountBySetStatus(); + + /** + * 处理下架事件 + * @param spuIds + * @param shopIds + * @return + */ + void handleSpuOffline(List spuIds, List shopIds); + + /** + * 根据id获取活动详细信息 + * @param discountId id + * @return + */ + DiscountVO getDiscountInfoById(Long discountId); + + /** + * 下线店铺同时下架满减活动 + * @param shopIds + */ + void handleShopOffline(List shopIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/impl/DiscountServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/impl/DiscountServiceImpl.java new file mode 100644 index 0000000..cc18c14 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/impl/DiscountServiceImpl.java @@ -0,0 +1,532 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.DiscountCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.DiscountOrderVO; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.discount.constant.DiscountStatusEnum; +import com.tmerclub.cloud.discount.constant.SuitableProdTypeEnum; +import com.tmerclub.cloud.discount.dto.DiscountDTO; +import com.tmerclub.cloud.discount.dto.DiscountItemDTO; +import com.tmerclub.cloud.discount.mapper.DiscountItemMapper; +import com.tmerclub.cloud.discount.mapper.DiscountMapper; +import com.tmerclub.cloud.discount.mapper.DiscountSpuMapper; +import com.tmerclub.cloud.discount.model.Discount; +import com.tmerclub.cloud.discount.model.DiscountSpu; +import com.tmerclub.cloud.discount.service.DiscountService; +import com.tmerclub.cloud.discount.vo.DiscountVO; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.validation.Valid; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 满减满折优惠 + * + * @author lhd + * @date 2020-12-17 13:43:38 + */ +@Service +public class DiscountServiceImpl implements DiscountService { + + @Autowired + private DiscountMapper discountMapper; + @Autowired + private DiscountItemMapper discountItemMapper; + @Autowired + private DiscountSpuMapper discountSpuMapper; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @Autowired + private RocketMQTemplate sendActivityOfflineNotifyToShopTemplate; + + @Autowired + private RocketMQTemplate sendActivityAuditNotifyToShopTemplate; + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDiscountAndItemAndSpu(DiscountDTO discount) { + checkDiscountParam(discount); + discountMapper.update(discount); + + discountItemMapper.deleteByDiscountId(discount.getDiscountId()); + + discountSpuMapper.deleteByDiscountId(discount.getDiscountId()); + + insertDiscountItemsAndDiscountSpu(discount); + } + + private void checkDiscountParam(DiscountDTO discount) { + ServerResponseEntity shopResponseEntity = shopDetailFeignClient.getShopByShopId(discount.getShopId()); + EsShopDetailBO shopDetail = shopResponseEntity.getData(); + if (!shopResponseEntity.isSuccess() || Objects.isNull(shopDetail)) { + throw new LuckException("店铺信息不存在"); + } + if (ShopStatus.offlineOrDelete(shopDetail.getShopStatus())) { + throw new LuckException("店铺处于违规下架状态,不能新增或修改满减活动"); + } + // 每满一下减一次,需要(优惠金额上限 >= 优惠金额) + if (Objects.equals(discount.getDiscountType(), 1)) { + for (DiscountItemDTO discountItemDTO : discount.getDiscountItemList()) { + if (discount.getMaxReduceAmount() < discountItemDTO.getDiscount()) { + throw new LuckException("优惠金额上限不能小于优惠金额"); + } + } + } + } + + /** + * 插入满减项 + * + * @param discount 满减、满减项、关联spu信息 + */ + private void insertDiscountItemsAndDiscountSpu(DiscountDTO discount) { + List discountItems = discount.getDiscountItemList(); + for (DiscountItemDTO discountItem : discountItems) { + if (discountItem.getNeedAmount() == null || discountItem.getDiscount() == null) { + throw new LuckException("请填写完整满减信息"); + } + discountItem.setDiscountId(discount.getDiscountId()); + } + discountItemMapper.insertDiscountItems(discountItems); + + if (discount.getSuitableSpuType() != 0) { + List spuIds = discount.getSpuIds(); + if (CollectionUtil.isNotEmpty(spuIds)) { + List discountSpuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long spuId : spuIds) { + DiscountSpu discountSpu = new DiscountSpu(); + discountSpu.setDiscountId(discount.getDiscountId()); + discountSpu.setSpuId(spuId); + discountSpuList.add(discountSpu); + } + discountSpuMapper.insertDiscountSpuList(discountSpuList); + } + } + } + + @Override + @Cacheable(cacheNames = DiscountCacheNames.DISCOUNT_BY_ID, key = "#discountId") + public DiscountVO discountInfo(Long discountId) { + DiscountVO discount = discountMapper.getDiscountAndSpu(discountId, StatusEnum.ENABLE.value()); + if (Objects.isNull(discount)) { + throw new LuckException("当前活动已关闭"); + } + ServerResponseEntity shopResponEntity = shopDetailFeignClient.getShopByShopId(discount.getShopId()); + if (!shopResponEntity.isSuccess() || Objects.isNull(shopResponEntity.getData())) { + throw new LuckException("店铺信息不存在"); + } + EsShopDetailBO shopDetail = shopResponEntity.getData(); + discount.setShopLogo(shopDetail.getShopLogo()); + discount.setShopName(shopDetail.getShopName()); + + long now = System.currentTimeMillis(); + + // 活动还没结束 + if (discount.getEndTime().getTime() > now) { + // 距离活动开始还有 + discount.setExpiresIn((int) (discount.getEndTime().getTime() - now) / 1000); + } + // 活动还没开始 + if (discount.getStartTime().getTime() > now) { + // 距离活动开始还有 + discount.setStartIn((int) (discount.getStartTime().getTime() - now) / 1000); + } + // 活动还没开始 + if (discount.getStartTime().getTime() > now) { + // 距离活动开始还有 + discount.setStartIn((int) (discount.getStartTime().getTime() - now) / 1000); + } + // 活动还没开始 + if (discount.getStartTime().getTime() > now) { + // 距离活动开始还有 + discount.setStartIn((int) (discount.getStartTime().getTime() - now) / 1000); + } + // 活动还没开始 + if (discount.getStartTime().getTime() > now) { + // 距离活动开始还有 + discount.setStartIn((int) (discount.getStartTime().getTime() - now) / 1000); + } + // 活动还没开始 + if (discount.getStartTime().getTime() > now) { + // 距离活动开始还有 + discount.setStartIn((int) (discount.getStartTime().getTime() - now) / 1000); + } + return discount; + } + + @Override + public DiscountVO getDiscountAndSpu(Long discountId) { + return discountMapper.getDiscountAndSpu(discountId, null); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.DISCOUNT_BY_SHOPID, key = "#discount.shopId") + public void insertDiscountAndItemAndSpu(@Valid DiscountDTO discount) { + checkDiscountParam(discount); + discountMapper.save(discount); + + List discountItems = discount.getDiscountItemList(); + if (CollectionUtil.isEmpty(discountItems)) { + throw new LuckException("活动项不能为空,最少要有一个活动项"); + } + insertDiscountItemsAndDiscountSpu(discount); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDiscountsAndItemsAndSpuList(Long discountId, Long shopId) { + int i = discountMapper.deleteDiscounts(discountId, shopId); + if (i > 0) { + discountItemMapper.deleteByDiscountId(discountId); + discountSpuMapper.deleteByDiscountId(discountId); + } + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.DISCOUNT_BY_ID, key = "#discountId"), + @CacheEvict(cacheNames = CacheNames.DISCOUNT_BY_SHOPID, key = "#shopId") + }) + public void removeDiscountCache(Long discountId, Long shopId) { + } + + @Override + @Cacheable(cacheNames = CacheNames.DISCOUNT_BY_SHOPID, key = "#shopId") + public List listDiscountsAndItemsByShopId(Long shopId) { + return discountMapper.getDiscountsAndItemsByShopId(shopId); + } + + @Override + public List spuDiscountList(Long shopId, Long spuId) { + List discountVOList = discountMapper.spuDiscountList(shopId, spuId); + if (Objects.isNull(discountVOList)) { + return new ArrayList<>(0); + } + return discountVOList; + } + + @Override + public PageVO getAppDiscountList(PageDTO page) { + PageVO pageVO = PageUtil.doPage(page, () -> discountMapper.getDiscountList()); + Set shopIds = pageVO.getList().stream().map(DiscountVO::getShopId).collect(Collectors.toSet()); + if (CollUtil.isEmpty(shopIds)) { + return pageVO; + } + ServerResponseEntity> response = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopIds)); + Map shopMap = response.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, s -> s)); + long now = System.currentTimeMillis(); + + for (DiscountVO discountVO : pageVO.getList()) { + ShopDetailVO shopDetailVO = shopMap.get(discountVO.getShopId()); + discountVO.setShopName(shopDetailVO.getShopName()); + discountVO.setShopLogo(shopDetailVO.getShopLogo()); + + // 活动还没开始 + if (discountVO.getStartTime().getTime() > now) { + // 距离活动开始还有 + discountVO.setStartIn((int) (discountVO.getStartTime().getTime() - now) / 1000); + } + // 活动还没结束 + if (discountVO.getEndTime().getTime() > now) { + // 距离活动开始还有 + discountVO.setExpiresIn((int) (discountVO.getEndTime().getTime() - now) / 1000); + } + } + return pageVO; + } + + @Override + public Discount getDiscountByDiscountId(Long discountId) { + return discountMapper.getDiscountByDiscountId(discountId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List updateDiscountSpuByIds(List spuIds) { + // 查询出所有为可用商品类型的满减活动的,包含需要处理商品id,进行删除 + List discountSpu = discountItemMapper.listDiscountBySpuIds(spuIds); + List spuIdsDb = new ArrayList<>(Constant.INITIAL_CAPACITY); + List ids = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollectionUtil.isNotEmpty(discountSpu)) { + for (DiscountSpu spu : discountSpu) { + ids.add(spu.getDiscountId()); + spuIdsDb.add(spu.getSpuId()); + } + discountSpuMapper.deleteBySpuIds(spuIdsDb); + } + return ids; + } + + @Override + public PageVO page(PageDTO pageDTO, DiscountDTO transportDTO) { + return PageUtil.doPage(pageDTO, () -> discountMapper.list(transportDTO)); + } + + @Override + public PageVO platformPage(PageDTO pageDTO, DiscountDTO transportDTO) { + if (StringUtils.isNotBlank(transportDTO.getShopName())) { + ServerResponseEntity> shopIdsByLikeShopName = shopDetailFeignClient.getShopIdsByLikeShopName(transportDTO.getShopName()); + transportDTO.setShopIds(shopIdsByLikeShopName.getData()); + } + PageVO page = PageUtil.doPage(pageDTO, () -> discountMapper.list(transportDTO)); + Set shopIdSet = page.getList().stream().map(DiscountVO::getShopId).collect(Collectors.toSet()); + ServerResponseEntity> shopResponse = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopIdSet)); + if (CollUtil.isEmpty(shopResponse.getData())) { + return page; + } + Map shopMap = shopResponse.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + for (DiscountVO discountVO : page.getList()) { + discountVO.setShopName(shopMap.get(discountVO.getShopId())); + } + return page; + } + + @Override + public void changeDiscountStatus(Long discountId, Integer status) { + DiscountDTO discountDTO = new DiscountDTO(); + discountDTO.setDiscountId(discountId); + discountDTO.setStatus(status); + discountMapper.update(discountDTO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(OfflineHandleEventDTO offlineHandleEventDto) { + OfflineHandleEventDTO offlineHandleEvent = new OfflineHandleEventDTO(); + offlineHandleEvent.setHandleId(offlineHandleEventDto.getHandleId()); + offlineHandleEvent.setHandleType(OfflineHandleEventType.DISCOUNT.getValue()); + offlineHandleEvent.setOfflineReason(offlineHandleEventDto.getOfflineReason()); + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.save(offlineHandleEvent); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新活动状态为下线状态 + changeDiscountStatus(offlineHandleEvent.getHandleId(), StatusEnum.OFFLINE.value()); + + DiscountVO discountVO = getDiscountInfoById(offlineHandleEvent.getHandleId()); + //发送活动下线消息给店铺 + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.ACTIVITY_OFFLINE.getValue()); + sendNotifyBO.setShopId(discountVO.getShopId()); + sendNotifyBO.setActivityId(offlineHandleEvent.getHandleId()); + sendNotifyBO.setActivityName(discountVO.getDiscountName()); + SendStatus sendStockStatus = sendActivityOfflineNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_ACTIVITY_OFFLINE_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public OfflineHandleEventVO getOfflineHandleEvent(Long discountId) { + ServerResponseEntity offlineHandleEventResponse = + offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.DISCOUNT.getValue(), discountId, null); + return offlineHandleEventResponse.getData(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(OfflineHandleEventDTO offlineHandleEventDto) { + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 审核通过 + if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + // 更新活动为等待投放状态、过期状态为未过期 + changeDiscountStatus(offlineHandleEventDto.getHandleId(), StatusEnum.DISABLE.value()); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDto.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + changeDiscountStatus(offlineHandleEventDto.getHandleId(), StatusEnum.OFFLINE.value()); + } + //发送活动审核结果消息给店铺 + DiscountVO discountVO = getDiscountInfoById(offlineHandleEventDto.getHandleId()); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.ACTIVITY_AUDIT.getValue()); + sendNotifyBO.setShopId(discountVO.getShopId()); + sendNotifyBO.setActivityId(offlineHandleEventDto.getHandleId()); + sendNotifyBO.setActivityName(discountVO.getDiscountName()); + SendStatus sendStockStatus = sendActivityAuditNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_ACTIVITY_AUDIT_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void auditApply(OfflineHandleEventDTO offlineHandleEventDto) { + // 更新事件状态 + ServerResponseEntity responseEntity = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDto); + if (!Objects.equals(responseEntity.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(responseEntity.getMsg()); + } + // 更新活动为待审核状态 + changeDiscountStatus(offlineHandleEventDto.getHandleId(), StatusEnum.WAIT_AUDIT.value()); + } + + @Override + public void closeDiscountBySetStatus() { + // 查询时间已到期且未关闭的活动 + List discountVOList = discountMapper.endDiscountList(); + if (CollUtil.isEmpty(discountVOList)) { + return; + } + List discountIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set shopSet = new HashSet<>(Constant.INITIAL_CAPACITY); + // 删除缓存 + discountVOList.forEach((discount) -> { + discountIdList.add(discount.getDiscountId()); + shopSet.add(discount.getShopId()); + }); + batchRemoveDiscountCache(discountIdList, shopSet); + discountMapper.closeDiscountBySetStatus(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handleSpuOffline(List spuIds, List shopIds) { + List discountList = discountMapper.discountIdsBySpuIds(spuIds, shopIds); + if (CollUtil.isEmpty(discountList)) { + return; + } + List discountIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List offlineList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set shopSet = new HashSet<>(Constant.INITIAL_CAPACITY); + for (DiscountVO discountVO : discountList) { + discountIds.add(discountVO.getDiscountId()); + shopSet.add(discountVO.getShopId()); + // 活动不是启动状态,或 适用商品类型为:全部商品,则不进行后面的处理 + if (!Objects.equals(discountVO.getStatus(), StatusEnum.ENABLE.value()) + || Objects.equals(SuitableProdTypeEnum.ALL_SPU.value(), discountVO.getSuitableSpuType())) { + continue; + } + discountVO.getSpuIds().removeAll(spuIds); + // 商品列表为空,则把活动添加到下线列表中 + if (CollUtil.isEmpty(discountVO.getSpuIds())) { + offlineList.add(discountVO.getDiscountId()); + } + } + // 删除商品关联信息 + discountSpuMapper.deleteBySpuIds(spuIds); + // 商品列表为空的活动进行下线 + if (CollUtil.isNotEmpty(offlineList)) { + discountMapper.batchOfflineByDiscountIds(offlineList); + } + // 清除缓存 + batchRemoveDiscountCache(discountIds, shopSet); + } + + @Override + public DiscountVO getDiscountInfoById(Long discountId) { + DiscountVO discount = discountMapper.getDiscountAndSpu(discountId, null); + ServerResponseEntity shopResponEntity = shopDetailFeignClient.getShopByShopId(discount.getShopId()); + EsShopDetailBO shopDetail = shopResponEntity.getData(); + discount.setShopName(shopDetail.getShopName()); + discount.setShopLogo(shopDetail.getShopLogo()); + + long now = System.currentTimeMillis(); + + // 活动还没开始 + if (discount.getStartTime().getTime() > now) { + // 距离活动开始还有 + discount.setStartIn((int) (discount.getStartTime().getTime() - now) / 1000); + } + // 活动还没结束 + if (discount.getEndTime().getTime() > now) { + // 距离活动开始还有 + discount.setExpiresIn((int) (discount.getEndTime().getTime() - now) / 1000); + } + return discount; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handleShopOffline(List shopIds) { + if (CollUtil.isEmpty(shopIds)) { + return; + } + List discountIds = discountMapper.listIdByShopIdsAndStatus(shopIds, DiscountStatusEnum.RUN.getValue()); + if (CollUtil.isEmpty(discountIds)) { + return; + } + // 删除商品关联信息 + discountSpuMapper.deleteBatchByDiscountIds(discountIds); + // 活动下线 + discountMapper.batchOfflineByDiscountIds(discountIds); + // 清除缓存 + batchRemoveDiscountCache(discountIds, new HashSet<>(shopIds)); + } + + /** + * 批量清除缓存 + * + * @param discountIds 活动id列表 + * @param shopIds 店铺id列表 + */ + private void batchRemoveDiscountCache(List discountIds, Set shopIds) { + if (CollUtil.isEmpty(discountIds) || CollUtil.isEmpty(shopIds)) { + return; + } + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long discountId : discountIds) { + keys.add(CacheNames.DISCOUNT_BY_ID + CacheNames.UNION + discountId); + + } + for (Long shopId : shopIds) { + keys.add(CacheNames.DISCOUNT_BY_SHOPID + CacheNames.UNION + shopId); + } + RedisUtil.deleteBatch(keys); + } + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/impl/DiscountSpuServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/impl/DiscountSpuServiceImpl.java new file mode 100644 index 0000000..3926a62 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/service/impl/DiscountSpuServiceImpl.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.service.impl; + +import com.tmerclub.cloud.discount.mapper.DiscountSpuMapper; +import com.tmerclub.cloud.discount.service.DiscountSpuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 满减满折商品关联表 + * + * @author FrozenWatermelon + * @date 2020-12-10 13:43:38 + */ +@Service +public class DiscountSpuServiceImpl implements DiscountSpuService { + @Autowired + private DiscountSpuMapper discountSpuMapper; + + + @Override + public List listSpuIdByDiscountId(Long discountId) { + return discountSpuMapper.listSpuIdByDiscountId(discountId); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/task/DiscountTask.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/task/DiscountTask.java new file mode 100644 index 0000000..cd49c08 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/task/DiscountTask.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.discount.mapper.DiscountMapper; +import com.tmerclub.cloud.discount.service.DiscountService; +import com.xxl.job.core.handler.annotation.XxlJob; +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.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author FrozenWatermelon + */ +@Component +public class DiscountTask { + + @Autowired + private DiscountService discountService; + @Autowired + private DiscountMapper discountMapper; + + public static final Logger log = LoggerFactory.getLogger(DiscountTask.class); + + /** + * 关闭已经结束的满减折活动 + */ + @XxlJob("closeDiscount") + public void closeDiscount() { + log.info("关闭已经结束的满减折活动"); + try { + // 休眠10秒,保证准确关闭到期活动 + TimeUnit.SECONDS.sleep(10); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + discountService.closeDiscountBySetStatus(); + } + + /** + * 满减活动开启,删除商家活动缓存 + * 0 0 0/1 * * ? + */ + @XxlJob("startDiscount") + public void startDiscount() { + // 如果有活动在这个整点开始才去清除缓存 + List shopIds = discountMapper.listShopIdsWhichStart(DateUtil.beginOfHour(new Date())); + if (CollUtil.isNotEmpty(shopIds)) { + // 清除缓存 + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long shopId : shopIds) { + keys.add(CacheNames.DISCOUNT_BY_SHOPID + CacheNames.UNION + shopId); + } + RedisUtil.deleteBatch(keys); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/vo/DiscountItemVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/vo/DiscountItemVO.java new file mode 100644 index 0000000..9d0d4ec --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/vo/DiscountItemVO.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 满减满折优惠项VO + * + * @author FrozenWatermelon + * @date 2020-12-16 16:25:09 + */ +public class DiscountItemVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠项id") + private Long discountItemId; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "所需需要金额") + private Long needAmount; + + @Schema(description = "优惠(元/折)9.5折就是95、9.5元就是950") + private Long discount; + + public Long getDiscountItemId() { + return discountItemId; + } + + public void setDiscountItemId(Long discountItemId) { + this.discountItemId = discountItemId; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Long getDiscount() { + return discount; + } + + public void setDiscount(Long discount) { + this.discount = discount; + } + + @Override + public String toString() { + return "DiscountItemVO{" + + "discountItemId=" + discountItemId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", discountId=" + discountId + + ", needAmount=" + needAmount + + ", discount=" + discount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/vo/DiscountVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/vo/DiscountVO.java new file mode 100644 index 0000000..dc6d9fa --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/discount/vo/DiscountVO.java @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.discount.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 满减满折优惠VO + * + * @author FrozenWatermelon + * @date 2020-12-16 16:25:09 + */ +public class DiscountVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "满减满折优惠id") + private Long discountId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺logo") + private String shopLogo; + + @Schema(description = "活动名称") + private String discountName; + + @Schema(description = "枚举DiscountRule(0 满钱减钱 3满件打折)") + private Integer discountRule; + + @Schema(description = "减免类型 0按满足最高层级减一次 1每满一次减一次") + private Integer discountType; + + @Schema(description = "适用商品类型 0全部商品参与 1指定商品参与") + private Integer suitableSpuType; + + @Schema(description = "最多减多少") + private Long maxReduceAmount; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "活动状态:(0:关闭、1:开启、2:违规下线、3:平台审核)") + private Integer status; + + @Schema(description = "手机端活动图片") + private String mobilePic; + + @Schema(description = "pc端活动列表图片") + private String pcPic; + + @Schema(description = "pc端活动背景图片") + private String pcBackgroundPic; + + @Schema(description = "满减项") + private List discountItemList; + + @Schema(description = "商品Id列表") + private List spuIds; + + @Schema(description = "可用商品列表,如果为全部则为空") + private List spuList; + + @Schema(description = "在多少秒后过期") + private Integer expiresIn; + + @Schema(description = "在多少秒后开始") + private Integer startIn; + + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + public List getDiscountItemList() { + return discountItemList; + } + + public void setDiscountItemList(List discountItemList) { + this.discountItemList = discountItemList; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getDiscountName() { + return discountName; + } + + public void setDiscountName(String discountName) { + this.discountName = discountName; + } + + public Integer getDiscountRule() { + return discountRule; + } + + public void setDiscountRule(Integer discountRule) { + this.discountRule = discountRule; + } + + public Integer getDiscountType() { + return discountType; + } + + public void setDiscountType(Integer discountType) { + this.discountType = discountType; + } + + public Integer getSuitableSpuType() { + return suitableSpuType; + } + + public void setSuitableSpuType(Integer suitableSpuType) { + this.suitableSpuType = suitableSpuType; + } + + public Long getMaxReduceAmount() { + return maxReduceAmount; + } + + public void setMaxReduceAmount(Long maxReduceAmount) { + this.maxReduceAmount = maxReduceAmount; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMobilePic() { + return mobilePic; + } + + public void setMobilePic(String mobilePic) { + this.mobilePic = mobilePic; + } + + public String getPcPic() { + return pcPic; + } + + public void setPcPic(String pcPic) { + this.pcPic = pcPic; + } + + public String getPcBackgroundPic() { + return pcBackgroundPic; + } + + public void setPcBackgroundPic(String pcBackgroundPic) { + this.pcBackgroundPic = pcBackgroundPic; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(Integer expiresIn) { + this.expiresIn = expiresIn; + } + + public Integer getStartIn() { + return startIn; + } + + public void setStartIn(Integer startIn) { + this.startIn = startIn; + } + + @Override + public String toString() { + return "DiscountVO{" + + "discountId=" + discountId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", discountName='" + discountName + '\'' + + ", discountRule=" + discountRule + + ", discountType=" + discountType + + ", suitableSpuType=" + suitableSpuType + + ", maxReduceAmount=" + maxReduceAmount + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", status=" + status + + ", mobilePic='" + mobilePic + '\'' + + ", pcPic='" + pcPic + '\'' + + ", pcBackgroundPic='" + pcBackgroundPic + '\'' + + ", discountItemList=" + discountItemList + + ", spuIds=" + spuIds + + ", spuList=" + spuList + + ", expiresIn=" + expiresIn + + ", startIn=" + startIn + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/AwardMode.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/AwardMode.java new file mode 100644 index 0000000..0c95336 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/AwardMode.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * @Author lth + * @Date 2021/8/10 10:34 + * 奖励方式(0 按比例 1 按固定数值) + */ +public enum AwardMode { + /** + * 按比例 + */ + PROPORTION(0), + /** + * 按固定数值 + */ + FIXED_VALUE(1); + + private final Integer num; + + public Integer value() { + return num; + } + + AwardMode(Integer num) { + this.num = num; + } + + public static AwardMode instance(Integer value) { + AwardMode[] enums = values(); + for (AwardMode statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/BindStateEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/BindStateEnum.java new file mode 100644 index 0000000..9bc5260 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/BindStateEnum.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 当前绑定关系 + * + * @author cl + * @date 2021-08-14 13:25:50 + */ +public enum BindStateEnum { + /** + * 失效 + */ + INVALID(-1, "失效"), + /** + * 预绑定 + */ + PRE_BIND(0, "预绑定"), + /** + * 生效 + */ + VALID(1, "生效"); + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + BindStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static BindStateEnum instance(Integer value) { + BindStateEnum[] enums = values(); + for (BindStateEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAmountEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAmountEnum.java new file mode 100644 index 0000000..81e6084 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionAmountEnum.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 分销金额类型: 1直推 2间推 + * + * @author cl + * @date 2021-08-16 14:06:36 + */ +public enum DistributionAmountEnum { + /** + * 未通过 + */ + DIRECT_PUSH(1, "直推"), + /** + * 未审核 + */ + INTERPENETRATION(2, "间推"); + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionAmountEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionAmountEnum instance(Integer value) { + DistributionAmountEnum[] enums = values(); + for (DistributionAmountEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionBanStateEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionBanStateEnum.java new file mode 100644 index 0000000..783aab2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionBanStateEnum.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 封禁状态 + * + * @author cl + * @date 2021-08-14 13:25:50 + */ +public enum DistributionBanStateEnum { + /** + * 正常 + */ + INVALID(1, "正常"), + /** + * 暂时封禁 + */ + PRE_BIND(2, "暂时封禁"), + /** + * 永久封禁 + */ + VALID(-1, "永久封禁"); + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionBanStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionBanStateEnum instance(Integer value) { + DistributionBanStateEnum[] enums = values(); + for (DistributionBanStateEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionSpuStatus.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionSpuStatus.java new file mode 100644 index 0000000..bdc7962 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionSpuStatus.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * @Author lth + * @Date 2021/5/25 9:13 + */ +public enum DistributionSpuStatus { + + /** + * 商家下架 + */ + OFF_SHELF(0), + /** + * 商家上架 + */ + PUT_SHELF(1), + /** + * 违规下架 + */ + PLATFORM_OFF_SHELF(2), + /** + * 平台审核 + */ + WAITAUDIT(3); + + private final Integer num; + + public Integer value() { + return num; + } + + DistributionSpuStatus(Integer num) { + this.num = num; + } + + public static DistributionSpuStatus instance(Integer value) { + DistributionSpuStatus[] enums = values(); + for (DistributionSpuStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserIncomeTypeEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserIncomeTypeEnum.java new file mode 100644 index 0000000..3c2c9ff --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserIncomeTypeEnum.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 收入类型(1一代奖励、2二代奖励 3邀请奖励) + * + * @author cl + * @date 2021-08-18 17:03:46 + */ +public enum DistributionUserIncomeTypeEnum { + + + /** + * 直推奖励 : 一代奖励 + */ + AWARD_ONE(1, "直推奖励"), + /** + * 间推奖励: 二代奖励 + */ + AWARD_TWO(2, "间推奖励"), + + /** + * 邀请奖励 + */ + INVITATION(3, "邀请奖励"), + + /** + * 平台修改 + */ + PLATFORM(4, "平台修改"); + + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionUserIncomeTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionUserIncomeTypeEnum instance(Integer value) { + DistributionUserIncomeTypeEnum[] enums = values(); + for (DistributionUserIncomeTypeEnum typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserStateEnum.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserStateEnum.java new file mode 100644 index 0000000..806a099 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/DistributionUserStateEnum.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * @author cl + * @date 2021-08-14 10:40:55 + */ +public enum DistributionUserStateEnum { + /** + * 永久封禁 + */ + PER_BAN(-1, "永久封禁"), + + /** + * 待审核状态 + */ + WAIT_AUDIT(0, "待审核状态"), + /** + * 正常 + */ + NORMAL(1, "正常"), + /** + * 暂时封禁 + */ + BAN(2, "暂时封禁"), + /** + * 审核未通过 + */ + FAIL_AUDIT(3, "审核未通过"), + ; + + private final int value; + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + DistributionUserStateEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static DistributionUserStateEnum instance(Integer value) { + DistributionUserStateEnum[] enums = values(); + for (DistributionUserStateEnum stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/EnterpriseApplyType.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/EnterpriseApplyType.java new file mode 100644 index 0000000..0d2db8d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/constant/EnterpriseApplyType.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.constant; + +/** + * 商家转账申请类型 + * @author Yami + */ +public enum EnterpriseApplyType { + + /** + * 商户提现 + */ + SHOP_WITHDRAW(1, "商户提现"), + + /** + * 分销员提现 + */ + DISTRIBUTION_WITHDRAW(2, "分销员提现"); + + private final Integer value; + + private final String desc; + + public Integer value() { + return value; + } + + public String getDesc() { + return desc; + } + + EnterpriseApplyType(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static EnterpriseApplyType instance(Integer value) { + EnterpriseApplyType[] enums = values(); + for (EnterpriseApplyType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/admin/DistributionUserIncomeController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/admin/DistributionUserIncomeController.java new file mode 100644 index 0000000..70b0a7a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/admin/DistributionUserIncomeController.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.admin; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.dto.DistributionUserIncomeDTO; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +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 lth + * @Date 2021/8/10 16:30 + */ +@RestController("adminDistributionUserIncomeController") +@RequestMapping("/mp/distribution_user_income") +@Tag(name = "admin-分销收入记录信息") +public class DistributionUserIncomeController { + + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + + @GetMapping("/page_sales_record") + @Operation(summary = "获取销售记录", description = "获取销售记录") + public ServerResponseEntity> pageSalesRecord(@Valid PageDTO pageDTO, DistributionUserIncomeDTO distributionUserIncomeDTO) { + PageVO distributionUserIncomePageVO = distributionUserIncomeService.pageSalesRecord(pageDTO, distributionUserIncomeDTO); + for (DistributionUserIncomeVO record : distributionUserIncomePageVO.getList()) { + DistributionUserVO distributionUser = record.getDistributionUser(); + if (Objects.nonNull(distributionUser)) { + if (StrUtil.isNotBlank(distributionUser.getNickName()) && PrincipalUtil.isMobile(distributionUser.getNickName())) { + distributionUser.setNickName(PhoneUtil.hideBetween(distributionUser.getNickName()).toString()); + } + if (StrUtil.isNotBlank(distributionUser.getUserMobile()) && PrincipalUtil.isMobile(distributionUser.getUserMobile())) { + distributionUser.setUserMobile(PhoneUtil.hideBetween(distributionUser.getUserMobile()).toString()); + } + } + } + return ServerResponseEntity.success(distributionUserIncomePageVO); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionConfigController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionConfigController.java new file mode 100644 index 0000000..8ab50ee --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionConfigController.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + + +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 cl + * @date 2021-08-12 09:46:26 + */ +@RestController("appDistributionConfigController") +@RequestMapping("/distribution_set") +@Tag(name = "分销设置信息") +public class DistributionConfigController { + + @Autowired + private DistributionConfigService distributionConfigService; + + @GetMapping("/info") + @Operation(summary = "获取分销设置信息") + public ServerResponseEntity info() { + return ServerResponseEntity.success(distributionConfigService.getDistributionConfig()); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionMsgController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionMsgController.java new file mode 100644 index 0000000..5b9d123 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionMsgController.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.model.DistributionMsg; +import com.tmerclub.cloud.distribution.service.DistributionMsgService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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; + +/** + * 分销公告信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +@RestController("appDistributionMsgController") +@RequestMapping("/distribution_msg") +@Tag(name = "app-分销公告信息") +public class DistributionMsgController { + + @Autowired + private DistributionMsgService distributionMsgService; + + @GetMapping("/page") + @Operation(summary = "获取分销公告信息列表", description = "分页获取分销公告信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, @RequestParam(value = "isTop", required = false) Integer isTop) { + PageVO distributionMsgPage = distributionMsgService.pageApp(pageDTO, isTop); + return ServerResponseEntity.success(distributionMsgPage); + } + + @GetMapping + @Operation(summary = "获取分销公告信息", description = "根据msgId获取分销公告信息") + public ServerResponseEntity getByMsgId(@RequestParam Long msgId) { + return ServerResponseEntity.success(distributionMsgService.getByMsgId(msgId)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionQrCodeController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionQrCodeController.java new file mode 100644 index 0000000..13415a7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionQrCodeController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.config.WxConfig; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import me.chanjar.weixin.common.error.WxErrorException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.File; + +/** + * @author cl + * @date 2021-08-12 10:46:10 + */ +@RestController("appDistributionQrCodeController") +@RequestMapping("/ua/distribution_qrcode") +@Tag(name = "分销生成二维码接口") +public class DistributionQrCodeController { + private static final Logger LOGGER = LoggerFactory.getLogger(DistributionQrCodeController.class); + + @Autowired + private WxConfig wxConfig; + + @GetMapping("/invitation") + @Operation(summary = "分销员邀请二维码", description = "分销员的邀请二维码带有cardNo") + @Parameters({ + @Parameter(name = "scene", description = "二维码携带的参数", required = true), + @Parameter(name = "page", description = "获取二维码后跳转的页面", required = true) + }) + public ResponseEntity qrCodeCreate(String page, String scene) { + File file; + try { + // 只有发布到线上了,正式版才能调用成功,否则错误码为:41030 + file = wxConfig.getWxMaService().getQrcodeService().createWxaCodeUnlimit(scene, page); + } catch (WxErrorException e) { + LOGGER.error("异常:", e); + throw new LuckException("获取分销员邀请二维码失败!"); + } + return ResponseEntity.ok(new FileSystemResource(file)); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionRecruitConfigController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionRecruitConfigController.java new file mode 100644 index 0000000..cbc3edb --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionRecruitConfigController.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + + +import com.tmerclub.cloud.api.platform.vo.DistributionRecruitConfigApiVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 cl + */ +@RestController("appDistributionRecruitConfigController") +@RequestMapping("/distribution_recruit") +@Tag(name = "分销推广信息") +public class DistributionRecruitConfigController { + + @Autowired + private DistributionConfigService distributionConfigService; + + @GetMapping("/info") + @Operation(summary = "获取分销推广配置信息") + public ServerResponseEntity recruitInfo() { + return ServerResponseEntity.success(distributionConfigService.getDistributionRecruitConfig()); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionRegisterController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionRegisterController.java new file mode 100644 index 0000000..bc4ac29 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionRegisterController.java @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.vo.UserShoppingDataVO; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.PersonalMemberInfo; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.bean.PaySettlementConfig; +import com.tmerclub.cloud.common.constant.AutoCheckEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.distribution.constant.DistributionUserStateEnum; +import com.tmerclub.cloud.distribution.dto.DistributionUserRegisterDTO; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 分销员注册接口 + * + * @author cl + * @date 2021-08-16 10:00:21 + */ +@RestController("appDistributionRegisterController") +@RequestMapping("/distribution_register") +@Tag(name = "分销员绑定关系") +public class DistributionRegisterController { + + private static final Logger logger = LoggerFactory.getLogger(DistributionRegisterController.class); + + @Autowired + private DistributionConfigService distributionConfigService; + @Autowired + private DistributionUserService distributionUserService; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + /** + * 成为分销员 + */ + @PostMapping("/add_distribution_user") + @Operation(summary = "申请成为分销员", description = "申请成为分销员,返回分销员状态 0 待审核 1 正常") + public ServerResponseEntity addDistributionUser(@Valid @RequestBody DistributionUserRegisterDTO distributionUserRegisterDTO) { + Long userId = AuthUserContext.get().getUserId(); + // 查询用户信息,补充分销员手机号 + ServerResponseEntity userResponse = userFeignClient.getUserData(userId); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + UserApiVO user = userResponse.getData(); + if (Objects.isNull(user)) { + throw new LuckException("用户不存在"); + } + if (Objects.isNull(user.getPhone())) { + throw new LuckException("用户手机号未绑定"); + } + distributionUserRegisterDTO.setUserMobile(user.getPhone()); + logger.debug(Json.toJsonString(distributionUserRegisterDTO)); + // 店铺分销员审核设置 + DistributionConfigApiVO distributionConfig = distributionConfigService.getDistributionConfig(); + // 判断传入的资料是否齐全 + if (distributionConfig == null || Objects.isNull(distributionConfig.getAutoCheck())) { + // 分销设置异常 + throw new LuckException("分销设置异常"); + } + if (distributionConfig.getIdentityCardNumber()) { + if (!StrUtil.isNotBlank(distributionUserRegisterDTO.getIdentityCardNumber())) { + // 申请填写信息不全,需要身份证号 + throw new LuckException("申请填写信息不全,需要身份证号"); + } + } + if (distributionConfig.getIdentityCardPic()) { + if (!StrUtil.isNotBlank(distributionUserRegisterDTO.getIdentityCardPicBack()) || !StrUtil.isNotBlank(distributionUserRegisterDTO.getIdentityCardPicFront()) || !StrUtil.isNotBlank(distributionUserRegisterDTO.getIdentityCardPicHold())) { + // 申请填写信息不全,需要身份证照片 + throw new LuckException("申请填写信息不全,需要身份证照片"); + } + } + if (distributionConfig.getRealName()) { + if (!StrUtil.isNotBlank(distributionUserRegisterDTO.getRealName())) { + // 申请填写信息不全,需要真实姓名 + throw new LuckException("申请填写信息不全,需要真实姓名"); + } + } + // 检查通联信息 + this.distributionAllinpayCheck(); + + DistributionUserVO distributionUserVO = distributionUserService.getByUserId(userId); + // 检查分销员信息 + checkUserInfo(distributionUserRegisterDTO, distributionUserVO); + + DistributionUser distributionUser = new DistributionUser(); + distributionUser.setUserId(userId); + + // 设置分享人信息 + setSharer(distributionUserRegisterDTO, userId, distributionUser); + + if (distributionConfig.getAutoCheck() == 1) { + autoCheck(distributionConfig, userId, distributionUser); + } else if(Objects.equals(distributionConfig.getAutoCheck(), AutoCheckEnum.NO_AUDIT.value())){ + // 不需要审核 + distributionUser.setState(1); + distributionUser.setBindTime(new Date()); + } else { + // 待审核 + distributionUser.setState(DistributionUserStateEnum.WAIT_AUDIT.value()); + } + + //设置信息 + distributionUser.setUserMobile(distributionUserRegisterDTO.getUserMobile()); + distributionUser.setRealName(distributionUserRegisterDTO.getRealName()); + distributionUser.setIdentityCardNumber(distributionUserRegisterDTO.getIdentityCardNumber()); + distributionUser.setIdentityCardPicFront(distributionUserRegisterDTO.getIdentityCardPicFront()); + distributionUser.setIdentityCardPicHold(distributionUserRegisterDTO.getIdentityCardPicHold()); + distributionUser.setIdentityCardPicBack(distributionUserRegisterDTO.getIdentityCardPicBack()); + + //设置用户信息字段 + distributionUser.setNickName(user.getNickName()); + distributionUser.setPic(user.getPic()); + + distributionUserService.registerDistributionUser(distributionUser); + + // 清除缓存 + distributionUserService.removeCacheByUserId(distributionUser.getUserId()); + return ServerResponseEntity.success(distributionUser.getState()); + } + + @GetMapping("/check_allinpay_info") + @Operation(summary = "检查分销条件(通联)") + public ServerResponseEntity checkAllinpayInfo() { + // 检查通联信息 + this.distributionAllinpayCheck(); + return ServerResponseEntity.success(); + } + + private void setSharer(DistributionUserRegisterDTO distributionUserRegisterDTO, Long userId, DistributionUser distributionUser) { + String sharerDistributionUserId = distributionUserRegisterDTO.getSharer(); + if (StrUtil.isNotBlank(sharerDistributionUserId)) { + DistributionUser parentUser = distributionUserService.getByDistributionUserId(Long.parseLong(sharerDistributionUserId)); + if (parentUser == null) { + // 无法获取邀请人信息 + throw new LuckException("无法获取邀请人信息"); + } + if (Objects.equals(parentUser.getUserId(), userId)) { + // 自己无法邀请自己 + throw new LuckException("自己无法邀请自己"); + } + if (!Objects.equals(parentUser.getState(), DistributionUserStateEnum.PER_BAN.value()) + && !Objects.equals(parentUser.getState(), DistributionUserStateEnum.BAN.value())) { + //上级不能是暂时封禁或永久封禁状态 + //设置上级id + distributionUser.setParentId(parentUser.getDistributionUserId()); + //设置上级ids + if (parentUser.getParentId() == null) { + distributionUser.setParentIds(StringUtils.join(StrUtil.COMMA, parentUser.getDistributionUserId(), StrUtil.COMMA)); + } else { + distributionUser.setParentIds(StringUtils.join(parentUser.getParentIds(), parentUser.getDistributionUserId(), StrUtil.COMMA)); + } + + distributionUser.setGrade(parentUser.getGrade() + 1); + } else { + throw new LuckException("当前邀请人已被封禁"); + } + } else { + distributionUser.setGrade(0); + } + } + + private void checkUserInfo(DistributionUserRegisterDTO distributionUserRegisterDTO, DistributionUserVO distributionUser) { + if (distributionUser != null) { + if (Objects.equals(distributionUser.getState(), DistributionUserStateEnum.WAIT_AUDIT.value())) { + // 你已经提交过审核了,请耐心等待 + throw new LuckException("你已经提交过审核了,请耐心等待"); + } else if (Objects.equals(distributionUser.getState(), DistributionUserStateEnum.PER_BAN.value())) { + // 该账户已被永久封禁 + throw new LuckException("该账户已被永久封禁"); + } else if (Objects.equals(distributionUser.getState(), DistributionUserStateEnum.BAN.value())) { + // 已暂时封禁不可申请,请联系管理员 + throw new LuckException("已暂时封禁不可申请,请联系管理员"); + } else if (Objects.equals(distributionUser.getState(), DistributionUserStateEnum.NORMAL.value())) { + // 你的审核已经通过,无需再次审核 + throw new LuckException("你的审核已经通过,无需再次审核"); + } + } + List distributionUsersDb = distributionUserService.getDistributionUserByIdCardNumberAndUserMobile(distributionUserRegisterDTO.getIdentityCardNumber(), distributionUserRegisterDTO.getUserMobile()); + for (DistributionUser distributionUserDb : distributionUsersDb) { + if (StrUtil.isNotBlank(distributionUserRegisterDTO.getIdentityCardNumber()) && StrUtil.equals(distributionUserDb.getIdentityCardNumber(), distributionUserRegisterDTO.getIdentityCardNumber())) { + // 该身份证号码已存在 + throw new LuckException("该身份证号码已在系统存在"); + } else if (Objects.equals(distributionUserDb.getUserMobile(), distributionUserRegisterDTO.getUserMobile())) { + // 该手机号码已存在 + throw new LuckException("该手机号码已在系统存在"); + } + } + } + + private void autoCheck(DistributionConfigApiVO distributionConfig, Long userId, DistributionUser distributionUser) { + //判断是否需要购买置指定商品 + if (CollUtil.isNotEmpty(distributionConfig.getSpuIdList())) { + boolean has = false; + Long distributionUserUserId = distributionUser.getUserId(); + for (Long spu : distributionConfig.getSpuIdList()) { + // 判断有没有没有购买过指定商品 + ServerResponseEntity orderResponse = orderFeignClient.hasBuySuccessProd(spu, distributionUserUserId); + if (!orderResponse.isSuccess()) { + throw new LuckException(orderResponse.getMsg()); + } + if (orderResponse.getData() > 0L) { + has = true; + break; + } + } + if (!has) { + // 不符合申请条件,请联系客服进行申请 + throw new LuckException("不符合申请条件,请联系客服进行申请"); + } + } + // 获取用户金额统计数据 + ServerResponseEntity userShoppingDataResponse = orderFeignClient.calculateUserInShopData(userId); + if (!userShoppingDataResponse.isSuccess()) { + // 消费金额不符合要求 + throw new LuckException("消费金额不符合要求"); + } + UserShoppingDataVO userShoppingData = userShoppingDataResponse.getData(); + + //判断是否需要消费金额条件 + if (distributionConfig.getExpenseAmount() != null) { + if (userShoppingData.getSumOfConsumption() == null) { + userShoppingData.setSumOfConsumption(0L); + } + // 转换成元 + BigDecimal sumOfConsumption = PriceUtil.toDecimalPrice(userShoppingData.getSumOfConsumption()); + if (sumOfConsumption.compareTo(distributionConfig.getExpenseAmount()) < 0) { + // 消费金额不符合要求 + throw new LuckException("消费金额不符合要求"); + } + } + //判断是否需要达到消费笔数条件 + if (distributionConfig.getExpenseNumber() != null) { + if (userShoppingData.getExpenseNumber() < distributionConfig.getExpenseNumber()) { + // 消费笔数不符合要求 + throw new LuckException("消费笔数不符合要求"); + } + } + distributionUser.setState(DistributionUserStateEnum.NORMAL.value()); + distributionUser.setBindTime(new Date()); + } + + /** + * 分销员通联信息检查 + */ + private void distributionAllinpayCheck() { + // 是否开启通联支付(若开启需检查通联平台的账号信息) + String data = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG).getData(); + if (!ObjectUtils.isEmpty(data)) { + PaySettlementConfig config = JSON.parseObject(data, PaySettlementConfig.class); + if (config.getPaySettlementType() != null && config.getPaySettlementType() == 1) { + // 查询通联平台会员信息 + String bizUserId = String.valueOf(AuthUserContext.get().getUserId()); + ServerResponseEntity resp = allinpayFeignClient.getPersonalMemberInfo(bizUserId); + if (!resp.isSuccess() || ObjectUtils.isEmpty(resp.getData())) { + throw new LuckException("通联会员未开通or通联服务异常,请联系管理员进行处理"); + } + PersonalMemberInfo personalMemberInfo = resp.getData(); + // 检查是否实名认证 + if (personalMemberInfo.getIdentityChecked() == null + || !personalMemberInfo.getIdentityChecked()) { + throw new LuckException("通联未实名认证"); + } + // 检查是否绑定手机号 + if (personalMemberInfo.getPhoneChecked() == null + || !personalMemberInfo.getPhoneChecked()) { + throw new LuckException("通联未绑定手机号"); + } + // 检查是否绑定银行卡 + ServerResponseEntity> bankCardResp = allinpayFeignClient.listBindCard(bizUserId, null); + if (!bankCardResp.isSuccess() || CollectionUtils.isEmpty(bankCardResp.getData())) { + throw new LuckException("通联未绑定银行卡"); + } + } + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionWithdrawCashController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionWithdrawCashController.java new file mode 100644 index 0000000..318bf77 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/app/DistributionWithdrawCashController.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.app; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.constant.SocialType; +import com.tmerclub.cloud.api.auth.feign.AuthSocialFeignClient; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthSocialVO; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.distribution.constant.DistributionUserStateEnum; +import com.tmerclub.cloud.distribution.dto.AppDistributionWithdrawCashDTO; +import com.tmerclub.cloud.distribution.dto.RangeTimeDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +import com.tmerclub.cloud.distribution.service.DistributionWithdrawCashService; +import com.tmerclub.cloud.distribution.vo.AppDistributionWithdrawCashLogVO; +import com.tmerclub.cloud.distribution.vo.AppDistributionWithdrawCashVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 分销员提现记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@RestController("appDistributionWithdrawCashController") +@RequestMapping("/distribution_withdraw_cash") +@Tag(name = "分销员提现记录") +public class DistributionWithdrawCashController { + + @Autowired + private DistributionWithdrawCashService distributionWithdrawCashService; + @Autowired + private DistributionUserService distributionUserService; + @Autowired + private DistributionConfigService distributionConfigService; + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @DubboReference + private AuthSocialFeignClient authSocialFeignClient; + @DubboReference + private TokenFeignClient tokenFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取分销员提现记录列表", description = "分页获取分销员提现记录列表") + public ServerResponseEntity> pageByUserId(@Valid PageDTO pageDTO) { + Long userId = AuthUserContext.get().getUserId(); + DistributionUserVO distributionUserVO = distributionUserService.getByUserId(userId); + if (Objects.isNull(distributionUserVO)) { + // 您还不是分销员 + throw new LuckException("您还不是分销员"); + } + PageVO distributionWithdrawCashPage = distributionWithdrawCashService.pageByDistributionUserId(pageDTO, distributionUserVO.getDistributionUserId()); + // 将结果封装一下,以年月为分界线处理, + PageVO resPageVO = handleGroupByYearAndMonth(distributionWithdrawCashPage); + return ServerResponseEntity.success(resPageVO); + } + + private PageVO handleGroupByYearAndMonth(PageVO distributionWithdrawCashPage) { + PageVO resPage = new PageVO<>(); + resPage.setTotal(distributionWithdrawCashPage.getTotal()); + resPage.setPages(distributionWithdrawCashPage.getPages()); + List list = distributionWithdrawCashPage.getList(); + if (CollUtil.isEmpty(list)) { + return resPage; + } + // list的必须是已经倒序updateTime排序后的顺序 + // 将日期设置为月开始的第一天,然后直接根据时间进行分组就可以了 + for (AppDistributionWithdrawCashVO withdrawCashVO : list) { + Date createTime = withdrawCashVO.getCreateTime(); + DateTime beginOfMonth = DateUtil.beginOfMonth(createTime); + withdrawCashVO.setMonthTimeStr(DateUtil.formatDateTime(beginOfMonth)); + } + // 分组, 由数据库update_time字段设计,不可能为空,无需做为空处理 + Map> listMap = list.stream().collect(Collectors.groupingBy(AppDistributionWithdrawCashVO::getMonthTimeStr)); + // 为改变前的数据 + List resList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (String dateStr : listMap.keySet()) { + AppDistributionWithdrawCashLogVO logVO = new AppDistributionWithdrawCashLogVO(); + logVO.setDate(DateUtil.parseDate(dateStr)); + logVO.setDistributionWithdrawCashList(listMap.get(dateStr)); + resList.add(logVO); + } + resPage.setList(resList.stream().sorted(Comparator.comparing(AppDistributionWithdrawCashLogVO::getDate).reversed()).collect(Collectors.toList())); + return resPage; + } + + + @PostMapping("/apply") + @Operation(summary = "用户发起提现申请", description = "填入提现参数") + public ServerResponseEntity apply(@Valid @RequestBody AppDistributionWithdrawCashDTO distributionWithdrawCashDTO) { + LoginInfoBO loginInfoBO = tokenFeignClient.getLoginInfo(); + Long userId = AuthUserContext.getUserId(); + UidInfoBO uidInfoBO = AuthUserContext.get(); + String uid = AuthUserContext.getUid(uidInfoBO); + DistributionUserVO distributionUserVO = distributionUserService.getByUserId(userId); + if (Objects.isNull(distributionUserVO)) { + // 您还不是分销员 + throw new LuckException("您还不是分销员"); + } + if (!Objects.equals(distributionUserVO.getState(), DistributionUserStateEnum.NORMAL.value())) { + // 您的分销身份异常,请联系管理员 + throw new LuckException("您的分销身份异常,请联系管理员"); + } + AuthSocialVO authSocialVO = authSocialFeignClient.getByUserIdAndSocialType(loginInfoBO.getBizUserId(), SocialType.MA.value()).getData(); + + if (Objects.isNull(authSocialVO)) { + throw new LuckException("您未绑定微信,请先在微信小程序授权登录后再提现"); + } + //发起提现 + distributionWithdrawCashService.apply(distributionWithdrawCashDTO, distributionUserVO, authSocialVO); + return ServerResponseEntity.success(); + } + + @GetMapping("/is_withdraw_cash") + @Operation(summary = "当前是否可以提现") + public ServerResponseEntity isWithdrawCash() { + Long userId = AuthUserContext.get().getUserId(); + DistributionUserVO distributionUserVO = distributionUserService.getByUserId(userId); + Long distributionUserId = distributionUserVO.getDistributionUserId(); + //获取店铺提现设置 + DistributionConfigApiVO distributionConfig = distributionConfigService.getDistributionConfig(); + //获取店铺设置的提现频率算出时间区间 + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - distributionConfig.getFrequency()); + //获取玩家最近的提现次数 + //判断是否能够提现 + Integer count = distributionWithdrawCashService.getCountByRangeTimeAndDistributionUserId(new RangeTimeDTO(calendar.getTime(), new Date()), distributionUserId); + if (count >= distributionConfig.getNumber()) { + // 提现次数为x天x次 + throw new LuckException("提现次数为" + distributionConfig.getFrequency() + "天" + distributionConfig.getNumber() + "次"); + } + return ServerResponseEntity.success(true); + } + + @GetMapping("/total_withdraw_cash") + @Operation(summary = "查看用户总提现金额") + public ServerResponseEntity getUserTotalWithdrawCash() { + Long userId = AuthUserContext.get().getUserId(); + DistributionUserVO distributionUserVO = distributionUserService.getByUserId(userId); + if (Objects.isNull(distributionUserVO)) { + // 您还不是分销员 + throw new LuckException("您还不是分销员"); + } + Long distributionUserId = distributionUserVO.getDistributionUserId(); + DistributionUserWallet distributionUserWallet = distributionUserWalletService.getByDistributionUserId(distributionUserId); + Long totalWithdrawCash = distributionWithdrawCashService.getUserTotalWithdrawCash(distributionUserWallet.getWalletId()); + return ServerResponseEntity.success(totalWithdrawCash); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionMsgController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionMsgController.java new file mode 100644 index 0000000..3b1035e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionMsgController.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.distribution.dto.DistributionMsgDTO; +import com.tmerclub.cloud.distribution.model.DistributionMsg; +import com.tmerclub.cloud.distribution.service.DistributionMsgService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +/** + * 分销公告信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +@RestController("platformDistributionMsgController") +@RequestMapping("/p/distribution_msg") +@Tag(name = "分销公告信息") +public class DistributionMsgController { + + @Autowired + private DistributionMsgService distributionMsgService; + + + @GetMapping("/page") + @Operation(summary = "获取分销公告信息列表", description = "分页获取分销公告信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, String msgTitle) { + PageVO distributionMsgPage = distributionMsgService.page(pageDTO, msgTitle); + return ServerResponseEntity.success(distributionMsgPage); + } + + @GetMapping + @Operation(summary = "获取分销公告信息", description = "根据msgId获取分销公告信息") + public ServerResponseEntity getByMsgId(@RequestParam Long msgId) { + return ServerResponseEntity.success(distributionMsgService.getByMsgId(msgId)); + } + + @PostMapping + @Operation(summary = "保存分销公告信息", description = "保存分销公告信息") + public ServerResponseEntity save(@Valid @RequestBody DistributionMsgDTO distributionMsgDTO) { + DistributionMsg distributionMsg = BeanUtil.map(distributionMsgDTO, DistributionMsg.class); + distributionMsg.setMsgId(null); + distributionMsg.setUpdateTime(new Date()); + distributionMsgService.save(distributionMsg); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新分销公告信息", description = "更新分销公告信息") + public ServerResponseEntity update(@Valid @RequestBody DistributionMsgDTO distributionMsgDTO) { + DistributionMsg distributionMsg = BeanUtil.map(distributionMsgDTO, DistributionMsg.class); + distributionMsg.setUpdateTime(new Date()); + distributionMsgService.update(distributionMsg); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除分销公告信息", description = "根据分销公告信息id删除分销公告信息") + public ServerResponseEntity delete(@RequestBody List msgIds) { + distributionMsgService.deleteBatch(msgIds); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionSpuController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionSpuController.java new file mode 100644 index 0000000..5d8cb0a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionSpuController.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.service.DistributionSpuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 分销商品关联信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@RestController("platformDistributionSpuController") +@RequestMapping("/p/distribution_spu") +@Tag(name = "platform-分销商品关联信息") +public class DistributionSpuController { + + @Autowired + private DistributionSpuService distributionSpuService; + + @GetMapping + @Operation(summary = "获取分销商品关联信息", description = "根据distributionSpuId获取分销商品关联信息") + public ServerResponseEntity getByDistributionSpuId(@RequestParam Long distributionSpuId) { + return ServerResponseEntity.success(distributionSpuService.getByDistributionSpuId(distributionSpuId)); + } + + @PostMapping("/offline") + @Operation(summary = "下线分销商品", description = "下线分销商品") + public ServerResponseEntity offline(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + distributionSpuService.offline(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/audit") + @Operation(summary = "审核分销商品", description = "审核分销商品") + public ServerResponseEntity audit(@RequestBody OfflineHandleEventDTO offlineHandleEventDTO) { + distributionSpuService.audit(offlineHandleEventDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_offline_handle_event") + @Operation(summary = "获取分销商品下线信息", description = "获取分销商品下线信息") + public ServerResponseEntity getOfflineHandleEvent(@RequestParam("distributionSpuId") Long distributionSpuId) { + return ServerResponseEntity.success(distributionSpuService.getOfflineHandleEvent(distributionSpuId)); + } + + @DeleteMapping + @Operation(summary = "删除分销商品关联信息", description = "根据分销商品关联信息id删除分销商品关联信息") + public ServerResponseEntity delete(@RequestParam Long distributionSpuId) { + distributionSpuService.deleteByIdAndShopId(distributionSpuId, null); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserBanController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserBanController.java new file mode 100644 index 0000000..e85aae2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserBanController.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.dto.DistributionUserBanDTO; +import com.tmerclub.cloud.distribution.service.DistributionUserBanService; +import com.tmerclub.cloud.distribution.vo.DistributionUserBanVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 分销封禁记录 + * + * @author cl + * @date 2021-08-09 14:14:08 + */ +@RestController("platformDistributionUserBanController") +@RequestMapping("/p/distribution_user_ban") +@Tag(name = "platform-分销封禁记录") +public class DistributionUserBanController { + + @Autowired + private DistributionUserBanService distributionUserBanService; + + @GetMapping("/page") + @Operation(summary = "获取分销封禁记录列表", description = "分页获取分销封禁记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, DistributionUserBanDTO distributionUserBanDTO) { + PageVO page = distributionUserBanService.page(pageDTO, distributionUserBanDTO); + for (DistributionUserBanVO distributionUserBanVO : page.getList()) { + if (StrUtil.isNotBlank(distributionUserBanVO.getNickName()) && PrincipalUtil.isMobile(distributionUserBanVO.getNickName())) { + distributionUserBanVO.setNickName(PhoneUtil.hideBetween(distributionUserBanVO.getNickName()).toString()); + } + if (StrUtil.isNotBlank(distributionUserBanVO.getUserMobile())) { + distributionUserBanVO.setUserMobile(PhoneUtil.hideBetween(distributionUserBanVO.getUserMobile()).toString()); + } + } + return ServerResponseEntity.success(page); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserBindController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserBindController.java new file mode 100644 index 0000000..9f3371b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserBindController.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.dto.DistributionUserBindDTO; +import com.tmerclub.cloud.distribution.service.DistributionUserBindService; +import com.tmerclub.cloud.distribution.vo.DistributionUserBindVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 分销员绑定关系 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +@RestController("platformDistributionUserBindController") +@RequestMapping("/p/distribution_user_bind") +@Tag(name = "platform-分销员绑定关系") +public class DistributionUserBindController { + + @Autowired + private DistributionUserBindService distributionUserBindService; + + @GetMapping("/page") + @Operation(summary = "获取分销员绑定关系列表", description = "分页获取分销员绑定关系列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, DistributionUserBindDTO distributionUserBindDTO) { + PageVO page = distributionUserBindService.page(pageDTO, distributionUserBindDTO); + for (DistributionUserBindVO distributionUserBindVO : page.getList()) { + if (StrUtil.isNotBlank(distributionUserBindVO.getNickName()) && PrincipalUtil.isMobile(distributionUserBindVO.getNickName())) { + distributionUserBindVO.setNickName(PhoneUtil.hideBetween(distributionUserBindVO.getNickName()).toString()); + } + if (StrUtil.isNotBlank(distributionUserBindVO.getUserNickName()) && PrincipalUtil.isMobile(distributionUserBindVO.getUserNickName())) { + distributionUserBindVO.setUserNickName(PhoneUtil.hideBetween(distributionUserBindVO.getUserNickName()).toString()); + } + } + return ServerResponseEntity.success(page); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserController.java new file mode 100644 index 0000000..23939bb --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserController.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.dto.DistributionUserBanDTO; +import com.tmerclub.cloud.distribution.dto.DistributionUserDTO; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.model.DistributionUserBan; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletBillService; +import com.tmerclub.cloud.distribution.vo.DistributionUserAchievementVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserBanVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +/** + * 分销员信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@RestController("platformDistributionUserController") +@RequestMapping("/p/distribution_user") +@Tag(name = "platform-分销员信息") +public class DistributionUserController { + + @Autowired + private DistributionUserService distributionUserService; + + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + + @GetMapping("/page") + @Operation(summary = "获取分销员管理列表", description = "分页获取分销员管理列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, DistributionUserDTO distributionUserDTO) { + PageVO distributionUserPage = distributionUserService.distributionUserPage(pageDTO, distributionUserDTO); + setPhoneHide(distributionUserPage); + return ServerResponseEntity.success(distributionUserPage); + } + + @GetMapping("/achievement_page") + @Operation(summary = "获取分销业绩统计列表", description = "分页获取分销业绩统计") + public ServerResponseEntity> achievementPage(@Valid PageDTO pageDTO, DistributionUserDTO distributionUserDTO, String userMobile) { + PageVO page = distributionUserService.achievementPage(pageDTO, distributionUserDTO, userMobile); + //计算累计收益 + for (DistributionUserAchievementVO distributionUserAchievementVO : page.getList()) { + Long haveWithdrawalSum = distributionUserWalletBillService.getHaveWithdrawalSum(distributionUserAchievementVO.getWalletId()); + distributionUserAchievementVO.setAccumulateAmount(haveWithdrawalSum + distributionUserAchievementVO.getSettledAmount()); + } + for (DistributionUserAchievementVO record : page.getList()) { + if (StrUtil.isNotBlank(record.getNickName()) && PrincipalUtil.isMobile(record.getNickName())) { + record.setNickName(PhoneUtil.hideBetween(record.getNickName()).toString()); + } + if (StrUtil.isNotBlank(record.getUserMobile())) { + record.setUserMobile(PhoneUtil.hideBetween(record.getUserMobile()).toString()); + } + } + return ServerResponseEntity.success(page); + } + + @Operation(summary = "修改分销员的状态") + @PutMapping("/update_state") + public ServerResponseEntity updateState(@RequestBody DistributionUserBanDTO distributionUserBanDTO) { + DistributionUserBan distributionUserBan = BeanUtil.map(distributionUserBanDTO, DistributionUserBan.class); + distributionUserService.updateDistributionStateAndBan(distributionUserBan); + // 清除缓存 + DistributionUser dbDistributionUser = distributionUserService.getByDistributionUserId(distributionUserBanDTO.getDistributionUserId()); + distributionUserService.removeCacheByUserId(dbDistributionUser.getUserId()); + return ServerResponseEntity.success(); + } + + @Operation(summary = "获取分销员最新的封禁信息") + @GetMapping("/ban_info") + public ServerResponseEntity getLatestBanInfo(@RequestParam("distributionUserId") Long distributionUserId) { + DistributionUserBanVO distributionUserBanVO = distributionUserService.getLatestBanInfoByDistributionUserId(distributionUserId); + return ServerResponseEntity.success(distributionUserBanVO); + } + + private void setPhoneHide(PageVO distributionUserPage) { + for (DistributionUserVO distributionUserVO : distributionUserPage.getList()) { + if (StrUtil.isNotBlank(distributionUserVO.getInviteeMobile())) { + distributionUserVO.setInviteeMobile(PhoneUtil.hideBetween(distributionUserVO.getInviteeMobile()).toString()); + } + if (StrUtil.isNotBlank(distributionUserVO.getUserMobile())) { + distributionUserVO.setUserMobile(PhoneUtil.hideBetween(distributionUserVO.getUserMobile()).toString()); + } + if (StrUtil.isNotBlank(distributionUserVO.getInvitee()) && PrincipalUtil.isMobile(distributionUserVO.getInvitee())) { + distributionUserVO.setInvitee(PhoneUtil.hideBetween(distributionUserVO.getInvitee()).toString()); + } + if (StrUtil.isNotBlank(distributionUserVO.getNickName()) && PrincipalUtil.isMobile(distributionUserVO.getNickName())) { + distributionUserVO.setNickName(PhoneUtil.hideBetween(distributionUserVO.getNickName()).toString()); + } + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserIncomeController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserIncomeController.java new file mode 100644 index 0000000..3bfb44a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserIncomeController.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.dto.DistributionUserIncomeDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserIncome; +import com.tmerclub.cloud.distribution.service.DistributionUserIncomeService; +import com.tmerclub.cloud.distribution.vo.DistributionUserIncomeVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +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 cl + * @date 2021-08-09 14:14:09 + */ +@RestController("platformDistributionUserIncomeController") +@RequestMapping("/p/distribution_user_income") +@Tag(name = "分销收入记录信息") +public class DistributionUserIncomeController { + + @Autowired + private DistributionUserIncomeService distributionUserIncomeService; + + @GetMapping("/page") + @Operation(summary = "获取分销收入记录信息列表", description = "分页获取分销收入记录信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO distributionUserIncomePage = distributionUserIncomeService.page(pageDTO); + return ServerResponseEntity.success(distributionUserIncomePage); + } + + @GetMapping("/effect_page") + @Operation(summary = "获取分销推广效果列表", description = "分页获取分销推广效果列表") + public ServerResponseEntity> effectPage(@Valid PageDTO pageDTO, DistributionUserIncomeDTO distributionUserIncomeDTO, String userMobile) { + PageVO distributionUserIncomePage = distributionUserIncomeService.effectPage(pageDTO, distributionUserIncomeDTO, userMobile, Constant.PLATFORM_SHOP_ID); + for (DistributionUserIncomeVO record : distributionUserIncomePage.getList()) { + DistributionUserVO distributionUser = record.getDistributionUser(); + if (Objects.nonNull(distributionUser)) { + if (StrUtil.isNotBlank(distributionUser.getUserMobile())) { + distributionUser.setUserMobile(PhoneUtil.hideBetween(distributionUser.getUserMobile()).toString()); + } + if (StrUtil.isNotBlank(distributionUser.getNickName()) && PrincipalUtil.isMobile(distributionUser.getNickName())) { + distributionUser.setNickName(PhoneUtil.hideBetween(distributionUser.getNickName()).toString()); + } + } + } + return ServerResponseEntity.success(distributionUserIncomePage); + } + + @GetMapping + @Operation(summary = "获取分销收入记录信息", description = "根据incomeId获取分销收入记录信息") + public ServerResponseEntity getByIncomeId(@RequestParam Long incomeId) { + return ServerResponseEntity.success(distributionUserIncomeService.getByIncomeId(incomeId)); + } + + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserWalletBillController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserWalletBillController.java new file mode 100644 index 0000000..8b08c01 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionUserWalletBillController.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.dto.DistributionUserWalletBillDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletBillService; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletBillVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 分销员钱包流水记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@RestController("platformDistributionUserWalletBillController") +@RequestMapping("/p/distribution_user_wallet_bill") +@Tag(name = "分销员钱包流水记录") +public class DistributionUserWalletBillController { + + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + + @GetMapping("/page") + @Operation(summary = "获取分销员钱包流水记录列表", description = "分页获取分销员钱包流水记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO distributionUserWalletBillPage = distributionUserWalletBillService.page(pageDTO); + return ServerResponseEntity.success(distributionUserWalletBillPage); + } + + @GetMapping("/wallet_bill_page") + @Operation(summary = "获取分销员钱包流水记录列表", description = "分页获取分销员钱包流水记录列表") + public ServerResponseEntity> walletBillPage(@Valid PageDTO pageDTO, String userMobile, String nickName) { + PageVO pageVO = distributionUserWalletBillService.walletBillPage(pageDTO, userMobile, nickName); + for (DistributionUserWalletBillVO record : pageVO.getList()) { + DistributionUserVO distributionUser = record.getDistributionUserVO(); + if (Objects.nonNull(distributionUser)) { + if (StrUtil.isNotBlank(distributionUser.getUserMobile()) && PrincipalUtil.isMobile(distributionUser.getUserMobile())) { + distributionUser.setUserMobile(PhoneUtil.hideBetween(distributionUser.getUserMobile()).toString()); + } + if (StrUtil.isNotBlank(distributionUser.getNickName()) && PrincipalUtil.isMobile(distributionUser.getNickName())) { + distributionUser.setNickName(PhoneUtil.hideBetween(distributionUser.getNickName()).toString()); + } + } + } + return ServerResponseEntity.success(pageVO); + } + + @GetMapping + @Operation(summary = "获取分销员钱包流水记录", description = "根据id获取分销员钱包流水记录") + public ServerResponseEntity getById(@RequestParam Long id) { + return ServerResponseEntity.success(distributionUserWalletBillService.getById(id)); + } + + @PutMapping + @Operation(summary = "更新分销员钱包流水记录", description = "更新分销员钱包流水记录") + public ServerResponseEntity update(@Valid @RequestBody DistributionUserWalletBillDTO distributionUserWalletBillDTO) { + DistributionUserWalletBill distributionUserWalletBill = BeanUtil.map(distributionUserWalletBillDTO, DistributionUserWalletBill.class); + distributionUserWalletBillService.update(distributionUserWalletBill); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionWithdrawCashController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionWithdrawCashController.java new file mode 100644 index 0000000..1dc9a3a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/controller/platform/DistributionWithdrawCashController.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.DistributionAudit; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.distribution.constant.EnterprisePayStatus; +import com.tmerclub.cloud.distribution.dto.DistributionWithdrawCashDTO; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.model.DistributionWithdrawCash; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +import com.tmerclub.cloud.distribution.service.DistributionWithdrawCashService; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import com.tmerclub.cloud.distribution.vo.DistributionWithdrawCashVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +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; + +import java.util.Objects; + +/** + * 分销员提现记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@RestController("platformDistributionWithdrawCashController") +@RequestMapping("/p/distribution_withdraw_cash") +@Tag(name = "分销员提现记录") +public class DistributionWithdrawCashController { + + @Autowired + private DistributionWithdrawCashService distributionWithdrawCashService; + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @Autowired + private DistributionUserService distributionUserService; + @DubboReference + private ConfigFeignClient configFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取分销员提现记录列表", description = "分页获取分销员提现记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, String userMobile, DistributionWithdrawCashDTO distributionWithdrawCashDTO) { + PageVO distributionWithdrawCashPage = distributionWithdrawCashService.page(pageDTO, userMobile, distributionWithdrawCashDTO); + for (DistributionWithdrawCashVO record : distributionWithdrawCashPage.getList()) { + DistributionUserVO distributionUser = record.getDistributionUserVO(); + if (Objects.nonNull(distributionUser)) { + if (StrUtil.isNotBlank(distributionUser.getNickName()) && PrincipalUtil.isMobile(distributionUser.getNickName())) { + distributionUser.setNickName(PhoneUtil.hideBetween(distributionUser.getNickName()).toString()); + } + if (StrUtil.isNotBlank(distributionUser.getUserMobile())) { + distributionUser.setUserMobile(PhoneUtil.hideBetween(distributionUser.getUserMobile()).toString()); + } + } + } + return ServerResponseEntity.success(distributionWithdrawCashPage); + } + + + @PutMapping("/to_success") + @Operation(summary = "更新分销员提现记录", description = "更新分销员提现记录") + public ServerResponseEntity update(Long withdrawCashId) { + DistributionWithdrawCash distributionWithdrawCash = distributionWithdrawCashService.getByWithdrawCashId(withdrawCashId); + if (distributionWithdrawCash == null) { + // 无法获取提现信息 + throw new LuckException("无法获取提现信息"); + } + Long walletId = distributionWithdrawCash.getWalletId(); + DistributionUserWallet wallet = distributionUserWalletService.getByWalletId(walletId); + if (wallet == null) { + // 无法获取用户钱包信息 + throw new LuckException("无法获取用户钱包信息"); + } + DistributionUser distributionUser = distributionUserService.getByDistributionUserId(wallet.getDistributionUserId()); + if (distributionUser == null) { + // 无法获取用户信息 + throw new LuckException("无法获取用户信息"); + } + distributionWithdrawCash.setState(1); + distributionWithdrawCashService.update(distributionWithdrawCash); + + // 判断打款状态 1审核通过企业打款 2审核通过人工打款 + + if (!distributionWithdrawCash.getMoneyFlow().equals(DistributionAudit.Withdrawals_ONE.value())) { + return ServerResponseEntity.success(); + } + // 获取用户的openId + DistributionUserWallet one = distributionUserWalletService.getByWalletId(distributionWithdrawCash.getWalletId()); + + Long userId = distributionUserService.getByDistributionUserId(one.getDistributionUserId()).getUserId(); + // 添加企业支付记录 + distributionWithdrawCashService.enterprisePay(distributionWithdrawCash, userId, distributionWithdrawCash.getBizUserId(), EnterprisePayStatus.APPLY.getValue()); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionAuditingDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionAuditingDTO.java new file mode 100644 index 0000000..011b358 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionAuditingDTO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员申请信息DTO + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public class DistributionAuditingDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销员申请表") + private Long auditingId; + + @Schema(description = "邀请人id") + private Long parentDistributionUserId; + + @Schema(description = "申请人id") + private Long distributionUserId; + + @Schema(description = "申请时间") + private Date auditingTime; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "不通过原因(0 资料不足 1条件不足 2不招人 -1其他)") + private Integer reason; + + @Schema(description = "审核状态:0 未审核 1已通过 -1未通过") + private Integer state; + + @Schema(description = "操作人(0代表自动审核)") + private Long modifier; + + @Schema(description = "排序字段:分销员审核:0无 1申请时间") + private Integer sortParam; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + @Schema(description = "分销员手机号") + private String userMobile; + + @Schema(description = "分销员昵称") + private String nickName; + + public Long getAuditingId() { + return auditingId; + } + + public void setAuditingId(Long auditingId) { + this.auditingId = auditingId; + } + + public Long getParentDistributionUserId() { + return parentDistributionUserId; + } + + public void setParentDistributionUserId(Long parentDistributionUserId) { + this.parentDistributionUserId = parentDistributionUserId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public Integer getSortParam() { + return sortParam; + } + + public void setSortParam(Integer sortParam) { + this.sortParam = sortParam; + } + + public Integer getSortType() { + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Override + public String toString() { + return "DistributionAuditingDTO{" + + "auditingId=" + auditingId + + ", parentDistributionUserId=" + parentDistributionUserId + + ", distributionUserId=" + distributionUserId + + ", auditingTime=" + auditingTime + + ", remarks='" + remarks + '\'' + + ", reason=" + reason + + ", state=" + state + + ", modifier=" + modifier + + ", sortParam=" + sortParam + + ", sortType=" + sortType + + ", userMobile='" + userMobile + '\'' + + ", nickName='" + nickName + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionMsgDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionMsgDTO.java new file mode 100644 index 0000000..337ce7b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionMsgDTO.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销公共信息DTO + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public class DistributionMsgDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "公告表") + private Long msgId; + + @Schema(description = "公告标题") + private String msgTitle; + + @Schema(description = "指定上线时间") + private Date startTime; + + @Schema(description = "指定下线时间") + private Date endTime; + + @Schema(description = "是否置顶(0 不置顶 1 置顶)") + private Integer isTop; + + @Schema(description = "公告内容") + private String content; + + public Long getMsgId() { + return msgId; + } + + public void setMsgId(Long msgId) { + this.msgId = msgId; + } + + public String getMsgTitle() { + return msgTitle; + } + + public void setMsgTitle(String msgTitle) { + this.msgTitle = msgTitle; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "DistributionMsgDTO{" + + "msgId=" + msgId + + ",msgTitle=" + msgTitle + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",isTop=" + isTop + + ",content=" + content + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuBindDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuBindDTO.java new file mode 100644 index 0000000..5c0ef1e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionSpuBindDTO.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户商品绑定信息DTO + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpuBindDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户商品绑定表") + private Long id; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "绑定时间") + private Date bindTime; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "状态(0失效 1生效) 分销员被封禁 该状态失效") + private Integer state; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionSpuBindDTO{" + + "id=" + id + + ", distributionUserId=" + distributionUserId + + ", userId=" + userId + + ", bindTime=" + bindTime + + ", spuId=" + spuId + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserBanDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserBanDTO.java new file mode 100644 index 0000000..a85b840 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserBanDTO.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销封禁记录DTO + * + * @author cl + * @date 2021-08-09 14:14:08 + */ +public class DistributionUserBanDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long banId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "原因(0 失去联系 1恶意刷单 2其他)") + private Integer banReason; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "状态(1 正常 2暂时封禁 -1永久封禁)") + private Integer state; + + @Schema(description = "修改人") + private Long modifier; + + @Schema(description = "分销员手机号") + private String userMobile; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "排序字段:分销管理-分销员-封禁记录: 0无 1操作时间") + private Integer sortParam; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + public Long getBanId() { + return banId; + } + + public void setBanId(Long banId) { + this.banId = banId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getBanReason() { + return banReason; + } + + public void setBanReason(Integer banReason) { + this.banReason = banReason; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public Integer getSortParam() { + return sortParam; + } + + public void setSortParam(Integer sortParam) { + this.sortParam = sortParam; + } + + public Integer getSortType() { + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Override + public String toString() { + return "DistributionUserBanDTO{" + + "banId=" + banId + + ", distributionUserId=" + distributionUserId + + ", banReason=" + banReason + + ", remarks='" + remarks + '\'' + + ", state=" + state + + ", modifier=" + modifier + + ", userMobile='" + userMobile + '\'' + + ", nickName='" + nickName + '\'' + + ", sortParam=" + sortParam + + ", sortType=" + sortType + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserBindDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserBindDTO.java new file mode 100644 index 0000000..86e94e2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserBindDTO.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员绑定关系DTO + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public class DistributionUserBindDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户关系表") + private Long bindId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "当前绑定关系(-1失效 0 预绑定 1生效)") + private Integer state; + + @Schema(description = "失效原因(0 超过有效期 1抢客 2 管理员更改 3.暂时封禁)") + private Integer invalidReason; + + @Schema(description = "绑定时间") + private Date bindTime; + + @Schema(description = "失效时间") + private Date invalidTime; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "排序字段:分销管理-分销员-关系查询: 0无 1绑定时间 2失效时间") + private Integer sortParam; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + @Schema(description = "分销员号码") + private String userMobile; + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public Long getBindId() { + return bindId; + } + + public void setBindId(Long bindId) { + this.bindId = bindId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getInvalidReason() { + return invalidReason; + } + + public void setInvalidReason(Integer invalidReason) { + this.invalidReason = invalidReason; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Date getInvalidTime() { + return invalidTime; + } + + public void setInvalidTime(Date invalidTime) { + this.invalidTime = invalidTime; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Integer getSortParam() { + return sortParam; + } + + public void setSortParam(Integer sortParam) { + this.sortParam = sortParam; + } + + public Integer getSortType() { + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + @Override + public String toString() { + return "DistributionUserBindDTO{" + + "bindId=" + bindId + + ", distributionUserId=" + distributionUserId + + ", userId=" + userId + + ", state=" + state + + ", invalidReason=" + invalidReason + + ", bindTime=" + bindTime + + ", invalidTime=" + invalidTime + + ", nickName='" + nickName + '\'' + + ", sortParam=" + sortParam + + ", sortType=" + sortType + + ", userMobile='" + userMobile + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserIncomeDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserIncomeDTO.java new file mode 100644 index 0000000..b57406f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserIncomeDTO.java @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 分销收入记录信息DTO + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public class DistributionUserIncomeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收入记录id") + private Long incomeId; + + @Schema(description = "钱包id") + private Long walletId; + + @Schema(description = "收入类型(1一代奖励、2二代奖励 3邀请奖励 等 )") + private Integer incomeType; + + @Schema(description = "佣金状态(0:待支付、1:待结算、2:已结算、-1:订单失效)") + private Integer state; + + @Schema(description = "佣金数额") + private Long incomeAmount; + + @Schema(description = "关联订购流水号") + private String orderId; + + @Schema(description = "关联订单项order_item_id") + private Long orderItemId; + + @Schema(description = "商户订单号") + private String merchantOrderId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "操作人id") + private Long modifier; + + @Schema(description = "分销业绩-推广效果:0无 1佣金 2创建时间 3更新时间") + private Integer sortParam; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "分销员") + private DistributionUserDTO distributionUser; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "分销员手机号") + private String userMobile; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺id列表") + private List shopIds; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品id列表") + private List spuIds; + + @Schema(description = "支付系统类型") + @Hidden + private Integer paySysType; + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public List getSpuIds() { + return spuIds; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public DistributionUserDTO getDistributionUser() { + return distributionUser; + } + + public void setDistributionUser(DistributionUserDTO distributionUser) { + this.distributionUser = distributionUser; + } + + public Long getIncomeId() { + return incomeId; + } + + public void setIncomeId(Long incomeId) { + this.incomeId = incomeId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Integer getIncomeType() { + return incomeType; + } + + public void setIncomeType(Integer incomeType) { + this.incomeType = incomeType; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getIncomeAmount() { + return incomeAmount; + } + + public void setIncomeAmount(Long incomeAmount) { + this.incomeAmount = incomeAmount; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public Integer getSortParam() { + if (sortParam == null) { + return 0; + } + return sortParam; + } + + public void setSortParam(Integer sortParam) { + this.sortParam = sortParam; + } + + public Integer getSortType() { + if (sortType == null) { + return 0; + } + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "DistributionUserIncomeDTO{" + + "incomeId=" + incomeId + + ", walletId=" + walletId + + ", incomeType=" + incomeType + + ", state=" + state + + ", incomeAmount=" + incomeAmount + + ", orderId='" + orderId + '\'' + + ", orderItemId=" + orderItemId + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", distributionUserId=" + distributionUserId + + ", modifier=" + modifier + + ", sortParam=" + sortParam + + ", sortType=" + sortType + + ", spuName='" + spuName + '\'' + + ", shopName='" + shopName + '\'' + + ", distributionUser=" + distributionUser + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", shopId=" + shopId + + ", shopIds=" + shopIds + + ", spuId=" + spuId + + ", spuIds=" + spuIds + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserRegisterDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserRegisterDTO.java new file mode 100644 index 0000000..710af1e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserRegisterDTO.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author cl + * @date 2021-08-16 10:04:14 + */ +public class DistributionUserRegisterDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "手机号码") + private String userMobile; + + @Schema(description = "真实姓名") + @Size(max = 50, message = "真实姓名长度应该小于{max}") + private String realName; + + @Schema(description = "身份证号") + private String identityCardNumber; + + @Schema(description = "身份证正面") + private String identityCardPicFront; + + @Schema(description = "身份证背面") + private String identityCardPicBack; + + @Schema(description = "手持身份证照片") + private String identityCardPicHold; + + @Schema(description = "分享者") + private String sharer; + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(String identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public String getIdentityCardPicFront() { + return identityCardPicFront; + } + + public void setIdentityCardPicFront(String identityCardPicFront) { + this.identityCardPicFront = identityCardPicFront; + } + + public String getIdentityCardPicBack() { + return identityCardPicBack; + } + + public void setIdentityCardPicBack(String identityCardPicBack) { + this.identityCardPicBack = identityCardPicBack; + } + + public String getIdentityCardPicHold() { + return identityCardPicHold; + } + + public void setIdentityCardPicHold(String identityCardPicHold) { + this.identityCardPicHold = identityCardPicHold; + } + + public String getSharer() { + return sharer; + } + + public void setSharer(String sharer) { + this.sharer = sharer; + } + + @Override + public String toString() { + return "DistributionUserRegisterDTO{" + + "userMobile='" + userMobile + '\'' + + ", realName='" + realName + '\'' + + ", identityCardNumber='" + identityCardNumber + '\'' + + ", identityCardPicFront='" + identityCardPicFront + '\'' + + ", identityCardPicBack='" + identityCardPicBack + '\'' + + ", identityCardPicHold='" + identityCardPicHold + '\'' + + ", sharer='" + sharer + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserWalletDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserWalletDTO.java new file mode 100644 index 0000000..467b997 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionUserWalletDTO.java @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import com.tmerclub.cloud.common.util.PriceUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 分销员钱包信息DTO + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionUserWalletDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销员钱包id") + private Long walletId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "待结算金额") + @Max(value = PriceUtil.MAX_AMOUNT, message = "最大值不能超过" + PriceUtil.MAX_AMOUNT) + @Min(value = Long.MIN_VALUE, message = "最小值不能小于" + Long.MIN_VALUE) + private BigDecimal unsettledAmount; + + @Schema(description = "可提现金额") + @Max(value = PriceUtil.MAX_AMOUNT, message = "最大值不能超过" + PriceUtil.MAX_AMOUNT) + @Min(value = Long.MIN_VALUE, message = "最小值不能小于" + Long.MIN_VALUE) + private BigDecimal settledAmount; + + @Schema(description = "已失效金额") + @Max(value = PriceUtil.MAX_AMOUNT, message = "最大值不能超过" + PriceUtil.MAX_AMOUNT) + @Min(value = Long.MIN_VALUE, message = "最小值不能小于" + Long.MIN_VALUE) + private BigDecimal invalidAmount; + + @Schema(description = "积累收益") + @Max(value = PriceUtil.MAX_AMOUNT, message = "最大值不能超过" + PriceUtil.MAX_AMOUNT) + @Min(value = Long.MIN_VALUE, message = "最小值不能小于" + Long.MIN_VALUE) + private BigDecimal accumulateAmount; + + @Schema(description = "乐观锁") + private Integer version; + + @Schema(description = "钱包状态(-1 已冻结 0未生效(分销审核未通过) 1正常)") + private Integer state; + + @Schema(description = "可提现的改变金额") + private Long changeAmount; + + public Long getChangeAmount() { + return changeAmount; + } + + public void setChangeAmount(Long changeAmount) { + this.changeAmount = changeAmount; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public BigDecimal getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(BigDecimal unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public BigDecimal getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(BigDecimal settledAmount) { + this.settledAmount = settledAmount; + } + + public BigDecimal getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(BigDecimal invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public BigDecimal getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(BigDecimal accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionUserWalletDTO{" + + "walletId=" + walletId + + ", distributionUserId=" + distributionUserId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + ", version=" + version + + ", state=" + state + + ", changeAmount=" + changeAmount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionWithdrawCashDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionWithdrawCashDTO.java new file mode 100644 index 0000000..5804492 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/DistributionWithdrawCashDTO.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销员提现记录DTO + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionWithdrawCashDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现记录id") + private Long withdrawCashId; + + @Schema(description = "钱包id") + private Long walletId; + + @Schema(description = "金额") + private Long amount; + + @Schema(description = "手续费") + private Long fee; + + @Schema(description = "类型(0 手动提现 1自动提现)") + private Integer type; + + @Schema(description = "资金流向(0微信红包、1企业付款到微信零钱)") + private Integer moneyFlow; + + @Schema(description = "商户订单号") + private String merchantOrderId; + + @Schema(description = "乐观锁") + private Integer version; + + @Schema(description = "提现状态(0:申请中 1:提现成功 -1:提现失败)") + private Integer state; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "分销业绩-推广效果:0无 1佣金 2创建时间 3更新时间") + private Integer sortParam; + + @Schema(description = "排序类型 0无 1 正序 2倒序") + private Integer sortType; + + public Long getWithdrawCashId() { + return withdrawCashId; + } + + public void setWithdrawCashId(Long withdrawCashId) { + this.withdrawCashId = withdrawCashId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getMoneyFlow() { + return moneyFlow; + } + + public void setMoneyFlow(Integer moneyFlow) { + this.moneyFlow = moneyFlow; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getSortParam() { + return sortParam; + } + + public void setSortParam(Integer sortParam) { + this.sortParam = sortParam; + } + + public Integer getSortType() { + return sortType; + } + + public void setSortType(Integer sortType) { + this.sortType = sortType; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Override + public String toString() { + return "DistributionWithdrawCashDTO{" + + "withdrawCashId=" + withdrawCashId + + ", walletId=" + walletId + + ", amount=" + amount + + ", fee=" + fee + + ", type=" + type + + ", moneyFlow=" + moneyFlow + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", version=" + version + + ", state=" + state + + ", nickName='" + nickName + '\'' + + ", sortParam=" + sortParam + + ", sortType=" + sortType + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/RangeTimeDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/RangeTimeDTO.java new file mode 100644 index 0000000..64309bc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/dto/RangeTimeDTO.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author cl + * @date 2021-08-17 09:52:03 + */ +public class RangeTimeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "起始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + public RangeTimeDTO() { + } + + public RangeTimeDTO(Date startTime, Date endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "RangeTimeDTO{" + + "startTime=" + startTime + + ", endTime=" + endTime + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/feign/DistributionFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/feign/DistributionFeignController.java new file mode 100644 index 0000000..6563e19 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/feign/DistributionFeignController.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.feign; + +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.service.*; +import com.tmerclub.cloud.distribution.service.*; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author cl + * @date 2021-08-05 15:38:50 + */ +@DubboService +public class DistributionFeignController implements DistributionFeignClient { + + @Autowired + private DistributionSpuService distributionSpuService; + @Autowired + private DistributionUserService distributionUserService; + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + @Autowired + private DistributionAuditingService distributionAuditingService; + + @Override + public ServerResponseEntity getByDistributionId(Long distributionId) { + DistributionSpuVO distributionSpuVO = distributionSpuService.getByDistributionSpuId(distributionId); + return ServerResponseEntity.success(distributionSpuVO); + } + + @Override + public ServerResponseEntity getBySpuId(Long spuId) { + DistributionSpuVO distributionSpuVO = distributionSpuService.getBySpuId(spuId); + return ServerResponseEntity.success(distributionSpuVO); + } + + @Override + public ServerResponseEntity handleSpuState(List spuIds, List shopIds, Integer state) { + distributionSpuService.handleSpuState(spuIds, shopIds, state); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity initDistributionBySwitchAllinpay() { + // 钱包初始化 + distributionUserWalletService.initDistributionWallet(); + // 流水记录初始化 + distributionUserWalletBillService.initDistributionWalletBill(); + // 自动拒绝未审核的分销员申请请求 + distributionAuditingService.autoRejectBySwitchAllinpay(); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/RefundShopNotifyDistributionConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/RefundShopNotifyDistributionConsumer.java new file mode 100644 index 0000000..864c9cc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/RefundShopNotifyDistributionConsumer.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.distribution.service.DistributionRefundService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 退款,店铺分账退款完成后,回退分销佣金 + * @author cl + * @date 2021-08-20 15:34:30 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.REFUND_SHOP_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.REFUND_SHOP_NOTIFY_DISTRIBUTION_GROUP) +public class RefundShopNotifyDistributionConsumer implements RocketMQListener { + private static final Logger logger = LoggerFactory.getLogger(RefundShopNotifyDistributionConsumer.class); + + @Autowired + private DistributionRefundService distributionRefundService; + + @Override + public void onMessage(OrderChangeShopWalletAmountBO message) { + logger.info("回退分销佣金,回调开始... message: {}", Json.toJsonString(message)); + distributionRefundService.refundDistributionAmount(message); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/UserNotifyDistributionConsumer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/UserNotifyDistributionConsumer.java new file mode 100644 index 0000000..0ff0c68 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/listener/UserNotifyDistributionConsumer.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.listener; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.distribution.bo.DistributionUserUpdateBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 修改分销员的昵称和分销员的头像 + * + * @author cl + * @date 2021-08-20 09:49:52 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.USER_NOTIFY_DISTRIBUTION_USER_TOPIC, consumerGroup = RocketMqConstant.USER_NOTIFY_DISTRIBUTION_USER_TOPIC) +public class UserNotifyDistributionConsumer implements RocketMQListener { + + private static final Logger logger = LoggerFactory.getLogger(UserNotifyDistributionConsumer.class); + + @Autowired + private DistributionUserService distributionUserService; + + @Override + public void onMessage(DistributionUserUpdateBO message) { + logger.info("修改分销员的信息回调开始... message: {}", Json.toJsonString(message)); + if (Objects.isNull(message)) { + return; + } + Long userId = message.getUserId(); + String nickName = message.getNickName(); + String pic = message.getPic(); + String userMobile = message.getUserMobile(); + DistributionUserVO distributionUserVO = distributionUserService.getByUserId(userId); + if (Objects.isNull(distributionUserVO)) { + return; + } + // 修改分销员的昵称和分销员的头像 + DistributionUser update = new DistributionUser(); + update.setDistributionUserId(distributionUserVO.getDistributionUserId()); + update.setNickName(StrUtil.isBlank(nickName) ? distributionUserVO.getNickName() : nickName); + update.setPic(StrUtil.isBlank(pic) ? distributionUserVO.getPic() : pic); + update.setUserMobile(StrUtil.isBlank(userMobile) ? distributionUserVO.getUserMobile() : userMobile); + distributionUserService.update(update); + distributionUserService.removeCacheByUserId(userId); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionAuditingMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionAuditingMapper.java new file mode 100644 index 0000000..6616b4d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionAuditingMapper.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.dto.DistributionAuditingDTO; +import com.tmerclub.cloud.distribution.model.DistributionAuditing; +import com.tmerclub.cloud.distribution.vo.DistributionAuditingVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销员申请信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public interface DistributionAuditingMapper { + + /** + * 获取分销员申请信息列表 + * @param distributionAuditing + * @return 分销员申请信息列表 + */ + List listDistributionAuditing(@Param("distributionAuditing") DistributionAuditingDTO distributionAuditing); + + /** + * 根据分销员申请信息id获取分销员申请信息 + * + * @param auditingId 分销员申请信息id + * @return 分销员申请信息 + */ + DistributionAuditing getByAuditingId(@Param("auditingId") Long auditingId); + + /** + * 保存分销员申请信息 + * @param distributionAuditing 分销员申请信息 + */ + void save(@Param("distributionAuditing") DistributionAuditing distributionAuditing); + + /** + * 更新分销员申请信息 + * @param distributionAuditing 分销员申请信息 + */ + void update(@Param("distributionAuditing") DistributionAuditing distributionAuditing); + + /** + * 根据分销员申请信息id删除分销员申请信息 + * @param auditingId + */ + void deleteById(@Param("auditingId") Long auditingId); + + /** + * 获取分销员申请信息 + * @param distributionUserId 分销员id + * @return 分销员申请信息 + */ + DistributionAuditingVO getByDistributionUserId(@Param("distributionUserId") Long distributionUserId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionMsgMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionMsgMapper.java new file mode 100644 index 0000000..b2e2fd6 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionMsgMapper.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.model.DistributionMsg; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销公告信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public interface DistributionMsgMapper { + + /** + * 获取分销公告信息列表 + * + * @param msgTitle 公告标题 + * @return 分销公告信息列表 + */ + List list(@Param("msgTitle") String msgTitle); + + /** + * 获取APP分销公告信息列表 + * + * @param isTop + * @return 分销公告信息列表 + */ + List listApp(Integer isTop); + + /** + * 根据分销公告信息id获取分销公告信息 + * + * @param msgId 分销公告信息id + * @return 分销公告信息 + */ + DistributionMsg getByMsgId(@Param("msgId") Long msgId); + + /** + * 保存分销公告信息 + * + * @param distributionMsg 分销公告信息 + */ + void save(@Param("distributionMsg") DistributionMsg distributionMsg); + + /** + * 更新分销公告信息 + * + * @param distributionMsg 分销公告信息 + */ + void update(@Param("distributionMsg") DistributionMsg distributionMsg); + + /** + * 根据分销公告信息id删除分销公告信息 + * + * @param msgId + */ + void deleteById(@Param("msgId") Long msgId); + + /** + * 批量删除公告 + * + * @param msgIds + */ + void deleteBatch(@Param("msgIds") List msgIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuLogMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuLogMapper.java new file mode 100644 index 0000000..632b1fa --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuLogMapper.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.model.DistributionSpuLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销商品浏览记录信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionSpuLogMapper { + + /** + * 获取分销商品浏览记录信息列表 + * @return 分销商品浏览记录信息列表 + */ + List list(); + + /** + * 根据分销商品浏览记录信息id获取分销商品浏览记录信息 + * + * @param distributionSpuLogId 分销商品浏览记录信息id + * @return 分销商品浏览记录信息 + */ + DistributionSpuLog getByDistributionSpuLogId(@Param("distributionSpuLogId") Long distributionSpuLogId); + + /** + * 保存分销商品浏览记录信息 + * @param distributionSpuLog 分销商品浏览记录信息 + */ + void save(@Param("distributionSpuLog") DistributionSpuLog distributionSpuLog); + + /** + * 更新分销商品浏览记录信息 + * @param distributionSpuLog 分销商品浏览记录信息 + */ + void update(@Param("distributionSpuLog") DistributionSpuLog distributionSpuLog); + + /** + * 根据分销商品浏览记录信息id删除分销商品浏览记录信息 + * @param distributionSpuLogId + */ + void deleteById(@Param("distributionSpuLogId") Long distributionSpuLogId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuMapper.java new file mode 100644 index 0000000..5f9b729 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionSpuMapper.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.distribution.model.DistributionSpu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销商品关联信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionSpuMapper { + + /** + * 根据分销商品关联信息id获取分销商品关联信息 + * + * @param distributionSpuId 分销商品关联信息id + * @return 分销商品关联信息 + */ + DistributionSpuVO getByDistributionSpuId(@Param("distributionSpuId") Long distributionSpuId); + + /** + * 保存分销商品关联信息 + * + * @param distributionSpu 分销商品关联信息 + */ + void save(@Param("distributionSpu") DistributionSpu distributionSpu); + + /** + * 更新分销商品关联信息 + * + * @param distributionSpu 分销商品关联信息 + */ + void update(@Param("distributionSpu") DistributionSpu distributionSpu); + + /** + * 根据分销商品关联信息id删除分销商品关联信息 + * + * @param distributionSpuId + */ + void deleteById(@Param("distributionSpuId") Long distributionSpuId); + + /** + * 根据商品id获取分销信息 + * + * @param spuId + * @return + */ + DistributionSpuVO getBySpuId(@Param("spuId") Long spuId); + + /** + * 根据主键id与店铺id删除分销信息 + * + * @param distributionSpuId + * @param shopId + */ + void deleteByIdAndShopId(@Param("distributionSpuId") Long distributionSpuId, @Param("shopId") Long shopId); + + /** + * 更新分销商品状态 + * + * @param distributionSpuId + * @param oldState + * @param newState + * @return + */ + int changeStateByDistributionId(@Param("distributionSpuId") Long distributionSpuId, @Param("oldState") Integer oldState, @Param("newState") Integer newState); + + /** + * 根据商品id与状态统计数量 + * + * @param spuId + * @param state + * @return + */ + int countBySpuIdAndState(@Param("spuId") Long spuId, @Param("state") Integer state); + + /** + * 根据商品状态和商品id + * + * @param state 商品状态 + * @param spuIds 商品id集合 + * @return 分销商品 + */ + List getByStateAndSpuIds(@Param("state") Integer state, @Param("spuIds") List spuIds); + + /** + * 获取下架商品列表 + * + * @param spuIds + * @param shopIds + * @return + */ + List getDistributionSpuListBySpuIdsAndShopIds(@Param("spuIds") List spuIds, @Param("shopIds") List shopIds); + + /** + * 更新状态 + * + * @param spuIds + * @param state + */ + void updateState(@Param("spuIds") List spuIds, @Param("state") Integer state); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserMapper.java new file mode 100644 index 0000000..8eba8fb --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserMapper.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.dto.DistributionUserDTO; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.vo.AchievementDataVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserAchievementVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserSimpleInfoVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销员信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionUserMapper { + + /** + * 获取分销员管理列表 + * + * @param distributionUserDTO 搜索参数 + * @return 分销员信息列表 + */ + List listDistributionUser(@Param("distributionUser") DistributionUserDTO distributionUserDTO); + + /** + * 根据分销员信息id获取分销员信息 + * + * @param distributionUserId 分销员信息id + * @return 分销员信息 + */ + DistributionUser getByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + + /** + * 保存分销员信息 + * + * @param distributionUser 分销员信息 + */ + void save(@Param("distributionUser") DistributionUser distributionUser); + + /** + * 更新分销员信息 + * + * @param distributionUser 分销员信息 + */ + void update(@Param("distributionUser") DistributionUser distributionUser); + + /** + * 根据分销员信息id删除分销员信息 + * + * @param distributionUserId + */ + void deleteById(@Param("distributionUserId") Long distributionUserId); + + /** + * 分页获取分销业绩统计信息 + * + * @param distributionUserDTO 分销员信息 + * @param userMobile 分销员手机号 + * @return + */ + List achievementPage(@Param("distributionUserDTO") DistributionUserDTO distributionUserDTO, @Param("userMobile") String userMobile); + + /** + * 根据分销员userId获取分销员信息 + * + * @param userId 用户id + * @return 分销员信息 + */ + DistributionUserVO getByUserId(@Param("userId") Long userId); + + /** + * 根据分销员id清除他的下级关系 + * + * @param distributionUserId 被永久封禁的分销员id + */ + void updateParentIdById(@Param("distributionUserId") Long distributionUserId); + + /** + * 修改分销员状态 + * + * @param distributionUser 修改信息 + */ + void updateStatus(@Param("distributionUser") DistributionUser distributionUser); + + /** + * 获取分销员列表 + * + * @param identityCardNumber 分销员身份证信息 + * @param userMobile 手机号 + * @return 分销员列表 + */ + List getDistributionUserByIdCardNumberAndUserMobile(@Param("identityCardNumber") String identityCardNumber, @Param("userMobile") String userMobile); + + /** + * 分销员业绩数据 + * + * @param distributionUserId 分销员id + * @return 分销员业绩数据 + */ + AchievementDataVO getAchievementDataById(@Param("distributionUserId") Long distributionUserId); + + /** + * 获取精简版分销员数据列表 + * + * @param parentDistributionUserId 上级分销员id + * @return 精简版分销员分页数据 + */ + List getPageDistributionUserSimpleInfoByParentUserId(@Param("parentDistributionUserId") Long parentDistributionUserId); + + /** + * 根据上级分销id获取下级分销员集合 + * + * @param parentId + * @return + */ + List getDistributionUserListByParentUserId(@Param("parentId") Long parentId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserWalletBillMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserWalletBillMapper.java new file mode 100644 index 0000000..32b90f0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserWalletBillMapper.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletBillVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销员钱包流水记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public interface DistributionUserWalletBillMapper { + + /** + * 获取分销员钱包流水记录列表 + * @return 分销员钱包流水记录列表 + */ + List list(); + + /** + * 根据分销员钱包流水记录id获取分销员钱包流水记录 + * + * @param id 分销员钱包流水记录id + * @return 分销员钱包流水记录 + */ + DistributionUserWalletBill getById(@Param("id") Long id); + + /** + * 保存分销员钱包流水记录 + * @param distributionUserWalletBill 分销员钱包流水记录 + */ + void save(@Param("distributionUserWalletBill") DistributionUserWalletBill distributionUserWalletBill); + + /** + * 更新分销员钱包流水记录 + * @param distributionUserWalletBill 分销员钱包流水记录 + */ + void update(@Param("distributionUserWalletBill") DistributionUserWalletBill distributionUserWalletBill); + + /** + * 根据分销员钱包流水记录id删除分销员钱包流水记录 + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 获取分销员钱包流水记录列表 + * @param userMobile 分销员手机号码 + * @return + */ + List walletBillPage(@Param("userMobile") String userMobile, + @Param("nickName") String nickName); + + /** + * 批量保存分销员钱包流水 + * @param distributionUserWalletBills 分销员钱包流水 + */ + void saveBatch(@Param("distributionUserWalletBills") List distributionUserWalletBills); + + /** + * 根据钱包id获取已提现金额 + * @param walletId + * @return + */ + Long getHaveWithdrawalSum(@Param("walletId") Long walletId); + + /** + * 初始化分销员钱包流水 + */ + void initDistributionWalletBill(); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserWalletMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserWalletMapper.java new file mode 100644 index 0000000..02da309 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionUserWalletMapper.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销员钱包信息 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public interface DistributionUserWalletMapper { + + /** + * 获取分销员钱包信息列表 + * + * @return 分销员钱包信息列表 + */ + List list(); + + /** + * 根据分销员钱包信息id获取分销员钱包信息 + * + * @param walletId 分销员钱包信息id + * @return 分销员钱包信息 + */ + DistributionUserWallet getByWalletId(@Param("walletId") Long walletId); + + /** + * 保存分销员钱包信息 + * + * @param distributionUserWallet 分销员钱包信息 + */ + void save(@Param("distributionUserWallet") DistributionUserWallet distributionUserWallet); + + /** + * 更新分销员钱包信息 + * + * @param distributionUserWallet 分销员钱包信息 + */ + void update(@Param("distributionUserWallet") DistributionUserWallet distributionUserWallet); + + /** + * 根据分销员钱包信息id删除分销员钱包信息 + * + * @param walletId + */ + void deleteById(@Param("walletId") Long walletId); + + /** + * 分页获取分销员钱包 + * + * @param userMobile 分销员手机号 + * @return + */ + List walletPage(@Param("userMobile") String userMobile); + + /** + * 永久封禁时根据分销员id更改金额为0 + * + * @param distributionUserId 分销员id + */ + void updateAmountByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + + /** + * 根据分销员id 获取分销员钱包信息 + * + * @param distributionUserId 分销员id + * @return 分销员钱包信息 + */ + DistributionUserWallet getByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + + /** + * 更新分销员钱包 + * + * @param updateWallet 分销员钱包 + * @return 受影响行数 + */ + int updateWalletAmount(@Param("updateWallet") DistributionUserWallet updateWallet); + + /** + * 初始化分销员钱包 + */ + void initDistributionWallet(); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionWithdrawCashMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionWithdrawCashMapper.java new file mode 100644 index 0000000..71e44d2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/mapper/DistributionWithdrawCashMapper.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.mapper; + +import com.tmerclub.cloud.distribution.dto.DistributionWithdrawCashDTO; +import com.tmerclub.cloud.distribution.dto.RangeTimeDTO; +import com.tmerclub.cloud.distribution.model.DistributionWithdrawCash; +import com.tmerclub.cloud.distribution.vo.AppDistributionWithdrawCashVO; +import com.tmerclub.cloud.distribution.vo.DistributionWithdrawCashVO; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 分销员提现记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public interface DistributionWithdrawCashMapper { + + /** + * 根据分销员提现记录id获取分销员提现记录 + * + * @param withdrawCashId 分销员提现记录id + * @return 分销员提现记录 + */ + DistributionWithdrawCash getByWithdrawCashId(@Param("withdrawCashId") Long withdrawCashId); + + /** + * 保存分销员提现记录 + * @param distributionWithdrawCash 分销员提现记录 + */ + void save(@Param("distributionWithdrawCash") DistributionWithdrawCash distributionWithdrawCash); + + /** + * 更新分销员提现记录 + * @param distributionWithdrawCash 分销员提现记录 + */ + void update(@Param("distributionWithdrawCash") DistributionWithdrawCash distributionWithdrawCash); + + /** + * 根据分销员提现记录id删除分销员提现记录 + * @param withdrawCashId + */ + void deleteById(@Param("withdrawCashId") Long withdrawCashId); + + /** + * 分页获取分销员提现记录列表 + * @param userMobile 分销员手机号 + * @param distributionWithdrawCashDTO 分销提现信息 + * @return 分销员提现记录列表分页数据 + */ + List withdrawCashPage(@Param("userMobile") String userMobile, @Param("distributionWithdrawCashDTO") DistributionWithdrawCashDTO distributionWithdrawCashDTO); + + /** + * 永久封禁时,根据用户id更新其提现中的记录为拒绝提现 + * @param distributionUserId 用户id + */ + void updateUserByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + + /** + * 获取分销员提现申请记录 + * @param distributionUserId 分销员id + * @return 分销员提现申请记录 + */ + List pageByDistributionUserId(@Param("distributionUserId") Long distributionUserId); + + /** + * 根据时间区间获取用户的提现次数 + * @param rangeTime 时间范围 + * @param distributionUserId 分销员id + * @return 分销员提现申请记录数量 + */ + Integer getCountByRangeTimeAndDistributionUserId(@Param("rangeTime") RangeTimeDTO rangeTime, @Param("distributionUserId") Long distributionUserId); + + /** + * 查看分销员总提现金额 + * @param walletId 钱包id + * @return 总提现金额(分) + */ + BigDecimal getUserTotalWithdrawCash(@Param("walletId") Long walletId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionAuditing.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionAuditing.java new file mode 100644 index 0000000..3779556 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionAuditing.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员申请信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public class DistributionAuditing extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分销员申请表 + */ + private Long auditingId; + + /** + * 邀请人id + */ + private Long parentDistributionUserId; + + /** + * 申请人id + */ + private Long distributionUserId; + + /** + * 申请时间 + */ + private Date auditingTime; + + /** + * 备注 + */ + private String remarks; + + /** + * 不通过原因(0 资料不足 1条件不足 2不招人 -1其他) + */ + private Integer reason; + + /** + * 审核状态:0 未审核 1已通过 -1未通过 + */ + private Integer state; + + /** + * 操作人(0代表自动审核) + */ + private Long modifier; + + public Long getAuditingId() { + return auditingId; + } + + public void setAuditingId(Long auditingId) { + this.auditingId = auditingId; + } + + public Long getParentDistributionUserId() { + return parentDistributionUserId; + } + + public void setParentDistributionUserId(Long parentDistributionUserId) { + this.parentDistributionUserId = parentDistributionUserId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + @Override + public String toString() { + return "DistributionAuditing{" + + "auditingId=" + auditingId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",parentDistributionUserId=" + parentDistributionUserId + + ",distributionUserId=" + distributionUserId + + ",auditingTime=" + auditingTime + + ",remarks=" + remarks + + ",reason=" + reason + + ",state=" + state + + ",modifier=" + modifier + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionMsg.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionMsg.java new file mode 100644 index 0000000..bfbc41d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionMsg.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销公共信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public class DistributionMsg extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 公告表 + */ + private Long msgId; + + /** + * 公告标题 + */ + private String msgTitle; + + /** + * 指定上线时间 + * 设置时区为上海时区,时间格式自己据需求定。 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + /** + * 指定下线时间 + * //设置时区为上海时区,时间格式自己据需求定。 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + /** + * 是否置顶(0 不置顶 1 置顶) + */ + private Integer isTop; + + /** + * 公告内容 + */ + private String content; + + public Long getMsgId() { + return msgId; + } + + public void setMsgId(Long msgId) { + this.msgId = msgId; + } + + public String getMsgTitle() { + return msgTitle; + } + + public void setMsgTitle(String msgTitle) { + this.msgTitle = msgTitle; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "DistributionMsg{" + + "msgId=" + msgId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",msgTitle=" + msgTitle + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",isTop=" + isTop + + ",content=" + content + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpu.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpu.java new file mode 100644 index 0000000..7413371 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpu.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分销商品关联信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分销商品表 + */ + private Long distributionSpuId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 状态(0:商家下架 1:商家上架 2:违规下架 3:平台审核) + */ + private Integer state; + + /** + * 奖励方式(0 按比例 1 按固定数值) + */ + private Integer awardMode; + + /** + * 上级奖励设置(0 关闭 1开启) + */ + private Integer parentAwardSet; + + /** + * 奖励数额(奖励比例为0时,代表百分比*100,为1时代表实际奖励金额*100) + * 例如: 奖励比例为1%,awardNumbers = 100 ; awardNumbers = 1 则实际的奖励比例为 0.01% + */ + private Long awardNumbers; + + /** + * 上级奖励数额(奖励比例为0时,表示百分比*100,为1时代表实际奖励金额*100) + * 例如: 奖励比例为1%,parentAwardNumbers = 100 ; parentAwardNumbers = 1 则实际的奖励比例为 0.01% + */ + private Long parentAwardNumbers; + + /** + * 操作人id + */ + private Long modifier; + + public Long getDistributionSpuId() { + return distributionSpuId; + } + + public void setDistributionSpuId(Long distributionSpuId) { + this.distributionSpuId = distributionSpuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getAwardMode() { + return awardMode; + } + + public void setAwardMode(Integer awardMode) { + this.awardMode = awardMode; + } + + public Integer getParentAwardSet() { + return parentAwardSet; + } + + public void setParentAwardSet(Integer parentAwardSet) { + this.parentAwardSet = parentAwardSet; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public Long getAwardNumbers() { + return awardNumbers; + } + + public void setAwardNumbers(Long awardNumbers) { + this.awardNumbers = awardNumbers; + } + + public Long getParentAwardNumbers() { + return parentAwardNumbers; + } + + public void setParentAwardNumbers(Long parentAwardNumbers) { + this.parentAwardNumbers = parentAwardNumbers; + } + + @Override + public String toString() { + return "DistributionSpu{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", distributionSpuId=" + distributionSpuId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", state=" + state + + ", awardMode=" + awardMode + + ", parentAwardSet=" + parentAwardSet + + ", awardNumbers=" + awardNumbers + + ", parentAwardNumbers=" + parentAwardNumbers + + ", modifier=" + modifier + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpuBind.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpuBind.java new file mode 100644 index 0000000..b9db635 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionSpuBind.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户商品绑定信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpuBind extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户商品绑定表 + */ + private Long id; + + /** + * 分销员id + */ + private Long distributionUserId; + + /** + * 用户id + */ + private Long userId; + + /** + * 绑定时间 + */ + private Date bindTime; + + /** + * 商品id + */ + private Long spuId; + + /** + * 状态(0失效 1生效) 分销员被封禁 该状态失效 + */ + private Integer state; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionSpuBind{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", id=" + id + + ", distributionUserId=" + distributionUserId + + ", userId=" + userId + + ", bindTime=" + bindTime + + ", spuId=" + spuId + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUser.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUser.java new file mode 100644 index 0000000..a393ccb --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUser.java @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 促销员表 + */ + private Long distributionUserId; + + /** + * 用户id + */ + private Long userId; + + /** + * 上级id + */ + private Long parentId; + + /** + * 上级促销员ids (如:1,2,3) + */ + private String parentIds; + + /** + * 目前促销员所处层级(0顶级) + */ + private Integer grade; + + /** + * 绑定时间 + */ + private Date bindTime; + + /** + * DistributionUserStateEnum + * 状态(-1永久封禁 0待审核状态 1正常 2暂时封禁 3 审核未通过) + */ + private Integer state; + + /** + * 昵称 + */ + private String nickName; + + /** + * 头像路径 + */ + private String pic; + + /** + * 手机号 + */ + private String userMobile; + + /** + * 真实姓名 + */ + private String realName; + + /** + * 身份证号码 + */ + private String identityCardNumber; + + /** + * 身份证正面 + */ + private String identityCardPicFront; + + /** + * 身份证背面 + */ + private String identityCardPicBack; + + /** + * 手持身份证 + */ + private String identityCardPicHold; + + /** + * 改变成封禁时的状态记录 + */ + private Integer stateRecord; + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getParentIds() { + return parentIds; + } + + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + public Integer getGrade() { + return grade; + } + + public void setGrade(Integer grade) { + this.grade = grade; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(String identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public String getIdentityCardPicFront() { + return identityCardPicFront; + } + + public void setIdentityCardPicFront(String identityCardPicFront) { + this.identityCardPicFront = identityCardPicFront; + } + + public String getIdentityCardPicBack() { + return identityCardPicBack; + } + + public void setIdentityCardPicBack(String identityCardPicBack) { + this.identityCardPicBack = identityCardPicBack; + } + + public String getIdentityCardPicHold() { + return identityCardPicHold; + } + + public void setIdentityCardPicHold(String identityCardPicHold) { + this.identityCardPicHold = identityCardPicHold; + } + + public Integer getStateRecord() { + return stateRecord; + } + + public void setStateRecord(Integer stateRecord) { + this.stateRecord = stateRecord; + } + + @Override + public String toString() { + return "DistributionUser{" + + "distributionUserId=" + distributionUserId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",parentId=" + parentId + + ",parentIds=" + parentIds + + ",grade=" + grade + + ",bindTime=" + bindTime + + ",state=" + state + + ",nickName=" + nickName + + ",pic=" + pic + + ",userMobile=" + userMobile + + ",realName=" + realName + + ",identityCardNumber=" + identityCardNumber + + ",identityCardPicFront=" + identityCardPicFront + + ",identityCardPicBack=" + identityCardPicBack + + ",identityCardPicHold=" + identityCardPicHold + + ",stateRecord=" + stateRecord + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserBind.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserBind.java new file mode 100644 index 0000000..e03e7db --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserBind.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员绑定关系 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public class DistributionUserBind extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户关系表 + */ + private Long bindId; + + /** + * 分销员id + */ + private Long distributionUserId; + + /** + * 用户id + */ + private Long userId; + + /** + * BindStateEnum + * 当前绑定关系(-1失效 0 预绑定 1生效) + */ + private Integer state; + + /** + * BindInvalidReasonEnum + * 失效原因( 1管理员更改 2封禁) + */ + private Integer invalidReason; + + /** + * 绑定时间 + */ + private Date bindTime; + + /** + * 失效时间 + */ + private Date invalidTime; + + public Long getBindId() { + return bindId; + } + + public void setBindId(Long bindId) { + this.bindId = bindId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getInvalidReason() { + return invalidReason; + } + + public void setInvalidReason(Integer invalidReason) { + this.invalidReason = invalidReason; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Date getInvalidTime() { + return invalidTime; + } + + public void setInvalidTime(Date invalidTime) { + this.invalidTime = invalidTime; + } + + @Override + public String toString() { + return "DistributionUserBind{" + + "bindId=" + bindId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",distributionUserId=" + distributionUserId + + ",userId=" + userId + + ",state=" + state + + ",invalidReason=" + invalidReason + + ",bindTime=" + bindTime + + ",invalidTime=" + invalidTime + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserIncome.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserIncome.java new file mode 100644 index 0000000..3ea5c19 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserIncome.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分销收入记录信息 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +public class DistributionUserIncome extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 收入记录id + */ + private Long incomeId; + + /** + * 钱包id + */ + private Long walletId; + + /** + * DistributionUserIncomeTypeEnum + * 收入类型(1一代奖励、2二代奖励 3邀请奖励 等 ) + */ + private Integer incomeType; + + /** + * DistributionUserIncomeStateEnum + * 佣金状态(0:待支付、1:待结算、2:已结算、-1:订单失效) + */ + private Integer state; + + /** + * 佣金数额 + */ + private Long incomeAmount; + + /** + * 关联订购流水号 + */ + private Long orderId; + + /** + * 关联订单项order_item_id + */ + private Long orderItemId; + + /** + * 商户订单号 + */ + private String merchantOrderId; + + /** + * 分销员id + */ + private Long distributionUserId; + + /** + * 操作人id + */ + private Long modifier; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 失效原因(0正常,1佣金为0订单失效,2订单项退款) + */ + private Integer reson; + + /** + * 用户id + */ + private Long userId; + + /** + * 支付系统类型 + */ + private Integer paySysType; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getReson() { + return reson; + } + + public void setReson(Integer reson) { + this.reson = reson; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getIncomeId() { + return incomeId; + } + + public void setIncomeId(Long incomeId) { + this.incomeId = incomeId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Integer getIncomeType() { + return incomeType; + } + + public void setIncomeType(Integer incomeType) { + this.incomeType = incomeType; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getIncomeAmount() { + return incomeAmount; + } + + public void setIncomeAmount(Long incomeAmount) { + this.incomeAmount = incomeAmount; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "DistributionUserIncome{" + + "incomeId=" + incomeId + + ", walletId=" + walletId + + ", incomeType=" + incomeType + + ", state=" + state + + ", incomeAmount=" + incomeAmount + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", distributionUserId=" + distributionUserId + + ", modifier=" + modifier + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", reson=" + reson + + ", userId=" + userId + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserWalletBill.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserWalletBill.java new file mode 100644 index 0000000..90ebab0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionUserWalletBill.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员钱包流水记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionUserWalletBill extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 钱包流水记录 + */ + private Long id; + + /** + * 钱包id + */ + private Long walletId; + + /** + * 待结算金额变更数额 + */ + private Long unsettledAmount; + + /** + * 可提现金额变更数额 + */ + private Long settledAmount; + + /** + * 失效金额变更数额 + */ + private Long invalidAmount; + + /** + * 积累收益变更数额 + */ + private Long accumulateAmount; + + /** + * 英文备注 + */ + private String remarksEn; + + /** + * 备注 + */ + private String remarks; + + /** + * 变更后待结算金额 + */ + private Long unsettledAmountAfter; + + /** + * 变更后可提现金额 + */ + private Long settledAmountAfter; + + /** + * 变更后失效金额 + */ + private Long invalidAmountAfter; + + /** + * 变更后积累收益 + */ + private Long accumulateAmountAfter; + + /** + * 类型(0 系统修改 1人工修改) + */ + private Integer type; + + /** + * 操作人id + */ + private Long modifier; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(Long invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public Long getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Long accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + public String getRemarksEn() { + return remarksEn; + } + + public void setRemarksEn(String remarksEn) { + this.remarksEn = remarksEn; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Long getUnsettledAmountAfter() { + return unsettledAmountAfter; + } + + public void setUnsettledAmountAfter(Long unsettledAmountAfter) { + this.unsettledAmountAfter = unsettledAmountAfter; + } + + public Long getSettledAmountAfter() { + return settledAmountAfter; + } + + public void setSettledAmountAfter(Long settledAmountAfter) { + this.settledAmountAfter = settledAmountAfter; + } + + public Long getInvalidAmountAfter() { + return invalidAmountAfter; + } + + public void setInvalidAmountAfter(Long invalidAmountAfter) { + this.invalidAmountAfter = invalidAmountAfter; + } + + public Long getAccumulateAmountAfter() { + return accumulateAmountAfter; + } + + public void setAccumulateAmountAfter(Long accumulateAmountAfter) { + this.accumulateAmountAfter = accumulateAmountAfter; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public DistributionUserWalletBill() { + } + + /** + * @param distributionUserWallet 变更后的钱包对象 + * @param remarks + */ + public DistributionUserWalletBill(DistributionUserWallet distributionUserWallet, + String remarks, + String remarksEn, + Long unsettledAmount, + Long settledAmount, + Long invalidAmount, + Long accumulateAmount, + Integer type + ) { + this.remarks = remarks; + this.remarksEn = remarksEn; + this.unsettledAmount = unsettledAmount; + this.settledAmount = settledAmount; + this.invalidAmount = invalidAmount; + this.accumulateAmount = accumulateAmount; + this.type = type; + this.createTime = new Date(); + this.walletId = distributionUserWallet.getWalletId(); + this.unsettledAmountAfter = distributionUserWallet.getUnsettledAmount(); + this.settledAmountAfter = distributionUserWallet.getSettledAmount(); + this.invalidAmountAfter = distributionUserWallet.getInvalidAmount(); + this.accumulateAmountAfter = distributionUserWallet.getAccumulateAmount(); + } + + @Override + public String toString() { + return "DistributionUserWalletBill{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", id=" + id + + ", walletId=" + walletId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + ", remarksEn='" + remarksEn + '\'' + + ", remarks='" + remarks + '\'' + + ", unsettledAmountAfter=" + unsettledAmountAfter + + ", settledAmountAfter=" + settledAmountAfter + + ", invalidAmountAfter=" + invalidAmountAfter + + ", accumulateAmountAfter=" + accumulateAmountAfter + + ", type=" + type + + ", modifier=" + modifier + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionWithdrawCash.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionWithdrawCash.java new file mode 100644 index 0000000..5bf7a5a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/model/DistributionWithdrawCash.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分销员提现记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionWithdrawCash extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 提现记录id + */ + private Long withdrawCashId; + + /** + * 钱包id + */ + private Long walletId; + + /** + * 金额 + */ + private Long amount; + + /** + * 手续费 + */ + private Long fee; + + /** + * 类型(0 手动提现 1自动提现) + */ + private Integer type; + + /** + * 资金流向(0微信红包、1企业付款到微信零钱) + */ + private Integer moneyFlow; + + /** + * 商户订单号 + */ + private String merchantOrderId; + + /** + * 乐观锁 + */ + private Integer version; + + /** + * DistributionWithdrawCashStateEnum + * 提现状态(0:申请中 1:提现成功 -1:提现失败) + */ + private Integer state; + + /** + * 第三方登录userId + */ + private String bizUserId; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Long getWithdrawCashId() { + return withdrawCashId; + } + + public void setWithdrawCashId(Long withdrawCashId) { + this.withdrawCashId = withdrawCashId; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getMoneyFlow() { + return moneyFlow; + } + + public void setMoneyFlow(Integer moneyFlow) { + this.moneyFlow = moneyFlow; + } + + public String getMerchantOrderId() { + return merchantOrderId; + } + + public void setMerchantOrderId(String merchantOrderId) { + this.merchantOrderId = merchantOrderId; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionWithdrawCash{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", withdrawCashId=" + withdrawCashId + + ", walletId=" + walletId + + ", amount=" + amount + + ", fee=" + fee + + ", type=" + type + + ", moneyFlow=" + moneyFlow + + ", merchantOrderId='" + merchantOrderId + '\'' + + ", version=" + version + + ", state=" + state + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionAuditingService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionAuditingService.java new file mode 100644 index 0000000..000b042 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionAuditingService.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.dto.DistributionAuditingDTO; +import com.tmerclub.cloud.distribution.model.DistributionAuditing; +import com.tmerclub.cloud.distribution.vo.DistributionAuditingVO; + +/** + * 分销员申请信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public interface DistributionAuditingService { + + /** + * 分页获取分销员申请信息列表 + * @param pageDTO 分页参数 + * @param distributionAuditingDTO + * @return 分销员申请信息列表分页数据 + */ + PageVO pageDistributionAuditing(PageDTO pageDTO, DistributionAuditingDTO distributionAuditingDTO); + + /** + * 根据分销员申请信息id获取分销员申请信息 + * + * @param auditingId 分销员申请信息id + * @return 分销员申请信息 + */ + DistributionAuditing getByAuditingId(Long auditingId); + + /** + * 保存分销员申请信息 + * @param distributionAuditing 分销员申请信息 + */ + void save(DistributionAuditing distributionAuditing); + + /** + * 更新分销员申请信息 + * @param distributionAuditing 分销员申请信息 + */ + void update(DistributionAuditing distributionAuditing); + + /** + * 根据分销员申请信息id删除分销员申请信息 + * @param auditingId 分销员申请信息id + */ + void deleteById(Long auditingId); + + /** + * 分销员审核操作 + * @param distributionAuditing 审核信息 + */ + void examine(DistributionAuditing distributionAuditing); + + /** + * 切换通联支付自动拒绝分销员申请 + */ + void autoRejectBySwitchAllinpay(); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionConfigService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionConfigService.java new file mode 100644 index 0000000..ae70a96 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionConfigService.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + + +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.api.platform.vo.DistributionRecruitConfigApiVO; + +/** + * 分销员配置信息信息 + * + * @author cl + * @date 2021-08-12 10:05:31 + */ +public interface DistributionConfigService { + + + /** + * 获取分销基本配置信息 + * @return 分销基本配置信息 + */ + DistributionConfigApiVO getDistributionConfig(); + + /** + * 获取分销推广配置信息 + * @return 分销推广配置信息 + */ + DistributionRecruitConfigApiVO getDistributionRecruitConfig(); + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionOrderService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionOrderService.java new file mode 100644 index 0000000..c2c88ef --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionOrderService.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; + +/** + * @author cl + * @date 2021-08-18 08:40:06 + */ +public interface DistributionOrderService { + + /** + * 订单支付成功开始进行分销 + * @param payNotifyBO 支付成功通知 + */ + void payNotifyDistributionOrder(PayNotifyBO payNotifyBO); + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuService.java new file mode 100644 index 0000000..88ce6c9 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionSpuService.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.distribution.dto.DistributionSpuDTO; +import com.tmerclub.cloud.distribution.model.DistributionSpu; + +import java.util.List; + +/** + * 分销商品关联信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public interface DistributionSpuService { + + /** + * 根据分销商品关联信息id获取分销商品关联信息 + * + * @param distributionSpuId 分销商品关联信息id + * @return 分销商品关联信息 + */ + DistributionSpuVO getByDistributionSpuId(Long distributionSpuId); + + /** + * 保存分销商品关联信息 + * @param distributionSpuDTO 分销商品关联信息 + */ + void save(DistributionSpuDTO distributionSpuDTO); + + /** + * 更新分销商品关联信息 + * @param distributionSpuDTO 分销商品关联信息 + */ + void update(DistributionSpuDTO distributionSpuDTO); + + /** + * 根据分销商品关联信息id删除分销商品关联信息 + * @param distributionSpuId 分销商品关联信息id + */ + void deleteById(Long distributionSpuId); + + /** + * 根据主键id与店铺id删除分销信息 + * @param distributionSpuId + * @param shopId + */ + void deleteByIdAndShopId(Long distributionSpuId, Long shopId); + + /** + * 下线分销商品 + * @param offlineHandleEventDTO + */ + void offline(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 违规分销商品提交重新上线申请 + * @param offlineHandleEventDTO + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 平台审核分销商品 + * @param offlineHandleEventDTO + */ + void audit(OfflineHandleEventDTO offlineHandleEventDTO); + + /** + * 根据商品id获取分销信息 + * @param spuId + * @return + */ + DistributionSpuVO getBySpuId(Long spuId); + + /** + * 获取下线信息 + * @param distributionSpuId + * @return + */ + OfflineHandleEventVO getOfflineHandleEvent(Long distributionSpuId); + + /** + * 更新分销商品状态 + * @param distributionSpuId + * @param state + */ + void updateState(Long distributionSpuId, Integer state); + + /** + * 根据商品id与状态查看该分销商品是处于该状态 + * @param spuId + * @param state + * @return + */ + Boolean isStateBySpuIdAndState(Long spuId, Integer state); + + /** + * 根据商品状态和商品id + * @param state 商品状态 + * @param spuIds 商品id集合 + * @return 分销商品 + */ + List getByStateAndSpuIds(Integer state, List spuIds); + + /** + * 处理下架事件 + * @param spuIds + * @param shopIds + * @param state 将设置的状态 + * @return + */ + void handleSpuState(List spuIds, List shopIds, Integer state); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserWalletBillService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserWalletBillService.java new file mode 100644 index 0000000..8550c25 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserWalletBillService.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletBillVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分销员钱包流水记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public interface DistributionUserWalletBillService { + + /** + * 分页获取分销员钱包流水记录列表 + * @param pageDTO 分页参数 + * @return 分销员钱包流水记录列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据分销员钱包流水记录id获取分销员钱包流水记录 + * + * @param id 分销员钱包流水记录id + * @return 分销员钱包流水记录 + */ + DistributionUserWalletBill getById(Long id); + + /** + * 保存分销员钱包流水记录 + * @param distributionUserWalletBill 分销员钱包流水记录 + */ + void save(DistributionUserWalletBill distributionUserWalletBill); + + /** + * 更新分销员钱包流水记录 + * @param distributionUserWalletBill 分销员钱包流水记录 + */ + void update(DistributionUserWalletBill distributionUserWalletBill); + + /** + * 根据分销员钱包流水记录id删除分销员钱包流水记录 + * @param id 分销员钱包流水记录id + */ + void deleteById(Long id); + + /** + * 获取分销员钱包流水记录列表 + * @param pageDTO 分页参数 + * @param userMobile 分销员手机号码 + * @return + */ + PageVO walletBillPage(PageDTO pageDTO, String userMobile, String nickName); + + /** + * 批量保存分销员钱包流水 + * @param distributionUserWalletBills 分销员钱包流水 + */ + void saveBatch(List distributionUserWalletBills); + + /** + * 根据钱包id获取已提现金额 + * @param walletId + * @return + */ + Long getHaveWithdrawalSum(@Param("walletId") Long walletId); + + /** + * 初始化分销员钱包流水 + */ + void initDistributionWalletBill(); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserWalletService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserWalletService.java new file mode 100644 index 0000000..0b6ed81 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionUserWalletService.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.dto.DistributionUserWalletDTO; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.vo.DistributionUserWalletVO; + +/** + * 分销员钱包信息 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public interface DistributionUserWalletService { + + /** + * 分页获取分销员钱包信息列表 + * @param pageDTO 分页参数 + * @return 分销员钱包信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据分销员钱包信息id获取分销员钱包信息 + * + * @param walletId 分销员钱包信息id + * @return 分销员钱包信息 + */ + DistributionUserWallet getByWalletId(Long walletId); + + /** + * 保存分销员钱包信息 + * @param distributionUserWallet 分销员钱包信息 + */ + void save(DistributionUserWallet distributionUserWallet); + + /** + * 更新分销员钱包信息 + * @param distributionUserWallet 分销员钱包信息 + * @return 受影响行数 + */ + void update(DistributionUserWallet distributionUserWallet); + + /** + * 根据分销员钱包信息id删除分销员钱包信息 + * @param walletId 分销员钱包信息id + */ + void deleteById(Long walletId); + + /** + * 分页获取分销员钱包 + * @param pageDTO 分页参数 + * @param userMobile 分销员手机号 + * @return + */ + PageVO walletPage(PageDTO pageDTO, String userMobile); + + /** + * 更新分销员钱包信息 + * @param distributionUserWalletDTO 分销员钱包信息 + * @param userId + */ + void updateWallet(DistributionUserWalletDTO distributionUserWalletDTO, Long userId); + + /** + * 根据分销员id 获取分销员钱包信息 + * @param distributionUserId 分销员id + * @return 分销员钱包信息 + */ + DistributionUserWallet getByDistributionUserId(Long distributionUserId); + + /** + * 更新分销员钱包 + * @param updateWallet 分销员钱包 + * @return 受影响行数 + */ + int updateWalletAmount(DistributionUserWallet updateWallet); + + /** + * 初始化分销员钱包 + */ + void initDistributionWallet(); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionWithdrawCashService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionWithdrawCashService.java new file mode 100644 index 0000000..c68f0aa --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/DistributionWithdrawCashService.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service; + +import com.tmerclub.cloud.api.auth.vo.AuthSocialVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.dto.AppDistributionWithdrawCashDTO; +import com.tmerclub.cloud.distribution.dto.DistributionWithdrawCashDTO; +import com.tmerclub.cloud.distribution.dto.RangeTimeDTO; +import com.tmerclub.cloud.distribution.model.DistributionWithdrawCash; +import com.tmerclub.cloud.distribution.model.EnterprisePay; +import com.tmerclub.cloud.distribution.vo.AppDistributionWithdrawCashVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import com.tmerclub.cloud.distribution.vo.DistributionWithdrawCashVO; + +/** + * 分销员提现记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public interface DistributionWithdrawCashService { + + /** + * 分页获取分销员提现记录列表 + * @param pageDTO 分页参数 + * @param userMobile 分销员手机号 + * @param distributionWithdrawCashDTO 分销提现信息 + * @return 分销员提现记录列表分页数据 + */ + PageVO page(PageDTO pageDTO, String userMobile, DistributionWithdrawCashDTO distributionWithdrawCashDTO); + + /** + * 根据分销员提现记录id获取分销员提现记录 + * + * @param withdrawCashId 分销员提现记录id + * @return 分销员提现记录 + */ + DistributionWithdrawCash getByWithdrawCashId(Long withdrawCashId); + + /** + * 保存分销员提现记录 + * @param distributionWithdrawCash 分销员提现记录 + */ + void save(DistributionWithdrawCash distributionWithdrawCash); + + /** + * 更新分销员提现记录 + * @param distributionWithdrawCash 分销员提现记录 + */ + void update(DistributionWithdrawCash distributionWithdrawCash); + + /** + * 根据分销员提现记录id删除分销员提现记录 + * @param withdrawCashId 分销员提现记录id + */ + void deleteById(Long withdrawCashId); + + /** + * 分页获取分销员提现申请记录 + * @param pageDTO 分页参数 + * @param distributionUserId 分销员id + * @return 分销员提现申请记录 + */ + PageVO pageByDistributionUserId(PageDTO pageDTO, Long distributionUserId); + + /** + * 发起提现申请 + * @param distributionWithdrawCashDTO 提现金额信息 + * @param distributionUserVO 分销员信息 + * @param authSocialVO 第三方登录信息(商家转账到零钱会用到) + */ + void apply(AppDistributionWithdrawCashDTO distributionWithdrawCashDTO, DistributionUserVO distributionUserVO, AuthSocialVO authSocialVO); + + /** + * 根据时间区间获取用户的提现次数 + * @param rangeTimeDTO 时间范围 + * @param distributionUserId 分销员id + * @return 分销员提现申请记录数量 + */ + Integer getCountByRangeTimeAndDistributionUserId(RangeTimeDTO rangeTimeDTO, Long distributionUserId); + + /** + * 查看分销员总提现金额 + * @param walletId 钱包id + * @return 总提现金额 + */ + Long getUserTotalWithdrawCash(Long walletId); + + /** + * 添加商家转账记录 + * @param distributionWithdrawCash 提现记录 + * @param userId 提现用户id + * @param openId 提现用户openId + * @param status 提现状态 + */ + void enterprisePay(DistributionWithdrawCash distributionWithdrawCash, Long userId, String openId, Integer status); + + /** + * 商家提现成功处理 + * @param enterprisePay + */ + void distributionWithdrawToSuccess(EnterprisePay enterprisePay); + + /** + * 商家提现失败处理 + * @param enterprisePay + */ + void distributionWithdrawToFailed(EnterprisePay enterprisePay); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionConfigServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionConfigServiceImpl.java new file mode 100644 index 0000000..a622c72 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionConfigServiceImpl.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigSpuVO; +import com.tmerclub.cloud.api.platform.vo.DistributionRecruitConfigApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author cl + * @date 2021-08-12 10:06:38 + */ +@Service +public class DistributionConfigServiceImpl implements DistributionConfigService { + + @DubboReference + private ConfigFeignClient configFeignClient; + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + + @Override + public DistributionConfigApiVO getDistributionConfig() { + ServerResponseEntity config = configFeignClient.getConfig(Constant.DISTRIBUTION_CONFIG); + if (!config.isSuccess()) { + throw new LuckException(config.getMsg()); + } + String value = config.getData(); + if (StrUtil.isBlank(value)) { + throw new LuckException("分销基本设置没有配置"); + } + DistributionConfigApiVO distributionConfigVO = Json.parseObject(value, DistributionConfigApiVO.class); + List spuIdList = distributionConfigVO.getSpuIdList(); + if (CollUtil.isEmpty(spuIdList)) { + return distributionConfigVO; + } + ServerResponseEntity> spuResponse = searchSpuFeignClient.listSpuBySpuIds(spuIdList); + if (spuResponse.isSuccess() && CollUtil.isNotEmpty(spuResponse.getData())) { + distributionConfigVO.setSpuList(BeanUtil.mapAsList(spuResponse.getData(), DistributionConfigSpuVO.class)); + } + return distributionConfigVO; + } + + @Override + public DistributionRecruitConfigApiVO getDistributionRecruitConfig() { + ServerResponseEntity config = configFeignClient.getConfig(Constant.DISTRIBUTION_RECRUIT_CONFIG); + if (!config.isSuccess()) { + throw new LuckException(config.getMsg()); + } + String value = config.getData(); + if (StrUtil.isBlank(value)) { + throw new LuckException("分销推广设置没有配置"); + } + return Json.parseObject(value, DistributionRecruitConfigApiVO.class); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionMsgServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionMsgServiceImpl.java new file mode 100644 index 0000000..8da9f94 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionMsgServiceImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.distribution.mapper.DistributionMsgMapper; +import com.tmerclub.cloud.distribution.model.DistributionMsg; +import com.tmerclub.cloud.distribution.service.DistributionMsgService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 分销公共信息 + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +@Service +public class DistributionMsgServiceImpl implements DistributionMsgService { + + @Autowired + private DistributionMsgMapper distributionMsgMapper; + + @Override + public PageVO page(PageDTO pageDTO, String msgTitle) { + return PageUtil.doPage(pageDTO, () -> distributionMsgMapper.list(msgTitle)); + } + + @Override + public PageVO pageApp(PageDTO pageDTO, Integer isTop) { + return PageUtil.doPage(pageDTO, () -> distributionMsgMapper.listApp(isTop)); + } + + @Override + public DistributionMsg getByMsgId(Long msgId) { + return distributionMsgMapper.getByMsgId(msgId); + } + + @Override + public void save(DistributionMsg distributionMsg) { + distributionMsgMapper.save(distributionMsg); + } + + @Override + public void update(DistributionMsg distributionMsg) { + distributionMsgMapper.update(distributionMsg); + } + + @Override + public void deleteById(Long msgId) { + distributionMsgMapper.deleteById(msgId); + } + + @Override + public void deleteBatch(List msgIds) { + if (CollectionUtil.isNotEmpty(msgIds)) { + distributionMsgMapper.deleteBatch(msgIds); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuServiceImpl.java new file mode 100644 index 0000000..4bdc756 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionSpuServiceImpl.java @@ -0,0 +1,393 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventStatus; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.distribution.constant.AwardMode; +import com.tmerclub.cloud.distribution.constant.DistributionSpuStatus; +import com.tmerclub.cloud.distribution.constant.ParentAwardSet; +import com.tmerclub.cloud.distribution.dto.DistributionSpuDTO; +import com.tmerclub.cloud.distribution.mapper.DistributionSpuMapper; +import com.tmerclub.cloud.distribution.model.DistributionSpu; +import com.tmerclub.cloud.distribution.service.DistributionSpuService; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +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.Objects; + +/** + * 分销商品关联信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@Service +public class DistributionSpuServiceImpl implements DistributionSpuService { + + @Autowired + private DistributionSpuMapper distributionSpuMapper; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + /** + * 比例最大存储值 + */ + private static final Long PROPORTION_MAX_STORAGE_VALUE = 10000L; + + @Override + public DistributionSpuVO getByDistributionSpuId(Long distributionSpuId) { + DistributionSpuVO distributionSpuVO = distributionSpuMapper.getByDistributionSpuId(distributionSpuId); + ServerResponseEntity spuRes = spuFeignClient.getDetailById(distributionSpuVO.getSpuId()); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + distributionSpuVO.setSpuName(spuRes.getData().getName()); + distributionSpuVO.setMainImgUrl(spuRes.getData().getMainImgUrl()); + return distributionSpuVO; + } + + @Override + public void save(DistributionSpuDTO distributionSpuDTO) { + this.validateDistributionSpu(distributionSpuDTO, true); + DistributionSpu distributionSpu = BeanUtil.map(distributionSpuDTO, DistributionSpu.class); + // 检查商品是否存在 + checkSpu(distributionSpu); + distributionSpuMapper.save(distributionSpu); + } + + /** + * 检查商品是否存在 + * + * @param distributionSpu + */ + private void checkSpu(DistributionSpu distributionSpu) { + SpuVO spuVO = spuFeignClient.getById(distributionSpu.getSpuId()).getData(); + // 商品状态 1上架 + Integer status = 1; + if (!Objects.equals(spuVO.getStatus(), status)) { + throw new LuckException("商品已不存在,请刷新页面"); + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(DistributionSpuDTO distributionSpuDTO) { + DistributionSpuVO byDistributionSpuId = distributionSpuMapper.getByDistributionSpuId(distributionSpuDTO.getDistributionSpuId()); + if (Objects.isNull(byDistributionSpuId)) { + throw new LuckException("分销商品已不存在,请刷新页面"); + } + this.validateDistributionSpu(distributionSpuDTO, false); + DistributionSpu distributionSpu = BeanUtil.map(distributionSpuDTO, DistributionSpu.class); + if (!Objects.equals(byDistributionSpuId.getSpuId(), distributionSpuDTO.getSpuId())) { + distributionSpuMapper.deleteById(byDistributionSpuId.getDistributionSpuId()); + distributionSpu.setDistributionSpuId(byDistributionSpuId.getDistributionSpuId()); + distributionSpu.setState(byDistributionSpuId.getState()); + distributionSpuMapper.save(distributionSpu); + } else { + distributionSpuMapper.update(distributionSpu); + } + } + + @Override + public void deleteById(Long distributionSpuId) { + distributionSpuMapper.deleteById(distributionSpuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByIdAndShopId(Long distributionSpuId, Long shopId) { + // 删除分销信息 + distributionSpuMapper.deleteByIdAndShopId(distributionSpuId, shopId); + // 删除分销审核信息 + ServerResponseEntity offlineDeleteRes = offlineHandleEventFeignClient.deleteByHandleTypeAndHandleId(OfflineHandleEventType.DISTRIBUTION_PROD.getValue(), distributionSpuId); + if (!offlineDeleteRes.isSuccess()) { + throw new LuckException(offlineDeleteRes.getMsg()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void offline(OfflineHandleEventDTO offlineHandleEventDTO) { + DistributionSpuVO distributionSpuVO = distributionSpuMapper.getByDistributionSpuId(offlineHandleEventDTO.getHandleId()); + if (Objects.isNull(distributionSpuVO)) { + throw new LuckException("分销商品不存在,请刷新页面"); + } + if (Objects.equals(distributionSpuVO.getState(), DistributionSpuStatus.PLATFORM_OFF_SHELF.value())) { + throw new LuckException("该分销商品已下线,请刷新页面"); + } + OfflineHandleEventDTO offlineHandleEvent = new OfflineHandleEventDTO(); + offlineHandleEvent.setHandleId(offlineHandleEventDTO.getHandleId()); + offlineHandleEvent.setHandleType(OfflineHandleEventType.DISTRIBUTION_PROD.getValue()); + offlineHandleEvent.setOfflineReason(offlineHandleEventDTO.getOfflineReason()); + ServerResponseEntity offlineRes = offlineHandleEventFeignClient.save(offlineHandleEvent); + if (!offlineRes.isSuccess()) { + throw new LuckException(offlineRes.getMsg()); + } + // 更新分销商品状态为下线状态 + int changeCount = distributionSpuMapper.changeStateByDistributionId(offlineHandleEventDTO.getHandleId(), distributionSpuVO.getState(), DistributionSpuStatus.PLATFORM_OFF_SHELF.value()); + if (changeCount != 1) { + throw new LuckException("下线失败,请刷新页面后重试"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void auditApply(OfflineHandleEventDTO offlineHandleEventDTO) { + DistributionSpuVO distributionSpuVO = distributionSpuMapper.getByDistributionSpuId(offlineHandleEventDTO.getHandleId()); + if (!Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID) && !Objects.equals(AuthUserContext.get().getTenantId(), distributionSpuVO.getShopId())) { + throw new LuckException("该分销商品不属于当前店铺"); + } + if (!Objects.equals(distributionSpuVO.getState(), DistributionSpuStatus.PLATFORM_OFF_SHELF.value())) { + throw new LuckException("该分销商品状态已经发生变化,请刷新页面"); + } + // 更新事件状态 + ServerResponseEntity offlineRes = offlineHandleEventFeignClient.updateToApply(offlineHandleEventDTO); + if (!offlineRes.isSuccess()) { + throw new LuckException(offlineRes.getMsg()); + } + // 更新分销商品状态 + int changeCount = distributionSpuMapper.changeStateByDistributionId(offlineHandleEventDTO.getHandleId(), distributionSpuVO.getState(), DistributionSpuStatus.WAITAUDIT.value()); + if (changeCount != 1) { + throw new LuckException("申请失败,请刷新页面后重试"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void audit(OfflineHandleEventDTO offlineHandleEventDTO) { + DistributionSpuVO distributionSpuVO = distributionSpuMapper.getByDistributionSpuId(offlineHandleEventDTO.getHandleId()); + if (!Objects.equals(distributionSpuVO.getState(), DistributionSpuStatus.WAITAUDIT.value())) { + throw new LuckException("该分销商品已经审核"); + } + ServerResponseEntity offlineRes = offlineHandleEventFeignClient.auditOfflineEvent(offlineHandleEventDTO); + if (!offlineRes.isSuccess()) { + throw new LuckException(offlineRes.getMsg()); + } + Integer newState = 0; + // 审核通过 + if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.AGREE_BY_PLATFORM.getValue())) { + newState = DistributionSpuStatus.PUT_SHELF.value(); + } + // 审核不通过 + else if (Objects.equals(offlineHandleEventDTO.getStatus(), OfflineHandleEventStatus.DISAGREE_BY_PLATFORM.getValue())) { + newState = DistributionSpuStatus.PLATFORM_OFF_SHELF.value(); + } + int changeCount = distributionSpuMapper.changeStateByDistributionId(offlineHandleEventDTO.getHandleId(), distributionSpuVO.getState(), newState); + if (changeCount != 1) { + throw new LuckException("审核失败,请刷新页面后重试"); + } + } + + @Override + public DistributionSpuVO getBySpuId(Long spuId) { + return distributionSpuMapper.getBySpuId(spuId); + } + + + @Override + public OfflineHandleEventVO getOfflineHandleEvent(Long distributionSpuId) { + ServerResponseEntity offlineRes = offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.DISTRIBUTION_PROD.getValue(), distributionSpuId, null); + if (!offlineRes.isSuccess()) { + throw new LuckException(offlineRes.getMsg()); + } + return offlineRes.getData(); + } + + @Override + public void updateState(Long distributionSpuId, Integer state) { + DistributionSpuVO distributionSpuVO = distributionSpuMapper.getByDistributionSpuId(distributionSpuId); + if (Objects.isNull(distributionSpuVO)) { + throw new LuckException("分销商品不存在,请刷新页面"); + } + //校验 + validateDistributionUpdateState(distributionSpuVO); + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.MULTISHOP.value())) { + // 商家端操作 + if (Objects.equals(distributionSpuVO.getState(), DistributionSpuStatus.PLATFORM_OFF_SHELF.value()) || Objects.equals(distributionSpuVO.getState(), DistributionSpuStatus.WAITAUDIT.value())) { + throw new LuckException("当前分销商品状态无法更改"); + } + } + int changeCount = distributionSpuMapper.changeStateByDistributionId(distributionSpuId, distributionSpuVO.getState(), state); + if (changeCount != 1) { + throw new LuckException("状态变更失败,请刷新后重试"); + } + } + + @Override + public Boolean isStateBySpuIdAndState(Long spuId, Integer state) { + int count = distributionSpuMapper.countBySpuIdAndState(spuId, state); + return count > 0; + } + + @Override + public List getByStateAndSpuIds(Integer state, List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return null; + } + return distributionSpuMapper.getByStateAndSpuIds(state, spuIds); + } + + @Override + public void handleSpuState(List spuIds, List shopIds, Integer state) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + List distributionSpuList = distributionSpuMapper.getDistributionSpuListBySpuIdsAndShopIds(spuIds, shopIds); + List changeSpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 同步商品状态 + if (Objects.equals(state, StatusEnum.ENABLE.value())) { + // 上架 + distributionSpuList.forEach(distributionSpu -> { + if (Objects.equals(distributionSpu.getState(), StatusEnum.DISABLE.value())) { + changeSpuIds.add(distributionSpu.getSpuId()); + } + }); + } else if (Objects.equals(state, StatusEnum.DISABLE.value()) || Objects.equals(state, StatusEnum.OFFLINE.value())) { + // 商家下架或平台违规下架 + distributionSpuList.forEach(distributionSpu -> { + if (Objects.equals(distributionSpu.getState(), StatusEnum.ENABLE.value())) { + changeSpuIds.add(distributionSpu.getSpuId()); + } + }); + state = StatusEnum.DISABLE.value(); + } + if (CollUtil.isNotEmpty(changeSpuIds)) { + distributionSpuMapper.updateState(changeSpuIds, state); + } + } + + /** + * 校验分销商品信息 + * + * @param distributionSpuDTO 分销商品信息 + * @param createOrUpdate true: 创建时校验 false: 更新时校验 + */ + private void validateDistributionSpu(DistributionSpuDTO distributionSpuDTO, boolean createOrUpdate) { + // 根据商品id查询分销信息 + DistributionSpuVO distributionSpuVO = distributionSpuMapper.getBySpuId(distributionSpuDTO.getSpuId()); + // 判断分销信息是否已经存在 + if (createOrUpdate) { + if (Objects.nonNull(distributionSpuVO)) { + throw new LuckException("该商品已经添加到分销商品,不能重复添加"); + } + } + ServerResponseEntity spuRes = spuFeignClient.getDetailById(distributionSpuDTO.getSpuId()); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + SpuVO spuVO = spuRes.getData(); + if (Objects.isNull(spuVO)) { + throw new LuckException("选择的商品不存在,请刷新后重试"); + } + // 判断当前商品是否属于该店铺 + if (!Objects.equals(spuVO.getShopId(), distributionSpuDTO.getShopId())) { + throw new LuckException("当前商品不属于你的店铺"); + } + // 按比例 + if (Objects.equals(distributionSpuDTO.getAwardMode(), AwardMode.PROPORTION.value())) { + // 校验直推奖励 + if (distributionSpuDTO.getAwardNumbers() >= PROPORTION_MAX_STORAGE_VALUE) { + throw new LuckException("直推奖励比例最大不能超过" + (PROPORTION_MAX_STORAGE_VALUE / 100) + "%"); + } + if (Objects.equals(distributionSpuDTO.getParentAwardSet(), ParentAwardSet.OPEN.value())) { + // 校验间推奖励 + if (distributionSpuDTO.getParentAwardNumbers() >= PROPORTION_MAX_STORAGE_VALUE) { + throw new LuckException("间推奖励比例最大不能超过" + (PROPORTION_MAX_STORAGE_VALUE / 100) + "%"); + } + if (Arith.add(distributionSpuDTO.getAwardNumbers(), distributionSpuDTO.getParentAwardNumbers()) >= PROPORTION_MAX_STORAGE_VALUE) { + throw new LuckException("直推与间推奖励比例之和最大不能超过" + (PROPORTION_MAX_STORAGE_VALUE / 100) + "%"); + } + } + } else { + // 按实际金额 + // 校验直推奖励 + if (distributionSpuDTO.getAwardNumbers() >= spuVO.getPriceFee()) { + throw new LuckException("直推奖励固定奖励不能超过商品原价格"); + } + if (Objects.equals(distributionSpuDTO.getParentAwardSet(), ParentAwardSet.OPEN.value())) { + // 校验间推奖励 + if (distributionSpuDTO.getParentAwardNumbers() >= spuVO.getPriceFee()) { + throw new LuckException("间推奖励固定奖励不能超过商品原价格"); + } + if (Arith.add(distributionSpuDTO.getAwardNumbers(), distributionSpuDTO.getParentAwardNumbers()) >= spuVO.getPriceFee()) { + throw new LuckException("直推与间推奖励之和最大不能超过商品原价"); + } + } + } + } + + /** + * 上下架条件校验 + * + * @param distributionSpuVO + */ + private void validateDistributionUpdateState(DistributionSpuVO distributionSpuVO) { + ServerResponseEntity spuRes = spuFeignClient.getDetailById(distributionSpuVO.getSpuId()); + if (!spuRes.isSuccess()) { + throw new LuckException(spuRes.getMsg()); + } + SpuVO spuVO = spuRes.getData(); + if (Objects.isNull(spuVO)) { + throw new LuckException("商品不存在,请刷新后重试"); + } + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(spuVO.getShopId(), shopId)) { + throw new LuckException("当前商品不属于你的店铺"); + } + ServerResponseEntity shopByShopId = shopDetailFeignClient.getShopByShopId(shopId); + if (!shopByShopId.isSuccess()) { + throw new LuckException(shopByShopId.getMsg()); + } + EsShopDetailBO shopDetail = shopByShopId.getData(); + //上架操作校验 + if (Objects.equals(distributionSpuVO.getState(), DistributionSpuStatus.OFF_SHELF.value())) { + if (!Objects.equals(shopDetail.getShopStatus(), ShopStatus.OPEN.value()) && !Objects.equals(shopDetail.getShopStatus(), ShopStatus.STOP.value())) { + // 不能把分销商品更新为上架状态 + throw new LuckException("店铺处于违规下架状态,不能将分销商品置为上架状态"); + } + if (!Objects.equals(spuVO.getStatus(), StatusEnum.ENABLE.value())) { + // 商品不处于上线状态,分销商品不能进行上架操作 + throw new LuckException("商品不处于上线状态,分销商品不能进行上架操作"); + } + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserBanServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserBanServiceImpl.java new file mode 100644 index 0000000..4affe83 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserBanServiceImpl.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.platform.feign.SysUserFeignClient; +import com.tmerclub.cloud.api.platform.vo.SysUserVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.dto.DistributionUserBanDTO; +import com.tmerclub.cloud.distribution.mapper.DistributionUserBanMapper; +import com.tmerclub.cloud.distribution.model.DistributionUserBan; +import com.tmerclub.cloud.distribution.service.DistributionUserBanService; +import com.tmerclub.cloud.distribution.vo.DistributionUserBanVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 分销封禁记录 + * + * @author cl + * @date 2021-08-09 14:14:08 + */ +@Service +public class DistributionUserBanServiceImpl implements DistributionUserBanService { + + @Autowired + private DistributionUserBanMapper distributionUserBanMapper; + + @DubboReference + private SysUserFeignClient sysUserFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, DistributionUserBanDTO distributionUserBanDTO) { + PageVO banPage = PageUtil.doPage(pageDTO, () -> distributionUserBanMapper.list(distributionUserBanDTO)); + List banPageList = banPage.getList(); + if (CollUtil.isEmpty(banPageList)) { + return banPage; + } + List modifiers = banPageList.stream().map(DistributionUserBanVO::getModifier).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(modifiers)) { + return banPage; + } + ServerResponseEntity> sysUserData = sysUserFeignClient.getSysUserList(modifiers); + if (!sysUserData.isSuccess()) { + throw new LuckException(sysUserData.getMsg()); + } + List sysUserList = sysUserData.getData(); + Map modifierMap = sysUserList.stream().collect(Collectors.toMap(SysUserVO::getSysUserId, SysUserVO::getNickName)); + for (DistributionUserBanVO distributionUserBanVO : banPageList) { + Long modifier = distributionUserBanVO.getModifier(); + if (Objects.nonNull(modifier)) { + String modifierName = modifierMap.get(modifier); + if (Objects.nonNull(modifierName)) { + distributionUserBanVO.setModifierName(modifierName); + } + } + } + return banPage; + } + + @Override + public DistributionUserBan getByBanId(Long banId) { + return distributionUserBanMapper.getByBanId(banId); + } + + @Override + public void save(DistributionUserBan distributionUserBan) { + distributionUserBanMapper.save(distributionUserBan); + } + + @Override + public void update(DistributionUserBan distributionUserBan) { + distributionUserBanMapper.update(distributionUserBan); + } + + @Override + public void deleteById(Long banId) { + distributionUserBanMapper.deleteById(banId); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserBindServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserBindServiceImpl.java new file mode 100644 index 0000000..293e40b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserBindServiceImpl.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.distribution.constant.BindInvalidReasonEnum; +import com.tmerclub.cloud.distribution.constant.BindStateEnum; +import com.tmerclub.cloud.distribution.constant.DistributionUserStateEnum; +import com.tmerclub.cloud.distribution.dto.DistributionUserBindDTO; +import com.tmerclub.cloud.distribution.mapper.DistributionUserBindMapper; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.model.DistributionUserBind; +import com.tmerclub.cloud.distribution.service.DistributionConfigService; +import com.tmerclub.cloud.distribution.service.DistributionUserBindService; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.vo.DistributionUserBindInfoVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserBindVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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; +import java.util.stream.Collectors; + +/** + * 分销员绑定关系 + * + * @author cl + * @date 2021-08-09 14:14:09 + */ +@Service +public class DistributionUserBindServiceImpl implements DistributionUserBindService { + + private static final Logger logger = LoggerFactory.getLogger(DistributionUserBindServiceImpl.class); + + @Autowired + private DistributionUserBindMapper distributionUserBindMapper; + @Autowired + private DistributionConfigService distributionConfigService; + @Autowired + private DistributionUserService distributionUserService; + @DubboReference + private UserFeignClient userFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, DistributionUserBindDTO distributionUserBindDTO) { + PageVO bindPage = PageUtil.doPage(pageDTO, () -> distributionUserBindMapper.list(distributionUserBindDTO)); + List bindPageList = bindPage.getList(); + if (CollUtil.isEmpty(bindPageList)) { + return bindPage; + } + List userIds = bindPageList.stream().map(DistributionUserBindVO::getUserId).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(userIds)) { + return bindPage; + } + ServerResponseEntity> userApiResponse = userFeignClient.getUserByUserIds(userIds); + if (!userApiResponse.isSuccess()) { + throw new LuckException(userApiResponse.getMsg()); + } + if (CollUtil.isEmpty(userApiResponse.getData())) { + return bindPage; + } + List userApiList = userApiResponse.getData(); + Map userMap = userApiList.stream().collect(Collectors.toMap(UserApiVO::getUserId, UserApiVO::getNickName)); + Map userPhoneMap = userApiList.stream().collect(Collectors.toMap(UserApiVO::getUserId, UserApiVO::getPhone)); + for (DistributionUserBindVO distributionUserBindVO : bindPageList) { + Long userId = distributionUserBindVO.getUserId(); + String nickName = userMap.get(userId); + String userMobile = userPhoneMap.get(userId); + if (Objects.isNull(nickName) || Objects.isNull(userMobile)) { + continue; + } + distributionUserBindVO.setUserNickName(nickName); + distributionUserBindVO.setCuserMobile(userMobile); + } + return bindPage; + } + + @Override + public DistributionUserBind getByBindId(Long bindId) { + return distributionUserBindMapper.getByBindId(bindId); + } + + @Override + public void save(DistributionUserBind distributionUserBind) { + distributionUserBindMapper.save(distributionUserBind); + } + + @Override + public void update(DistributionUserBind distributionUserBind) { + distributionUserBindMapper.update(distributionUserBind); + } + + @Override + public void deleteById(Long bindId) { + distributionUserBindMapper.deleteById(bindId); + } + + @Override + public ServerResponseEntity bindDistribution(DistributionUser shareUser, Long userId, int type) { + //分享员信息 + if (shareUser == null) { + // 获取推广员信息失败 + return ServerResponseEntity.showFailMsg("获取推广员信息失败"); + } + if (!Objects.equals(shareUser.getState(), DistributionUserStateEnum.NORMAL.value())) { + logger.info("推广员状态异常"); + // 推广员状态异常 + return ServerResponseEntity.showFailMsg("推广员状态异常"); + } + DistributionConfigApiVO distributionConfig = distributionConfigService.getDistributionConfig(); + // 查询该用户以前绑定的分享人 + DistributionUserBind distributionUserBind = distributionUserBindMapper.getUserBindByUserIdAndState(userId, BindStateEnum.VALID.value()); + + // 没有绑定分享人,或分享人已被冻结,可以与该用户进行绑定 + // 自推不进行绑定 + if (Objects.isNull(distributionUserBind)) { + bindUser(userId, shareUser); + return ServerResponseEntity.success(shareUser); + } + + // 如果现在的分享人就是以前的分享人 + if (Objects.equals(distributionUserBind.getDistributionUserId(), shareUser.getDistributionUserId())) { + return ServerResponseEntity.success(shareUser); + } + + // 查询以前的绑定的用户信息 + DistributionUser oldDistributionUser = distributionUserService.getByDistributionUserId(distributionUserBind.getDistributionUserId()); + + // 不绑定,分享人优先 + if (Objects.equals(distributionConfig.getAttribution(), 1)) { + unBindUser(distributionUserBind.getBindId()); + bindUser(userId, shareUser); + return ServerResponseEntity.success(shareUser); + } + return ServerResponseEntity.fail(ResponseEnum.SHOW_FAIL, oldDistributionUser); + } + + @Override + public PageVO bindUserList(PageDTO pageDTO, Long userId) { + PageVO pageVO = PageUtil.doPage(pageDTO, () -> distributionUserBindMapper.bindUserList(userId)); + List list = pageVO.getList(); + if (CollUtil.isEmpty(list)) { + return pageVO; + } + List userIds = list.stream().map(DistributionUserBindInfoVO::getUserId).collect(Collectors.toList()); + // 获取用户信息 + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(userIds); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + List userList = userResponse.getData(); + if (CollUtil.isEmpty(userList)) { + return pageVO; + } + Map userMap = userList.stream().collect(Collectors.toMap(UserApiVO::getUserId, (k) -> k)); + for (DistributionUserBindInfoVO bindInfoVO : list) { + Long userIdOri = bindInfoVO.getUserId(); + UserApiVO userApiVO = userMap.get(userIdOri); + if (Objects.isNull(userApiVO)) { + continue; + } + bindInfoVO.setNickName(userApiVO.getNickName()); + bindInfoVO.setPic(userApiVO.getPic()); + } + pageVO.setList(list); + return pageVO; + } + + @Override + public DistributionUserBind getUserBindByUserIdAndState(Long userId, Integer state) { + return distributionUserBindMapper.getUserBindByUserIdAndState(userId, state); + } + + private void unBindUser(Long bindId) { + DistributionUserBind distributionUserBind = new DistributionUserBind(); + distributionUserBind.setBindId(bindId); + distributionUserBind.setInvalidTime(new Date()); + // 系统修改 + distributionUserBind.setInvalidReason(BindInvalidReasonEnum.ADMIN.value()); + distributionUserBind.setState(BindStateEnum.INVALID.value()); + distributionUserBindMapper.update(distributionUserBind); + + } + + private void bindUser(Long userId, DistributionUser shareUser) { + DistributionUserBind distributionUserBind = new DistributionUserBind(); + distributionUserBind.setBindTime(new Date()); + distributionUserBind.setUserId(userId); + distributionUserBind.setState(BindStateEnum.VALID.value()); + distributionUserBind.setDistributionUserId(shareUser.getDistributionUserId()); + distributionUserBindMapper.save(distributionUserBind); + } + + private boolean verifyType(DistributionConfigApiVO distributionConfig, int type) { + // 不绑定,分享人优先--不需要检验 + return Objects.equals(distributionConfig.getAttribution(), 1); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserServiceImpl.java new file mode 100644 index 0000000..41afbe8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionUserServiceImpl.java @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.constant.DistributionCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.distribution.constant.*; +import com.tmerclub.cloud.distribution.constant.*; +import com.tmerclub.cloud.distribution.dto.DistributionUserDTO; +import com.tmerclub.cloud.distribution.mapper.*; +import com.tmerclub.cloud.distribution.mapper.*; +import com.tmerclub.cloud.distribution.model.DistributionAuditing; +import com.tmerclub.cloud.distribution.model.DistributionUser; +import com.tmerclub.cloud.distribution.model.DistributionUserBan; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.service.DistributionUserService; +import com.tmerclub.cloud.distribution.service.DistributionUserWalletService; +import com.tmerclub.cloud.distribution.vo.*; +import com.tmerclub.cloud.distribution.vo.*; +import org.apache.commons.collections.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +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.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 分销员信息 + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +@Service +public class DistributionUserServiceImpl implements DistributionUserService { + private static final Logger logger = LoggerFactory.getLogger(DistributionUserServiceImpl.class); + + @Autowired + private DistributionUserMapper distributionUserMapper; + @Autowired + private SegmentManager segmentManager; + @Autowired + private DistributionUserBanMapper distributionUserBanMapper; + @Autowired + private DistributionUserBindMapper distributionUserBindMapper; + @Autowired + private DistributionSpuBindMapper distributionSpuBindMapper; + @Autowired + private DistributionUserIncomeMapper distributionUserIncomeMapper; + @Autowired + private DistributionUserWalletMapper distributionUserWalletMapper; + @Autowired + private DistributionWithdrawCashMapper distributionWithdrawCashMapper; + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @Autowired + private DistributionAuditingMapper distributionAuditingMapper; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private ConfigFeignClient configFeignClient; + + + @DubboReference + private OrderFeignClient orderFeignClient; + + @Override + public PageVO distributionUserPage(PageDTO pageDTO, DistributionUserDTO distributionUserDTO) { + return PageUtil.doPage(pageDTO, () -> distributionUserMapper.listDistributionUser(distributionUserDTO)); + } + + @Override + public DistributionUser getByDistributionUserId(Long distributionUserId) { + return distributionUserMapper.getByDistributionUserId(distributionUserId); + } + + @Override + public void save(DistributionUser distributionUser) { + if (Objects.isNull(distributionUser.getDistributionUserId())) { + Long distributionUserId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_DISTRIBUTION_USER); + distributionUser.setDistributionUserId(distributionUserId); + } + distributionUserMapper.save(distributionUser); + } + + @Override + public void update(DistributionUser distributionUser) { + distributionUserMapper.update(distributionUser); + } + + @Override + public void deleteById(Long distributionUserId) { + distributionUserMapper.deleteById(distributionUserId); + } + + @Override + public PageVO achievementPage(PageDTO pageDTO, DistributionUserDTO distributionUserDTO, String userMobile) { + return PageUtil.doPage(pageDTO, () -> distributionUserMapper.achievementPage(distributionUserDTO, userMobile)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDistributionStateAndBan(DistributionUserBan distributionUserBan) { + //写入封禁记录 + distributionUserBan.setUpdateTime(new Date()); + //修改人 + distributionUserBan.setModifier(AuthUserContext.get().getUserId()); + distributionUserBanMapper.save(distributionUserBan); + //更新分销员的状态 + DistributionUser beforeDistributionUser = distributionUserMapper.getByDistributionUserId(distributionUserBan.getDistributionUserId()); + DistributionUser distributionUser = new DistributionUser(); + distributionUser.setDistributionUserId(distributionUserBan.getDistributionUserId()); + distributionUser.setState(distributionUserBan.getState()); + distributionUser.setBindTime(beforeDistributionUser.getBindTime()); + //如果是暂时封禁[2]或永久封禁[-1] + if (Objects.equals(DistributionUserStateEnum.BAN.value(), distributionUserBan.getState()) || + Objects.equals(DistributionUserStateEnum.PER_BAN.value(), distributionUserBan.getState())) { + distributionUser.setStateRecord(distributionUserBan.getState()); + //绑定的用户失效 + distributionUserBindMapper.updateStateAndReasonByDistributionUserId(distributionUserBan.getDistributionUserId(), BindStateEnum.INVALID.value()); + //将商品分享记录设为失效 + distributionSpuBindMapper.updateStateByDistributionUserId(distributionUserBan.getDistributionUserId(), -1); + //判断是否为永久封禁 + if (Objects.equals(DistributionUserStateEnum.PER_BAN.value(), distributionUserBan.getState())) { + //将正在处理中的佣金订单冻结 + distributionUserIncomeMapper.updateStateByDistributionUserId(distributionUserBan.getDistributionUserId(), -1); + //将distribution_user_wallet累计收益改为0 + distributionUserWalletMapper.updateAmountByDistributionUserId(distributionUserBan.getDistributionUserId()); + //将distribution_user上级id清空[清空该被永久封禁的分销员的下级关系] + distributionUserMapper.updateParentIdById(distributionUserBan.getDistributionUserId()); + //提现记录为申请中的变为拒绝提现 + distributionWithdrawCashMapper.updateUserByDistributionUserId(distributionUserBan.getDistributionUserId()); + } + } + // 如果恢复成正常状态就不需要记录之前的状态了 + if (Objects.equals(distributionUserBan.getState(), DistributionUserStateEnum.NORMAL.value())) { + distributionUser.setStateRecord(null); + } + distributionUserMapper.updateStatus(distributionUser); + } + + @Override + public List getDistributionUserByIdCardNumberAndUserMobile(String identityCardNumber, String userMobile) { + return distributionUserMapper.getDistributionUserByIdCardNumberAndUserMobile(identityCardNumber, userMobile); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void registerDistributionUser(DistributionUser distributionUser) { + DistributionUserVO dbDistributionUser = distributionUserMapper.getByUserId(distributionUser.getUserId()); + // 返回自增id + Long distributionUserId; + if (dbDistributionUser == null) { + //存入分销员数据库 + this.save(distributionUser); + distributionUserId = distributionUser.getDistributionUserId(); + //为这个分销员创建一个钱包 + DistributionUserWallet distributionUserWallet = new DistributionUserWallet(); + distributionUserWallet.setAccumulateAmount(Constant.ZERO_LONG); + distributionUserWallet.setSettledAmount(Constant.ZERO_LONG); + distributionUserWallet.setInvalidAmount(Constant.ZERO_LONG); + distributionUserWallet.setVersion(0); + distributionUserWallet.setDistributionUserId(distributionUserId); + distributionUserWallet.setUnsettledAmount(Constant.ZERO_LONG); + distributionUserWalletService.save(distributionUserWallet); + } else { + dbDistributionUser.setState(DistributionUserStateEnum.WAIT_AUDIT.value()); + distributionUser.setDistributionUserId(dbDistributionUser.getDistributionUserId()); + distributionUserMapper.update(distributionUser); + distributionUserId = dbDistributionUser.getDistributionUserId(); + } + + //创建申请记录该用户是否为本店分销员 + DistributionAuditing distributionAuditing = new DistributionAuditing(); + distributionAuditing.setAuditingTime(new Date()); + distributionAuditing.setDistributionUserId(distributionUserId); + distributionAuditing.setParentDistributionUserId(distributionUser.getParentId()); + + //符合条件,自动通过 + if (Objects.equals(distributionUser.getState(), DistributionUserStateEnum.NORMAL.value())) { + distributionAuditing.setRemarks("系统判断自动通过审核"); + distributionAuditing.setState(DistributionAuditStateEnum.PASSED.value()); + } else { + distributionAuditing.setState(DistributionAuditStateEnum.UNAUDITED.value()); + } + if (dbDistributionUser == null) { + //存入申请记录 + distributionAuditingMapper.save(distributionAuditing); + } else { + DistributionAuditingVO dbAuditing = distributionAuditingMapper.getByDistributionUserId(distributionUserId); + distributionAuditing.setAuditingId(dbAuditing.getAuditingId()); + distributionAuditingMapper.update(distributionAuditing); + } + } + + @Override + public AchievementDataVO getAchievementDataById(Long distributionUserId) { + AchievementDataVO achievementDataVO = distributionUserMapper.getAchievementDataById(distributionUserId); + // 将金额转换成元 + BigDecimal settledAmount = achievementDataVO.getSettledAmount(); + BigDecimal unsettledAmount = achievementDataVO.getUnsettledAmount(); + BigDecimal accumulateAmount = achievementDataVO.getAccumulateAmount(); + BigDecimal invalidAmount = achievementDataVO.getInvalidAmount(); + achievementDataVO.setSettledAmount(PriceUtil.toDecimalPrice(settledAmount.longValue())); + achievementDataVO.setUnsettledAmount(PriceUtil.toDecimalPrice(unsettledAmount.longValue())); + achievementDataVO.setAccumulateAmount(PriceUtil.toDecimalPrice(accumulateAmount.longValue())); + achievementDataVO.setInvalidAmount(PriceUtil.toDecimalPrice(invalidAmount.longValue())); + return achievementDataVO; + } + + @Override + public PageVO getPageDistributionUserSimpleInfoByParentUserId(PageDTO pageDTO, Long parentDistributionUserId) { + return PageUtil.doPage(pageDTO, () -> distributionUserMapper.getPageDistributionUserSimpleInfoByParentUserId(parentDistributionUserId)); + } + + @Override + public DistributionUserBanVO getLatestBanInfoByDistributionUserId(Long distributionUserId) { + DistributionUserBanVO distributionUserBanVO = distributionUserBanMapper.getLatestBanInfoByDistributionUserId(distributionUserId); + if (Objects.isNull(distributionUserBanVO)) { + // 没有被封禁过,获取用户的状态信息 + DistributionUser distributionUser = distributionUserMapper.getByDistributionUserId(distributionUserId); + if (Objects.isNull(distributionUser)) { + throw new LuckException("找不到当前分销员"); + } + distributionUserBanVO = new DistributionUserBanVO(); + distributionUserBanVO.setState(distributionUser.getState()); + } + return distributionUserBanVO; + } + + + @Override + @Cacheable(cacheNames = DistributionCacheNames.DISTRIBUTION_USER_ID, key = "#userId") + public DistributionUserVO getByUserId(Long userId) { + return distributionUserMapper.getByUserId(userId); + } + + @Override + @CacheEvict(cacheNames = DistributionCacheNames.DISTRIBUTION_USER_ID, key = "#userId") + public void removeCacheByUserId(Long userId) { + } + + @Override + public List getDistributionMyFriend(DistributionUserVO user, Integer userType) { + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.isNull(paySysType)) { + paySysType = PaySysType.DEFAULT.value(); + } + List resultList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (userType.equals(DUserType.MY_FRIEND.value())) { + // 获取二级佣金 == 我的好友推广的订单我的间接佣金 + List distributionUsers = distributionUserMapper.getDistributionUserListByParentUserId(user.getDistributionUserId()); + if (CollUtil.isEmpty(distributionUsers)) { + return resultList; + } + for (DistributionUserVO distributionUser : distributionUsers) { + DistributionUserInfoVO distributionUserInfoVO = BeanUtil.map(distributionUser, DistributionUserInfoVO.class); + distributionUserInfoVO.setMoney(0L); + resultList.add(distributionUserInfoVO); + } + List infoVOList = distributionUserIncomeMapper.getFriendInfo(user, distributionUsers, DistributionUserIncomeTypeEnum.AWARD_TWO.value(), paySysType); + if (CollectionUtils.isNotEmpty(infoVOList)) { + Map idAndMoneyMap = infoVOList.stream().collect(Collectors.toMap(DistributionUserInfoVO::getDistributionUserId, DistributionUserInfoVO::getMoney)); + for (DistributionUserInfoVO distributionUserInfoVO : resultList) { + distributionUserInfoVO.setMoney(idAndMoneyMap.get(distributionUserInfoVO.getDistributionUserId()) == null ? 0L : idAndMoneyMap.get(distributionUserInfoVO.getDistributionUserId())); + } + } + //根据金额倒序排序 + if (CollectionUtils.isNotEmpty(resultList)) { + logger.info("我的好友推广的订单佣金倒序排序"); + resultList = resultList.stream().sorted(Comparator.comparing(DistributionUserInfoVO::getMoney).reversed()).collect(Collectors.toList()); + } + } else { + //获取绑定的收益用户id集合 + List userIds = distributionUserBindMapper.getListByDistributionUserId(user.getDistributionUserId()); + if (CollUtil.isEmpty(userIds)) { + return new ArrayList<>(0); + } + //获取用户信息 + List userList = userFeignClient.getUserByUserIds(userIds).getData(); + //所有直推的订单收益金额 + List orderMoneyList = distributionUserIncomeMapper.selectIncomeInfo(DistributionUserIncomeTypeEnum.AWARD_ONE.value(), user, paySysType, IncomeStateEnum.SETTLED.value()); + // TODO 兼容之前的分销数据 + List orderIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + orderMoneyList.forEach(s -> { + if (s.getUserId() == null) { + orderIdList.add(s.getOrderId()); + } + }); + if (CollectionUtils.isNotEmpty(orderIdList)) { + List orderList = orderFeignClient.getUserByOrderIdList(orderIdList).getData(); + Map orderMap = orderList.stream().collect(Collectors.toMap(EsOrderVO::getOrderId, EsOrderVO::getUserId)); + orderMoneyList.forEach(s -> { + if (s.getUserId() == null) { + s.setUserId(orderMap.get(s.getOrderId())); + } + }); + } + Map> orderMoneyMap = orderMoneyList.stream().collect(Collectors.groupingBy(DistributionUserIncomeVO::getUserId)); + for (UserApiVO userApiVO : userList) { + DistributionUserInfoVO distributionUserInfoVO = BeanUtil.map(userApiVO, DistributionUserInfoVO.class); + long money = 0L; + int size = 0; + if (orderMoneyMap.containsKey(userApiVO.getUserId())) { + for (DistributionUserIncomeVO distributionUserIncomeVO : orderMoneyMap.get(userApiVO.getUserId())) { + if (distributionUserIncomeVO.getState() != 0 && distributionUserIncomeVO.getState() != -1) { + money = money + distributionUserIncomeVO.getIncomeAmount(); + } + size++; + } + } + distributionUserInfoVO.setMoney(money); + distributionUserInfoVO.setOrderNumber(size); + resultList.add(distributionUserInfoVO); + } + //根据金额以及次数倒序排序 + if (CollectionUtils.isNotEmpty(resultList)) { + logger.info("我的用户订单佣金以及下单数倒序排序"); + resultList = resultList.stream().sorted(Comparator.comparing(DistributionUserInfoVO::getMoney).reversed().thenComparing(DistributionUserInfoVO::getOrderNumber, Comparator.reverseOrder())).collect(Collectors.toList()); + } + } + return resultList; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionWithdrawCashServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionWithdrawCashServiceImpl.java new file mode 100644 index 0000000..d2c0570 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/DistributionWithdrawCashServiceImpl.java @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.lang.Snowflake; +import com.tmerclub.cloud.api.auth.vo.AuthSocialVO; +import com.tmerclub.cloud.api.platform.vo.DistributionConfigApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.DistributionAudit; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.distribution.constant.DistributionWithdrawCashStateEnum; +import com.tmerclub.cloud.distribution.constant.EnterpriseApplyType; +import com.tmerclub.cloud.distribution.dto.AppDistributionWithdrawCashDTO; +import com.tmerclub.cloud.distribution.dto.DistributionWithdrawCashDTO; +import com.tmerclub.cloud.distribution.dto.RangeTimeDTO; +import com.tmerclub.cloud.distribution.mapper.DistributionWithdrawCashMapper; +import com.tmerclub.cloud.distribution.mapper.EnterprisePayMapper; +import com.tmerclub.cloud.distribution.model.DistributionUserWallet; +import com.tmerclub.cloud.distribution.model.DistributionUserWalletBill; +import com.tmerclub.cloud.distribution.model.DistributionWithdrawCash; +import com.tmerclub.cloud.distribution.model.EnterprisePay; +import com.tmerclub.cloud.distribution.service.*; +import com.tmerclub.cloud.distribution.service.*; +import com.tmerclub.cloud.distribution.vo.AppDistributionWithdrawCashVO; +import com.tmerclub.cloud.distribution.vo.DistributionUserVO; +import com.tmerclub.cloud.distribution.vo.DistributionWithdrawCashVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.Objects; + +/** + * 分销员提现记录 + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +@Service +public class DistributionWithdrawCashServiceImpl implements DistributionWithdrawCashService { + + @Autowired + private DistributionWithdrawCashMapper distributionWithdrawCashMapper; + @Autowired + private DistributionUserWalletService distributionUserWalletService; + @Autowired + private DistributionConfigService distributionConfigService; + @Autowired + private DistributionUserWalletBillService distributionUserWalletBillService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private EnterprisePayMapper enterprisePayMapper; + @Autowired + private DistributionUserService distributionUserService; + + @Override + public PageVO page(PageDTO pageDTO, String userMobile, DistributionWithdrawCashDTO distributionWithdrawCashDTO) { + return PageUtil.doPage(pageDTO, () -> distributionWithdrawCashMapper.withdrawCashPage(userMobile, distributionWithdrawCashDTO)); + } + + @Override + public DistributionWithdrawCash getByWithdrawCashId(Long withdrawCashId) { + return distributionWithdrawCashMapper.getByWithdrawCashId(withdrawCashId); + } + + @Override + public void save(DistributionWithdrawCash distributionWithdrawCash) { + distributionWithdrawCashMapper.save(distributionWithdrawCash); + } + + @Override + public void update(DistributionWithdrawCash distributionWithdrawCash) { + distributionWithdrawCashMapper.update(distributionWithdrawCash); + } + + @Override + public void deleteById(Long withdrawCashId) { + distributionWithdrawCashMapper.deleteById(withdrawCashId); + } + + @Override + public PageVO pageByDistributionUserId(PageDTO pageDTO, Long distributionUserId) { + return PageUtil.doPage(pageDTO, () -> distributionWithdrawCashMapper.pageByDistributionUserId(distributionUserId)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void apply(AppDistributionWithdrawCashDTO distributionWithdrawCashDTO, DistributionUserVO distributionUserVO, AuthSocialVO authSocialVO) { + // 获取用户的钱包数据 + Long distributionUserId = distributionUserVO.getDistributionUserId(); + DistributionUserWallet distributionUserWallet = distributionUserWalletService.getByDistributionUserId(distributionUserId); + // 获取店铺提现设置 + DistributionConfigApiVO distributionConfig = distributionConfigService.getDistributionConfig(); + BigDecimal amount = distributionWithdrawCashDTO.getAmount(); + + //结算提现金额是否超出限制 + if (amount.compareTo(distributionConfig.getAmountMax()) > 0) { + // 提现金额大于最大提现金额 + throw new LuckException("提现金额大于最大提现金额"); + } + if (amount.compareTo(distributionConfig.getAmountMin()) < 0) { + // 提现金额小于最小提现金额 + throw new LuckException("提现金额小于最小提现金额"); + } + //获取店铺设置的提现频率算出时间区间 + Calendar calendar = Calendar.getInstance(); + if (Objects.equals(distributionConfig.getFrequency(), Constant.FREQUENCY_DAY)) { + //每月的第一天 + calendar.set(Calendar.DAY_OF_MONTH, 1); + } else { + calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - distributionConfig.getFrequency()); + } + //将小时至0 + calendar.set(Calendar.HOUR_OF_DAY, 0); + //将分钟至0 + calendar.set(Calendar.MINUTE, 0); + //将秒至0 + calendar.set(Calendar.SECOND, 0); + //将毫秒至0 + calendar.set(Calendar.MILLISECOND, 0); + RangeTimeDTO rangeTime = new RangeTimeDTO(calendar.getTime(), new Date()); + Integer number = distributionConfig.getNumber(); + //获取用户最近的提现次数,判断是否能够提现 + Integer count = distributionWithdrawCashMapper.getCountByRangeTimeAndDistributionUserId(rangeTime, distributionUserId); + if (count >= number) { + if (Objects.equals(distributionConfig.getFrequency(), Constant.FREQUENCY_DAY)) { + // 提现次数为每月 number 次 + throw new LuckException("提现次数为每月" + number + "次"); + } else { + // 提现次数为 天number次 + throw new LuckException("提现次数为" + distributionConfig.getFrequency() + "天" + number + "次"); + } + } + //判断提现金额 是否大于钱包金额 + BigDecimal settledAmount = PriceUtil.toDecimalPrice(distributionUserWallet.getSettledAmount()); + if (amount.compareTo(settledAmount) > 0) { + // 提现失败,余额不足 + throw new LuckException("提现失败,余额不足"); + } + //扣除可提现余额 + distributionUserWallet.setSettledAmount(PriceUtil.toLongCent(settledAmount.subtract(amount))); + + //插入一条提现记录 + Date now = new Date(); + DistributionWithdrawCash distributionWithdrawCash = new DistributionWithdrawCash(); + distributionWithdrawCash.setBizUserId(authSocialVO.getBizUserId()); + distributionWithdrawCash.setCreateTime(now); + distributionWithdrawCash.setWalletId(distributionUserWallet.getWalletId()); + distributionWithdrawCash.setAmount(PriceUtil.toLongCent(amount)); + // 提现流水号 + Long merchantOrderId = segmentManager.getDateFormatSegmentId(DistributedIdKey.MALL4CLOUD_DISTRIBUTION_WITHDRAW_ORDER); + distributionWithdrawCash.setMerchantOrderId(merchantOrderId.toString()); + distributionWithdrawCash.setState(DistributionWithdrawCashStateEnum.APPLY.value()); + distributionWithdrawCash.setVersion(0); + distributionWithdrawCash.setUpdateTime(now); + // 暂时没有手续费 + distributionWithdrawCash.setFee(Constant.ZERO_LONG); + // 设置为手动提现 + distributionWithdrawCash.setType(0); + // 判断人工审核后线下打款 + if (distributionConfig.getWithdrawal().equals(DistributionAudit.TWithdrawals_TWO.value())) { + distributionWithdrawCash.setMoneyFlow(0); + } else { + distributionWithdrawCash.setMoneyFlow(1); + } + + // 存入提现记录 + distributionWithdrawCashMapper.save(distributionWithdrawCash); + + // 增加钱包流水记录 + DistributionUserWalletBill distributionUserWalletBill = new DistributionUserWalletBill(distributionUserWallet, "用户提现", "User withdrawals", Constant.ZERO_LONG, -PriceUtil.toLongCent(amount), Constant.ZERO_LONG, Constant.ZERO_LONG, 0); + distributionUserWalletBillService.save(distributionUserWalletBill); + + // 修改钱包 + DistributionUserWallet updateWallet = new DistributionUserWallet(); + updateWallet.setWalletId(distributionUserWallet.getWalletId()); + updateWallet.setSettledAmount(distributionUserWallet.getSettledAmount()); + distributionUserWalletService.update(updateWallet); + + } + + @Override + public Integer getCountByRangeTimeAndDistributionUserId(RangeTimeDTO rangeTimeDTO, Long distributionUserId) { + return distributionWithdrawCashMapper.getCountByRangeTimeAndDistributionUserId(rangeTimeDTO, distributionUserId); + } + + @Override + public Long getUserTotalWithdrawCash(Long walletId) { + BigDecimal total = distributionWithdrawCashMapper.getUserTotalWithdrawCash(walletId); + return total.longValue(); + } + + @Override + public void enterprisePay(DistributionWithdrawCash distributionWithdrawCash, Long userId, String openId, Integer status) { + // 添加商家转账记录 + EnterprisePay enterprisePay = new EnterprisePay(); + enterprisePay.setStatus(status); + enterprisePay.setType(EnterpriseApplyType.DISTRIBUTION_WITHDRAW.value()); + enterprisePay.setBizId(distributionWithdrawCash.getWithdrawCashId()); + enterprisePay.setUserId(userId); + enterprisePay.setOpenId(openId); + enterprisePay.setVersion(0); + enterprisePay.setEntPayOrderNo(new Snowflake().nextId()); + enterprisePay.setUpdateTime(new Date()); + enterprisePay.setCreateTime(new Date()); + enterprisePay.setAmount(distributionWithdrawCash.getAmount()); + enterprisePayMapper.save(enterprisePay); + } + + @Override + public void distributionWithdrawToSuccess(EnterprisePay enterprisePay) { + if (!Objects.equals(enterprisePay.getType(), EnterpriseApplyType.DISTRIBUTION_WITHDRAW.value())) { + return; + } + // 更新提现状态 + DistributionWithdrawCash distributionWithdrawCash = getByWithdrawCashId(enterprisePay.getBizId()); + distributionWithdrawCash.setState(DistributionWithdrawCashStateEnum.CASH_SUCCESS.value()); + distributionWithdrawCash.setUpdateTime(new Date()); + update(distributionWithdrawCash); + } + + @Override + public void distributionWithdrawToFailed(EnterprisePay enterprisePay) { + //商户提现失败 + if (!Objects.equals(EnterpriseApplyType.DISTRIBUTION_WITHDRAW.value(), enterprisePay.getType())) { + return; + } + DistributionWithdrawCash distributionWithdrawCash = getByWithdrawCashId(enterprisePay.getBizId()); + DistributionUserVO distributionUser = distributionUserService.getByUserId(enterprisePay.getUserId()); + DistributionUserWallet distributionUserWallet = distributionUserWalletService.getByDistributionUserId(distributionUser.getDistributionUserId()); + // 更新状态并将金额回退到分销员钱包中 + distributionWithdrawCash.setState(DistributionWithdrawCashStateEnum.CASH_FAIL.value()); + // 增加用户可提现金额 + distributionUserWallet.setSettledAmount(distributionUserWallet.getSettledAmount() + distributionWithdrawCash.getAmount()); + + //增加钱包流水记录 + distributionUserWalletBillService.save(new DistributionUserWalletBill(distributionUserWallet, "提现失败", "Failed to withdraw cash", 0L, distributionWithdrawCash.getAmount(), 0L, 0L, 0)); + distributionUserWalletService.update(distributionUserWallet); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/EnterprisePayServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/EnterprisePayServiceImpl.java new file mode 100644 index 0000000..1ed40f0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/service/impl/EnterprisePayServiceImpl.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.service.impl; + +import cn.hutool.core.lang.Snowflake; +import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest; +import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.bean.WxMiniApp; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.config.WxConfig; +import com.tmerclub.cloud.distribution.mapper.EnterprisePayMapper; +import com.tmerclub.cloud.distribution.model.EnterprisePay; +import com.tmerclub.cloud.distribution.service.DistributionWithdrawCashService; +import com.tmerclub.cloud.distribution.service.EnterprisePayService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商家转账 + * + * @author FrozenWatermelon + * @date 2023-02-22 15:58:50 + */ +@Service +public class EnterprisePayServiceImpl implements EnterprisePayService { + private static final Logger LOGGER = LoggerFactory.getLogger(EnterprisePayServiceImpl.class); + + @Autowired + private EnterprisePayMapper enterprisePayMapper; + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private WxConfig wxConfig; + + @Autowired + private DistributionWithdrawCashService distributionWithdrawCashService; + + @DubboReference + private UserFeignClient userFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> enterprisePayMapper.list()); + } + + @Override + public EnterprisePay getByEntPayId(Long entPayId) { + return enterprisePayMapper.getByEntPayId(entPayId); + } + + @Override + public void save(EnterprisePay enterprisePay) { + enterprisePayMapper.save(enterprisePay); + } + + @Override + public void update(EnterprisePay enterprisePay) { + enterprisePayMapper.update(enterprisePay); + } + + @Override + public void deleteById(Long entPayId) { + enterprisePayMapper.deleteById(entPayId); + } + + @Override + public List listApplyEnterprisePay() { + return enterprisePayMapper.listApplyEnterprisePay(); + } + + @Override + public void sendEnterprisePay(List enterprisePayList) { + if (CollectionUtils.isEmpty(enterprisePayList)) { + return; + } + String outBatchNo = new Snowflake().nextIdStr(); + TransferCreateRequest transferCreateRequest = new TransferCreateRequest(); + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + transferCreateRequest.setAppid(wxMiniApp.getAppId()); + transferCreateRequest.setOutBatchNo(outBatchNo); + transferCreateRequest.setBatchName("NO_CHECK"); + // 批次备注 + transferCreateRequest.setBatchRemark("商城分销提现"); + List transferDetailList = new ArrayList<>(Constant.INITIAL_CAPACITY); + int totalAmount = 0; + Set userIds = enterprisePayList.stream().map(EnterprisePay::getUserId).collect(Collectors.toSet()); + ServerResponseEntity> response = userFeignClient.getUserByUserIds(new ArrayList<>(userIds)); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + Map userMap = response.getData().stream().collect(Collectors.toMap(UserApiVO::getUserId, u -> u)); + for (EnterprisePay enterprisePay : enterprisePayList) { + int amount = addAndGetAmount(transferDetailList, enterprisePay, userMap); + totalAmount += amount; + } + transferCreateRequest.setTotalAmount(totalAmount); + transferCreateRequest.setTotalNum(enterprisePayList.size()); + transferCreateRequest.setTransferDetailList(transferDetailList); + try { + TransferCreateResult transfer = wxConfig.getMerchantTransferService().createTransfer(transferCreateRequest); + enterprisePayList.forEach(enterprisePay -> { + enterprisePay.setOutBatchNo(transfer.getOutBatchNo()); + }); + updateBatch(enterprisePayList); + } catch (WxPayException wxPayException) { + LOGGER.error("异常:", wxPayException); + } + } + + private static int addAndGetAmount(List transferDetailList, EnterprisePay enterprisePay, Map userMap) { + TransferCreateRequest.TransferDetailList transferDetail = new TransferCreateRequest.TransferDetailList(); + transferDetail.setOpenid(enterprisePay.getOpenId()); + transferDetail.setOutDetailNo(String.valueOf(enterprisePay.getEntPayOrderNo())); + int amount = Integer.parseInt(enterprisePay.getAmount().toString()); + transferDetail.setTransferAmount(amount); + UserApiVO user = userMap.get(enterprisePay.getUserId()); + // 转账备注 + if (Objects.isNull(user)) { + transferDetail.setTransferRemark("分销用户已注销"); + } else { + transferDetail.setTransferRemark(user.getNickName() + "(" + user.getPhone() + ")"); + } + transferDetailList.add(transferDetail); + return amount; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void paySuccess(EnterprisePay enterprisePay) { + //更新商家转账信息 + if (enterprisePayMapper.paySuccess(enterprisePay.getEntPayOrderNo(), enterprisePay.getVersion()) != 1) { + // 更新余额记录失败,请稍后再试 + throw new LuckException("更新余额记录失败,请稍后再试"); + } + // 推送支付成功事件 + distributionWithdrawCashService.distributionWithdrawToSuccess(enterprisePay); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void payFailed(EnterprisePay enterprisePay) { + //更新商家转账信息 + if (enterprisePayMapper.payFailed(enterprisePay.getEntPayOrderNo(), enterprisePay.getVersion()) != 1) { + // 更新余额记录失败,请稍后再试 + throw new LuckException("更新余额记录失败,请稍后再试"); + } + // 推送支付失败事件 + distributionWithdrawCashService.distributionWithdrawToFailed(enterprisePay); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBatch(List enterprisePayList) { + enterprisePayMapper.updateBatch(enterprisePayList); + } + + @Override + public List listEnterprisePay() { + return enterprisePayMapper.listEnterprisePay(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AchievementDataVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AchievementDataVO.java new file mode 100644 index 0000000..5296ab2 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/AchievementDataVO.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 分销员业绩数据 + * + * @author cl + * @date 2021-08-16 14:53:11 + */ +public class AchievementDataVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "积累绑定客户数") + private Integer boundCustomers; + + @Schema(description = "积累邀请分销员数") + private Integer invitedDistributors; + + @Schema(description = "积累推广订单数") + private Integer orderCount; + + @Schema(description = "待结算金额") + private BigDecimal unsettledAmount; + + @Schema(description = "可提现金额") + private BigDecimal settledAmount; + + @Schema(description = "已失效金额") + private BigDecimal invalidAmount; + + @Schema(description = "积累收益") + private BigDecimal accumulateAmount; + + public Integer getBoundCustomers() { + return boundCustomers; + } + + public void setBoundCustomers(Integer boundCustomers) { + this.boundCustomers = boundCustomers; + } + + public Integer getInvitedDistributors() { + return invitedDistributors; + } + + public void setInvitedDistributors(Integer invitedDistributors) { + this.invitedDistributors = invitedDistributors; + } + + public Integer getOrderCount() { + return orderCount; + } + + public void setOrderCount(Integer orderCount) { + this.orderCount = orderCount; + } + + public BigDecimal getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(BigDecimal unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public BigDecimal getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(BigDecimal settledAmount) { + this.settledAmount = settledAmount; + } + + public BigDecimal getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(BigDecimal invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public BigDecimal getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(BigDecimal accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + @Override + public String toString() { + return "AchievementDataVO{" + + "boundCustomers=" + boundCustomers + + ", invitedDistributors=" + invitedDistributors + + ", orderCount=" + orderCount + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionAuditingVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionAuditingVO.java new file mode 100644 index 0000000..bae04dc --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionAuditingVO.java @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员申请信息VO + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public class DistributionAuditingVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销员申请表") + private Long auditingId; + + @Schema(description = "邀请人id") + private Long parentDistributionUserId; + + @Schema(description = "申请人id") + private Long distributionUserId; + + @Schema(description = "申请时间") + private Date auditingTime; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "不通过原因(0 资料不足 1条件不足 2不招人 -1其他)") + private Integer reason; + + @Schema(description = "审核状态:0 未审核 1已通过 -1未通过") + private Integer state; + + @Schema(description = "操作人(0代表自动审核)") + private Long modifier; + + @Schema(description = "分销员手机号") + private String userMobile; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "邀请人手机号") + private String inviteeMobile; + + @Schema(description = "邀请人") + private String invitee; + + @Schema(description = "积累消费金额") + private Double sumOfConsumption; + + @Schema(description = "积累消费笔数") + private Integer expenseNumber; + + @Schema(description = "操作人") + private String modifierName; + + @Schema(description = "身份证号码") + private String identityCardNumber; + + @Schema(description = "身份证正面") + private String identityCardPicFront; + + @Schema(description = "身份证背面") + private String identityCardPicBack; + + @Schema(description = "手持身份证") + private String identityCardPicHold; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "真实姓名") + private String realName; + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Long getAuditingId() { + return auditingId; + } + + public void setAuditingId(Long auditingId) { + this.auditingId = auditingId; + } + + public Long getParentDistributionUserId() { + return parentDistributionUserId; + } + + public void setParentDistributionUserId(Long parentDistributionUserId) { + this.parentDistributionUserId = parentDistributionUserId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Date getAuditingTime() { + return auditingTime; + } + + public void setAuditingTime(Date auditingTime) { + this.auditingTime = auditingTime; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Integer getReason() { + return reason; + } + + public void setReason(Integer reason) { + this.reason = reason; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getInviteeMobile() { + return inviteeMobile; + } + + public void setInviteeMobile(String inviteeMobile) { + this.inviteeMobile = inviteeMobile; + } + + public String getInvitee() { + return invitee; + } + + public void setInvitee(String invitee) { + this.invitee = invitee; + } + + public Double getSumOfConsumption() { + return sumOfConsumption; + } + + public void setSumOfConsumption(Double sumOfConsumption) { + this.sumOfConsumption = sumOfConsumption; + } + + public Integer getExpenseNumber() { + return expenseNumber; + } + + public void setExpenseNumber(Integer expenseNumber) { + this.expenseNumber = expenseNumber; + } + + public String getModifierName() { + return modifierName; + } + + public void setModifierName(String modifierName) { + this.modifierName = modifierName; + } + + public String getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(String identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public String getIdentityCardPicFront() { + return identityCardPicFront; + } + + public void setIdentityCardPicFront(String identityCardPicFront) { + this.identityCardPicFront = identityCardPicFront; + } + + public String getIdentityCardPicBack() { + return identityCardPicBack; + } + + public void setIdentityCardPicBack(String identityCardPicBack) { + this.identityCardPicBack = identityCardPicBack; + } + + public String getIdentityCardPicHold() { + return identityCardPicHold; + } + + public void setIdentityCardPicHold(String identityCardPicHold) { + this.identityCardPicHold = identityCardPicHold; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + @Override + public String toString() { + return "DistributionAuditingVO{" + + "auditingId=" + auditingId + + ", parentDistributionUserId=" + parentDistributionUserId + + ", distributionUserId=" + distributionUserId + + ", auditingTime=" + auditingTime + + ", remarks='" + remarks + '\'' + + ", reason=" + reason + + ", state=" + state + + ", modifier=" + modifier + + ", userMobile='" + userMobile + '\'' + + ", nickName='" + nickName + '\'' + + ", inviteeMobile='" + inviteeMobile + '\'' + + ", invitee='" + invitee + '\'' + + ", sumOfConsumption=" + sumOfConsumption + + ", expenseNumber=" + expenseNumber + + ", modifierName='" + modifierName + '\'' + + ", identityCardNumber='" + identityCardNumber + '\'' + + ", identityCardPicFront='" + identityCardPicFront + '\'' + + ", identityCardPicBack='" + identityCardPicBack + '\'' + + ", identityCardPicHold='" + identityCardPicHold + '\'' + + ", userId=" + userId + + ", realName='" + realName + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionMsgVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionMsgVO.java new file mode 100644 index 0000000..c818f94 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionMsgVO.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销公共信息VO + * + * @author cl + * @date 2021-08-09 14:14:05 + */ +public class DistributionMsgVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "公告表") + private Long msgId; + + @Schema(description = "公告标题") + private String msgTitle; + + @Schema(description = "指定上线时间") + private Date startTime; + + @Schema(description = "指定下线时间") + private Date endTime; + + @Schema(description = "是否置顶(0 不置顶 1 置顶)") + private Integer isTop; + + @Schema(description = "公告内容") + private String content; + + public Long getMsgId() { + return msgId; + } + + public void setMsgId(Long msgId) { + this.msgId = msgId; + } + + public String getMsgTitle() { + return msgTitle; + } + + public void setMsgTitle(String msgTitle) { + this.msgTitle = msgTitle; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "DistributionMsgVO{" + + "msgId=" + msgId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",msgTitle=" + msgTitle + + ",startTime=" + startTime + + ",endTime=" + endTime + + ",isTop=" + isTop + + ",content=" + content + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionOrderVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionOrderVO.java new file mode 100644 index 0000000..2963c76 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionOrderVO.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 分销员推广订单对象 + * + * @author cl + * @date 2021-08-16 16:05:56 + */ +public class DistributionOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "佣金数额") + private BigDecimal incomeAmount; + + @Schema(description = "佣金状态(0待支付,1用户未收货待结算,2收货已结算 -1订单失效)") + private Integer state; + + @Schema(description = "建单时间") + private Date createTime; + + @Schema(description = "关联订单项order_item_id") + private Long orderItemId; + + @Schema(description = "商品图片") + private String pic; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品id") + private Long spuId; + + public BigDecimal getIncomeAmount() { + return incomeAmount; + } + + public void setIncomeAmount(BigDecimal incomeAmount) { + this.incomeAmount = incomeAmount; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "DistributionOrderVO{" + + "incomeAmount=" + incomeAmount + + ", state=" + state + + ", createTime=" + createTime + + ", orderItemId=" + orderItemId + + ", pic='" + pic + '\'' + + ", spuName='" + spuName + '\'' + + ", spuId='" + spuId + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionSpuBindVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionSpuBindVO.java new file mode 100644 index 0000000..773b25c --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionSpuBindVO.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户商品绑定信息VO + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionSpuBindVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户商品绑定表") + private Long id; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "绑定时间") + private Date bindTime; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "状态(0失效 1生效) 分销员被封禁 该状态失效") + private Integer state; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + @Override + public String toString() { + return "DistributionSpuBindVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", id=" + id + + ", distributionUserId=" + distributionUserId + + ", userId=" + userId + + ", bindTime=" + bindTime + + ", spuId=" + spuId + + ", state=" + state + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBindInfoVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBindInfoVO.java new file mode 100644 index 0000000..20ecc7f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserBindInfoVO.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author cl + * @date 2021-08-14 14:38:23 + */ +public class DistributionUserBindInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "-1失效 0 预绑定 1生效") + private Integer state; + + @Schema(description = "1 管理员更改 2.封禁") + private Integer invalidReason; + + @Schema(description = "变动时间") + private Date updateTime; + + @Schema(description = "绑定时间") + private Date bindTime; + + @Schema(description = "失效时间") + private Date invalidTime; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "用户手机号") + private String userMobile; + + @Schema(description = "用户头像") + private String pic; + + public Integer getState() { + return state; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getInvalidReason() { + return invalidReason; + } + + public void setInvalidReason(Integer invalidReason) { + this.invalidReason = invalidReason; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Date getInvalidTime() { + return invalidTime; + } + + public void setInvalidTime(Date invalidTime) { + this.invalidTime = invalidTime; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + @Override + public String toString() { + return "DistributionUserBindInfoVO{" + + "userId=" + userId + + ", state=" + state + + ", invalidReason=" + invalidReason + + ", updateTime=" + updateTime + + ", bindTime=" + bindTime + + ", invalidTime=" + invalidTime + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", pic='" + pic + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserIncomeOrderVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserIncomeOrderVO.java new file mode 100644 index 0000000..541418a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserIncomeOrderVO.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销员推广订单对象 + * + * @author Citrus + * @date 2021/8/19 15:27 + */ +public class DistributionUserIncomeOrderVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "收入金额") + private Double incomeAmount; + + @Schema(description = "实际支付") + private Long actualTotal; + + @Schema(description = "订单状态(0:待支付 1:待结算 2:已结算 -1:订单失效)") + private Integer state; + + @Schema(description = "订单项id") + private Long orderItemId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品价格") + private Long price; + + @Schema(description = "商品图片") + private String pic; + + @Schema(description = "商品数量") + private Integer spuCount; + + @Schema(description = "规格名称") + private String skuName; + + @Schema(description = "失效原因(0正常,1佣金为0订单失效,2订单项退款)") + private Integer reson; + + public Integer getReson() { + return reson; + } + + public void setReson(Integer reson) { + this.reson = reson; + } + + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Double getIncomeAmount() { + return incomeAmount; + } + + public void setIncomeAmount(Double incomeAmount) { + this.incomeAmount = incomeAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getSpuCount() { + return spuCount; + } + + public void setSpuCount(Integer spuCount) { + this.spuCount = spuCount; + } + + @Override + public String toString() { + return "DistributionUserIncomeOrderVO{" + + "orderId=" + orderId + + ", incomeAmount=" + incomeAmount + + ", actualTotal=" + actualTotal + + ", state=" + state + + ", orderItemId=" + orderItemId + + ", spuName='" + spuName + '\'' + + ", price=" + price + + ", pic='" + pic + '\'' + + ", spuCount=" + spuCount + + ", skuName='" + skuName + '\'' + + ", reson=" + reson + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserInfoVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserInfoVO.java new file mode 100644 index 0000000..82466c3 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserInfoVO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author cl + * @date 2021-08-16 15:35:23 + */ +public class DistributionUserInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "分销员昵称") + private String nickName; + + @Schema(description = "分销员手机号") + private String userMobile; + + @Schema(description = "头像") + private String pic; + + @Schema(description = "分销员状态 (-1永久封禁 0 待审核 1 正常 2 暂时封禁 3审核失败)") + private Integer state; + + @Schema(description = "推广状态(0下线 1上线)") + private Integer recruitState; + + @Schema(description = "贡献收益") + private Long money; + + @Schema(description = "加入时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date bindTime; + + @Schema(description = "成交订单数") + private Integer orderNumber; + + public Integer getOrderNumber() { + return orderNumber; + } + + public void setOrderNumber(Integer orderNumber) { + this.orderNumber = orderNumber; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Long getMoney() { + return money; + } + + public void setMoney(Long money) { + this.money = money; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getRecruitState() { + return recruitState; + } + + public void setRecruitState(Integer recruitState) { + this.recruitState = recruitState; + } + + @Override + public String toString() { + return "DistributionUserInfoVO{" + + "distributionUserId=" + distributionUserId + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", pic='" + pic + '\'' + + ", state=" + state + + ", recruitState=" + recruitState + + ", money=" + money + + ", bindTime=" + bindTime + + ", orderNumber=" + orderNumber + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserVO.java new file mode 100644 index 0000000..f818f29 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserVO.java @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 分销员信息VO + * + * @author cl + * @date 2021-08-09 14:14:07 + */ +public class DistributionUserVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "促销员表") + private Long distributionUserId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "上级id") + private Long parentId; + + @Schema(description = "上级促销员ids (如:1,2,3)") + private String parentIds; + + @Schema(description = "目前促销员所处层级(0顶级)") + private Integer grade; + + @Schema(description = "绑定时间") + private Date bindTime; + /** + * DistributionUserStateEnum + */ + @Schema(description = "状态(-1永久封禁 0待审核状态 1正常 2暂时封禁 3 审核未通过)") + private Integer state; + + @Schema(description = "昵称") + private String nickName; + + @Schema(description = "头像路径") + private String pic; + + @Schema(description = "分销员手机号") + private String userMobile; + + @Schema(description = "真实姓名") + private String realName; + + @Schema(description = "身份证号码") + private String identityCardNumber; + + @Schema(description = "身份证正面") + private String identityCardPicFront; + + @Schema(description = "身份证背面") + private String identityCardPicBack; + + @Schema(description = "手持身份证") + private String identityCardPicHold; + + @Schema(description = "改变成永久封禁或者暂时封禁时的状态记录") + private Integer stateRecord; + + @Schema(description = "邀请人手机号") + private String inviteeMobile; + + @Schema(description = "邀请人名称") + private String invitee; + + @Schema(description = "累计客户") + private Integer boundCustomers; + + @Schema(description = "累计邀请") + private Integer invitedVeeker; + + @Schema(description = "累计收益") + private Double accumulateAmount; + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getParentIds() { + return parentIds; + } + + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + public Integer getGrade() { + return grade; + } + + public void setGrade(Integer grade) { + this.grade = grade; + } + + public Date getBindTime() { + return bindTime; + } + + public void setBindTime(Date bindTime) { + this.bindTime = bindTime; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getIdentityCardNumber() { + return identityCardNumber; + } + + public void setIdentityCardNumber(String identityCardNumber) { + this.identityCardNumber = identityCardNumber; + } + + public String getIdentityCardPicFront() { + return identityCardPicFront; + } + + public void setIdentityCardPicFront(String identityCardPicFront) { + this.identityCardPicFront = identityCardPicFront; + } + + public String getIdentityCardPicBack() { + return identityCardPicBack; + } + + public void setIdentityCardPicBack(String identityCardPicBack) { + this.identityCardPicBack = identityCardPicBack; + } + + public String getIdentityCardPicHold() { + return identityCardPicHold; + } + + public void setIdentityCardPicHold(String identityCardPicHold) { + this.identityCardPicHold = identityCardPicHold; + } + + public Integer getStateRecord() { + return stateRecord; + } + + public void setStateRecord(Integer stateRecord) { + this.stateRecord = stateRecord; + } + + public String getInviteeMobile() { + return inviteeMobile; + } + + public void setInviteeMobile(String inviteeMobile) { + this.inviteeMobile = inviteeMobile; + } + + public String getInvitee() { + return invitee; + } + + public void setInvitee(String invitee) { + this.invitee = invitee; + } + + public Integer getBoundCustomers() { + return boundCustomers; + } + + public void setBoundCustomers(Integer boundCustomers) { + this.boundCustomers = boundCustomers; + } + + public Integer getInvitedVeeker() { + return invitedVeeker; + } + + public void setInvitedVeeker(Integer invitedVeeker) { + this.invitedVeeker = invitedVeeker; + } + + public Double getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Double accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + @Override + public String toString() { + return "DistributionUserVO{" + + "distributionUserId=" + distributionUserId + + ", userId=" + userId + + ", parentId=" + parentId + + ", parentIds='" + parentIds + '\'' + + ", grade=" + grade + + ", bindTime=" + bindTime + + ", state=" + state + + ", nickName='" + nickName + '\'' + + ", pic='" + pic + '\'' + + ", userMobile='" + userMobile + '\'' + + ", realName='" + realName + '\'' + + ", identityCardNumber='" + identityCardNumber + '\'' + + ", identityCardPicFront='" + identityCardPicFront + '\'' + + ", identityCardPicBack='" + identityCardPicBack + '\'' + + ", identityCardPicHold='" + identityCardPicHold + '\'' + + ", stateRecord=" + stateRecord + + ", inviteeMobile='" + inviteeMobile + '\'' + + ", invitee='" + invitee + '\'' + + ", boundCustomers=" + boundCustomers + + ", invitedVeeker=" + invitedVeeker + + ", accumulateAmount=" + accumulateAmount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletBillVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletBillVO.java new file mode 100644 index 0000000..d3abf86 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletBillVO.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销员钱包流水记录VO + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionUserWalletBillVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "钱包流水记录") + private Long id; + + @Schema(description = "钱包id") + private Long walletId; + + @Schema(description = "待结算金额变更数额") + private Long unsettledAmount; + + @Schema(description = "可提现金额变更数额") + private Long settledAmount; + + @Schema(description = "失效金额变更数额") + private Long invalidAmount; + + @Schema(description = "积累收益变更数额") + private Long accumulateAmount; + + @Schema(description = "英文备注") + private String remarksEn; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "变更后待结算金额") + private Long unsettledAmountAfter; + + @Schema(description = "变更后可提现金额") + private Long settledAmountAfter; + + @Schema(description = "变更后失效金额") + private Long invalidAmountAfter; + + @Schema(description = "变更后积累收益") + private Long accumulateAmountAfter; + + @Schema(description = "类型(0 系统修改 1人工修改)") + private Integer type; + + @Schema(description = "操作人id") + private Long modifier; + + @Schema(description = "分销员信息") + private DistributionUserVO distributionUserVO; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(Long invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public Long getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Long accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + public String getRemarksEn() { + return remarksEn; + } + + public void setRemarksEn(String remarksEn) { + this.remarksEn = remarksEn; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public Long getUnsettledAmountAfter() { + return unsettledAmountAfter; + } + + public void setUnsettledAmountAfter(Long unsettledAmountAfter) { + this.unsettledAmountAfter = unsettledAmountAfter; + } + + public Long getSettledAmountAfter() { + return settledAmountAfter; + } + + public void setSettledAmountAfter(Long settledAmountAfter) { + this.settledAmountAfter = settledAmountAfter; + } + + public Long getInvalidAmountAfter() { + return invalidAmountAfter; + } + + public void setInvalidAmountAfter(Long invalidAmountAfter) { + this.invalidAmountAfter = invalidAmountAfter; + } + + public Long getAccumulateAmountAfter() { + return accumulateAmountAfter; + } + + public void setAccumulateAmountAfter(Long accumulateAmountAfter) { + this.accumulateAmountAfter = accumulateAmountAfter; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getModifier() { + return modifier; + } + + public void setModifier(Long modifier) { + this.modifier = modifier; + } + + public DistributionUserVO getDistributionUserVO() { + return distributionUserVO; + } + + public void setDistributionUserVO(DistributionUserVO distributionUserVO) { + this.distributionUserVO = distributionUserVO; + } + + @Override + public String toString() { + return "DistributionUserWalletBillVO{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",walletId=" + walletId + + ",unsettledAmount=" + unsettledAmount + + ",settledAmount=" + settledAmount + + ",invalidAmount=" + invalidAmount + + ",accumulateAmount=" + accumulateAmount + + ",remarksEn=" + remarksEn + + ",remarks=" + remarks + + ",unsettledAmountAfter=" + unsettledAmountAfter + + ",settledAmountAfter=" + settledAmountAfter + + ",invalidAmountAfter=" + invalidAmountAfter + + ",accumulateAmountAfter=" + accumulateAmountAfter + + ",type=" + type + + ",modifier=" + modifier + + ",distributionUserVO=" + distributionUserVO + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletVO.java new file mode 100644 index 0000000..489cdc4 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/DistributionUserWalletVO.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 分销员钱包信息VO + * + * @author cl + * @date 2021-08-09 14:14:10 + */ +public class DistributionUserWalletVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分销员钱包id") + private Long walletId; + + @Schema(description = "分销员id") + private Long distributionUserId; + + @Schema(description = "待结算金额") + private Long unsettledAmount; + + @Schema(description = "可提现金额") + private Long settledAmount; + + @Schema(description = "已失效金额") + private Long invalidAmount; + + @Schema(description = "积累收益") + private Long accumulateAmount; + + @Schema(description = "乐观锁") + private Integer version; + + @Schema(description = "钱包状态(-1 已冻结 0未生效(分销审核未通过) 1正常)") + private Integer state; + + @Schema(description = "分销员信息") + private DistributionUserVO distributionUserVO; + + public Long getWalletId() { + return walletId; + } + + public void setWalletId(Long walletId) { + this.walletId = walletId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Long getUnsettledAmount() { + return unsettledAmount; + } + + public void setUnsettledAmount(Long unsettledAmount) { + this.unsettledAmount = unsettledAmount; + } + + public Long getSettledAmount() { + return settledAmount; + } + + public void setSettledAmount(Long settledAmount) { + this.settledAmount = settledAmount; + } + + public Long getInvalidAmount() { + return invalidAmount; + } + + public void setInvalidAmount(Long invalidAmount) { + this.invalidAmount = invalidAmount; + } + + public Long getAccumulateAmount() { + return accumulateAmount; + } + + public void setAccumulateAmount(Long accumulateAmount) { + this.accumulateAmount = accumulateAmount; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public DistributionUserVO getDistributionUserVO() { + return distributionUserVO; + } + + public void setDistributionUserVO(DistributionUserVO distributionUserVO) { + this.distributionUserVO = distributionUserVO; + } + + @Override + public String toString() { + return "DistributionUserWalletVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", walletId=" + walletId + + ", distributionUserId=" + distributionUserId + + ", unsettledAmount=" + unsettledAmount + + ", settledAmount=" + settledAmount + + ", invalidAmount=" + invalidAmount + + ", accumulateAmount=" + accumulateAmount + + ", version=" + version + + ", state=" + state + + ", distributionUserVO=" + distributionUserVO + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/EnterprisePayVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/EnterprisePayVO.java new file mode 100644 index 0000000..2c4163f --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/EnterprisePayVO.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家转账VO + * + * @author FrozenWatermelon + * @date 2023-02-22 15:58:50 + */ +public class EnterprisePayVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商家转账ID") + private Long entPayId; + + @Schema(description = "状态(1:申请中 2:已完成 -1:失败)") + private Integer status; + + @Schema(description = "用户id") + private String userId; + + @Schema(description = "用户openid") + private String openId; + + @Schema(description = "商家转账订单号") + private Long entPayOrderNo; + + @Schema(description = "金额") + private Double amount; + + @Schema(description = "支付类型(1:商户提现)") + private Integer type; + + @Schema(description = "业务id,如商户提现即商户提现记录ID") + private Long bizId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "转账批次单号") + private String outBatchNo; + + public Long getEntPayId() { + return entPayId; + } + + public void setEntPayId(Long entPayId) { + this.entPayId = entPayId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public Long getEntPayOrderNo() { + return entPayOrderNo; + } + + public void setEntPayOrderNo(Long entPayOrderNo) { + this.entPayOrderNo = entPayOrderNo; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String getOutBatchNo() { + return outBatchNo; + } + + public void setOutBatchNo(String outBatchNo) { + this.outBatchNo = outBatchNo; + } + + @Override + public String toString() { + return "EnterprisePayVO{" + + "entPayId=" + entPayId + + ",status=" + status + + ",userId=" + userId + + ",openId=" + openId + + ",entPayOrderNo=" + entPayOrderNo + + ",amount=" + amount + + ",type=" + type + + ",bizId=" + bizId + + ",version=" + version + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",outBatchNo=" + outBatchNo + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/StatisticsDisUserIncomeVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/StatisticsDisUserIncomeVO.java new file mode 100644 index 0000000..a50eb6c --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/distribution/vo/StatisticsDisUserIncomeVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.distribution.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Citrus + * @date 2021/8/19 15:09 + */ +public class StatisticsDisUserIncomeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "今日收益") + private Double todayAmount; + + @Schema(description = "本月收益") + private Double monthAmount; + + public Double getTodayAmount() { + return todayAmount; + } + + public void setTodayAmount(Double todayAmount) { + this.todayAmount = todayAmount; + } + + public Double getMonthAmount() { + return monthAmount; + } + + public void setMonthAmount(Double monthAmount) { + this.monthAmount = monthAmount; + } + + @Override + public String toString() { + return "StatisticsDisUserIncomeVO{" + + "todayAmount=" + todayAmount + + ", monthAmount=" + monthAmount + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/feign/MarketingFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/feign/MarketingFeignController.java new file mode 100644 index 0000000..1f089ab --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/feign/MarketingFeignController.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.feign; + +import com.tmerclub.cloud.api.feign.MarketingFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.CouponOrderVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemDiscountVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.ShopCartVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.coupon.service.CouponService; +import com.tmerclub.cloud.coupon.util.ChooseCouponHelper; +import com.tmerclub.cloud.discount.manager.DiscountConfirmOrderManager; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + */ +@DubboService +public class MarketingFeignController implements MarketingFeignClient { + + public static final Logger log = LoggerFactory.getLogger(MarketingFeignController.class); + + @Autowired + private CouponService couponService; + @Autowired + private DiscountConfirmOrderManager discountConfirmOrderManager; + + + @Override + public List calculateMarketingAndMakeUpShopCart(List shopCarts, List couponIds, Integer userChangeCoupon) { + // 计算优惠券和套餐活动 + shopCarts = discountConfirmOrderManager.calculateDiscountAndMakeUpShopCartAndAmount(shopCarts); + // 选择商家优惠券 + chooseShopCoupon(shopCarts, couponIds, userChangeCoupon); + return shopCarts; + } + + @Override + public ServerResponseEntity checkComboActivity(List shopCartItemDiscountVOList) { + return discountConfirmOrderManager.checkComboActivity(shopCartItemDiscountVOList); + } + + + /** + * 选择商家优惠券 + * @param shopCarts 购物车信息 + * @param couponIds 优惠券id数组 + * @param userChangeCoupon 用户是否改变了优惠券的选择,如果用户改变了优惠券的选择,则完全根据传入参数进行优惠券的选择 + */ + private void chooseShopCoupon(List shopCarts, List couponIds, Integer userChangeCoupon) { + // 优惠券 + Long userId = AuthUserContext.get().getUserId(); + + for (ShopCartVO shopCart : shopCarts) { + List shopCartItemDiscounts = shopCart.getShopCartItemDiscounts(); + List shopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + shopCartItems.addAll(shopCartItemDiscount.getShopCartItems()); + } + // 因为经过满减,实际金额的顺序已经变了 + shopCartItems = shopCartItems.stream().sorted(Comparator.comparingDouble(ShopCartItemVO::getActualTotal)).collect(Collectors.toList()); + + // 获取用户有效的优惠券 + List shopCoupons = couponService.getCouponListByUserIdAndShopId(userId, shopCart.getShopId()); + + // 用户选中的所有优惠券 + + ChooseCouponHelper chooseCouponHelper = new ChooseCouponHelper(shopCartItems, shopCoupons, couponIds, userChangeCoupon).invoke(); + + if (chooseCouponHelper.getChooseCoupon() != null) { + log.info("用户选择的优惠券:{}", chooseCouponHelper.getChooseCoupon()); + long couponReduce = chooseCouponHelper.getCouponReduce(); + // 最后组装订单信息 + shopCart.setCouponReduce(couponReduce); + shopCart.setActualTotal(shopCart.getActualTotal() - shopCart.getCouponReduce()); + shopCart.setShopReduce(shopCart.getShopReduce() + shopCart.getCouponReduce()); + } + + shopCart.setCoupons(shopCoupons); + } + } + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/LiveRoomStatusType.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/LiveRoomStatusType.java new file mode 100644 index 0000000..caee4ef --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/LiveRoomStatusType.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.constant; + +import java.util.Objects; + +/** + * 直播间状态 0.未开始 1.直播中 2.已结束 3.暂停中 -1.违规下架 + * @author lhd + */ +public enum LiveRoomStatusType { + + /** + * 违规下架 + */ + OFFLINE(-1), + + /** + * 未开始 + */ + NO_START(0), + + /** + * 直播中 + */ + LIVING(1), + + /** + * 已结束 + */ + FINISHED(2), + + /** + * 暂停中 + */ + STOP(3), + ; + + + private final Integer num; + + public Integer value() { + return num; + } + + LiveRoomStatusType(Integer num){ + this.num = num; + } + + public static LiveRoomStatusType instance(Integer value) { + LiveRoomStatusType[] enums = values(); + for (LiveRoomStatusType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static Boolean isNeedFinish(Integer value) { + return Objects.equals(value, LiveRoomStatusType.STOP.value()) || Objects.equals(value, LiveRoomStatusType.LIVING.value()) || Objects.equals(value, LiveRoomStatusType.NO_START.value()); + } + + public static Boolean isNeedOpen(Integer value) { + return Objects.equals(value, LiveRoomStatusType.STOP.value()) || Objects.equals(value, LiveRoomStatusType.NO_START.value()); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/MsgCode.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/MsgCode.java new file mode 100644 index 0000000..7022993 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/MsgCode.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.constant; + +/** + * @author TRACK + */ +public class MsgCode { + + /** + * 心跳 + */ + public static final int HEART_BEAT = 0; + + /** + * 无法获取用户信息 + */ + public static final int CAN_NOT_FIND_USER_INFO = 10; + + /** + * 账户已在别处登录,请刷新 + */ + public static final int LOGIN_IN_OTHER_PLACE = 11; + + /** + * 无法获取直播间信息 + */ + public static final int CAN_NOT_FIND_ROOM_INFO = 12; + + /** + * 内容格式有误 + */ + public static final int CONTENT_FORMAT_ERROR = 13; + + /** + * 参数有误 + */ + public static final int PARAM_ERROR = 14; + + /** + * 刷新商品 + */ + public static final int REFRUSH_PROD = 15; + + /** + * 上下线提醒 + */ + public static final int ONLINE_OR_OFFLINE = 16; + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/MsgType.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/MsgType.java new file mode 100644 index 0000000..a5742a0 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/constant/MsgType.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.constant; + +/** + * 消息类型 0.心跳 1.弹幕消息 2.商品讲解状态变更 3.直播间状态变更 4.直播观看人数变更 + * @author TRACK + */ +public class MsgType { + + /** + * 心跳 + */ + public static final int HEART_BEAT = 0; + + /** + * 弹幕消息 + */ + public static final int BULLET_SCREEN = 1; + + /** + * 商品讲解状态变更 + */ + public static final int EXPLAIN_STATUS = 2; + + /** + * 直播间状态变更 + */ + public static final int LIVE_ROOM_STATUS = 3; + + /** + * 直播观看人数变更 + */ + public static final int LIVE_USER_COUNT = 4; + +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/app/LiveRoomController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/app/LiveRoomController.java new file mode 100644 index 0000000..cf1b07d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/app/LiveRoomController.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.controller.app; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.bean.AliLive; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.live.constant.LiveRoomStatusType; +import com.tmerclub.cloud.live.constant.PlayBackType; +import com.tmerclub.cloud.live.dto.LiveRoomDTO; +import com.tmerclub.cloud.live.service.LiveRoomProdService; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.tmerclub.cloud.live.util.AliLiveUtil; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +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 java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 直播间 + * @author TRACK + */ +@RestController("appLiveRoomController") +@RequestMapping("/ua/live_room") +@Tag(name = "用户直播间") +public class LiveRoomController { + + @Autowired + private LiveRoomService liveRoomService; + @Autowired + private LiveRoomProdService liveRoomProdService; + @Autowired + private FeignShopConfig feignShopConfig; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + private static final int NON_SORT = 25; + + @GetMapping("/page") + @Operation(summary = "获取直播间列表", description = "分页获取直播间列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, LiveRoomDTO liveRoom) { + // 如果type为空,则为搜索直播信息 + if (Objects.isNull(liveRoom.getSearchType()) && StrUtil.isBlank(liveRoom.getName())) { + liveRoom.setSearchType(1); + liveRoom.setName(""); + } + PageVO liveRoomPage = liveRoomService.pageRoomAndDetail(pageDTO, liveRoom); + return ServerResponseEntity.success(liveRoomPage); + } + + @GetMapping("/get_live_room_info") + @Operation(summary = "获取直播间信息", description = "根据roomId获取直播间") + @Parameters({ + @Parameter(name = "roomId", description = "直播间id"), + @Parameter(name = "userType", description = "用户类型 0.游客 1.用户") + }) + public ServerResponseEntity getByRoomId(@RequestParam(value = "roomId") Long roomId, + @RequestParam(value = "userType") Integer userType) { + LiveRoomVO livingRoomInfo = liveRoomService.getLivingRoomInfo(null, roomId); + if (Objects.isNull(livingRoomInfo)) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + ServerResponseEntity shopResponse = shopDetailFeignClient.getShopByShopId(livingRoomInfo.getShopId()); + if (!shopResponse.isSuccess()) { + throw new LuckException(shopResponse.getMsg()); + } + EsShopDetailBO shopDetailBO = shopResponse.getData(); + livingRoomInfo.setShopName(shopDetailBO.getShopName()); + livingRoomInfo.setShopLogo(shopDetailBO.getShopLogo()); + if (Objects.equals(userType, 0)) { + livingRoomInfo.setUuid(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_LIVE_ROOM_USER)); + } + return ServerResponseEntity.success(livingRoomInfo); + } + + @GetMapping("/page_living_room_prod") + @Operation(summary = "获取直播间商品列表", description = "分页获取直播间商品列表") + public ServerResponseEntity> pageLivingRoomProd(@Valid PageDTO pageDTO, Long roomId) { + PageVO spuPageVO = new PageVO<>(); + List liveRoomProdList = liveRoomProdService.listLiveRoomProd(roomId); + if (CollUtil.isEmpty(liveRoomProdList)) { + spuPageVO.setList(new ArrayList<>(0)); + spuPageVO.setTotal(0L); + spuPageVO.setPages(0); + return ServerResponseEntity.success(spuPageVO); + } + + List spuIds = liveRoomProdList.stream().map(LiveRoomProdVO::getSpuId).toList(); + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setPageNum(pageDTO.getPageNum()); + productSearchDTO.setPageSize(pageDTO.getPageSize()); + productSearchDTO.setSpuIds(spuIds); + productSearchDTO.setSpuStatus(SpuStatus.PUT_SHELF.value()); + productSearchDTO.setSort(NON_SORT); + ServerResponseEntity> spuResponse = searchSpuFeignClient.search(productSearchDTO); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + EsPageVO spuData = spuResponse.getData(); + List productSearchList = spuData.getList(); + if (CollUtil.isEmpty(productSearchList) || CollUtil.isEmpty(productSearchList.get(0).getSpus())) { + spuPageVO.setList(new ArrayList<>(0)); + spuPageVO.setTotal(0L); + spuPageVO.setPages(0); + return ServerResponseEntity.success(spuPageVO); + } + + List spuList = productSearchList.get(0).getSpus(); + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, spu -> spu)); + Map liveRoomProdMap = liveRoomProdList.stream().collect(Collectors.toMap(LiveRoomProdVO::getSpuId, spu -> spu)); + List resList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long spuId : spuMap.keySet()) { + SpuSearchVO spuSearchVO = spuMap.get(spuId); + if (Objects.isNull(spuSearchVO)) { + continue; + } + LiveRoomProdVO liveRoomProdVO = liveRoomProdMap.get(spuId); + if (Objects.isNull(liveRoomProdVO)) { + continue; + } + liveRoomProdVO.setSpuSearchVO(spuSearchVO); + resList.add(liveRoomProdVO); + } + spuPageVO.setList(resList); + spuPageVO.setTotal(spuData.getTotal()); + spuPageVO.setPages(spuData.getPages()); + return ServerResponseEntity.success(spuPageVO); + } + + @GetMapping("/get_spu_live_room_info") + @Operation(summary = "根据商品id获取当前直播间", description = "根据商品id获取当前直播间") + public ServerResponseEntity getSpuLiveRoomInfo(@RequestParam(value = "spuId") Long spuId) { + LiveRoomProdVO liveRoomProdVO = liveRoomProdService.getLivingRoomBySpuId(spuId); + return ServerResponseEntity.success(liveRoomProdVO); + } + + @GetMapping("/get_pull_url") + @Operation(summary = "获取播流地址", description = "获取播流地址") + @Parameters({ + @Parameter(name = "roomId", description = "直播间id"), + @Parameter(name = "playBackType", description = "播放类型 1.rtmp 2.flv 3.m3u8") + }) + public ServerResponseEntity getPullUrl(@RequestParam Long roomId, @RequestParam Integer playBackType) { + AliLive aliLive = feignShopConfig.getAliLive(); + if (Objects.isNull(aliLive) || StrUtil.isBlank(aliLive.getAppName())) { + throw new LuckException("无法获取到直播配置"); + } + LiveRoomVO livingRoom = liveRoomService.getLivingRoomInfo(null, roomId); + if (Objects.isNull(livingRoom)) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + if (Objects.equals(livingRoom.getLiveStatus(), LiveRoomStatusType.FINISHED.value())) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + if (Objects.isNull(PlayBackType.instance(playBackType))) { + throw new LuckException("播放类型错误"); + } + // 不超过256字符 支持数字、大小写字母、短划线(-)、下划线(_)、等号(=) + // {appName}-{roomId}-{shopId}-{userId} + String streamName = StrUtil.format("{}-{}-{}-{}", aliLive.getAppName(), livingRoom.getRoomId(), livingRoom.getShopId(), livingRoom.getUserId()); + String pullUrl = AliLiveUtil.getPullUrl(streamName, playBackType, livingRoom.getEndTime(), aliLive); + return ServerResponseEntity.success(pullUrl); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/app/MyLiveRoomController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/app/MyLiveRoomController.java new file mode 100644 index 0000000..53e1b6d --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/app/MyLiveRoomController.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.controller.app; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.AliLive; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.tmerclub.cloud.live.util.AliLiveUtil; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 TRAKC + */ +@RestController("MyLiveRoomController") +@RequestMapping("/live/liveRoom") +@Tag(name = "我的直播接口") +public class MyLiveRoomController { + + @Autowired + private LiveRoomService liveRoomService; + @Autowired + private FeignShopConfig feignShopConfig; + + @GetMapping("/get_user_living_room") + @Operation(summary = "主播获取当前正在开播的直播间信息") + public ServerResponseEntity getUserLivingRoom() { + Long userId = AuthUserContext.get().getUserId(); + LiveRoomVO livingRoom = getLivingRoom(userId); + return ServerResponseEntity.success(livingRoom); + } + + private LiveRoomVO getLivingRoom(Long userId) { + LiveRoomVO livingRoom = liveRoomService.getByUserId(userId); + if (Objects.isNull(livingRoom)) { + throw new LuckException("当前未有直播权限"); + } + long currentTimeMillis = System.currentTimeMillis(); + if (livingRoom.getStartTime().getTime() > currentTimeMillis) { + throw new LuckException("未到直播开始时间"); + } + return livingRoom; + } + + @GetMapping("/get_push_url") + @Operation(summary = "获取推流地址", description = "获取推流地址") + public ServerResponseEntity getPushUrl() { + AliLive aliLive = feignShopConfig.getAliLive(); + if (Objects.isNull(aliLive) || StrUtil.isBlank(aliLive.getAppName())) { + throw new LuckException("无法获取到直播配置"); + } + Long userId = AuthUserContext.get().getUserId(); + LiveRoomVO livingRoom = getLivingRoom(userId); + // 不超过256字符 支持数字、大小写字母、短划线(-)、下划线(_)、等号(=) + // {appName}-{roomId}-{shopId}-{userId} + String streamName = StrUtil.format("{}-{}-{}-{}", aliLive.getAppName(), livingRoom.getRoomId(), livingRoom.getShopId(), livingRoom.getUserId()); + String pushUrl = AliLiveUtil.getPushUrl(streamName, livingRoom.getEndTime(), aliLive); + return ServerResponseEntity.success(pushUrl); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/multishop/LiveRoomController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/multishop/LiveRoomController.java new file mode 100644 index 0000000..10fe8ce --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/multishop/LiveRoomController.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.controller.multishop; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.live.dto.LiveRoomDTO; +import com.tmerclub.cloud.live.service.LiveRoomProdService; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 直播间 + * @author TRACK + */ +@RestController("multishopLiveRoomController") +@RequestMapping("/m/live_room") +@Tag(name = "商家直播间") +public class LiveRoomController { + + @Autowired + private LiveRoomService liveRoomService; + @Autowired + private LiveRoomProdService liveRoomProdService; + + @GetMapping("/page") + @Operation(summary = "获取直播间列表", description = "分页获取直播间列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, LiveRoomDTO liveRoom) { + liveRoom.setShopId(AuthUserContext.get().getTenantId()); + PageVO liveRoomPage = liveRoomService.page(pageDTO, liveRoom); + return ServerResponseEntity.success(liveRoomPage); + } + + @GetMapping + @Operation(summary = "获取直播间", description = "根据roomId获取直播间") + public ServerResponseEntity getByRoomId(@RequestParam Long roomId) { + LiveRoomVO liveRoomVO = liveRoomService.getByRoomId(roomId); + if (StrUtil.isNotBlank(liveRoomVO.getUserMobile())) { + liveRoomVO.setUserMobile(PhoneUtil.hideBetween(liveRoomVO.getUserMobile()).toString()); + } + return ServerResponseEntity.success(liveRoomVO); + } + + @PostMapping + @Operation(summary = "保存直播间", description = "保存直播间") + public ServerResponseEntity save(@Valid @RequestBody LiveRoomDTO liveRoomDTO) { + liveRoomDTO.setShopId(AuthUserContext.get().getTenantId()); + liveRoomService.save(liveRoomDTO); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新直播间", description = "更新直播间") + public ServerResponseEntity update(@Valid @RequestBody LiveRoomDTO liveRoomDTO) { + liveRoomDTO.setShopId(AuthUserContext.get().getTenantId()); + liveRoomService.update(liveRoomDTO); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除直播间", description = "根据直播间id删除直播间") + public ServerResponseEntity delete(@RequestParam Long roomId) { + liveRoomService.deleteById(roomId); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_live_room_prod") + @Operation(summary = "获取直播间的直播商品列表") + public ServerResponseEntity> listLiveRoomProd(@RequestParam Long roomId) { + return ServerResponseEntity.success(liveRoomProdService.listLiveRoomProdInfo(roomId)); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/platform/LiveRoomController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/platform/LiveRoomController.java new file mode 100644 index 0000000..329a77a --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/controller/platform/LiveRoomController.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.controller.platform; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.live.dto.LiveRoomDTO; +import com.tmerclub.cloud.live.model.LiveRoom; +import com.tmerclub.cloud.live.service.LiveRoomProdService; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 直播间 + * @author TRACK + */ +@RestController("platformLiveRoomController") +@RequestMapping("/p/live_room") +@Tag(name = "平台直播间") +public class LiveRoomController { + + @Autowired + private LiveRoomService liveRoomService; + @Autowired + private LiveRoomProdService liveRoomProdService; + + @GetMapping("/page") + @Operation(summary = "获取直播间列表", description = "分页获取直播间列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, LiveRoomDTO liveRoom) { + PageVO liveRoomPage = liveRoomService.page(pageDTO, liveRoom); + return ServerResponseEntity.success(liveRoomPage); + } + + @GetMapping + @Operation(summary = "获取直播间", description = "根据roomId获取直播间") + public ServerResponseEntity getByRoomId(@RequestParam Long roomId) { + LiveRoomVO liveRoomVO = liveRoomService.getByRoomId(roomId); + if (StrUtil.isNotBlank(liveRoomVO.getUserMobile())) { + liveRoomVO.setUserMobile(PhoneUtil.hideBetween(liveRoomVO.getUserMobile()).toString()); + } + return ServerResponseEntity.success(liveRoomVO); + } + + @GetMapping("/list_live_room_prod") + @Operation(summary = "获取直播间的直播商品列表") + public ServerResponseEntity> listLiveRoomProd(@RequestParam Long roomId) { + return ServerResponseEntity.success(liveRoomProdService.listLiveRoomProdInfo(roomId)); + } + + @PutMapping("/to_top") + @Operation(summary = "置顶直播间", description = "置顶直播间") + public ServerResponseEntity update(@RequestParam Long roomId) { + LiveRoomVO liveRoomVO = liveRoomService.getByRoomId(roomId); + if (Objects.isNull(liveRoomVO)) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + liveRoomVO.setRoomTop(Objects.equals(liveRoomVO.getRoomTop(), 0) ? 1 : 0); + LiveRoom liveRoom = BeanUtil.map(liveRoomVO, LiveRoom.class); + liveRoomService.updateById(liveRoom); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除直播间", description = "根据直播间id删除直播间") + public ServerResponseEntity delete(@RequestParam Long roomId) { + liveRoomService.deleteById(roomId); + return ServerResponseEntity.success(); + } + + @PostMapping("/offline") + @Operation(summary = "下线直播间") + public ServerResponseEntity offline(@RequestBody LiveRoomDTO liveRoomDTO) { + liveRoomService.offline(liveRoomDTO); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveRoomDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveRoomDTO.java new file mode 100644 index 0000000..cabb924 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveRoomDTO.java @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + +/** + * 直播间DTO + * @author TRACK + */ +public class LiveRoomDTO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "直播间信息") + private Long roomId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "直播间名称") + private String name; + + @Schema(description = "主播昵称") + private String nickName; + + @Schema(description = "主播手机号") + private String userMobile; + + @Schema(description = "主播用户id") + private Long userId; + + @Schema(description = "直播间状态 0.未开始 1.直播中 2.已结束 3.暂停中 -1.违规下架") + private Integer liveStatus; + + @Schema(description = "直播背景图") + private String coverImg; + + @Schema(description = "主播分享图") + private String shareImg; + + @Schema(description = "直播封面图") + private String feedsImg; + + @Schema(description = "是否置顶 1.是 0.不是") + private Integer roomTop; + + @Schema(description = "直播开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @Schema(description = "直播结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "下线备注") + private String remark; + + @Schema(description = "用户id列表") + private List userIds; + + @Schema(description = "商品id列表") + private List spuIds; + + @Schema(description = "搜索类型 1.搜索直播间信息 2.搜索商品名 3.搜索主播昵称") + private Integer searchType; + + @Schema(description = "商品名") + private String spuName; + + public Long getRoomId() { + return roomId; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLiveStatus() { + return liveStatus; + } + + public void setLiveStatus(Integer liveStatus) { + this.liveStatus = liveStatus; + } + + public String getCoverImg() { + return coverImg; + } + + public void setCoverImg(String coverImg) { + this.coverImg = coverImg; + } + + public String getShareImg() { + return shareImg; + } + + public void setShareImg(String shareImg) { + this.shareImg = shareImg; + } + + public String getFeedsImg() { + return feedsImg; + } + + public void setFeedsImg(String feedsImg) { + this.feedsImg = feedsImg; + } + + public Integer getRoomTop() { + return roomTop; + } + + public void setRoomTop(Integer roomTop) { + this.roomTop = roomTop; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Integer getSearchType() { + return searchType; + } + + public void setSearchType(Integer searchType) { + this.searchType = searchType; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + @Override + public String toString() { + return "LiveRoomDTO{" + + "roomId=" + roomId + + ", shopId=" + shopId + + ", name='" + name + '\'' + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", userId=" + userId + + ", liveStatus=" + liveStatus + + ", coverImg='" + coverImg + '\'' + + ", shareImg='" + shareImg + '\'' + + ", feedsImg='" + feedsImg + '\'' + + ", roomTop=" + roomTop + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", remark='" + remark + '\'' + + ", userIds=" + userIds + + ", spuIds=" + spuIds + + ", searchType=" + searchType + + ", spuName='" + spuName + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveRoomProdDTO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveRoomProdDTO.java new file mode 100644 index 0000000..2a0363e --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/dto/LiveRoomProdDTO.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 直播商品DTO + * @author TRACK + */ +public class LiveRoomProdDTO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "直播间商品信息") + private Long roomProdId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "房间id") + private Long roomId; + + @Schema(description = "讲解状态 0未讲解 1讲解中") + private Integer explainStatus; + + public Long getRoomProdId() { + return roomProdId; + } + + public void setRoomProdId(Long roomProdId) { + this.roomProdId = roomProdId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getRoomId() { + return roomId; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public Integer getExplainStatus() { + return explainStatus; + } + + public void setExplainStatus(Integer explainStatus) { + this.explainStatus = explainStatus; + } + + @Override + public String toString() { + return "LiveRoomProdDTO{" + + "roomProdId=" + roomProdId + + ",prodId=" + spuId + + ",roomId=" + roomId + + ",explainStatus=" + explainStatus + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/feign/LiveFeignController.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/feign/LiveFeignController.java new file mode 100644 index 0000000..c3bf13c --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/feign/LiveFeignController.java @@ -0,0 +1,54 @@ +package com.tmerclub.cloud.live.feign; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.live.feign.LiveFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.LiveCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.live.constant.LiveRoomStatusType; +import com.tmerclub.cloud.live.mapper.LiveRoomProdMapper; +import com.tmerclub.cloud.live.service.LiveRoomService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author TRACK + */ +@DubboService +public class LiveFeignController implements LiveFeignClient { + + @Autowired + private LiveRoomService liveRoomService; + @Autowired + private LiveRoomProdMapper liveRoomProdMapper; + + @Override + public ServerResponseEntity deleteLiveRoomProd(Long spuId) { + List roomIds = liveRoomProdMapper.listRoomIdBySpuId(spuId); + if (CollUtil.isEmpty(roomIds)) { + return ServerResponseEntity.success(); + } + liveRoomProdMapper.deleteBySpuId(spuId, roomIds); + // 清除缓存 + List keys = new ArrayList<>(); + for (Long roomId : roomIds) { + keys.add(LiveCacheNames.LIVE_ROOM_PROD + CacheNames.UNION + roomId); + } + RedisUtil.del(keys); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity endLiveRoom(List shopIds) { + List roomIds = liveRoomService.listRoomIdsByShopId(shopIds); + if (CollUtil.isEmpty(roomIds)) { + return ServerResponseEntity.success(); + } + liveRoomService.updateLiveRoomStatus(LiveRoomStatusType.FINISHED.value(), roomIds); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/mapper/LiveRoomMapper.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/mapper/LiveRoomMapper.java new file mode 100644 index 0000000..780a048 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/mapper/LiveRoomMapper.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.mapper; + +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.live.dto.LiveRoomDTO; +import com.tmerclub.cloud.live.model.LiveRoom; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 直播间 + * @author TRACK + */ +public interface LiveRoomMapper { + + /** + * 获取直播间列表 + * @param liveRoom + * @return 直播间列表 + */ + List list(@Param("liveRoom") LiveRoomDTO liveRoom); + + /** + * 根据直播间id获取直播间 + * @param roomId 直播间id + * @return 直播间 + */ + LiveRoomVO getByRoomId(@Param("roomId") Long roomId); + + /** + * 保存直播间 + * @param liveRoom 直播间 + */ + void save(@Param("liveRoom") LiveRoom liveRoom); + + /** + * 更新直播间 + * @param liveRoom 直播间 + */ + void update(@Param("liveRoom") LiveRoom liveRoom); + + /** + * 根据直播间id删除直播间 + * @param roomId + */ + void deleteById(@Param("roomId") Long roomId); + + /** + * 根据参数获取直播间数量 + * @param shopId + * @param userId + * @param roomId + * @param startTime + * @param endTime + * @return + */ + int countRoomByParam(@Param("shopId") Long shopId, @Param("userId") Long userId, @Param("roomId") Long roomId, + @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 获取用户当前正在开播的直播间信息 + * @param userId + * @param roomId + * @return + */ + LiveRoomVO getLiveRoomInfo(@Param("userId") Long userId, @Param("roomId") Long roomId); + + /** + * 获取直播间列表 + * @param page + * @param liveRoom + * @return 直播间列表 + */ + List listRoomAndDetail(@Param("page") PageAdapter page, @Param("liveRoom") LiveRoomDTO liveRoom); + + /** + * 获取直播间列表数 + * @param liveRoom + * @return + */ + long countRoomAndDetail(@Param("liveRoom") LiveRoomDTO liveRoom); + + /** + * 更新直播间状态 + * @param liveStatus + * @param roomIds + */ + void updateLiveRoomStatus(@Param("liveStatus") Integer liveStatus, @Param("roomIds") List roomIds); + + /** + * 根据时间获取对应状态的直播间列表 + * @param liveStatus + * @return + */ + List listLiveRoomByStatus(@Param("liveStatus") Integer liveStatus); + + /** + * 获取需要暂停的直播间id + * @param userId + * @return + */ + List listNeedStopLiveRoom(@Param("userId") Long userId); + + /** + * 根据店铺id获取需要被结束的直播间 + * @param shopIds + * @return + */ + List listRoomIdsByShopId(@Param("shopIds") List shopIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/model/LiveRoom.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/model/LiveRoom.java new file mode 100644 index 0000000..3878bd8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/model/LiveRoom.java @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; +import java.util.Date; +/** + * 直播间 + * @author TRACK + */ +public class LiveRoom extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 直播间信息 + */ + private Long roomId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 直播间名称 + */ + private String name; + + /** + * 主播用户id + */ + private Long userId; + + /** + * 直播间状态 0.未开始 1.直播中 2.已结束 3.暂停中 -1.违规下架 + */ + private Integer liveStatus; + + /** + * 直播背景图 + */ + private String coverImg; + + /** + * 主播分享图 + */ + private String shareImg; + + /** + * 直播封面图 + */ + private String feedsImg; + + /** + * 是否置顶 1.是 0.不是 + */ + private Integer roomTop; + + /** + * 直播开始时间 + */ + private Date startTime; + + /** + * 直播结束时间 + */ + private Date endTime; + + /** + * 下线备注 + */ + private String remark; + + public Long getRoomId() { + return roomId; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLiveStatus() { + return liveStatus; + } + + public void setLiveStatus(Integer liveStatus) { + this.liveStatus = liveStatus; + } + + public String getCoverImg() { + return coverImg; + } + + public void setCoverImg(String coverImg) { + this.coverImg = coverImg; + } + + public String getShareImg() { + return shareImg; + } + + public void setShareImg(String shareImg) { + this.shareImg = shareImg; + } + + public String getFeedsImg() { + return feedsImg; + } + + public void setFeedsImg(String feedsImg) { + this.feedsImg = feedsImg; + } + + public Integer getRoomTop() { + return roomTop; + } + + public void setRoomTop(Integer roomTop) { + this.roomTop = roomTop; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "LiveRoom{" + + "roomId=" + roomId + + ", shopId=" + shopId + + ", name='" + name + '\'' + + ", userId=" + userId + + ", liveStatus=" + liveStatus + + ", coverImg='" + coverImg + '\'' + + ", shareImg='" + shareImg + '\'' + + ", feedsImg='" + feedsImg + '\'' + + ", roomTop=" + roomTop + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", remark='" + remark + '\'' + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/LiveRoomProdService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/LiveRoomProdService.java new file mode 100644 index 0000000..a5be587 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/LiveRoomProdService.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.service; + +import com.tmerclub.cloud.live.vo.LiveMsgItemVO; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; + +import java.util.List; + +/** + * 直播商品 + * @author TRACK + */ +public interface LiveRoomProdService { + + /** + * 保存直播商品 + * @param roomId + * @param spuIds + */ + void save(Long roomId, List spuIds); + + /** + * 更新直播商品 + * @param roomId + * @param spuIds + */ + void update(Long roomId, List spuIds); + + /** + * 删除直播间商品 + * @param roomId + */ + void delete(Long roomId); + + /** + * 获取直播间商品 admin + * @param roomId + * @return + */ + List listLiveRoomProdInfo(Long roomId); + + /** + * 获取直播间商品 api + * @param roomId + * @return + */ + List listLiveRoomProd(Long roomId); + + /** + * 更新商品讲解状态 + * @param roomId + * @param spuId + * @param explainStatus + * @return + */ + int updateExplainStatus(Long roomId, Long spuId, Integer explainStatus); + + /** + * 组装商品信息返回 + * @param liveMsgItem + * @return + */ + LiveMsgItemVO handleLiveProd(LiveMsgItemVO liveMsgItem); + + /** + * 根据商品id获取正在直播的直播间信息 + * @param spuId + * @return + */ + LiveRoomProdVO getLivingRoomBySpuId(Long spuId); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/LiveRoomService.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/LiveRoomService.java new file mode 100644 index 0000000..f4d1c96 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/LiveRoomService.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.live.dto.LiveRoomDTO; +import com.tmerclub.cloud.live.model.LiveRoom; +import com.tmerclub.cloud.live.vo.LiveRoomVO; + +import java.util.List; + +/** + * 直播间 + * @author TRACK + */ +public interface LiveRoomService { + + /** + * 分页获取直播间列表 + * @param pageDTO 分页参数 + * @param liveRoom + * @return 直播间列表分页数据 + */ + PageVO page(PageDTO pageDTO, LiveRoomDTO liveRoom); + + /** + * 根据直播间id获取直播间 + * @param roomId 直播间id + * @return 直播间 + */ + LiveRoomVO getByRoomId(Long roomId); + + /** + * 保存直播间 + * @param liveRoomDTO 直播间 + */ + void save(LiveRoomDTO liveRoomDTO); + + /** + * 更新直播间和商品 + * @param liveRoomDTO 直播间 + */ + void update(LiveRoomDTO liveRoomDTO); + + /** + * 更新直播间 + * @param liveRoom + */ + void updateById(LiveRoom liveRoom); + + /** + * 根据直播间id删除直播间 + * @param roomId 直播间id + */ + void deleteById(Long roomId); + + /** + * 下线直播间 + * @param liveRoomDTO + */ + void offline(LiveRoomDTO liveRoomDTO); + + /** + * 根据用户id获取该用户开播的直播间信息 + * @param userId + * @return + */ + LiveRoomVO getByUserId(Long userId); + + /** + * 获取用户当前正在开播的直播间信息 + * @param userId + * @param roomId + * @return + */ + LiveRoomVO getLivingRoomInfo(Long userId, Long roomId); + + /** + * 分页获取直播间列表 + * @param pageDTO 分页参数 + * @param liveRoom + * @return 直播间列表分页数据 + */ + PageVO pageRoomAndDetail(PageDTO pageDTO, LiveRoomDTO liveRoom); + + /** + * 更新直播间状态 + * @param liveStatus + * @param roomIds + */ + void updateLiveRoomStatus(Integer liveStatus, List roomIds); + + /** + * 主播状态改变,暂停直播间 + * @param userId + */ + void unableLiveRoom(Long userId); + + /** + * 根据店铺id获取需要被结束的直播间 + * @param shopIds + * @return + */ + List listRoomIdsByShopId(List shopIds); +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/impl/LiveRoomServiceImpl.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/impl/LiveRoomServiceImpl.java new file mode 100644 index 0000000..49d10a7 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/service/impl/LiveRoomServiceImpl.java @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.LiveCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.live.constant.LiveRoomStatusType; +import com.tmerclub.cloud.live.dto.LiveRoomDTO; +import com.tmerclub.cloud.live.mapper.LiveRoomMapper; +import com.tmerclub.cloud.live.model.LiveRoom; +import com.tmerclub.cloud.live.service.LiveRoomProdService; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +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.*; +import java.util.stream.Collectors; + +/** + * 直播间 + * @author TRACK + */ +@Service +public class LiveRoomServiceImpl implements LiveRoomService { + + @Autowired + private LiveRoomMapper liveRoomMapper; + @Autowired + private LiveRoomProdService liveRoomProdService; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + private static final Integer SEARCH_SPU = 2; + private static final Integer SEARCH_NAME = 3; + + @Override + public PageVO page(PageDTO pageDTO, LiveRoomDTO liveRoom) { + if (StrUtil.isNotBlank(liveRoom.getNickName())) { + // 搜索主播昵称 + setUserIds(liveRoom); + } + PageVO page = PageUtil.doPage(pageDTO, () -> liveRoomMapper.list(liveRoom)); + List liveRoomList = page.getList(); + if (CollUtil.isNotEmpty(liveRoomList)) { + List userIds = liveRoomList.stream().map(LiveRoomVO::getUserId).toList(); + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(userIds); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + Map userMap = userResponse.getData().stream().collect(Collectors.toMap(UserApiVO::getUserId, u -> u)); + for (LiveRoomVO liveRoomVO : liveRoomList) { + UserApiVO userApiVO = userMap.get(liveRoomVO.getUserId()); + if (Objects.isNull(userApiVO)) { + liveRoomVO.setNickName("*用户已注销*"); + liveRoomVO.setUserMobile("*用户已注销*"); + } else { + liveRoomVO.setNickName(userApiVO.getNickName()); + liveRoomVO.setUserMobile(PhoneUtil.hideBetween(userApiVO.getPhone()).toString()); + } + } + } + return page; + } + + private void setUserIds(LiveRoomDTO liveRoom) { + UserApiVO userApiVO = new UserApiVO(); + userApiVO.setNickName(liveRoom.getNickName()); + ServerResponseEntity> userResponse = userFeignClient.getUserByParam(userApiVO); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + List userList = userResponse.getData(); + if (CollUtil.isNotEmpty(userList)) { + List userIds = userList.stream().map(UserApiVO::getUserId).toList(); + liveRoom.setUserIds(userIds); + } + } + + @Override + public LiveRoomVO getByRoomId(Long roomId) { + LiveRoomVO liveRoom = liveRoomMapper.getByRoomId(roomId); + if (Objects.isNull(liveRoom)) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.MULTISHOP.value()) && !Objects.equals(liveRoom.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException("权限不足"); + } + ServerResponseEntity userResponse = userFeignClient.getUserData(liveRoom.getUserId()); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + UserApiVO userApiVO = userResponse.getData(); + if (Objects.isNull(userApiVO)) { + // 该主播已经注销账号 + liveRoom.setNickName("*用户已注销*"); + liveRoom.setUserMobile("*用户已注销*"); + liveRoom.setStatus(-1); + } else { + liveRoom.setNickName(userApiVO.getNickName()); + liveRoom.setUserMobile(userApiVO.getPhone()); + liveRoom.setStatus(userApiVO.getStatus()); + } + return liveRoom; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(LiveRoomDTO liveRoomDTO) { + // 检查直播间信息,设置主播用户id + checkLiveRoomAndSetUserId(liveRoomDTO, true); + LiveRoom liveRoom = BeanUtil.map(liveRoomDTO, LiveRoom.class); + liveRoom.setRoomId(null); + liveRoom.setShopId(AuthUserContext.get().getTenantId()); + liveRoom.setLiveStatus(LiveRoomStatusType.NO_START.value()); + liveRoom.setRoomTop(0); + liveRoomMapper.save(liveRoom); + // 保存商品 + liveRoomProdService.save(liveRoom.getRoomId(), liveRoomDTO.getSpuIds()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = LiveCacheNames.LIVE_ROOM_INFO, key = "#liveRoomDTO.roomId") + public void update(LiveRoomDTO liveRoomDTO) { + LiveRoomVO dbLiveRoom = getByRoomId(liveRoomDTO.getRoomId()); + if (Objects.isNull(dbLiveRoom)) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + if (!Objects.equals(dbLiveRoom.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException("权限不足"); + } + if (Objects.equals(dbLiveRoom.getLiveStatus(), LiveRoomStatusType.LIVING.value())) { + throw new LuckException("直播已开始,无法修改信息"); + } + if (Objects.equals(dbLiveRoom.getLiveStatus(), LiveRoomStatusType.OFFLINE.value())) { + throw new LuckException("直播间已违规下架,无法修改信息"); + } + if (!PrincipalUtil.isDbPhone(liveRoomDTO.getUserMobile(), dbLiveRoom.getUserMobile(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (liveRoomDTO.getUserMobile().contains(Constant.ASTERISK)) { + liveRoomDTO.setUserMobile(dbLiveRoom.getUserMobile()); + } + // 检查直播间信息,设置主播用户id + checkLiveRoomAndSetUserId(liveRoomDTO, false); + LiveRoom liveRoom = BeanUtil.map(liveRoomDTO, LiveRoom.class); + liveRoom.setShopId(AuthUserContext.get().getTenantId()); + liveRoomMapper.update(liveRoom); + // 更新商品 + liveRoomProdService.update(liveRoomDTO.getRoomId(), liveRoomDTO.getSpuIds()); + } + + @Override + public void updateById(LiveRoom liveRoom) { + liveRoomMapper.update(liveRoom); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = LiveCacheNames.LIVE_ROOM_INFO, key = "#roomId") + public void deleteById(Long roomId) { + Long shopId = AuthUserContext.get().getTenantId(); + LiveRoomVO liveRoom = getByRoomId(roomId); + if (Objects.isNull(liveRoom)) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + if (!Objects.equals(shopId, liveRoom.getShopId()) && !Objects.equals(Constant.PLATFORM_SHOP_ID, shopId)) { + throw new LuckException("权限不足"); + } + if (Objects.equals(liveRoom.getLiveStatus(), LiveRoomStatusType.LIVING.value())) { + throw new LuckException("直播已开始,无法删除直播间"); + } + liveRoomMapper.deleteById(roomId); + // 删除直播间关联商品 + liveRoomProdService.delete(roomId); + } + + @Override + @CacheEvict(cacheNames = LiveCacheNames.LIVE_ROOM_INFO, key = "#liveRoomDTO.roomId") + public void offline(LiveRoomDTO liveRoomDTO) { + LiveRoomVO dbLiveRoom = getByRoomId(liveRoomDTO.getRoomId()); + if (Objects.isNull(dbLiveRoom)) { + throw new LuckException("直播间不存在,请刷新后重试"); + } + if (Objects.equals(dbLiveRoom.getLiveStatus(), LiveRoomStatusType.OFFLINE.value())) { + throw new LuckException("直播间已违规下架,无法修改信息"); + } + LiveRoom liveRoom = BeanUtil.map(dbLiveRoom, LiveRoom.class); + liveRoom.setLiveStatus(LiveRoomStatusType.OFFLINE.value()); + liveRoom.setRemark(liveRoomDTO.getRemark()); + liveRoomMapper.update(liveRoom); + } + + @Override + public LiveRoomVO getByUserId(Long userId) { + return liveRoomMapper.getLiveRoomInfo(userId, null); + } + + @Override + @Cacheable(cacheNames = LiveCacheNames.LIVE_ROOM_INFO, key = "#roomId") + public LiveRoomVO getLivingRoomInfo(Long userId, Long roomId) { + return liveRoomMapper.getLiveRoomInfo(userId, roomId); + } + + @Override + public PageVO pageRoomAndDetail(PageDTO pageDTO, LiveRoomDTO liveRoom) { + PageVO page = new PageVO<>(); + if (Objects.equals(liveRoom.getSearchType(), SEARCH_SPU) && StrUtil.isNotBlank(liveRoom.getSpuName())) { + // 搜索商品名 + setSpuIds(liveRoom); + if (CollUtil.isEmpty(liveRoom.getSpuIds())) { + page.setTotal(0L); + page.setPages(0); + page.setList(new ArrayList<>()); + return page; + } + } + if (Objects.equals(liveRoom.getSearchType(), SEARCH_NAME) && StrUtil.isNotBlank(liveRoom.getNickName())) { + // 搜索主播名称 + setUserIds(liveRoom); + if (CollUtil.isEmpty(liveRoom.getUserIds())) { + page.setTotal(0L); + page.setPages(0); + page.setList(new ArrayList<>()); + return page; + } + } + List liveRoomList = liveRoomMapper.listRoomAndDetail(new PageAdapter(pageDTO), liveRoom); + if (CollUtil.isNotEmpty(liveRoomList)) { + Map spuMap = getSpuMap(liveRoomList); + Map shopMap = getShopMap(liveRoomList); + for (LiveRoomVO liveRoomVO : liveRoomList) { + String shopName = shopMap.get(liveRoomVO.getShopId()); + liveRoomVO.setShopName(shopName); + if (CollUtil.isNotEmpty(liveRoomVO.getSpuList())) { + Iterator iterator = liveRoomVO.getSpuList().iterator(); + while (iterator.hasNext()) { + SpuSearchVO spuSearchVO = iterator.next(); + SpuSearchVO spu = spuMap.get(spuSearchVO.getSpuId()); + if (Objects.isNull(spu)) { + iterator.remove(); + continue; + } + spuSearchVO.setMainImgUrl(spu.getMainImgUrl()); + } + } + } + } + page.setTotal(liveRoomMapper.countRoomAndDetail(liveRoom)); + page.setPages(PageUtil.getPages(page.getTotal(), pageDTO.getPageSize())); + page.setList(liveRoomList); + return page; + } + + @Override + public void updateLiveRoomStatus(Integer liveStatus, List roomIds) { + liveRoomMapper.updateLiveRoomStatus(liveStatus, roomIds); + delCache(roomIds); + } + + @Override + public void unableLiveRoom(Long userId) { + if (Objects.isNull(userId)) { + return; + } + List roomIds = liveRoomMapper.listNeedStopLiveRoom(userId); + if (CollUtil.isEmpty(roomIds)) { + return; + } + liveRoomMapper.updateLiveRoomStatus(LiveRoomStatusType.STOP.value(), roomIds); + // 清除缓存 + List keys = new ArrayList<>(); + for (Long roomId : roomIds) { + keys.add(LiveCacheNames.LIVE_ROOM_INFO + CacheNames.UNION + roomId); + } + RedisUtil.del(keys); + } + + @Override + public List listRoomIdsByShopId(List shopIds) { + return liveRoomMapper.listRoomIdsByShopId(shopIds); + } + + private static void delCache(List roomIds) { + List keys = new ArrayList<>(); + for (Long roomId : roomIds) { + keys.add(LiveCacheNames.LIVE_ROOM_INFO + CacheNames.UNION + roomId); + } + RedisUtil.del(keys); + } + + private Map getShopMap(List liveRoomList) { + List shopIds = liveRoomList.stream().map(LiveRoomVO::getShopId).toList(); + ServerResponseEntity> shopResponse = shopDetailFeignClient.listByShopIds(shopIds); + if (!shopResponse.isSuccess()) { + throw new LuckException(shopResponse.getMsg()); + } + Map shopMap = shopResponse.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + return shopMap; + } + + private Map getSpuMap(List liveRoomList) { + Set spuIdSet = new HashSet<>(Constant.INITIAL_CAPACITY); + for (LiveRoomVO liveRoomVO : liveRoomList) { + List spuIds = liveRoomVO.getSpuList().stream().map(SpuSearchVO::getSpuId).toList(); + spuIdSet.addAll(spuIds); + } + // 搜索商品名称 + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setSpuIds(new ArrayList<>(spuIdSet)); + productSearchDTO.setSpuStatus(SpuStatus.PUT_SHELF.value()); + ServerResponseEntity> spuResponse = searchSpuFeignClient.simpleList(productSearchDTO); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + List spuList = spuResponse.getData(); + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + return spuMap; + } + + private void setSpuIds(LiveRoomDTO liveRoom) { + // 搜索商品名称 + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setSpuName(liveRoom.getSpuName()); + productSearchDTO.setSpuStatus(SpuStatus.PUT_SHELF.value()); + ServerResponseEntity> spuResponse = searchSpuFeignClient.simpleList(productSearchDTO); + if (!spuResponse.isSuccess()) { + throw new LuckException(spuResponse.getMsg()); + } + List spuList = spuResponse.getData(); + List spuIds = spuList.stream().map(SpuSearchVO::getSpuId).toList(); + liveRoom.setSpuIds(spuIds); + } + + private void checkLiveRoomAndSetUserId(LiveRoomDTO liveRoomDTO, boolean isSave) { + // 校验时间 + Date startTime = liveRoomDTO.getStartTime(); + Date endTime = liveRoomDTO.getEndTime(); + if (isSave) { + if (DateUtil.compare(new Date(), startTime) > 0) { + throw new LuckException("开始时间不能少于当前时间"); + } + if (DateUtil.compare(startTime, endTime) > 0) { + throw new LuckException("开始时间不能大于结束时间"); + } + boolean expiredEndTime = DateUtil.isIn(endTime, startTime, DateUtil.offsetMinute(startTime, 30)) || + !DateUtil.isIn(endTime, startTime, DateUtil.offsetHour(startTime, 24)); + if (expiredEndTime) { + throw new LuckException("开始和结束时间间隔必须大于30分钟,不得超过24小时"); + } + } + // 校验主播信息 + if (StrUtil.isBlank(liveRoomDTO.getNickName()) || StrUtil.isBlank(liveRoomDTO.getUserMobile())) { + throw new LuckException("主播信息不能为空"); + } + UserApiVO userApiVO = new UserApiVO(); + userApiVO.setNickName(liveRoomDTO.getNickName()); + userApiVO.setUserMobile(liveRoomDTO.getUserMobile()); + userApiVO.setStatus(StatusEnum.ENABLE.value()); + ServerResponseEntity> userResponse = userFeignClient.getUserByParam(userApiVO); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + List userList = userResponse.getData(); + if (CollUtil.isEmpty(userList) || !Objects.equals(userList.get(0).getNickName(), liveRoomDTO.getNickName())) { + throw new LuckException("当前选择的主播不存在或被禁用,请检查主播信息是否正确"); + } + Long userId = userList.get(0).getUserId(); + liveRoomDTO.setUserId(userId); + // 商家不能在一个时间段创建两个直播间 + int countByShop = liveRoomMapper.countRoomByParam(liveRoomDTO.getShopId(), null, liveRoomDTO.getRoomId(), startTime, endTime); + if (countByShop > 0) { + throw new LuckException("该时间段下已设有直播间,无法再配置新的直播间"); + } + // 一个主播账号不能同时开播两场直播 + int countByUser = liveRoomMapper.countRoomByParam(null, userId, liveRoomDTO.getRoomId(), startTime, endTime); + if (countByUser > 0) { + throw new LuckException("主播在该时间段下已设有直播间,无法再配置新的直播间"); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/socket/LiveAnchorWebSocketServer.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/socket/LiveAnchorWebSocketServer.java new file mode 100644 index 0000000..2accf70 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/socket/LiveAnchorWebSocketServer.java @@ -0,0 +1,323 @@ +package com.tmerclub.cloud.live.socket; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; + +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.live.constant.LiveConstant; +import com.tmerclub.cloud.live.constant.LiveRoomStatusType; +import com.tmerclub.cloud.live.constant.MsgCode; +import com.tmerclub.cloud.live.constant.MsgType; +import com.tmerclub.cloud.live.dto.LiveMessageDTO; +import com.tmerclub.cloud.live.service.LiveRoomProdService; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.tmerclub.cloud.live.vo.LiveMsgItemVO; +import com.tmerclub.cloud.live.vo.LiveRoomProdVO; +import com.tmerclub.cloud.live.vo.LiveRoomVO; +import jakarta.websocket.*; +import jakarta.websocket.server.PathParam; +import jakarta.websocket.server.ServerEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 主播 + * @author TRACK + */ +@ServerEndpoint("/ua/im/websocket/live/anchor/{token}/{userId}/{roomId}") +@Component +public class LiveAnchorWebSocketServer { + + public static final Logger logger = LoggerFactory.getLogger(LiveAnchorWebSocketServer.class); + + public static final ConcurrentHashMap LIVE_ANCHOR_MAP = new ConcurrentHashMap<>(LiveConstant.DEFAULT_MAP_SIZE); + + private static LiveRoomService liveRoomService; + + private static LiveRoomProdService liveRoomProdService; + + private static TokenFeignClient tokenFeignClient; + + public static void setApplicationContext(ApplicationContext applicationContext) { + liveRoomService = applicationContext.getBean(LiveRoomService.class); + liveRoomProdService = applicationContext.getBean(LiveRoomProdService.class); + tokenFeignClient = applicationContext.getBean(TokenFeignClient.class); + } + + @OnOpen + public void onOpen(Session session, @PathParam("token") String token, @PathParam("roomId") Long roomId) throws IOException { + logger.info("创建主播直播连接"); + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + logger.error("无法获取主播信息"); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取主播信息"))); + } + return; + } + + // 检查直播间 + if (checkLiveRoom(session, roomId, uidInfoBO.getUserId())) { + return; + } + LiveRoomVO livingRoom = liveRoomService.getLivingRoomInfo(uidInfoBO.getUserId(), roomId); + if (Objects.equals(livingRoom.getLiveStatus(), LiveRoomStatusType.FINISHED.value())) { + logger.info("主播连接一个结束的直播间,返回" + livingRoom.getRoomId()); + return; + } + + // 已经有连接 + Session oldSession = LIVE_ANCHOR_MAP.get(LiveConstant.LIVE_ANCHOR_PREFIX + livingRoom.getRoomId() + Constant.UNDERLINE + uidInfoBO.getUserId()); + if (Objects.nonNull(oldSession)) { + if (oldSession.isOpen()) { + oldSession.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.LOGIN_IN_OTHER_PLACE, "账户已在别处登录,请刷新"))); + oldSession.close(); + } + return; + } + // 存储会话到map + LIVE_ANCHOR_MAP.put(LiveConstant.LIVE_ANCHOR_PREFIX + livingRoom.getRoomId() + Constant.UNDERLINE + uidInfoBO.getUserId(), session); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success())); + } + long currentTimeMillis = System.currentTimeMillis(); + if (livingRoom.getStartTime().getTime() <= currentTimeMillis && livingRoom.getEndTime().getTime() >= currentTimeMillis + && LiveRoomStatusType.isNeedOpen(livingRoom.getLiveStatus())) { + // 更新直播为开播状态 + liveRoomService.updateLiveRoomStatus(LiveRoomStatusType.LIVING.value(), Collections.singletonList(livingRoom.getRoomId())); + // 发送消息通知用户直播状态变更 + sendChangeLiveRoomStatusMsg(roomId, LiveRoomStatusType.LIVING); + } + } + + @OnClose + public void onClose(Session session, @PathParam("token") String token, + @PathParam(value = "userId") Long userId, @PathParam(value = "roomId") Long roomId) throws IOException { + logger.info("关闭主播直播连接"); + LIVE_ANCHOR_MAP.remove(LiveConstant.LIVE_ANCHOR_PREFIX + roomId + Constant.UNDERLINE + userId); + setLiveRoomCloseStatus(userId, roomId); + } + + private static void setLiveRoomCloseStatus(Long userId, Long roomId) throws IOException { + LiveRoomVO livingRoom = liveRoomService.getLivingRoomInfo(userId, roomId); + long currentTimeMillis = System.currentTimeMillis(); + if (livingRoom.getStartTime().getTime() <= currentTimeMillis && livingRoom.getEndTime().getTime() >= currentTimeMillis + && Objects.equals(livingRoom.getLiveStatus(), LiveRoomStatusType.LIVING.value())) { + // 更新直播为暂停状态 + liveRoomService.updateLiveRoomStatus(LiveRoomStatusType.STOP.value(), Collections.singletonList(livingRoom.getRoomId())); + // 发送消息通知用户直播状态变更 + sendChangeLiveRoomStatusMsg(roomId, LiveRoomStatusType.STOP); + } + if (livingRoom.getEndTime().getTime() <= currentTimeMillis + && LiveRoomStatusType.isNeedFinish(livingRoom.getLiveStatus())) { + // 更新直播为结束状态 + liveRoomService.updateLiveRoomStatus(LiveRoomStatusType.FINISHED.value(), Collections.singletonList(livingRoom.getRoomId())); + sendChangeLiveRoomStatusMsg(roomId, LiveRoomStatusType.FINISHED); + } + } + + private static void sendChangeLiveRoomStatusMsg(Long roomId, LiveRoomStatusType liveRoomStatusType) throws IOException { + // 发送消息通知用户直播状态变更 + List onlineUserList = LiveUserWebSocketServer.getOnlineUserList(roomId); + LiveMsgItemVO liveMsgItem = new LiveMsgItemVO(); + liveMsgItem.setMsgType(MsgType.LIVE_ROOM_STATUS); + liveMsgItem.setLiveStatus(liveRoomStatusType.value()); + if (CollUtil.isNotEmpty(onlineUserList)) { + for (Session onlineUser : onlineUserList) { + if (Objects.nonNull(onlineUser) && onlineUser.isOpen()) { + onlineUser.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(liveMsgItem))); + } + } + } + } + + @OnError + public void onError(Session session, @PathParam("token") String token, Throwable error, + @PathParam(value = "userId") Long userId, @PathParam("roomId") Long roomId) throws IOException { + logger.error("主播直播连接发生错误{}", error.toString()); + LIVE_ANCHOR_MAP.remove(LiveConstant.LIVE_ANCHOR_PREFIX + roomId + Constant.UNDERLINE + userId); + setLiveRoomCloseStatus(userId, roomId); + } + + @OnMessage + public void onMessage(String sourceMessage, @PathParam("token") String token, Session session, + @PathParam("roomId") Long roomId) throws IOException { + token = Base64.decodeStr(token); + UidInfoBO uidInfoBO = tokenFeignClient.checkToken(token); + if (Objects.isNull(uidInfoBO)) { + logger.error("获取主播信息出错"); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取主播信息"))); + } + } + if (Objects.isNull(uidInfoBO)) { + logger.error("无法获取主播信息"); + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_USER_INFO, "无法获取主播信息"))); + } + return; + } + if (StrUtil.isBlank(sourceMessage)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "主播消息内容格式有误"))); + } + return; + } + logger.info("主播sourceMessage:" + sourceMessage); + LiveMessageDTO liveMessageInfo = Json.parseObject(sourceMessage, LiveMessageDTO.class); + if (Objects.isNull(liveMessageInfo)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "主播消息内容格式有误"))); + } + return; + } + if (checkLiveRoom(session, roomId, uidInfoBO.getUserId())) { + return; + } + // 保持心跳 + if (Objects.equals(liveMessageInfo.getMsgType(), MsgType.HEART_BEAT)) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.HEART_BEAT, "保持心跳"))); + } + return; + } + // 主播发送弹幕 + if (Objects.equals(liveMessageInfo.getMsgType(), MsgType.BULLET_SCREEN)) { + if (StrUtil.isBlank(liveMessageInfo.getContent())) { + return; + } + // 弹幕内容不超过50个字符 + if (liveMessageInfo.getContent().length() > LiveConstant.BULLET_SCREEN_MAX_LENGTH) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CONTENT_FORMAT_ERROR, "主播弹幕内容过长"))); + } + return; + } + // 发送弹幕给在线用户 + LiveUserWebSocketServer.sendMsgToUser(roomId, liveMessageInfo.getNickName(), liveMessageInfo.getContent(), 1); + return; + } + // 主播更新商品讲解状态 + if (Objects.equals(liveMessageInfo.getMsgType(), MsgType.EXPLAIN_STATUS)) { + if (Objects.isNull(liveMessageInfo.getSpuId()) || Objects.isNull(liveMessageInfo.getExplainStatus())) { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.CONTENT_FORMAT_ERROR, "主播消息内容格式有误"))); + } + return; + } + if (Objects.equals(liveMessageInfo.getExplainStatus(), 0)) { + // 商品取消讲解,发送消息 + sendNotExplainMsg(session, roomId, liveMessageInfo); + return; + } + // 检查商品状态 + LiveRoomProdVO liveRoomProdVO = getLiveRoomProdVO(roomId, liveMessageInfo); + if (Objects.isNull(liveRoomProdVO)) { + // 没有该商品,发送商品状态异常消息给所有人 + sendRefreshProdMsg(session, roomId); + return; + } + int updateStatus = liveRoomProdService.updateExplainStatus(roomId, liveRoomProdVO.getSpuId(), liveMessageInfo.getExplainStatus()); + if (updateStatus < 1) { + // 没有更新,发送商品状态异常消息给所有人 + sendRefreshProdMsg(session, roomId); + return; + } + // 发送商品讲解状态更新消息给所有人 + sendChangeExplainStatusMsg(session, roomId, liveMessageInfo, liveRoomProdVO); + } + } + + private static LiveRoomProdVO getLiveRoomProdVO(Long roomId, LiveMessageDTO liveMessageInfo) { + List liveProdList = liveRoomProdService.listLiveRoomProd(roomId); + Map liveProdMap = liveProdList.stream().collect(Collectors.toMap(LiveRoomProdVO::getSpuId, p -> p)); + LiveRoomProdVO liveRoomProdVO = liveProdMap.get(liveMessageInfo.getSpuId()); + return liveRoomProdVO; + } + private static void sendNotExplainMsg(Session session, Long roomId, LiveMessageDTO liveMessageInfo) throws IOException { + liveRoomProdService.updateExplainStatus(roomId, liveMessageInfo.getSpuId(), liveMessageInfo.getExplainStatus()); + LiveMsgItemVO liveMsgItem = new LiveMsgItemVO(); + liveMsgItem.setMsgType(MsgType.EXPLAIN_STATUS); + liveMsgItem.setSpuId(liveMessageInfo.getSpuId()); + liveMsgItem.setExplainStatus(liveMessageInfo.getExplainStatus()); + sendProdExplainStatusChangeMsg(session, roomId, liveMsgItem); + } + + private static boolean checkLiveRoom(Session session, Long roomId, Long userId) throws IOException { + // 检查直播间 + LiveRoomVO livingRoom = liveRoomService.getLivingRoomInfo(userId, roomId); + if (Objects.isNull(livingRoom)) { + logger.error("主播当前未有直播权限"); + if (session.isOpen()) { + // 当前未有直播权限 + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.fail(MsgCode.CAN_NOT_FIND_ROOM_INFO, "当前未有直播权限"))); + } + return true; + } + return false; + } + + private static void sendChangeExplainStatusMsg(Session session, Long roomId, LiveMessageDTO liveMessageInfo, LiveRoomProdVO liveRoomProdVO) throws IOException { + // 发送商品讲解状态更新消息给所有人 + LiveMsgItemVO liveMsgItemParam = new LiveMsgItemVO(); + liveMsgItemParam.setMsgType(MsgType.EXPLAIN_STATUS); + liveMsgItemParam.setSpuId(liveRoomProdVO.getSpuId()); + liveMsgItemParam.setExplainStatus(liveMessageInfo.getExplainStatus()); + LiveMsgItemVO liveMsgItem = liveRoomProdService.handleLiveProd(liveMsgItemParam); + if (Objects.isNull(liveMsgItem)) { + // 商品异常,发送商品状态异常消息给所有人 + sendRefreshProdMsg(session, roomId); + } + sendProdExplainStatusChangeMsg(session, roomId, liveMsgItem); + } + + private static void sendProdExplainStatusChangeMsg(Session session, Long roomId, LiveMsgItemVO liveMsgItem) throws IOException { + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(liveMsgItem))); + } + // 给当前直播间在线用户也发送刷新商品列表的状态码 + List onlineUserList = LiveUserWebSocketServer.getOnlineUserList(roomId); + // 给在线用户发送刷新商品列表消息 + if (CollUtil.isNotEmpty(onlineUserList)) { + for (Session onlineUser : onlineUserList) { + if (Objects.nonNull(onlineUser) && onlineUser.isOpen()) { + onlineUser.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(liveMsgItem))); + } + } + } + } + + private static void sendRefreshProdMsg(Session session, Long roomId) throws IOException { + // 发送刷新商品列表消息给所有人 + if (session.isOpen()) { + session.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.REFRUSH_PROD, "商品状态异常"))); + } + // 给当前直播间在线用户也发送刷新商品列表的状态码 + List onlineUserList = LiveUserWebSocketServer.getOnlineUserList(roomId); + // 给在线用户发送刷新商品列表消息 + if (CollUtil.isNotEmpty(onlineUserList)) { + for (Session onlineUser : onlineUserList) { + if (Objects.nonNull(onlineUser) && onlineUser.isOpen()) { + onlineUser.getBasicRemote().sendText(Json.toJsonString(ServerResponseEntity.success(MsgCode.REFRUSH_PROD, "商品状态异常"))); + } + } + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/task/LiveTask.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/task/LiveTask.java new file mode 100644 index 0000000..7b7051b --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/task/LiveTask.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.task; + + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.live.constant.LiveRoomStatusType; +import com.tmerclub.cloud.live.mapper.LiveRoomMapper; +import com.tmerclub.cloud.live.service.LiveRoomService; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 直播的定时任务 + * + * @author LHD + */ +@Component +public class LiveTask { + + private static final Logger logger = LoggerFactory.getLogger(LiveTask.class); + + @Autowired + private LiveRoomService liveRoomService; + @Autowired + private LiveRoomMapper liveRoomMapper; + + /** + * 定时改变直播间状态 半小时一次 + */ + @XxlJob("changeLiveRoomStatus") + public void changeLiveRoomStatus() { + // 查询要关播的直播间列表 + List endLiveRoomIds = liveRoomMapper.listLiveRoomByStatus(LiveRoomStatusType.FINISHED.value()); + if (CollUtil.isNotEmpty(endLiveRoomIds)) { + // 更新直播间状态 + logger.info("直播间关播:{}", endLiveRoomIds); + liveRoomService.updateLiveRoomStatus(LiveRoomStatusType.FINISHED.value(), endLiveRoomIds); + } + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveRoomProdVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveRoomProdVO.java new file mode 100644 index 0000000..de797f8 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveRoomProdVO.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 直播商品VO + * @author TRACK + */ +public class LiveRoomProdVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "直播间商品信息") + private Long roomProdId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "房间id") + private Long roomId; + + @Schema(description = "主播id") + private Long userId; + + @Schema(description = "讲解状态 0未讲解 1讲解中") + private Integer explainStatus; + + @Schema(description = "商品信息") + private SpuSearchVO spuSearchVO; + + public Long getRoomProdId() { + return roomProdId; + } + + public void setRoomProdId(Long roomProdId) { + this.roomProdId = roomProdId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getRoomId() { + return roomId; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public Integer getExplainStatus() { + return explainStatus; + } + + public void setExplainStatus(Integer explainStatus) { + this.explainStatus = explainStatus; + } + + public SpuSearchVO getSpuSearchVO() { + return spuSearchVO; + } + + public void setSpuSearchVO(SpuSearchVO spuSearchVO) { + this.spuSearchVO = spuSearchVO; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "LiveRoomProdVO{" + + "roomProdId=" + roomProdId + + ", spuId=" + spuId + + ", roomId=" + roomId + + ", userId=" + userId + + ", explainStatus=" + explainStatus + + ", spuSearchVO=" + spuSearchVO + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveRoomVO.java b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveRoomVO.java new file mode 100644 index 0000000..5007825 --- /dev/null +++ b/tmerclub-marketing/src/main/java/com/tmerclub/cloud/live/vo/LiveRoomVO.java @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.live.vo; + +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.Date; +import java.util.List; + +/** + * 直播间VO + * @author TRACK + */ +public class LiveRoomVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "直播间信息") + private Long roomId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺logo") + private String shopLogo; + + @Schema(description = "直播间名称") + private String name; + + @Schema(description = "主播昵称") + private String nickName; + + @Schema(description = "主播手机号") + private String userMobile; + + @Schema(description = "主播状态 1 正常 0 无效") + private Integer status; + + @Schema(description = "主播用户id") + private Long userId; + + @Schema(description = "直播间状态 0.未开始 1.直播中 2.已结束 3.暂停中 -1.违规下架") + private Integer liveStatus; + + @Schema(description = "直播背景图") + private String coverImg; + + @Schema(description = "主播分享图") + private String shareImg; + + @Schema(description = "直播封面图") + private String feedsImg; + + @Schema(description = "是否置顶 1.是 0.不是") + private Integer roomTop; + + @Schema(description = "直播开始时间") + private Date startTime; + + @Schema(description = "直播结束时间") + private Date endTime; + + @Schema(description = "下线备注") + private String remark; + + @Schema(description = "商品列表") + private List spuList; + + @Schema(description = "游客uuid") + private Long uuid; + + public Long getRoomId() { + return roomId; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserMobile() { + return userMobile; + } + + public void setUserMobile(String userMobile) { + this.userMobile = userMobile; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLiveStatus() { + return liveStatus; + } + + public void setLiveStatus(Integer liveStatus) { + this.liveStatus = liveStatus; + } + + public String getCoverImg() { + return coverImg; + } + + public void setCoverImg(String coverImg) { + this.coverImg = coverImg; + } + + public String getShareImg() { + return shareImg; + } + + public void setShareImg(String shareImg) { + this.shareImg = shareImg; + } + + public String getFeedsImg() { + return feedsImg; + } + + public void setFeedsImg(String feedsImg) { + this.feedsImg = feedsImg; + } + + public Integer getRoomTop() { + return roomTop; + } + + public void setRoomTop(Integer roomTop) { + this.roomTop = roomTop; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public List getSpuList() { + return spuList; + } + + public void setSpuList(List spuList) { + this.spuList = spuList; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Long getUuid() { + return uuid; + } + + public void setUuid(Long uuid) { + this.uuid = uuid; + } + + @Override + public String toString() { + return "LiveRoomVO{" + + "roomId=" + roomId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", shopLogo='" + shopLogo + '\'' + + ", name='" + name + '\'' + + ", nickName='" + nickName + '\'' + + ", userMobile='" + userMobile + '\'' + + ", status=" + status + + ", userId=" + userId + + ", liveStatus=" + liveStatus + + ", coverImg='" + coverImg + '\'' + + ", shareImg='" + shareImg + '\'' + + ", feedsImg='" + feedsImg + '\'' + + ", roomTop=" + roomTop + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", remark='" + remark + '\'' + + ", spuList=" + spuList + + ", uuid=" + uuid + + '}'; + } +} diff --git a/tmerclub-marketing/src/main/resources/bootstrap.yml b/tmerclub-marketing/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..5a5d1e7 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9109} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9509} diff --git a/tmerclub-marketing/src/main/resources/mapper/ComboMapper.xml b/tmerclub-marketing/src/main/resources/mapper/ComboMapper.xml new file mode 100644 index 0000000..0f6a976 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/ComboMapper.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `combo_id`,`name`,`create_time`,`update_time`,`start_time`,`end_time`,`main_spu_id`,`price`,`sold_num`,`shop_id`,`status` + + + + + insert into combo (combo_id,`name`,`start_time`,`end_time`,`main_spu_id`,`price`,`sold_num`,`shop_id`,`status`) + values (#{combo.comboId},#{combo.name},#{combo.startTime},#{combo.endTime},#{combo.mainSpuId},#{combo.price},#{combo.soldNum},#{combo.shopId},#{combo.status}); + + + update combo + + + `name` = #{combo.name}, + + + `start_time` = #{combo.startTime}, + + + `end_time` = #{combo.endTime}, + + + `main_spu_id` = #{combo.mainSpuId}, + + + `price` = #{combo.price}, + + + `sold_num` = #{combo.soldNum}, + + + `shop_id` = #{combo.shopId}, + + + `status` = #{combo.status}, + + + where combo_id = #{combo.comboId} + + + + update combo set status = #{status} where combo_id = #{comboId} + + + + update combo set status = #{status} where combo_id in + + #{comboId} + + + + + + + + + + + + update combo set sold_num = #{combo.soldNum} where combo_id = #{combo.comboId} + + + + + + + + + + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/ComboSpuMapper.xml b/tmerclub-marketing/src/main/resources/mapper/ComboSpuMapper.xml new file mode 100644 index 0000000..36924a1 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/ComboSpuMapper.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + `combo_spu_id`,`combo_id`,`spu_id`,`combo_price`,`type`,`required`,`least_num`,`status` + + + cs.`combo_spu_id`,cs.`combo_id`,cs.`spu_id`,cs.`combo_price`,cs.`type`,cs.`required`,cs.`least_num`,cs.`status` + + + + + insert into combo_spu (`combo_id`,`spu_id`,`combo_price`,`type`,`required`,`least_num`,`status`) + values (#{comboSpu.comboId},#{comboSpu.spuId},#{comboSpu.comboPrice},#{comboSpu.type},#{comboSpu.required},#{comboSpu.leastNum},#{comboSpu.status}); + + + update combo_spu + + + `combo_id` = #{comboSpu.comboId}, + + + `spu_id` = #{comboSpu.spuId}, + + + `combo_price` = #{comboSpu.comboPrice}, + + + `type` = #{comboSpu.type}, + + + `required` = #{comboSpu.required}, + + + `least_num` = #{comboSpu.leastNum}, + + + `status` = #{comboSpu.status}, + + + where combo_spu_id = #{comboSpu.comboSpuId} + + + + delete from combo_spu where combo_spu_id = #{comboSpuId} + + + + update combo_spu set status = #{comboSpu.status} where + status != -1 + + and combo_id = #{comboSpu.comboId} + + + and spu_id = #{comboSpu.spuId} + + + + + + + + + + + + + + + delete from combo_spu where combo_spu_id in + + #{comboSpuId} + + + + + update combo_spu set status = #{status} where status != -1 and combo_id in + + #{comboId} + + + + + + + update combo_spu set status = 0 where status = 1 and spu_id in + + #{spuId} + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/ComboSpuSkuMapper.xml b/tmerclub-marketing/src/main/resources/mapper/ComboSpuSkuMapper.xml new file mode 100644 index 0000000..9187c46 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/ComboSpuSkuMapper.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + `combo_spu_id`,`sku_id`,`matching_price` + + + + + + + + insert into combo_spu_sku (combo_spu_id,`sku_id`,`matching_price`) values + + (#{comboSpuId},#{sku.skuId},#{sku.matchingPrice}) + + + + + update combo_spu_sku + + + `sku_id` = #{comboSpuSku.skuId}, + + + `matching_price` = #{comboSpuSku.matchingPrice}, + + + where combo_spu_id = #{comboSpuSku.comboSpuId} + + + + delete from combo_spu_sku where combo_spu_id = + #{comboSpuId} + + + + insert into combo_spu_sku (`combo_spu_id`,`sku_id`,`matching_price`) values + + (#{comboSpuId},#{sku.skuId},#{sku.matchingPrice}) + + + + + + + update combo_spu_sku set + + matching_price = #{comboSpuSku.matchingPrice} + + where + sku_id = #{comboSpuSku.skuId} + and combo_spu_id = #{comboSpuSku.comboSpuId} + + + + + + + + + + + + + + + + update combo_spu_sku set status = -1 where combo_spu_id in + + #{comboSpuId} + + + + + + + + + update combo_spu_sku set status = #{status} where status != -1 and combo_spu_id in + + #{comboSpuId} + + + + + delete from combo_spu_sku where combo_spu_id = #{comboSpuId} + + diff --git a/tmerclub-marketing/src/main/resources/mapper/CouponGiveLogMapper.xml b/tmerclub-marketing/src/main/resources/mapper/CouponGiveLogMapper.xml new file mode 100644 index 0000000..9735ccb --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/CouponGiveLogMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + `biz_type`,`biz_id` + + + + + insert into coupon_give_log (`biz_type`,`biz_id`) + values (#{couponGiveLog.bizType},#{couponGiveLog.bizId}); + + + update coupon_give_log + + + `biz_id` = #{couponGiveLog.bizId}, + + + where biz_type = #{couponGiveLog.bizType} + + + delete from coupon_give_log where biz_type = #{bizType} + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/CouponLockMapper.xml b/tmerclub-marketing/src/main/resources/mapper/CouponLockMapper.xml new file mode 100644 index 0000000..2004192 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/CouponLockMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + insert into coupon_lock (`coupon_id`, `coupon_user_id`, `user_id`, `order_ids`, `amount`, `status`) + values + + (#{couponLock.couponId}, #{couponLock.couponUserId}, #{couponLock.userId}, #{couponLock.orderIds}, + #{couponLock.amount}, #{couponLock.status}) + + + + + update coupon_lock + set status = -1 where coupon_user_id in + + #{couponUserId} + + and status = 0 + + + + update coupon_lock + set status = 1 where + + FIND_IN_SET(#{orderId}, order_ids) + + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/CouponSpuMapper.xml b/tmerclub-marketing/src/main/resources/mapper/CouponSpuMapper.xml new file mode 100644 index 0000000..33c0e9b --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/CouponSpuMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + `coupon_spu_id`,`coupon_id`,`spu_id` + + + + insert into coupon_spu (`coupon_id`,`spu_id`) values (#{couponSpu.couponId},#{couponSpu.spuId}); + + + + delete from coupon_spu where coupon_id = #{couponId} + + and spu_id in + + #{spuId} + + + + + + delete from coupon_spu where spu_id in + + #{spuId} + + + + delete from coupon_spu where coupon_id in + + #{couponId} + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/CouponUserMapper.xml b/tmerclub-marketing/src/main/resources/mapper/CouponUserMapper.xml new file mode 100644 index 0000000..97113a3 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/CouponUserMapper.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DiscountItemMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DiscountItemMapper.xml new file mode 100644 index 0000000..07bc75d --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DiscountItemMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + delete from discount_item where discount_id = #{discountId} + + + insert into discount_item (discount_id,need_amount,discount) values + + (#{discountItem.discountId},#{discountItem.needAmount},#{discountItem.discount}) + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DiscountMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DiscountMapper.xml new file mode 100644 index 0000000..611697a --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DiscountMapper.xml @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `discount_id`, + `create_time`, + `update_time`, + `shop_id`, + `discount_name`, + `discount_rule`, + `discount_type`, + `suitable_spu_type`, + `max_reduce_amount`, + `start_time`, + `end_time`, + `status`, + `mobile_pic`, + `pc_pic`, + `pc_background_pic` + + + + + insert into discount (`shop_id`, `discount_name`, `discount_rule`, `discount_type`, `suitable_spu_type`, + `max_reduce_amount`, `start_time`, `end_time`, `status`, `mobile_pic`, `pc_pic`, + `pc_background_pic`) + values (#{discount.shopId}, #{discount.discountName}, #{discount.discountRule}, #{discount.discountType}, + #{discount.suitableSpuType}, #{discount.maxReduceAmount}, #{discount.startTime}, #{discount.endTime}, + #{discount.status}, #{discount.mobilePic}, #{discount.pcPic}, #{discount.pcBackgroundPic}); + + + update discount + + + `shop_id` = #{discount.shopId}, + + + `discount_name` = #{discount.discountName}, + + + `discount_rule` = #{discount.discountRule}, + + + `discount_type` = #{discount.discountType}, + + + `suitable_spu_type` = #{discount.suitableSpuType}, + + + `max_reduce_amount` = #{discount.maxReduceAmount}, + + + `start_time` = #{discount.startTime}, + + + `end_time` = #{discount.endTime}, + + + `status` = #{discount.status}, + + + `mobile_pic` = #{discount.mobilePic}, + + + `pc_pic` = #{discount.pcPic}, + + + `pc_background_pic` = #{discount.pcBackgroundPic}, + + + where discount_id = #{discount.discountId} + + + + delete + from discount + where discount_id = #{id} + and shop_id = #{shopId} + + + + + + + + + + UPDATE discount SET `status` = 0 + WHERE `status` <> 0 AND end_time < NOW() + + + + + + + + + UPDATE discount SET `status` = 0 + WHERE discount_id IN + + #{discountId} + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionMsgMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionMsgMapper.xml new file mode 100644 index 0000000..6ce96dc --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionMsgMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + `msg_id`,`create_time`,`update_time`,`msg_title`,`start_time`,`end_time`,`is_top`,`content` + + + + + + insert into distribution_msg (`msg_title`,`start_time`,`end_time`,`is_top`,`content`) + values (#{distributionMsg.msgTitle},#{distributionMsg.startTime},#{distributionMsg.endTime},#{distributionMsg.isTop},#{distributionMsg.content}); + + + update distribution_msg + + + `msg_title` = #{distributionMsg.msgTitle}, + + + `start_time` = #{distributionMsg.startTime}, + + + `end_time` = #{distributionMsg.endTime}, + + + `is_top` = #{distributionMsg.isTop}, + + + `content` = #{distributionMsg.content}, + + + where msg_id = #{distributionMsg.msgId} + + + delete from distribution_msg where msg_id = #{msgId} + + + delete from distribution_msg where msg_id in + + #{msgId} + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/DistributionWithdrawCashMapper.xml b/tmerclub-marketing/src/main/resources/mapper/DistributionWithdrawCashMapper.xml new file mode 100644 index 0000000..9d3880a --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/DistributionWithdrawCashMapper.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `withdraw_cash_id`,`create_time`,`update_time`,`wallet_id`,`amount`,`fee`,`type`,`money_flow`,`merchant_order_id`,`version`,`state`,`biz_user_id` + + + + + insert into distribution_withdraw_cash (`wallet_id`,`amount`,`fee`,`type`,`money_flow`,`merchant_order_id`,`version`,`state`,`biz_user_id`) + values (#{distributionWithdrawCash.walletId},#{distributionWithdrawCash.amount},#{distributionWithdrawCash.fee},#{distributionWithdrawCash.type},#{distributionWithdrawCash.moneyFlow},#{distributionWithdrawCash.merchantOrderId},#{distributionWithdrawCash.version},#{distributionWithdrawCash.state},#{distributionWithdrawCash.bizUserId}); + + + update distribution_withdraw_cash + + + `wallet_id` = #{distributionWithdrawCash.walletId}, + + + `amount` = #{distributionWithdrawCash.amount}, + + + `fee` = #{distributionWithdrawCash.fee}, + + + `type` = #{distributionWithdrawCash.type}, + + + `money_flow` = #{distributionWithdrawCash.moneyFlow}, + + + `merchant_order_id` = #{distributionWithdrawCash.merchantOrderId}, + + + `version` = #{distributionWithdrawCash.version}, + + + `state` = #{distributionWithdrawCash.state}, + + + where withdraw_cash_id = #{distributionWithdrawCash.withdrawCashId} + + + delete from distribution_withdraw_cash where withdraw_cash_id = #{withdrawCashId} + + + update distribution_withdraw_cash + set `state` = 2 + where wallet_id in( + select wallet_id from distribution_user_wallet where distribution_user_id = #{distributionUserId} + ) + and `state` = 0 + + + + + + + + diff --git a/tmerclub-marketing/src/main/resources/mapper/LiveRoomProdMapper.xml b/tmerclub-marketing/src/main/resources/mapper/LiveRoomProdMapper.xml new file mode 100644 index 0000000..1752829 --- /dev/null +++ b/tmerclub-marketing/src/main/resources/mapper/LiveRoomProdMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + insert into live_room_prod (`spu_id`,`room_id`,`explain_status`) + values + + (#{liveRoomProd.spuId},#{liveRoomProd.roomId},#{liveRoomProd.explainStatus}) + + + + delete from live_room_prod where room_id = #{roomId} + + + delete from live_room_prod where spu_id = #{spuId} and room_id in + + #{roomId} + + + + + update live_room_prod set explain_status = #{explainStatus} + where room_id = #{roomId} and spu_id = #{spuId} + + + + diff --git a/tmerclub-order/Dockerfile b/tmerclub-order/Dockerfile new file mode 100644 index 0000000..da6f962 --- /dev/null +++ b/tmerclub-order/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms1024m", "-Xmx1024m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-order/pom.xml b/tmerclub-order/pom.xml new file mode 100644 index 0000000..7d531ad --- /dev/null +++ b/tmerclub-order/pom.xml @@ -0,0 +1,116 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-order + tmerclub 订单服务 + jar + + + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-payment + ${project.version} + + + com.moyuer.cloud + tmerclub-api-seckill + ${project.version} + + + com.moyuer.cloud + tmerclub-api-group + ${project.version} + + + com.xuxueli + xxl-job-core + + + com.moyuer.cloud + tmerclub-api-flow + ${project.version} + + + com.github.binarywang + weixin-java-miniapp + + + com.github.binarywang + weixin-java-mp + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/OrderApplication.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/OrderApplication.java new file mode 100644 index 0000000..19f1ab4 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/OrderApplication.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/11/19 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class OrderApplication { + + public static void main(String[] args) { + SpringApplication.run(OrderApplication.class, args); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/config/OrderCacheTtlAdapter.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/OrderCacheTtlAdapter.java new file mode 100644 index 0000000..dcd4438 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/OrderCacheTtlAdapter.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.common.cache.adapter.CacheTtlAdapter; +import com.tmerclub.cloud.common.cache.bo.CacheNameWithTtlBO; +import com.tmerclub.cloud.common.cache.constant.OrderCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/18 + */ +@Component +public class OrderCacheTtlAdapter implements CacheTtlAdapter { + @Override + public List listCacheNameWithTtl() { + List cacheNameWithTtls = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 确认订单缓存30分钟 + cacheNameWithTtls.add(new CacheNameWithTtlBO(OrderCacheNames.ORDER_CONFIRM_UUID_KEY, 60 * 30)); + cacheNameWithTtls.add(new CacheNameWithTtlBO(OrderCacheNames.ORDER_CONFIRM_KEY, 60 * 30)); + return cacheNameWithTtls; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/config/OrderThreadConfig.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/OrderThreadConfig.java new file mode 100644 index 0000000..9923350 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/OrderThreadConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author FrozenWatermelon + * @date 2020/12/15 + */ +@Configuration +@EnableConfigurationProperties(ThreadPoolConfigProperties.class) +public class OrderThreadConfig { + + /** + * 因为每台机器不同,所以线程数量应该是通过配置文件进行配置的 + * @param pool 线程池配置信息 + * @return 订单线程池 + */ + @Bean + public ThreadPoolExecutor orderThreadPoolExecutor(ThreadPoolConfigProperties pool) { + return new ThreadPoolExecutor( + pool.getCoreSize(), + pool.getMaxSize(), + pool.getKeepAliveTime(), + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(100000), + new ThreadFactoryBuilder() + .setNameFormat("Order-Thread-Pool-%d").build() + ); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java new file mode 100644 index 0000000..c8b5a3a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/RocketMqConfig.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate stockMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.STOCK_UNLOCK_TOPIC_BY_ORDER_ID); + } + + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate couponMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.COUPON_UNLOCK_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderCancelTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_CANCEL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderSubmitShopCartTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_SUBMIT_SHOP_CART); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderPurchaseNotifyShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_PURCHASE_NOTIFY_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderNotifyServiceTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_NOTIFY_SERVICE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate allinPayBalanceOrderSuccessTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ALLINPAY_BALANCE_ORDER_SUCCESS_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderReceiptTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ORDER_RECEIPT_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderSettledShopTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ORDER_SETTLED_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ORDER_REFUND_TOPIC); + } + + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundPaymentTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_PAYMENT_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundSuccessSettlementTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate refundSuccessNotifySupplierTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_SUPPLIER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundSuccessServiceTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_SUCCESS_SERVICE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundSuccessStockTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_SUCCESS_STOCK_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate groupOrderCancelMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.GROUP_ORDER_CANCEL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate seckillOrderCancelMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SECKILL_ORDER_CANCEL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate seckillOrderRefundMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SECKILL_ORDER_REFUND_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendNotifyToShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendNotifyToUserTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate userScoreTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SCORE_UNLOCK_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendNotifyToUserExtensionTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SEND_NOTIFY_TO_USER_EXTENSION_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate stockBillLogTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.STOCK_BILL_LOG_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate stockBillLogPurchaseStorageTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate outStockLogTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.OUT_STOCK_LOG_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderNotifyTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_NOTIFY_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderPreSaleFailSettlementTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_PRE_SALE_FAIL_SETTLEMENT_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate presaleOrderCanalMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.PRESALE_ORDER_CANAL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundCancelMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_CANAL_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate comboOrderMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.COMBO_ORDER_TOPIC); + } + + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate sendOrderToPurchaseNotifyToShopTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.SEND_ORDER_TO_PURCHASE_NOTIFY_TO_SHOP_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderSettlementShopByAllinpayTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_SETTLED_SHOP_BY_ALLINPAY_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundUpdateRefundStatusMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_UPDATE_REFUND_STATUS); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate addPurchaseAmountLogTemplate() { + return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.ADD_PURCHASE_AMOUNT_LOG_TOPIC); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/config/ThreadPoolConfigProperties.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/ThreadPoolConfigProperties.java new file mode 100644 index 0000000..72738f2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/ThreadPoolConfigProperties.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author FrozenWatermelon + * @date 2020/12/15 + */ +@ConfigurationProperties(prefix = "mall4cloud.order.thread") +public class ThreadPoolConfigProperties { + + private Integer coreSize; + + private Integer maxSize; + + private Integer keepAliveTime; + + public Integer getCoreSize() { + return coreSize; + } + + public void setCoreSize(Integer coreSize) { + this.coreSize = coreSize; + } + + public Integer getMaxSize() { + return maxSize; + } + + public void setMaxSize(Integer maxSize) { + this.maxSize = maxSize; + } + + public Integer getKeepAliveTime() { + return keepAliveTime; + } + + public void setKeepAliveTime(Integer keepAliveTime) { + this.keepAliveTime = keepAliveTime; + } + + @Override + public String toString() { + return "ThreadPoolConfigProperties{" + + "coreSize=" + coreSize + + ", maxSize=" + maxSize + + ", keepAliveTime=" + keepAliveTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/config/WxConfig.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/WxConfig.java new file mode 100644 index 0000000..861cd4c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/config/WxConfig.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.config; + + +import cn.binarywang.wx.miniapp.api.WxMaOrderShippingService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaOrderShippingServiceImpl; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceHttpClientImpl; +import cn.binarywang.wx.miniapp.bean.shop.request.shipping.WxMaOrderShippingInfoGetListRequest; +import cn.binarywang.wx.miniapp.bean.shop.request.shipping.WxMaOrderShippingInfoGetRequest; +import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingInfoGetListResponse; +import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingInfoGetResponse; +import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingIsTradeManagedResponse; +import cn.binarywang.wx.miniapp.config.impl.WxMaRedissonConfigImpl; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.bean.WxMiniApp; +import com.tmerclub.cloud.common.bean.WxMp; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceHttpClientImpl; +import me.chanjar.weixin.mp.config.impl.WxMpRedissonConfigImpl; +import org.apache.dubbo.config.annotation.DubboReference; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * 通过微信配置获取微信的支付信息,登陆信息等 + * @author FrozenWatermelon + */ +@RefreshScope +@Component +public class WxConfig { + + + @Autowired + private FeignShopConfig feignShopConfig; + + @Autowired + private RedissonClient redissonClient; + @Autowired + private FeignShopConfig shopConfig; + @DubboReference + private ConfigFeignClient configFeignClient; + + private static final String MA_CONFIG_KEY_PREFIX = "mall4cloud:ma_config_key_prefix"; + + private static final String MP_CONFIG_KEY_PREFIX = "mall4cloud:mp_config_key_prefix"; + + public WxMaService getWxMaService() { + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + // access token用redis缓存 + WxMaRedissonConfigImpl maRedissonConfig = new WxMaRedissonConfigImpl(redissonClient, MA_CONFIG_KEY_PREFIX); + maRedissonConfig.setAppid(wxMiniApp.getAppId()); + maRedissonConfig.setSecret(wxMiniApp.getSecret()); + + WxMaServiceHttpClientImpl wxMaServiceHttpClient = new WxMaServiceHttpClientImpl(); + wxMaServiceHttpClient.setWxMaConfig(maRedissonConfig); + return wxMaServiceHttpClient; + } + + public WxMpService getWxMpService() { + WxMp wxMp = feignShopConfig.getWxMp(); + // access token用redis缓存 + WxMpRedissonConfigImpl wxMpRedisConfig = new WxMpRedissonConfigImpl(redissonClient, MP_CONFIG_KEY_PREFIX); + wxMpRedisConfig.setAppId(wxMp.getAppId()); + wxMpRedisConfig.setSecret(wxMp.getSecret()); + + WxMpServiceHttpClientImpl wxMpServiceHttpClient = new WxMpServiceHttpClientImpl(); + wxMpServiceHttpClient.setWxMpConfigStorage(wxMpRedisConfig); + return wxMpServiceHttpClient; + } + + + /** + * 查询小程序是否已开通发货信息管理服务 + * @return true开通,false未开通 + */ + public Boolean getTradeManaged() { + // 判断是否开启了微信发货 + WxMiniApp wxMiniApp = feignShopConfig.getWxMiniApp(); + Boolean spuAudit = wxMiniApp.getWechatShippingAudit(); + if (!spuAudit) { + return false; + } + String appid = wxMiniApp.getAppId(); + WxMaService wxMaService = getWxMaService(); + WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService); + try { + // 查询小程序是否已开通发货信息管理服务 + WxMaOrderShippingIsTradeManagedResponse managed = wxMaOrderShippingService.isTradeManaged(appid); + return managed.getTradeManaged(); + } catch (WxErrorException wxErrorException) { + return false; + } + } + + /** + * 查询小程序待发货订单信息 + * @return + */ + public WxMaOrderShippingInfoGetListResponse getOrderIdList() { + WxMiniApp wxMiniApp = shopConfig.getWxMiniApp(); + WxMaService wxMaService = getWxMaService(); + WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService); + try { + WxMaOrderShippingInfoGetListRequest request = new WxMaOrderShippingInfoGetListRequest(); + request.setOrderState(1); + // 查询小程序待发货订单信息 + WxMaOrderShippingInfoGetListResponse response = wxMaOrderShippingService.getList(request); + return response; + } catch (WxErrorException wxErrorException) { + return new WxMaOrderShippingInfoGetListResponse(); + } + } + + /** + * 根据支付单号获取小程序发货订单状态 + * @return 订单状态 + */ + public Integer getOrderStatusByBizPayNo(String bizPayNo) { + WxMiniApp wxMiniApp = shopConfig.getWxMiniApp(); + WxMaService wxMaService = getWxMaService(); + WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService); + try { + WxMaOrderShippingInfoGetRequest request = new WxMaOrderShippingInfoGetRequest(); + request.setTransactionId(bizPayNo); + // 查询小程序待发货订单信息 + WxMaOrderShippingInfoGetResponse response = wxMaOrderShippingService.get(request); + return response.getOrder().getOrderState(); + } catch (WxErrorException wxErrorException) { + return 0; + } + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryHundredInfoBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryHundredInfoBO.java new file mode 100644 index 0000000..701be65 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryHundredInfoBO.java @@ -0,0 +1,144 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单快递100信息VO + * + * @author lhd + * @date 2020-05-18 15:10:00 + */ +public class DeliveryHundredInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "物流公司名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyName; + + @Schema(description = "物流公司官网", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyHomeUrl; + + @Schema(description = "物流订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private String dvyFlowId; + + @Schema(description = "物流状态 0:没有记录 1:已揽收 2:运输途中 201:达到目的城市 3:已签收 4:问题件", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer State; + + @Schema(description = "查询出的物流信息", requiredMode = Schema.RequiredMode.REQUIRED) + private List data; + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyHomeUrl() { + return companyHomeUrl; + } + + public void setCompanyHomeUrl(String companyHomeUrl) { + this.companyHomeUrl = companyHomeUrl; + } + + public String getDvyFlowId() { + return dvyFlowId; + } + + public void setDvyFlowId(String dvyFlowId) { + this.dvyFlowId = dvyFlowId; + } + + public Integer getState() { + return State; + } + + public void setState(Integer state) { + this.State = switchState(state); + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + /** + * 快递100的13种状态码转成快递鸟的6种 + * + * @param state 快递100状态码 + * 0 在途 快件处于运输过程中 + * 1 揽收 快件已由快递公司揽收 + * 2 疑难 快递100无法解析的状态,或者是需要人工介入的状态, 比方说收件人电话错误。 + * 3 签收 正常签收 + * 4 退签 货物退回发货人并签收 + * 5 派件 货物正在进行派件 + * 6 退回 货物正处于返回发货人的途中 + * 7 转单 货物转给其他快递公司邮寄 + * 10 待清关 货物等待清关 + * 11 清关中 货物正在清关流程中 + * 12 已清关 货物已完成清关流程 + * 13 清关异常 货物在清关过程中出现异常 + * 14 收件人拒签 收件人明确拒收 + * @return 快递鸟状态码: 0:没有记录 1:已揽收 2:运输途中 201:达到目的城市 3:已签收 4:问题件 + */ + private Integer switchState(Integer state) { + int i = 0; + switch (state) { + case 1: + i = 1; + break; + case 5: + i = 201; + break; + case 3: + i = 3; + break; + case 0: + case 7: + case 10: + case 11: + case 12: + i = 2; + break; + case 2: + case 13: + case 14: + case 4: + case 6: + i = 4; + break; + default: + break; + } + return i; + } + + @Override + public String toString() { + return "DeliveryHundredInfoBO{" + + "companyName='" + companyName + '\'' + + ", companyHomeUrl='" + companyHomeUrl + '\'' + + ", dvyFlowId='" + dvyFlowId + '\'' + + ", state=" + State + + ", data=" + data + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryHundredItemInfoBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryHundredItemInfoBO.java new file mode 100644 index 0000000..5b304b5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryHundredItemInfoBO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单快递信息项VO + * + * @author lhd + * @date 2020-05-18 15:10:00 + */ +public class DeliveryHundredItemInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "接受站点", requiredMode = Schema.RequiredMode.REQUIRED) + private String context; + @Schema(description = "接受时间", requiredMode = Schema.RequiredMode.REQUIRED) + private String ftime; + + public String getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } + + public String getFtime() { + return ftime; + } + + public void setFtime(String ftime) { + this.ftime = ftime; + } + + @Override + public String toString() { + return "DeliveryHundredItemInfoBO{" + + "context='" + context + '\'' + + ", ftime='" + ftime + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintDataInfoBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintDataInfoBO.java new file mode 100644 index 0000000..71dbfa4 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintDataInfoBO.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.delivery.bo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 电子面单接口data返回内容 + * @author TRACK + */ +public class DeliveryPrintDataInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private String kuaidinum; + + public String getKuaidinum() { + return kuaidinum; + } + + public void setKuaidinum(String kuaidinum) { + this.kuaidinum = kuaidinum; + } + + @Override + public String toString() { + return "DeliveryPrintDataInfoBO{" + + "kuaidinum='" + kuaidinum + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintInfoBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintInfoBO.java new file mode 100644 index 0000000..5041350 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintInfoBO.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.delivery.bo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 电子面单接口返回内容 + * @author TRACK + */ +public class DeliveryPrintInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private Boolean success; + + private Integer code; + + private String message; + + private DeliveryPrintDataInfoBO data; + + public Boolean getSuccess() { + return success; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public DeliveryPrintDataInfoBO getData() { + return data; + } + + public void setData(DeliveryPrintDataInfoBO data) { + this.data = data; + } + + @Override + public String toString() { + return "DeliveryPrintInfoBO{" + + "success=" + success + + ", code=" + code + + ", message='" + message + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintInfoErrorBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintInfoErrorBO.java new file mode 100644 index 0000000..661249b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/bo/DeliveryPrintInfoErrorBO.java @@ -0,0 +1,52 @@ +package com.tmerclub.cloud.delivery.bo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 电子面单接口错误返回内容 + * @author TRACK + */ +public class DeliveryPrintInfoErrorBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private Boolean success; + + private Integer code; + + private String message; + + public Boolean getSuccess() { + return success; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return "DeliveryPrintInfoBO{" + + "success=" + success + + ", code=" + code + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/AreaLevel.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/AreaLevel.java new file mode 100644 index 0000000..303212d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/AreaLevel.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.constant; + +/** + * 地区层级 + * @author TRAKC + */ +public enum AreaLevel { + + + /** + * 第一层 + */ + FIRST_LEVEL(1), + + /** + * 第二层 + */ + SECOND_LEVEL(2), + + /** + * 第三层 + */ + THIRD_LEVEL(3) + + ; + + private final Integer num; + + public Integer value() { + return num; + } + + AreaLevel(Integer num) { + this.num = num; + } + + public static AreaLevel instance(Integer value) { + AreaLevel[] enums = values(); + for (AreaLevel statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/DeliveryConstant.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/DeliveryConstant.java new file mode 100644 index 0000000..9a26cf6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/constant/DeliveryConstant.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.constant; + +/** + * 物流常量 + * @author lhd + */ +public class DeliveryConstant { + /** + * 物流常量 + */ + public static final String CODE_HEADER = "APPCODE "; + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/AreaController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/AreaController.java new file mode 100644 index 0000000..8d4728d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/AreaController.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.admin; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.delivery.service.AreaService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.ArrayList; +import java.util.List; + +/** + * 省市区地区信息 + * + * @author YXF + * @date 2020-11-25 14:48:52 + */ +@RestController("adminAreaController") +@RequestMapping("/mp/area") +@Tag(name = "店铺-地区信息") +public class AreaController { + + @Autowired + private AreaService areaService; + + + @GetMapping("/list") + @Operation(summary = "获取省市区地区信息列表", description = "分页获取省市区地区信息列表") + public ServerResponseEntity> list(AreaDTO areaDTO) { + List list = areaService.list(areaDTO); + return ServerResponseEntity.success(list); + } + + @GetMapping + @Operation(summary = "获取省市区地区信息", description = "根据areaId获取省市区地区信息") + public ServerResponseEntity getByAreaId(@RequestParam Long areaId) { + return ServerResponseEntity.success(areaService.getByAreaId(areaId)); + } + + @GetMapping("/list_by_pid") + @Operation(summary = "通过父级id获取区域列表", description = "通过父级id获取区域列表") + public ServerResponseEntity> listByPid(Long pid) { + List list = areaService.listByPid(pid); + return ServerResponseEntity.success(list); + } + + @GetMapping("/area_list_info") + @Operation(summary = "获取可用的区域省市区信息(三级地址列表,省市区结构)", description = "获取可用的区域省市区信息") + public ServerResponseEntity> getAreaListInfo() { + return ServerResponseEntity.success(areaService.getAreaListInfo()); + } + + @GetMapping("/list_area_of_enable") + @Operation(summary = "获取可用的省市区列表(三级地址列表)", description = "获取可用的省市区列表") + public ServerResponseEntity> listAreaOfEnable() { + List list = areaService.listAreaOfEnable(); + List res = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AreaVO pArea : list) { + res.add(pArea); + for (AreaVO cArea : pArea.getAreas()) { + res.add(cArea); + res.addAll(cArea.getAreas()); + cArea.setAreas(null); + } + pArea.setAreas(null); + } + return ServerResponseEntity.success(res); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/DeliveryCompanyController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/DeliveryCompanyController.java new file mode 100644 index 0000000..f1c031c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/DeliveryCompanyController.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.dto.DeliveryCompanyDTO; +import com.tmerclub.cloud.delivery.service.DeliveryCompanyService; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 java.util.List; + +/** + * 物流公司 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +@RestController("adminDeliveryCompanyController") +@RequestMapping("/mp/delivery_company") +@Tag(name = "物流公司") +public class DeliveryCompanyController { + + @Autowired + private DeliveryCompanyService deliveryCompanyService; + + @GetMapping("/page") + @Operation(summary = "分页获取物流公司列表", description = "分页获取物流公司列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, DeliveryCompanyDTO deliveryCompanyDTO) { + PageVO pageVO = deliveryCompanyService.page(pageDTO, deliveryCompanyDTO); + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/list") + @Operation(summary = "获取物流公司列表", description = "获取物流公司列表") + public ServerResponseEntity> list() { + return ServerResponseEntity.success(deliveryCompanyService.list()); + } + + @GetMapping + @Operation(summary = "根据id获取物流公司信息", description = "根据id获取物流公司信息") + public ServerResponseEntity getById(@RequestParam("deliveryCompanyId") Long deliveryCompanyId) { + return ServerResponseEntity.success(deliveryCompanyService.getByDeliveryCompanyId(deliveryCompanyId)); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/OutletConfigController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/OutletConfigController.java new file mode 100644 index 0000000..3dd3333 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/OutletConfigController.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.admin; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.OutletConfigDTO; +import com.tmerclub.cloud.delivery.model.OutletConfig; +import com.tmerclub.cloud.delivery.service.OutletConfigService; +import com.tmerclub.cloud.delivery.vo.OutletConfigInfoVO; +import com.tmerclub.cloud.delivery.vo.OutletConfigVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 网点配置 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +@RestController("adminOutletConfigController") +@RequestMapping("/mp/outlet_config") +@Tag(name = "网点配置") +public class OutletConfigController { + + @Autowired + private OutletConfigService outletConfigService; + + @GetMapping("/page") + @Operation(summary = "获取网点配置列表", description = "分页获取网点配置列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, OutletConfigDTO outletConfigDTO) { + outletConfigDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO outletConfigPage = outletConfigService.page(pageDTO, outletConfigDTO); + return ServerResponseEntity.success(outletConfigPage); + } + + @GetMapping + @Operation(summary = "获取网点配置", description = "根据outletConfig获取网点配置") + public ServerResponseEntity getByOutletConfig(@RequestParam Long outletConfigId) { + OutletConfig outletConfig = outletConfigService.getByOutletConfig(outletConfigId, AuthUserContext.get().getSysType()); + if (StrUtil.isNotBlank(outletConfig.getMobile())) { + outletConfig.setMobile(PhoneUtil.hideBetween(outletConfig.getMobile()).toString()); + } + return ServerResponseEntity.success(outletConfig); + } + + @PostMapping + @Operation(summary = "保存网点配置", description = "保存网点配置") + public ServerResponseEntity save(@Valid @RequestBody OutletConfigDTO outletConfigDTO) { + OutletConfig outletConfig = BeanUtil.map(outletConfigDTO, OutletConfig.class); + outletConfig.setOutletConfigId(null); + outletConfig.setSupplierId(null); + outletConfig.setShopId(AuthUserContext.get().getTenantId()); + outletConfigService.save(outletConfig); + outletConfigService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新网点配置", description = "更新网点配置") + public ServerResponseEntity update(@Valid @RequestBody OutletConfigDTO outletConfigDTO) { + OutletConfig outletConfig = BeanUtil.map(outletConfigDTO, OutletConfig.class); + Long shopId = AuthUserContext.get().getTenantId(); + outletConfig.setSupplierId(null); + outletConfig.setShopId(shopId); + outletConfigService.update(outletConfig); + outletConfigService.removeCache(shopId, AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除网点配置", description = "根据网点配置id删除网点配置") + public ServerResponseEntity delete(@RequestParam Long outletConfigId) { + outletConfigService.deleteById(outletConfigId); + outletConfigService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_default") + @Operation(summary = "设网点信息为默认/取消默认") + public ServerResponseEntity setDefault(@RequestParam Long outletConfigId) { + outletConfigService.setDefault(outletConfigId); + outletConfigService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_outlet_config") + @Operation(summary = "获取网点信息列表") + public ServerResponseEntity> listOutletConfig() { + List list = outletConfigService.listByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/PrinterController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/PrinterController.java new file mode 100644 index 0000000..735be68 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/admin/PrinterController.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.PrinterDTO; +import com.tmerclub.cloud.delivery.model.Printer; +import com.tmerclub.cloud.delivery.service.PrinterService; +import com.tmerclub.cloud.delivery.vo.PrinterVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 打印机 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +@RestController("adminPrinterController") +@RequestMapping("/mp/printer") +@Tag(name = "打印机") +public class PrinterController { + + @Autowired + private PrinterService printerService; + + @GetMapping("/page") + @Operation(summary = "获取打印机列表", description = "分页获取打印机列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, PrinterDTO printerDTO) { + printerDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO printerPage = printerService.page(pageDTO, printerDTO); + return ServerResponseEntity.success(printerPage); + } + + @GetMapping + @Operation(summary = "获取打印机", description = "根据printerId获取打印机") + public ServerResponseEntity getByPrinterId(@RequestParam Long printerId) { + return ServerResponseEntity.success(printerService.getByPrinterId(printerId)); + } + + @PostMapping + @Operation(summary = "保存打印机", description = "保存打印机") + public ServerResponseEntity save(@Valid @RequestBody PrinterDTO printerDTO) { + Printer printer = BeanUtil.map(printerDTO, Printer.class); + printer.setPrinterId(null); + printer.setSupplierId(null); + printer.setShopId(AuthUserContext.get().getTenantId()); + printerService.save(printer); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新打印机", description = "更新打印机") + public ServerResponseEntity update(@Valid @RequestBody PrinterDTO printerDTO) { + Printer printer = BeanUtil.map(printerDTO, Printer.class); + printer.setSupplierId(null); + printer.setShopId(AuthUserContext.get().getTenantId()); + printerService.update(printer); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除打印机", description = "根据打印机id删除打印机") + public ServerResponseEntity delete(@RequestParam Long printerId) { + printerService.deleteById(printerId); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_default") + @Operation(summary = "设打印机信息为默认/取消默认") + public ServerResponseEntity setDefault(@RequestParam Long printerId) { + printerService.setDefault(printerId); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_printer") + @Operation(summary = "list_printer") + public ServerResponseEntity> listPrinter() { + List list = printerService.listByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/DeliveryCompanyController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/DeliveryCompanyController.java new file mode 100644 index 0000000..b743679 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/DeliveryCompanyController.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.delivery.service.DeliveryCompanyService; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * 物流公司 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +@RestController("appDeliveryCompanyController") +@RequestMapping("/delivery_company") +@Tag(name = "物流公司") +public class DeliveryCompanyController { + + @Autowired + private DeliveryCompanyService deliveryCompanyService; + + @GetMapping("/list") + @Operation(summary = "获取物流公司列表", description = "获取物流公司列表") + public ServerResponseEntity> list() { + return ServerResponseEntity.success(deliveryCompanyService.list()); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/StationController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/StationController.java new file mode 100644 index 0000000..c62f1a0 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/StationController.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import cn.hutool.core.map.MapUtil; +import com.tmerclub.cloud.api.delivery.dto.StationSalesDTO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderItemVO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.OrderStationDTO; +import com.tmerclub.cloud.delivery.dto.StationDTO; +import com.tmerclub.cloud.delivery.model.Station; +import com.tmerclub.cloud.delivery.service.StationService; +import com.tmerclub.cloud.order.vo.StationDetailVO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.service.OrderSelfStationService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.service.OrderVirtualInfoService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("appStationController") +@RequestMapping("/station") +@Tag(name = "用户自提点信息") +public class StationController { + + @Autowired + private StationService stationService; + @Autowired + private OrderSelfStationService orderSelfStationService; + @Autowired + private OrderVirtualInfoService orderVirtualInfoService; + @Autowired + private OrderService orderService; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取自提点信息列表", description = "分页获取自提点信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO stationPage = stationService.page(pageDTO); + return ServerResponseEntity.success(stationPage); + } + + @GetMapping + @Operation(summary = "获取自提点信息", description = "根据stationId获取自提点信息") + public ServerResponseEntity getInfo() { + Long stationId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(stationService.getByStationId(stationId)); + } + + @PutMapping + @Operation(summary = "更新自提点信息", description = "更新自提点信息") + public ServerResponseEntity update(@Valid @RequestBody StationDTO stationDTO) { + Station station = BeanUtil.map(stationDTO, Station.class); + station.setStationId(AuthUserContext.get().getTenantId()); + station.setAccount(null); + stationService.update(station); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除自提点信息", description = "根据自提点信息id删除自提点信息") + public ServerResponseEntity delete(@RequestParam Long stationId) { + stationService.deleteById(stationId); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_station_index_info") + @Operation(summary = "自提点首页数据", description = "获取自提点首页数据") + public ServerResponseEntity getStationIndexInfo() { + Long stationId = AuthUserContext.get().getTenantId(); + StationVO stationVO = stationService.getByStationId(stationId); + List stationSalesRecord = stationService.getStationSalesRecord(stationVO.getShopId(), stationId); + stationVO.setStationSalesDTOList(stationSalesRecord); + return ServerResponseEntity.success(stationVO); + } + + @PostMapping("/user_station") + @Operation(summary = "获取距离用户近的自提点") + public ServerResponseEntity> getStationList(@Valid @RequestBody OrderStationDTO orderStationDTO) { + PageVO stationParams = stationService.getStationList(orderStationDTO.getPageDTO(), orderStationDTO); + return ServerResponseEntity.success(stationParams); + } + + @GetMapping("/order_list_by_status") + @Operation(summary = "订单列表信息", description = "根据订单状态获取订单列表信息,状态为0时获取所有订单") + @Parameters(@Parameter(name = "status", description = "订单状态 1:待付款 2:待发货 3:待收货 4:待评价 5:成功 6:失败")) + public ServerResponseEntity> orderListByStatus(OrderSearchDTO orderSearchDTO) { + Long stationId = AuthUserContext.get().getTenantId(); + orderSearchDTO.setStationId(stationId); + if (Objects.equals(orderSearchDTO.getStatus(), OrderStatus.PAYED.value())) { + orderSearchDTO.setWaitPurchase(0); + } + EsPageVO data = searchOrderFeignClient.pageOrder(orderSearchDTO).getData(); + for (EsOrderVO esOrderVO : data.getList()) { + Map> comboMap = esOrderVO.getOrderItems().stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + if (MapUtil.isEmpty(comboMap)) { + continue; + } + Iterator iterator = esOrderVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + EsOrderItemVO orderItem = iterator.next(); + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + } + orderItem.setComboList(comboMap.get(orderItem.getOrderItemId())); + } + } + return ServerResponseEntity.success(data); + } + + @GetMapping("/get_code") + @Operation(summary = "自提点二维码信息", description = "自提点二维码信息") + public ServerResponseEntity getCode() { + Long stationId = AuthUserContext.get().getTenantId(); + StationVO station = stationService.getStationInfoById(stationId); + String code = station.getShopId() + "#station#" + stationId; + return ServerResponseEntity.success(code); + } + + @GetMapping("/get_station_order_by_code") + @Operation(summary = "通过提货码获取自提订单或虚拟订单", description = "自提点输入提货码获取自提订单或虚拟订单") + @Parameter(name = "code", description = "提货码", required = true) + public ServerResponseEntity getStationOrderByCode(@RequestParam("code") String code) { + OrderVO orderVO = orderSelfStationService.getOrderByStationCode(AuthUserContext.get().getTenantId(), code); + return ServerResponseEntity.success(orderVO); + } + + + @PutMapping("/order_station_by_order_id") + @Operation(summary = "自提点提货", description = "自提点提货操作") + @Parameter(name = "orderIds", description = "订单编号数组", required = true) + public ServerResponseEntity orderStationByOrderId(@RequestBody String orderIds) { + List orderIdList = Arrays.asList(orderIds.split(",")); + List ids = new ArrayList<>(Constant.INITIAL_CAPACITY); + orderIdList.forEach(s -> ids.add(Long.parseLong(s))); + orderService.orderStationByOrderId(ids, null, AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(Boolean.TRUE); + } + + @PutMapping("/order_write_off_by_order_id") + @Operation(summary = "虚拟商品订单核销操作", description = "虚拟商品订单核销操作") + public ServerResponseEntity orderWriteOffByOrderId(@RequestBody OrderVirtualInfoDTO orderVirtualInfoDTO) { + Long orderId = orderVirtualInfoDTO.getOrderId(); + Long stationId = AuthUserContext.get().getTenantId(); + if (Objects.isNull(orderId)) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + Order order = orderService.getByOrderId(orderId); + if (Objects.isNull(order) || order.getOrderMold() == 0) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + orderVirtualInfoService.orderWriteOffByOrderId(orderVirtualInfoDTO, order, stationId); + return ServerResponseEntity.success(Boolean.TRUE); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TranscityController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TranscityController.java new file mode 100644 index 0000000..5672a91 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TranscityController.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.TranscityDTO; +import com.tmerclub.cloud.delivery.model.Transcity; +import com.tmerclub.cloud.delivery.service.TranscityService; +import com.tmerclub.cloud.delivery.vo.TranscityVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 运费项和运费城市关联信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("appTranscityController") +@RequestMapping("/transcity") +@Tag(name = "运费项和运费城市关联信息") +public class TranscityController { + + @Autowired + private TranscityService transcityService; + + + @GetMapping("/page") + @Operation(summary = "获取运费项和运费城市关联信息列表", description = "分页获取运费项和运费城市关联信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO transcityPage = transcityService.page(pageDTO); + return ServerResponseEntity.success(transcityPage); + } + + @GetMapping + @Operation(summary = "获取运费项和运费城市关联信息", description = "根据transcityId获取运费项和运费城市关联信息") + public ServerResponseEntity getByTranscityId(@RequestParam Long transcityId) { + return ServerResponseEntity.success(transcityService.getByTranscityId(transcityId)); + } + + @PostMapping + @Operation(summary = "保存运费项和运费城市关联信息", description = "保存运费项和运费城市关联信息") + public ServerResponseEntity save(@Valid @RequestBody TranscityDTO transcityDTO) { + Transcity transcity = BeanUtil.map(transcityDTO, Transcity.class); + transcity.setTranscityId(null); + transcityService.save(transcity); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新运费项和运费城市关联信息", description = "更新运费项和运费城市关联信息") + public ServerResponseEntity update(@Valid @RequestBody TranscityDTO transcityDTO) { + Transcity transcity = BeanUtil.map(transcityDTO, Transcity.class); + transcityService.update(transcity); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除运费项和运费城市关联信息", description = "根据运费项和运费城市关联信息id删除运费项和运费城市关联信息") + public ServerResponseEntity delete(@RequestParam Long transcityId) { + transcityService.deleteById(transcityId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TranscityFreeController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TranscityFreeController.java new file mode 100644 index 0000000..5d87d27 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/app/TranscityFreeController.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.TranscityFreeDTO; +import com.tmerclub.cloud.delivery.model.TranscityFree; +import com.tmerclub.cloud.delivery.service.TranscityFreeService; +import com.tmerclub.cloud.delivery.vo.TranscityFreeVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 指定条件包邮城市项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("appTranscityFreeController") +@RequestMapping("/transcity_free") +@Tag(name = "指定条件包邮城市项") +public class TranscityFreeController { + + @Autowired + private TranscityFreeService transcityFreeService; + + + @GetMapping("/page") + @Operation(summary = "获取指定条件包邮城市项列表", description = "分页获取指定条件包邮城市项列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO transcityFreePage = transcityFreeService.page(pageDTO); + return ServerResponseEntity.success(transcityFreePage); + } + + @GetMapping + @Operation(summary = "获取指定条件包邮城市项", description = "根据transcityFreeId获取指定条件包邮城市项") + public ServerResponseEntity getByTranscityFreeId(@RequestParam Long transcityFreeId) { + return ServerResponseEntity.success(transcityFreeService.getByTranscityFreeId(transcityFreeId)); + } + + @PostMapping + @Operation(summary = "保存指定条件包邮城市项", description = "保存指定条件包邮城市项") + public ServerResponseEntity save(@Valid @RequestBody TranscityFreeDTO transcityFreeDTO) { + TranscityFree transcityFree = BeanUtil.map(transcityFreeDTO, TranscityFree.class); + transcityFree.setTranscityFreeId(null); + transcityFreeService.save(transcityFree); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新指定条件包邮城市项", description = "更新指定条件包邮城市项") + public ServerResponseEntity update(@Valid @RequestBody TranscityFreeDTO transcityFreeDTO) { + TranscityFree transcityFree = BeanUtil.map(transcityFreeDTO, TranscityFree.class); + transcityFreeService.update(transcityFree); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除指定条件包邮城市项", description = "根据指定条件包邮城市项id删除指定条件包邮城市项") + public ServerResponseEntity delete(@RequestParam Long transcityFreeId) { + transcityFreeService.deleteById(transcityFreeId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/multishop/SameCityController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/multishop/SameCityController.java new file mode 100644 index 0000000..d5a8833 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/multishop/SameCityController.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.multishop; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.vo.SameCityVO; +import com.tmerclub.cloud.common.bean.BmapPoint; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.delivery.dto.SameCityDTO; +import com.tmerclub.cloud.delivery.model.SameCity; +import com.tmerclub.cloud.delivery.service.SameCityService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +/** + * @author lhd + * @date 2020-05-23 08:26:25 + */ +@RestController("multishopSameCityController") +@RequestMapping("/m/same_city") +@Tag(name = "商家端同城配送接口") +public class SameCityController { + + @Autowired + private SameCityService sameCityService; + + @GetMapping("/get_same_city_info") + @Operation(summary = "获取同城配送数据") + public ServerResponseEntity getSameCityPage() { + Long shopId = AuthUserContext.get().getTenantId(); + SameCity sameCity = sameCityService.getSameCityByShopId(shopId); + if (sameCity == null) { + return ServerResponseEntity.success(null); + } + SameCityVO sameCityVO = new SameCityVO(); + BeanUtils.copyProperties(sameCity, sameCityVO); + sameCityVO.setPolygonPath(JSON.parseArray(sameCity.getPositionInfo(), BmapPoint.class)); + return ServerResponseEntity.success(sameCityVO); + } + + @PostMapping + @Operation(summary = "新增或修改同城配送数据") + public ServerResponseEntity saveOrUpdate(@RequestBody @Valid SameCityDTO sameCityDTO) { + if (CollUtil.isEmpty(sameCityDTO.getPolygonPath())) { + throw new LuckException("请设置设置配送区域"); + } + Long shopId = AuthUserContext.get().getTenantId(); + SameCity sameCity = sameCityService.getSameCityByShopId(shopId); + String positionInfo = JSON.toJSONString(sameCityDTO.getPolygonPath()); + boolean isAdd = false; + if (sameCity == null) { + sameCity = new SameCity(); + isAdd = true; + } + BeanUtils.copyProperties(sameCityDTO, sameCity); + sameCity.setPositionInfo(positionInfo); + sameCity.setShopId(shopId); + // 新增or更新 + if (isAdd) { + sameCityService.save(sameCity); + } else { + sameCityService.updateByShopId(sameCity); + } + // 删除缓存 + sameCityService.removeSameCityCacheByShopId(shopId); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "修改同城配送数据") + public ServerResponseEntity updateById(@RequestBody @Valid SameCityDTO sameCityDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + // 更新同城配送 + SameCity sameCity = new SameCity(); + BeanUtils.copyProperties(sameCityDTO, sameCity); + sameCity.setShopId(shopId); + sameCity.setPositionInfo(JSON.toJSONString(sameCityDTO.getPolygonPath())); + sameCityService.updateByShopId(sameCity); + // 删除缓存 + sameCityService.removeSameCityCacheByShopId(shopId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/multishop/StationController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/multishop/StationController.java new file mode 100644 index 0000000..2b25718 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/multishop/StationController.java @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.multishop; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.platform.constant.OfflineHandleEventType; +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.feign.OfflineHandleEventFeignClient; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.feign.StockPointFeignClient; +import com.tmerclub.cloud.api.product.feign.TakeStockFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.StockModeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.delivery.dto.StationDTO; +import com.tmerclub.cloud.delivery.model.Station; +import com.tmerclub.cloud.delivery.service.StationService; +import com.tmerclub.cloud.order.service.AllotOrderService; +import com.tmerclub.cloud.order.service.PurchaseOrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@RestController("multishopStationController") +@RequestMapping("/m/station") +@Tag(name = "[商家端]自提点信息") +public class StationController { + + @Value("${mall4cloud.expose.permission:}") + private Boolean permission; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private OfflineHandleEventFeignClient offlineHandleEventFeignClient; + @Autowired + private SegmentManager segmentManager; + @Autowired + private StationService stationService; + @Autowired + private AllotOrderService allotOrderService; + @Autowired + private PurchaseOrderService purchaseOrderService; + @DubboReference + private StockPointFeignClient stockPointFeignClient; + @DubboReference + private TakeStockFeignClient takeStockFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取自提点信息列表", description = "分页获取自提点信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, StationDTO stationDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + stationDTO.setShopId(shopId); + PageVO stationPage = stationService.pageStation(pageDTO, stationDTO); + for (StationVO stationVO : stationPage.getList()) { + if (StrUtil.isNotBlank(stationVO.getMobile()) && PrincipalUtil.isMobile(stationVO.getMobile())) { + stationVO.setMobile(PhoneUtil.hideBetween(stationVO.getMobile()).toString()); + } + } + return ServerResponseEntity.success(stationPage); + } + + @GetMapping + @Operation(summary = "获取自提点信息", description = "根据stationId获取自提点信息") + public ServerResponseEntity getByStationId(@RequestParam Long stationId) { + StationVO stationVO = stationService.getByStationId(stationId); + if (stationVO != null && stationVO.getStatus() == -1) { + stationVO = null; + } + if (Objects.nonNull(stationVO) && StrUtil.isNotBlank(stationVO.getMobile()) && PrincipalUtil.isMobile(stationVO.getMobile())) { + stationVO.setMobile(PhoneUtil.hideBetween(stationVO.getMobile()).toString()); + } + return ServerResponseEntity.success(stationVO); + } + + @PostMapping + @Operation(summary = "保存自提点信息", description = "保存自提点信息") + public ServerResponseEntity save(@Valid @RequestBody StationDTO stationDTO) { + Station station = BeanUtil.map(stationDTO, Station.class); + station.setShopId(AuthUserContext.get().getTenantId()); + station.setStationId(null); + station.setAccount(null); + station.setStockMode(station.getStockMode() == null ? StockModeEnum.ALL_STOCK.value() : station.getStockMode()); + stationService.save(station); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新自提点信息", description = "更新自提点信息") + public ServerResponseEntity update(@Valid @RequestBody StationDTO stationDTO) { + Station station = BeanUtil.map(stationDTO, Station.class); + station.setAccount(null); + stationService.update(station); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除自提点信息", description = "根据自提点信息id删除自提点信息") + public ServerResponseEntity delete(@RequestParam Long stationId) { + StationVO stationVO = stationService.getByStationId(stationId); + int count = stockPointFeignClient.countStockList(stationId).getData(); + if (count > 0) { + throw new LuckException("当前门店存在商品库存,不可删除"); + } + // 检查采购订单 + Long unFinishCount = purchaseOrderService.countUnFinish(stationId); + if (unFinishCount > 0) { + throw new LuckException("存在未完成的采购订单,不可删除"); + } + // 检查调拨订单 + unFinishCount = allotOrderService.countUnFinish(stationId); + if (unFinishCount > 0) { + throw new LuckException("存在未完成的调拨订单,不可删除"); + } + // 检查实物盘点 + unFinishCount = takeStockFeignClient.countUnFinish(stationId); + if (unFinishCount > 0) { + throw new LuckException("存在未完成的实物盘点,不可删除"); + } + if(Objects.nonNull(stationVO.getAccount())) { + // 删除账号 + accountFeignClient.deleteByTenantIdAndSysType(stationId, SysTypeEnum.STATION.value()); + } + // 删除门店 + stationService.logicDeleteById(stationId); + return ServerResponseEntity.success(); + } + + @PostMapping("/create_account") + @Operation(summary = "创建自提门店账号", description = "创建自提门店账号") + public ServerResponseEntity createAccount(@RequestBody StationDTO stationDTO) { + // 创建账号 + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setUsername(stationDTO.getAccount()); + authAccountDTO.setPassword(stationDTO.getPassword()); + authAccountDTO.setStatus(1); + authAccountDTO.setSysType(SysTypeEnum.STATION.value()); + authAccountDTO.setIsAdmin(1); + authAccountDTO.setTenantId(stationDTO.getStationId()); + authAccountDTO.setCreateIp(IpHelper.getIpAddr()); + authAccountDTO.setUserId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STATION_USER)); + ServerResponseEntity response = accountFeignClient.save(authAccountDTO); + if (!response.isSuccess()) { + return ServerResponseEntity.showFailMsg(response.getMsg()); + } + // 更新门店信息 + Station station = new Station(); + station.setStationId(stationDTO.getStationId()); + station.setAccount(stationDTO.getAccount()); + stationService.update(station); + return ServerResponseEntity.success(); + } + + @PutMapping("/change_account_info") + @Operation(summary = "账号密码设置", description = "账号密码设置") + public ServerResponseEntity changeAccountInfo(@RequestBody StationDTO stationDTO) { + // 检查是否有权限 + if (Objects.equals(stationDTO.getStationId(), Constant.ON_LINE_STATION_ID) && BooleanUtil.isFalse(permission)) { + throw new LuckException("没有权限进行操作"); + } + // 更新账号密码 + AuthAccountVO accountVO = accountFeignClient.getAccountInfoByTenantId(stationDTO.getStationId(), SysTypeEnum.STATION.value()).getData(); + if (accountVO == null) { + throw new LuckException("账号不存在"); + } + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + BeanUtils.copyProperties(accountVO, authAccountDTO); + authAccountDTO.setUsername(stationDTO.getAccount()); + authAccountDTO.setPassword(stationDTO.getPassword()); + authAccountDTO.setSysType(SysTypeEnum.STATION.value()); + accountFeignClient.update(authAccountDTO); + // 更新门店信息 + Station station = new Station(); + station.setStationId(stationDTO.getStationId()); + station.setAccount(stationDTO.getAccount()); + stationService.update(station); + return ServerResponseEntity.success(); + } + + @GetMapping("/check_station_account") + @Operation(summary = "校验账号") + @Parameters({ + @Parameter(name = "stationId", description = "自提点id"), + @Parameter(name = "account", description = "自提点账号") + }) + public ServerResponseEntity checkStationAccount(@RequestParam("stationId") Long stationId, + @RequestParam("account") String account) { + AuthAccountVO accountVO; + try { + accountVO = accountFeignClient.getAccountInfoByTenantId(stationId, SysTypeEnum.STATION.value()).getData(); + } catch (Exception e) { + accountVO = null; + } + Integer count = accountFeignClient.countByUserNameAndSysType(account, SysTypeEnum.STATION.value()).getData(); + count = (accountVO != null && accountVO.getUsername().equals(account)) ? count - 1 : count; + if (count > 0) { + return ServerResponseEntity.success(false); + } + return ServerResponseEntity.success(true); + } + + @GetMapping("/get_offline_handle_event/{stationId}") + @Operation(summary = "通过自提点id获取下线信息") + @Parameter(name = "stationId", description = "自提点id", required = true) + public ServerResponseEntity getOfflineHandleEventByStationId(@PathVariable("stationId") Long stationId) { + OfflineHandleEventVO offlineHandleEventVO = offlineHandleEventFeignClient.getProcessingEventByHandleTypeAndHandleId(OfflineHandleEventType.STATION.getValue(), stationId, null).getData(); + return ServerResponseEntity.success(offlineHandleEventVO); + } + + @PostMapping("/audit_apply") + @Operation(summary = "下线自提点提交审核") + public ServerResponseEntity auditApply(@RequestBody OfflineHandleEventDTO eventDTO) { + StationVO stationVO = stationService.getByStationId(eventDTO.getHandleId()); + if (stationVO == null) { + // 未找到该自提点信息 + throw new LuckException("未找到相应门店"); + } + offlineHandleEventFeignClient.updateToApply(eventDTO); + // 更新门店状态 + Station station = new Station(); + station.setStationId(eventDTO.getHandleId()); + station.setStatus(3); + stationService.update(station); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_station") + @Operation(summary = "获取自提点列表", description = "获取自提点列表") + public ServerResponseEntity> page() { + Long shopId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(stationService.listByShopId(shopId)); + } + + @PutMapping("/switch_station_stock_mode") + @Operation(summary = "切换门店库存模式", description = "切换门店库存模式") + @Parameters({ + @Parameter(name = "stationId", description = "门店id"), + @Parameter(name = "type", description = "更新共享库存模式(1同步到默认仓库 2库存清零)") + }) + public ServerResponseEntity switchStationStockMode(@RequestParam("stationId") Long stationId, @RequestParam(value = "type", required = false) Integer type) { + stationService.switchStationStockMode(stationId, type); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/DeliveryCompanyController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/DeliveryCompanyController.java new file mode 100644 index 0000000..c84e4e1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/platform/DeliveryCompanyController.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.platform; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.DeliveryCompanyDTO; +import com.tmerclub.cloud.delivery.model.DeliveryCompany; +import com.tmerclub.cloud.delivery.service.DeliveryCompanyService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Author lth + * @Date 2021/4/27 10:17 + */ +@RestController("platformDeliveryCompanyController") +@RequestMapping("/p/delivery_company") +@Tag(name = "物流公司") +public class DeliveryCompanyController { + + @Autowired + private DeliveryCompanyService deliveryCompanyService; + + + @DeleteMapping + @Operation(summary = "根据id删除物流公司信息", description = "根据id删除物流公司信息") + public ServerResponseEntity deleteById(@RequestParam("deliveryCompanyId") Long deliveryCompanyId) { + deliveryCompanyService.deleteById(deliveryCompanyId); + return ServerResponseEntity.success(); + } + + @PostMapping + @Operation(summary = "新增物流公司信息", description = "新增物流公司信息") + public ServerResponseEntity save(@Valid @RequestBody DeliveryCompanyDTO deliveryCompanyDTO) { + DeliveryCompany deliveryCompany = BeanUtil.map(deliveryCompanyDTO, DeliveryCompany.class); + deliveryCompanyService.save(deliveryCompany); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新物流信息", description = "更新物流信息") + public ServerResponseEntity update(@Valid @RequestBody DeliveryCompanyDTO deliveryCompanyDTO) { + DeliveryCompany deliveryCompany = BeanUtil.map(deliveryCompanyDTO, DeliveryCompany.class); + deliveryCompanyService.update(deliveryCompany); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/OutletConfigController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/OutletConfigController.java new file mode 100644 index 0000000..2abff28 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/OutletConfigController.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.supplier; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.OutletConfigDTO; +import com.tmerclub.cloud.delivery.model.OutletConfig; +import com.tmerclub.cloud.delivery.service.OutletConfigService; +import com.tmerclub.cloud.delivery.vo.OutletConfigInfoVO; +import com.tmerclub.cloud.delivery.vo.OutletConfigVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 网点配置 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +@RestController("supplierOutletConfigController") +@RequestMapping("/s/outlet_config") +@Tag(name = "供应商网点配置") +public class OutletConfigController { + + @Autowired + private OutletConfigService outletConfigService; + + @GetMapping("/page") + @Operation(summary = "获取网点配置列表", description = "分页获取网点配置列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, OutletConfigDTO outletConfigDTO) { + outletConfigDTO.setSupplierId(AuthUserContext.get().getTenantId()); + PageVO outletConfigPage = outletConfigService.page(pageDTO, outletConfigDTO); + return ServerResponseEntity.success(outletConfigPage); + } + + @GetMapping + @Operation(summary = "获取网点配置", description = "根据outletConfig获取网点配置") + public ServerResponseEntity getByOutletConfig(@RequestParam Long outletConfigId) { + OutletConfig outletConfig = outletConfigService.getByOutletConfig(outletConfigId, AuthUserContext.get().getSysType()); + if (StrUtil.isNotBlank(outletConfig.getMobile())) { + outletConfig.setMobile(PhoneUtil.hideBetween(outletConfig.getMobile()).toString()); + } + return ServerResponseEntity.success(outletConfig); + } + + @PostMapping + @Operation(summary = "保存网点配置", description = "保存网点配置") + public ServerResponseEntity save(@Valid @RequestBody OutletConfigDTO outletConfigDTO) { + OutletConfig outletConfig = BeanUtil.map(outletConfigDTO, OutletConfig.class); + outletConfig.setOutletConfigId(null); + outletConfig.setSupplierId(AuthUserContext.get().getTenantId()); + outletConfig.setShopId(null); + outletConfigService.save(outletConfig); + outletConfigService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新网点配置", description = "更新网点配置") + public ServerResponseEntity update(@Valid @RequestBody OutletConfigDTO outletConfigDTO) { + OutletConfig outletConfig = BeanUtil.map(outletConfigDTO, OutletConfig.class); + Long shopId = AuthUserContext.get().getTenantId(); + outletConfig.setSupplierId(shopId); + outletConfig.setShopId(null); + outletConfigService.update(outletConfig); + outletConfigService.removeCache(shopId, AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除网点配置", description = "根据网点配置id删除网点配置") + public ServerResponseEntity delete(@RequestParam Long outletConfigId) { + outletConfigService.deleteById(outletConfigId); + outletConfigService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_default") + @Operation(summary = "设网点信息为默认/取消默认") + public ServerResponseEntity setDefault(@RequestParam Long outletConfigId) { + outletConfigService.setDefault(outletConfigId); + outletConfigService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_outlet_config") + @Operation(summary = "获取网点信息列表") + public ServerResponseEntity> listOutletConfig() { + List list = outletConfigService.listByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/PrinterController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/PrinterController.java new file mode 100644 index 0000000..f4957f8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/controller/supplier/PrinterController.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.controller.supplier; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.dto.PrinterDTO; +import com.tmerclub.cloud.delivery.model.Printer; +import com.tmerclub.cloud.delivery.service.PrinterService; +import com.tmerclub.cloud.delivery.vo.PrinterVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 打印机 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +@RestController("supplierPrinterController") +@RequestMapping("/s/printer") +@Tag(name = "打印机") +public class PrinterController { + + @Autowired + private PrinterService printerService; + + @GetMapping("/page") + @Operation(summary = "获取打印机列表", description = "分页获取打印机列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, PrinterDTO printerDTO) { + printerDTO.setSupplierId(AuthUserContext.get().getTenantId()); + PageVO printerPage = printerService.page(pageDTO, printerDTO); + return ServerResponseEntity.success(printerPage); + } + + @GetMapping + @Operation(summary = "获取打印机", description = "根据printerId获取打印机") + public ServerResponseEntity getByPrinterId(@RequestParam Long printerId) { + return ServerResponseEntity.success(printerService.getByPrinterId(printerId)); + } + + @PostMapping + @Operation(summary = "保存打印机", description = "保存打印机") + public ServerResponseEntity save(@Valid @RequestBody PrinterDTO printerDTO) { + Printer printer = BeanUtil.map(printerDTO, Printer.class); + printer.setPrinterId(null); + printer.setShopId(null); + printer.setSupplierId(AuthUserContext.get().getTenantId()); + printerService.save(printer); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新打印机", description = "更新打印机") + public ServerResponseEntity update(@Valid @RequestBody PrinterDTO printerDTO) { + Printer printer = BeanUtil.map(printerDTO, Printer.class); + printer.setShopId(null); + printer.setSupplierId(AuthUserContext.get().getTenantId()); + printerService.update(printer); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除打印机", description = "根据打印机id删除打印机") + public ServerResponseEntity delete(@RequestParam Long printerId) { + printerService.deleteById(printerId); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping("/set_default") + @Operation(summary = "设打印机信息为默认/取消默认") + public ServerResponseEntity setDefault(@RequestParam Long printerId) { + printerService.setDefault(printerId); + printerService.removeCache(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_printer") + @Operation(summary = "获取打印机信息列表") + public ServerResponseEntity> listPrinter() { + List list = printerService.listByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/DeliveryCompanyDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/DeliveryCompanyDTO.java new file mode 100644 index 0000000..9ea9d09 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/DeliveryCompanyDTO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 物流公司DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryCompanyDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long deliveryCompanyId; + + @Schema(description = "物流公司名称") + private String name; + + @Schema(description = "公司主页") + private String homeUrl; + + @Schema(description = "物流公司编号(阿里)") + private String aliNo; + + @Schema(description = "物流公司编号(快递鸟)") + private String birdNo; + + @Schema(description = "物流公司编号(快递100)") + private String hundredNo; + + @Schema(description = "物流公司编号(其他不知名公司)") + private String otherNo; + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHomeUrl() { + return homeUrl; + } + + public void setHomeUrl(String homeUrl) { + this.homeUrl = homeUrl; + } + + public String getAliNo() { + return aliNo; + } + + public void setAliNo(String aliNo) { + this.aliNo = aliNo; + } + + public String getBirdNo() { + return birdNo; + } + + public void setBirdNo(String birdNo) { + this.birdNo = birdNo; + } + + public String getHundredNo() { + return hundredNo; + } + + public void setHundredNo(String hundredNo) { + this.hundredNo = hundredNo; + } + + public String getOtherNo() { + return otherNo; + } + + public void setOtherNo(String otherNo) { + this.otherNo = otherNo; + } + + @Override + public String toString() { + return "DeliveryCompanyDTO{" + + "deliveryCompanyId=" + deliveryCompanyId + + ",name=" + name + + ",homeUrl=" + homeUrl + + ",aliNo=" + aliNo + + ",birdNo=" + birdNo + + ",hundredNo=" + hundredNo + + ",otherNo=" + otherNo + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/OrderStationDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/OrderStationDTO.java new file mode 100644 index 0000000..9c71fdd --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/OrderStationDTO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.order.vo.OrderStationSpuDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户订单自提参数 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderStationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "自提门店id") + private Long stationId; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "门店名称") + private String stationName; + + @Schema(description = "店铺id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopId; + + + /** + * 用于门店库存判断 + */ + @Schema(description = "自提商品列表", requiredMode = Schema.RequiredMode.REQUIRED) + List stationSpuList; + + + @Schema(description = "分页参数", requiredMode = Schema.RequiredMode.REQUIRED) + private PageDTO pageDTO; + + /** + * 用于订单门店列表查询 + */ + @Schema(description = "自提门店id列表") + private List stationIds; + + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public List getStationSpuList() { + return stationSpuList; + } + + public void setStationSpuList(List stationSpuList) { + this.stationSpuList = stationSpuList; + } + + public PageDTO getPageDTO() { + return pageDTO; + } + + public void setPageDTO(PageDTO pageDTO) { + this.pageDTO = pageDTO; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public List getStationIds() { + return stationIds; + } + + public void setStationIds(List stationIds) { + this.stationIds = stationIds; + } + + @Override + public String toString() { + return "OrderStationDTO{" + + "stationId=" + stationId + + ", lat=" + lat + + ", lng=" + lng + + ", stationName='" + stationName + '\'' + + ", shopId=" + shopId + + ", stationSpuList=" + stationSpuList + + ", pageDTO=" + pageDTO + + ", stationIds=" + stationIds + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/OutletConfigDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/OutletConfigDTO.java new file mode 100644 index 0000000..27063a2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/OutletConfigDTO.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 网点配置DTO + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public class OutletConfigDTO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "网点配置id") + private Long outletConfigId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "快递公司类型") + private Integer deliveryCompanyType; + + @Schema(description = "发货地址id") + private Long shopAddrId; + + @Schema(description = "发货人") + private String shipper; + + @Schema(description = "发货人电话") + private String mobile; + + @Schema(description = "电子面单客户账户或月结账号") + private String partnerId; + + @Schema(description = "电子面单密码") + private String partnerKey; + + @Schema(description = "收件网点名称") + private String net; + + @Schema(description = "纸张规格 1.一联面单 2.二联面单") + private Integer paperSize; + + @Schema(description = "是否默认 0否1是") + private Integer isDefault; + + @Schema(description = "发货地址") + private String printAddr; + + public Long getOutletConfigId() { + return outletConfigId; + } + + public void setOutletConfigId(Long outletConfigId) { + this.outletConfigId = outletConfigId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getDeliveryCompanyType() { + return deliveryCompanyType; + } + + public void setDeliveryCompanyType(Integer deliveryCompanyType) { + this.deliveryCompanyType = deliveryCompanyType; + } + + public String getShipper() { + return shipper; + } + + public void setShipper(String shipper) { + this.shipper = shipper; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getPartnerId() { + return partnerId; + } + + public void setPartnerId(String partnerId) { + this.partnerId = partnerId; + } + + public String getPartnerKey() { + return partnerKey; + } + + public void setPartnerKey(String partnerKey) { + this.partnerKey = partnerKey; + } + + public String getNet() { + return net; + } + + public void setNet(String net) { + this.net = net; + } + + public Integer getPaperSize() { + return paperSize; + } + + public void setPaperSize(Integer paperSize) { + this.paperSize = paperSize; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getPrintAddr() { + return printAddr; + } + + public void setPrintAddr(String printAddr) { + this.printAddr = printAddr; + } + + public Long getShopAddrId() { + return shopAddrId; + } + + public void setShopAddrId(Long shopAddrId) { + this.shopAddrId = shopAddrId; + } + + @Override + public String toString() { + return "OutletConfigDTO{" + + "outletConfigId=" + outletConfigId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", deliveryCompanyType=" + deliveryCompanyType + + ", shopAddrId=" + shopAddrId + + ", shipper='" + shipper + '\'' + + ", mobile='" + mobile + '\'' + + ", partnerId='" + partnerId + '\'' + + ", partnerKey='" + partnerKey + '\'' + + ", net='" + net + '\'' + + ", paperSize=" + paperSize + + ", isDefault=" + isDefault + + ", printAddr='" + printAddr + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/PrinterDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/PrinterDTO.java new file mode 100644 index 0000000..7f889ef --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/PrinterDTO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +/** + * 打印机DTO + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public class PrinterDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "打印机id") + private Long printerId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "打印机名称") + @NotNull(message = "打印机名称不能为空") + private String printerName; + + @Schema(description = "设备码") + @NotNull(message = "设备码不能为空") + private String siid; + + @Schema(description = "打印机备注") + private String printerRemark; + + @Schema(description = "是否默认 0否1是") + private Integer isDefault; + + public Long getPrinterId() { + return printerId; + } + + public void setPrinterId(Long printerId) { + this.printerId = printerId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getPrinterName() { + return printerName; + } + + public void setPrinterName(String printerName) { + this.printerName = printerName; + } + + public String getSiid() { + return siid; + } + + public void setSiid(String siid) { + this.siid = siid; + } + + public String getPrinterRemark() { + return printerRemark; + } + + public void setPrinterRemark(String printerRemark) { + this.printerRemark = printerRemark; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + @Override + public String toString() { + return "PrinterDTO{" + + "printerId=" + printerId + + ",shopId=" + shopId + + ",supplierId=" + supplierId + + ",printerName=" + printerName + + ",siid=" + siid + + ",printerRemark=" + printerRemark + + ",isDefault=" + isDefault + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/SameCityDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/SameCityDTO.java new file mode 100644 index 0000000..ee1998d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/SameCityDTO.java @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import com.tmerclub.cloud.common.bean.BmapPoint; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 同城配送信息DTO + * + * @author FrozenWatermelon + * @date 2020-12-16 15:33:57 + */ +public class SameCityDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "同城配送") + private Long samecityId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "配送区域经纬度json") + private String positionInfo; + + @Schema(description = "收费类型 1按区域收取固定配送费 2按距离收取配送费") + private Integer chargeType; + + @Schema(description = "起送价 是优惠券/码和满减优惠抵扣前的商品金额,运费不计入起送价。") + private Long startFee; + + @Schema(description = "配送费") + private Long deliveryFee; + + @Schema(description = "默认距离(km)") + private Double defaultDistance; + + @Schema(description = "每超出距离(km)") + private Double overDistance; + + @Schema(description = "每超出距离费用") + private Long overDistanceFee; + + @Schema(description = "免费重量") + private Double freeWeight; + + @Schema(description = "续重重量") + private Double overWeight; + + @Schema(description = "续重费用") + private Long overWeightFee; + + @Schema(description = "启用状态 1启用 0未启用") + private Integer status; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "后台坐标点数组") + private List polygonPath; + + @Schema(description = "省ID") + @NotNull(message = "省ID不能为空") + private Long provinceId; + + @Schema(description = "省") + @NotBlank(message = "省名称不能为空") + private String province; + + @Schema(description = "城市ID") + @NotNull(message = "城市ID不能为空") + private Long cityId; + + @Schema(description = "城市") + @NotBlank(message = "城市名称不能为空") + private String city; + + @Schema(description = "区ID") + @NotNull(message = "区ID不能为空") + private Long areaId; + + @Schema(description = "区") + @NotBlank(message = "区名称不能为空") + private String area; + + @Schema(description = "详细地址") + @NotBlank(message = "详细地址不能为空") + @Length(min = 1, max = 50, message = "详细地址长度需要在1到50之间") + private String detailAddress; + + @Schema(description = "店铺所在经度") + private String shopLng; + + @Schema(description = "店铺所在纬度") + private String shopLat; + + public String getShopLng() { + return shopLng; + } + + public void setShopLng(String shopLng) { + this.shopLng = shopLng; + } + + public String getShopLat() { + return shopLat; + } + + public void setShopLat(String shopLat) { + this.shopLat = shopLat; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getDetailAddress() { + return detailAddress; + } + + public void setDetailAddress(String detailAddress) { + this.detailAddress = detailAddress; + } + + public Long getSamecityId() { + return samecityId; + } + + public void setSamecityId(Long samecityId) { + this.samecityId = samecityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getPositionInfo() { + return positionInfo; + } + + public void setPositionInfo(String positionInfo) { + this.positionInfo = positionInfo; + } + + public Integer getChargeType() { + return chargeType; + } + + public void setChargeType(Integer chargeType) { + this.chargeType = chargeType; + } + + public Long getStartFee() { + return startFee; + } + + public void setStartFee(Long startFee) { + this.startFee = startFee; + } + + public Long getDeliveryFee() { + return deliveryFee; + } + + public void setDeliveryFee(Long deliveryFee) { + this.deliveryFee = deliveryFee; + } + + public Double getDefaultDistance() { + return defaultDistance; + } + + public void setDefaultDistance(Double defaultDistance) { + this.defaultDistance = defaultDistance; + } + + public Double getOverDistance() { + return overDistance; + } + + public void setOverDistance(Double overDistance) { + this.overDistance = overDistance; + } + + public Long getOverDistanceFee() { + return overDistanceFee; + } + + public void setOverDistanceFee(Long overDistanceFee) { + this.overDistanceFee = overDistanceFee; + } + + public Double getFreeWeight() { + return freeWeight; + } + + public void setFreeWeight(Double freeWeight) { + this.freeWeight = freeWeight; + } + + public Double getOverWeight() { + return overWeight; + } + + public void setOverWeight(Double overWeight) { + this.overWeight = overWeight; + } + + public Long getOverWeightFee() { + return overWeightFee; + } + + public void setOverWeightFee(Long overWeightFee) { + this.overWeightFee = overWeightFee; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public List getPolygonPath() { + return polygonPath; + } + + public void setPolygonPath(List polygonPath) { + this.polygonPath = polygonPath; + } + + @Override + public String toString() { + return "SameCityDTO{" + + "samecityId=" + samecityId + + ", shopId=" + shopId + + ", positionInfo='" + positionInfo + '\'' + + ", chargeType=" + chargeType + + ", startFee=" + startFee + + ", deliveryFee=" + deliveryFee + + ", defaultDistance=" + defaultDistance + + ", overDistance=" + overDistance + + ", overDistanceFee=" + overDistanceFee + + ", freeWeight=" + freeWeight + + ", overWeight=" + overWeight + + ", overWeightFee=" + overWeightFee + + ", status=" + status + + ", lng=" + lng + + ", lat=" + lat + + ", polygonPath=" + polygonPath + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", detailAddress='" + detailAddress + '\'' + + ", shopLng='" + shopLng + '\'' + + ", shopLat='" + shopLat + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/StationDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/StationDTO.java new file mode 100644 index 0000000..3a36db2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/StationDTO.java @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 自提点信息DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class StationDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "自提点id") + private Long stationId; + + @Schema(description = "关联店铺id") + private Long shopId; + + @Schema(description = "自提点名称") + private String stationName; + + @Schema(description = "自提点图片") + private String imgUrl; + + @Schema(description = "电话区号") + private String mobilePrefix; + + @Schema(description = "手机/电话号码") + private String mobile; + + @Schema(description = "省ID") + private Long provinceId; + + @Schema(description = "省") + private String province; + + @Schema(description = "城市ID") + private Long cityId; + + @Schema(description = "城市") + private String city; + + @Schema(description = "区ID") + private Long areaId; + + @Schema(description = "区") + private String area; + + @Schema(description = "邮编") + private String postCode; + + @Schema(description = "地址") + private String addr; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + @Schema(description = "时间数据") + private String timeInfo; + + @Schema(description = "0:关闭 1:营业 2:强制关闭 3:审核中 4:审核失败") + private Integer status; + + @Schema(description = "账号名") + private String account; + + @Schema(description = "密码") + private String password; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺id集合") + private List shopIds; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "库存模式 参考StockModeEnum") + private Integer stockMode; + + public Integer getStockMode() { + return stockMode; + } + + public void setStockMode(Integer stockMode) { + this.stockMode = stockMode; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getShopIds() { + return shopIds; + } + + public void setShopIds(List shopIds) { + this.shopIds = shopIds; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getMobilePrefix() { + return mobilePrefix; + } + + public void setMobilePrefix(String mobilePrefix) { + this.mobilePrefix = mobilePrefix; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public String getTimeInfo() { + return timeInfo; + } + + public void setTimeInfo(String timeInfo) { + this.timeInfo = timeInfo; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return "StationDTO{" + + "stationId=" + stationId + + ", shopId=" + shopId + + ", stationName='" + stationName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", mobilePrefix='" + mobilePrefix + '\'' + + ", mobile='" + mobile + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", postCode='" + postCode + '\'' + + ", addr='" + addr + '\'' + + ", lng=" + lng + + ", lat=" + lat + + ", timeInfo='" + timeInfo + '\'' + + ", status=" + status + + ", account='" + account + '\'' + + ", password='" + password + '\'' + + ", shopName='" + shopName + '\'' + + ", shopIds=" + shopIds + + ", skuId=" + skuId + + ", stockMode=" + stockMode + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TranscityDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TranscityDTO.java new file mode 100644 index 0000000..aca5b61 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TranscityDTO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 运费项和运费城市关联信息DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TranscityDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long transcityId; + + @Schema(description = "运费项id") + private Long transfeeId; + + @Schema(description = "城市id") + private Long cityId; + + public Long getTranscityId() { + return transcityId; + } + + public void setTranscityId(Long transcityId) { + this.transcityId = transcityId; + } + + public Long getTransfeeId() { + return transfeeId; + } + + public void setTransfeeId(Long transfeeId) { + this.transfeeId = transfeeId; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + @Override + public String toString() { + return "TranscityDTO{" + + "transcityId=" + transcityId + + ",transfeeId=" + transfeeId + + ",cityId=" + cityId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransfeeFreeDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransfeeFreeDTO.java new file mode 100644 index 0000000..3a3705c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransfeeFreeDTO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 指定条件包邮项DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TransfeeFreeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "指定条件包邮项id") + private Long transfeeFreeId; + + @Schema(description = "运费模板id") + private Long transportId; + + @Schema(description = "包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮)") + private Integer freeType; + + @Schema(description = "需满金额") + private Long amount; + + @Schema(description = "包邮x件/重量/体积") + private Double piece; + + @Schema(description = "指定条件包邮城市项", requiredMode = Schema.RequiredMode.REQUIRED) + private List freeCityList; + + public List getFreeCityList() { + return freeCityList; + } + + public void setFreeCityList(List freeCityList) { + this.freeCityList = freeCityList; + } + + public Long getTransfeeFreeId() { + return transfeeFreeId; + } + + public void setTransfeeFreeId(Long transfeeFreeId) { + this.transfeeFreeId = transfeeFreeId; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public Integer getFreeType() { + return freeType; + } + + public void setFreeType(Integer freeType) { + this.freeType = freeType; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Double getPiece() { + return piece; + } + + public void setPiece(Double piece) { + this.piece = piece; + } + + @Override + public String toString() { + return "TransfeeFreeDTO{" + + "transfeeFreeId=" + transfeeFreeId + + ", transportId=" + transportId + + ", freeType=" + freeType + + ", amount=" + amount + + ", piece=" + piece + + ", freeCityList=" + freeCityList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransportDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransportDTO.java new file mode 100644 index 0000000..be5680b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/dto/TransportDTO.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 运费模板DTO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TransportDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "运费模板id") + private Long transportId; + + @Schema(description = "运费模板名称") + private String transName; + + /** + * 系统类型见SysTypeEnum 0.普通用户系统 1.商家端 2平台端 3供应商端 + */ + @Schema(description = "系统类型") + private Integer sysType; + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "收费方式(0 按件数,1 按重量 2 按体积)") + private Integer chargeType; + + @Schema(description = "是否包邮 0:不包邮 1:包邮") + private Integer isFreeFee; + + @Schema(description = "是否含有包邮条件 0 否 1是") + private Integer hasFreeCondition; + + @Schema(description = "指定条件包邮项") + private List transFeeFrees; + + @Schema(description = "运费项") + private List transFees; + + public List getTransFeeFrees() { + return transFeeFrees; + } + + public void setTransFeeFrees(List transFeeFrees) { + this.transFeeFrees = transFeeFrees; + } + + public List getTransFees() { + return transFees; + } + + public void setTransFees(List transFees) { + this.transFees = transFees; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public String getTransName() { + return transName; + } + + public void setTransName(String transName) { + this.transName = transName; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getChargeType() { + return chargeType; + } + + public void setChargeType(Integer chargeType) { + this.chargeType = chargeType; + } + + public Integer getIsFreeFee() { + return isFreeFee; + } + + public void setIsFreeFee(Integer isFreeFee) { + this.isFreeFee = isFreeFee; + } + + public Integer getHasFreeCondition() { + return hasFreeCondition; + } + + public void setHasFreeCondition(Integer hasFreeCondition) { + this.hasFreeCondition = hasFreeCondition; + } + + @Override + public String toString() { + return "TransportDTO{" + + "transportId=" + transportId + + ", transName='" + transName + '\'' + + ", sysType=" + sysType + + ", shopId=" + shopId + + ", chargeType=" + chargeType + + ", isFreeFee=" + isFreeFee + + ", hasFreeCondition=" + hasFreeCondition + + ", transFeeFrees=" + transFeeFrees + + ", transFees=" + transFees + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/DeliveryFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/DeliveryFeignController.java new file mode 100644 index 0000000..480119e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/feign/DeliveryFeignController.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.feign; + +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.delivery.vo.ShopTransportVO; +import com.tmerclub.cloud.api.user.feign.UserAddrFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.delivery.service.DeliveryOrderService; +import com.tmerclub.cloud.delivery.service.TransportService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/14 + */ +@DubboService +public class DeliveryFeignController implements DeliveryFeignClient { + private static final Logger logger = LoggerFactory.getLogger(DeliveryFeignController.class); + + + @DubboReference + private UserAddrFeignClient userAddrFeignClient; + + @Autowired + private TransportService transportService; + + @Autowired + private DeliveryOrderService deliveryOrderService; + + + @Autowired + private DeliveryManager deliveryManager; + + private static final long TWO = -2; + + + @Override + public ServerResponseEntity calculateAndGetDeliverInfo(CalculateAndGetDeliverInfoDTO param) { + return deliveryManager.calculateAndGetDeliverInfo(param); + } + + @Override + public ServerResponseEntity> listTransportByShopId(Long shopId) { + List list = transportService.listTransport(shopId); + return ServerResponseEntity.success(BeanUtil.mapAsList(list, ShopTransportVO.class)); + } + + @Override + public ServerResponseEntity> listTransportByIds(List transportIds) { + List list = transportService.listTransportByIds(transportIds); + return ServerResponseEntity.success(list); + } + + @Override + public ServerResponseEntity checkAddr(Long deliveryTemplateId, Long userId, Long addrId) { + if (deliveryTemplateId == null || addrId == null) { + logger.info("模板id或地址id为空,不校验"); + return ServerResponseEntity.success(false); + } + if (deliveryTemplateId == -1 || deliveryTemplateId == 0) { + logger.info("固定运费或包邮,不校验"); + return ServerResponseEntity.success(true); + } + TransportVO transportVO = transportService.getTransportAndAllItemsById(deliveryTemplateId); + return ServerResponseEntity.success(deliveryOrderService.checkAddr(transportVO, userId, addrId)); + } + + @Override + public ServerResponseEntity checkDeliveryRange(Long deliveryTemplateId, Long addrId) { + if (deliveryTemplateId == null || addrId == null) { + return ServerResponseEntity.success(false); + } + // 查询用户地址 + UserAddrVO addrVO = userAddrFeignClient.getUserAddrByAddrId(addrId).getData(); + if (addrVO == null) { + return ServerResponseEntity.success(false); + } + // 取出区域id,优先 区id -> 市id -> 省id + Long areaId; + if (addrVO.getAreaId() != null) { + areaId = addrVO.getAreaId(); + } else if (addrVO.getCityId() != null) { + areaId = addrVO.getCityId(); + } else if (addrVO.getProvinceId() != null) { + areaId = addrVO.getProvinceId(); + } else { + return ServerResponseEntity.success(false); + } + // 查询配送模板,并初步校验 + TransportVO transportVO = transportService.getTransportAndAllItemsById(deliveryTemplateId); + if (transportVO == null || transportVO.getTransFees() == null) { + return ServerResponseEntity.success(false); + } + if (transportVO.getIsFreeFee() == 1) { + return ServerResponseEntity.success(true); + } + // 获取可配送的区域id集合 + List areaList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (TransfeeVO transFee : transportVO.getTransFees()) { + areaList.addAll(transFee.getCityList()); + } + Set areaIds = areaList.stream().map(AreaVO::getAreaId).collect(Collectors.toSet()); + // 校验数据 + if (areaIds.contains(areaId)) { + return ServerResponseEntity.success(true); + } + return ServerResponseEntity.success(false); + } + + @Override + public TransportVO getTransportAndAllItemsById(Long deliveryTemplateId) { + return transportService.getTransportAndAllItemsById(deliveryTemplateId); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/DeliveryManager.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/DeliveryManager.java new file mode 100644 index 0000000..95c9688 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/DeliveryManager.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.manager; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.delivery.dto.ChangeOrderAddrDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryCompanyExcelVO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.order.manager.ConfirmOrderManager; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.user.feign.UserAddrFeignClient; +import com.tmerclub.cloud.api.user.feign.UserConsigneeFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.model.SameCity; +import com.tmerclub.cloud.delivery.service.*; +import com.tmerclub.cloud.delivery.service.*; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import com.tmerclub.cloud.order.mapper.OrderSelfStationMapper; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/14 + */ +@Component +public class DeliveryManager { + private static final Logger LOGGER = LoggerFactory.getLogger(DeliveryManager.class); + + + @Autowired + private SameCityService sameCityService; + @Autowired + private TransportManager transportManager; + @Autowired + private DeliveryOrderService deliveryOrderService; + @Autowired + private DeliveryCompanyService deliveryCompanyService; + @Autowired + private StationService stationService; + @Autowired + private TransportService transportService; + @Autowired + private OrderSelfStationMapper orderSelfStationMapper; + @DubboReference + private UserAddrFeignClient userAddrFeignClient; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private UserConsigneeFeignClient userConsigneeFeignClient; + @Autowired + private ConfirmOrderManager confirmOrderManager; + + private static final long TWO = -2; + + + public ServerResponseEntity calculateAndGetDeliverInfo(CalculateAndGetDeliverInfoDTO param) { + UserDeliveryInfoVO userDeliveryInfo = param.getUserDeliveryInfo(); + userDeliveryInfo.setSupplierIdWithShopTransFeeMap(new HashMap<>(16)); + if (CollectionUtil.isEmpty(userDeliveryInfo.getDvyTypes())) { + return ServerResponseEntity.success(userDeliveryInfo); + } + // 如果是自提的话,查询出用户使用的自提用户信息 + if (Objects.equals(userDeliveryInfo.getDvyTypes().get(0).getDvyType(), DeliveryType.STATION.value())) { + Map shopIdWithShopTransFee = new HashMap<>(16); + Map preSaleTransFeeMap = new HashMap<>(16); + ShopTransFeeVO shopTransFeeVO = new ShopTransFeeVO(); + shopTransFeeVO.setTransfee(0L); + shopTransFeeVO.setFreeTransfee(0L); + shopTransFeeVO.setDeliveryTemplateId(0L); + shopTransFeeVO.setSupplierId(0L); + shopIdWithShopTransFee.put(userDeliveryInfo.getDvyTypes().get(0).getShopId(), shopTransFeeVO); + userDeliveryInfo.setShopIdWithShopTransFee(shopIdWithShopTransFee); + userDeliveryInfo.setPreSaleTransFeeMap(preSaleTransFeeMap); + + // 没有自提地址了,统一使用用户地址 +// ServerResponseEntity userConsigneeResponse = userConsigneeFeignClient.getUseConsignee(); +// LOGGER.info("用户选择自提,获取用户自提信息,userConsigneeResponse:{}", userConsigneeResponse); +// if (!userConsigneeResponse.isSuccess()) { +// LOGGER.error("用户选择自提,获取用户自提信息失败,userConsigneeResponse:{}", userConsigneeResponse); +// return ServerResponseEntity.transform(userConsigneeResponse); +// } +// userDeliveryInfo.setUserConsignee(userConsigneeResponse.getData()); +// Long userId = AuthUserContext.get().getUserId(); +// List userStationList = orderSelfStationMapper.getUserStation(userId); +// userDeliveryInfo.setOrderSelfStation(userStationList); + userDeliveryInfo.setTotalFreeTransfee(0L); + return ServerResponseEntity.success(userDeliveryInfo); + } + + //多个店铺总运费 + long actualTransfee = 0; + //店铺可配送状态 + List shopCityStatusList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map dvyTypeMap = userDeliveryInfo.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + Map> shopCartItemsMap = param.getShopCartItems().stream().collect(Collectors.groupingBy(ShopCartItemVO::getShopId)); + //同城起送费 + Map shopStartDeliveryFees = new HashMap<>(Constant.INITIAL_CAPACITY); + + actualTransfee = getActualTransfee(userDeliveryInfo, actualTransfee, shopCityStatusList, dvyTypeMap, shopCartItemsMap, shopStartDeliveryFees); + userDeliveryInfo.setShopCityStatusVOS(shopCityStatusList); + userDeliveryInfo.setShopStartDeliveryFees(shopStartDeliveryFees); + actualTransfee = Math.max(actualTransfee, 0); + userDeliveryInfo.setTotalTransfee(actualTransfee); + return ServerResponseEntity.success(userDeliveryInfo); + } + + private long getActualTransfee(UserDeliveryInfoVO userDeliveryInfo, long actualTransfee, List shopCityStatusList, Map dvyTypeMap, Map> shopCartItemsMap, Map shopStartDeliveryFees) { + for (Map.Entry> shopKeyCartItemEntry : shopCartItemsMap.entrySet()) { + if (!dvyTypeMap.containsKey(shopKeyCartItemEntry.getKey())) { + LOGGER.error("店铺id:{}没有配送方式", shopKeyCartItemEntry.getKey()); + break; + } + int dvyType = dvyTypeMap.get(shopKeyCartItemEntry.getKey()); + long transfee = 0L; + ShopCityStatusVO shopCityStatusVO = new ShopCityStatusVO(); + shopCityStatusVO.setShopId(shopKeyCartItemEntry.getKey()); + shopStartDeliveryFees.put(shopKeyCartItemEntry.getKey(), 0L); + //同城配送运费计算 + if (Objects.equals(dvyType, DeliveryType.SAME_CITY.value())) { + // 一个店铺只获取一次同城信息,先 + SameCity sameCity = sameCityService.getSameCityByShopId(shopKeyCartItemEntry.getKey()); + LOGGER.info("同城配送运费计算,获取同城配送信息:{}", sameCity); + if (Objects.nonNull(sameCity)) { + shopStartDeliveryFees.put(shopKeyCartItemEntry.getKey(), sameCity.getStartFee()); + } + transfee = sameCityService.calculateTransFee(shopKeyCartItemEntry.getValue(), userDeliveryInfo); + LOGGER.info("同城配送运费计算结果:{}", transfee); + } + //快递运费计算 + if (Objects.equals(dvyType, DeliveryType.DELIVERY.value())) { + // 将所有订单传入处理,计算运费 + transfee = transportManager.calculateTransfee(shopKeyCartItemEntry.getValue(), userDeliveryInfo); + LOGGER.info("快递运费计算结果:{}", transfee); + + } + shopCityStatusVO.setShopCityStatus(transfee >= 0 ? 1 : (int) transfee); + shopCityStatusList.add(shopCityStatusVO); + transfee = Math.max(transfee, 0); + actualTransfee += transfee; + } + return actualTransfee; + } + + public void saveDeliveryInfo(DeliveryOrderDTO deliveryOrderDTO, Integer isPurchase, Integer unDeliveryNum) { + deliveryOrderService.saveDeliveryInfo(deliveryOrderDTO, isPurchase, unDeliveryNum); + } + + public List listDeliveryCompany() { + List list = deliveryCompanyService.list(); + return BeanUtil.mapAsList(list, DeliveryCompanyExcelVO.class); + } + + public Double getOrderChangeAddrAmount(ChangeOrderAddrDTO param) { + UserAddrVO userAddr = param.getUserAddrVO(); + double changeAmount; + Long freightAmount = param.getFreightAmount(); + List shopCartItems = param.getShopCartItems(); + long transFee = 0; + UserDeliveryInfoVO userDeliveryInfoVO = new UserDeliveryInfoVO(); + userDeliveryInfoVO.setUserAddr(userAddr); + if (Objects.equals(param.getDvyType(), DeliveryType.DELIVERY.value())) { + // 物流配送 + transFee = transportManager.calculateTransfee(shopCartItems, userDeliveryInfoVO); + LOGGER.info("快递配送,快递运费计算结果:{}", transFee); + } else if (Objects.equals(param.getDvyType(), DeliveryType.SAME_CITY.value())) { + // 同城配送 + transFee = sameCityService.calculateTransFee(shopCartItems, userDeliveryInfoVO); + if (transFee == TWO) { + throw new LuckException("当前店铺未开启同城配送!"); + } else if (transFee == -1) { + throw new LuckException("超出当前设置的配送距离!"); + } + } + return Arith.sub(transFee, freightAmount); + } + + public List listDeliveryCountByOrderIds(List orderIds) { + return deliveryOrderService.listDeliveryCountByOrderId(orderIds); + } + + public StationVO getStation(Long stationId) { + + return stationService.getByStationId(stationId); + } + + public UserDeliveryInfoVO getUserDeliveryInfoVO(List shopCartItems, Long userId, OrderDTO orderParam) { + UserDeliveryInfoVO userDeliveryInfoVO = confirmOrderManager.getUserDeliveryInfoVO(shopCartItems, userId, orderParam); + Map transportMap = new HashMap<>(Constant.INITIAL_CAPACITY); + + for (Long deliveryTemplateId : userDeliveryInfoVO.getDeliveryTemplateIds()) { + boolean transportExists = Objects.isNull(deliveryTemplateId) || deliveryTemplateId == 0 || deliveryTemplateId == -1 || transportMap.containsKey(deliveryTemplateId); + if (transportExists) { + continue; + } + TransportVO transportVO = transportService.getTransportAndAllItemsById(deliveryTemplateId); + if (Objects.nonNull(transportVO)) { + transportMap.put(deliveryTemplateId, transportVO); + } + } + userDeliveryInfoVO.setTransportMap(transportMap); + return userDeliveryInfoVO; + } + + public void handleStationOrder(ShopCartOrderMergerVO shopCartOrderMerger, List shopCartItems, UserDeliveryInfoVO userDeliveryInfoVO) { + Map orderStationSpuMap = confirmOrderManager.getStationOrderStockMap(shopCartItems, userDeliveryInfoVO); + if (MapUtil.isEmpty(orderStationSpuMap)) { + if (Objects.nonNull(userDeliveryInfoVO.getOrderSelfStation())) { + shopCartOrderMerger.setOrderSelfStation(userDeliveryInfoVO.getOrderSelfStation()); + } + return; + } + OrderSelfStationVO orderSelfStationVO = stationService.getOrderStation(userDeliveryInfoVO, new ArrayList<>(orderStationSpuMap.values())); + userDeliveryInfoVO.setStationId(orderSelfStationVO.getStationId()); + userDeliveryInfoVO.setOrderSelfStation(orderSelfStationVO); + shopCartOrderMerger.setOrderSelfStation(orderSelfStationVO); + if (Objects.nonNull(userDeliveryInfoVO.getStationId())) { + shopCartOrderMerger.setStationId(userDeliveryInfoVO.getStationId()); + + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/DeliveryPrintManager.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/DeliveryPrintManager.java new file mode 100644 index 0000000..4395384 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/DeliveryPrintManager.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.manager; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestAlgorithm; +import cn.hutool.crypto.digest.Digester; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.Quick100; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.delivery.bo.DeliveryPrintDataInfoBO; +import com.tmerclub.cloud.delivery.bo.DeliveryPrintInfoBO; +import com.tmerclub.cloud.delivery.bo.DeliveryPrintInfoErrorBO; +import com.tmerclub.cloud.delivery.constant.DeliveryCompanyType; +import com.tmerclub.cloud.delivery.model.OutletConfig; +import com.tmerclub.cloud.delivery.model.Printer; +import com.tmerclub.cloud.delivery.service.OutletConfigService; +import com.tmerclub.cloud.delivery.service.PrinterService; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.model.PurchaseOrderAddr; +import com.tmerclub.cloud.order.service.OrderAddrService; +import com.tmerclub.cloud.order.service.PurchaseOrderAddrService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +/** + * 电子面单接口 + * API接口调用无测试环境,但下单后不揽收不会计算快递费,快递公司对单号有一定的回收机制, + * 客户接口调试只需在订单内备注、寄件人或收件人等写明“测试”或“无需取件”字段。 + * @author TRACK + */ +@Component +public class DeliveryPrintManager { + private static final Logger logger = LoggerFactory.getLogger(DeliveryPrintManager.class); + private static final Integer MAX_CARGO_LENGTH = 20; + + @Autowired + private OutletConfigService outletConfigService; + @Autowired + private PrinterService printerService; + @Autowired + private OrderAddrService orderAddrService; + @Autowired + private FeignShopConfig shopConfig; + @Autowired + private PurchaseOrderAddrService purchaseOrderAddrService; + + private static final String METHOD = "order"; + private static final int MAP_INIT = 3; + public static final int SUCCESS_CODE = 200; + + public String deliveryPrint(DeliveryOrderDTO deliveryOrderDTO, Integer sysType, Integer isPurchase) { + Quick100 quick100 = shopConfig.getQuick100(); + // 检查配置 + checkInfo(deliveryOrderDTO, quick100); + // 网点配置 + OutletConfig outletConfig = outletConfigService.getByOutletConfig(deliveryOrderDTO.getOutletConfigId(), sysType); + // 打印机配置 + Printer printer = printerService.getByPrinterId(deliveryOrderDTO.getPrinterId()); + // 快递公司配置 + DeliveryCompanyType deliveryCompanyType = DeliveryCompanyType.instance(outletConfig.getDeliveryCompanyType()); + if (Objects.isNull(deliveryCompanyType)) { + throw new LuckException("网点关联快递公司配置为空"); + } + // 收件人信息 + Map recManMap; + if (Objects.equals(isPurchase, 1)) { + recManMap = getManInfoMap(deliveryOrderDTO.getConsignee(), deliveryOrderDTO.getMobile(), false, null, sysType, deliveryOrderDTO.getOrderAddrId(), ""); + } else { + recManMap = getManInfoMap(deliveryOrderDTO.getConsignee(), deliveryOrderDTO.getMobile(), false, deliveryOrderDTO.getOrderAddrId(), sysType, null, ""); + } + // 寄件人信息 + Map sendManMap = getManInfoMap(outletConfig.getShipper(), outletConfig.getMobile(), true, null, sysType, null, outletConfig.getPrintAddr()); + // 电子面单下单信息 + Map orderReqMap = getOrderReqMap(deliveryOrderDTO, outletConfig, printer, deliveryCompanyType, recManMap, sendManMap, quick100); + // 电子面单打印请求参数 + Map printReq = new HashMap<>(Constant.INITIAL_CAPACITY); + printReq.put("method", METHOD); + printReq.put("key", quick100.getKey()); + String param = JSON.toJSONString(orderReqMap); + String t = String.valueOf(System.currentTimeMillis()); + String sign = new Digester(DigestAlgorithm.MD5).digestHex(param + t + quick100.getKey() + quick100.getSecret(), "UTF-8").toUpperCase(Locale.ROOT); + printReq.put("sign", sign); + printReq.put("t", t); + printReq.put("param", param); + String repJson = HttpUtil.post(quick100.getPrintReqUrl(), printReq); + logger.info("电子面单请求返回:" + repJson); + DeliveryPrintInfoBO deliveryPrintInfoBO = Json.parseObject(repJson, DeliveryPrintInfoBO.class); + if (Objects.isNull(deliveryPrintInfoBO)) { + DeliveryPrintInfoErrorBO deliveryPrintInfoErrorBO = Json.parseObject(repJson, DeliveryPrintInfoErrorBO.class); + if (Objects.isNull(deliveryPrintInfoErrorBO)) { + throw new LuckException("电子面单请求错误,请检查配置是否正确"); + } + throw new LuckException(deliveryPrintInfoErrorBO.getMessage()); + } + if (!deliveryPrintInfoBO.getSuccess() || !Objects.equals(deliveryPrintInfoBO.getCode(), SUCCESS_CODE)) { + throw new LuckException(deliveryPrintInfoBO.getMessage()); + } + DeliveryPrintDataInfoBO deliveryPrintDataInfoBO = deliveryPrintInfoBO.getData(); + logger.info("电子面单:订单号{}--快递单号{}", deliveryOrderDTO.getOrderId(), deliveryPrintDataInfoBO.getKuaidinum()); + return deliveryPrintDataInfoBO.getKuaidinum(); + } + + private static void checkInfo(DeliveryOrderDTO deliveryOrderDTO, Quick100 quick100) { + if (Objects.isNull(quick100) || StrUtil.isBlank(quick100.getKey()) || StrUtil.isBlank(quick100.getSecret())) { + throw new LuckException("快递100配置为空或缺失"); + } + if (!quick100.getIsPrint()) { + throw new LuckException("平台未开启电子面单功能"); + } + if (Objects.isNull(deliveryOrderDTO.getOutletConfigId())) { + throw new LuckException("快递公司以及发货地址信息不能为空"); + } + if (Objects.isNull(deliveryOrderDTO.getPrinterId())) { + throw new LuckException("打印机信息不能为空"); + } + } + + private static Map getOrderReqMap(DeliveryOrderDTO deliveryOrderDTO, OutletConfig outletConfig, Printer printer, + DeliveryCompanyType deliveryCompanyType, Map recManMap, + Map sendManMap, Quick100 quick100) { + Map orderReqMap = new HashMap<>(Constant.INITIAL_CAPACITY); + // 电子面单客户账户或月结账号 + orderReqMap.put("partnerId", outletConfig.getPartnerId()); + // 电子面单密码 + orderReqMap.put("partnerKey", outletConfig.getPartnerKey()); + // 电子面单密钥 + orderReqMap.put("net", outletConfig.getNet()); + // 电子面单承载编号 + orderReqMap.put("code", deliveryCompanyType.getCode()); + // 快递公司编码 + orderReqMap.put("kuaidicom", deliveryCompanyType.getKuaidicom()); + orderReqMap.put("recMan", recManMap); + orderReqMap.put("sendMan", sendManMap); + // 包裹总数量 + orderReqMap.put("count", 1); + // 打印类型 默认云打印 + orderReqMap.put("printType", "CLOUD"); + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + for (DeliveryOrderItemDTO selectOrderItem : deliveryOrderDTO.getSelectOrderItems()) { + sb.append(selectOrderItem.getSpuName()).append(StrUtil.COMMA); + } + sb.deleteCharAt(sb.length() - 1); + String spuName = sb.toString(); + if (spuName.length() >= MAX_CARGO_LENGTH) { + spuName = spuName.substring(0, 16) + "..."; + } + // 物品名称 + orderReqMap.put("cargo", spuName); + // 快递100模板id + orderReqMap.put("tempId", DeliveryCompanyType.getTempId(outletConfig.getDeliveryCompanyType(), outletConfig.getPaperSize())); + // 打印设备 + orderReqMap.put("siid", printer.getSiid()); + // 沙箱模式,不会提交到快递公司 + if (quick100.getMock()) { + orderReqMap.put("mock", "kd100@Mock"); + } + return orderReqMap; + } + + private Map getManInfoMap(String name, String mobile, Boolean isShop, Long userAddrId, Integer sysType, Long purchaseOrderAddrId, String printAddr) { + Map manInfoMap = new HashMap<>(MAP_INIT); + // 姓名 + manInfoMap.put("name", name); + // 手机号 + manInfoMap.put("mobile", mobile); + // 所在完整地址 + if (Objects.nonNull(userAddrId)) { + OrderAddr orderAddr = orderAddrService.getById(userAddrId); + printAddr = orderAddr.getProvince() + orderAddr.getCity() + orderAddr.getArea() + orderAddr.getAddr(); + } else if (Objects.nonNull(purchaseOrderAddrId)) { + PurchaseOrderAddr purchaseOrderAddr = purchaseOrderAddrService.getById(purchaseOrderAddrId); + printAddr = purchaseOrderAddr.getProvince() + purchaseOrderAddr.getCity() + purchaseOrderAddr.getArea() + purchaseOrderAddr.getAddr(); + } + manInfoMap.put("printAddr", printAddr); + return manInfoMap; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/TransportManager.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/TransportManager.java new file mode 100644 index 0000000..e475416 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/manager/TransportManager.java @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.manager; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import com.tmerclub.cloud.api.delivery.constant.TransportChargeType; +import com.tmerclub.cloud.api.delivery.constant.TransportFreeType; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.delivery.service.TransportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + */ +@Component +public class TransportManager { + + @Autowired + private TransportService transportService; + + public long calculateTransfee(List shopCartItems, UserDeliveryInfoVO userDeliveryInfo) { + Map shopIdWithShopTransFee = new HashMap<>(16); + // 该店铺的供应商商品运费 + Map supplierIdWithShopTransFeeMap = new HashMap<>(16); + Map preSaleTransFeeMap; + if (MapUtil.isNotEmpty(userDeliveryInfo.getPreSaleTransFeeMap())) { + preSaleTransFeeMap = userDeliveryInfo.getPreSaleTransFeeMap(); + } else { + preSaleTransFeeMap = new HashMap<>(16); + } + + + // 商品的总运费 + long totalTransfee = 0L; + + // 1 去除没有店铺配送的订单和运费模板的订单 + List transPortList = removeNotTransPort(shopCartItems); + + if (CollectionUtil.isEmpty(transPortList)) { + return 0; + } + + Long shopId = shopCartItems.get(0).getShopId(); + + Map> shopCartItemsMap = transPortList.stream().collect(Collectors.groupingBy(ShopCartItemVO::getShopId)); + // 店铺id为key的购物项Map + for (Map.Entry> shopKeyCartItemEntry : shopCartItemsMap.entrySet()) { + List shopCartItemList = shopKeyCartItemEntry.getValue(); + // 进行二次拆分下,如果是全款预售商品,则单独运费计算 + Map> deliveryTemplateIdMap = new HashMap<>(16); + Map deliveryAmountMap = new HashMap<>(16); + for (ShopCartItemVO shopCartItemVO : shopCartItemList) { + Long deliverytKey = shopCartItemVO.getShopId(); + // 如果不是预售商品,跟之前一样 + if (Objects.equals(shopCartItemVO.getPreSaleType(), PreSaleType.DISABLE.value())) { + List deliveryShopCartItemList = new ArrayList<>(16); + if (Objects.equals(shopCartItemVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + deliverytKey = shopCartItemVO.getSupplierId(); + } + deliveryShopCartItemList = deliveryTemplateIdMap.getOrDefault(deliverytKey + "_" + shopCartItemVO.getDeliveryTemplateId(), new ArrayList<>(Constant.INITIAL_CAPACITY)); + deliveryShopCartItemList.add(shopCartItemVO); + String key; + // 因为可能存在多个固定运费的商品一起下单的情况,处理下key + if(Objects.equals(shopCartItemVO.getDeliveryTemplateId(),-1L)) { + key = deliverytKey + "_" + shopCartItemVO.getDeliveryTemplateId() + "_" + shopCartItemVO.getSpuId(); + }else{ + key = deliverytKey + "_" + shopCartItemVO.getDeliveryTemplateId(); + } + deliveryTemplateIdMap.put(key, deliveryShopCartItemList); + deliveryAmountMap.put(key, shopCartItemVO.getDeliveryAmount()); + continue; + } + // 如果是预售商品,则使用单独的key以便计算运费 + long key = -(shopCartItemVO.getDeliveryTemplateId() + shopCartItemVO.getSkuId()); + if (Objects.equals(shopCartItemVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + deliverytKey = shopCartItemVO.getSupplierId(); + } + deliveryTemplateIdMap.put(deliverytKey + "_" + key, Collections.singletonList(shopCartItemVO)); + deliveryAmountMap.put(deliverytKey + "_" + key, shopCartItemVO.getDeliveryAmount()); + } + // 运费模板id为key的购物项Map + for (Map.Entry> templateKeyShopCartItemEntry : deliveryTemplateIdMap.entrySet()) { + String[] keys = templateKeyShopCartItemEntry.getKey().split("_"); + Long deliveryTemplateId = Long.valueOf( keys[1]); + Long spuId = 0L; + if(Objects.equals(deliveryTemplateId, -1L) && keys.length > 2){ + spuId = Long.valueOf(keys[2]); + } + Long deliveryAmount = deliveryAmountMap.get(templateKeyShopCartItemEntry.getKey()); + List deliveryShopCartItems = templateKeyShopCartItemEntry.getValue(); + // 相同的运费模板,肯定供应商id也是一样的 + Long supplierId = deliveryShopCartItems.get(0).getSupplierId(); + Integer supplierDeliveryType = deliveryShopCartItems.get(0).getSupplierDeliveryType(); + // 运费模板的运费 + ShopTransFeeVO.DeliveryTemplateTransFee templateTransFee = this.repeatListTransfee(deliveryTemplateId, deliveryShopCartItems, userDeliveryInfo, deliveryAmount); + Long transfee = templateTransFee.getTransfee(); + Long freeTransfee = templateTransFee.getFreeTransfee(); + totalTransfee += transfee; + // 开始计算店铺的运费 + if (Objects.equals(supplierId, 0L) || Objects.equals(supplierId, -1L) || Objects.equals(supplierDeliveryType, SupplierDeliveryType.SHOP_DELIVERY.value())) { + handleShopTransFee(shopIdWithShopTransFee, preSaleTransFeeMap, shopId, deliveryTemplateId, deliveryShopCartItems, transfee, freeTransfee,spuId); + continue; + } + handleSupplierTransFee(supplierIdWithShopTransFeeMap, deliveryTemplateId, supplierId, transfee); + } + } + Map transFeeMap = userDeliveryInfo.getShopIdWithShopTransFee(); + if (Objects.nonNull(transFeeMap)) { + shopIdWithShopTransFee.putAll(transFeeMap); + } + userDeliveryInfo.setShopIdWithShopTransFee(shopIdWithShopTransFee); + if (Objects.isNull(userDeliveryInfo.getSupplierIdWithShopTransFeeMap())) { + userDeliveryInfo.setSupplierIdWithShopTransFeeMap(new HashMap<>(supplierIdWithShopTransFeeMap.size())); + } + userDeliveryInfo.getSupplierIdWithShopTransFeeMap().put(shopId, supplierIdWithShopTransFeeMap); + userDeliveryInfo.setPreSaleTransFeeMap(preSaleTransFeeMap); + return totalTransfee; + } + + private static void handleSupplierTransFee(Map supplierIdWithShopTransFeeMap, Long deliveryTemplateId, Long supplierId, Long transfee) { + // 开始计算供应商的运费 + ShopTransFeeVO supplierIdWithShopTransFee = supplierIdWithShopTransFeeMap.get(supplierId); + // 如果商家没有计算运费就初始化运费 + if (Objects.isNull(supplierIdWithShopTransFee)) { + supplierIdWithShopTransFee = new ShopTransFeeVO(); + supplierIdWithShopTransFee.setTransfee(transfee); + supplierIdWithShopTransFee.setSupplierId(supplierId); + supplierIdWithShopTransFee.setDeliveryTemplateId(deliveryTemplateId); + // 没有减免运费的计算 + supplierIdWithShopTransFee.setFreeTransfee(0L); + supplierIdWithShopTransFeeMap.put(supplierId, supplierIdWithShopTransFee); + } + // 累加非同一个运费模板的运费 + else if (!Objects.equals(supplierIdWithShopTransFee.getDeliveryTemplateId(), deliveryTemplateId)) { + supplierIdWithShopTransFee.setTransfee(transfee + supplierIdWithShopTransFee.getTransfee()); + supplierIdWithShopTransFee.setSupplierId(supplierId); + } + } + + private static void handleShopTransFee(Map shopIdWithShopTransFee, Map preSaleTransFeeMap, Long shopId, Long deliveryTemplateId, List deliveryShopCartItems, Long transfee, Long freeTransfee, Long spuId) { + ShopTransFeeVO shopTransFee = shopIdWithShopTransFee.get(shopId); + // 如果运费模板是-1且spuId不为0就表示为多个不同的固定运费的商品累加运费 + boolean addTransFee = !Objects.equals(spuId,0L) && Objects.equals(deliveryTemplateId,-1L); + // 如果商家没有计算运费就初始化运费 + if (Objects.isNull(shopTransFee)) { + shopTransFee = new ShopTransFeeVO(); + shopTransFee.setTransfee(transfee); + shopTransFee.setDeliveryTemplateId(deliveryTemplateId); + // 减免运费 + shopTransFee.setFreeTransfee(freeTransfee); + shopIdWithShopTransFee.put(shopId, shopTransFee); + } + // 累加非同一个运费模板的运费 + else if (!Objects.equals(shopTransFee.getDeliveryTemplateId(), deliveryTemplateId) || addTransFee) { + shopTransFee.setTransfee(transfee + shopTransFee.getTransfee()); + shopTransFee.setFreeTransfee(freeTransfee + shopTransFee.getFreeTransfee()); + } + // 如果运费模板为负数则表示是单独的预售商品 + if (deliveryTemplateId < 0) { + shopTransFee = new ShopTransFeeVO(); + shopTransFee.setTransfee(transfee); + shopTransFee.setDeliveryTemplateId(deliveryShopCartItems.get(0).getDeliveryTemplateId()); + // 没有减免运费的计算 + shopTransFee.setFreeTransfee(0L); + preSaleTransFeeMap.put(deliveryShopCartItems.get(0).getSkuId(), shopTransFee); + } + } + + /** + * 去除没有店铺后的订单 + * + * @param productItems 原用户所有的未处理订单 + * @return 有运费模板的订单 + */ + private List removeNotTransPort(List productItems) { + // 保存去掉没有运费模板重复的订单 + List resList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + for (ShopCartItemVO productItem : productItems) { + if (productItem.getDeliveryTemplateId() == null) { + continue; + } + resList.add(productItem); + } + return resList; + } + + + /** + * 计算出运费模板重复的订单运费 + * + * @param productItems 运费模板是重复的订单 + * @param userDeliveryInfo + * @return + */ + private ShopTransFeeVO.DeliveryTemplateTransFee repeatListTransfee(Long deliveryTemplateId, List productItems, UserDeliveryInfoVO userDeliveryInfo, Long deliveryAmount) { + UserAddrVO userAddr = userDeliveryInfo.getUserAddr(); + + // 商品运费模板 - 校验配送范围中存储的,优先从map中获取,没有再到mysql中查 + Map transportMap = userDeliveryInfo.getTransportMap(); + if (transportMap == null) { + transportMap = new HashMap<>(Constant.INITIAL_CAPACITY); + } + + ShopTransFeeVO.DeliveryTemplateTransFee templateTransFee = new ShopTransFeeVO.DeliveryTemplateTransFee(); + // 商品的件数 (总的件数) + int prodCount = 0; + // 商品的重量 + double totalWeight = 0.0; + // 商品的体积 + double totalVolume = 0.0; + // 商品总金额 + long totalAmount = 0; + + for (ShopCartItemVO productItem : productItems) { + prodCount += productItem.getCount(); + double itemTotalWeight = productItem.getWeight() == null ? 0 : productItem.getWeight().doubleValue(); + totalWeight += Arith.mul(itemTotalWeight, productItem.getCount()); + double itemTotalVolume = productItem.getVolume() == null ? 0 : productItem.getVolume().doubleValue(); + totalVolume += Arith.mul(itemTotalVolume, productItem.getCount()); + totalAmount += productItem.getTotalAmount(); + } + + if (Objects.isNull(userAddr)) { + templateTransFee.setTransfee(0L); + templateTransFee.setFreeTransfee(0L); + return templateTransFee; + } + // 用户所在区域的id + Long areaId = userAddr.getAreaId(); + // 如果为负数则表示是单独的预售商品 + if (deliveryTemplateId < 0) { + deliveryTemplateId = productItems.get(0).getDeliveryTemplateId(); + } + if (deliveryTemplateId == -1L) { + templateTransFee.setTransfee(prodCount * deliveryAmount); + templateTransFee.setFreeTransfee(0L); + return templateTransFee; + } + + if (deliveryTemplateId == 0) { + templateTransFee.setTransfee(0L); + templateTransFee.setFreeTransfee(0L); + return templateTransFee; + } + + //找出该产品的运费项 运费模板 + TransportVO transport = transportMap.get(deliveryTemplateId); + if (transport == null) { + transport = transportService.getTransportAndAllItemsById(deliveryTemplateId); + transportMap.put(deliveryTemplateId, transport); + } + //商家把运费模板删除 + if (Objects.isNull(transport)) { + templateTransFee.setTransfee(0L); + templateTransFee.setFreeTransfee(0L); + return templateTransFee; + } + + // 用于计算运费的件数 + double piece = 0.0; + + if (Objects.equals(TransportChargeType.COUNT.value(), transport.getChargeType())) { + // 按件数计算运费 + piece = prodCount; + } else if (Objects.equals(TransportChargeType.WEIGHT.value(), transport.getChargeType())) { + // 按重量计算运费 + piece = totalWeight; + } else if (Objects.equals(TransportChargeType.VOLUME.value(), transport.getChargeType())) { + // 按体积计算运费 + piece = totalVolume; + } + // 运费模板运费 + long transfee = getTransfee(areaId, transport, piece); + templateTransFee.setTransfee(transfee); + templateTransFee.setFreeTransfee(0L); + + //如果有包邮的条件 + if (transport.getHasFreeCondition() == 1) { + // 获取所有的包邮条件 + List transfeeFrees = transport.getTransFeeFrees(); + for (TransfeeFreeVO transfeeFree : transfeeFrees) { + List freeCityList = transfeeFree.getFreeCityList(); + for (AreaVO freeCity : freeCityList) { + if (!Objects.equals(freeCity.getAreaId(), areaId)) { + continue; + } + //包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮) + boolean isFree = (Objects.equals(transfeeFree.getFreeType(), TransportFreeType.COUNT.value()) && piece >= transfeeFree.getPiece()) || + (Objects.equals(transfeeFree.getFreeType(), TransportFreeType.AMOUNT.value()) && totalAmount >= transfeeFree.getAmount()) || + (Objects.equals(transfeeFree.getFreeType(), TransportFreeType.COUNT_AND_AMOUNT.value()) && piece >= transfeeFree.getPiece() && totalAmount >= transfeeFree.getAmount()); + if (isFree) { + templateTransFee.setFreeTransfee(templateTransFee.getTransfee()); + templateTransFee.setTransfee(0L); + } + } + } + } + return templateTransFee; + } + + private long getTransfee(Long areaId, TransportVO transport, double piece) { + TransfeeVO transfee = null; + List transfees = transport.getTransFees(); + for (TransfeeVO dbTransfee : transfees) { + // 将该商品的运费设置为默认运费 + if (transfee == null && CollectionUtil.isEmpty(dbTransfee.getCityList())) { + transfee = dbTransfee; + } + // 如果在运费模板中的城市找到该商品的运费,则将该商品由默认运费设置为该城市的运费 + boolean isContainer = dbTransfee.getCityList().stream().anyMatch(area -> area.getAreaId().equals(areaId)); + if (isContainer) { + transfee = dbTransfee; + break; + } + // 如果在运费模板中的城市找到该商品的运费,则退出整个循环 + if (transfee != null && CollectionUtil.isNotEmpty(transfee.getCityList())) { + break; + } + } + + // 如果无法获取到任何运费相关信息,则返回0运费 + if (transfee == null) { + return 0L; + } + // 产品的运费 + long fee = transfee.getFirstFee(); + // 如果件数大于首件数量,则开始计算超出的运费 + if (piece > transfee.getFirstPiece()) { + // 续件数量 + double prodContinuousPiece = Arith.sub(piece, transfee.getFirstPiece()); + // 续件数量的倍数,向上取整 + int mulNumber = (int) Math.ceil(Arith.div(prodContinuousPiece, transfee.getContinuousPiece())); + // 续件数量运费 + long continuousFee = mulNumber * transfee.getContinuousFee(); + fee += continuousFee; + } + return fee; + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/AreaMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/AreaMapper.java new file mode 100644 index 0000000..c28bd02 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/AreaMapper.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.delivery.model.Area; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 省市区地区信息 + * + * @author YXF + * @date 2020-11-25 15:10:06 + */ +public interface AreaMapper { + + /** + * 获取省市区地区信息列表 + * + * @return 省市区地区信息列表 + * @param areaDTO + */ + List list(@Param("areaDTO") AreaDTO areaDTO); + + /** + * 根据省市区地区信息id获取省市区地区信息 + * + * @param areaId 省市区地区信息id + * @return 省市区地区信息 + */ + AreaVO getByAreaId(@Param("areaId") Long areaId); + + /** + * 保存省市区地区信息 + * + * @param area 省市区地区信息 + */ + void save(@Param("area") Area area); + + /** + * 更新省市区地区信息 + * + * @param area 省市区地区信息 + */ + void update(@Param("area") Area area); + + /** + * 根据省市区地区信息id删除省市区地区信息 + * + * @param areaId + */ + void deleteById(@Param("areaId") Long areaId); + + /** + * 获取该地址id下的下级地址数量 + * + * @param areaId + * @return + */ + int countByAreaId(@Param("areaId") Long areaId); + + /** + * 根据上级分类id获取下级地址列表 + * + * @param pid + * @return + */ + List listByPid(@Param("pid") Long pid); + + /** + * 获取省市区三级结构完整的集合 + * + * @return 省市区三级结构完整的集合 + */ + List getAreaListInfo(); + + /** + * 获取可用的省市区列表 + * @return + */ + List listAreaOfEnable(); + + /** + * 查询相同上级的当前地区名称数量 + * @param areaName 地区名称 + * @param level 层级 + * @param parentId 父级地区id + * @param areaId 地区id + * @return 数量 + */ + Integer countByNameAndParentId(@Param("areaName") String areaName, @Param("level") Integer level, + @Param("parentId") Long parentId, @Param("areaId") Long areaId); + + + /** + * 根据id获取列表 + * @param areaIdList + * @return + */ + List listByAreaIdList(@Param("areaIdList") List areaIdList); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/PrinterMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/PrinterMapper.java new file mode 100644 index 0000000..acf6b4c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/PrinterMapper.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.delivery.dto.PrinterDTO; +import com.tmerclub.cloud.delivery.model.Printer; +import com.tmerclub.cloud.delivery.vo.PrinterVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 打印机 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public interface PrinterMapper { + + /** + * 获取打印机列表 + * @param printerDTO + * @return 打印机列表 + */ + List list(@Param("printer")PrinterDTO printerDTO); + + /** + * 根据打印机id获取打印机 + * + * @param printerId 打印机id + * @return 打印机 + */ + Printer getByPrinterId(@Param("printerId") Long printerId); + + /** + * 保存打印机 + * @param printer 打印机 + */ + void save(@Param("printer") Printer printer); + + /** + * 更新打印机 + * @param printer 打印机 + */ + void update(@Param("printer") Printer printer); + + /** + * 根据打印机id删除打印机 + * @param printerId + */ + void deleteById(@Param("printerId") Long printerId); + + /** + * 取消默认 + * @param shopId + * @param supplierId + */ + void cancelDefault(@Param("shopId") Long shopId, @Param("supplierId") Long supplierId); + + /** + * 设为/取消默认 + * @param printerId + */ + void setDefault(@Param("printerId") Long printerId); + + /** + * 获取店铺打印机列表 + * @param shopId + * @param sysType + * @return + */ + List listByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 校验名称 + * @param shopId + * @param supplierId + * @param name + * @param printerId + * @return + */ + int countByName(@Param("shopId") Long shopId, @Param("supplierId") Long supplierId, + @Param("name") String name, @Param("printerId") Long printerId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/SameCityMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/SameCityMapper.java new file mode 100644 index 0000000..e1abd4b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/SameCityMapper.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.delivery.model.SameCity; +import org.apache.ibatis.annotations.Param; + +/** + * 同城配送信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface SameCityMapper { + + /** + * 保存同城配送信息 + * + * @param sameCity 同城配送信息 + */ + void save(@Param("sameCity") SameCity sameCity); + + /** + * 更新同城配送信息 + * + * @param sameCity 同城配送信息 + */ + void updateByShopId(@Param("sameCity") SameCity sameCity); + + /** + * 根据店铺id获取同城配送信息 + * + * @param shopId 店铺id + * @return 同城配送信息 + */ + SameCity getByShopId(@Param("shopId") Long shopId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TranscityFreeMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TranscityFreeMapper.java new file mode 100644 index 0000000..d23a5fe --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TranscityFreeMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.delivery.model.TranscityFree; +import com.tmerclub.cloud.delivery.vo.TranscityFreeVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 指定条件包邮城市项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TranscityFreeMapper { + + /** + * 获取指定条件包邮城市项列表 + * @return 指定条件包邮城市项列表 + */ + List list(); + + /** + * 根据指定条件包邮城市项id获取指定条件包邮城市项 + * + * @param transcityFreeId 指定条件包邮城市项id + * @return 指定条件包邮城市项 + */ + TranscityFreeVO getByTranscityFreeId(@Param("transcityFreeId") Long transcityFreeId); + + /** + * 保存指定条件包邮城市项 + * @param transcityFree 指定条件包邮城市项 + */ + void save(@Param("transcityFree") TranscityFree transcityFree); + + /** + * 更新指定条件包邮城市项 + * @param transcityFree 指定条件包邮城市项 + */ + void update(@Param("transcityFree") TranscityFree transcityFree); + + /** + * 根据指定条件包邮城市项id删除指定条件包邮城市项 + * @param transcityFreeId + */ + void deleteById(@Param("transcityFreeId") Long transcityFreeId); + + /** + * 批量保存包邮项关联城市信息 + * @param transCityFrees 关联信息 + */ + void saveBatch(@Param("transCityFrees") List transCityFrees); + + /** + * 删除所有指定包邮条件项包含的城市 + * @param transFeeFreeIds 包邮项id + */ + void deleteBatchByTransFeeFreeIds(@Param("transFeeFreeIds") List transFeeFreeIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransfeeFreeMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransfeeFreeMapper.java new file mode 100644 index 0000000..32d7203 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransfeeFreeMapper.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.common.order.vo.TransfeeFreeVO; +import com.tmerclub.cloud.delivery.dto.TransfeeFreeDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 指定条件包邮项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TransfeeFreeMapper { + + /** + * 获取指定条件包邮项列表 + * @return 指定条件包邮项列表 + */ + List list(); + + /** + * 根据指定条件包邮项id获取指定条件包邮项 + * + * @param transfeeFreeId 指定条件包邮项id + * @return 指定条件包邮项 + */ + TransfeeFreeVO getByTransfeeFreeId(@Param("transfeeFreeId") Long transfeeFreeId); + + /** + * 批量插入运费包邮条件项项 + * @param transFeeFrees 包邮条件 + */ + void saveBatch(@Param("transFeeFrees") List transFeeFrees); + + /** + * 根据运费id删除所有的指定包邮条件项 + * @param transportId 运费id + */ + void deleteTransFeeFreesByTransportId(@Param("transportId") Long transportId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransfeeMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransfeeMapper.java new file mode 100644 index 0000000..85f2e80 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransfeeMapper.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.common.order.vo.TransfeeVO; +import com.tmerclub.cloud.delivery.dto.TransfeeDTO; +import com.tmerclub.cloud.delivery.model.Transfee; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 运费项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TransfeeMapper { + + /** + * 获取运费项列表 + * @return 运费项列表 + */ + List list(); + + /** + * 根据运费项id获取运费项 + * + * @param transfeeId 运费项id + * @return 运费项 + */ + TransfeeVO getByTransfeeId(@Param("transfeeId") Long transfeeId); + + /** + * 保存运费项 + * @param transfee 运费项 + */ + void save(@Param("transfee") Transfee transfee); + + /** + * 更新运费项 + * @param transfee 运费项 + */ + void update(@Param("transfee") Transfee transfee); + + /** + * 根据运费项id删除运费项 + * @param transfeeId + */ + void deleteById(@Param("transfeeId") Long transfeeId); + + /** + * 批量插入运费项 + * @param transFees + */ + void saveBatch(@Param("transFees") List transFees); + + /** + * 根据运费id删除所有的运费项 + * @param transportId 运费id + */ + void deleteByTransportId(@Param("transportId") Long transportId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransportMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransportMapper.java new file mode 100644 index 0000000..fa698f1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/mapper/TransportMapper.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.mapper; + +import com.tmerclub.cloud.api.delivery.vo.ShopTransportVO; +import com.tmerclub.cloud.common.order.vo.TransfeeFreeVO; +import com.tmerclub.cloud.common.order.vo.TransportVO; +import com.tmerclub.cloud.delivery.dto.TransportDTO; +import com.tmerclub.cloud.delivery.model.Transport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 运费模板 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TransportMapper { + + /** + * 获取运费模板列表 + * + * @param transportDTO + * @return 运费模板列表 + */ + List list(@Param("transportDTO") TransportDTO transportDTO); + + /** + * 保存运费模板 + * + * @param transport 运费模板 + */ + void save(@Param("transport") Transport transport); + + /** + * 更新运费模板 + * + * @param transport 运费模板 + */ + void updateById(@Param("transport") Transport transport); + + /** + * 根据运费模板id删除运费模板 + * + * @param transportId + */ + void deleteById(@Param("transportId") Long transportId); + + /** + * 根据运费模板id获取运费模板和运费项及对应城市 + * + * @param transportId 运费模板id + * @return + */ + TransportVO getTransportAndTransfeeAndTranscityById(@Param("transportId") Long transportId); + + /** + * 根据运费模板id获取运费包邮项及对应城市 + * + * @param transportId 运费模板id + * @return + */ + List getTransFeeFreeAndTransCityFreeByTransportId(@Param("transportId") Long transportId); + + /** + * 根据店铺id获取所有的运费模板列表 + * + * @param tenantId + * @param sysType + * @return + */ + List listTransport(@Param("tenantId") Long tenantId, @Param("sysType") Integer sysType); + + /** + * 统计该运费模板名称使用的数量 + * + * @param shopId 店铺id + * @param transName 运费模板名称 + * @param sysType 系统类型 + * @param transportId 运费模板id + * @return 使用的数量 + */ + int countByTransName(@Param("shopId") Long shopId, @Param("transName") String transName, @Param("sysType") Integer sysType, @Param("transportId") Long transportId); + + /** + * 统计该店铺下的包邮模板数量 + * + * @param isFreeFee + * @param shopId + * @param sysType + * @return + */ + int countByFreeAndShopId(@Param("isFreeFee") Integer isFreeFee, + @Param("shopId") Long shopId, + @Param("sysType") Integer sysType, + @Param("transportId") Long transportId); + + /** + * 获取运费模板列表 + * @param ids + * @return + */ + List listTransportByIds(@Param("ids") List ids); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Area.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Area.java new file mode 100644 index 0000000..aa68f69 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Area.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 省市区地区信息 + * + * @author YXF + * @date 2020-11-25 15:16:14 + */ +public class Area extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long areaId; + + /** + * 地址 + */ + private String areaName; + + /** + * 上级地址 + */ + private Long parentId; + + /** + * 等级(从1开始) + */ + private Integer level; + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + @Override + public String toString() { + return "Area{" + + "areaId=" + areaId + + ",areaName=" + areaName + + ",parentId=" + parentId + + ",level=" + level + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryCompany.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryCompany.java new file mode 100644 index 0000000..722157a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/DeliveryCompany.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 物流公司 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryCompany extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ID + */ + private Long deliveryCompanyId; + + /** + * 物流公司名称 + */ + private String name; + + /** + * 公司主页 + */ + private String homeUrl; + + /** + * 物流公司编号(阿里) + */ + private String aliNo; + + /** + * 物流公司编号(快递鸟) + */ + private String birdNo; + + /** + * 物流公司编号(快递100) + */ + private String hundredNo; + + /** + * 物流公司编号(其他不知名公司) + */ + private String otherNo; + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHomeUrl() { + return homeUrl; + } + + public void setHomeUrl(String homeUrl) { + this.homeUrl = homeUrl; + } + + public String getAliNo() { + return aliNo; + } + + public void setAliNo(String aliNo) { + this.aliNo = aliNo; + } + + public String getBirdNo() { + return birdNo; + } + + public void setBirdNo(String birdNo) { + this.birdNo = birdNo; + } + + public String getHundredNo() { + return hundredNo; + } + + public void setHundredNo(String hundredNo) { + this.hundredNo = hundredNo; + } + + public String getOtherNo() { + return otherNo; + } + + public void setOtherNo(String otherNo) { + this.otherNo = otherNo; + } + + @Override + public String toString() { + return "DeliveryCompany{" + + "deliveryCompanyId=" + deliveryCompanyId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",name=" + name + + ",homeUrl=" + homeUrl + + ",aliNo=" + aliNo + + ",birdNo=" + birdNo + + ",hundredNo=" + hundredNo + + ",otherNo=" + otherNo + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/OutletConfig.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/OutletConfig.java new file mode 100644 index 0000000..9dd5cb5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/OutletConfig.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; + +/** + * 网点配置 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public class OutletConfig extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 网点配置id + */ + private Long outletConfigId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 快递公司类型 + */ + private Integer deliveryCompanyType; + + /** + * 发货人 + */ + private String shipper; + + /** + * 发货人电话 + */ + private String mobile; + + /** + * 电子面单客户账户或月结账号 + */ + private String partnerId; + + /** + * 电子面单密码 + */ + private String partnerKey; + + /** + * 收件网点名称 + */ + private String net; + + /** + * 纸张规格 1.一联面单 2.二联面单 + */ + private Integer paperSize; + + /** + * 是否默认 0否1是 + */ + private Integer isDefault; + + /** + * 发货地址 + */ + private String printAddr; + + /** + * 发货地址id + */ + private Long shopAddrId; + + public Long getOutletConfigId() { + return outletConfigId; + } + + public void setOutletConfigId(Long outletConfigId) { + this.outletConfigId = outletConfigId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getDeliveryCompanyType() { + return deliveryCompanyType; + } + + public void setDeliveryCompanyType(Integer deliveryCompanyType) { + this.deliveryCompanyType = deliveryCompanyType; + } + + public String getShipper() { + return shipper; + } + + public void setShipper(String shipper) { + this.shipper = shipper; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getPartnerId() { + return partnerId; + } + + public void setPartnerId(String partnerId) { + this.partnerId = partnerId; + } + + public String getPartnerKey() { + return partnerKey; + } + + public void setPartnerKey(String partnerKey) { + this.partnerKey = partnerKey; + } + + public String getNet() { + return net; + } + + public void setNet(String net) { + this.net = net; + } + + public Integer getPaperSize() { + return paperSize; + } + + public void setPaperSize(Integer paperSize) { + this.paperSize = paperSize; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getPrintAddr() { + return printAddr; + } + + public void setPrintAddr(String printAddr) { + this.printAddr = printAddr; + } + + public Long getShopAddrId() { + return shopAddrId; + } + + public void setShopAddrId(Long shopAddrId) { + this.shopAddrId = shopAddrId; + } + + @Override + public String toString() { + return "OutletConfig{" + + "outletConfigId=" + outletConfigId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", deliveryCompanyType=" + deliveryCompanyType + + ", shipper='" + shipper + '\'' + + ", mobile='" + mobile + '\'' + + ", partnerId='" + partnerId + '\'' + + ", partnerKey='" + partnerKey + '\'' + + ", net='" + net + '\'' + + ", paperSize=" + paperSize + + ", isDefault=" + isDefault + + ", printAddr='" + printAddr + '\'' + + ", shopAddrId=" + shopAddrId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Printer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Printer.java new file mode 100644 index 0000000..2895d21 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Printer.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; +/** + * 打印机 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public class Printer extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 打印机id + */ + private Long printerId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 打印机名称 + */ + private String printerName; + + /** + * 设备码 + */ + private String siid; + + /** + * 打印机备注 + */ + private String printerRemark; + + /** + * 是否默认 0否1是 + */ + private Integer isDefault; + + public Long getPrinterId() { + return printerId; + } + + public void setPrinterId(Long printerId) { + this.printerId = printerId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getPrinterName() { + return printerName; + } + + public void setPrinterName(String printerName) { + this.printerName = printerName; + } + + public String getSiid() { + return siid; + } + + public void setSiid(String siid) { + this.siid = siid; + } + + public String getPrinterRemark() { + return printerRemark; + } + + public void setPrinterRemark(String printerRemark) { + this.printerRemark = printerRemark; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + @Override + public String toString() { + return "Printer{" + + "printerId=" + printerId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",supplierId=" + supplierId + + ",printerName=" + printerName + + ",siid=" + siid + + ",printerRemark=" + printerRemark + + ",isDefault=" + isDefault + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/SameCity.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/SameCity.java new file mode 100644 index 0000000..52e303b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/SameCity.java @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 同城配送信息 + * + * @author FrozenWatermelon + * @date 2020-12-16 15:33:57 + */ +public class SameCity extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 同城配送 + */ + private Long samecityId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 配送区域经纬度json + */ + private String positionInfo; + + /** + * 收费类型 1按区域收取固定配送费 2按距离收取配送费 + */ + private Integer chargeType; + + /** + * 起送价 是优惠券/码和满减优惠抵扣前的商品金额,运费不计入起送价。 + */ + private Long startFee; + + /** + * 配送费 + */ + private Long deliveryFee; + + /** + * 默认距离(km) + */ + private Double defaultDistance; + + /** + * 每超出距离(km) + */ + private Double overDistance; + + /** + * 每超出距离费用 + */ + private Long overDistanceFee; + + /** + * 免费重量 + */ + private Double freeWeight; + + /** + * 续重重量 + */ + private Double overWeight; + + /** + * 续重费用 + */ + private Long overWeightFee; + + /** + * 启用状态 1启用 0未启用 + */ + private Integer status; + + /** + * 经度 + */ + private Double lng; + + /** + * 纬度 + */ + private Double lat; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 详细地址 + */ + private String detailAddress; + + /** + * 店铺所在经度 + */ + private String shopLng; + + /** + * 店铺所在纬度 + */ + private String shopLat; + + public String getShopLng() { + return shopLng; + } + + public void setShopLng(String shopLng) { + this.shopLng = shopLng; + } + + public String getShopLat() { + return shopLat; + } + + public void setShopLat(String shopLat) { + this.shopLat = shopLat; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getDetailAddress() { + return detailAddress; + } + + public void setDetailAddress(String detailAddress) { + this.detailAddress = detailAddress; + } + + public Long getSamecityId() { + return samecityId; + } + + public void setSamecityId(Long samecityId) { + this.samecityId = samecityId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getPositionInfo() { + return positionInfo; + } + + public void setPositionInfo(String positionInfo) { + this.positionInfo = positionInfo; + } + + public Integer getChargeType() { + return chargeType; + } + + public void setChargeType(Integer chargeType) { + this.chargeType = chargeType; + } + + public Long getStartFee() { + return startFee; + } + + public void setStartFee(Long startFee) { + this.startFee = startFee; + } + + public Long getDeliveryFee() { + return deliveryFee; + } + + public void setDeliveryFee(Long deliveryFee) { + this.deliveryFee = deliveryFee; + } + + public Double getDefaultDistance() { + return defaultDistance; + } + + public void setDefaultDistance(Double defaultDistance) { + this.defaultDistance = defaultDistance; + } + + public Double getOverDistance() { + return overDistance; + } + + public void setOverDistance(Double overDistance) { + this.overDistance = overDistance; + } + + public Long getOverDistanceFee() { + return overDistanceFee; + } + + public void setOverDistanceFee(Long overDistanceFee) { + this.overDistanceFee = overDistanceFee; + } + + public Double getFreeWeight() { + return freeWeight; + } + + public void setFreeWeight(Double freeWeight) { + this.freeWeight = freeWeight; + } + + public Double getOverWeight() { + return overWeight; + } + + public void setOverWeight(Double overWeight) { + this.overWeight = overWeight; + } + + public Long getOverWeightFee() { + return overWeightFee; + } + + public void setOverWeightFee(Long overWeightFee) { + this.overWeightFee = overWeightFee; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "SameCity{" + + "samecityId=" + samecityId + + ", shopId=" + shopId + + ", positionInfo='" + positionInfo + '\'' + + ", chargeType=" + chargeType + + ", startFee=" + startFee + + ", deliveryFee=" + deliveryFee + + ", defaultDistance=" + defaultDistance + + ", overDistance=" + overDistance + + ", overDistanceFee=" + overDistanceFee + + ", freeWeight=" + freeWeight + + ", overWeight=" + overWeight + + ", overWeightFee=" + overWeightFee + + ", status=" + status + + ", lng=" + lng + + ", lat=" + lat + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", detailAddress='" + detailAddress + '\'' + + ", shopLng='" + shopLng + '\'' + + ", shopLat='" + shopLat + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Station.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Station.java new file mode 100644 index 0000000..b6ddc3a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/Station.java @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class Station extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 自提点id + */ + private Long stationId; + + /** + * 关联店铺id + */ + private Long shopId; + + /** + * 自提点名称 + */ + private String stationName; + + /** + * 自提点图片 + */ + private String imgUrl; + + /** + * 电话区号 + */ + private String mobilePrefix; + + /** + * 手机/电话号码 + */ + private String mobile; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 邮编 + */ + private String postCode; + + /** + * 地址 + */ + private String addr; + + /** + * 经度 + */ + private Double lng; + + /** + * 纬度 + */ + private Double lat; + + /** + * 时间数据 + */ + private String timeInfo; + + /** + * -1:已删除 0:关闭 1:营业 2:强制关闭 3:审核中 4:审核失败 + */ + private Integer status; + + /** + * 账号名 + */ + private String account; + + /** + * 库存模式 + */ + private Integer stockMode; + + public Integer getStockMode() { + return stockMode; + } + + public void setStockMode(Integer stockMode) { + this.stockMode = stockMode; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getMobilePrefix() { + return mobilePrefix; + } + + public void setMobilePrefix(String mobilePrefix) { + this.mobilePrefix = mobilePrefix; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public String getTimeInfo() { + return timeInfo; + } + + public void setTimeInfo(String timeInfo) { + this.timeInfo = timeInfo; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + @Override + public String toString() { + return "Station{" + + "stationId=" + stationId + + ", shopId=" + shopId + + ", stationName='" + stationName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", mobilePrefix='" + mobilePrefix + '\'' + + ", mobile='" + mobile + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", postCode='" + postCode + '\'' + + ", addr='" + addr + '\'' + + ", lng=" + lng + + ", lat=" + lat + + ", timeInfo='" + timeInfo + '\'' + + ", status=" + status + + ", account='" + account + '\'' + + ", stockMode=" + stockMode + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/TranscityFree.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/TranscityFree.java new file mode 100644 index 0000000..79dc911 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/TranscityFree.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 指定条件包邮城市项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TranscityFree extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 指定条件包邮城市项id + */ + private Long transcityFreeId; + + /** + * 指定条件包邮项id + */ + private Long transfeeFreeId; + + /** + * 城市id + */ + private Long freeCityId; + + public Long getTranscityFreeId() { + return transcityFreeId; + } + + public void setTranscityFreeId(Long transcityFreeId) { + this.transcityFreeId = transcityFreeId; + } + + public Long getTransfeeFreeId() { + return transfeeFreeId; + } + + public void setTransfeeFreeId(Long transfeeFreeId) { + this.transfeeFreeId = transfeeFreeId; + } + + public Long getFreeCityId() { + return freeCityId; + } + + public void setFreeCityId(Long freeCityId) { + this.freeCityId = freeCityId; + } + + @Override + public String toString() { + return "TranscityFree{" + + "transcityFreeId=" + transcityFreeId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",transfeeFreeId=" + transfeeFreeId + + ",freeCityId=" + freeCityId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/TransfeeFree.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/TransfeeFree.java new file mode 100644 index 0000000..bdc4b67 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/model/TransfeeFree.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 指定条件包邮项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public class TransfeeFree extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 指定条件包邮项id + */ + private Long transfeeFreeId; + + /** + * 运费模板id + */ + private Long transportId; + + /** + * 包邮方式 (0 满x件/重量/体积包邮 1满金额包邮 2满x件/重量/体积且满金额包邮) + */ + private Integer freeType; + + /** + * 需满金额 + */ + private Long amount; + + /** + * 包邮x件/重量/体积 + */ + private Double piece; + + public Long getTransfeeFreeId() { + return transfeeFreeId; + } + + public void setTransfeeFreeId(Long transfeeFreeId) { + this.transfeeFreeId = transfeeFreeId; + } + + public Long getTransportId() { + return transportId; + } + + public void setTransportId(Long transportId) { + this.transportId = transportId; + } + + public Integer getFreeType() { + return freeType; + } + + public void setFreeType(Integer freeType) { + this.freeType = freeType; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Double getPiece() { + return piece; + } + + public void setPiece(Double piece) { + this.piece = piece; + } + + @Override + public String toString() { + return "TransfeeFree{" + + "transfeeFreeId=" + transfeeFreeId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",transportId=" + transportId + + ",freeType=" + freeType + + ",amount=" + amount + + ",piece=" + piece + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/AreaService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/AreaService.java new file mode 100644 index 0000000..4f274b7 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/AreaService.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.delivery.model.Area; + +import java.util.List; + +/** + * 省市区地区信息 + * + * @author YXF + * @date 2020-11-25 14:48:52 + */ +public interface AreaService { + + /** + * 获取地址列表 + * @param areaDTO + * @return + */ + List list(AreaDTO areaDTO); + + /** + * 根据省市区地区信息id获取省市区地区信息 + * + * @param areaId 省市区地区信息id + * @return 省市区地区信息 + */ + AreaVO getByAreaId(Long areaId); + + /** + * 保存省市区地区信息 + * + * @param area 省市区地区信息 + */ + void save(Area area); + + /** + * 更新省市区地区信息 + * + * @param area 省市区地区信息 + */ + void update(Area area); + + /** + * 根据省市区地区信息id删除省市区地区信息 + * + * @param areaId + */ + void deleteById(Long areaId); + + /** + * 根据上级地址id,获取地址列表 + * + * @param pid + * @return + */ + List listByPid(Long pid); + + /** + * 清除地址的所有缓存数据 + * + * @param pid + */ + void removeAllCache(Long pid); + + /** + * 根据上级分类id,清除缓存 + * + * @param pid + */ + void removeAreaCacheByParentId(Long pid); + + /** + * 获取省市区三级结构完整的集合 + * + * @return 省市区三级结构完整的集合 + */ + List getAreaListInfo(); + + /** + * 获取可用的省市区列表 + * + * @return + */ + List listAreaOfEnable(); + + /** + * 查询相同上级的当前地区名称数量 + * + * @param areaName 地区名称 + * @param level + * @param parentId 父级地区id + * @param areaId 地区id + * @return 数量 + */ + Integer countByNameAndParentId(String areaName, Integer level, Long parentId, Long areaId); + + /** + * 根据id获取列表 + * @param areaIds + * @return + */ + List listByAreaIdList(List areIdList); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryCompanyService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryCompanyService.java new file mode 100644 index 0000000..9217b0d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryCompanyService.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.api.delivery.vo.DeliveryInfoVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.delivery.dto.DeliveryCompanyDTO; +import com.tmerclub.cloud.delivery.model.DeliveryCompany; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; + +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Set; + +/** + * 物流公司 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public interface DeliveryCompanyService { + + /** + * 获取物流公司列表 + * + * @return 物流公司列表数据 + */ + List list(); + + /** + * 根据物流公司id获取物流公司 + * + * @param deliveryCompanyId 物流公司id + * @return 物流公司 + */ + DeliveryCompanyVO getByDeliveryCompanyId(Long deliveryCompanyId); + + /** + * 保存物流公司 + * + * @param deliveryCompany 物流公司 + */ + void save(DeliveryCompany deliveryCompany); + + /** + * 更新物流公司 + * + * @param deliveryCompany 物流公司 + */ + void update(DeliveryCompany deliveryCompany); + + /** + * 根据物流公司id删除物流公司 + * + * @param deliveryCompanyId + */ + void deleteById(Long deliveryCompanyId); + + /** + * 分页获取物流公司列表数据 + * + * @param pageDTO + * @param deliveryCompanyDTO + * @return + */ + PageVO page(PageDTO pageDTO, DeliveryCompanyDTO deliveryCompanyDTO); + + /** + * 根据物流ID与物流单号查找物流信息 + * + * @param delivery 快递公司信息 + * @param expNo 物流单号 + * @param consigneeMobile 收件人手机号 + * @return 物流信息 + * @throws UnsupportedEncodingException + */ + DeliveryInfoVO query(DeliveryCompanyVO delivery, String expNo, String consigneeMobile); + + /** + * 根据物流公司id列表,获取物流公司列表 + * + * @param ids + * @return + */ + List listByIds(Set ids); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryOrderItemService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryOrderItemService.java new file mode 100644 index 0000000..55a24b2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/DeliveryOrderItemService.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.delivery.model.DeliveryOrderItem; +import com.tmerclub.cloud.delivery.vo.DeliveryOrderItemVO; + +/** + * 物流订单项信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public interface DeliveryOrderItemService { + + /** + * 根据物流订单项信息id获取物流订单项信息 + * + * @param id 物流订单项信息id + * @return 物流订单项信息 + */ + DeliveryOrderItemVO getById(Long id); + + /** + * 保存物流订单项信息 + * @param deliveryOrderItem 物流订单项信息 + */ + void save(DeliveryOrderItem deliveryOrderItem); + + /** + * 更新物流订单项信息 + * @param deliveryOrderItem 物流订单项信息 + */ + void update(DeliveryOrderItem deliveryOrderItem); + + /** + * 根据物流订单项信息id删除物流订单项信息 + * @param id + */ + void deleteById(Long id); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TranscityService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TranscityService.java new file mode 100644 index 0000000..3d63228 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TranscityService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.delivery.model.Transcity; +import com.tmerclub.cloud.delivery.vo.TranscityVO; + +/** + * 运费项和运费城市关联信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TranscityService { + + /** + * 分页获取运费项和运费城市关联信息列表 + * @param pageDTO 分页参数 + * @return 运费项和运费城市关联信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据运费项和运费城市关联信息id获取运费项和运费城市关联信息 + * + * @param transcityId 运费项和运费城市关联信息id + * @return 运费项和运费城市关联信息 + */ + TranscityVO getByTranscityId(Long transcityId); + + /** + * 保存运费项和运费城市关联信息 + * @param transcity 运费项和运费城市关联信息 + */ + void save(Transcity transcity); + + /** + * 更新运费项和运费城市关联信息 + * @param transcity 运费项和运费城市关联信息 + */ + void update(Transcity transcity); + + /** + * 根据运费项和运费城市关联信息id删除运费项和运费城市关联信息 + * @param transcityId + */ + void deleteById(Long transcityId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransfeeService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransfeeService.java new file mode 100644 index 0000000..aa876f9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransfeeService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.TransfeeVO; +import com.tmerclub.cloud.delivery.model.Transfee; + +/** + * 运费项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TransfeeService { + + /** + * 分页获取运费项列表 + * @param pageDTO 分页参数 + * @return 运费项列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据运费项id获取运费项 + * + * @param transfeeId 运费项id + * @return 运费项 + */ + TransfeeVO getByTransfeeId(Long transfeeId); + + /** + * 保存运费项 + * @param transfee 运费项 + */ + void save(Transfee transfee); + + /** + * 更新运费项 + * @param transfee 运费项 + */ + void update(Transfee transfee); + + /** + * 根据运费项id删除运费项 + * @param transfeeId + */ + void deleteById(Long transfeeId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransportService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransportService.java new file mode 100644 index 0000000..6c2364b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/TransportService.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service; + +import com.tmerclub.cloud.api.delivery.vo.ShopTransportVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.TransportVO; +import com.tmerclub.cloud.delivery.dto.TransportDTO; + +import java.util.List; + +/** + * 运费模板 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +public interface TransportService { + + /** + * 分页获取运费模板列表 + * + * @param pageDTO 分页参数 + * @param transportDTO + * @return 运费模板列表分页数据 + */ + PageVO page(PageDTO pageDTO, TransportDTO transportDTO); + + /** + * 根据id获取运费模板详细信息 + * + * @param transportId 运费模板id + * @return + */ + TransportVO getTransportAndAllItemsById(Long transportId); + + /** + * 保存运费模板信息 + * + * @param transport 运费模板信息 + */ + void insertTransportAndTransFee(TransportDTO transport); + + /** + * 更新运费模板 + * + * @param transportDTO 运费模板 + */ + void updateTransportAndTransFee(TransportDTO transportDTO); + + /** + * 根据运费模板ids删除运费模板 + * + * @param transportId 运费模板id + */ + void deleteTransportAndTransFeeAndTransCityById(Long transportId); + + /** + * 根据id清除缓存 + * + * @param transportId 运费模板id + */ + void removeTransportAndAllItemsCache(Long transportId); + + /** + * 根据店铺id获取所有的运费模板列表 + * + * @param tenantId + * @return + */ + List listTransport(Long tenantId); + + /** + * 获取运费模板列表 + * @param ids + * @return + */ + List listTransportByIds(List ids); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/AreaServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/AreaServiceImpl.java new file mode 100644 index 0000000..6effdf5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/AreaServiceImpl.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.AreaVO; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.delivery.mapper.AreaMapper; +import com.tmerclub.cloud.delivery.model.Area; +import com.tmerclub.cloud.delivery.service.AreaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 省市区地区信息 + * + * @author YXF + * @date 2020-11-25 14:48:52 + */ +@Service +public class AreaServiceImpl implements AreaService { + + @Autowired + private AreaMapper areaMapper; + + @Override + public List list(AreaDTO areaDTO) { + return areaMapper.list(areaDTO); + } + + @Override + @Cacheable(cacheNames = CacheNames.AREA_INFO_KEY, key = "'areaList'", sync = true) + public List getAreaListInfo() { + List list = areaMapper.getAreaListInfo(); + Map> areaMap = list.stream().collect(Collectors.groupingBy(AreaVO::getParentId)); + List regionList = areaMap.get(0L); + if (CollUtil.isEmpty(regionList)) { + return new ArrayList<>(0); + } + List areaList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + Iterator iterator = regionList.iterator(); + while (iterator.hasNext()) { + AreaVO areaVO = iterator.next(); + List provinceList = areaMap.get(areaVO.getAreaId()); + if (CollUtil.isEmpty(provinceList)) { + iterator.remove(); + continue; + } + extracted(provinceList, areaMap); + for (AreaVO province : provinceList) { + List cityIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AreaVO city : province.getAreas()) { + cityIds.add(city.getAreaId()); + List areaIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AreaVO area : city.getAreas()) { + areaIds.add(area.getAreaId()); + } + city.setAreaIds(areaIds); + } + province.setAreaIds(cityIds); + } + areaList.addAll(provinceList); + } + return areaList; + } + + @Override + @Cacheable(cacheNames = CacheNames.AREA_INFO_KEY, key = "'listAreaOfEnable'", sync = true) + public List listAreaOfEnable() { + List list = areaMapper.listAreaOfEnable(); + Map> areaMap = list.stream().collect(Collectors.groupingBy(AreaVO::getParentId)); + list = list.stream().filter(areaVO -> Objects.equals(areaVO.getLevel(), 1)).collect(Collectors.toList()); + extracted(list, areaMap); + return list; + } + + private void extracted(List list, Map> areaMap) { + if (CollUtil.isEmpty(list)) { + return; + } + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + AreaVO areaVO = iterator.next(); + if (!areaMap.containsKey(areaVO.getAreaId())) { + iterator.remove(); + continue; + } + List cityList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List areaids = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AreaVO city : areaMap.get(areaVO.getAreaId())) { + if (!areaMap.containsKey(city.getAreaId())) { + continue; + } + city.setAreas(areaMap.get(city.getAreaId())); + List areaIdsList = new ArrayList<>(Constant.INITIAL_CAPACITY); + city.getAreas().forEach(s -> areaIdsList.add(s.getAreaId())); + city.setAreaIds(areaIdsList); + cityList.add(city); + areaids.add(city.getAreaId()); + } + if (CollUtil.isEmpty(cityList)) { + iterator.remove(); + continue; + } + areaVO.setAreas(cityList); + areaVO.setAreaIds(areaids); + } + } + + @Override + public Integer countByNameAndParentId(String areaName, Integer level, Long parentId, Long areaId) { + return areaMapper.countByNameAndParentId(areaName, level, parentId, areaId); + } + + @Override + public List listByAreaIdList(List areIdList) { + return areaMapper.listByAreaIdList(areIdList); + } + + @Override + public AreaVO getByAreaId(Long areaId) { + return areaMapper.getByAreaId(areaId); + } + + @Override + public void save(Area area) { + areaMapper.save(area); + } + + @Override + public void update(Area area) { + areaMapper.update(area); + } + + @Override + public void deleteById(Long areaId) { + int areaNum = areaMapper.countByAreaId(areaId); + if (areaNum > 0) { + throw new LuckException("请先删除子地区"); + } + areaMapper.deleteById(areaId); + } + + @Override + @Cacheable(cacheNames = CacheNames.AREA_KEY, key = "'list:' + #pid") + public List listByPid(Long pid) { + return areaMapper.listByPid(pid); + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.AREA_INFO_KEY, key = "'areaList'"), + @CacheEvict(cacheNames = CacheNames.AREA_INFO_KEY, key = "'listAreaOfEnable'"), + @CacheEvict(cacheNames = CacheNames.AREA_KEY, key = "'list:' + #pid") + }) + public void removeAllCache(Long pid) { + + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.AREA_KEY, key = "'list:' + #pid"), + @CacheEvict(cacheNames = CacheNames.AREA_INFO_KEY, key = "'areaList'"), + @CacheEvict(cacheNames = CacheNames.AREA_INFO_KEY, key = "'listAreaOfEnable'") + }) + public void removeAreaCacheByParentId(Long pid) { + + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryCompanyServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryCompanyServiceImpl.java new file mode 100644 index 0000000..f832370 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryCompanyServiceImpl.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestAlgorithm; +import cn.hutool.crypto.digest.Digester; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.tmerclub.cloud.api.delivery.vo.DeliveryInfoVO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryItemInfoVO; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.AliQuick; +import com.tmerclub.cloud.common.bean.Quick100; +import com.tmerclub.cloud.common.bean.QuickBird; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.delivery.bo.DeliveryAliInfoBO; +import com.tmerclub.cloud.delivery.bo.DeliveryAliItemInfoBO; +import com.tmerclub.cloud.delivery.bo.DeliveryHundredInfoBO; +import com.tmerclub.cloud.delivery.bo.DeliveryHundredItemInfoBO; +import com.tmerclub.cloud.delivery.constant.DeliveryConstant; +import com.tmerclub.cloud.delivery.dto.DeliveryCompanyDTO; +import com.tmerclub.cloud.delivery.mapper.DeliveryCompanyMapper; +import com.tmerclub.cloud.delivery.model.DeliveryCompany; +import com.tmerclub.cloud.delivery.service.DeliveryCompanyService; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.*; + +/** + * 物流公司 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +@Service +public class DeliveryCompanyServiceImpl implements DeliveryCompanyService { + + private static final Logger logger = LoggerFactory.getLogger(DeliveryCompanyServiceImpl.class); + private static final int SUBLENGTH = 4; + @Autowired + private DeliveryCompanyMapper deliveryCompanyMapper; + @Autowired + private FeignShopConfig shopConfig; + + @Override + public List list() { + return deliveryCompanyMapper.list(); + } + + @Override + public DeliveryCompanyVO getByDeliveryCompanyId(Long deliveryCompanyId) { + return deliveryCompanyMapper.getByDeliveryCompanyId(deliveryCompanyId); + } + + @Override + public void save(DeliveryCompany deliveryCompany) { + checkDeliveryCompany(deliveryCompany); + + deliveryCompanyMapper.save(deliveryCompany); + } + + private void checkDeliveryCompany(DeliveryCompany deliveryCompany) { + if (deliveryCompanyMapper.countName(deliveryCompany.getName(), deliveryCompany.getDeliveryCompanyId()) > 0) { + throw new LuckException("快递公司已存在"); + } + if (StrUtil.isBlank(deliveryCompany.getAliNo()) && StrUtil.isBlank(deliveryCompany.getBirdNo()) && StrUtil.isBlank(deliveryCompany.getHundredNo())) { + throw new LuckException("必须填写一个或多个物流公司编号"); + } + } + + @Override + public void update(DeliveryCompany deliveryCompany) { + checkDeliveryCompany(deliveryCompany); + deliveryCompanyMapper.update(deliveryCompany); + } + + @Override + public void deleteById(Long deliveryCompanyId) { + deliveryCompanyMapper.deleteById(deliveryCompanyId); + } + + @Override + public PageVO page(PageDTO pageDTO, DeliveryCompanyDTO deliveryCompanyDTO) { + return PageUtil.doPage(pageDTO, () -> deliveryCompanyMapper.listBySearch(deliveryCompanyDTO)); + } + + @Override + public DeliveryInfoVO query(DeliveryCompanyVO delivery, String expNo, String consigneeMobile) { + try { + if (Objects.nonNull(delivery)) { + // 快递鸟查询 + QuickBird quickBird = shopConfig.getQuickBird(); + if (Objects.nonNull(quickBird) && BooleanUtil.isTrue(quickBird.getIsOpen())) { + return queryByQuickBird(delivery.getBirdNo(), expNo, quickBird, consigneeMobile); + } + // 快递100查询 + Quick100 quick100 = shopConfig.getQuick100(); + if (Objects.nonNull(quick100) && BooleanUtil.isTrue(quick100.getIsOpen())) { + return queryByQuick100(delivery.getHundredNo(), expNo, quick100, consigneeMobile); + } + // 阿里快递查询 + AliQuick aliQuickConfig = shopConfig.getAliQuickConfig(); + if (Objects.nonNull(aliQuickConfig) && BooleanUtil.isTrue(aliQuickConfig.getIsOpen())) { + return queryByAliQuick(delivery.getAliNo(), expNo, aliQuickConfig, consigneeMobile); + } + } + } catch (Exception e) { + logger.error("物流查询出错,查询单号:{},报错信息:{}", expNo, e); + // 查询出错 + throw new LuckException("查询出错"); + } + DeliveryInfoVO deliveryInfoVO = new DeliveryInfoVO(); + deliveryInfoVO.setDvyFlowId(expNo); + deliveryInfoVO.setCompanyName(delivery.getName()); + deliveryInfoVO.setCompanyHomeUrl(delivery.getHomeUrl()); + return deliveryInfoVO; + } + + @Override + public List listByIds(Set ids) { + if (CollUtil.isEmpty(ids)) { + return new ArrayList<>(Constant.INITIAL_CAPACITY); + } + return deliveryCompanyMapper.listByIds(ids); + } + + private DeliveryInfoVO queryByQuickBird(String birdNo, String expNo, QuickBird quickBird, String consigneeMobile) throws UnsupportedEncodingException { + String requestData = "{" + + "'OrderCode': ''," + + "'ShipperCode': '" + birdNo + "'," + + "'LogisticCode': '" + expNo + "'," + + // 快递为顺丰时需要传寄件人/收件人手机号后四位,为其他快递时,可不填或保留字段,不可传值 + "'CustomerName': '" + (Objects.equals(birdNo, QuickBird.SF_CODE) ? getLastFourOfMobile(consigneeMobile) : "") + "'," + + "}"; + Map params = new HashMap<>(16); + params.put("RequestData", URLEncoder.encode(requestData, "UTF-8")); + params.put("EBusinessID", quickBird.geteBusinessID()); + String dataSign = Base64.encode(new Digester(DigestAlgorithm.MD5).digestHex(requestData + quickBird.getAppKey()), "UTF-8"); + params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8")); + params.put("RequestType", "1002"); + params.put("DataType", "2"); + String repJson = HttpUtil.post(quickBird.getReqUrl(), params); + return JSON.parseObject(repJson, DeliveryInfoVO.class); + } + + + /** + * 通过快递100查询 + * + * @param expCode 物流公司编码 + * @param expNo 物流单号 + * @param quick100 配置信息 + * @return + */ + private DeliveryInfoVO queryByQuick100(String expCode, String expNo, Quick100 quick100, String consigneeMobile) { + Map paramMap = new HashMap<>(16); + paramMap.put("com", expCode); + paramMap.put("num", expNo); + if (Objects.equals(expCode, Quick100.SF_CODE) || Objects.equals(expCode, Quick100.FENGWANG_CODE)) { + // 快递100中顺丰速运和丰网速运必填收/寄件人手机号码,其他快递公司选填 + paramMap.put("phone", consigneeMobile); + } + paramMap.put("order", "desc"); + String param = JSON.toJSONString(paramMap); + String sign = new Digester(DigestAlgorithm.MD5).digestHex(param + quick100.getKey() + quick100.getCustomer(), "UTF-8").toUpperCase(Locale.ROOT); + Map params = new HashMap<>(16); + params.put("param", param); + params.put("sign", sign); + params.put("customer", quick100.getCustomer()); + String repJson = HttpUtil.post(quick100.getReqUrl(), params); + DeliveryHundredInfoBO hundredInfoBO = Json.parseObject(repJson, DeliveryHundredInfoBO.class); + DeliveryInfoVO deliveryInfoVO = new DeliveryInfoVO(); + if (Objects.isNull(hundredInfoBO) + || CollectionUtil.isEmpty(hundredInfoBO.getData())) { + deliveryInfoVO.setTraces(new ArrayList<>(0)); + return deliveryInfoVO; + } + deliveryInfoVO.setState(hundredInfoBO.getState()); + List deliveryAliInfoList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (DeliveryHundredItemInfoBO itemInfo : hundredInfoBO.getData()) { + DeliveryItemInfoVO deliveryItemInfoVO = new DeliveryItemInfoVO(); + deliveryItemInfoVO.setAcceptStation(itemInfo.getContext()); + deliveryItemInfoVO.setAcceptTime(itemInfo.getFtime()); + deliveryAliInfoList.add(deliveryItemInfoVO); + } + deliveryInfoVO.setTraces(deliveryAliInfoList); + return deliveryInfoVO; + } + + /** + * 通过阿里快递查询,返回当前包裹的快递信息 + * + * @param expCode 物流公司编码 + * @param expNo 物流单号 + * @param aliQuickConfig 配置信息 + * @return 当前包裹的快递信息 + */ + private DeliveryInfoVO queryByAliQuick(String expCode, String expNo, AliQuick aliQuickConfig, String consigneeMobile) { + Map params = new HashMap<>(16); + if (Objects.equals(expCode, AliQuick.SF_CODE) && StrUtil.isNotBlank(consigneeMobile)) { + // 使用阿里快递查询时,如果是顺丰单号,需要在单号后面拼接收件人手机号后四位 + expNo = expNo + ":" + getLastFourOfMobile(consigneeMobile); + } + params.put("type", expCode); + params.put("no", expNo); + params.put("Authorization", DeliveryConstant.CODE_HEADER + aliQuickConfig.getAliCode()); + //头信息,多个头信息多次调用此方法即可 + String repJson = HttpRequest.get(aliQuickConfig.getReqUrl()) + .header(Header.AUTHORIZATION, DeliveryConstant.CODE_HEADER + aliQuickConfig.getAliCode()) + .form(params) + .execute().body(); + try { + String data = JSONObject.parseObject(repJson).getString("result"); + DeliveryAliInfoBO deliveryAliInfoBO = Json.parseObject(data, DeliveryAliInfoBO.class); + DeliveryInfoVO deliveryInfoVO = new DeliveryInfoVO(); + deliveryInfoVO.setCompanyName(deliveryAliInfoBO.getExpName()); + deliveryInfoVO.setCompanyHomeUrl(deliveryAliInfoBO.getExpSite()); + deliveryInfoVO.setDvyFlowId(deliveryAliInfoBO.getNumber()); + deliveryInfoVO.setState(deliveryAliInfoBO.getDeliverystatus()); + if (CollectionUtil.isEmpty(deliveryAliInfoBO.getList())) { + deliveryInfoVO.setTraces(new ArrayList<>(0)); + return deliveryInfoVO; + } + List deliveryAliInfoList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (DeliveryAliItemInfoBO itemInfo : deliveryAliInfoBO.getList()) { + DeliveryItemInfoVO deliveryItemInfoVO = new DeliveryItemInfoVO(); + deliveryItemInfoVO.setAcceptStation(itemInfo.getStatus()); + deliveryItemInfoVO.setAcceptTime(itemInfo.getTime()); + deliveryAliInfoList.add(deliveryItemInfoVO); + } + deliveryInfoVO.setTraces(deliveryAliInfoList); + return deliveryInfoVO; + } catch (Exception e) { + logger.warn("阿里物流查询错误{}", e.getMessage()); + return null; + } + + } + + private String getLastFourOfMobile(String mobile) { + // 获取手机号后四位 + if (Objects.isNull(mobile) || mobile.length() < SUBLENGTH) { + return ""; + } + return mobile.substring(mobile.length() - SUBLENGTH); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryOrderServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryOrderServiceImpl.java new file mode 100644 index 0000000..efe1ea9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/DeliveryOrderServiceImpl.java @@ -0,0 +1,568 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaOrderShippingService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaOrderShippingServiceImpl; +import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryInfoVO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderItemFeignVO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.api.user.feign.UserAddrFeignClient; +import com.tmerclub.cloud.config.WxConfig; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.FlowSystemTypeEnum; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.delivery.constant.DeliveryCompanyType; +import com.tmerclub.cloud.delivery.manager.DeliveryPrintManager; +import com.tmerclub.cloud.delivery.mapper.DeliveryOrderItemMapper; +import com.tmerclub.cloud.delivery.mapper.DeliveryOrderMapper; +import com.tmerclub.cloud.delivery.model.DeliveryOrder; +import com.tmerclub.cloud.delivery.model.DeliveryOrderItem; +import com.tmerclub.cloud.delivery.service.DeliveryCompanyService; +import com.tmerclub.cloud.delivery.service.DeliveryOrderService; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import com.tmerclub.cloud.delivery.vo.DeliveryOrderVO; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单快递信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +@Service +public class DeliveryOrderServiceImpl implements DeliveryOrderService { + + private static final Logger logger = LoggerFactory.getLogger(DeliveryOrderServiceImpl.class); + + @Autowired + private DeliveryOrderMapper deliveryOrderMapper; + @Autowired + private DeliveryOrderItemMapper deliveryOrderItemMapper; + @Autowired + private DeliveryCompanyService deliveryCompanyService; + @Autowired + private DeliveryPrintManager deliveryPrintManager; + @Autowired + private WxConfig wxConfig; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private UserAddrFeignClient userAddrFeignClient; + @DubboReference + private PaymentFeignClient paymentFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private RocketMQTemplate sendNotifyToUserTemplate; + + + @Override + public DeliveryOrderVO getByDeliveryOrderId(Long deliveryOrderId) { + return deliveryOrderMapper.getByDeliveryOrderId(deliveryOrderId); + } + + @Override + public List getByDeliveryByOrderId(Long orderId) { + List deliveryOrderList = deliveryOrderMapper.getByDeliveryByOrderId(orderId, null); + if (CollUtil.isEmpty(deliveryOrderList)) { + return deliveryOrderList; + } + // 只需要查询第一个包裹的物流,其他包裹等用户点击后再查询 + DeliveryOrderFeignVO deliveryOrderFeignVO = deliveryOrderList.get(0); + // 没有物流信息就不用查询 + if (Objects.isNull(deliveryOrderFeignVO.getDeliveryCompanyId()) || StrUtil.isBlank(deliveryOrderFeignVO.getDeliveryNo())) { + return deliveryOrderList; + } + DeliveryCompanyVO deliveryCompanyVO = new DeliveryCompanyVO(); + if (Objects.equals(deliveryOrderFeignVO.getDeliveryType(), DeliveryType.DELIVERY.value())) { + deliveryCompanyVO = deliveryCompanyService.getByDeliveryCompanyId(deliveryOrderFeignVO.getDeliveryCompanyId()); + } else if (Objects.equals(deliveryOrderFeignVO.getDeliveryType(), DeliveryType.ONLINE.value())) { + deliveryCompanyVO = DeliveryCompanyType.getByDeliveryCompanyType(deliveryOrderFeignVO.getDeliveryCompanyId()); + } + // 获取物流信息 + DeliveryInfoVO deliveryInfoVO; + if (deliveryCompanyVO == null) { + deliveryInfoVO = new DeliveryInfoVO(); + logger.error("物流公司信息查询失败,deliveryCompanyId:{}", deliveryOrderFeignVO.getDeliveryCompanyId()); + } else { + deliveryOrderFeignVO.setDeliveryName(deliveryCompanyVO.getName()); + deliveryInfoVO = deliveryCompanyService.query(deliveryCompanyVO, deliveryOrderFeignVO.getDeliveryNo(), deliveryOrderFeignVO.getConsigneeMobile()); + logger.info("订单物流信息查询完毕: {}", deliveryInfoVO); + } + deliveryOrderFeignVO.setDelivery(deliveryInfoVO); + return deliveryOrderList; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveDeliveryInfo(DeliveryOrderDTO deliveryOrderParam, Integer isPurchase, Integer unDeliveryNum) { + List deliveryList = getByDeliveryByOrderId(deliveryOrderParam.getOrderId()); + if (deliveryList.size() >= 9 && unDeliveryNum != 0) { + throw new LuckException("一个订单最多只能拆分成10个包裹,请全选发货"); + } + List selectOrderItems = deliveryOrderParam.getSelectOrderItems(); + // 快递发货/无需物流/线上发货 + if (Objects.equals(DeliveryType.DELIVERY.value(), deliveryOrderParam.getDeliveryType()) + || Objects.equals(DeliveryType.NOT_DELIVERY.value(), deliveryOrderParam.getDeliveryType()) + || Objects.equals(DeliveryType.ONLINE.value(), deliveryOrderParam.getDeliveryType())) { + //校验数量及获取发货的总数 + int prodNumSum = getAllProdNum(selectOrderItems); + loadOrderDateId(deliveryOrderParam); + DeliveryOrder deliveryOrder = new DeliveryOrder(); + deliveryOrder.setDeliveryOrderId(deliveryOrderParam.getDeliveryOrderId()); + deliveryOrder.setUserId(deliveryOrderParam.getUserId()); + deliveryOrder.setOrderId(deliveryOrderParam.getOrderId()); + if (Objects.equals(DeliveryType.DELIVERY.value(), deliveryOrderParam.getDeliveryType())) { + //只有快递配送才有物流公司和单号 + logger.info("快递配送,物流公司:{},单号:{}", deliveryOrderParam.getDeliveryCompanyId(), deliveryOrderParam.getDeliveryNo()); + deliveryOrder.setDeliveryCompanyId(deliveryOrderParam.getDeliveryCompanyId()); + deliveryOrder.setDeliveryNo(deliveryOrderParam.getDeliveryNo()); + } else if (Objects.equals(DeliveryType.ONLINE.value(), deliveryOrderParam.getDeliveryType())){ + // 线上发货DeliveryCompanyId为DeliveryCompanyType中的type + DeliveryCompanyType deliveryCompanyType = DeliveryCompanyType.instance(deliveryOrderParam.getDeliveryCompanyType()); + logger.info("线上发货,物流公司:{}", deliveryCompanyType.getName()); + deliveryOrder.setDeliveryCompanyId(Long.valueOf(deliveryOrderParam.getDeliveryCompanyType())); + } + deliveryOrder.setCreateTime(new Date()); + deliveryOrder.setStatus(1); + deliveryOrder.setAllCount(prodNumSum); + // 保存收件人信息 + deliveryOrder.setConsigneeMobile(deliveryOrderParam.getMobile()); + deliveryOrder.setConsigneeName(deliveryOrderParam.getConsignee()); + deliveryOrder.setDeliveryType(deliveryOrderParam.getDeliveryType()); + //保存订单物流信息 + deliveryOrderMapper.save(deliveryOrder); + //保存需要添加的关联信息 + if (CollectionUtil.isNotEmpty(deliveryOrderParam.getSelectOrderItems())) { + logger.info("保存订单物流信息,deliveryOrderId:{}", deliveryOrder.getDeliveryOrderId()); + List deliveryOrderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (DeliveryOrderItemDTO selectOrderItem : deliveryOrderParam.getSelectOrderItems()) { + DeliveryOrderItem deliveryOrderItem = new DeliveryOrderItem(); + deliveryOrderItem.setDeliveryOrderItemId(selectOrderItem.getOrderItemId()); + deliveryOrderItem.setDeliveryOrderId(deliveryOrder.getDeliveryOrderId()); + deliveryOrderItem.setCount(selectOrderItem.getChangeNum()); + deliveryOrderItem.setSpuName(selectOrderItem.getSpuName()); + deliveryOrderItem.setSupplierImgUrl(selectOrderItem.getSupplierPic()); + deliveryOrderItem.setSupplierSpuName(selectOrderItem.getSupplierSpuName()); + deliveryOrderItem.setImgUrl(selectOrderItem.getPic()); + deliveryOrderItems.add(deliveryOrderItem); + } + deliveryOrderItemMapper.saveBatch(deliveryOrderItems); + } + } + if (Objects.equals(DeliveryType.ONLINE.value(), deliveryOrderParam.getDeliveryType())) { + // 线上发货 + String deliveryNo = deliveryPrintManager.deliveryPrint(deliveryOrderParam, AuthUserContext.get().getSysType(), isPurchase); + // 更新单号 + DeliveryOrder deliveryOrder = new DeliveryOrder(); + deliveryOrder.setDeliveryOrderId(deliveryOrderParam.getDeliveryOrderId()); + deliveryOrder.setDeliveryNo(deliveryNo); + deliveryOrderMapper.update(deliveryOrder); + deliveryOrderParam.setDeliveryNo(deliveryNo); + SendNotifyBO sendNotifyBO = deliveryOrderParam.getSendNotifyBO(); + if (Objects.nonNull(sendNotifyBO)) { + sendNotifyBO.setDvyFlowId(deliveryNo); + List sendNotifyList = Collections.singletonList(sendNotifyBO); + sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyList)).getSendStatus(); + } + } + // 小程序发货消息处理 + checkWechatPayDelivery(deliveryOrderParam, unDeliveryNum); + } + + private void loadOrderDateId(DeliveryOrderDTO deliveryOrderParam) { + Long deliveryOrderId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_DELIVERY_ORDER, deliveryOrderParam.getUserId()); + deliveryOrderParam.setDeliveryOrderId(deliveryOrderId); + for (DeliveryOrderItemDTO selectOrderItem : deliveryOrderParam.getSelectOrderItems()) { + Long orderItemId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_DELIVERY_ORDER_ITEM, deliveryOrderParam.getUserId()); + selectOrderItem.setOrderItemId(orderItemId); + } + } + + @Override + public List listDetailDelivery(Long orderId) { + return deliveryOrderItemMapper.listDetailDelivery(orderId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateOrderDeliveries(List list) { + for (DeliveryOrderDTO deliveryOrderDTO : list) { + if (Objects.equals(deliveryOrderDTO.getDeliveryType(), DeliveryType.ONLINE.value())) { + throw new LuckException("线上发货不支持修改物流"); + } + DeliveryOrder deliveryOrder = new DeliveryOrder(); + deliveryOrder.setDeliveryOrderId(deliveryOrderDTO.getDeliveryOrderId()); + deliveryOrder.setDeliveryCompanyId(deliveryOrderDTO.getDeliveryCompanyId()); + deliveryOrder.setDeliveryNo(deliveryOrderDTO.getDeliveryNo()); + deliveryOrder.setUpdateTime(new Date()); + deliveryOrderMapper.update(deliveryOrder); + } + updateWechatPayDelivery(list); +// deliveryOrderMapper.updateBatch(list); + } + + @Override + public DeliveryOrderFeignVO deliveryOrderItemInfo(Long deliveryOrderId) { + List deliveryOrderList = deliveryOrderMapper.getByDeliveryByOrderId(null, deliveryOrderId); + if (CollUtil.isEmpty(deliveryOrderList)) { + throw new LuckException("包裹信息不存在,请刷新后重试"); + } + // 只需要查询第一个包裹的物流,其他包裹等用户点击后再查询 + DeliveryOrderFeignVO deliveryOrderFeignVO = deliveryOrderList.get(0); + if (Objects.nonNull(deliveryOrderFeignVO) && Objects.nonNull(deliveryOrderFeignVO.getDeliveryNo())) { + // 查询交易单 + DeliveryCompanyVO deliveryCompanyVO = new DeliveryCompanyVO(); + if (Objects.equals(deliveryOrderFeignVO.getDeliveryType(), DeliveryType.DELIVERY.value())) { + deliveryCompanyVO = deliveryCompanyService.getByDeliveryCompanyId(deliveryOrderFeignVO.getDeliveryCompanyId()); + } else if (Objects.equals(deliveryOrderFeignVO.getDeliveryType(), DeliveryType.ONLINE.value())) { + deliveryCompanyVO = DeliveryCompanyType.getByDeliveryCompanyType(deliveryOrderFeignVO.getDeliveryCompanyId()); + } + + // 获取物流信息 + deliveryOrderFeignVO.setDeliveryName(deliveryCompanyVO.getName()); + DeliveryInfoVO deliveryInfoVO = deliveryCompanyService.query(deliveryCompanyVO, deliveryOrderFeignVO.getDeliveryNo(), deliveryOrderFeignVO.getConsigneeMobile()); + deliveryOrderFeignVO.setDelivery(deliveryInfoVO); + } + return deliveryOrderFeignVO; + } + + @Override + public List listDeliveryCountByOrderId(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + return deliveryOrderMapper.listDeliveryCountByOrderId(orderIds); + } + + private int getAllProdNum(List selectOrderItems) { + //获取发货总数 + int prodNumSum = 0; + for (DeliveryOrderItemDTO selectOrderItem : selectOrderItems) { + prodNumSum += selectOrderItem.getChangeNum(); + } + return prodNumSum; + } + + @Override + public void save(DeliveryOrder deliveryOrder) { + deliveryOrderMapper.save(deliveryOrder); + } + + @Override + public void update(DeliveryOrder deliveryOrder) { + deliveryOrderMapper.update(deliveryOrder); + } + + @Override + public void deleteById(Long deliveryOrderId) { + deliveryOrderMapper.deleteById(deliveryOrderId); + } + + @Override + public Boolean checkAddr(TransportVO transportVO, Long userId, Long addrId) { + UserAddrVO userAddrVO; + if (addrId != null && addrId != 0) { + userAddrVO = userAddrFeignClient.getUserAddrByAddrId(addrId).getData(); + } else { + userAddrVO = userAddrFeignClient.getUserAddrByUserId(userId).getData(); + } + if (transportVO.getIsFreeFee() == 1 || userAddrVO == null) { + return true; + } else { + List areaList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List transFees = transportVO.getTransFees(); + if (!transFees.isEmpty()) { + for (TransfeeVO transFee : transFees) { + areaList.addAll(transFee.getCityList()); + } + } + Map> areaMap = areaList.stream().collect(Collectors.groupingBy(AreaVO::getAreaId)); + return areaMap.containsKey(userAddrVO.getAreaId()); + } + } + + + /** + * 小程序发货处理,录入发货信息 + * @param deliveryOrderParam + * @param unDeliveryNum + */ + private void checkWechatPayDelivery(DeliveryOrderDTO deliveryOrderParam, int unDeliveryNum) { + List payInfoApiDtos = paymentFeignClient.getPayInfoByUserIdAndOrderId(deliveryOrderParam.getUserId(), deliveryOrderParam.getOrderId()).getData(); + Boolean payFlag = false; + PayInfoApiDto payInfoApiDto = new PayInfoApiDto(); + if (CollectionUtil.isNotEmpty(payInfoApiDtos)) { + for (PayInfoApiDto payInfo : payInfoApiDtos) { + // 判断是否是小程序购买 + if (Objects.equals(payInfo.getPayType(), PayType.WECHATPAY.value()) && Objects.equals(payInfo.getSystemModel(), FlowSystemTypeEnum.APPLETS.value())) { + payInfoApiDto = payInfo; + payFlag = true; + break; + } + } + } + if (payFlag) { + // 查询小程序是否已开通发货信息管理服务 + Boolean managed = wxConfig.getTradeManaged(); + if (!managed) { + return; + } + List deliveryList = getByDeliveryByOrderId(deliveryOrderParam.getOrderId()); + deliveryList = deliveryList.stream().filter(deliveryOrderFeignVO -> !deliveryOrderFeignVO.getDeliveryOrderId().equals(deliveryOrderParam.getDeliveryOrderId())).collect(Collectors.toList()); + if (unDeliveryNum == 0 && CollectionUtil.isEmpty(deliveryList)) { + // 统一发货 + upload(deliveryOrderParam, payInfoApiDto); + } + if (unDeliveryNum == 0 && CollectionUtil.isNotEmpty(deliveryList)){ + // 多包裹发货 + combinedUpload(deliveryOrderParam, deliveryList, payInfoApiDto); + } + } + } + + /** + * 修改小程序发货,只能修改一次 + * @param deliveryOrders + */ + private void updateWechatPayDelivery(List deliveryOrders) { + EsOrderBO orderBO = orderFeignClient.getEsOrder(deliveryOrders.get(0).getOrderId()).getData(); + List payInfoApiDtos = paymentFeignClient.getPayInfoByUserIdAndOrderId(deliveryOrders.get(0).getUserId(), deliveryOrders.get(0).getOrderId()).getData(); + Boolean payFlag = false; + PayInfoApiDto payInfoApiDto = new PayInfoApiDto(); + if (CollectionUtil.isNotEmpty(payInfoApiDtos)) { + for (PayInfoApiDto payInfo : payInfoApiDtos) { + // 判断是否是小程序购买 + if (Objects.equals(payInfo.getPayType(), PayType.WECHATPAY.value()) && Objects.equals(payInfo.getSystemModel(), FlowSystemTypeEnum.APPLETS.value())) { + payInfoApiDto = payInfo; + payFlag = true; + break; + } + } + } + if (payFlag) { + // 查询小程序是否已开通发货信息管理服务 + Boolean managed = wxConfig.getTradeManaged(); + if (!managed) { + return; + } + WxMaOrderCombinedShippingInfoUploadRequest request = new WxMaOrderCombinedShippingInfoUploadRequest(); + OrderKeyBean orderKey = new OrderKeyBean(); + orderKey.setOrderNumberType(2); + orderKey.setTransactionId(payInfoApiDto.getBizPayNo()); + request.setOrderKey(orderKey); + WxMaOrderCombinedShippingInfoUploadRequest.SubOrderBean subOrderBean = new WxMaOrderCombinedShippingInfoUploadRequest.SubOrderBean(); + subOrderBean.setOrderKey(orderKey); + subOrderBean.setDeliveryMode(2); + subOrderBean.setLogisticsType(deliveryOrders.get(0).getDeliveryType() == 0 ? 1 : deliveryOrders.get(0).getDeliveryType()); + subOrderBean.setIsAllDelivered(true); + List shippingListBeanList = new ArrayList<>(); + for (DeliveryOrderDTO deliveryOrder : deliveryOrders) { + if (deliveryOrder.getCreateTime().getTime() != deliveryOrder.getUpdateTime().getTime()) { + // 已经修改过一次了,不能再次修改小程序发货信息 + break; + } + ShippingListBean shippingListBean = new ShippingListBean(); + shippingListBean.setTrackingNo(deliveryOrder.getDeliveryNo()); + DeliveryCompanyVO delivery = deliveryCompanyService.getByDeliveryCompanyId(deliveryOrder.getDeliveryCompanyId()); + if (Objects.nonNull(delivery)) { + shippingListBean.setExpressCompany(delivery.getBirdNo() == null ? delivery.getHundredNo() : delivery.getBirdNo()); + } else { + DeliveryCompanyType deliveryCompanyType = DeliveryCompanyType.instance(deliveryOrder.getDeliveryCompanyType()); + shippingListBean.setExpressCompany(deliveryCompanyType.getKuaidicom()); + } + String itemDesc = ""; + + for (DeliveryOrderItem orderItem : deliveryOrderItemMapper.listItemDelivery(deliveryOrder.getDeliveryOrderId())) { + itemDesc += orderItem.getSpuName() + "*" + orderItem.getCount() + " "; + } + shippingListBean.setItemDesc(itemDesc); + ContactBean contactBean = new ContactBean(); + String mobile = getByDeliveryOrderId(deliveryOrder.getDeliveryOrderId()).getConsigneeMobile(); + contactBean.setReceiverContact(mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2")); + shippingListBean.setContact(contactBean); + shippingListBeanList.add(shippingListBean); + } + if(shippingListBeanList.size() == 0){ + return; + } + subOrderBean.setShippingList(shippingListBeanList); + request.setSubOrders(Collections.singletonList(subOrderBean)); + DateFormat dft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + request.setUploadTime(dft.format(new Date())); + PayerBean payerBean = new PayerBean(); + payerBean.setOpenid(payInfoApiDto.getBizUserId()); + request.setPayer(payerBean); + try { + WxMaService wxMaService = wxConfig.getWxMaService(); + WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService); + logger.info("修改发货录入的参数" + Json.toJsonString(request)); + wxMaOrderShippingService.upload(request); + } catch (WxErrorException wxErrorException) { + wxErrorException.printStackTrace(); + throw new LuckException(wxErrorException.getError().getErrorMsg()); + } + } + } + + /** + * 发货信息录入接口,统一发货(一次性全部发货) + * @param deliveryOrderParam + */ + private void upload(DeliveryOrderDTO deliveryOrderParam, PayInfoApiDto payInfoApiDto) { + // 统一发货 + WxMaOrderShippingInfoUploadRequest request = new WxMaOrderShippingInfoUploadRequest(); + OrderKeyBean orderKey = new OrderKeyBean(); + orderKey.setOrderNumberType(2); + orderKey.setTransactionId(payInfoApiDto.getBizPayNo()); + request.setOrderKey(orderKey); + request.setDeliveryMode(1); + request.setLogisticsType(deliveryOrderParam.getDeliveryType() == 0 ? 1 : deliveryOrderParam.getDeliveryType()); + request.setShippingList(Collections.singletonList(createShippingBean(deliveryOrderParam))); + DateFormat dft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + request.setUploadTime(dft.format(new Date())); + PayerBean payerBean = new PayerBean(); + payerBean.setOpenid(payInfoApiDto.getBizUserId()); + request.setPayer(payerBean); + try { + WxMaService wxMaService = wxConfig.getWxMaService(); + WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService); + logger.info("一次发货录入的参数" + Json.toJsonString(request)); + wxMaOrderShippingService.upload(request); + } catch (WxErrorException wxErrorException) { + wxErrorException.printStackTrace(); + throw new LuckException(wxErrorException.getError().getErrorMsg()); + } + } + + /** + * 发货信息合单录入接口,多包裹发货(多次发货) + * @param deliveryOrderParam + * @param deliveryList + * @param payInfoApiDto + */ + private void combinedUpload(DeliveryOrderDTO deliveryOrderParam, List deliveryList, PayInfoApiDto payInfoApiDto) { + // 分批发货 + WxMaOrderCombinedShippingInfoUploadRequest request = new WxMaOrderCombinedShippingInfoUploadRequest(); + OrderKeyBean orderKey = new OrderKeyBean(); + orderKey.setOrderNumberType(2); + orderKey.setTransactionId(payInfoApiDto.getBizPayNo()); + request.setOrderKey(orderKey); + WxMaOrderCombinedShippingInfoUploadRequest.SubOrderBean subOrderBean = new WxMaOrderCombinedShippingInfoUploadRequest.SubOrderBean(); + subOrderBean.setOrderKey(orderKey); + subOrderBean.setDeliveryMode(2); + subOrderBean.setLogisticsType(deliveryOrderParam.getDeliveryType() == 0 ? 1 : deliveryOrderParam.getDeliveryType()); + subOrderBean.setIsAllDelivered(true); + List shippingListBeanList = new ArrayList<>(); + shippingListBeanList.add(createShippingBean(deliveryOrderParam)); + for (DeliveryOrderFeignVO orderFeignVO : deliveryList) { + ShippingListBean shippingListBean = new ShippingListBean(); + if ( !orderFeignVO.getDeliveryType().equals(DeliveryType.NOT_DELIVERY.value())) { + shippingListBean.setTrackingNo(orderFeignVO.getDeliveryNo()); + DeliveryCompanyVO delivery = deliveryCompanyService.getByDeliveryCompanyId(orderFeignVO.getDeliveryCompanyId()); + if (Objects.nonNull(delivery)) { + shippingListBean.setExpressCompany(delivery.getBirdNo() == null ? delivery.getHundredNo() : delivery.getBirdNo()); + } else { + DeliveryCompanyType deliveryCompanyType = DeliveryCompanyType.instance(deliveryOrderParam.getDeliveryCompanyType()); + shippingListBean.setExpressCompany(deliveryCompanyType.getKuaidicom()); + } + ContactBean contactBean = new ContactBean(); + contactBean.setReceiverContact(orderFeignVO.getConsigneeMobile().replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2")); + shippingListBean.setContact(contactBean); + } + String itemDesc = ""; + for (DeliveryOrderItemFeignVO orderItem : orderFeignVO.getOrderItems()) { + itemDesc += orderItem.getSpuName() + "*" + orderItem.getCount() + " "; + } + shippingListBean.setItemDesc(itemDesc); + shippingListBeanList.add(shippingListBean); + } + subOrderBean.setShippingList(shippingListBeanList); + request.setSubOrders(Collections.singletonList(subOrderBean)); + DateFormat dft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + request.setUploadTime(dft.format(new Date())); + PayerBean payerBean = new PayerBean(); + payerBean.setOpenid(payInfoApiDto.getBizUserId()); + request.setPayer(payerBean); + try { + WxMaService wxMaService = wxConfig.getWxMaService(); + WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService); + logger.info("多包裹合单录入的参数" + Json.toJsonString(request)); + wxMaOrderShippingService.upload(request); + } catch (WxErrorException wxErrorException) { + wxErrorException.printStackTrace(); + throw new LuckException(wxErrorException.getError().getErrorMsg()); + } + } + + /** + * 创建小程序发货的包裹信息 + * @param deliveryOrderParam + * @return + */ + private ShippingListBean createShippingBean(DeliveryOrderDTO deliveryOrderParam) { + ShippingListBean shippingListBean = new ShippingListBean(); + if (!deliveryOrderParam.getDeliveryType().equals(DeliveryType.NOT_DELIVERY.value())) { + shippingListBean.setTrackingNo(deliveryOrderParam.getDeliveryNo()); + shippingListBean.setExpressCompany(null); + if (Objects.nonNull(deliveryOrderParam.getDeliveryCompanyId())){ + DeliveryCompanyVO delivery = deliveryCompanyService.getByDeliveryCompanyId(deliveryOrderParam.getDeliveryCompanyId()); + shippingListBean.setExpressCompany(delivery.getBirdNo() == null ? delivery.getHundredNo() : delivery.getBirdNo()); + } else { + DeliveryCompanyType deliveryCompanyType = DeliveryCompanyType.instance(deliveryOrderParam.getDeliveryCompanyType()); + shippingListBean.setExpressCompany(deliveryCompanyType.getKuaidicom()); + } + ContactBean contactBean = new ContactBean(); + contactBean.setReceiverContact(deliveryOrderParam.getMobile().replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2")); + shippingListBean.setContact(contactBean); + } + String itemDesc = ""; + for (DeliveryOrderItemDTO orderItem : deliveryOrderParam.getSelectOrderItems()) { + itemDesc += orderItem.getSpuName() + "*" + orderItem.getChangeNum() + " "; + } + shippingListBean.setItemDesc(itemDesc); + return shippingListBean; + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/OutletConfigServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/OutletConfigServiceImpl.java new file mode 100644 index 0000000..310e4f9 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/OutletConfigServiceImpl.java @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.multishop.feign.ShopRefundAddrFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierRefundAddrFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.common.cache.constant.DeliveryCacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.delivery.constant.DeliveryCompanyType; +import com.tmerclub.cloud.delivery.dto.OutletConfigDTO; +import com.tmerclub.cloud.delivery.mapper.OutletConfigMapper; +import com.tmerclub.cloud.delivery.model.OutletConfig; +import com.tmerclub.cloud.delivery.service.OutletConfigService; +import com.tmerclub.cloud.delivery.vo.OutletConfigInfoVO; +import com.tmerclub.cloud.delivery.vo.OutletConfigVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 网点配置 + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +@Service +public class OutletConfigServiceImpl implements OutletConfigService { + + @Autowired + private OutletConfigMapper outletConfigMapper; + @DubboReference + private ShopRefundAddrFeignClient shopRefundAddrFeignClient; + @DubboReference + private SupplierRefundAddrFeignClient supplierRefundAddrFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, OutletConfigDTO outletConfigDTO) { + PageVO outletConfigPage = PageUtil.doPage(pageDTO, () -> outletConfigMapper.list(outletConfigDTO)); + for (OutletConfigVO outletConfigVO : outletConfigPage.getList()) { + if (StrUtil.isNotBlank(outletConfigVO.getMobile())) { + outletConfigVO.setMobile(PhoneUtil.hideBetween(outletConfigVO.getMobile()).toString()); + } + } + return outletConfigPage; + } + + @Override + public OutletConfig getByOutletConfig(Long outletConfigId, Integer sysType) { + OutletConfig outletConfig = outletConfigMapper.getByOutletConfigId(outletConfigId); + if (Objects.isNull(outletConfig)) { + throw new LuckException("网点信息为空"); + } + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + if (!Objects.equals(outletConfig.getSupplierId(), AuthUserContext.get().getTenantId())) { + throw new LuckException("暂无权限查看该配置"); + } + } else { + if (!Objects.equals(outletConfig.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException("暂无权限查看该配置"); + } + } + return outletConfig; + } + + @Override + public void save(OutletConfig outletConfig) { + checkInfo(outletConfig); + outletConfigMapper.save(outletConfig); + } + + private void checkInfo(OutletConfig outletConfig) { + DeliveryCompanyType deliveryCompanyType = DeliveryCompanyType.instance(outletConfig.getDeliveryCompanyType()); + if (Objects.isNull(deliveryCompanyType)) { + throw new LuckException("快递公司不存在"); + } + String tempId = DeliveryCompanyType.getTempId(outletConfig.getDeliveryCompanyType(), outletConfig.getPaperSize()); + if (Objects.isNull(tempId) || StrUtil.isBlank(tempId)) { + throw new LuckException("关联面单不存在"); + } + if (Objects.nonNull(outletConfig.getShopAddrId())) { + if (Objects.nonNull(outletConfig.getShopId())) { + ServerResponseEntity addrResponse = shopRefundAddrFeignClient.getShopRefundAddrByRefundAddrId(outletConfig.getShopAddrId()); + if (!addrResponse.isSuccess()) { + throw new LuckException(addrResponse.getMsg()); + } + ShopRefundAddrVO shopRefundAddrVO = addrResponse.getData(); + if (Objects.isNull(shopRefundAddrVO)) { + throw new LuckException("商家地址不存在"); + } + outletConfig.setPrintAddr(shopRefundAddrVO.getProvince() + shopRefundAddrVO.getCity() + shopRefundAddrVO.getArea() + shopRefundAddrVO.getAddr()); + } else if (Objects.nonNull(outletConfig.getSupplierId())) { + ServerResponseEntity addrResponse = supplierRefundAddrFeignClient.getSupplierRefundAddrByRefundAddrId(outletConfig.getShopAddrId()); + if (!addrResponse.isSuccess()) { + throw new LuckException(addrResponse.getMsg()); + } + SupplierApiRefundAddrVO refundAddrVO = addrResponse.getData(); + if (Objects.isNull(refundAddrVO)) { + throw new LuckException("商家地址不存在"); + } + outletConfig.setPrintAddr(refundAddrVO.getProvince() + refundAddrVO.getCity() + refundAddrVO.getArea() + refundAddrVO.getAddr()); + } + } + int count = outletConfigMapper.checkIsExist(outletConfig); + if (count > 0) { + throw new LuckException("请勿重复添加相同的快递公司及商家地址"); + } + } + + @Override + public void update(OutletConfig outletConfig) { + checkInfo(outletConfig); + OutletConfig dbOutlet = outletConfigMapper.getByOutletConfigId(outletConfig.getOutletConfigId()); + if (!PrincipalUtil.isDbPhone(outletConfig.getMobile(), dbOutlet.getMobile(), false)) { + throw new LuckException("请输入正确的手机号"); + } + if (outletConfig.getMobile().contains(Constant.ASTERISK)) { + outletConfig.setMobile(dbOutlet.getMobile()); + } + outletConfigMapper.update(outletConfig); + } + + @Override + public void deleteById(Long outletConfigId) { + outletConfigMapper.deleteById(outletConfigId); + } + + @Override + public void setDefault(Long outletConfigId) { + OutletConfig outletConfig = getByOutletConfig(outletConfigId, AuthUserContext.get().getSysType()); + if (Objects.isNull(outletConfig)) { + throw new LuckException("网点信息不存在"); + } + if (Objects.equals(outletConfig.getIsDefault(), 0)) { + // 设为默认 + outletConfigMapper.cancelDefault(outletConfig.getShopId(), outletConfig.getSupplierId()); + } + outletConfigMapper.setDefault(outletConfigId); + } + + @Override + @Cacheable(cacheNames = DeliveryCacheNames.OUTLET_CONFIG_LIST_KEY, key = "#shopId + ':' + #sysType") + public List listByShopId(Long shopId, Integer sysType) { + List infoList = DeliveryCompanyType.getInfoList(); + List outletList = outletConfigMapper.listByShopId(shopId, sysType); + if (CollUtil.isEmpty(outletList)) { + return infoList; + } + Map outletMap = outletList.stream().collect(Collectors.toMap(OutletConfigInfoVO::getDeliveryCompanyType, o -> o)); + for (OutletConfigInfoVO outletConfigInfoVO : infoList) { + OutletConfigInfoVO shopOutletConfig = outletMap.get(outletConfigInfoVO.getDeliveryCompanyType()); + if (Objects.isNull(shopOutletConfig)) { + continue; + } + long defaultCount = shopOutletConfig.getShopAddrList().stream().filter(addr -> Objects.equals(addr.getIsDefault(), 1)).count(); + outletConfigInfoVO.setIsConfig(1); + outletConfigInfoVO.setIsDefault(defaultCount > 0L ? 1 : 0); + outletConfigInfoVO.setShopAddrList(shopOutletConfig.getShopAddrList()); + } + return infoList; + } + + @Override + @CacheEvict(cacheNames = DeliveryCacheNames.OUTLET_CONFIG_LIST_KEY, key = "#shopId + ':' + #sysType") + public void removeCache(Long shopId, Integer sysType) {} +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/SameCityServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/SameCityServiceImpl.java new file mode 100644 index 0000000..e88c103 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/SameCityServiceImpl.java @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.bo.BmapPointBO; +import com.tmerclub.cloud.api.delivery.constant.DistanceUtil; +import com.tmerclub.cloud.api.delivery.constant.GraphUtils; +import com.tmerclub.cloud.api.delivery.constant.SameCityChargeType; +import com.tmerclub.cloud.common.cache.constant.DeliveryCacheNames; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.ShopTransFeeVO; +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.delivery.mapper.SameCityMapper; +import com.tmerclub.cloud.delivery.model.SameCity; +import com.tmerclub.cloud.delivery.service.SameCityService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 同城配送信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@Service +public class SameCityServiceImpl implements SameCityService { + + private final Logger LOGGER = LoggerFactory.getLogger(SameCityServiceImpl.class); + + @Autowired + private SameCityMapper sameCityMapper; + + @Override + public void save(SameCity sameCity) { + sameCityMapper.save(sameCity); + } + + @Override + @CacheEvict(cacheNames = DeliveryCacheNames.SAME_CITY_BY_ID_PREFIX, key = "#sameCity.shopId") + public void updateByShopId(SameCity sameCity) { + sameCityMapper.updateByShopId(sameCity); + } + + @Override + public long calculateTransFee(List shopCartItems, UserDeliveryInfoVO userDeliveryInfo) { + UserAddrVO userAddr = userDeliveryInfo.getUserAddr(); + long transFee = 0L; + if (CollectionUtil.isEmpty(shopCartItems) || Objects.isNull(userAddr)) { + LOGGER.info("计算同城配送运费,订单项为空或者用户地址为空,直接返回0"); + return transFee; + } + Long shopId = shopCartItems.get(0).getShopId(); + transFeePut(shopId, userDeliveryInfo, transFee, shopCartItems); + SameCity sameCity = getSameCityByShopId(shopId); + // 如果商家没有配好同城配送或者没有启用的模板,直接返回 -2 + if (Objects.isNull(sameCity) || Objects.equals(sameCity.getStatus(), 0)) { + LOGGER.info("计算同城配送运费,商家没有配好同城配送或者没有启用的模板,直接返回 -2"); + return -2; + } + //如果没有定位,直接返回 -1 + if (Objects.isNull(userAddr.getLat()) || Objects.isNull(userAddr.getLng())) { + LOGGER.info("计算同城配送运费,用户没有定位,直接返回 -1"); + return -1; + } + //计算当前的坐标点 + BmapPointBO bmapPoint = new BmapPointBO(userAddr.getLng(), userAddr.getLat()); + + List bmapPoints = Json.parseArray(sameCity.getPositionInfo(), BmapPointBO[].class); + + boolean point = GraphUtils.isPointInPolygon(bmapPoint, bmapPoints); + //如果不在配送范围,直接返回 -1 + if (!point) { + LOGGER.info("计算同城配送运费,用户不在配送范围,直接返回 -1"); + return -1; + } + // 计算总重、总价 + long productTotalAmount = 0; + BigDecimal productTotalWeight = new BigDecimal(0); + for (ShopCartItemVO shopCartItem : shopCartItems) { + if (shopCartItem.getMold() != null && shopCartItem.getMold() == 1) { + continue; + } + productTotalAmount += shopCartItem.getTotalAmount(); + productTotalWeight = shopCartItem.getWeight().add(productTotalWeight); + productTotalWeight = productTotalWeight.multiply(new BigDecimal(shopCartItem.getCount())); + } + //1.先判断起送费有没有够,没够直接返回 -3 + if (sameCity.getStartFee() > productTotalAmount) { + LOGGER.info("计算同城配送运费,起送费不够,直接返回 -3"); + return -3; + } + + //2.判断收费类型 2.1 固定费用先加上 + transFee = sameCity.getDeliveryFee(); + if (Objects.equals(sameCity.getChargeType(), SameCityChargeType.DISTANCE.value())) { + // 2.2按距离收费,sql查询出来的单位是m + double distance = DistanceUtil.getDistance(userAddr.getLat(), userAddr.getLng(), sameCity.getLat(), sameCity.getLng()); + distance = Arith.div(distance, 1000, 1); + + LOGGER.info("按距离收费,距离为:{},免费配送距离为:{}", distance, sameCity.getDefaultDistance()); + if (distance > sameCity.getDefaultDistance()) { + // 减去免费配送距离 + double prodContinuousPiece = Arith.sub(distance, sameCity.getDefaultDistance()); + // 超出距离的倍数,向上取整 + Integer mulNumber = (int) Math.ceil(Arith.div(prodContinuousPiece, sameCity.getOverDistance())); + // 超出距离的运费 + long continuousFee = mulNumber * sameCity.getOverDistanceFee(); + transFee += continuousFee; + LOGGER.info("按距离收费,超出距离的运费为:{}", continuousFee); + } + } + //3.按重量计算运费 + double weight = productTotalWeight.doubleValue(); + if (weight > sameCity.getFreeWeight() && Objects.nonNull(sameCity.getOverWeight()) && sameCity.getOverWeight() > 0.0) { + // 续重重量 + double prodContinuousWeight = Arith.sub(weight, sameCity.getFreeWeight()); + // 续重重量的倍数,向上取整 + int mulNumber = (int) Math.ceil(Arith.div(prodContinuousWeight, sameCity.getOverWeight())); + // 续重数量运费 + long continuousFee = mulNumber * sameCity.getOverWeightFee(); + transFee += continuousFee; + LOGGER.info("按重量计算运费,续重数量运费为:{}", continuousFee); + } + transFeePut(shopId, userDeliveryInfo, transFee, shopCartItems); + return transFee; + } + + private void transFeePut(long shopId, UserDeliveryInfoVO userDeliveryInfo, long transFee, List shopCartItems) { + Map shopIdWithShopTransFee = new HashMap<>(16); + Map supplierIdWithShopTransFeeMap = new HashMap<>(16); + Map preSaleTransFeeMap = new HashMap<>(16); + + ShopTransFeeVO shopTransFeeVO = new ShopTransFeeVO(); + shopTransFeeVO.setTransfee(transFee); + shopTransFeeVO.setFreeTransfee(0L); + shopIdWithShopTransFee.put(shopId, shopTransFeeVO); + + for (ShopCartItemVO shopCartItemVO : shopCartItems) { + //如果是预售需要处理运费 + if (!Objects.equals(shopCartItemVO.getPreSaleType(), PreSaleType.DISABLE.value())) { + LOGGER.info("计算预售商品运费,shopCartItemVO:{}", shopCartItemVO); + long deliveryTemplateId = -(shopCartItemVO.getDeliveryTemplateId() + shopCartItemVO.getSkuId()); + if (deliveryTemplateId < 0) { + shopTransFeeVO = new ShopTransFeeVO(); + shopTransFeeVO.setTransfee(transFee); + shopTransFeeVO.setDeliveryTemplateId(shopCartItemVO.getDeliveryTemplateId()); + // 没有减免运费的计算 + shopTransFeeVO.setFreeTransfee(0L); + preSaleTransFeeMap.put(shopCartItemVO.getSkuId(), shopTransFeeVO); + LOGGER.info("计算预售商品运费,shopCartItemVO:{}", shopCartItemVO); + } + } + // 开始计算供应商的运费 + Long supplierId = shopCartItemVO.getSupplierId() == null ? 0 : shopCartItemVO.getSupplierId(); + // 如果为0就不需要计算供应商的运费 + if (Objects.equals(supplierId, 0L)) { + LOGGER.info("计算供应商的运费,supplierId为0,不需要计算供应商的运费,shopCartItemVO:{}", shopCartItemVO); + continue; + } + ShopTransFeeVO supplierIdWithShopTransFee = supplierIdWithShopTransFeeMap.get(supplierId); + // 如果商家没有计算运费就初始化运费 + if (Objects.isNull(supplierIdWithShopTransFee)) { + supplierIdWithShopTransFee = new ShopTransFeeVO(); + supplierIdWithShopTransFee.setTransfee(transFee); + supplierIdWithShopTransFee.setSupplierId(supplierId); + supplierIdWithShopTransFee.setDeliveryTemplateId(shopCartItemVO.getDeliveryTemplateId()); + // 没有减免运费的计算 + supplierIdWithShopTransFee.setFreeTransfee(0L); + supplierIdWithShopTransFeeMap.put(supplierId, supplierIdWithShopTransFee); + LOGGER.info("商家没有计算运费就初始化运费,shopCartItemVO:{}", shopCartItemVO); + } + // 累加非同一个运费模板的运费 + else if (!Objects.equals(supplierIdWithShopTransFee.getDeliveryTemplateId(), shopCartItemVO.getDeliveryTemplateId())) { + supplierIdWithShopTransFee.setTransfee(transFee + supplierIdWithShopTransFee.getTransfee()); + supplierIdWithShopTransFee.setSupplierId(supplierId); + LOGGER.info("累加非同一个运费模板的运费,shopCartItemVO:{}", shopCartItemVO); + } + } + Map oldShopTransFee = userDeliveryInfo.getShopIdWithShopTransFee(); + if (Objects.nonNull(oldShopTransFee)) { + oldShopTransFee.putAll(shopIdWithShopTransFee); + } else { + userDeliveryInfo.setShopIdWithShopTransFee(shopIdWithShopTransFee); + } + Map oldPreSaleTransFeeMap = userDeliveryInfo.getPreSaleTransFeeMap(); + if (Objects.nonNull(oldPreSaleTransFeeMap)) { + oldPreSaleTransFeeMap.putAll(preSaleTransFeeMap); + } else { + userDeliveryInfo.setPreSaleTransFeeMap(preSaleTransFeeMap); + } + if (Objects.isNull(userDeliveryInfo.getSupplierIdWithShopTransFeeMap())) { + userDeliveryInfo.setSupplierIdWithShopTransFeeMap(new HashMap<>(supplierIdWithShopTransFeeMap.size())); + } + userDeliveryInfo.getSupplierIdWithShopTransFeeMap().put(shopId, supplierIdWithShopTransFeeMap); + + } + + @Override + @Cacheable(cacheNames = DeliveryCacheNames.SAME_CITY_BY_ID_PREFIX, key = "#shopId") + public SameCity getSameCityByShopId(Long shopId) { + return sameCityMapper.getByShopId(shopId); + } + + @Override + @CacheEvict(cacheNames = DeliveryCacheNames.SAME_CITY_BY_ID_PREFIX, key = "#shopId") + public void removeSameCityCacheByShopId(Long shopId) { + + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TranscityFreeServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TranscityFreeServiceImpl.java new file mode 100644 index 0000000..eed812a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TranscityFreeServiceImpl.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.delivery.mapper.TranscityFreeMapper; +import com.tmerclub.cloud.delivery.model.TranscityFree; +import com.tmerclub.cloud.delivery.service.TranscityFreeService; +import com.tmerclub.cloud.delivery.vo.TranscityFreeVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 指定条件包邮城市项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@Service +public class TranscityFreeServiceImpl implements TranscityFreeService { + + @Autowired + private TranscityFreeMapper transcityFreeMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> transcityFreeMapper.list()); + } + + @Override + public TranscityFreeVO getByTranscityFreeId(Long transcityFreeId) { + return transcityFreeMapper.getByTranscityFreeId(transcityFreeId); + } + + @Override + public void save(TranscityFree transcityFree) { + transcityFreeMapper.save(transcityFree); + } + + @Override + public void update(TranscityFree transcityFree) { + transcityFreeMapper.update(transcityFree); + } + + @Override + public void deleteById(Long transcityFreeId) { + transcityFreeMapper.deleteById(transcityFreeId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TranscityServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TranscityServiceImpl.java new file mode 100644 index 0000000..009681f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TranscityServiceImpl.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.delivery.mapper.TranscityMapper; +import com.tmerclub.cloud.delivery.model.Transcity; +import com.tmerclub.cloud.delivery.service.TranscityService; +import com.tmerclub.cloud.delivery.vo.TranscityVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 运费项和运费城市关联信息 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@Service +public class TranscityServiceImpl implements TranscityService { + + @Autowired + private TranscityMapper transcityMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> transcityMapper.list()); + } + + @Override + public TranscityVO getByTranscityId(Long transcityId) { + return transcityMapper.getByTranscityId(transcityId); + } + + @Override + public void save(Transcity transcity) { + transcityMapper.save(transcity); + } + + @Override + public void update(Transcity transcity) { + transcityMapper.update(transcity); + } + + @Override + public void deleteById(Long transcityId) { + transcityMapper.deleteById(transcityId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransfeeFreeServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransfeeFreeServiceImpl.java new file mode 100644 index 0000000..83a3d1d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransfeeFreeServiceImpl.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.TransfeeFreeVO; +import com.tmerclub.cloud.delivery.mapper.TransfeeFreeMapper; +import com.tmerclub.cloud.delivery.service.TransfeeFreeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 指定条件包邮项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@Service +public class TransfeeFreeServiceImpl implements TransfeeFreeService { + + @Autowired + private TransfeeFreeMapper transfeeFreeMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> transfeeFreeMapper.list()); + } + + @Override + public TransfeeFreeVO getByTransfeeFreeId(Long transfeeFreeId) { + return transfeeFreeMapper.getByTransfeeFreeId(transfeeFreeId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransfeeServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransfeeServiceImpl.java new file mode 100644 index 0000000..9782f8e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/service/impl/TransfeeServiceImpl.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.TransfeeVO; +import com.tmerclub.cloud.delivery.mapper.TransfeeMapper; +import com.tmerclub.cloud.delivery.model.Transfee; +import com.tmerclub.cloud.delivery.service.TransfeeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 运费项 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:01 + */ +@Service +public class TransfeeServiceImpl implements TransfeeService { + + @Autowired + private TransfeeMapper transfeeMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> transfeeMapper.list()); + } + + @Override + public TransfeeVO getByTransfeeId(Long transfeeId) { + return transfeeMapper.getByTransfeeId(transfeeId); + } + + @Override + public void save(Transfee transfee) { + transfeeMapper.save(transfee); + } + + @Override + public void update(Transfee transfee) { + transfeeMapper.update(transfee); + } + + @Override + public void deleteById(Long transfeeId) { + transfeeMapper.deleteById(transfeeId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryOrderVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryOrderVO.java new file mode 100644 index 0000000..36c0edf --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/DeliveryOrderVO.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单快递信息VO + * + * @author FrozenWatermelon + * @date 2020-12-07 15:10:00 + */ +public class DeliveryOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单物流包裹id") + private Long deliveryOrderId; + + @Schema(description = "订单号") + private Long orderId; + + @Schema(description = "快递公司id") + private Long deliveryCompanyId; + + @Schema(description = "快递单号") + private String deliveryNo; + + @Schema(description = "收件人姓名") + private String consigneeName; + + @Schema(description = "收件人电话(顺丰快递需要)") + private String consigneeMobile; + + @Schema(description = "物流状态 1正常 -1删除") + private Integer status; + + @Schema(description = "包裹商品总数") + private Integer allCount; + + @Schema(description = "删除时间") + private Date deleteTime; + + @Schema(description = "物流名称") + private String deliveryName; + + @Schema(description = "发货方式 1快递 3无需物流") + private Integer deliveryType; + + public Long getDeliveryOrderId() { + return deliveryOrderId; + } + + public void setDeliveryOrderId(Long deliveryOrderId) { + this.deliveryOrderId = deliveryOrderId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getDeliveryCompanyId() { + return deliveryCompanyId; + } + + public void setDeliveryCompanyId(Long deliveryCompanyId) { + this.deliveryCompanyId = deliveryCompanyId; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Date getDeleteTime() { + return deleteTime; + } + + public void setDeleteTime(Date deleteTime) { + this.deleteTime = deleteTime; + } + + public String getDeliveryName() { + return deliveryName; + } + + public void setDeliveryName(String deliveryName) { + this.deliveryName = deliveryName; + } + + public String getConsigneeName() { + return consigneeName; + } + + public void setConsigneeName(String consigneeName) { + this.consigneeName = consigneeName; + } + + public String getConsigneeMobile() { + return consigneeMobile; + } + + public void setConsigneeMobile(String consigneeMobile) { + this.consigneeMobile = consigneeMobile; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + @Override + public String toString() { + return "DeliveryOrderVO{" + + "deliveryOrderId=" + deliveryOrderId + + ", orderId=" + orderId + + ", deliveryCompanyId=" + deliveryCompanyId + + ", deliveryNo='" + deliveryNo + '\'' + + ", consigneeName='" + consigneeName + '\'' + + ", consigneeMobile='" + consigneeMobile + '\'' + + ", status=" + status + + ", allCount=" + allCount + + ", deleteTime=" + deleteTime + + ", deliveryName='" + deliveryName + '\'' + + ", deliveryType=" + deliveryType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigVO.java new file mode 100644 index 0000000..f67c6af --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/OutletConfigVO.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 网点配置VO + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public class OutletConfigVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "网点配置id") + private Long outletConfigId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "快递公司类型") + private Integer deliveryCompanyType; + + @Schema(description = "发货人") + private String shipper; + + @Schema(description = "发货人电话") + private String mobile; + + @Schema(description = "电子面单客户账户或月结账号") + private String partnerId; + + @Schema(description = "电子面单密码") + private String partnerKey; + + @Schema(description = "收件网点名称") + private String net; + + @Schema(description = "纸张规格 1.一联面单 2.二联面单") + private Integer paperSize; + + @Schema(description = "是否默认 0否1是") + private Integer isDefault; + + @Schema(description = "发货地址") + private String printAddr; + + public Long getOutletConfigId() { + return outletConfigId; + } + + public void setOutletConfigId(Long outletConfigId) { + this.outletConfigId = outletConfigId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getDeliveryCompanyType() { + return deliveryCompanyType; + } + + public void setDeliveryCompanyType(Integer deliveryCompanyType) { + this.deliveryCompanyType = deliveryCompanyType; + } + + public String getShipper() { + return shipper; + } + + public void setShipper(String shipper) { + this.shipper = shipper; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getPartnerId() { + return partnerId; + } + + public void setPartnerId(String partnerId) { + this.partnerId = partnerId; + } + + public String getPartnerKey() { + return partnerKey; + } + + public void setPartnerKey(String partnerKey) { + this.partnerKey = partnerKey; + } + + public String getNet() { + return net; + } + + public void setNet(String net) { + this.net = net; + } + + public Integer getPaperSize() { + return paperSize; + } + + public void setPaperSize(Integer paperSize) { + this.paperSize = paperSize; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getPrintAddr() { + return printAddr; + } + + public void setPrintAddr(String printAddr) { + this.printAddr = printAddr; + } + + @Override + public String toString() { + return "OutletConfigVO{" + + "outletConfigId=" + outletConfigId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", deliveryCompanyType=" + deliveryCompanyType + + ", shipper='" + shipper + '\'' + + ", mobile='" + mobile + '\'' + + ", partnerId='" + partnerId + '\'' + + ", partnerKey='" + partnerKey + '\'' + + ", net='" + net + '\'' + + ", paperSize=" + paperSize + + ", isDefault=" + isDefault + + ", printAddr='" + printAddr + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/PrinterVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/PrinterVO.java new file mode 100644 index 0000000..56db36a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/delivery/vo/PrinterVO.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.delivery.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 打印机VO + * + * @author TRACK + * @date 2023-08-23 14:48:23 + */ +public class PrinterVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "打印机id") + private Long printerId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "打印机名称") + private String printerName; + + @Schema(description = "设备码") + private String siid; + + @Schema(description = "打印机备注") + private String printerRemark; + + @Schema(description = "是否默认 0否1是") + private Integer isDefault; + + public Long getPrinterId() { + return printerId; + } + + public void setPrinterId(Long printerId) { + this.printerId = printerId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getPrinterName() { + return printerName; + } + + public void setPrinterName(String printerName) { + this.printerName = printerName; + } + + public String getSiid() { + return siid; + } + + public void setSiid(String siid) { + this.siid = siid; + } + + public String getPrinterRemark() { + return printerRemark; + } + + public void setPrinterRemark(String printerRemark) { + this.printerRemark = printerRemark; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + @Override + public String toString() { + return "PrinterVO{" + + "printerId=" + printerId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",shopId=" + shopId + + ",supplierId=" + supplierId + + ",printerName=" + printerName + + ",siid=" + siid + + ",printerRemark=" + printerRemark + + ",isDefault=" + isDefault + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoAllotOrderItemBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoAllotOrderItemBO.java new file mode 100644 index 0000000..3652bd8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoAllotOrderItemBO.java @@ -0,0 +1,108 @@ +package com.tmerclub.cloud.order.bo.mongo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @since 2023-11-24 + */ +public class MongoAllotOrderItemBO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 调拨订单商品id + */ + private Long allotOrderItemId; + + /** + * 调拨订单id + */ + private Long allotOrderId; + + /** + * 商品spuId + */ + private Long spuId; + + /** + * 商品skuId + */ + private Long skuId; + + /** + * 调拨数量 + */ + private Integer allotCount; + + /** + * 调拨入库数量 + */ + private Integer allotInCount; + + public MongoAllotOrderItemBO() { + } + + public Long getAllotOrderItemId() { + return allotOrderItemId; + } + + public void setAllotOrderItemId(Long allotOrderItemId) { + this.allotOrderItemId = allotOrderItemId; + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + public Integer getAllotInCount() { + return allotInCount; + } + + public void setAllotInCount(Integer allotInCount) { + this.allotInCount = allotInCount; + } + + + @Override + public String toString() { + return "MongoAllotOrderItemBO{" + + "allotOrderItemId=" + allotOrderItemId + + ", allotOrderId=" + allotOrderId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", allotCount=" + allotCount + + ", allotInCount=" + allotInCount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderRefundBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderRefundBO.java new file mode 100644 index 0000000..4ea10e6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderRefundBO.java @@ -0,0 +1,799 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.bo.mongo; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单退款记录信息 + * + * @author YXF + * @date 2022/8/23 + */ +@CompoundIndexes({ + @CompoundIndex(name = "user_idx", def = "{'userId':1}"), + @CompoundIndex(name = "order_idx", def = "{'orderId':1}"), + @CompoundIndex(name = "pay_idx", def = "{'payId':1}"), + @CompoundIndex(name = "shop_idx", def = "{'shopId':1}"), + @CompoundIndex(name = "supplier_idx", def = "{'supplierId':1}") +}) +@Document("order_refund") +public class MongoOrderRefundBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款记录ID + */ + @Id + private Long refundId; + + /** + * 店铺ID + */ + private Long shopId; + /** + * 供应商id + */ + private Long supplierId; + + /** + * 支付类型 0默认 1通联支付 + */ + private Integer paySysType; + + /** + * 买家ID + */ + private Long userId; + + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 订单更新时间 + */ + private Date updateTime; + + /** + * 订单号 + */ + private Long orderId; + + /** + * 关联的支付单号 + */ + private Long payId; + + /** + * 订单项ID(0:为全部订单项) + */ + private Long orderItemId; + + /** + * 退货数量(0:为全部订单项) + */ + private Integer refundCount; + + /** + * 退还积分 + */ + private Long refundScore; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + */ + private Long platformRefundAmount; + + /** + * 平台退款佣金 + */ + private Long platformRefundCommission; + + /** + * 退款单总分销金额 + */ + private Long distributionTotalAmount; + + /** + * 退款单类型(1:整单退款,2:单个物品退款) + */ + private Integer refundType; + + /** + * 申请类型:1,仅退款,2退款退货 + */ + private Integer applyType; + + /** + * 是否接收到商品(1:已收到,0:未收到) + */ + private Integer isReceived; + + /** + * 退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭) + */ + private Integer closeType; + + /** + * 处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType + */ + private Integer returnMoneySts; + + /** + * 申请原因 见 BuyerReasonType + */ + private Integer buyerReason; + + /** + * 申请说明 + */ + private String buyerDesc; + + /** + * 联系方式(退款时留下的手机号码) + */ + private String buyerMobile; + + /** + * 文件凭证(逗号隔开) + */ + private String imgUrls; + + /** + * 超时时间(超过该时间不处理,系统将自动处理)(保留字段) + */ + private Date overTime; + + /** + * 拒绝原因 + */ + private String rejectMessage; + + /** + * 卖家备注 + */ + private String sellerMsg; + + /** + * 受理时间 + */ + private Date handelTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 收货时间 + */ + private Date receiveTime; + + /** + * 关闭时间 + */ + private Date closeTime; + + /** + * 确定时间(确定退款时间) + */ + private Date decisionTime; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 移交供应商时间 + */ + private Date supplierTime; + + /** + * 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + */ + private Integer supplierHandleStatus; + /** + * 采购退款金额 + */ + private Long purchaseRefundAmount; + /** + * 采购的平台佣金退款金额 + */ + private Long purPlatformRefundCommission; + /** + * 订单运费 + */ + private Long freightAmount; + /** + * 是否待采购 1.是 0.否 2.已处理 + */ + private Long waitPurchase; + + /** + * 订单类型 0普通订单 1团购订单 2秒杀订单 3积分订单 + */ + private Integer orderType; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 退款订单项 + * @return + */ + private List orderItems; + + /** + * 订单状态 + * @return + */ + private Integer orderStatus; + + /** + * 退款退回的赠品订单项ids + * @return + */ + private String returnGiveawayIds; + + /** + * 退款支付类型 + */ + private Integer payType; + + /** + * 平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功 + */ + private Integer platformInterventionStatus; + + /** + * 用户申请介入理由 + */ + private String applyInterventionReason; + + /** + * 用户申请介入凭证 + */ + private String applyInterventionImgUrls; + + /** + * 平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款 + */ + private Integer interventionRefundType; + + /** + * 平台介入前的退款金额 + */ + private Long afterInterventionRefundAmount; + + /** + * 平台留言 + */ + private String platformMessage; + + /** + * 申请介入时间 + */ + private Date applyInterventionTime; + + /** + * 介入完成时间 + */ + private Date interventionFinishTime; + + public Integer getPlatformInterventionStatus() { + return platformInterventionStatus; + } + + public void setPlatformInterventionStatus(Integer platformInterventionStatus) { + this.platformInterventionStatus = platformInterventionStatus; + } + + public String getApplyInterventionReason() { + return applyInterventionReason; + } + + public void setApplyInterventionReason(String applyInterventionReason) { + this.applyInterventionReason = applyInterventionReason; + } + + public String getApplyInterventionImgUrls() { + return applyInterventionImgUrls; + } + + public void setApplyInterventionImgUrls(String applyInterventionImgUrls) { + this.applyInterventionImgUrls = applyInterventionImgUrls; + } + + public Integer getInterventionRefundType() { + return interventionRefundType; + } + + public void setInterventionRefundType(Integer interventionRefundType) { + this.interventionRefundType = interventionRefundType; + } + + public Long getAfterInterventionRefundAmount() { + return afterInterventionRefundAmount; + } + + public void setAfterInterventionRefundAmount(Long afterInterventionRefundAmount) { + this.afterInterventionRefundAmount = afterInterventionRefundAmount; + } + + public String getPlatformMessage() { + return platformMessage; + } + + public void setPlatformMessage(String platformMessage) { + this.platformMessage = platformMessage; + } + + public Date getApplyInterventionTime() { + return applyInterventionTime; + } + + public void setApplyInterventionTime(Date applyInterventionTime) { + this.applyInterventionTime = applyInterventionTime; + } + + public Date getInterventionFinishTime() { + return interventionFinishTime; + } + + public void setInterventionFinishTime(Date interventionFinishTime) { + this.interventionFinishTime = interventionFinishTime; + } + + public String getReturnGiveawayIds() { + return returnGiveawayIds; + } + + public void setReturnGiveawayIds(String returnGiveawayIds) { + this.returnGiveawayIds = returnGiveawayIds; + } + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + public Date getSupplierTime() { + return supplierTime; + } + + public void setSupplierTime(Date supplierTime) { + this.supplierTime = supplierTime; + } + + public Long getPurPlatformRefundCommission() { + return purPlatformRefundCommission; + } + + public void setPurPlatformRefundCommission(Long purPlatformRefundCommission) { + this.purPlatformRefundCommission = purPlatformRefundCommission; + } + + public Long getPurchaseRefundAmount() { + return purchaseRefundAmount; + } + + public void setPurchaseRefundAmount(Long purchaseRefundAmount) { + this.purchaseRefundAmount = purchaseRefundAmount; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public Long getPlatformRefundCommission() { + return platformRefundCommission; + } + + public void setPlatformRefundCommission(Long platformRefundCommission) { + this.platformRefundCommission = platformRefundCommission; + } + + public Long getDistributionTotalAmount() { + return distributionTotalAmount; + } + + public void setDistributionTotalAmount(Long distributionTotalAmount) { + this.distributionTotalAmount = distributionTotalAmount; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Date getOverTime() { + return overTime; + } + + public void setOverTime(Date overTime) { + this.overTime = overTime; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Date getHandelTime() { + return handelTime; + } + + public void setHandelTime(Date handelTime) { + this.handelTime = handelTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getCloseTime() { + return closeTime; + } + + public void setCloseTime(Date closeTime) { + this.closeTime = closeTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public Long getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Long waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + @Override + public String toString() { + return "MongoOrderRefundBO{" + + "refundId=" + refundId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", paySysType=" + paySysType + + ", userId=" + userId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", orderId=" + orderId + + ", payId=" + payId + + ", orderItemId=" + orderItemId + + ", refundCount=" + refundCount + + ", refundScore=" + refundScore + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", platformRefundCommission=" + platformRefundCommission + + ", distributionTotalAmount=" + distributionTotalAmount + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", closeType=" + closeType + + ", returnMoneySts=" + returnMoneySts + + ", buyerReason=" + buyerReason + + ", buyerDesc='" + buyerDesc + '\'' + + ", buyerMobile='" + buyerMobile + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", overTime=" + overTime + + ", rejectMessage='" + rejectMessage + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + ", handelTime=" + handelTime + + ", deliveryTime=" + deliveryTime + + ", receiveTime=" + receiveTime + + ", closeTime=" + closeTime + + ", decisionTime=" + decisionTime + + ", refundTime=" + refundTime + + ", supplierTime=" + supplierTime + + ", supplierHandleStatus=" + supplierHandleStatus + + ", purchaseRefundAmount=" + purchaseRefundAmount + + ", purPlatformRefundCommission=" + purPlatformRefundCommission + + ", freightAmount=" + freightAmount + + ", waitPurchase=" + waitPurchase + + ", orderType=" + orderType + + ", shopName='" + shopName + '\'' + + ", orderItems=" + orderItems + + ", orderStatus=" + orderStatus + + ", returnGiveawayIds='" + returnGiveawayIds + '\'' + + ", payType=" + payType + + ", platformInterventionStatus=" + platformInterventionStatus + + ", applyInterventionReason='" + applyInterventionReason + '\'' + + ", applyInterventionImgUrls='" + applyInterventionImgUrls + '\'' + + ", interventionRefundType=" + interventionRefundType + + ", afterInterventionRefundAmount=" + afterInterventionRefundAmount + + ", platformMessage='" + platformMessage + '\'' + + ", applyInterventionTime=" + applyInterventionTime + + ", interventionFinishTime=" + interventionFinishTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderRefundItemBO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderRefundItemBO.java new file mode 100644 index 0000000..ca35182 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/bo/mongo/MongoOrderRefundItemBO.java @@ -0,0 +1,399 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.bo.mongo; + +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import org.springframework.data.annotation.Transient; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单退款记录信息 + * + * @author YXF + * @date 2022/8/23 + */ +public class MongoOrderRefundItemBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单项id + */ + private Long orderItemId; + + /** + * 商品id + */ + private Long spuId; + + /** + * skuId + */ + private Long skuId; + + /** + * 中文商品名称 + */ + private String spuNameZh; + + /** + * 英文商品名称 + */ + private String spuNameEn; + + /** + * 中文sku名称 + */ + private String skuNameZh; + + /** + * 英文sku名称 + */ + private String skuNameEn; + + /** + * 商品图片 + */ + private String pic; + + /** + * 供应商商品名称 + */ + private String supplierSpuName; + + /** + * 供应商sku名称 + */ + private String supplierSkuName; + + /** + * 供应商中文商品名称 + */ + private String supplierSpuNameZh; + + /** + * 供应商英文商品名称 + */ + private String supplierSpuNameEn; + + /** + * 供应商中文sku名称 + */ + private String supplierSkuNameZh; + + /** + * 供应商英文sku名称 + */ + private String supplierSkuNameEn; + + /** + * 供应商商品图片 + */ + private String supplierPic; + + /** + * sku编码 + */ + private String partyCode; + + /** + * 商品数量 + */ + private Integer count; + + /** + * 商品价格 + */ + private Long price; + + /** + * 产品总价格 + */ + private Long spuTotalAmount; + + /** + * 商品实际金额 + */ + private Long actualTotal; + + /** + * 商品实际金额 + */ + private Long refundAmount; + + /** + * 平台优惠金额 + */ + private Long platformShareReduce; + + /** + * 退还积分 + */ + private Long refundScore; + + /** + * 活动id + */ + private Long activityId; + + /** + * 活动类型 + */ + private Integer activityType; + + /** + * 订单项国际化信息 + * @return + */ + @Transient + private List orderItemLangList; + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierSpuNameZh() { + return supplierSpuNameZh; + } + + public void setSupplierSpuNameZh(String supplierSpuNameZh) { + this.supplierSpuNameZh = supplierSpuNameZh; + } + + public String getSupplierSpuNameEn() { + return supplierSpuNameEn; + } + + public void setSupplierSpuNameEn(String supplierSpuNameEn) { + this.supplierSpuNameEn = supplierSpuNameEn; + } + + public String getSupplierSkuNameZh() { + return supplierSkuNameZh; + } + + public void setSupplierSkuNameZh(String supplierSkuNameZh) { + this.supplierSkuNameZh = supplierSkuNameZh; + } + + public String getSupplierSkuNameEn() { + return supplierSkuNameEn; + } + + public void setSupplierSkuNameEn(String supplierSkuNameEn) { + this.supplierSkuNameEn = supplierSkuNameEn; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + public String getSkuNameEn() { + return skuNameEn; + } + + public void setSkuNameEn(String skuNameEn) { + this.skuNameEn = skuNameEn; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + @Override + public String toString() { + return "MongoOrderRefundItemBO{" + + "orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", skuNameEn='" + skuNameEn + '\'' + + ", pic='" + pic + '\'' + + ", partyCode='" + partyCode + '\'' + + ", count=" + count + + ", price=" + price + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", refundAmount=" + refundAmount + + ", platformShareReduce=" + platformShareReduce + + ", refundScore=" + refundScore + + ", orderItemLangList=" + orderItemLangList + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", supplierSpuNameZh='" + supplierSpuNameZh + '\'' + + ", supplierSpuNameEn='" + supplierSpuNameEn + '\'' + + ", supplierSkuNameZh='" + supplierSkuNameZh + '\'' + + ", supplierSkuNameEn='" + supplierSkuNameEn + '\'' + + ", supplierPic='" + supplierPic + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/AllotOrderStatusEnum.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/AllotOrderStatusEnum.java new file mode 100644 index 0000000..a035750 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/AllotOrderStatusEnum.java @@ -0,0 +1,46 @@ +package com.tmerclub.cloud.order.constant; + +/** + * 调拨订单状态 + * @author gaozijie + * @date 2023-11-20 + */ +public enum AllotOrderStatusEnum { + + /** + * 已作废 + */ + VOIDED(0, "已作废"), + + /** + * 待发货 + */ + WAIT_STOCK(1, "待入库"), + + /** + * 部分入库 + */ + PARTIALLY_STOCK(2, "部分入库"), + + /** + * 已完成 + */ + COMPLETION(3, "已完成"); + + private final Integer num; + + private final String desc; + + AllotOrderStatusEnum(Integer num, String desc) { + this.num = num; + this.desc = desc; + } + + public Integer getNum() { + return num; + } + + public String getDesc() { + return desc; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/InvoiceHeaderType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/InvoiceHeaderType.java new file mode 100644 index 0000000..75184fc --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/InvoiceHeaderType.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 发票抬头类型 1.单位 2.个人 + * @author TRACK + */ +public enum InvoiceHeaderType { + /** + * 单位 + */ + COMPANY(1), + /** + * 个人 + */ + PERSONAL(2); + + private final Integer num; + + InvoiceHeaderType(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static InvoiceHeaderType instance(Integer value) { + InvoiceHeaderType[] enums = values(); + for (InvoiceHeaderType headerType : enums) { + if (headerType.value().equals(value)) { + return headerType; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/OrderInvoiceState.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/OrderInvoiceState.java new file mode 100644 index 0000000..17cf7ac --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/OrderInvoiceState.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 发票状态 1.申请中 2.已开票 + * @author TRACK + */ +public enum OrderInvoiceState { + + /** + * 申请中 + */ + APPLICATION(1), + /** + * 已开票 + */ + ISSUED(2); + + private final Integer num; + + OrderInvoiceState(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static OrderInvoiceState instance(Integer value) { + OrderInvoiceState[] enums = values(); + for (OrderInvoiceState stateEnum : enums) { + if (stateEnum.value().equals(value)) { + return stateEnum; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundCloseType.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundCloseType.java new file mode 100644 index 0000000..d599da8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/constant/RefundCloseType.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.constant; + +/** + * 退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭) + * @author FrozenWatermelon + */ +public enum RefundCloseType { + /** + * 买家撤销退款 + */ + CANCEL(1), + /** + * 卖家拒绝退款 + */ + DISAGREE(2), + /** + * 退款申请超时被系统关闭 + */ + TIME_OUT(3); + + private final Integer num; + + RefundCloseType(Integer num) { + this.num = num; + } + + public Integer value() { + return num; + } + + public static RefundCloseType instance(Integer value) { + RefundCloseType[] enums = values(); + for (RefundCloseType refundHandleType : enums) { + if (refundHandleType.value().equals(value)) { + return refundHandleType; + } + } + return null; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/admin/OrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/admin/OrderController.java new file mode 100644 index 0000000..94ec837 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/admin/OrderController.java @@ -0,0 +1,588 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.tmerclub.cloud.api.delivery.dto.ChangeOrderAddrDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.feign.EsOrderFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopRefundAddrFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.payment.constant.PayEntry; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.api.product.feign.ProductFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.vo.SkuAddrVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.constant.Constant; +import com.tmerclub.cloud.order.dto.OrderAddrDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderAdminDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderChangeAddrDTO; +import com.tmerclub.cloud.order.listener.OrderExcelListener; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.UnDeliveryOrderExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon on 2018/09/15. + */ +@RestController("adminOrderController") +@RequestMapping("/mp/order") +public class OrderController { + + @Autowired + private OrderService orderService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private OrderPreSaleInfoService orderPreSaleInfoService; + @Autowired + private OrderExcelService orderExcelService; + @Autowired + private OrderAddrService orderAddrService; + @Autowired + private DeliveryManager deliveryManager; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderSelfStationService orderSelfStationService; + @Autowired + private OrderRefundService orderRefundService; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private ShopWalletFeignClient shopWalletFeignClient; + @DubboReference + private ProductFeignClient productFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private EsOrderFeignClient esOrderFeignClient; + @DubboReference + private PaymentFeignClient paymentFeignClient; + @DubboReference + private ShopRefundAddrFeignClient shopRefundAddrFeignClient; + @Autowired + private RocketMQTemplate sendNotifyToShopTemplate; + + private static final Logger logger = LoggerFactory.getLogger(OrderController.class); + + + /** + * 分页获取 + */ + @GetMapping("/page") + public ServerResponseEntity> page(OrderSearchDTO orderSearchDTO) { + if (Objects.equals(orderSearchDTO.getStatus(), OrderStatus.PAYED.value())) { + orderSearchDTO.setWaitPurchase(0); + } + orderSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + if (Objects.equals(orderSearchDTO.getStatus(), Constant.WAIT_PURCHASES_STATUS)) { + orderSearchDTO.setStatus(OrderStatus.PAYED.value()); + orderSearchDTO.setWaitPurchase(1); + } + EsPageVO orderPage = orderService.orderPage(orderSearchDTO); + List userIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List supplierIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (EsOrderVO esOrderVO : orderPage.getList()) { + userIds.add(esOrderVO.getUserId()); + supplierIds.add(esOrderVO.getSupplierId()); + } + List userList = userFeignClient.getUserByUserIds(userIds).getData(); + Map userMap = userList.stream().collect(Collectors.toMap(UserApiVO::getUserId, UserApiVO::getNickName)); + List shopDetailList = supplierDetailFeignClient.listBySupplierIds(supplierIds).getData(); + Map supplierMobileMap = shopDetailList.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getContactPhone)); + // 处理下发货完成时能否修改物流 + for (EsOrderVO esOrderVO : orderPage.getList()) { + if (!Objects.equals(esOrderVO.getSupplierId(), 0L) && supplierMobileMap.containsKey(esOrderVO.getSupplierId())) { + esOrderVO.setSupplierMobile(supplierMobileMap.get(esOrderVO.getSupplierId())); + } + esOrderVO.setUserName(null == userMap.get(esOrderVO.getUserId()) ? "*用户已注销*" : userMap.get(esOrderVO.getUserId())); + esOrderVO.setIsWriteOff(Objects.isNull(userMap.get(esOrderVO.getUserId()))); + // 处理赠品列表 + Map> giveawayMap = esOrderVO.getOrderItems().stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + // 处理组合列表 + Map> comboMap = esOrderVO.getOrderItems().stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + if (MapUtil.isNotEmpty(giveawayMap) || MapUtil.isNotEmpty(comboMap)) { + Iterator iterator = esOrderVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + EsOrderItemVO orderItem = iterator.next(); + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + } + orderItem.setGiveawayList(giveawayMap.get(orderItem.getOrderItemId())); + orderItem.setComboList(comboMap.get(orderItem.getOrderItemId())); + } + } + + if (StrUtil.isNotBlank(esOrderVO.getMobile())) { + esOrderVO.setMobile(PhoneUtil.hideBetween(esOrderVO.getMobile()).toString()); + } + int updateOrViewDeliveryInfo = 0; + if (!Objects.equals(esOrderVO.getStatus(), OrderStatus.CONSIGNMENT.value()) || + !Objects.equals(esOrderVO.getDeliveryType(), DeliveryType.DELIVERY.value())) { + continue; + } + for (EsOrderItemVO orderItem : esOrderVO.getOrderItems()) { + if (Objects.nonNull(orderItem.getDeliveryType()) && Objects.equals(orderItem.getDeliveryType(), DeliveryType.DELIVERY.value())) { + updateOrViewDeliveryInfo = 1; + break; + } + } + esOrderVO.setUpdateOrViewDeliveryInfo(updateOrViewDeliveryInfo); + } + return ServerResponseEntity.success(orderPage); + } + + /** + * 获取信息 + */ + @GetMapping("/order_info/{orderId}") + public ServerResponseEntity info(@PathVariable("orderId") Long orderId) { + // 订单和订单项 + Order order = orderService.getOrderAndOrderItemData(orderId, AuthUserContext.get().getTenantId()); + logger.info("获取订单和订单项信息:{}", order.toString()); + // 详情用户收货地址 + OrderAddr orderAddr = orderAddrService.getById(order.getOrderAddrId()); + order.setOrderAddr(BeanUtil.map(orderAddr, OrderAddr.class)); + OrderVO orderVO = BeanUtil.map(order, OrderVO.class); + if (Objects.nonNull(orderVO.getOrderAddr()) && StrUtil.isNotBlank(orderVO.getOrderAddr().getMobile())) { + orderVO.getOrderAddr().setMobile(PhoneUtil.hideBetween(orderVO.getOrderAddr().getMobile()).toString()); + } + orderService.getReturnOrderStatus(orderVO); + // 处理下赠品 + List orderItemDbList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 获取赠品map + Map> giveawayMap = orderVO.getOrderItems().stream().filter(item -> Objects.equals(item.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + // 获取组合map + Map> comboMap = orderVO.getOrderItems().stream().filter(item -> Objects.equals(item.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + // 赠品订单项不需要进行处理 + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + continue; + } + // 放入赠品 + if (giveawayMap.containsKey(orderItem.getOrderItemId())) { + List orderItemVOList = giveawayMap.get(orderItem.getOrderItemId()); + orderItem.setGiveawayList(orderItemVOList); + } + // 放入组合子商品项 + if (comboMap.containsKey(orderItem.getOrderItemId())) { + List orderItemVOList = comboMap.get(orderItem.getOrderItemId()); + orderItem.setComboItemList(orderItemVOList); + } + orderItemDbList.add(orderItem); + } + orderVO.setOrderItems(orderItemDbList); + logger.info(orderVO.toString()); + // 补充自提点信息 + if (order.getDeliveryType() != null + && DeliveryType.STATION.value().equals(order.getDeliveryType())) { + OrderSelfStationVO stationVO = orderSelfStationService.getStationByOrderId(null, orderId); + logger.info("获取自提点信息stationVO:{}", stationVO); + orderVO.setOrderSelfStationVO(stationVO); + } + // 补充供应商信息 + Long supplierId = order.getSupplierId(); + if (supplierId == null || supplierId == 0L) { + List supplierIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuIds = orderItemDbList.stream().map(OrderItemVO::getSpuId).collect(Collectors.toList()); + List spuVOList = productFeignClient.listSpuBySpuIds(spuIds).getData(); + if (!CollectionUtils.isEmpty(spuVOList)) { + supplierIds = spuVOList.stream().map(SpuVO::getSupplierId).filter(Objects::nonNull).collect(Collectors.toList()); + } + if (!CollectionUtils.isEmpty(supplierIds)) { + // 商品默认的供应商id是-1 + supplierId = supplierIds.get(0); + } + } + if (supplierId != null + && supplierId != 0L && supplierId != -1L) { + SupplierDetailBO supplierDetailBO = supplierDetailFeignClient.getSupplierBySupplierId(supplierId).getData(); + logger.info("获取供应商信息supplierDetailBO:{}", supplierDetailBO); + if (supplierDetailBO != null) { + orderVO.setSupplierId(supplierDetailBO.getSupplierId()); + orderVO.setSupplierName(supplierDetailBO.getSupplierName()); + orderVO.setSupplierMobile(supplierDetailBO.getContactPhone()); + } + } + // 预售订单获取预售信息 + if (Objects.nonNull(order.getPreSaleType()) && !Objects.equals(order.getPreSaleType(), PreSaleType.DISABLE.value())) { + OrderPreSaleInfoVO orderPreSaleInfo = orderPreSaleInfoService.getByOrderId(order.getOrderId()); + logger.info("获取预售信息orderPreSaleInfo:{}", orderPreSaleInfo); + orderVO.setPayTime(orderPreSaleInfo.getBalancePayTime()); + orderVO.setOrderPreSaleInfoVO(orderPreSaleInfo); + } + //套餐优惠金额 + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + if (Objects.isNull(orderItem.getComboAmount())) { + continue; + } + orderItem.setShareReduce(orderItem.getShareReduce() + orderItem.getComboAmount()); + } + return ServerResponseEntity.success(orderVO); + } + + /** + * 获取订单用户下单地址 + */ + @GetMapping("/order_addr/{orderAddrId}") + public ServerResponseEntity getOrderAddr(@PathVariable("orderAddrId") Long orderAddrId) { + OrderAddr orderAddr = orderAddrService.getById(orderAddrId); + return ServerResponseEntity.success(BeanUtil.map(orderAddr, OrderAddrVO.class)); + } + + /** + * 订单项待发货数量查询 + */ + @GetMapping("/order_item_and_address/{orderId}") + public ServerResponseEntity getOrderItemAndAddress(@PathVariable("orderId") Long orderId) { + // 订单和订单项 + Order order = orderService.getOrderAndOrderItemData(orderId, AuthUserContext.get().getTenantId()); + OrderVO orderVO = BeanUtil.map(order, OrderVO.class); + List orderItems = orderVO.getOrderItems(); + for (OrderItemVO orderItem : orderItems) { + orderItem.setChangeNum(orderItem.getBeDeliveredNum() != -1 ? orderItem.getBeDeliveredNum() : orderItem.getCount()); + } + // 用户收货地址 + OrderAddr orderAddr = orderAddrService.getById(order.getOrderAddrId()); + OrderAddrVO orderAddrVO = BeanUtil.map(orderAddr, OrderAddrVO.class); + orderVO.setOrderAddr(orderAddrVO); + return ServerResponseEntity.success(orderVO); + } + + /** + * 发货 + */ + @PostMapping("/delivery") + public ServerResponseEntity delivery(@Valid @RequestBody DeliveryOrderDTO deliveryOrderParam) { + // TODO 检查发货数量 + Order order = orderService.getOrderAndOrderItemData(deliveryOrderParam.getOrderId(), AuthUserContext.get().getTenantId()); + logger.info("获取订单信息order:{}", order); + if (Objects.isNull(order)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 订单不在支付状态 + if (!Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + return ServerResponseEntity.showFailMsg("该订单状态异常"); + } + // 订单不在支付状态 + if (Objects.equals(order.getWaitPurchase(), 1)) { + return ServerResponseEntity.showFailMsg("该订单状态异常"); + } + List selectOrderItems = deliveryOrderParam.getSelectOrderItems(); + if (CollUtil.isEmpty(selectOrderItems)) { + return ServerResponseEntity.showFailMsg("请至少选择一个订单项进行发货操作"); + } + Map orderItemMap = order.getOrderItems().stream().collect(Collectors.toMap(OrderItem::getOrderItemId, orderItem -> orderItem)); + for (DeliveryOrderItemDTO selectOrderItem : selectOrderItems) { + if (!orderItemMap.containsKey(selectOrderItem.getOrderItemId())) { + throw new LuckException("该订单项不存在"); + } + OrderItem orderItem = orderItemMap.get(selectOrderItem.getOrderItemId()); + if (orderItem.getBeDeliveredNum() < selectOrderItem.getChangeNum()) { + throw new LuckException("订单项可发货数量不足,请刷新后重试"); + } + } + orderService.delivery(deliveryOrderParam); + esOrderFeignClient.updateOrder(deliveryOrderParam.getOrderId()); + return ServerResponseEntity.success(); + } + + /** + * 采购订单 + */ + @PutMapping("/sourcing_order") + public ServerResponseEntity sourcingOrder(@Valid @RequestBody OrderAdminDTO orderDTO) { + Long tenantId = AuthUserContext.get().getTenantId(); + Order order = orderService.getOrderAndOrderItemData(orderDTO.getOrderId(), tenantId); + if (Objects.isNull(order)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 订单不在支付状态 + if (!Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + return ServerResponseEntity.showFailMsg("订单状态异常"); + } + boolean hasRefund = !Objects.isNull(order.getRefundStatus()) + && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()) + && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.PARTIAL_SUCCESS.value()); + // 订单退款中,不能进行采购操作 + if (hasRefund) { + return ServerResponseEntity.showFailMsg("订单退款中,不能进行采购操作"); + } + // 检查商家结算金额是否足够 + ServerResponseEntity amountResp = shopWalletFeignClient.getSettlementAmountByShopId(order.getShopId(), order.getPaySysType()); + if (!amountResp.isSuccess()) { + logger.info("获取商家结算金额失败,msg:{}", amountResp.getMsg()); + throw new LuckException(amountResp.getMsg()); + } + if (amountResp.getData() < order.getPurchaseSpreadAmount()) { + return ServerResponseEntity.showFailMsg("商家余额不足,请充值!"); + } + // 发送用户支付消息给供应商 + this.sendPurchaseMsg(order); + // 如果订单是通联支付的,执行商家余额扣除,让商家跳转到通联输入支付密码等校验 + if (Objects.equals(order.getPaySysType(), PaySysType.ALLINPAY.value())) { + logger.info("订单是通联支付的,执行商家余额扣除,让商家跳转到通联输入支付密码等校验"); + return allinPayBalancePay(order, tenantId, orderDTO.getReturnUrl()); + } + // 执行金额扣除 + orderService.sourcingOrder(order); + return ServerResponseEntity.success(); + } + + private ServerResponseEntity allinPayBalancePay(Order order, Long tenantId, String returnUrl) { + PayInfoApiDto orderPayInfoVO = new PayInfoApiDto(); + orderPayInfoVO.setBody("商家余额支付订单"); + orderPayInfoVO.setPayAmount(order.getPurchaseSpreadAmount()); + orderPayInfoVO.setPayType(PayType.BALANCE.value()); + orderPayInfoVO.setOrderIds(order.getOrderId().toString()); + orderPayInfoVO.setReturnUrl(returnUrl); + orderPayInfoVO.setPayEntry(PayEntry.SHOP_BALANCE_PAY_PURCHASE.value()); + orderPayInfoVO.setUserId(order.getUserId().toString()); + orderPayInfoVO.setBizUserId(order.getSupplierId().toString()); + orderPayInfoVO.setShopId(tenantId.toString()); + return paymentFeignClient.doAllinPayShopBalance(orderPayInfoVO); + } + + /** + * 修改订单金额 + */ + @PutMapping("/change_amount") + public ServerResponseEntity changeAmount(@RequestBody OrderAdminDTO orderAdminDTO) { + Long minFreightAmount = 0L; + if (Objects.isNull(orderAdminDTO.getFreightAmount())) { + orderAdminDTO.setFreightAmount(minFreightAmount); + } else if (orderAdminDTO.getFreightAmount() < minFreightAmount) { + throw new LuckException("运费不能小于零"); + } + Order dbOrder = orderService.getOrderAndOrderItemData(orderAdminDTO.getOrderId(), AuthUserContext.get().getTenantId()); + if (Objects.equals(dbOrder.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + logger.info("修改预售订单金额"); + orderService.changeAmountByPreSale(orderAdminDTO, dbOrder); + } else { + logger.info("修改普通订单金额"); + orderService.changeAmount(orderAdminDTO, dbOrder); + } + esOrderFeignClient.updateOrder(orderAdminDTO.getOrderId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_change_amount") + @Operation(summary = "查询修改订单地址后的运费") + public ServerResponseEntity getChangeAmount(OrderChangeAddrDTO param) { + Order dbOrder = orderService.getOrderAndOrderItemData(param.getOrderId(), AuthUserContext.get().getTenantId()); + if (dbOrder.getStatus() > OrderStatus.PAYED.value() && !Objects.equals(dbOrder.getStatus(), OrderStatus.WAIT_GROUP.value())) { + throw new LuckException("该订单状态异常,无法更改订单地址"); + } + List orderItems = orderItemService.listOrderItemsByOrderId(dbOrder.getOrderId()); + if (CollectionUtils.isEmpty(orderItems)) { + throw new LuckException("数据异常,订单商品信息未找到"); + } + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + List skuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + orderItems.forEach(item -> { + spuIds.add(item.getSpuId()); + skuIds.add(item.getSkuId()); + }); + // 查询spu + ServerResponseEntity> spuResp = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)); + if (!spuResp.isSuccess()) { + throw new LuckException(spuResp.getMsg()); + } + List spuVOList = spuResp.getData(); + Map spuMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, spu -> spu)); + // 查询sku + ServerResponseEntity> responseEntity = skuFeignClient.listSpuDetailByIds(skuIds); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + List skuList = responseEntity.getData(); + Map skuMap = skuList.stream().collect(Collectors.toMap(SkuAddrVO::getSkuId, s -> s)); + // 构建shopCartItemVO类 + List shopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItem orderItem : dbOrder.getOrderItems()) { + //如果是赠品或者子组合商品则不需要处理运费 + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + continue; + } + SpuVO spu = spuMap.get(orderItem.getSpuId()); + SkuAddrVO sku = skuMap.get(orderItem.getSkuId()); + ShopCartItemVO shopCartItem = new ShopCartItemVO(); + shopCartItem.setSkuId(orderItem.getSkuId()); + shopCartItem.setSpuId(orderItem.getSpuId()); + shopCartItem.setCount(orderItem.getCount()); + shopCartItem.setShopId(orderItem.getShopId()); + shopCartItem.setTotalAmount(orderItem.getSpuTotalAmount()); + shopCartItem.setVolume(sku.getVolume()); + shopCartItem.setWeight(sku.getWeight()); + shopCartItem.setDeliveryTemplateId(spu.getDeliveryTemplateId()); + shopCartItem.setDeliveryAmount(spu.getDeliveryAmount()); + shopCartItem.setPreSaleType(spu.getPreSaleType()); + shopCartItems.add(shopCartItem); + } + UserAddrVO userAddrVO = new UserAddrVO(); + userAddrVO.setAreaId(param.getAreaId()); + if (Objects.equals(dbOrder.getDeliveryType(), DeliveryType.SAME_CITY.value())) { + userAddrVO.setLat(param.getLat()); + userAddrVO.setLng(param.getLng()); + } + ChangeOrderAddrDTO changeOrderAddrDTO = new ChangeOrderAddrDTO(shopCartItems, dbOrder.getFreightAmount(), userAddrVO, dbOrder.getDeliveryType()); + return ServerResponseEntity.success(deliveryManager.getOrderChangeAddrAmount(changeOrderAddrDTO)); + } + + /** + * 修改用户订单地址 + * + * @return 是否修改成功 + */ + @PutMapping("/change_user_addr") + public ServerResponseEntity changeUserAddr(@RequestBody @Valid OrderAddrDTO orderAddrDTO) { + Order orderDb = orderService.getByOrderId(orderAddrDTO.getOrderId()); + if (orderDb.getStatus() <= OrderStatus.PAYED.value() || Objects.equals(orderDb.getStatus(), OrderStatus.WAIT_GROUP.value())) { + logger.info("修改订单地址"); + OrderAddr orderAddr = BeanUtil.map(orderAddrDTO, OrderAddr.class); + orderAddrService.update(orderAddr); + } else { + throw new LuckException("该订单状态异常,无法更改订单地址"); + } + return ServerResponseEntity.success(); + } + + /** + * 修改订单备注 + * + * @param order + * @return 是否修改成功 + */ + @PutMapping("/change_order_remark") + public ServerResponseEntity changeOrderRemark(@RequestBody @Valid Order order) { + Order orderDb = orderService.getByOrderId(order.getOrderId()); + orderDb.setShopRemarks(order.getShopRemarks()); + orderService.update(orderDb); + return ServerResponseEntity.success(); + } + + @GetMapping("/un_delivery_sold_excel") + @Operation(summary = "导出待发货的订单excel") + public ServerResponseEntity unDeliveryOrderSoldExcel(HttpServletResponse response, OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + orderSearchDTO.setSupplierDeliveryType(SupplierDeliveryType.SHOP_DELIVERY.value()); + orderSearchDTO.setStatus(OrderStatus.PAYED.value()); + // 只查询快递发货的订单 + orderSearchDTO.setDeliveryType(DeliveryType.DELIVERY.value()); + orderExcelService.excelUnDeliveryOrderList(response, orderSearchDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/export_order_excel") + @Operation(summary = "导入订单") + public ServerResponseEntity exportOrderExcel(@RequestParam("excelFile") MultipartFile file) { + if (Objects.isNull(file)) { + throw new LuckException("网络繁忙,请稍后再试"); + } + String info; + try { + Map> errorMap = new HashMap<>(10); + EasyExcel.read(file.getInputStream(), UnDeliveryOrderExcelVO.class, new OrderExcelListener(orderExcelService, errorMap)).sheet().doRead(); + info = orderExcelService.orderExportError(errorMap); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(info); + } + + @GetMapping("/get_shop_order_by_userId") + @Operation(summary = "分页获取某个用户的订单数据", description = "分页获取某个用户的订单数据") + public ServerResponseEntity> getShopOrderByUserId(PageDTO pageDTO, String userId) { + EsPageVO pages = orderService.pageByUserId(pageDTO, userId); + return ServerResponseEntity.success(pages); + } + + /** + * 发送采购消息 + * @param order 订单 + */ + private void sendPurchaseMsg(Order order) { + // 采购后发送用户支付消息给供应商 + SendNotifyBO notifyBO = new SendNotifyBO(); + notifyBO.setSupplierId(order.getSupplierId()); + notifyBO.setBizId(order.getOrderId()); + notifyBO.setUserId(order.getUserId()); + notifyBO.setSupplierDeliveryType(order.getSupplierDeliveryType()); + notifyBO.setSendType(SendTypeEnum.USER_PAY_SUCCESS_TO_SUPPLIER.getValue()); + notifyBO.setMobile(order.getMobile()); + SendStatus sendStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyBO)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/MyOrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/MyOrderController.java new file mode 100644 index 0000000..03d266f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/MyOrderController.java @@ -0,0 +1,682 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import com.tmerclub.cloud.api.delivery.vo.DeliveryOrderFeignVO; +import com.tmerclub.cloud.api.feign.EsOrderFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.constant.OrderDeleteStatus; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.config.WxConfig; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.FlowSystemTypeEnum; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.bo.OrderVirtualInfoLogBO; +import com.tmerclub.cloud.order.constant.RefundType; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import com.tmerclub.cloud.order.vo.OrderShopVO; +import com.tmerclub.cloud.order.vo.OrderVirtualInfoLogVO; +import com.tmerclub.cloud.order.vo.OrderWxDeliveryVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 我的订单 + * + * @author FrozenWatermelon + */ +@RestController +@RequestMapping("/my_order") +@Tag(name = "app-我的订单接口") +public class MyOrderController { + + private final Logger LOGGER = LoggerFactory.getLogger(MyOrderController.class); + @Autowired + private WxConfig wxConfig; + @Autowired + private OrderService orderService; + @Autowired + private DeliveryManager deliveryManager; + @Autowired + private OrderAddrService orderAddrService; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderRefundService orderRefundService; + @Autowired + private RocketMQTemplate orderReceiptTemplate; + @Autowired + private OrderPreSaleInfoService orderPreSaleInfoService; + @Autowired + private OrderVirtualInfoService orderVirtualInfoService; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @DubboReference + private EsOrderFeignClient esOrderFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private PaymentFeignClient paymentFeignClient; + + + /** + * 订单详情信息接口 + */ + @GetMapping("/order_detail") + @Operation(summary = "订单详情信息", description = "根据订单号获取订单详情信息") + @Parameter(name = "orderId", description = "订单号", required = true) + public ServerResponseEntity orderDetail(@RequestParam("orderId") Long orderId) { + Long userId = AuthUserContext.get().getUserId(); + Long stationId = AuthUserContext.get().getTenantId(); + OrderShopVO orderShopDto = new OrderShopVO(); + List orderItems; + Order order; + // 查询一下redis有没有数据,因为秒杀订单还存在redis + ServerResponseEntity seckillOrderByRedisResp = seckillFeignClient.getSeckillOrderByRedis(orderId, userId); + if (!seckillOrderByRedisResp.isSuccess()) { + throw new LuckException(seckillOrderByRedisResp.getMsg()); + } + ShopCartOrderMergerVO shopCartOrderMergerVO = seckillOrderByRedisResp.getData(); + // 查询一下redis有没有数据,因为秒杀订单还存在redis + if (Objects.nonNull(shopCartOrderMergerVO)) { + order = orderService.getOrderInfoByShopCartOrderMerger(shopCartOrderMergerVO); + orderItems = BeanUtil.mapAsList(order.getOrderItems(), OrderItemVO.class); + } else { + if (Objects.isNull(stationId)) { + LOGGER.info("非自提订单,用户id:{},订单号:{}", userId, orderId); + order = orderService.getOrderByOrderIdAndUserId(orderId, userId); + } else { + LOGGER.info("自提订单,用户id:{},订单号:{},站点id:{}", userId, orderId, stationId); + order = orderService.getOrderByOrderIdAndStationId(orderId, stationId); + } + // 不是秒杀订单直接查询数据库 + OrderAddr orderAddr = orderAddrService.getById(order.getOrderAddrId()); + order.setOrderAddr(orderAddr); + orderItems = orderItemService.listOrderItemAndLangByOrderId(orderId); + } + + if (Objects.equals(order.getShopId(), Constant.PLATFORM_SHOP_ID)) { + order.setShopName(Constant.PLATFORM_SHOP_NAME); + } + // 套餐优惠加到“促销满减”字段中 + if (Objects.nonNull(order.getShopComboAmount())) { + order.setDiscountAmount(order.getShopComboAmount() + order.getDiscountAmount()); + } + + + List orderRefunds = orderRefundService.listOrderRefundByOrderId(order.getOrderId()); + orderItems.forEach(orderItemVO -> orderItemVO.setFinalRefundId(null)); + long alreadyRefundAmount = 0L; + for (OrderRefundVO orderRefund : orderRefunds) { + alreadyRefundAmount = alreadyRefundAmount + orderRefund.getRefundAmount(); + // 整单退款 + if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) { + orderShopDto.setCanRefund(false); + // 统一的退款单号 + for (OrderItemVO orderItemDto : orderItems) { + orderItemDto.setFinalRefundId(orderRefund.getRefundId()); + } + break; + } + // 单项退款,每个单号都不一样 + for (OrderItemVO orderItemDto : orderItems) { + if (Objects.equals(orderItemDto.getOrderItemId(), orderRefund.getOrderItemId())) { + orderItemDto.setFinalRefundId(orderRefund.getRefundId()); + } + } + } + setOrderShopDto(orderShopDto, order,order.getOrderAddr(), orderItems); + orderShopDto.setCanRefundAmount(order.getActualTotal() - alreadyRefundAmount); + if (order.getRefundStatus() != null && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value())) { + orderShopDto.setFinalRefundId(orderItems.get(0).getFinalRefundId()); + } + // 若订单为未支付状态,补充上订单自动取消时间 + if (Objects.equals(orderShopDto.getStatus(), OrderStatus.UNPAY.value())) { + orderShopDto.setAutoCancelTime(new Date(orderShopDto.getCreateTime().getTime() + RocketMqConstant.CANCEL_TIME_INTERVAL)); + } + // 处理虚拟订单 + if (Objects.equals(order.getOrderMold(), 1)) { + LOGGER.info("处理虚拟订单,订单号:{}", order.getOrderId()); + List orderItemList = BeanUtil.mapAsList(orderItems, OrderItem.class); + order.setOrderItems(orderItemList); + orderVirtualInfoService.handlerVirtualProdOrder(order, orderShopDto, stationId); + } + return ServerResponseEntity.success(orderShopDto); + } + + @GetMapping("/order_count") + @Operation(summary = "计算各个订单数量", description = "根据订单状态计算各个订单数量") + public ServerResponseEntity orderCount() { + Long userId = AuthUserContext.get().getUserId(); + OrderCountVO orderCount = orderService.countNumberOfStatus(userId); + // 计算一下当前用户秒杀订单中可能存在的数量 + ServerResponseEntity countSeckillOrderResp = seckillFeignClient.countRedisSeckillOrder(userId); + if (!countSeckillOrderResp.isSuccess()) { + throw new LuckException(countSeckillOrderResp.getMsg()); + } + if(Objects.nonNull(countSeckillOrderResp.getData())){ + OrderCountVO seckillOrderCount = countSeckillOrderResp.getData(); + orderCount.setUnPay(seckillOrderCount.getUnPay() + orderCount.getUnPay()); + orderCount.setPayed(seckillOrderCount.getPayed() + orderCount.getPayed()); + } + return ServerResponseEntity.success(orderCount); + } + + /** + * 分页获取 + */ + @GetMapping("/search_order") + @Operation(summary = "订单列表信息查询", description = "根据订单编号或者订单中商品名称搜索") + public ServerResponseEntity> searchOrder(OrderSearchDTO orderSearchDTO) { + Long userId = AuthUserContext.get().getUserId(); + orderSearchDTO.setUserId(userId); + orderSearchDTO.setDeleteStatus(0); + EsPageVO esOrderPageVO = orderService.myOrderPage(orderSearchDTO); + List orderList = esOrderPageVO.getList(); + setShopName(orderList); + boolean checkDeliveryNum = Objects.equals(orderSearchDTO.getStatus(), OrderStatus.PAYED.value()) || Objects.isNull(orderSearchDTO.getStatus()); + Map deliveryCountMap = new HashMap<>(16); + if (checkDeliveryNum) { + List orderIds = orderList.stream().map(EsOrderVO::getOrderId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(orderIds)) { + List deliveryOrderList = deliveryManager.listDeliveryCountByOrderIds(orderIds); + deliveryCountMap = deliveryOrderList.stream().collect(Collectors.toMap(DeliveryOrderFeignVO::getOrderId, DeliveryOrderFeignVO::getAllCount)); + } + } + // 处理下发货完成时能否查看物流 + for (EsOrderVO esOrderVO : orderList) { + if (Objects.equals(esOrderVO.getShopId(), Constant.PLATFORM_SHOP_ID)) { + esOrderVO.setShopName(Constant.PLATFORM_SHOP_NAME); + } + int updateOrViewDeliveryInfo = 0; + if (!Objects.equals(esOrderVO.getDeliveryType(), DeliveryType.DELIVERY.value()) && !Objects.equals(esOrderVO.getDeliveryType(), DeliveryType.ONLINE.value())) { + esOrderVO.setUpdateOrViewDeliveryInfo(updateOrViewDeliveryInfo); + continue; + } + for (EsOrderItemVO orderItem : esOrderVO.getOrderItems()) { + boolean isDelivery = Objects.equals(orderItem.getDeliveryType(), DeliveryType.ONLINE.value()) || Objects.equals(orderItem.getDeliveryType(), DeliveryType.DELIVERY.value()); + if (Objects.nonNull(orderItem.getDeliveryType()) && isDelivery) { + updateOrViewDeliveryInfo = 1; + break; + } + } + if (checkDeliveryNum) { + if (deliveryCountMap.containsKey(esOrderVO.getOrderId())) { + esOrderVO.setDeliveryCount(deliveryCountMap.get(esOrderVO.getOrderId())); + } + } + esOrderVO.setUpdateOrViewDeliveryInfo(updateOrViewDeliveryInfo); + } + + + for (EsOrderVO orderVO : orderList) { + List orderItems = orderVO.getOrderItems(); + Map> map = orderItems.stream() + .filter(order -> Objects.equals(order.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + Map> comboMap = orderItems.stream() + .filter(order -> Objects.equals(order.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + // 如果没有赠品,就不需要处理 + if (MapUtil.isEmpty(map) && MapUtil.isEmpty(comboMap)) { + continue; + } + // 将赠品放到对应的主订单项中 + Iterator iterator = orderItems.iterator(); + while (iterator.hasNext()) { + EsOrderItemVO myOrderItemDto = iterator.next(); + // 移除赠品的订单项,进入下一个循环 + if (Objects.equals(myOrderItemDto.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(myOrderItemDto.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + continue; + } + // 主订单项插入赠品订单项 + if (map.containsKey(myOrderItemDto.getOrderItemId())) { + List list = map.get(myOrderItemDto.getOrderItemId()); + myOrderItemDto.setGiveawayList(list); + } + // 主订单项插入组合订单项 + if (comboMap.containsKey(myOrderItemDto.getOrderItemId())) { + List list = comboMap.get(myOrderItemDto.getOrderItemId()); + myOrderItemDto.setComboList(list); + } + } + } + return ServerResponseEntity.success(esOrderPageVO); + } + + // todo 定时任务将订单项设为不可评论的状态 + + /** + * 订单评价列表接口 + */ + @GetMapping("/search_order_item") + @Operation(summary = "订单评价列表接口", description = "根据订单评价状态获取订单列表信息") + public ServerResponseEntity> searchOrderItem(PageDTO page) { + + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + Long userId = AuthUserContext.get().getUserId(); + orderSearchDTO.setUserId(userId); + orderSearchDTO.setPageNum(page.getPageNum()); + orderSearchDTO.setPageSize(page.getPageSize()); + orderSearchDTO.setStatus(OrderStatus.SUCCESS.value()); + orderSearchDTO.setDeleteStatus(OrderDeleteStatus.NOT_DELETE.value()); + EsPageVO esOrderEsPage = orderService.orderPage(orderSearchDTO); + for (EsOrderVO esOrderVO : esOrderEsPage.getList()) { + Map> comboMap = esOrderVO.getOrderItems().stream() + .filter(order -> Objects.equals(order.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + if (MapUtil.isEmpty(comboMap)) { + continue; + } + Iterator iterator = esOrderVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + EsOrderItemVO orderItem = iterator.next(); + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + } + orderItem.setComboList(comboMap.get(orderItem.getOrderItemId())); + } + esOrderVO.setIsComm(esOrderVO.getOrderItems().get(0).getIsComm()); + } + return ServerResponseEntity.success(esOrderEsPage); + } + + /** + * 取消订单 + */ + @PutMapping("/cancel/{orderId}") + @Operation(summary = "根据订单号取消订单", description = "根据订单号取消订单") + @Parameter(name = "orderId", description = "订单号", required = true) + public ServerResponseEntity cancel(@PathVariable("orderId") Long orderId) { + Long userId = AuthUserContext.get().getUserId(); + ServerResponseEntity serverResponseEntity = seckillFeignClient.getSeckillOrderByRedis(orderId, userId); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + + ShopCartOrderMergerVO shopCartOrderMergerVO = serverResponseEntity.getData(); + Integer orderStatus; + if (Objects.nonNull(shopCartOrderMergerVO)) { + orderStatus = shopCartOrderMergerVO.getStatus(); + } else { + Order order = orderService.getOrderByOrderIdAndUserId(orderId, userId); + orderStatus = order.getStatus(); + } + boolean isPayed = Objects.nonNull(orderStatus) && !Objects.equals(orderStatus, OrderStatus.UNPAY.value()) && !Objects.equals(orderStatus, OrderStatus.CLOSE.value()); + if (isPayed) { + // 订单已支付,无法取消订单 + return ServerResponseEntity.showFailMsg("订单已支付,无法取消订单"); + } + // 如果订单未支付的话,将订单设为取消状态 + orderService.cancelOrderAndGetCancelOrderIds(shopCartOrderMergerVO,Collections.singletonList(orderId)); + return ServerResponseEntity.success(); + } + + + /** + * 确认收货 + */ + @PutMapping("/receipt/{orderId}") + @Operation(summary = "根据订单号确认收货", description = "根据订单号确认收货") + public ServerResponseEntity receipt(@PathVariable("orderId") Long orderId) { + Long userId = AuthUserContext.get().getUserId(); + Order order = orderService.getOrderByOrderIdAndUserId(orderId, userId); + + if (!Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value())) { + if (Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value())) { + return ServerResponseEntity.showFailMsg("订单已收货,请刷新页面"); + } else { + return ServerResponseEntity.showFailMsg("订单状态异常,请刷新后重试"); + } + } + if (Objects.equals(order.getRefundStatus(), RefundStatusEnum.APPLY.value())) { + // 订单退款中,无法确认收货 + return ServerResponseEntity.showFailMsg("订单退款中,无法确认收货"); + } + List orderItems = orderItemService.listOrderItemsByOrderId(orderId); + order.setOrderItems(orderItems); + + + //注意:订单的确认收货是需要通知很多个服务的。 + // 在发送普通消息的时候,可能消息已经落地发送了,这边抛了异常,让数据回滚,变为未确认收货的状态,此时用户再点击退货,接着再次点击确认收货, + // 而接收方确实是收到该消息,订单状态从 确认收货变成了“确认收货”,这两个确认收货的状态有本质的区别,所以应该让订单确确实实变为确认收货状态,再向各个服务推送消息 + // 因此用事务消息会比较好 + + // 开启事务消息,通知订单自己,开始往各个服务发送通知了 + TransactionSendResult transactionSendResult = orderReceiptTemplate.sendMessageInTransaction(RocketMqConstant.ORDER_RECEIPT_TOPIC, new GenericMessage<>(orderId), null); + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } + esOrderFeignClient.updateOrder(orderId); + return ServerResponseEntity.success(); + } + + /** + * 删除订单 + */ + @DeleteMapping("/{orderId}") + @Operation(summary = "根据订单号删除订单", description = "根据订单号删除订单") + @Parameter(name = "orderId", description = "订单号", required = true) + public ServerResponseEntity delete(@PathVariable("orderId") Long orderId) { + Long userId = AuthUserContext.get().getUserId(); + + Order order = orderService.getOrderByOrderIdAndUserId(orderId, userId); + + if (!Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value()) && !Objects.equals(order.getStatus(), OrderStatus.CLOSE.value())) { + // 订单未完成或未关闭,无法删除订单 + return ServerResponseEntity.showFailMsg("订单未完成或未关闭,无法删除订单"); + } + + // 删除订单 + orderService.deleteOrder(order.getOrderId()); + esOrderFeignClient.updateOrder(orderId); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_order_item/{orderItemId}") + @Operation(summary = "根据订单项id获取订单项详情", description = "根据订单项id获取订单项详情") + @Parameter(name = "orderItemId", description = "订单项号", required = true) + public ServerResponseEntity getOrderItemById(@PathVariable("orderItemId") Long orderItemId) { + Long userId = AuthUserContext.get().getUserId(); + OrderItemVO orderItemVO = orderItemService.getByOrderItemId(orderItemId); + if (userId == null || orderItemVO == null || !userId.equals(orderItemVO.getUserId())) { + return ServerResponseEntity.showFailMsg("订单项错误"); + } + return ServerResponseEntity.success(orderItemVO); + } + + @GetMapping("/get_order_status") + @Operation(summary = "根据虚拟订单编号获取订单券码") + public ServerResponseEntity getOrderStatus(@RequestParam("orderId") Long orderId) { + EsOrderBO esorder = orderService.getEsOrder(orderId); + Order order = BeanUtil.map(esorder, Order.class); + OrderShopVO orderShopVO = new OrderShopVO(); + orderShopVO.setStatus(order.getStatus()); + orderShopVO.setRefundStatus(order.getRefundStatus()); + // 如果是虚拟商品订单,处理下虚拟商品订单相关数据 + if (Objects.equals(order.getOrderMold(), 1)) { + Long stationId = AuthUserContext.get().getTenantId(); + orderVirtualInfoService.handlerVirtualProdOrder(order, orderShopVO, stationId); + } + return ServerResponseEntity.success(orderShopVO); + } + + @GetMapping("/get_by_order_id") + @Operation(summary = "根据订单编号获取订单虚拟商品核销记录信息", description = "根据订单编号获取订单虚拟商品核销记录信息") + @Parameter(name = "orderId", description = "订单编号", required = true) + public ServerResponseEntity getByOrderId(@RequestParam("orderId") Long orderId) { + return ServerResponseEntity.success(orderVirtualInfoService.getByOrderId(orderId)); + } + + @GetMapping("/get_by_write_off_code") + @Operation(summary = "根据核销码获取订单虚拟商品核销记录信息", description = "根据核销码获取订单虚拟商品核销记录信息") + @Parameter(name = "writeOffCode", description = "核销码", required = true) + public ServerResponseEntity> getByWriteOffCode(@RequestParam("writeOffCode") String writeOffCode) { + return ServerResponseEntity.success(orderVirtualInfoService.getByWriteOffCode(writeOffCode)); + } + + /** + * 判断是否开启了小程序发货信息管理 + */ + @GetMapping("/check_trade_managed/{orderId}") + @Operation(summary = "判断是否小程序下单并且开启了小程序发货信息管理", description = "判断是否小程序下单并且开启了小程序发货信息管理") + public ServerResponseEntity checkTradeManaged(@PathVariable("orderId") Long orderId) { + OrderWxDeliveryVO orderWxDeliveryVO = new OrderWxDeliveryVO(); + List payInfoApiDtos = paymentFeignClient.getPayInfoByUserIdAndOrderId(AuthUserContext.get().getUserId(), orderId).getData(); + Boolean payFlag = false; + PayInfoApiDto payInfoApiDto = new PayInfoApiDto(); + if (CollectionUtil.isNotEmpty(payInfoApiDtos)) { + for (PayInfoApiDto payInfo : payInfoApiDtos) { + // 判断是否是小程序购买 + if (Objects.equals(payInfo.getPayType(), PayType.WECHATPAY.value()) && Objects.equals(payInfo.getSystemModel(), FlowSystemTypeEnum.APPLETS.value())) { + payInfoApiDto = payInfo; + payFlag = true; + break; + } + } + } + if (payFlag) { + // 查询小程序是否已开通发货信息管理服务 + Boolean managed = wxConfig.getTradeManaged(); + if (managed) { + Integer orderStatus = wxConfig.getOrderStatusByBizPayNo(payInfoApiDto.getBizPayNo()); + if (orderStatus != 0) { + orderWxDeliveryVO.setOrderStatus(orderStatus); + orderWxDeliveryVO.setBizPayNo(payInfoApiDto.getBizPayNo()); + } + } + } + return ServerResponseEntity.success(orderWxDeliveryVO); + } + + + /** + * 插入数据 + * + * @param orderShopDto 插入对象 + * @param order 订单信息 + * @param orderAddr 订单地址 + * @param orderItems 订单项列表 + */ + private void setOrderShopDto(OrderShopVO orderShopDto, Order order, OrderAddr orderAddr, List orderItems) { + // 处理下发货完成时能否查看物流 + int updateOrViewDeliveryInfo = 0; + if (!Objects.equals(order.getDeliveryType(), DeliveryType.DELIVERY.value()) && !Objects.equals(order.getDeliveryType(), DeliveryType.ONLINE.value())) { + orderShopDto.setUpdateOrViewDeliveryInfo(updateOrViewDeliveryInfo); + } + for (OrderItemVO orderItem : orderItems) { + boolean canSee = Objects.equals(orderItem.getDeliveryType(), DeliveryType.DELIVERY.value()) || Objects.equals(orderItem.getDeliveryType(), DeliveryType.ONLINE.value()); + if (Objects.nonNull(orderItem.getDeliveryType()) && canSee) { + updateOrViewDeliveryInfo = 1; + break; + } + } + getOrderShop(orderShopDto, order, orderAddr, updateOrViewDeliveryInfo); + // 处理退款 + handleRefund(orderShopDto, order, orderItems); + orderShopDto.setOrderItems(orderItems); + orderShopDto.setTotal(order.getTotal()); + orderShopDto.setTotalNum(order.getAllCount()); + // 预售订单获取预售信息 + if (Objects.nonNull(order.getPreSaleType()) && !Objects.equals(order.getPreSaleType(), PreSaleType.DISABLE.value())) { + OrderPreSaleInfoVO orderPreSaleInfo = orderPreSaleInfoService.getByOrderId(order.getOrderId()); + if (Objects.isNull(orderPreSaleInfo)) { + // 秒杀订单还存在缓存中 + orderShopDto.setOrderPreSaleInfoVO(BeanUtil.map(order.getOrderPreSaleInfo(), OrderPreSaleInfoVO.class)); + } else { + orderShopDto.setPayTime(Objects.equals(orderPreSaleInfo.getPreSaleType(), PreSaleType.DEPOSIT.value()) && Objects.equals(orderPreSaleInfo.getPayStatus(), 2) ? orderPreSaleInfo.getBalancePayTime() : order.getPayTime()); + orderShopDto.setOrderPreSaleInfoVO(orderPreSaleInfo); + } + } + // 处理赠品订单项 + List giveWayItems; + List comboItems; + List notGiveWayItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map> giveWayItemMap = new HashMap<>(Constant.INITIAL_CAPACITY); + Map> comboItemMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItem : orderItems) { + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value())) { + giveWayItems = giveWayItemMap.getOrDefault(orderItem.getActivityId(), new ArrayList<>()); + giveWayItems.add(orderItem); + giveWayItemMap.put(orderItem.getActivityId(), giveWayItems); + continue; + }else if(Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())){ + comboItems = comboItemMap.getOrDefault(orderItem.getActivityId(), new ArrayList<>()); + comboItems.add(orderItem); + comboItemMap.put(orderItem.getActivityId(), comboItems); + continue; + } + notGiveWayItems.add(orderItem); + } + for (OrderItemVO notGiveWayItem : notGiveWayItems) { + notGiveWayItem.setGiveawayList(giveWayItemMap.get(notGiveWayItem.getOrderItemId())); + notGiveWayItem.setComboItemList(comboItemMap.get(notGiveWayItem.getOrderItemId())); + } + orderShopDto.setOrderItems(notGiveWayItems); + } + + private void getOrderShop(OrderShopVO orderShopDto, Order order, OrderAddr orderAddr, int updateOrViewDeliveryInfo) { + orderShopDto.setUpdateOrViewDeliveryInfo(updateOrViewDeliveryInfo); + orderShopDto.setOrderScore(order.getOrderScore()); + orderShopDto.setShopId(order.getShopId()); + orderShopDto.setDeliveryType(order.getDeliveryType()); + orderShopDto.setShopName(order.getShopName()); + orderShopDto.setActualTotal(order.getActualTotal()); + orderShopDto.setOrderAddr(BeanUtil.map(orderAddr, OrderAddrVO.class)); + orderShopDto.setPayType(order.getPayType()); + orderShopDto.setTransfee(order.getFreightAmount()); + orderShopDto.setReduceAmount(Math.abs(order.getReduceAmount())); + orderShopDto.setCreateTime(order.getCreateTime()); + orderShopDto.setRemarks(order.getRemarks()); + orderShopDto.setOrderType(order.getOrderType()); + orderShopDto.setStatus(order.getStatus()); + // 返回满减优惠金额,优惠券优惠金额和店铺优惠总额 + orderShopDto.setDiscountMoney(order.getDiscountAmount()); + orderShopDto.setShopCouponMoney(order.getShopCouponAmount()); + // TODO 暂时不需要显示店铺包邮金额 +// orderShopDto.setFreeFreightAmount(order.getFreeFreightAmount()); + long shopAmount = order.getReduceAmount() - order.getPlatformAmount() + order.getShopChangeFreeAmount(); + orderShopDto.setShopAmount(shopAmount); + //返回平台优惠券,平台等级,平台积分优惠金额和平台免运费金额 + orderShopDto.setPlatformCouponAmount(order.getPlatformCouponAmount()); + orderShopDto.setMemberAmount(order.getMemberAmount()); + orderShopDto.setScoreAmount(order.getScoreAmount()); + orderShopDto.setPlatformFreeFreightAmount(order.getPlatformFreeFreightAmount()); + orderShopDto.setShopChangeFreeAmount(order.getShopChangeFreeAmount()); + // 付款时间 + orderShopDto.setPayTime(order.getPayTime()); + // 发货时间 + orderShopDto.setDeliveryTime(order.getDeliveryTime()); + // 完成时间 + orderShopDto.setFinallyTime(order.getFinallyTime()); + // 取消时间 + orderShopDto.setCancelTime(order.getCancelTime()); + // 更新时间 + orderShopDto.setUpdateTime(order.getUpdateTime()); + //订单发票id + orderShopDto.setOrderInvoiceId(order.getOrderInvoiceId()); + orderShopDto.setOrderMold(order.getOrderMold()); + orderShopDto.setPreSaleType(order.getPreSaleType()); + } + + private void handleRefund(OrderShopVO orderShopDto, Order order, List orderItems) { + // 可以退款的状态,并在退款时间内 + if (order.getStatus() > OrderStatus.UNPAY.value() && order.getStatus() < OrderStatus.CLOSE.value() && orderRefundService.checkRefundDate(order)) { + LOGGER.info("订单{}可以退款", order.getOrderId()); + orderShopDto.setCanRefund(true); + orderShopDto.setCanAllRefund(true); + for (OrderItemVO orderItem : orderItems) { + // 有正在退款中的订单项 + if (orderItem.getRefundStatus() != null && !Objects.equals(orderItem.getRefundStatus(), RefundStatusEnum.DISAGREE.value())) { + // 无法整单退款 + orderShopDto.setCanAllRefund(false); + } + // 有正在退款中/退款平台介入的订单项 + if (Objects.nonNull(orderItem.getFinalRefundId())) { + // 无法整单退款 + orderShopDto.setCanAllRefund(false); + } + // 如果是虚拟商品订单,处理下虚拟商品订单相关数据 + if (Objects.equals(orderItem.getIsRefund(), 0)) { + orderShopDto.setCanAllRefund(false); + orderShopDto.setCanRefund(false); + } + } + // 正在进行整单退款 + if (order.getRefundStatus() != null && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value())) { + // 所有订单项都没办法退款 + orderShopDto.setCanAllRefund(false); + } + } + if (Objects.nonNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value())) { + List refundVOList = orderRefundService.listOrderRefundByOrderId(order.getOrderId()); + for (OrderRefundVO orderRefund : refundVOList) { + //整单退款 + if (orderRefund.getRefundType() == 1) { + for (OrderItemVO orderItem : orderItems) { + orderItem.setReturnMoneySts(orderRefund.getReturnMoneySts()); + } + break; + } + // 单项退款,每个单号都不一样 + for (OrderItemVO orderItem : orderItems) { + if (Objects.equals(orderItem.getOrderItemId(), orderRefund.getOrderItemId())) { + orderItem.setReturnMoneySts(orderRefund.getReturnMoneySts()); + } + } + } + } + } + + + + + private void setShopName(List orderList) { + // 店铺名称 + if (CollUtil.isNotEmpty(orderList)) { + List shopIdList = orderList.stream().map(EsOrderVO::getShopId).collect(Collectors.toList()); + List shopDetailVOList = shopDetailFeignClient.listByShopIds(shopIdList).getData(); + Map> shopDetailVoMap = shopDetailVOList.stream().collect(Collectors.groupingBy(ShopDetailVO::getShopId)); + for (EsOrderVO esOrderVO : orderList) { + if (Objects.equals(esOrderVO.getShopId(), Constant.PLATFORM_SHOP_ID)) { + esOrderVO.setShopName(Constant.PLATFORM_SHOP_NAME); + } else if (shopDetailVoMap.containsKey(esOrderVO.getShopId())) { + esOrderVO.setShopName(shopDetailVoMap.get(esOrderVO.getShopId()).get(0).getShopName()); + } + } + } + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/MyStationOrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/MyStationOrderController.java new file mode 100644 index 0000000..7b157bc --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/MyStationOrderController.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.dto.OrderStationWriteOffDTO; +import com.tmerclub.cloud.order.service.OrderSelfStationService; +import com.tmerclub.cloud.order.service.OrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author Lanhai + */ +@RestController("appMyStationController") +@RequestMapping("/my_station_order") +@Tag(name = "用户自提订单接口") +public class MyStationOrderController { + + private final Logger LOGGER = LoggerFactory.getLogger(MyStationOrderController.class); + + @Autowired + private DeliveryManager deliveryManager; + + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + + @Autowired + private OrderService orderService; + @Autowired + private OrderSelfStationService orderSelfStationService; + @Autowired + private SeckillFeignClient seckillFeignClient; + + @GetMapping("/station_detail") + @Operation(summary = "订单详情自提信息", description = "根据订单号获取订单详情自提信息") + @Parameter(name = "orderId", description = "订单号", required = true) + public ServerResponseEntity orderDetail(@RequestParam("orderId") Long orderId, + @RequestParam(value = "lat", required = false) Double lat, + @RequestParam(value = "lng", required = false) Double lng) { + Long userId = AuthUserContext.get().getUserId(); + // 查询一下redis有没有数据,因为秒杀订单还存在redis + ServerResponseEntity seckillOrderByRedisResp = seckillFeignClient.getSeckillOrderByRedis(orderId, userId); + if (!seckillOrderByRedisResp.isSuccess()) { + throw new LuckException(seckillOrderByRedisResp.getMsg()); + } + OrderSelfStationVO orderSelfStation = null; + if(Objects.nonNull(seckillOrderByRedisResp.getData())){ + orderSelfStation = seckillOrderByRedisResp.getData().getOrderSelfStation(); + } + OrderSelfStationVO orderSelfStationVO = orderSelfStationService.getStationByOrderId(orderSelfStation,orderId); + if (lat != null && lng != null) { + LOGGER.info("根据经纬度计算实时距离,lat:{},lng:{}", lat, lng); + Double distance = orderSelfStationService.setStationDistance(orderSelfStationVO.getStationId(), lat, lng); + orderSelfStationVO.setDistance(distance); + } + return ServerResponseEntity.success(orderSelfStationVO); + } + + @GetMapping("/get_order_by_station_id") + @Operation(summary = "用户扫自提点码", description = "用户扫自提点码获取自提订单列表") + @Parameter(name = "stationId", description = "自提点id", required = true) + public ServerResponseEntity> getOrderListByStationId(OrderSearchDTO orderSearchDTO) { + Long userId = AuthUserContext.get().getUserId(); + StationVO stationVO = deliveryManager.getStation(orderSearchDTO.getStationId()); + if (Objects.isNull(stationVO)) { + throw new LuckException("该自提点不存在"); + } + orderSearchDTO.setUserId(userId); + orderSearchDTO.setWaitPurchase(0); + orderSearchDTO.setOrderMold(1); + orderSearchDTO.setShopId(stationVO.getShopId()); + EsPageVO page = searchOrderFeignClient.pageOrder(orderSearchDTO).getData(); + if (page.getList() != null) { + List orderSelfStationVOList = orderSelfStationService.getOrderSelfStationByStationIdOrShopId(userId, orderSearchDTO.getStationId(), null); + LOGGER.info("根据订单id获取自提信息,orderSelfStationVOList:{}", orderSelfStationVOList); + Map orderSelfStationMap = orderSelfStationVOList.stream().collect(Collectors.toMap(OrderSelfStationVO::getOrderId, (k) -> k)); + page.getList().forEach(s -> s.setOrderSelfStationVO(orderSelfStationMap.get(s.getOrderId()))); + } + return ServerResponseEntity.success(page); + } + + @GetMapping("/get_order_by_shop_id") + @Operation(summary = "用户扫商家码", description = "用户扫商家码获取自提订单列表") + @Parameter(name = "shopId", description = "店铺id", required = true) + public ServerResponseEntity> getOrderListByShopId(OrderSearchDTO orderSearchDTO) { + Long userId = AuthUserContext.get().getUserId(); + orderSearchDTO.setUserId(userId); + orderSearchDTO.setWaitPurchase(0); + EsPageVO page = searchOrderFeignClient.pageOrder(orderSearchDTO).getData(); + List orderSelfStationVOList = orderSelfStationService.getOrderSelfStationByStationIdOrShopId(userId, null, orderSearchDTO.getShopId()); + Map orderSelfStationMap = orderSelfStationVOList.stream().collect(Collectors.toMap(OrderSelfStationVO::getOrderId, (k) -> k)); + page.getList().forEach(s -> s.setOrderSelfStationVO(orderSelfStationMap.get(s.getOrderId()))); + return ServerResponseEntity.success(page); + } + + @PutMapping("/order_station_by_order_id") + @Operation(summary = "用户提货操作", description = "用户提货操作") + public ServerResponseEntity orderStationByOrderId(@RequestBody OrderStationWriteOffDTO orderStationWriteOffDTO) { + orderService.orderStationByOrderId(orderStationWriteOffDTO.getOrderIds(), AuthUserContext.get().getUserId(), orderStationWriteOffDTO.getStationId()); + return ServerResponseEntity.success(Boolean.TRUE); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderRefundController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderRefundController.java new file mode 100644 index 0000000..266e1ab --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderRefundController.java @@ -0,0 +1,733 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.constant.OrderCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.RefundOrderItemVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.order.constant.PlatformInterventionStatus; +import com.tmerclub.cloud.order.constant.RefundApplyType; +import com.tmerclub.cloud.order.constant.RefundType; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.dto.app.OrderRefundDTO; +import com.tmerclub.cloud.order.dto.app.OrderRefundDeliveryDTO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.model.OrderRefund; +import com.tmerclub.cloud.order.model.OrderRefundAddr; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.service.OrderRefundAddrService; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.vo.OrderRefundAddrVO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 订单退款记录信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@RestController("appOrderRefundController") +@RequestMapping("/order_refund") +@Tag(name = "app-订单退款记录信息") +public class OrderRefundController { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderRefundController.class); + + @Autowired + private OrderRefundService orderRefundService; + + + @Autowired + private OrderService orderService; + + @Autowired + private OrderItemService orderItemService; + + @Autowired + private OrderRefundAddrService orderRefundAddrService; + + + @GetMapping("/user_page") + @Operation(summary = "用户退款订单搜索接口", description = "用户退款订单搜索接口") + public ServerResponseEntity> pcPage(@Valid PageDTO pageDTO, OrderRefundSearchDTO orderRefundSearchDTO) { + PageVO orderRefundPage = orderRefundService.userOrderRefundPage(pageDTO, orderRefundSearchDTO); + return ServerResponseEntity.success(orderRefundPage); + } + + @PostMapping("/apply") + @Operation(summary = "申请退款", description = "申请退款") + public ServerResponseEntity apply(@Valid @RequestBody OrderRefundDTO orderRefundParam) { + Long userId = AuthUserContext.get().getUserId(); + // 获取订单信息 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundParam.getOrderId(), userId); + + // 商品是否已经发货 + boolean isDelivered = Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value()) || Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value()); + + ServerResponseEntity checkOrderStatusResponse = checkOrderStatus(orderRefundParam, order, isDelivered); + if (!checkOrderStatusResponse.isSuccess()) { + LOGGER.error("申请退款失败,原因:{}", checkOrderStatusResponse.getMsg()); + return checkOrderStatusResponse; + } + + // 生成退款单信息 + OrderRefund newOrderRefund = new OrderRefund(); + newOrderRefund.setPaySysType(order.getPaySysType()); + // 获取所有正在进行中的退款订单 + List orderRefunds = orderRefundService.getProcessOrderRefundByOrderId(order.getOrderId()); + + for (OrderRefund orderRefund : orderRefunds) { + if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) { + LOGGER.error("申请退款失败,原因:{}", "该订单正在进行整单退款,无法进行新的退款操作"); + return ServerResponseEntity.showFailMsg("该订单正在进行整单退款或者正在进行平台介入中,无法进行新的退款操作"); + } + if (Objects.equals(orderRefund.getOrderItemId(), orderRefundParam.getOrderItemId())) { + LOGGER.error("申请退款失败,原因:{}", "该商品正在进行退款中,无法进行新的退款操作"); + return ServerResponseEntity.showFailMsg("该商品正在进行退款或者正在进行平台介入中,无法进行新的退款操作"); + } + } + + // 如果存在分销订单,则计算分销总金额 + List orderItemList = orderItemService.listOrderItemsByOrderId(order.getOrderId()); + // 判断退款单类型(1:整单退款,2:单个物品退款) + if (orderRefundParam.getRefundType().equals(RefundType.ALL.value())) { + LOGGER.info("申请整单退款,订单号:{}", order.getOrderId()); + // 全部物品退款 + // 计算该订单项的分销金额 + newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(orderItemList)); + // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + newOrderRefund.setPlatformRefundAmount(order.getPlatformAmount()); + newOrderRefund.setPlatformRefundCommission(order.getPlatformCommission()); + newOrderRefund.setRefundActualTotal(order.getActualTotal()); + newOrderRefund.setPurchaseRefundAmount(orderItemList.stream().mapToLong(OrderItem::getItemPurchaseAmount).sum()); + newOrderRefund.setPurPlatformRefundCommission(orderItemList.stream().mapToLong(OrderItem::getPurchasePlatformCommission).sum()); + } else { + if (Objects.nonNull(orderRefundParam.getGiveawayItemIds())){ + RedisUtil.set(OrderCacheNames.REFUND_GIVEAWAY_ORDER_ITEM + orderRefundParam.getOrderItemId(), orderRefundParam.getGiveawayItemIds(), 3600); + } + LOGGER.info("申请单个物品退款,订单号:{}", order.getOrderId()); + ServerResponseEntity doItemRefundResponse = doItemRefund(orderRefundParam, order, isDelivered, newOrderRefund, orderRefunds, orderItemList); + if (!doItemRefundResponse.isSuccess()) { + LOGGER.error("申请退款失败,原因:{}", doItemRefundResponse.getMsg()); + return doItemRefundResponse; + } + } + newOrderRefund.setSupplierId(0L); + // 判断下是否为供应商订单,如果是商家代销供应商商品且为供应商发货设置供应商信息 + if (!Objects.equals(order.getSupplierId(), 0L) && Objects.equals(order.getSupplierDeliveryType(), 1)) { + LOGGER.info("申请退款,订单号:{},为供应商订单", order.getOrderId()); + newOrderRefund.setSupplierId(order.getSupplierId()); + } + newOrderRefund.setShopId(order.getShopId()); + newOrderRefund.setUserId(order.getUserId()); + newOrderRefund.setOrderId(order.getOrderId()); + newOrderRefund.setRefundType(orderRefundParam.getRefundType()); + + newOrderRefund.setRefundAmount(orderRefundParam.getRefundAmount()); + if (Objects.equals(RefundType.ALL.value(), orderRefundParam.getRefundType())) { + newOrderRefund.setOrderItemId(0L); + newOrderRefund.setRefundCount(order.getAllCount()); + } else { + newOrderRefund.setOrderItemId(orderRefundParam.getOrderItemId()); + newOrderRefund.setRefundCount(orderRefundParam.getRefundCount() + orderRefundParam.getGiveawayRefundCount()); + } + newOrderRefund.setApplyType(orderRefundParam.getApplyType()); + if (Objects.equals(orderRefundParam.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value())) { + LOGGER.info("申请退款,订单号:{},申请类型:退货退款", order.getOrderId()); + newOrderRefund.setIsReceived(1); + } else { + newOrderRefund.setIsReceived(orderRefundParam.getReceived()); + } + newOrderRefund.setBuyerReason(orderRefundParam.getBuyerReason()); + newOrderRefund.setBuyerDesc(orderRefundParam.getBuyerDesc()); + newOrderRefund.setBuyerMobile(orderRefundParam.getBuyerMobile()); + newOrderRefund.setImgUrls(orderRefundParam.getImgUrls()); + newOrderRefund.setReturnMoneySts(ReturnProcessStatusEnum.APPLY.value()); + newOrderRefund.setUpdateTime(new Date()); + orderRefundService.applyRefund(newOrderRefund); + return ServerResponseEntity.success(newOrderRefund.getRefundId()); + } + + /** + * 用户提交物流公司信息 + */ + @PostMapping("/submit_express") + @Operation(summary = "提交退款订单物流填写信息", description = "提交退款订单物流填写信息") + public ServerResponseEntity submitExpress(@Valid @RequestBody OrderRefundDeliveryDTO orderRefundExpressParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundExpressParam.getRefundId()); + if (Objects.isNull(orderRefundVO)) { + // 查询不到退款信息 + return ServerResponseEntity.showFailMsg("退款订单不存在"); + } + + Long userId = AuthUserContext.get().getUserId(); + if (!Objects.equals(orderRefundVO.getUserId(), userId)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + + if (!Objects.equals(orderRefundVO.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value())) { + // 当前申请类型不允许提交物流信息操作 + return ServerResponseEntity.showFailMsg("当前申请类型不允许提交物流信息操作"); + } + if (!Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.PROCESSING.value()) + && !Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.CONSIGNMENT.value())) { + // 当前状态不允许提交物流信息操作 + return ServerResponseEntity.showFailMsg("当前状态不允许提交物流信息操作"); + } + + // 填写物流信息 申请退货的时候已经有退货信息了 + OrderRefundAddr orderRefundAddr = orderRefundAddrService.getByRefundId(orderRefundExpressParam.getRefundId()); + orderRefundAddr.setSenderMobile(orderRefundExpressParam.getMobile()); + orderRefundAddr.setSenderRemarks(orderRefundExpressParam.getSenderRemarks()); + orderRefundAddr.setDeliveryCompanyId(orderRefundExpressParam.getDeliveryCompanyId()); + orderRefundAddr.setDeliveryName(orderRefundExpressParam.getDeliveryName()); + orderRefundAddr.setDeliveryNo(orderRefundExpressParam.getDeliveryNo()); + orderRefundAddr.setImgs(orderRefundExpressParam.getImgs()); + orderRefundAddr.setCreateTime(new Date()); + + OrderRefund orderRefund = BeanUtil.map(orderRefundVO, OrderRefund.class); + orderRefundService.submitExpress(orderRefund, orderRefundAddr); + // 提交成功 + return ServerResponseEntity.success(); + } + + + /** + * 用户撤销退货退款申请 + */ + @PutMapping("/cancel") + @Operation(summary = "撤销退货退款申请") + public ServerResponseEntity cancel(@RequestBody Long refundId) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(refundId); + if (Objects.isNull(orderRefundVO)) { + // 撤销失败 退款订单不存在 + return ServerResponseEntity.showFailMsg("退款订单不存在"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.PROCESSING.value())) { + // 卖家正在处理退款,不能撤销退款申请 + return ServerResponseEntity.showFailMsg("卖家正在处理退款,不能撤销退款申请"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.CONSIGNMENT.value())) { + // 买家已发货,不能撤销退款申请 + return ServerResponseEntity.showFailMsg("买家已发货,不能撤销退款申请"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.RECEIVE.value())) { + // 卖家已收货,不能撤销退款申请 + return ServerResponseEntity.showFailMsg("卖家已收货,不能撤销退款申请"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value())) { + return ServerResponseEntity.showFailMsg("退款已成功,不能撤销退款申请"); + } + Long userId = AuthUserContext.get().getUserId(); + + // 查看订单是否还有处于处理中的退款单,如果没有则修改订单退款状态为关闭状态 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVO.getOrderId(), userId); + + //如果订单状态为待发货、包含运费、单个商品退款,且所有订单项都进行退款,则不能再取消退款(取消退款后再退款会导致重复退运费bug) + if (Objects.equals(order.getStatus(), OrderStatus.PAYED.value()) && Objects.equals(orderRefundVO.getRefundType(), RefundType.SINGLE.value()) + && order.getFreightAmount() - order.getPlatformFreeFreightAmount() > 0) { + // 退款数量 + int refundCount = orderRefundService.countByReturnMoneyStsAndOrderId(1, 6, order.getOrderId()); + // 订单项数量 + int orderItemCount = orderItemService.countByOrderId(order.getOrderId()); + if (refundCount == orderItemCount) { + // 该订单所有商品都进行退款,已无法取消退款 + return ServerResponseEntity.showFailMsg("该订单所有商品都进行退款,已无法取消退款"); + } + } + + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value()) || + Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.FAIL.value())) { + // 撤销失败 当前状态不允许此操作 + return ServerResponseEntity.showFailMsg("撤销失败 当前状态不允许此操作"); + } + + orderRefundService.cancelRefund(orderRefundVO); + + + return ServerResponseEntity.success(); + } + + /** + * 用户申请平台介入 + */ + @PutMapping("/apply_platform_intervention") + @Operation(summary = "用户发起/修改平台申请介入") + public ServerResponseEntity applyPlatormIntervertion(@RequestBody OrderRefundInterventionDTO orderRefundParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundParam.getRefundId()); + if (Objects.isNull(orderRefundVO)) { + // 退款订单不存在 + return ServerResponseEntity.showFailMsg("退款订单不存在"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value())) { + // 买家已发货,不能申请平台介入 + return ServerResponseEntity.showFailMsg("退款已经成功,不能申请平台介入"); + } + if (!Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.FAIL.value())) { + // 卖家正在处理退款,不能申请平台介入 + return ServerResponseEntity.showFailMsg("卖家正在处理退款,不能申请平台介入"); + } + if (Objects.equals(orderRefundVO.getPlatformInterventionStatus(),PlatformInterventionStatus.AGREE.value()) + || Objects.equals(orderRefundVO.getPlatformInterventionStatus(), PlatformInterventionStatus.SUCCESS.value()) + || Objects.equals(orderRefundVO.getPlatformInterventionStatus(), PlatformInterventionStatus.REJECT.value())) { + // 平台介入状态异常,不能申请平台介入 + return ServerResponseEntity.showFailMsg("平台介入状态异常,不能申请平台介入"); + } + Date updateOutTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -4)).toJdkDate(); + if (Objects.equals(orderRefundVO.getPlatformInterventionStatus(),PlatformInterventionStatus.APPLY.value()) + && DateUtil.compare(orderRefundVO.getApplyInterventionTime(),updateOutTime) < 0) { + // 平台介入状态异常,不能申请平台介入 + return ServerResponseEntity.showFailMsg("已过用户修改时间不能继续修改申请"); + } + // 判断一下有没有过维权期,如果订单已经确认收货,且在15天维权期内则可以申请 + Long userId = AuthUserContext.get().getUserId(); + + // 查看订单是否还有处于处理中的退款单,如果没有则修改订单退款状态为关闭状态 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVO.getOrderId(), userId); + if(Objects.equals(order.getStatus(),OrderStatus.SUCCESS.value())){ + Date finallyTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -15)).toJdkDate(); + if(DateUtil.compare(order.getFinallyTime(),finallyTime) < 0){ + throw new LuckException("已过维权期,不可以申请平台介入"); + } + } + if(!Objects.equals(order.getStatus(),OrderStatus.PAYED.value())) { + // 不是待发货状态,可能是待发货前申请,发货完在进行平台介入,所以判断一下最大可退金额 + long canRefundAmount = order.getActualTotal() - order.getFreightAmount() + order.getPlatformFreeFreightAmount(); + if (orderRefundVO.getRefundAmount() > canRefundAmount) { + throw new LuckException("订单状态变动,请重新发起退款申请"); + } + } + // 订单项或者整单订单有正在退款或者正在平台介入的时候,不能申请平台介入 + List processingOrderRefunds = orderRefundService.getProcessingOrderRefundByOrderId(orderRefundVO.getOrderId()); + List filterOrderRefunds = processingOrderRefunds.stream().filter(orderRefund -> Objects.equals(orderRefund.getOrderItemId(), 0L) || Objects.equals(orderRefund.getOrderItemId(), orderRefundVO.getOrderItemId())).toList(); + if(CollectionUtil.isNotEmpty(filterOrderRefunds)){ + throw new LuckException("订单正在申请退款或者正在平台介入中,不能申请平台介入"); + } + orderRefundService.applyPlatormIntervertion(orderRefundParam,orderRefundVO); + + return ServerResponseEntity.success(); + } + + /** + * 用户撤销平台申请介入 + */ + @PutMapping("/cancel_platform_intervention") + @Operation(summary = "用户撤销平台申请介入") + public ServerResponseEntity cacelPlatormIntervertion(@RequestBody OrderRefundInterventionDTO orderRefundParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundParam.getRefundId()); + if (Objects.isNull(orderRefundVO)) { + // 退款订单不存在 + return ServerResponseEntity.showFailMsg("退款订单不存在"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value())) { + return ServerResponseEntity.showFailMsg("退款已经成功,无需撤销平台申请介入"); + } + if (!Objects.equals(orderRefundVO.getPlatformInterventionStatus(), PlatformInterventionStatus.APPLY.value())) { + return ServerResponseEntity.showFailMsg("当前申请介入状态异常,不能撤销平台介入"); + } + // 判断一下有没有过维权期,如果订单已经确认收货,且在15天维权期内则可以申请 + Long userId = AuthUserContext.get().getUserId(); + + // 查看订单是否还有处于处理中的退款单,如果没有则修改订单退款状态为关闭状态 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVO.getOrderId(), userId); + if(Objects.equals(order.getStatus(),OrderStatus.SUCCESS.value())){ + Date finallyTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -15)).toJdkDate(); + if(DateUtil.compare(order.getFinallyTime(),finallyTime) < 0){ + throw new LuckException("已过维权期,不可以撤销平台介入,建议联系平台客服"); + } + } + orderRefundService.cacelPlatormIntervertion(orderRefundParam,orderRefundVO); + + return ServerResponseEntity.success(); + } + + /** + * 查看退款订单详情 + */ + @GetMapping("/info") + @Operation(summary = "查看退款订单详情", description = "查看退款订单详情") + public ServerResponseEntity info(Long refundId) { + // 查询详情 + OrderRefundVO orderRefundVO = orderRefundService.getDetailByRefundId(refundId); + int giveawayCount = 0; + for (RefundOrderItemVO orderItem : orderRefundVO.getOrderItems()) { + if(CollectionUtil.isNotEmpty(orderItem.getGiveawayList())) { + giveawayCount += orderItem.getGiveawayList().stream().mapToInt(RefundOrderItemVO::getCount).sum(); + } + } + orderRefundVO.setRefundCount(orderRefundVO.getRefundCount() - giveawayCount); + if (orderRefundVO == null) { + // 查看失败 该退款订单不存在 + return ServerResponseEntity.showFailMsg("该退款订单不存在"); + } + + if (!Objects.equals(orderRefundVO.getUserId(), AuthUserContext.get().getUserId())) { + // 查看失败 您没有此权限 + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 退货地址 + if (Objects.equals(orderRefundVO.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value()) && orderRefundVO.getHandelTime() != null) { + OrderRefundAddr orderRefundAddr = orderRefundAddrService.getByRefundId(refundId); + orderRefundVO.setOrderRefundAddr(BeanUtil.map(orderRefundAddr, OrderRefundAddrVO.class)); + } + return ServerResponseEntity.success(orderRefundVO); + } + + /** + * 修改退款订单详情 + */ + @PutMapping("/update_refund") + @Operation(summary = "修改退款订单详情", description = "修改退款订单详情,仅在用户申请平台介入后可以修改") + public ServerResponseEntity updateRefund(@RequestBody OrderRefundDTO orderRefundParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundParam.getRefundId()); + Long userId = AuthUserContext.get().getUserId(); + if (Objects.isNull(orderRefundVO)) { + // 退款订单不存在 + return ServerResponseEntity.showFailMsg("退款订单不存在"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value())) { + // 买家已发货,不能申请平台介入 + return ServerResponseEntity.showFailMsg("退款已经成功,不能申请平台介入"); + } + if (!Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.FAIL.value())) { + // 卖家正在处理退款,不能申请平台介入 + return ServerResponseEntity.showFailMsg("卖家正在处理退款,不能申请平台介入"); + } + if (!Objects.equals(orderRefundVO.getPlatformInterventionStatus(),PlatformInterventionStatus.APPLY.value())){ + // 平台介入状态异常,不能申请平台介入 + return ServerResponseEntity.showFailMsg("平台介入状态异常,不能修改退款信息"); + } + // 获取订单信息 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundParam.getOrderId(), userId); + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundAmount(orderRefundParam.getRefundAmount()); + orderRefund.setRefundId(orderRefundParam.getRefundId()); + orderRefund.setImgUrls(orderRefundParam.getImgUrls()); + orderRefund.setBuyerDesc(orderRefundParam.getBuyerDesc()); + orderRefund.setApplyType(orderRefundParam.getApplyType()); + orderRefund.setBuyerMobile(orderRefundParam.getBuyerMobile()); + orderRefund.setBuyerReason(orderRefundParam.getBuyerReason()); + orderRefund.setRefundType(orderRefundParam.getRefundType()); + // 商品是否已经发货 + boolean isDelivered = Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value()) || Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value()); + if (Objects.equals(RefundType.ALL.value(), orderRefundParam.getRefundType())) { + orderRefund.setOrderItemId(0L); + orderRefund.setRefundCount(order.getAllCount()); + } else { + ServerResponseEntity doItemRefundResponse = doItemRefund(orderRefundParam, order, isDelivered, orderRefund, null, null); + if (!doItemRefundResponse.isSuccess()) { + LOGGER.error("申请退款失败,原因:{}", doItemRefundResponse.getMsg()); + return doItemRefundResponse; + } + // 部分物品退款 + OrderItemVO orderItemVO = orderItemService.getByOrderItemId(orderRefundParam.getOrderItemId()); + // 退款物品数量为null或者0时,则为退款全部数量 + if (orderRefundParam.getRefundCount() <= 0) { + orderRefundParam.setRefundCount(orderItemVO.getCount()); + } + orderRefund.setOrderItemId(orderRefundParam.getOrderItemId()); + orderRefund.setRefundCount(orderRefundParam.getRefundCount() + orderRefundParam.getGiveawayRefundCount()); + } + orderRefund.setRefundCount(orderRefundParam.getRefundCount()); + if (Objects.equals(orderRefundParam.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value())) { + orderRefund.setIsReceived(1); + } else { + orderRefund.setIsReceived(orderRefundParam.getReceived()); + } + orderRefund.setUpdateTime(new Date()); + orderRefundService.update(orderRefund); + return ServerResponseEntity.success(); + } + + + /** + * TODO 测试用途 + */ + @PutMapping("/test_update_refund_time") + @Operation(summary = "", description = "") + public ServerResponseEntity testUpdateRefundTime(@RequestBody OrderRefundDTO orderRefundParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundParam.getRefundId()); + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundId(orderRefundParam.getRefundId()); + orderRefund.setApplyInterventionTime(DateUtil.offsetDay(orderRefundVO.getApplyInterventionTime(),-4)); + orderRefundService.update(orderRefund); + return ServerResponseEntity.success(); + } + + /** + * 查看我的退款订单列表 + */ + @GetMapping("/page") + @Operation(summary = "我的退款订单列表", description = "我的退款订单列表,显示数量时候") + public ServerResponseEntity> list(PageDTO page, OrderRefundSearchDTO orderRefundPageDTO) { + orderRefundPageDTO.setUserId(AuthUserContext.get().getUserId()); + EsPageVO pageList = orderRefundService.page(page, orderRefundPageDTO); + return ServerResponseEntity.success(pageList); + } + + private ServerResponseEntity doItemRefund(OrderRefundDTO orderRefundParam, Order order, boolean isDelivered, OrderRefund newOrderRefund, List orderRefunds, List orderItemList) { + // 部分物品退款 + OrderItemVO orderItemVO = orderItemService.getByOrderItemId(orderRefundParam.getOrderItemId()); + if (orderItemVO == null) { + // 该物品在订单中不存在 + return ServerResponseEntity.fail(ResponseEnum.ORDER_NOT_EXIST); + } + if (!isCanRefund(orderItemList)) { + // 该订单部分订单项支付金额和积分为0,无法使用部分退款 + return ServerResponseEntity.showFailMsg("该订单部分订单项支付金额和积分为0,无法使用部分退款"); + } + if (Objects.equals(orderItemVO.getSpuMold(), 1) && Objects.equals(orderRefundParam.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value())) { + return ServerResponseEntity.showFailMsg("虚拟商品只能选择仅退款"); + } + // 用户实际能退的运费 = 订单当前运费 - 平台减免运费 + long freightAmount = order.getFreightAmount() - order.getPlatformFreeFreightAmount(); + //赠品处理 + long itemActualTotal = orderItemVO.getActualTotal(); + long giveawayRefundAmount = 0; + StringBuilder returnGiveawayIds = new StringBuilder(Constant.INITIAL_CAPACITY); + // 赠品处理 + giveawayRefundAmount = handleGiveawayProd(orderRefundParam, newOrderRefund, orderItemVO, giveawayRefundAmount, returnGiveawayIds); + // 最多可以退的实付金额需要减去不退回的赠品退款金额,最小值应该为0.01,理论上赠品价值不可能大于商品 + itemActualTotal = (long) Arith.sub(itemActualTotal, giveawayRefundAmount); + // 计算该订单项的分销金额 + OrderItem tempOrderItem = BeanUtil.map(orderItemVO, OrderItem.class); + newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(Collections.singletonList(tempOrderItem))); + + handlePlatformAmount(orderRefundParam, newOrderRefund, orderItemVO, itemActualTotal); + // 采购金额应退 = 采购金额 *(退款金额 / 实付金额) + Long purchaseRefundAmount = PriceUtil.divideByBankerRounding(orderItemVO.getItemPurchaseAmount() * orderRefundParam.getRefundAmount(), itemActualTotal); + // 积分全部抵扣的情况下,退款金额为0,实付金额也为0,此时采购金额应退订单采购金额 + if(itemActualTotal == 0 && orderRefundParam.getRefundAmount() == 0) { + purchaseRefundAmount = orderItemVO.getItemPurchaseAmount(); + } + newOrderRefund.setPurchaseRefundAmount(purchaseRefundAmount); + + newOrderRefund.setRefundActualTotal(itemActualTotal); + + // 退款物品数量为null或者0时,则为退款全部数量 + if (orderRefundParam.getRefundCount() <= 0) { + orderRefundParam.setRefundCount(orderItemVO.getCount()); + } + + // 判断退款数量是否溢出 + if (orderRefundParam.getRefundCount() > orderItemVO.getCount()) { + // 退款物品数量已超出订单中的数量,不允许申请 + return ServerResponseEntity.showFailMsg("退款物品数量已超出订单中的数量,不允许申请"); + } + + // 判断退款金额是否超出订单金额3种情况 + double refundSingleAmount = Arith.div(Arith.add(orderRefundParam.getRefundAmount(), giveawayRefundAmount), orderRefundParam.getRefundCount(), 3); + refundSingleAmount = Arith.sub(refundSingleAmount, giveawayRefundAmount); + + // 单件退款金额 + double singleAmount = Arith.div(orderItemVO.getActualTotal(), orderItemVO.getCount(), 3); + + // 可以退款的实际金额应该为 当前退款数量 * singleAmount(单个最大退款金额) - 赠品金额,并且不能超过订单项的实付金额 + double productTotalAmount = orderItemVO.getSpuTotalAmount() + orderItemVO.getShopChangeFreeAmount() - giveawayRefundAmount; + // 2.如果不是直接跟订单项进行判断 + if (refundSingleAmount > productTotalAmount || refundSingleAmount > singleAmount) { + // 退款金额已超出订单金额,无法申请 + return ServerResponseEntity.showFailMsg("退款金额已超出订单金额,无法申请"); + } + // 3.当前退款金额 + 已申请退款金额 > 订单实际支付总额, 就不能退款了 + double refundAmount = orderRefundParam.getRefundAmount(); + if(CollectionUtil.isEmpty(orderRefunds)){ + return ServerResponseEntity.success(); + } + // 已退款总金额 + double alreadyRefundTotal = orderRefunds.stream().mapToDouble(OrderRefund::getRefundAmount).sum(); + if (Arith.add(refundAmount, alreadyRefundTotal) > order.getActualTotal()) { + // 退款金额已超出订单金额,无法申请 + return ServerResponseEntity.showFailMsg("退款金额已超出订单金额,无法申请"); + } + // 一个订单项只能申请一次退款 + for (OrderRefund orderRefund : orderRefunds) { + if (Objects.equals(orderRefund.getOrderItemId(), orderItemVO.getOrderItemId())) { + // 退款订单项已处理,请勿重复申请 + return ServerResponseEntity.showFailMsg("退款订单项已处理,请勿重复申请"); + } + } + return ServerResponseEntity.success(); + } + + private static boolean isCanRefund(List orderItemList) { + boolean isCanRefund = true; + if(CollectionUtil.isEmpty(orderItemList)){ + return isCanRefund; + } + // 查看是否有支付金额和积分都为空的订单,有则抛出异常 + for (OrderItem item : orderItemList) { + if (!Objects.equals(item.getActivityType(), OrderActivityType.GIVEAWAY.value()) && !Objects.equals(item.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + if (item.getActualTotal() <= 0 && item.getUseScore() <= 0) { + isCanRefund = false; + break; + } + } + } + return isCanRefund; + } + + private static void handlePlatformAmount(OrderRefundDTO orderRefundParam, OrderRefund newOrderRefund, OrderItemVO orderItemVO, long itemActualTotal) { + // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + Long changePlatformAmount; + // 平台佣金应退 = 平台佣金 *(退款金额 / 实付金额) + Long changePlatformCommission; + if (orderRefundParam.getRefundAmount() != itemActualTotal && orderRefundParam.getRefundAmount() != 0) { + // 平台退款金额 = 平台优惠金额 *(退款金额 / 实付金额) + changePlatformAmount = PriceUtil.divideByBankerRounding(orderItemVO.getPlatformShareReduce() * orderRefundParam.getRefundAmount(), itemActualTotal); + changePlatformCommission = PriceUtil.divideByBankerRounding(orderItemVO.getPlatformCommission() * orderRefundParam.getRefundAmount(), itemActualTotal); + } else { + changePlatformAmount = orderItemVO.getPlatformShareReduce(); + changePlatformCommission = orderItemVO.getPlatformCommission(); + } + // 此处设置实际平台抵现金额 + newOrderRefund.setPlatformRefundAmount(changePlatformAmount); + + newOrderRefund.setPlatformRefundCommission(changePlatformCommission); + + // 平台供应商佣金应退 = 平台供应商佣金 *(退款金额 / 实付金额) + // 退款金额为0时,是纯积分退款,金额无法修改,直接从商品中取佣金 + Long changeSupplierPlatformCommission; + if (orderRefundParam.getRefundAmount() == 0L) { + changeSupplierPlatformCommission = orderItemVO.getPurchasePlatformCommission(); + } else { + changeSupplierPlatformCommission = PriceUtil.divideByBankerRounding(orderItemVO.getPurchasePlatformCommission() * orderRefundParam.getRefundAmount(), itemActualTotal); + } + + newOrderRefund.setPurPlatformRefundCommission(changeSupplierPlatformCommission); + } + + private long handleGiveawayProd(OrderRefundDTO orderRefundParam, OrderRefund newOrderRefund, OrderItemVO orderItem, long giveawayRefundAmount, StringBuilder returnGiveawayIds) { + // 判断是否为赠品的主商品--活动类型为赠品,且活动id等于0 + int giveawayCount = 0; + if (Objects.equals(orderItem.getMainGiveaway(), 1)) { + boolean isReturnGiveaway = true; + List giveawayItemList = orderItemService.getOrderItemByGiveawayOrderItemId(orderItem.getUserId(), orderItem.getOrderItemId()); + List giveawayItemIds = orderRefundParam.getGiveawayItemIds(); + for (OrderItemVO giveawayItem : giveawayItemList) { + if (giveawayItemIds.contains(giveawayItem.getOrderItemId())) { + returnGiveawayIds.append(giveawayItem.getOrderItemId()).append(StrUtil.COMMA); + giveawayCount += giveawayItem.getCount(); + continue; + } + isReturnGiveaway = false; + // 不退回判断金额 + giveawayRefundAmount = (long) Arith.add(giveawayRefundAmount, giveawayItem.getGiveawayAmount()); + } + // 如果是全部退回则不需要判断退款金额 + if (isReturnGiveaway) { + giveawayRefundAmount = 0; + } + } + if (returnGiveawayIds.length() > 0) { + returnGiveawayIds.deleteCharAt(returnGiveawayIds.length() - 1); + newOrderRefund.setReturnGiveawayIds(returnGiveawayIds.toString()); + } else { + newOrderRefund.setReturnGiveawayIds(null); + } + orderRefundParam.setGiveawayRefundCount(giveawayCount); + return giveawayRefundAmount; + } + + + private ServerResponseEntity checkOrderStatus(OrderRefundDTO orderRefundParam, Order order, boolean isDelivered) { + //待收货或者确认收货 -> 整单退款 -> 退款金额 < 订单金额 - 运费金额 + if (isDelivered && orderRefundParam.getRefundType().equals(RefundType.ALL.value())) { + long refundAmount = order.getActualTotal() - (order.getFreightAmount() - order.getPlatformFreeFreightAmount()); + if (Math.abs(orderRefundParam.getRefundAmount()) > refundAmount) { + // 退款金额已超出订单金额,无法申请 + return ServerResponseEntity.showFailMsg("退款金额已超出订单金额"); + } + } + + if (!Objects.equals(order.getIsPayed(), 1)) { + // 当前订单还未付款,无法申请 + return ServerResponseEntity.showFailMsg("当前订单还未付款,无法申请退款"); + } + + if (Objects.equals(order.getStatus(), OrderStatus.CLOSE.value())) { + // 当前订单已失败,不允许退款 + return ServerResponseEntity.showFailMsg("当前订单已关闭"); + } + + if (Objects.equals(order.getStatus(), OrderStatus.WAIT_GROUP.value())) { + // 当前订单正在等待成团状态,需等待成团才能进行下一步操作 + return ServerResponseEntity.showFailMsg("当前订单正在等待成团状态,需等待成团才能进行下一步操作"); + } + + if (Objects.equals(order.getStatus(), OrderStatus.WAIT_BALANCE.value())) { + // 当前订单正在等待支付尾款状态,需完成支付尾款才能进行下一步操作 + return ServerResponseEntity.showFailMsg("当前订单正在等待支付尾款状态,需完成支付尾款才能进行下一步操作"); + } + + + if (orderRefundParam.getRefundAmount() > order.getActualTotal()) { + return ServerResponseEntity.showFailMsg("退款金额已超出订单金额,无法申请"); + } + + + if (!orderRefundService.checkRefundDate(order)) { + return ServerResponseEntity.showFailMsg("当前订单已超过可退款时间,无法退款"); + } + if (Objects.equals(order.getOrderType(), OrderType.SCORE.value())) { + // + return ServerResponseEntity.showFailMsg("积分商品,无法退款"); + } + + boolean hasRefund = !Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()); + if (Objects.equals(orderRefundParam.getRefundType(), RefundType.ALL.value()) && hasRefund) { + // 该订单已有商品正在退款中,不能再进行整单退款 + return ServerResponseEntity.showFailMsg("该订单已有商品正在退款中,不能再进行整单退款"); + } + + if (order.getOrderMold() == 1 && order.getWriteOffNum() == -1 && order.getWriteOffMultipleCount() == -1 && order.getWriteOffCount() > 0) { + // 该订单已有商品核销,无法退款 + return ServerResponseEntity.showFailMsg("该订单已有商品核销,无法退款"); + } + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderSelfStationController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderSelfStationController.java new file mode 100644 index 0000000..74719c7 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/OrderSelfStationController.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.model.OrderSelfStation; +import com.tmerclub.cloud.order.service.OrderSelfStationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @author Lanhai + */ +@RestController("OrderSelfStationController") +@RequestMapping("/order_self_station") +@Tag(name = "用户自提订单信息接口") +public class OrderSelfStationController { + + @Autowired + private OrderSelfStationService orderSelfStationService; + + @GetMapping("/get_station_user_info") + @Operation(summary = "获取常用提货人信息", description = "用户创建订单时,获取常用提货人信息") + public ServerResponseEntity> getStationUserInfo() { + Long userId = AuthUserContext.get().getUserId(); + List orderSelfStationList = orderSelfStationService.getStationUserInfo(userId); + return ServerResponseEntity.success(orderSelfStationList); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/ScoreOrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/ScoreOrderController.java new file mode 100644 index 0000000..58aec20 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/app/ScoreOrderController.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.app; + + +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.order.manager.ConfirmOrderManager; +import com.tmerclub.cloud.api.product.manager.ShopCartAdapter; +import com.tmerclub.cloud.api.product.manager.ShopCartItemAdapter; +import com.tmerclub.cloud.api.user.feign.UserLevelAndScoreOrderFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.dto.OrderDTO; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +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; +import java.util.Objects; +import java.util.stream.Collectors; + + +/** + * 积分商城接口 + * + * @author YXF + * @date 2021-08-24 + */ +@RestController +@RequestMapping("/score_order") +@Tag(name = "积分商品订单接口") +public class ScoreOrderController { + + private final Logger LOGGER = LoggerFactory.getLogger(ScoreOrderController.class); + @Autowired + private ShopCartAdapter shopCartAdapter; + @Autowired + private ConfirmOrderManager confirmOrderManager; + @Autowired + private ShopCartItemAdapter shopCartItemAdapter; + @Autowired + private DeliveryManager deliveryManager; + @DubboReference + private UserLevelAndScoreOrderFeignClient userLevelAndScoreOrderFeignClient; + + /** + * 积分商品购买 + */ + @PostMapping("/confirm") + @Operation(summary = "购买,生成订单信息", description = "传入下单所需要的参数进行下单") + public ServerResponseEntity confirm(@Valid @RequestBody OrderDTO orderParam) { + if (Objects.isNull(orderParam.getShopCartItem())) { + LOGGER.error("shopCartItem不能为空"); + throw new LuckException("shopCartItem不能为空"); + } + Long userId = AuthUserContext.get().getUserId(); + // 将要返回给前端的完整的订单信息 + ShopCartOrderMergerVO shopCartOrderMerger = new ShopCartOrderMergerVO(); + // 积分商品只有快递发货 + List dvyTypeDTOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + dvyTypeDTOList.add(new DvyTypeDTO(0L, DeliveryType.DELIVERY.value())); + shopCartOrderMerger.setDvyTypes(dvyTypeDTOList); + shopCartOrderMerger.setOrderType(OrderType.SCORE); + shopCartOrderMerger.setSpuMold(SpuMold.REAL.value()); + + List shopCartItemsDb = shopCartItemAdapter.conversionShopCartItem(orderParam.getShopCartItem(), null, userId, orderParam.getDvyTypes()); + // 获取用户地址信息 + UserDeliveryInfoVO userDeliveryInfoVO = confirmOrderManager.getUserDeliveryInfoVO(shopCartItemsDb, userId, orderParam); + // 筛选过滤掉不同配送的商品 + List shopCartItems = confirmOrderManager.filterShopItemsByType(shopCartOrderMerger, userDeliveryInfoVO, shopCartItemsDb); + + OrderLangUtil.shopCartItemList(shopCartItemsDb); + + // 购物车 + List shopCarts = shopCartAdapter.conversionShopCart(shopCartItems); + + // 积分商品没有优惠活动信息,不需要异步 + ServerResponseEntity userDeliveryInfoResponseEntity = deliveryManager.calculateAndGetDeliverInfo(new CalculateAndGetDeliverInfoDTO(shopCartItems, userDeliveryInfoVO)); + + // 处理完优惠活动,插入订单项库存区域id + confirmOrderManager.handleShopCartStockPoint(userDeliveryInfoVO, shopCarts, shopCartItemsDb, shopCartOrderMerger.getMold()); + + // 当算完一遍店铺的各种满减活动时,重算一遍订单金额 + confirmOrderManager.recalculateAmountWhenFinishingCalculateShop(shopCartOrderMerger, shopCarts, userDeliveryInfoResponseEntity.getData()); + long orderShopReduce = shopCartOrderMerger.getOrderReduce(); + + // ===============================================开始平台优惠的计算================================================== + + // 会员等级优惠 + ServerResponseEntity calculateLevelDiscountResponseEntity = userLevelAndScoreOrderFeignClient.calculateLevelAndScoreDiscount(shopCartOrderMerger); + if (!calculateLevelDiscountResponseEntity.isSuccess()) { + LOGGER.error("会员等级优惠计算失败,原因:{}", calculateLevelDiscountResponseEntity.getMsg()); + return ServerResponseEntity.transform(calculateLevelDiscountResponseEntity); + } + shopCartOrderMerger = calculateLevelDiscountResponseEntity.getData(); + + // 重新插入spu、sku + Map shopCartItemMap = shopCartItemsDb.stream().collect(Collectors.toMap(ShopCartItemVO::getSkuId, s -> s)); + for (ShopCartOrderVO shopCartOrder : shopCartOrderMerger.getShopCartOrders()) { + shopCartOrder.setShopName(Constant.PLATFORM_SHOP_NAME); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + ShopCartItemVO shopCartItemVO = shopCartItemMap.get(shopCartItem.getSkuId()); + shopCartItem.setSkuLangList(shopCartItemVO.getSkuLangList()); + shopCartItem.setSpuLangList(shopCartItemVO.getSpuLangList()); + } + } + } + shopCartOrderMerger.setOrderShopReduce(orderShopReduce); + // 缓存计算新 + confirmOrderManager.cacheCalculatedInfo(userId, shopCartOrderMerger); + + // 无法配送的商品添加商品详细和店铺详细 + shopCartAdapter.setFilterShopItemsLong(shopCartOrderMerger); + return ServerResponseEntity.success(shopCartOrderMerger); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/AllotOrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/AllotOrderController.java new file mode 100644 index 0000000..4cf5d4d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/AllotOrderController.java @@ -0,0 +1,127 @@ +package com.tmerclub.cloud.order.controller.multishop; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.dto.AllotOrderDTO; +import com.tmerclub.cloud.order.service.AllotOrderService; +import com.tmerclub.cloud.order.vo.AllotOrderVO; +import com.tmerclub.cloud.order.vo.AllotSpuImportVO; +import com.tmerclub.cloud.order.vo.AllotSpuInboundImportVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author gaozijie + * @date 2023-11-20 + */ +@Tag(name = "调拨订单(商家端)") +@RestController("multiShopAllotOrderController") +@RequestMapping("/m/allot_order") +public class AllotOrderController { + + @Autowired + private AllotOrderService allotOrderService; + + @Operation(summary = "获取调拨订单详情") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @GetMapping("/info/{allotOrderId}") + public ServerResponseEntity getAllotOrder(@PathVariable("allotOrderId") Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + AllotOrderVO allotOrderVO = allotOrderService.getAllotOrder(allotOrderDTO); + return ServerResponseEntity.success(allotOrderVO); + } + + @Operation(summary = "新增调拨订单") + @PostMapping + public ServerResponseEntity addAllotOrder(@RequestBody AllotOrderDTO allotOrderDTO) { + allotOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderDTO.setUserId(AuthUserContext.get().getUserId()); + allotOrderDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + allotOrderService.addAllotOrder(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "入库调拨订单") + @PutMapping("/inbound") + public ServerResponseEntity inbound(@RequestBody AllotOrderDTO allotOrderDTO) { + allotOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + allotOrderService.inbound(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "完成调拨订单") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @PutMapping("/complete/{allotOrderId}") + public ServerResponseEntity finish(@PathVariable("allotOrderId") Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + allotOrderService.completeOrder(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "作废调拨订单") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @DeleteMapping("/nullify/{allotOrderId}") + public ServerResponseEntity nullify(@PathVariable("allotOrderId") Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + allotOrderService.nullifyOrder(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "下载商品excel模板") + @GetMapping("/download_model") + public void downloadModel(HttpServletResponse response) { + allotOrderService.downloadModel(response); + } + + @Operation(summary = "导入商品excel") + @Parameters({ + @Parameter(name = "outWarehouseId", description = "调出仓库id"), + @Parameter(name = "inWarehouseId", description = "调入仓库id") + }) + @PostMapping("/import_excel") + public ServerResponseEntity importExcel(Long outWarehouseId, + Long inWarehouseId, + @RequestPart("excelFile") MultipartFile excelFile) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setOutWarehouseId(outWarehouseId); + allotOrderDTO.setInWarehouseId(inWarehouseId); + return ServerResponseEntity.success(allotOrderService.parseFile(excelFile, allotOrderDTO)); + } + + @Operation(summary = "下载商品入库excel模板") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @GetMapping("/download_inbound_model") + public void downloadInboundModel(HttpServletResponse response, Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + allotOrderService.downloadInboundModel(response, allotOrderDTO); + } + + @Operation(summary = "导入商品入库excel") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @PostMapping("/import_inbound_excel") + public ServerResponseEntity importInboundExcel(Long allotOrderId, + @RequestPart("excelFile") MultipartFile excelFile) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + return ServerResponseEntity.success(allotOrderService.parseInboundFile(excelFile, allotOrderDTO)); + } + + private AllotOrderDTO getAllotOrderDTO() { + AllotOrderDTO allotOrderDTO = new AllotOrderDTO(); + allotOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + return allotOrderDTO; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderInvoiceController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderInvoiceController.java new file mode 100644 index 0000000..f7f4d97 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderInvoiceController.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.multishop; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderInvoiceDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.constant.InvoiceHeaderType; +import com.tmerclub.cloud.order.constant.OrderInvoiceState; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderInvoice; +import com.tmerclub.cloud.order.service.OrderInvoiceService; +import com.tmerclub.cloud.order.service.OrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Objects; + +/** + * @author Pineapple + * @date 2021/8/2 8:59 + */ +@RestController("multishopOrderInvoiceController") +@RequestMapping("/m/order_invoice") +@Tag(name = "商家端订单发票") +public class OrderInvoiceController { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderInvoiceController.class); + @Autowired + private OrderInvoiceService orderInvoiceService; + @Autowired + private OrderService orderService; + + + @GetMapping + @Operation(summary = "获取", description = "根据orderInvoiceId获取") + public ServerResponseEntity getByOrderInvoiceId(@RequestParam Long orderInvoiceId) { + return ServerResponseEntity.success(orderInvoiceService.getByOrderInvoiceId(orderInvoiceId)); + } + + @PutMapping + @Operation(summary = "更新", description = "更新") + public ServerResponseEntity update(@Valid @RequestBody OrderInvoiceDTO orderInvoiceDTO) { + OrderInvoice orderInvoice = BeanUtil.map(orderInvoiceDTO, OrderInvoice.class); + if (Objects.isNull(orderInvoiceDTO.getFileId())) { + //商家提交,不上传文件不给保存 + LOGGER.error("请上传文件!"); + throw new LuckException("请上传文件!"); + } + orderInvoice.setInvoiceState(OrderInvoiceState.ISSUED.value()); + orderInvoice.setUploadTime(new Date()); + orderInvoiceService.update(orderInvoice); + return ServerResponseEntity.success(); + } + + @Operation(summary = "该订单是否已经上传发票") + @GetMapping("/is_upload") + public ServerResponseEntity isUpload(@RequestParam Long orderId) { + Long shopId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(orderInvoiceService.isUpload(orderId, shopId, null)); + } + + @PostMapping("/applyInvoice") + @Operation(summary = "申请开票(向供应商)", description = "保存申请信息") + public ServerResponseEntity applyInvoice(@Valid @RequestBody OrderInvoiceDTO orderInvoiceDTO) { + Order order = orderService.getByOrderId(orderInvoiceDTO.getOrderId()); + if (Objects.isNull(order)) { + throw new LuckException("订单不存在"); + } + Long supplierId = order.getSupplierId(); + if (Objects.isNull(supplierId) + || Objects.equals(supplierId, 0L)) { + throw new LuckException("非供应商订单,不能向供应商申请开票"); + } + Long orderId = orderInvoiceService.getByOrderId(orderInvoiceDTO.getOrderId(), null, supplierId); + if (Objects.nonNull(orderId)) { + LOGGER.error("该订单已经申请发票,请勿重复申请!"); + throw new LuckException("该订单已经申请发票,请勿重复申请!"); + } + OrderInvoice orderInvoice = BeanUtil.map(orderInvoiceDTO, OrderInvoice.class); + orderInvoice.setShopId(0L); + orderInvoice.setSupplierId(supplierId); + if (Objects.equals(InvoiceHeaderType.PERSONAL.value(), orderInvoice.getHeaderType())) { + LOGGER.error("个人发票不需要填写税号"); + orderInvoice.setInvoiceTaxNumber(null); + } + orderInvoice.setInvoiceState(OrderInvoiceState.APPLICATION.value()); + orderInvoice.setApplicationTime(new Date()); + orderInvoiceService.save(order.getUserId(), orderInvoice); + return ServerResponseEntity.success(); + } + + @PutMapping("/changeInvoice") + @Operation(summary = "申请换开(向供应商)", description = "更新发票信息") + public ServerResponseEntity changeInvoice(@Valid @RequestBody OrderInvoiceDTO orderInvoiceDTO) { + OrderInvoice orderInvoice = BeanUtil.map(orderInvoiceDTO, OrderInvoice.class); + orderInvoice.setInvoiceState(OrderInvoiceState.APPLICATION.value()); + orderInvoice.setApplicationTime(new Date()); + if (Objects.equals(InvoiceHeaderType.PERSONAL.value(), orderInvoice.getHeaderType())) { + LOGGER.error("个人发票不需要填写税号"); + orderInvoice.setInvoiceTaxNumber(null); + } + orderInvoiceService.update(orderInvoice); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderRefundInterventionController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderRefundInterventionController.java new file mode 100644 index 0000000..1204180 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderRefundInterventionController.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.multishop; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.service.OrderRefundInterventionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 订单退款介入记录信息 + * + * @author FrozenWatermelon + * @date 2023-08-25 10:45:35 + */ +@RestController("multishopOrderRefundInterventionController") +@RequestMapping("/m/order_refund_intervention") +@Tag(name = "订单退款介入记录信息") +public class OrderRefundInterventionController { + + @Autowired + private OrderRefundInterventionService orderRefundInterventionService; + + /** + * 添加介入凭证 + */ + @PutMapping("/save_intervention_voucher") + @Operation(summary = "添加介入凭证") + public ServerResponseEntity savePlatormIntervertion(@RequestBody OrderRefundInterventionDTO orderRefundParam) { + Long tenantId = AuthUserContext.get().getTenantId(); + orderRefundParam.setBizId(tenantId); + orderRefundParam.setSysType(SysTypeEnum.MULTISHOP.value()); + orderRefundInterventionService.savePlatormIntervertion(orderRefundParam); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderStatisticsController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderStatisticsController.java new file mode 100644 index 0000000..ddc7350 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderStatisticsController.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.multishop; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.service.OrderStatisticsService; +import com.tmerclub.cloud.order.vo.OrderOverviewVO; +import com.tmerclub.cloud.order.vo.OrderRefundStatisticsVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * @author lth + */ +@RestController("multishopOrderStatisticsController") +@RequestMapping("/m/order_statistics") +@Tag(name = "multishop-订单数据统计接口") +public class OrderStatisticsController { + + @Autowired + private OrderStatisticsService orderStatisticsService; + + @GetMapping("/order_count") + @Operation(summary = "查询店铺订单各状态数量", description = "根据订单状态统计订单数量") + public ServerResponseEntity getOrderCount() { + OrderCountVO orderCountVO = orderStatisticsService.getOrderCountOfStatusByShopId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(orderCountVO); + } + + @GetMapping("/get_to_day_by_hour") + @Operation(summary = "获取当天订单实时统计数据", description = "获取当天订单实时统计数据") + public ServerResponseEntity getToDayInfoByHour() { + OrderOverviewVO orderOverviewVO = orderStatisticsService.getToDayInfoByHour(AuthUserContext.get().getTenantId(), + DateUtil.beginOfDay(DateUtil.date()), DateUtil.endOfDay(DateUtil.date())); + return ServerResponseEntity.success(orderOverviewVO); + } + + @GetMapping("/get_current_month_by_day") + @Operation(summary = "获取当月订单的统计数据", description = "获取当月订单的统计数据") + public ServerResponseEntity getCurrentMonthInfoByDay() { + OrderOverviewVO orderOverviewVO = orderStatisticsService.getCurrentMonthByDay(AuthUserContext.get().getTenantId(), + DateUtil.beginOfMonth(DateUtil.date()), DateUtil.endOfDay(DateUtil.date())); + return ServerResponseEntity.success(orderOverviewVO); + } + + @GetMapping("/list_order_refund_info") + @Operation(summary = "获取近30天的退款订单比率信息及退款金额统计列表", description = "获取近30天的退款订单比率信息及退款金额统计列表") + public ServerResponseEntity> listOrderRefundInfoInThirtyDay() { + List orderRefundStatisticsVOList = orderStatisticsService.listOrderRefundInfoInDateRange(AuthUserContext.get().getTenantId(), + DateUtil.endOfDay(DateUtil.date()), 30); + return ServerResponseEntity.success(orderRefundStatisticsVOList); + } + + @GetMapping("/list_refund_ranking_by_prod") + @Operation(summary = "根据商品名生成退款排行", description = "根据商品名生成退款排行") + public ServerResponseEntity> listRefundRankingByProd() { + List orderRefundStatisticsVOList = orderStatisticsService.listRefundRankingByProd(AuthUserContext.get().getTenantId(), + DateUtil.endOfDay(DateUtil.date()), 30); + return ServerResponseEntity.success(orderRefundStatisticsVOList); + } + + @GetMapping("/list_refund_ranking_by_reason") + @Operation(summary = "根据退款原因生成退款排行") + public ServerResponseEntity> listRefundRankingByReason() { + List refundList = orderStatisticsService.listRefundRankingByReason( + AuthUserContext.get().getTenantId(), DateUtil.endOfDay(DateUtil.date()), 30); + return ServerResponseEntity.success(refundList); + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderVirtualInfoController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderVirtualInfoController.java new file mode 100644 index 0000000..e86d01c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/multishop/OrderVirtualInfoController.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.order.controller.multishop; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.order.vo.OrderVirtualInfoVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.service.OrderVirtualInfoService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +/** + * @author lanhai + */ +@RestController("multishopOrderVirtualInfoController") +@RequestMapping("/m/order_virtual_info") +@Tag(name = "multishop-虚拟订单接口") +public class OrderVirtualInfoController { + @Autowired + private OrderService orderService; + @Autowired + private OrderVirtualInfoService orderVirtualInfoService; + + @GetMapping("/order_info/{orderId}") + @Operation(summary = "根据订单号获取虚拟订单信息", description = "根据订单号获取订单信息") + public ServerResponseEntity info(@PathVariable("orderId") Long orderId) { + Long shopId = AuthUserContext.get().getTenantId(); + Order order = orderService.getOrderAndOrderItemData(orderId, shopId); + OrderVO orderVO = BeanUtil.map(order, OrderVO.class); + if (Objects.equals(order.getOrderMold(), 1)) { + List orderVirtualInfos = orderVirtualInfoService.getByOrderIdAndStationId(orderId, null); + if (CollectionUtil.isNotEmpty(orderVirtualInfos)) { + orderVO.setOrderVirtualInfoList(orderVirtualInfos); + } + } + return ServerResponseEntity.success(orderVO); + } + + @PutMapping("/order_write_off_by_order_id") + @Operation(summary = "用户虚拟商品订单核销操作", description = "用户虚拟商品订单核销操作") + public ServerResponseEntity orderWriteOffByOrderId(@RequestBody OrderVirtualInfoDTO orderVirtualInfoDTO) { + Long orderId = orderVirtualInfoDTO.getOrderId(); + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.isNull(orderId)) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + Order order = orderService.getOrderAndOrderItemData(orderId, shopId); + if (Objects.isNull(order) || order.getOrderMold() == 0) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + orderVirtualInfoService.orderWriteOffByOrderId(orderVirtualInfoDTO, order, null); + return ServerResponseEntity.success(Boolean.TRUE); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderRefundController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderRefundController.java new file mode 100644 index 0000000..6c7a7ac --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/platform/OrderRefundController.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.platform; + + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.multishop.feign.ShopWalletFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.payment.constant.PayEntry; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.order.constant.*; +import com.tmerclub.cloud.order.constant.*; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.model.OrderRefundAddr; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.service.OrderRefundAddrService; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.vo.OrderRefundAddrVO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import io.swagger.v3.oas.annotations.Operation; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + + +/** + * @author cl + */ +@RestController("platformOrderRefundController") +@RequestMapping("/p/order_refund") +public class OrderRefundController { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderRefundController.class); + @Autowired + private OrderRefundService orderRefundService; + @Autowired + private OrderRefundAddrService orderRefundAddrService; + @Autowired + private OrderService orderService; + @Autowired + private OrderItemService orderItemService; + @Autowired + private ShopWalletFeignClient shopWalletFeignClient; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private PaymentFeignClient paymentFeignClient; + + /** + * 查看我的退款订单列表 + */ + @GetMapping("/page") + @Operation(summary = "我的退款订单列表", description = "我的退款订单列表,显示数量时候") + public ServerResponseEntity> list(PageDTO page, OrderRefundSearchDTO orderRefundPageDTO) { + orderRefundPageDTO.setSysType(AuthUserContext.get().getSysType()); + EsPageVO pageList = orderRefundService.page(page, orderRefundPageDTO); + return ServerResponseEntity.success(pageList); + } + + /** + * 通过id查询 + * + * @param refundId id + * @return 查询详细信息 + */ + @GetMapping("/info/{refundId}") + public ServerResponseEntity getById(@PathVariable("refundId") Long refundId) { + OrderRefundVO orderRefund = orderRefundService.getDetailByRefundId(refundId); + if (Objects.equals(orderRefund.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value()) && orderRefund.getHandelTime() != null) { + LOGGER.info("退货退款,查询退货地址"); + OrderRefundAddr orderRefundAddr = orderRefundAddrService.getByRefundId(refundId); + orderRefund.setOrderRefundAddr(BeanUtil.map(orderRefundAddr, OrderRefundAddrVO.class)); + } + return ServerResponseEntity.success(orderRefund); + } + + /** + * 平台处理退款介入 + */ + @PutMapping("/handle_platform_intervention") + @Operation(summary = "平台处理退款介入") + public ServerResponseEntity hanlePlatormIntervertion(@RequestBody OrderRefundInterventionDTO orderRefundParam) { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(orderRefundParam.getRefundId()); + if (Objects.isNull(orderRefundVO)) { + // 撤销失败 退款订单不存在 + throw new LuckException("退款订单不存在"); + } + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value())) { + throw new LuckException("退款已经成功,不能处理介入请求"); + } + if (!Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.FAIL.value())) { + throw new LuckException("订单退款状态异常"); + } + if (!Objects.equals(orderRefundVO.getPlatformInterventionStatus(), PlatformInterventionStatus.APPLY.value())) { + throw new LuckException("平台介入状态异常"); + } + Boolean unStartCheck = DateUtil.compare(DateUtil.offsetDay(orderRefundVO.getApplyInterventionTime(),3) , DateUtil.date()) > 0; + if (unStartCheck) { + throw new LuckException("未到平台处理时间,不能处理本次介入"); + } + Boolean outTimeCheck = DateUtil.compare(DateUtil.offsetDay(orderRefundVO.getApplyInterventionTime(),7) , DateUtil.date()) < 0; + if (outTimeCheck) { + throw new LuckException("已过平台介入时间,不能处理本次介入"); + } + // 平台拒绝退款介入申请 + if (Objects.equals(orderRefundParam.getPlatformInterventionRefundType(), RefundStsType.DISAGREE.value())) { + orderRefundVO.setPlatformInterventionStatus(PlatformInterventionStatus.REJECT.value()); + orderRefundService.disagreeIntervention(orderRefundParam, orderRefundVO); + LOGGER.info("平台拒绝退款介入申请"); + return ServerResponseEntity.success(); + } + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVO.getOrderId(), orderRefundVO.getUserId()); + if (orderRefundParam.getRefundAmount() > orderRefundVO.getRefundActualTotal()) { + throw new LuckException("当前退款金额大于最大可退款金额"); + } + Long freightAmount = order.getFreightAmount() - order.getPlatformFreeFreightAmount(); + if (Objects.equals(orderRefundVO.getRefundType(),1) && Objects.equals(order.getStatus(), OrderStatus.PAYED.value()) && orderRefundParam.getRefundAmount() < freightAmount) { + throw new LuckException("待发货订单整单退款金额必须大于运费金额"); + } + if(Objects.equals(orderRefundParam.getPlatformInterventionRefundType(), InterventionRefundType.COMMON.value())) { + if (Objects.equals(order.getWaitPurchase(), 1)) { + throw new LuckException("待采购订单不能选择商家供应商共同承担退款"); + } + if (Objects.equals(orderRefundVO.getSupplierHandleStatus(), -1) && !Objects.equals(orderRefundVO.getSupplierId(),0L)) { + throw new LuckException("代销订单商家自行处理的退款,不能选择商家供应商共同承担"); + } + } + // 如果是店铺独立承担,判断一下是供应商订单还是普通订单 + // 如果是供应商订单且不是待采购的订单,需要判断一下店铺的已结算的钱是否够 + boolean checkOrder = Objects.equals(orderRefundParam.getPlatformInterventionRefundType(), InterventionRefundType.SHOP.value()) && !Objects.equals(orderRefundVO.getSupplierId(), 0L); + // 判断和计算一下金额 + Long supplierRealRefundAmount = calculateAmount(orderRefundParam,orderRefundVO,order,freightAmount); + // 不是待采购状态的供应商订单,才检查下钱是否足够 + if (checkOrder && !Objects.equals(order.getWaitPurchase(), 1)) { + // 检查一下商家结算金额是否足够 + ServerResponseEntity amountResp = shopWalletFeignClient.getSettlementAmountByShopId(orderRefundVO.getShopId(), order.getPaySysType()); + if (!amountResp.isSuccess()) { + LOGGER.error("查询商家结算金额失败,失败原因:{}", amountResp.getMsg()); + throw new LuckException(amountResp.getMsg()); + } + if (amountResp.getData() < supplierRealRefundAmount) { + LOGGER.error("商家余额不足,商家结算金额:{},供应商实际退款金额:{}", amountResp.getData(), supplierRealRefundAmount); + return ServerResponseEntity.showFailMsg("商家余额不足,请去进行充值后重试"); + } + // 如果订单是通联支付的,执行商家余额扣除,让商家跳转到通联输入支付密码等校验 + if (Objects.equals(order.getPaySysType(), PaySysType.ALLINPAY.value())) { + LOGGER.info("订单是通联支付的,执行商家余额扣除,让商家跳转到通联输入支付密码等校验,退款单详情:{}", orderRefundVO); + return allinPayBalancePay(supplierRealRefundAmount, order, order.getShopId(), orderRefundParam); + } + } + orderRefundVO.setInterventionRefundType(orderRefundParam.getPlatformInterventionRefundType()); + orderRefundVO.setPlatformMessage(orderRefundParam.getPlatformMessage()); + orderRefundVO.setAfterInterventionRefundAmount(orderRefundVO.getRefundAmount()); + orderRefundVO.setRefundAmount(orderRefundParam.getRefundAmount()); + orderRefundService.agreeRefund(null,orderRefundVO); + return ServerResponseEntity.success(); + } + @GetMapping("/is_last_refund") + @Operation(summary = "是否为最后一单退款") + public ServerResponseEntity isLastRefund(Long refundId) { + Long shopId = AuthUserContext.get().getTenantId(); + return ServerResponseEntity.success(orderRefundService.getIsLastRefund(refundId, shopId)); + } + + private Long calculateAmount(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO, Order order, Long freightAmount) { + // 如果存在分销订单,则计算分销总金额 + List orderItemList = orderItemService.listOrderItemsByOrderId(order.getOrderId()); + Long platformAmount = order.getPlatformAmount(); + Long platformCommission = order.getPlatformCommission(); + long purchaseAmount = orderItemList.stream().mapToLong(OrderItem::getItemPurchaseAmount).sum(); + long purchasePlatformCommission = orderItemList.stream().mapToLong(OrderItem::getPurchasePlatformCommission).sum(); + Long actualTotal = orderItemList.stream().mapToLong(OrderItem::getActualTotal).sum(); + long refundAmount = orderRefundParam.getRefundAmount(); + if(Objects.equals(orderRefundVO.getRefundType(), RefundType.SINGLE.value())){ + OrderItemVO orderItemVO = orderItemService.getByOrderItemId(orderRefundVO.getOrderItemId()); + platformAmount = orderItemVO.getPlatformShareReduce(); + platformCommission = orderItemVO.getPlatformCommission(); + purchaseAmount = orderItemVO.getItemPurchaseAmount(); + purchasePlatformCommission = orderItemVO.getPurchasePlatformCommission(); + actualTotal = orderItemVO.getActualTotal(); + }else if(Objects.equals(order.getStatus(),OrderStatus.PAYED.value())){ + // 待发货的订单还需要扣除运费进行计算 + refundAmount = refundAmount - freightAmount; + } + // 供应商改变金额 = 供应商改变金额 - 平台供应商佣金改变量 + 运费 + // 采购金额应退 = 采购金额 *(退款金额 / 实付金额) + // 部分物品退款 + Long purchaseRefundAmount = PriceUtil.divideByBankerRounding(purchaseAmount * refundAmount, actualTotal); + // 积分全部抵扣的情况下,退款金额为0,实付金额也为0,此时采购金额应退订单采购金额 + if (orderRefundVO.getRefundActualTotal() == 0 && refundAmount == 0) { + purchaseRefundAmount = purchaseAmount; + } + // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + Long changePlatformAmount; + // 平台佣金应退 = 平台佣金 *(退款金额 / 实付金额) + Long changePlatformCommission; + if (!Objects.equals(refundAmount ,orderRefundVO.getRefundActualTotal()) && refundAmount != 0) { + // 平台退款金额 = 平台优惠金额 *(退款金额 / 实付金额) + changePlatformAmount = PriceUtil.divideByBankerRounding(platformAmount * refundAmount, actualTotal); + changePlatformCommission = PriceUtil.divideByBankerRounding(platformCommission * refundAmount, actualTotal); + } else { + changePlatformAmount = platformAmount; + changePlatformCommission = platformCommission; + } + // 此处设置实际平台抵现金额 + orderRefundVO.setPlatformRefundAmount(changePlatformAmount); + + orderRefundVO.setPlatformRefundCommission(changePlatformCommission); + // 平台供应商佣金应退 = 平台供应商佣金 *(退款金额 / 实付金额) + // 退款金额为0时,是纯积分退款,金额无法修改,直接从商品中取佣金 + Long changeSupplierPlatformCommission; + if (orderRefundVO.getRefundActualTotal() == 0 && refundAmount == 0L) { + changeSupplierPlatformCommission = purchasePlatformCommission; + } else { + changeSupplierPlatformCommission = PriceUtil.divideByBankerRounding(purchasePlatformCommission * refundAmount, actualTotal); + } + orderRefundVO.setPurchaseRefundAmount(purchaseRefundAmount); + orderRefundVO.setPurPlatformRefundCommission(changeSupplierPlatformCommission); + return orderRefundVO.getPurchaseRefundAmount() - orderRefundVO.getPurPlatformRefundCommission() + + order.getFreightAmount(); + } + + + private ServerResponseEntity allinPayBalancePay(Long payAmount, Order order, Long tenantId, OrderRefundInterventionDTO orderRefundDTO) { + PayInfoApiDto orderPayInfoVO = new PayInfoApiDto(); + orderPayInfoVO.setBody("商家余额支付订单"); + orderPayInfoVO.setPayAmount(payAmount); + orderPayInfoVO.setPayType(PayType.BALANCE.value()); + orderPayInfoVO.setOrderIds(order.getOrderId().toString()); + orderPayInfoVO.setRefundId(orderRefundDTO.getRefundId()); + orderPayInfoVO.setUserId(order.getUserId().toString()); + orderPayInfoVO.setReturnUrl(orderRefundDTO.getReturnUrl()); + orderPayInfoVO.setPayEntry(PayEntry.SHOP_BALANCE_PAY_REFUND_SPREAD.value()); + // 存入支付扩展信息 + orderRefundDTO.setSellerMsg(null); + orderPayInfoVO.setExtendInfo(Json.toJsonString(orderRefundDTO)); + orderPayInfoVO.setBizUserId(order.getSupplierId().toString()); + orderPayInfoVO.setShopId(tenantId.toString()); + return paymentFeignClient.doAllinPayShopBalance(orderPayInfoVO); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/AllotOrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/AllotOrderController.java new file mode 100644 index 0000000..e2666f6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/AllotOrderController.java @@ -0,0 +1,127 @@ +package com.tmerclub.cloud.order.controller.supplier; + +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.dto.AllotOrderDTO; +import com.tmerclub.cloud.order.service.AllotOrderService; +import com.tmerclub.cloud.order.vo.AllotOrderVO; +import com.tmerclub.cloud.order.vo.AllotSpuImportVO; +import com.tmerclub.cloud.order.vo.AllotSpuInboundImportVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author gaozijie + * @date 2023-11-20 + */ +@Tag(name = "调拨订单(供应商端)") +@RestController("supplierAllotOrderController") +@RequestMapping("/s/allot_order") +public class AllotOrderController { + + @Autowired + private AllotOrderService allotOrderService; + + @Operation(summary = "获取调拨订单详情") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @GetMapping("/info/{allotOrderId}") + public ServerResponseEntity getAllotOrder(@PathVariable("allotOrderId") Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + AllotOrderVO allotOrderVO = allotOrderService.getAllotOrder(allotOrderDTO); + return ServerResponseEntity.success(allotOrderVO); + } + + @Operation(summary = "新增调拨订单") + @PostMapping + public ServerResponseEntity addAllotOrder(@RequestBody AllotOrderDTO allotOrderDTO) { + allotOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderDTO.setUserId(AuthUserContext.get().getUserId()); + allotOrderDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + allotOrderService.addAllotOrder(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "入库调拨订单") + @PutMapping("/inbound") + public ServerResponseEntity inbound(@RequestBody AllotOrderDTO allotOrderDTO) { + allotOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + allotOrderService.inbound(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "完成调拨订单") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @PutMapping("/complete/{allotOrderId}") + public ServerResponseEntity finish(@PathVariable("allotOrderId") Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + allotOrderService.completeOrder(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "作废调拨订单") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @DeleteMapping("/nullify/{allotOrderId}") + public ServerResponseEntity nullify(@PathVariable("allotOrderId") Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + allotOrderService.nullifyOrder(allotOrderDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "下载商品excel模板") + @GetMapping("/download_model") + public void downloadModel(HttpServletResponse response) { + allotOrderService.downloadModel(response); + } + + @Operation(summary = "导入商品excel") + @Parameters({ + @Parameter(name = "outWarehouseId", description = "调出仓库id"), + @Parameter(name = "inWarehouseId", description = "调入仓库id") + }) + @PostMapping("/import_excel") + public ServerResponseEntity importExcel(Long outWarehouseId, + Long inWarehouseId, + @RequestPart("excelFile") MultipartFile excelFile) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setOutWarehouseId(outWarehouseId); + allotOrderDTO.setInWarehouseId(inWarehouseId); + return ServerResponseEntity.success(allotOrderService.parseFile(excelFile, allotOrderDTO)); + } + + @Operation(summary = "下载商品入库excel模板") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @GetMapping("/download_inbound_model") + public void downloadInboundModel(HttpServletResponse response, Long allotOrderId) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + allotOrderService.downloadInboundModel(response, allotOrderDTO); + } + + @Operation(summary = "导入商品入库excel") + @Parameter(name = "allotOrderId", description = "调拨订单id") + @PostMapping("/import_inbound_excel") + public ServerResponseEntity importInboundExcel(Long allotOrderId, + @RequestPart("excelFile") MultipartFile excelFile) { + AllotOrderDTO allotOrderDTO = this.getAllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + return ServerResponseEntity.success(allotOrderService.parseInboundFile(excelFile, allotOrderDTO)); + } + + private AllotOrderDTO getAllotOrderDTO() { + AllotOrderDTO allotOrderDTO = new AllotOrderDTO(); + allotOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + allotOrderDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + return allotOrderDTO; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderController.java new file mode 100644 index 0000000..edf9fa2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderController.java @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.supplier; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.tmerclub.cloud.api.delivery.dto.ChangeOrderAddrDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.feign.EsOrderFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierRefundAddrFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.vo.SkuAddrVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.constant.Constant; +import com.tmerclub.cloud.order.dto.OrderAddrDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderChangeAddrDTO; +import com.tmerclub.cloud.order.listener.OrderExcelListener; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.UnDeliveryOrderExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon on 2022/07/11. + */ +@RestController("supplierOrderController") +@RequestMapping("/s/order") +public class OrderController { + + @Autowired + private OrderService orderService; + @Autowired + private OrderExcelService orderExcelService; + @Autowired + private OrderAddrService orderAddrService; + @Autowired + private DeliveryManager deliveryManager; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @Autowired + private OrderItemService orderItemService; + @DubboReference + private EsOrderFeignClient esOrderFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private OrderRefundService orderRefundService; + @DubboReference + private SupplierRefundAddrFeignClient supplierRefundAddrFeignClient; + + private static final Logger logger = LoggerFactory.getLogger(OrderController.class); + + /** + * 分页获取 + */ + @GetMapping("/page") + public ServerResponseEntity> page(OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setSupplierId(AuthUserContext.get().getTenantId()); + // 供应商只能看到采购完成且供应商发货的订单 + orderSearchDTO.setWaitPurchase(0); + orderSearchDTO.setSupplierDeliveryType(1); + orderSearchDTO.setIsPayed(1); + EsPageVO orderPage = orderService.orderPage(orderSearchDTO); + List esSupplierOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List shopIds = orderPage.getList().stream().map(EsOrderVO::getShopId).collect(Collectors.toList()); + ServerResponseEntity> serverResponse = shopDetailFeignClient.listByShopIds(shopIds); + List shopDetailList = serverResponse.getData(); + Map shopMobileMap = shopDetailList.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getContactPhone)); + // 处理下发货完成时能否修改物流 + for (EsOrderVO esOrderVO : orderPage.getList()) { + // 处理组合列表 + Map> comboMap = esOrderVO.getOrderItems().stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderItemVO::getActivityId)); + if (MapUtil.isNotEmpty(comboMap)) { + Iterator iterator = esOrderVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + EsOrderItemVO orderItem = iterator.next(); + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + } + orderItem.setComboList(comboMap.get(orderItem.getOrderItemId())); + } + } + EsSupplierOrderVO esSupplierOrderVO = BeanUtil.map(esOrderVO, EsSupplierOrderVO.class); + // 处理一下返回退款信息,是否移交供应商处理 + if (Objects.nonNull(esSupplierOrderVO.getRefundStatus())) { + Integer supplierHandlerStatus = orderRefundService.getSupplierHandleStatusByOrderId(esSupplierOrderVO.getOrderId()); + esSupplierOrderVO.setSupplierHandleStatus(supplierHandlerStatus); + } + esSupplierOrderList.add(esSupplierOrderVO); + if (!Objects.equals(esSupplierOrderVO.getSupplierId(), 0L) && shopMobileMap.containsKey(esSupplierOrderVO.getSupplierId())) { + esSupplierOrderVO.setShopMobile(shopMobileMap.get(esSupplierOrderVO.getShopId())); + } + esSupplierOrderVO.setMobile(PhoneUtil.hideBetween(esSupplierOrderVO.getMobile()).toString()); + if (!Objects.equals(esSupplierOrderVO.getStatus(), OrderStatus.CONSIGNMENT.value()) || + !Objects.equals(esSupplierOrderVO.getDeliveryType(), DeliveryType.DELIVERY.value())) { + continue; + } + int updateOrViewDeliveryInfo = 0; + for (EsOrderItemVO orderItem : esSupplierOrderVO.getOrderItems()) { + if (Objects.nonNull(orderItem.getDeliveryType()) && Objects.equals(orderItem.getDeliveryType(), DeliveryType.DELIVERY.value())) { + updateOrViewDeliveryInfo = 1; + break; + } + } + esSupplierOrderVO.setUpdateOrViewDeliveryInfo(updateOrViewDeliveryInfo); + } + EsPageVO supplierOrderPage = new EsPageVO<>(); + supplierOrderPage.setTotal(orderPage.getTotal()); + supplierOrderPage.setPages(orderPage.getPages()); + supplierOrderPage.setList(esSupplierOrderList); + return ServerResponseEntity.success(supplierOrderPage); + } + + /** + * 获取信息 + */ + @GetMapping("/order_info/{orderId}") + public ServerResponseEntity info(@PathVariable("orderId") Long orderId) { + // 订单和订单项 + Order order = orderService.getOrderAndOrderItemData(orderId, null); + + logger.info(order.toString()); + // 详情用户收货地址 + OrderAddr orderAddr = orderAddrService.getById(order.getOrderAddrId()); + order.setOrderAddr(BeanUtil.map(orderAddr, OrderAddr.class)); + OrderVO orderVO = BeanUtil.map(order, OrderVO.class); + if (Objects.nonNull(orderVO.getOrderAddr()) && StrUtil.isNotBlank(orderVO.getOrderAddr().getMobile())) { + orderVO.getOrderAddr().setMobile(PhoneUtil.hideBetween(orderVO.getOrderAddr().getMobile()).toString()); + } + // 处理下组合 + List orderItemDbList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 获取组合map + Map> comboMap = orderVO.getOrderItems().stream().filter(item -> Objects.equals(item.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + // 组合订单项不需要进行处理 + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + continue; + } + // 放入组合子商品项 + if (comboMap.containsKey(orderItem.getOrderItemId())) { + List orderItemVOList = comboMap.get(orderItem.getOrderItemId()); + orderItem.setComboItemList(orderItemVOList); + } + orderItemDbList.add(orderItem); + } + orderVO.setOrderItems(orderItemDbList); + logger.info(orderVO.toString()); + return ServerResponseEntity.success(orderVO); + } + + /** + * 获取订单用户下单地址 + */ + @GetMapping("/order_addr/{orderAddrId}") + public ServerResponseEntity getOrderAddr(@PathVariable("orderAddrId") Long orderAddrId) { + OrderAddr orderAddr = orderAddrService.getById(orderAddrId); + return ServerResponseEntity.success(BeanUtil.map(orderAddr, OrderAddrVO.class)); + } + + /** + * 订单项待发货数量查询 + */ + @GetMapping("/order_item_and_address/{orderId}") + public ServerResponseEntity getOrderItemAndAddress(@PathVariable("orderId") Long orderId) { + // 订单和订单项 + Order order = orderService.getOrderAndOrderItemData(orderId, null); + OrderVO orderVO = BeanUtil.map(order, OrderVO.class); + List orderItems = orderVO.getOrderItems(); + for (OrderItemVO orderItem : orderItems) { + orderItem.setChangeNum(orderItem.getBeDeliveredNum() == -1 ? orderItem.getCount() : orderItem.getBeDeliveredNum()); + } + // 用户收货地址 + OrderAddr orderAddr = orderAddrService.getById(order.getOrderAddrId()); + orderVO.setOrderAddr(BeanUtil.map(orderAddr, OrderAddrVO.class)); + return ServerResponseEntity.success(orderVO); + } + + /** + * 发货 + */ + @PostMapping("/delivery") + public ServerResponseEntity delivery(@Valid @RequestBody DeliveryOrderDTO deliveryOrderParam) { + Order order = orderService.getOrderAndOrderItemData(deliveryOrderParam.getOrderId(), null); + if (Objects.isNull(order)) { + return ServerResponseEntity.fail(ResponseEnum.UNAUTHORIZED); + } + // 订单不在支付状态 + if (!Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + return ServerResponseEntity.showFailMsg("订单状态异常"); + } + List selectOrderItems = deliveryOrderParam.getSelectOrderItems(); + if (CollectionUtil.isEmpty(selectOrderItems)) { + return ServerResponseEntity.showFailMsg("请至少选择一个订单项进行发货操作"); + } + Map orderItemMap = order.getOrderItems().stream().collect(Collectors.toMap(OrderItem::getOrderItemId, orderItem -> orderItem)); + for (DeliveryOrderItemDTO selectOrderItem : selectOrderItems) { + if (!orderItemMap.containsKey(selectOrderItem.getOrderItemId())) { + throw new LuckException("订单项不存在"); + } + OrderItem orderItem = orderItemMap.get(selectOrderItem.getOrderItemId()); + if (orderItem.getBeDeliveredNum() < selectOrderItem.getChangeNum()) { + throw new LuckException("订单项可发货数量不足,请刷新后重试"); + } + } + orderService.delivery(deliveryOrderParam); + esOrderFeignClient.updateOrder(deliveryOrderParam.getOrderId()); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_change_amount") + @Operation(summary = "查询修改订单地址后的运费") + public ServerResponseEntity getChangeAmount(OrderChangeAddrDTO param) { + Order dbOrder = orderService.getOrderAndOrderItemData(param.getOrderId(), null); + if (dbOrder.getStatus() > OrderStatus.PAYED.value() && !Objects.equals(dbOrder.getStatus(), OrderStatus.WAIT_GROUP.value())) { + logger.error("订单状态异常,无法更改订单地址"); + throw new LuckException("订单状态异常,无法更改订单地址"); + } + List orderItems = orderItemService.listOrderItemsByOrderId(dbOrder.getOrderId()); + List skuIds = orderItems.stream().map(OrderItem::getSupplierSkuId).collect(Collectors.toList()); + List spuIds = orderItems.stream().map(OrderItem::getSupplierSpuId).collect(Collectors.toList()); + ServerResponseEntity> responseEntity = skuFeignClient.listSpuDetailByIds(skuIds); + ServerResponseEntity> response = spuFeignClient.listSpuBySpuIds(spuIds); + if (!responseEntity.isSuccess() || !response.isSuccess()) { + logger.error("查询sku或者spu信息失败,skuIds:{}", skuIds, "spuIds:{}", spuIds); + throw new LuckException(responseEntity.getMsg()); + } + List skuList = responseEntity.getData(); + List spuList = response.getData(); + Map skuMap = skuList.stream().collect(Collectors.toMap(SkuAddrVO::getSkuId, s -> s)); + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, s -> s)); + List shopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItem orderItem : orderItems) { + SkuAddrVO sku = skuMap.get(orderItem.getSupplierSkuId()); + SpuVO spuVO = spuMap.get(orderItem.getSupplierSpuId()); + ShopCartItemVO shopCartItem = new ShopCartItemVO(); + shopCartItem.setSkuId(orderItem.getSkuId()); + shopCartItem.setCount(orderItem.getCount()); + shopCartItem.setTotalAmount(orderItem.getSpuTotalAmount()); + shopCartItem.setShopId(orderItem.getShopId()); + shopCartItem.setVolume(sku.getVolume()); + shopCartItem.setWeight(sku.getWeight()); + shopCartItem.setDeliveryTemplateId(spuVO.getDeliveryTemplateId()); + shopCartItem.setDeliveryAmount(spuVO.getDeliveryAmount()); + shopCartItems.add(shopCartItem); + } + UserAddrVO userAddrVO = new UserAddrVO(); + userAddrVO.setAreaId(param.getAreaId()); + if (Objects.equals(dbOrder.getDeliveryType(), DeliveryType.SAME_CITY.value())) { + logger.info("同城配送,用户经纬度:lng:{},lat:{}", param.getLng(), param.getLat()); + userAddrVO.setLng(param.getLng()); + userAddrVO.setLat(param.getLat()); + } + ChangeOrderAddrDTO changeOrderAddrDTO = new ChangeOrderAddrDTO(shopCartItems, dbOrder.getFreightAmount(), userAddrVO, dbOrder.getDeliveryType()); + return ServerResponseEntity.success(deliveryManager.getOrderChangeAddrAmount(changeOrderAddrDTO)); + } + + /** + * 修改用户订单地址 + * + * @return 是否修改成功 + */ + @PutMapping("/change_user_addr") + public ServerResponseEntity changeUserAddr(@RequestBody @Valid OrderAddrDTO orderAddrDTO) { + Order orderDb = orderService.getByOrderId(orderAddrDTO.getOrderId()); + if (orderDb.getStatus() <= OrderStatus.PAYED.value() || Objects.equals(orderDb.getStatus(), OrderStatus.WAIT_GROUP.value())) { + logger.info("订单状态正常,可以更改订单地址"); + OrderAddr orderAddr = BeanUtil.map(orderAddrDTO, OrderAddr.class); + orderAddrService.update(orderAddr); + } else { + throw new LuckException("订单状态异常,无法更改订单地址"); + } + return ServerResponseEntity.success(); + } + + /** + * 修改订单备注 + * + * @param order + * @return 是否修改成功 + */ + @PutMapping("/change_order_remark") + public ServerResponseEntity changeOrderRemark(@RequestBody @Valid Order order) { + Order orderDb = orderService.getByOrderId(order.getOrderId()); + orderDb.setShopRemarks(order.getShopRemarks()); + orderService.update(orderDb); + return ServerResponseEntity.success(); + } + + @GetMapping("/un_delivery_sold_excel") + @Operation(summary = "导出待发货的订单excel") + public ServerResponseEntity unDeliveryOrderSoldExcel(HttpServletResponse response, OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setSupplierId(AuthUserContext.get().getTenantId()); + orderSearchDTO.setStatus(OrderStatus.PAYED.value()); + orderSearchDTO.setSupplierDeliveryType(SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + orderExcelService.excelUnDeliveryOrderList(response, orderSearchDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/export_order_excel") + @Operation(summary = "导入订单") + public ServerResponseEntity exportOrderExcel(@RequestParam("excelFile") MultipartFile file) { + if (Objects.isNull(file)) { + throw new LuckException("网络繁忙,请稍后重试"); + } + String info; + try { + Map> errorMap = new HashMap<>(8); + EasyExcel.read(file.getInputStream(), UnDeliveryOrderExcelVO.class, new OrderExcelListener(orderExcelService, errorMap)).sheet().doRead(); + info = orderExcelService.orderExportError(errorMap); + } catch (IOException e) { + logger.error("导入订单失败,失败原因:{}", e.getMessage()); + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(info); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderStatisticsController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderStatisticsController.java new file mode 100644 index 0000000..ff28782 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/controller/supplier/OrderStatisticsController.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.controller.supplier; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.order.service.SupplierOrderStatisticsService; +import com.tmerclub.cloud.order.vo.HotProductVO; +import com.tmerclub.cloud.order.vo.SupplierOrderOverviewVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.List; + +/** + * @author lth + */ +@RestController("supplierOrderStatisticsController") +@RequestMapping("/s/order_statistics") +@Tag(name = "supplier-供应商订单数据统计接口") +public class OrderStatisticsController { + + @Autowired + private SupplierOrderStatisticsService supplierOrderStatisticsService; + + @GetMapping("/order_count") + @Operation(summary = "查询店铺各种状态下的订单数量", description = "根据订单状态统计订单数量") + public ServerResponseEntity getOrderCount() { + OrderCountVO orderCountVO = supplierOrderStatisticsService.getOrderCountOfStatusBySupplierId(AuthUserContext.get().getTenantId()); + return ServerResponseEntity.success(orderCountVO); + } + + @GetMapping("/get_today_info_by_hour") + @Operation(summary = "获取当天订单实时统计数据", description = "获取当天订单实时统计数据") + public ServerResponseEntity getTodayInfoByHour() { + SupplierOrderOverviewVO supplierOrderOverviewVO = supplierOrderStatisticsService.getTodayInfoByHour(AuthUserContext.get().getTenantId(), + DateUtil.beginOfDay(DateUtil.date()), DateUtil.endOfDay(DateUtil.date())); + return ServerResponseEntity.success(supplierOrderOverviewVO); + } + + @GetMapping("/list_prod_ranking_by_payActual") + @Operation(summary = "根据支付金额获取近30天的商品销售数据排行榜", description = "获取近30天的商品销售数据排行榜") + @Parameters({ + @Parameter(name = "dayCount", description = "天数(几天内的排行榜)"), + @Parameter(name = "limit", description = "排行榜条数") + }) + public ServerResponseEntity> listProdRankingByPayActual(@RequestParam(value = "dayCount", defaultValue = "30") Integer dayCount, + @RequestParam(value = "limit", defaultValue = "5") Integer limit) { + List orderOverviewVOList = supplierOrderStatisticsService.listProdRankingByPayActual(AuthUserContext.get().getTenantId(), dayCount, limit); + return ServerResponseEntity.success(orderOverviewVOList); + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/AllotOrderDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/AllotOrderDTO.java new file mode 100644 index 0000000..62d993a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/AllotOrderDTO.java @@ -0,0 +1,223 @@ +package com.tmerclub.cloud.order.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * 调拨订单dto + * @author gaozijie + * @date 2023-11-20 + */ +public class AllotOrderDTO { + + @Schema(description = "调拨订单id") + private Long allotOrderId; + + @Schema(description = "调出点仓库id") + private Long outWarehouseId; + + @Schema(description = "调入点仓库id") + private Long inWarehouseId; + + @Schema(description = "物流公司id") + private Long dvyCompanyId; + + @Schema(description = "物流方式(1:快递, 3:无需快递)") + private Integer dvyType; + + @Schema(description = "物流单号") + private String dvyOrderNumber; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "调拨订单商品集合") + private List allotOrderItemDTOList; + + @Hidden + @Schema(description = "店铺id") + private Long shopId; + + @Hidden + @Schema(description = "系统类型(1:商家, 3:供应商)") + private Integer sysType; + + @Hidden + @Schema(description = "调出点库存点类型") + private Integer outStockPointType; + + @Hidden + @Schema(description = "调入掉库存点类型") + private Integer inStockPointType; + + @Hidden + @Schema(description = "调拨状态") + private Integer status; + + @Hidden + @Schema(description = "用户Id") + private Long userId; + + @Hidden + @Schema(description = "仓库id") + private Long warehouseId; + + @Hidden + @Schema(description = "状态集合") + private List statuses; + + public AllotOrderDTO() { + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getOutWarehouseId() { + return outWarehouseId; + } + + public void setOutWarehouseId(Long outWarehouseId) { + this.outWarehouseId = outWarehouseId; + } + + public Long getInWarehouseId() { + return inWarehouseId; + } + + public void setInWarehouseId(Long inWarehouseId) { + this.inWarehouseId = inWarehouseId; + } + + public Long getDvyCompanyId() { + return dvyCompanyId; + } + + public void setDvyCompanyId(Long dvyCompanyId) { + this.dvyCompanyId = dvyCompanyId; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public String getDvyOrderNumber() { + return dvyOrderNumber; + } + + public void setDvyOrderNumber(String dvyOrderNumber) { + this.dvyOrderNumber = dvyOrderNumber; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public List getAllotOrderItemDTOList() { + return allotOrderItemDTOList; + } + + public void setAllotOrderItemDTOList(List allotOrderItemDTOList) { + this.allotOrderItemDTOList = allotOrderItemDTOList; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getOutStockPointType() { + return outStockPointType; + } + + public void setOutStockPointType(Integer outStockPointType) { + this.outStockPointType = outStockPointType; + } + + public Integer getInStockPointType() { + return inStockPointType; + } + + public void setInStockPointType(Integer inStockPointType) { + this.inStockPointType = inStockPointType; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public List getStatuses() { + return statuses; + } + + public void setStatuses(List statuses) { + this.statuses = statuses; + } + + @Override + public String toString() { + return "AllotOrderDTO{" + + "allotOrderId=" + allotOrderId + + ", outWarehouseId=" + outWarehouseId + + ", inWarehouseId=" + inWarehouseId + + ", dvyCompanyId=" + dvyCompanyId + + ", dvyType=" + dvyType + + ", dvyOrderNumber='" + dvyOrderNumber + '\'' + + ", remark='" + remark + '\'' + + ", allotOrderItemDTOList=" + allotOrderItemDTOList + + ", shopId=" + shopId + + ", sysType=" + sysType + + ", outStockPointType=" + outStockPointType + + ", inStockPointType=" + inStockPointType + + ", status=" + status + + ", userId=" + userId + + ", warehouseId=" + warehouseId + + ", statuses=" + statuses + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderAddrDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderAddrDTO.java new file mode 100644 index 0000000..2708608 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderAddrDTO.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto; + +import jakarta.validation.constraints.NotBlank; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderAddrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ID + */ + private Long orderAddrId; + + /** + * ID + */ + private Long orderId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 收货人 + */ + @NotBlank(message = "收货人名称不能为空") + @Length(max = 50, message = "收货人名称字符长度不能超过50") + private String consignee; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区域ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 地址 + */ + @NotBlank(message = "地址不能为空") + @Length(max = 255, message = "地址长度不能超过255") + private String addr; + + /** + * 邮编 + */ + private String postCode; + + /** + * 手机 + */ + @NotBlank(message = "收货人手机不能为空") + @Length(max = 11, message = "收货人手机长度不能超过11") + private String mobile; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "OrderAddrDTO{" + + "orderAddrId=" + orderAddrId + + ", orderId=" + orderId + + ", userId=" + userId + + ", consignee='" + consignee + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", addr='" + addr + '\'' + + ", postCode='" + postCode + '\'' + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderStationWriteOffDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderStationWriteOffDTO.java new file mode 100644 index 0000000..93dc667 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/OrderStationWriteOffDTO.java @@ -0,0 +1,56 @@ +package com.tmerclub.cloud.order.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +/** + * @author lanhai + */ +@Schema(description = "app-自提核销参数") +public class OrderStationWriteOffDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单号列表") + private List orderIds; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "自提点id") + private Long stationId; + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + @Override + public String toString() { + return "OrderStationDTO{" + + "orderIds=" + orderIds + + ", userId=" + userId + + ", stationId=" + stationId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderDTO.java new file mode 100644 index 0000000..69638c8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderDTO.java @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 采购订单DTO + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class PurchaseOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "采购id") + private Long purchaseOrderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "总采购金额") + private Double totalAmount; + + @Schema(description = "总采购库存数量") + private Integer totalStock; + + @Schema(description = "实际总库存数量") + private Integer actualTotalStock; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 4.待付款 5:已完成") + private Integer status; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer supplierStatus; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "采购商品列表") + @NotEmpty(message = "采购商品列表不能为空") + private List purchaseOrderItemList; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "商家名称") + private String shopName; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "收货人") + private String consignee; + + @Schema(description = "手机号") + private String mobile; + + @Schema(description = "地址ID,0为默认地址") + @NotNull(message = "地址不能为空") + private Long addrId; + + /** + * 开始时间 + */ + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + /** + * 结束时间 + */ + @Schema(description = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + @Schema(description = "商品编码") + private String spuCodes; + + @Schema(description = "sku编码") + private String partyCodes; + + @Schema(description = "付款凭证图片") + private String voucherImgUrls; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "供应商仓库id") + private Long supplierWarehouseId; + + @Hidden + @Schema(description = "系统类型") + private Integer sysType; + + @Hidden + @Schema(description = "库存点类型(1:仓库, 2:门店)") + private Integer stockPointType; + + @Hidden + @Schema(description = "不包含的状态集合") + private List notInStatuses; + + public Integer getSupplierStatus() { + return supplierStatus; + } + + public void setSupplierStatus(Integer supplierStatus) { + this.supplierStatus = supplierStatus; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getSpuCodes() { + return spuCodes; + } + + public void setSpuCodes(String spuCodes) { + this.spuCodes = spuCodes; + } + + public String getPartyCodes() { + return partyCodes; + } + + public void setPartyCodes(String partyCodes) { + this.partyCodes = partyCodes; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getAddrId() { + return addrId; + } + + public void setAddrId(Long addrId) { + this.addrId = addrId; + } + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Double getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Double totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getActualTotalStock() { + return actualTotalStock; + } + + public void setActualTotalStock(Integer actualTotalStock) { + this.actualTotalStock = actualTotalStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public List getPurchaseOrderItemList() { + return purchaseOrderItemList; + } + + public void setPurchaseOrderItemList(List purchaseOrderItemList) { + this.purchaseOrderItemList = purchaseOrderItemList; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getVoucherImgUrls() { + return voucherImgUrls; + } + + public void setVoucherImgUrls(String voucherImgUrls) { + this.voucherImgUrls = voucherImgUrls; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getSupplierWarehouseId() { + return supplierWarehouseId; + } + + public void setSupplierWarehouseId(Long supplierWarehouseId) { + this.supplierWarehouseId = supplierWarehouseId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public List getNotInStatuses() { + return notInStatuses; + } + + public void setNotInStatuses(List notInStatuses) { + this.notInStatuses = notInStatuses; + } + + @Override + public String toString() { + return "PurchaseOrderDTO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", supplierId=" + supplierId + + ", totalAmount=" + totalAmount + + ", totalStock=" + totalStock + + ", actualTotalStock=" + actualTotalStock + + ", status=" + status + + ", supplierStatus=" + supplierStatus + + ", employeeId=" + employeeId + + ", remark='" + remark + '\'' + + ", purchaseOrderItemList=" + purchaseOrderItemList + + ", supplierName='" + supplierName + '\'' + + ", shopName='" + shopName + '\'' + + ", spuName='" + spuName + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", addrId=" + addrId + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", spuCodes='" + spuCodes + '\'' + + ", partyCodes='" + partyCodes + '\'' + + ", voucherImgUrls='" + voucherImgUrls + '\'' + + ", warehouseId=" + warehouseId + + ", supplierWarehouseId=" + supplierWarehouseId + + ", sysType=" + sysType + + ", stockPointType=" + stockPointType + + ", notInStatuses=" + notInStatuses + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderItemDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderItemDTO.java new file mode 100644 index 0000000..88312b3 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderItemDTO.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 采购商品DTO + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class PurchaseOrderItemDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long purchaseItemId; + + @Schema(description = "供应商品id") + private Long supplierSpuId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "sku id") + private Long skuId; + + @Schema(description = "供应商Id") + @NotNull(message = "供应商Id不能为空") + private Long supplierId; + + @Schema(description = "采购金额") + private Long purchaseAmount; + + @Schema(description = "采购价") + private Long purchasePrice; + + @Schema(description = "采购库存数量") + private Integer purchaseStock; + + @Schema(description = "实际库存数量") + private Integer actualStock; + + @Schema(description = "状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成") + private Integer status; + + @Schema(description = "供应商skuId") + private Long supplierSkuId; + + @Hidden + @Schema(description = "入库数量") + private Integer inboundStock; + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getPurchaseAmount() { + return purchaseAmount; + } + + public void setPurchaseAmount(Long purchaseAmount) { + this.purchaseAmount = purchaseAmount; + } + + public Long getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(Long purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Integer getInboundStock() { + return inboundStock; + } + + public void setInboundStock(Integer inboundStock) { + this.inboundStock = inboundStock; + } + + @Override + public String toString() { + return "PurchaseOrderItemDTO{" + + "purchaseItemId=" + purchaseItemId + + ", supplierSpuId=" + supplierSpuId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", supplierId=" + supplierId + + ", purchaseAmount=" + purchaseAmount + + ", purchasePrice=" + purchasePrice + + ", purchaseStock=" + purchaseStock + + ", actualStock=" + actualStock + + ", status=" + status + + ", supplierSkuId=" + supplierSkuId + + ", inboundStock=" + inboundStock + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderLangDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderLangDTO.java new file mode 100644 index 0000000..e65b06f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/PurchaseOrderLangDTO.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 采购订单-国际化DTO + * + * @author lhd + * @date 2022-07-12 13:57:20 + */ +public class PurchaseOrderLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long purchaseOrderId; + + private Integer lang; + + private String prodName; + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + @Override + public String toString() { + return "PurchaseOrderLangDTO{" + + "purchaseOrderId=" + purchaseOrderId + + ",lang=" + lang + + ",prodName=" + prodName + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundDTO.java new file mode 100644 index 0000000..d45a8bb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/app/OrderRefundDTO.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.app; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 申请退款参数 + * + * @author FrozenWatermelon + */ +@Schema(description = "app-申请退款参数") +public class OrderRefundDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "订单号不能为空") + private Long orderId; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "退款单类型不能为空") + private Integer refundType; + + @Schema(description = "订单项ID(0:为全部订单项)", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderItemId; + + @Schema(description = "退货数量(0:为全部订单项)", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer refundCount; + + @Schema(description = "申请类型:1,仅退款,2退款退货", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "申请类型不能为空") + private Integer applyType; + + @Schema(description = "是否接收到商品(1:已收到,0:未收到)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否接收到商品不能为空") + private Integer isReceived; + + @Schema(description = "申请原因(下拉选择)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "申请原因不能为空") + private Integer buyerReason; + + @Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "退款金额不能为空") + private Long refundAmount; + + @Schema(description = "手机号码(默认当前订单手机号码)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "手机号码不能为空") + private String buyerMobile; + + @Schema(description = "申请说明", requiredMode = Schema.RequiredMode.REQUIRED) + private String buyerDesc; + + @Schema(description = "文件凭证(逗号隔开)", requiredMode = Schema.RequiredMode.REQUIRED) + private String imgUrls; + + + @Schema(description = "选中的赠品orderItemId列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List giveawayItemIds; + + @Schema(description = "退款退回的赠品订单项ids") + private String returnGiveawayIds; + + @Schema(description = "当前退款的实付金额(实付金额减去不退回赠品的金额)") + private Long refundActualTotal; + + @Hidden + @Schema(description = "赠品退款数量") + private Integer giveawayRefundCount; + @Schema(description = "退款id") + private Long refundId; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public List getGiveawayItemIds() { + return giveawayItemIds; + } + + public void setGiveawayItemIds(List giveawayItemIds) { + this.giveawayItemIds = giveawayItemIds; + } + + public String getReturnGiveawayIds() { + return returnGiveawayIds; + } + + public void setReturnGiveawayIds(String returnGiveawayIds) { + this.returnGiveawayIds = returnGiveawayIds; + } + + public Long getRefundActualTotal() { + return refundActualTotal; + } + + public void setRefundActualTotal(Long refundActualTotal) { + this.refundActualTotal = refundActualTotal; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getReceived() { + return isReceived; + } + + public void setReceived(Integer received) { + isReceived = received; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Integer getGiveawayRefundCount() { + return giveawayRefundCount; + } + + public void setGiveawayRefundCount(Integer giveawayRefundCount) { + this.giveawayRefundCount = giveawayRefundCount; + } + + @Override + public String toString() { + return "OrderRefundDTO{" + + "orderId=" + orderId + + ", refundType=" + refundType + + ", orderItemId=" + orderItemId + + ", refundCount=" + refundCount + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", buyerReason=" + buyerReason + + ", refundAmount=" + refundAmount + + ", buyerMobile='" + buyerMobile + '\'' + + ", buyerDesc='" + buyerDesc + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", giveawayItemIds=" + giveawayItemIds + + ", returnGiveawayIds='" + returnGiveawayIds + '\'' + + ", refundActualTotal=" + refundActualTotal + + ", giveawayRefundCount=" + giveawayRefundCount + + ", refundId=" + refundId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderAdminDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderAdminDTO.java new file mode 100644 index 0000000..0be8894 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderAdminDTO.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.multishop; + +import com.tmerclub.cloud.order.dto.OrderAddrDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 订单参数 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderAdminDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "运费金额") + private Long freightAmount; + + @Schema(description = "订单项") + private List orderItems; + + @Schema(description = "用户收货地址") + private OrderAddrDTO orderAddrDTO; + + @Schema(description = "支付完成回跳地址", requiredMode = Schema.RequiredMode.REQUIRED) + private String returnUrl; + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + public List getOrderItems() { + return orderItems; + } + + public void setOrderItems(List orderItems) { + this.orderItems = orderItems; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public OrderAddrDTO getOrderAddrDTO() { + return orderAddrDTO; + } + + public void setOrderAddrDTO(OrderAddrDTO orderAddrDTO) { + this.orderAddrDTO = orderAddrDTO; + } + + @Override + public String toString() { + return "OrderAdminDTO{" + + "orderId=" + orderId + + ", shopId=" + shopId + + ", freightAmount=" + freightAmount + + ", orderItems=" + orderItems + + ", orderAddrDTO=" + orderAddrDTO + + ", returnUrl='" + returnUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderChangeAddrDTO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderChangeAddrDTO.java new file mode 100644 index 0000000..e44600c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/OrderChangeAddrDTO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.multishop; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单修改地址获取金额传参 + * + * @author Citrus + * @date 2021/11/26 13:08 + */ +public class OrderChangeAddrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "区域ID") + private Long areaId; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "OrderChangeAddrDTO{" + + "orderId=" + orderId + + ", areaId=" + areaId + + ", lng=" + lng + + ", lat=" + lat + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/RefundSnDto.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/RefundSnDto.java new file mode 100644 index 0000000..97dddb8 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/dto/multishop/RefundSnDto.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.dto.multishop; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class RefundSnDto implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull(message = "退款编号不能为空") + @Schema(description = "退款编号") + private Long refundId; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderCommFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderCommFeignController.java new file mode 100644 index 0000000..754703e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderCommFeignController.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.feign.EsOrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderCommFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.service.OrderItemLangService; +import com.tmerclub.cloud.order.service.OrderItemService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/25 + */ +@DubboService +public class OrderCommFeignController implements OrderCommFeignClient { + + + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderItemLangService orderItemLangService; + @DubboReference + private EsOrderFeignClient esOrderFeignClient; + + + @Override + public ServerResponseEntity getSpuIdByOrderItemId(Long orderItemId) { + OrderItemVO orderItem = orderItemService.getByOrderItemId(orderItemId); + if (Objects.isNull(orderItem)) { + return ServerResponseEntity.showFailMsg("订单项不存在"); + } + if (Objects.equals(orderItem.getIsComm(), Constant.IS_COMM)) { + return ServerResponseEntity.showFailMsg("[" + orderItem.getSpuName() + "]" + "该订单项已评论,请勿重复评论"); + } + return ServerResponseEntity.success(orderItem.getSpuId()); + } + + @Override + public void updateOrderItemComm(OrderItemVO orderItemVO) { + //更新订单项 + OrderItem orderItem = this.buildOrderItem(orderItemVO); + orderItemService.update(orderItem); + esOrderFeignClient.updateOrder(orderItemVO.getOrderId()); + } + + @Override + public void updateOrderItemComms(List orderItemVOList) { + if (CollectionUtils.isEmpty(orderItemVOList)) { + return; + } + // 更新订单商品 + Set orderIds = orderItemVOList.stream().map(x -> { + OrderItem orderItem = this.buildOrderItem(x); + orderItemService.update(orderItem); + return x.getOrderId(); + }).collect(Collectors.toSet()); + // es更新订单 + if (CollectionUtils.isEmpty(orderIds)) { + return; + } + orderIds.forEach(x -> esOrderFeignClient.updateOrder(x)); + } + + private OrderItem buildOrderItem(OrderItemVO orderItemVO) { + OrderItem orderItem = new OrderItem(); + orderItem.setOrderItemId(orderItemVO.getOrderItemId()); + orderItem.setIsComm(Constant.IS_COMM); + orderItem.setCommTime(orderItemVO.getCommTime()); + orderItem.setUpdateTime(orderItemVO.getUpdateTime()); + return orderItem; + } + + @Override + public ServerResponseEntity getOrderItemByOrderItemId(Long orderItemId) { + return ServerResponseEntity.success(orderItemService.getSpuInfoByOrderItemId(orderItemId)); + } + + @Override + public ServerResponseEntity getByOrderItemId(Long orderItemId) { + return ServerResponseEntity.success(orderItemService.getByOrderItemId(orderItemId)); + } + + @Override + public ServerResponseEntity> listOrderItemLangByIds(List orderItemIds) { + List res = orderItemLangService.listOrderItemLangByIds(orderItemIds); + return ServerResponseEntity.success(res); + } + + @Override + public ServerResponseEntity> getListByOrderItemId(List orderItemIds, Integer lang) { + List list = orderItemLangService.getListByOrderItemId(orderItemIds, lang); + return ServerResponseEntity.success(list); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderRefundFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderRefundFeignController.java new file mode 100644 index 0000000..209c38d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderRefundFeignController.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/25 + */ +@DubboService +public class OrderRefundFeignController implements OrderRefundFeignClient { + + + @Autowired + private OrderRefundService orderRefundService; + + @Override + public ServerResponseEntity getRefundStatus(Long refundId) { + + return ServerResponseEntity.success(orderRefundService.getRefundStatus(refundId)); + } + + @Override + public ServerResponseEntity> getProdRefundEffectByDateAndProdIds(List spuIds, Long startTime, Long endTime) { + return ServerResponseEntity.success(orderRefundService.getProdRefundEffectByDateAndProdIds(spuIds, new Date(startTime), new Date(endTime))); + } + + @Override + public ServerResponseEntity> getOrderRefundByOrderIdAndRefundStatus(Long orderId, Integer returnMoneySts) { + return ServerResponseEntity.success(orderRefundService.getOrderRefundByOrderIdAndRefundStatus(orderId, returnMoneySts)); + } + + @Override + public ServerResponseEntity> listOrderIdsByRefundIds(List refundIds) { + return ServerResponseEntity.success(orderRefundService.listOrderIdsByRefundIds(refundIds)); + } + + @Override + public ServerResponseEntity> listOrderRefundByOrderIds(List orderIds) { + return ServerResponseEntity.success(orderRefundService.listOrderRefundByOrderIds(orderIds)); + } + + @Override + public ServerResponseEntity getOrderRefundByRefundId(Long refundId) { + return ServerResponseEntity.success(orderRefundService.getOrderRefundByRefundId(refundId)); + } + + @Override + public ServerResponseEntity saveMongoAndGetEsOrderRefundInfo(Long refundId) { + return ServerResponseEntity.success(orderRefundService.saveMongoAndGetEsOrderRefundInfo(refundId)); + } + + @Override + public ServerResponseEntity getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId) { + AccountOrderDetailVO accountOrderDetail = orderRefundService.getAccountOrderDetail(startTime, endTime, shopName, shopId); + return ServerResponseEntity.success(accountOrderDetail); + } + + @Override + public ServerResponseEntity listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum) { + PageShopAccountOrderVO accountDetail = orderRefundService.listShopAccountDetail(startTime, endTime, shopName, pageSize, pageNum); + return ServerResponseEntity.success(accountDetail); + } + + @Override + public ServerResponseEntity listOrderRefundInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum) { + PageShopAccountOrderVO orderRefundInfo = orderRefundService.listOrderRefundInfo(startTime, endTime, shopId, shopName, pageSize, pageNum); + return ServerResponseEntity.success(orderRefundInfo); + } + + @Override + public void doRefund(String extendInfo) { + OrderRefundDTO orderRefundDTO = Json.parseObject(extendInfo, OrderRefundDTO.class); + // 获取退款单信息 + OrderRefundVO orderRefundVO = orderRefundService.getDetailByRefundId(orderRefundDTO.getRefundId()); + orderRefundService.agreeRefund(orderRefundDTO, orderRefundVO); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderSelfStationFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderSelfStationFeignController.java new file mode 100644 index 0000000..3ef2fa1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderSelfStationFeignController.java @@ -0,0 +1,33 @@ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.order.feign.OrderSelfStationFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.service.OrderSelfStationService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +/** + * @author lanhai + */ +@DubboService +public class OrderSelfStationFeignController implements OrderSelfStationFeignClient { + + @Autowired + private OrderSelfStationService orderSelfStationService; + + @Override + public ServerResponseEntity getOrderByStationCode(Long stationId, String code) throws LuckException { + return ServerResponseEntity.success(orderSelfStationService.getOrderByStationCode(stationId, code)); + } + + @Override + public ServerResponseEntity> getUserStation(Long userId) { + return ServerResponseEntity.success(orderSelfStationService.getUserStation(userId)); + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderSettlementFeignController.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderSettlementFeignController.java new file mode 100644 index 0000000..916f10d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/feign/OrderSettlementFeignController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.feign; + +import com.tmerclub.cloud.api.order.feign.OrderSettlementFeignClient; +import com.tmerclub.cloud.api.order.vo.OrderSettlementPayVO; +import com.tmerclub.cloud.api.order.vo.OrderSettlementSimpleVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.order.model.OrderSettlement; +import com.tmerclub.cloud.order.service.OrderSettlementService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @Author lth + * @Date 2021/7/14 13:33 + */ +@DubboService +public class OrderSettlementFeignController implements OrderSettlementFeignClient { + + @Autowired + private OrderSettlementService orderSettlementService; + + + @Override + public ServerResponseEntity> listOrderIdsByPayIds(Long userId, List payIds) { + return ServerResponseEntity.success(orderSettlementService.listOrderIdsByPayIds(userId, payIds)); + } + + @Override + public ServerResponseEntity getPayIdByOrderId(Long orderId) { + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(orderId); + return ServerResponseEntity.success(BeanUtil.map(orderSettlement, OrderSettlementPayVO.class)); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/AllotSpuExcelListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/AllotSpuExcelListener.java new file mode 100644 index 0000000..e9ca195 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/AllotSpuExcelListener.java @@ -0,0 +1,78 @@ +package com.tmerclub.cloud.order.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.util.ConverterUtils; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.order.vo.AllotSpuExcelVO; +import org.springframework.util.ObjectUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author gaozijie + * @since 2023-11-29 + */ +public class AllotSpuExcelListener extends AnalysisEventListener { + + private final List list; + private final List partyCodes; + + public AllotSpuExcelListener(List list) { + this.list = list; + partyCodes = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + @Override + public void invoke(AllotSpuExcelVO allotSpuExcelVO, AnalysisContext analysisContext) { + if (ObjectUtils.isEmpty(allotSpuExcelVO.getPartyCode()) + || partyCodes.contains(allotSpuExcelVO.getPartyCode())) { + return; + } + if (Objects.isNull(allotSpuExcelVO.getAllotCount())) { + allotSpuExcelVO.setAllotCount(0); + } + partyCodes.add(allotSpuExcelVO.getPartyCode()); + list.add(allotSpuExcelVO); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } + + /** + * 获取excel表头数据 + * + * @param headMap 表头数据 + * @param context 上下文 + */ + @Override + public void invokeHead(Map> headMap, AnalysisContext context) { + Map strHeadMap = ConverterUtils.convertToStringMap(headMap, context); + int row = context.readRowHolder().getRowIndex(); + // 合并表头检验 + if (Objects.equals(row, 0)) { + if (!Objects.equals(strHeadMap.get(0), AllotSpuExcelVO.HEADER)) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + return; + } + // 表头检验 + if (Objects.equals(row, 1)) { + if (!Objects.equals(strHeadMap.size(), AllotSpuExcelVO.HEADER_ARRAY.length)) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + for (Map.Entry entry : strHeadMap.entrySet()) { + if (!Objects.equals(entry.getValue(), AllotSpuExcelVO.HEADER_ARRAY[entry.getKey()])) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/AllotSpuInboundExcelListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/AllotSpuInboundExcelListener.java new file mode 100644 index 0000000..fea203c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/AllotSpuInboundExcelListener.java @@ -0,0 +1,77 @@ +package com.tmerclub.cloud.order.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.util.ConverterUtils; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.order.vo.AllotSpuInboundExcelVO; +import org.springframework.util.ObjectUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author gaozijie + * @since 2023-12-01 + */ +public class AllotSpuInboundExcelListener extends AnalysisEventListener { + + List list; + List partyCodes; + + public AllotSpuInboundExcelListener(List data) { + this.list = data; + this.partyCodes = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + @Override + public void invoke(AllotSpuInboundExcelVO allotSpuInboundExcelVO, AnalysisContext analysisContext) { + if (ObjectUtils.isEmpty(allotSpuInboundExcelVO.getPartyCode()) + || partyCodes.contains(allotSpuInboundExcelVO.getPartyCode())) { + return; + } + if (Objects.isNull(allotSpuInboundExcelVO.getInboundCount())) { + allotSpuInboundExcelVO.setInboundCount(0); + } + partyCodes.add(allotSpuInboundExcelVO.getPartyCode()); + list.add(allotSpuInboundExcelVO); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } + + /** + * 获取excel表头数据 + * @param headMap 表头数据 + * @param context 上下文 + */ + @Override + public void invokeHead(Map> headMap, AnalysisContext context) { + Map strHeadMap = ConverterUtils.convertToStringMap(headMap, context); + int row = context.readRowHolder().getRowIndex(); + // 合并表头检验 + if (Objects.equals(row, 0)) { + if (!Objects.equals(strHeadMap.get(0), AllotSpuInboundExcelVO.HEADER)) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + return; + } + // 表头检验 + if (Objects.equals(row, 1)) { + if (!Objects.equals(strHeadMap.size(), AllotSpuInboundExcelVO.HEADER_ARRAY.length)) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + for (Map.Entry entry : strHeadMap.entrySet()) { + if (!Objects.equals(entry.getValue(), AllotSpuInboundExcelVO.HEADER_ARRAY[entry.getKey()])) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/DistributionNotifyOrderConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/DistributionNotifyOrderConsumer.java new file mode 100644 index 0000000..7625b30 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/DistributionNotifyOrderConsumer.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.distribution.bo.DistributionNotifyOrderAndShopBO; +import com.tmerclub.cloud.common.order.bo.EsOrderItemBO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.service.OrderItemService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 分销修改订单项分销金额 + * + * @author cl + * @date 2021-08-20 09:10:00 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.DISTRIBUTION_NOTIFY_ORDER_SHOP_TOPIC, consumerGroup = RocketMqConstant.DISTRIBUTION_NOTIFY_ORDER_GROUP) +public class DistributionNotifyOrderConsumer implements RocketMQListener { + + private static final Logger logger = LoggerFactory.getLogger(DistributionNotifyOrderConsumer.class); + + @Autowired + private OrderItemService orderItemService; + + @Override + public void onMessage(DistributionNotifyOrderAndShopBO message) { + List orderItemList = message.getDistributionOrderItems(); + if (CollUtil.isEmpty(orderItemList)) { + return; + } + List esOrderItemList = BeanUtil.mapAsList(orderItemList, EsOrderItemBO.class); + logger.info("分销金额计算完成后,分销修改订单项分销金额回调开始... message: {}", Json.toJsonString(esOrderItemList)); + orderItemService.updateBatchDistributionAmount(esOrderItemList); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderNotifyConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderNotifyConsumer.java new file mode 100644 index 0000000..9aa6268 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderNotifyConsumer.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_NOTIFY_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_TOPIC) +public class OrderNotifyConsumer implements RocketMQListener { + + @Autowired + private OrderService orderService; + @Autowired + private RocketMQTemplate orderNotifyServiceTemplate; + @Autowired + private RocketMQTemplate allinPayBalanceOrderSuccessTemplate; + @Autowired + private RocketMQTemplate sendNotifyToShopTemplate; + @Autowired + private RocketMQTemplate comboOrderMqTemplate; + @Autowired + private RocketMQTemplate sendNotifyToUserTemplate; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private SeckillFeignClient seckillFeignClient; + + private static final Logger LOG = LoggerFactory.getLogger(OrderNotifyConsumer.class); + + @Override + public void onMessage(PayNotifyBO message) { + LOG.info("订单回调开始... message: {}", Json.toJsonString(message)); + if (CollUtil.isEmpty(message.getOrderIds())) { + throw new LuckException("订单回调失败,订单id为空, message: " + Json.toJsonString(message)); + } + + // 如果是秒杀订单,首先改变掉redis中的订单状态,因为这里在这里会执行很多遍,先直接改变状态就好 + // 如果不为空改变redis的订单状态 + if(Objects.nonNull(message.getShopCartOrderMergerVO())) { + LOG.info("订单回调开始,改变秒杀订单缓存中的状态 message: {}", Json.toJsonString(message)); + seckillFeignClient.updateRedisSeckillOrderStatus(message.getOrderIds().get(0),message.getShopCartOrderMergerVO().getUserId(),OrderStatus.PAYED.value()); + } + + List ordersStatus = orderService.getOrdersStatus(message.getOrderIds()); + ordersStatus = orderService.updateByToPaySuccess(message, ordersStatus,message.getOrderIds()); + + SendStatus comboSendStatus = comboOrderMqTemplate.syncSend(RocketMqConstant.COMBO_ORDER_TOPIC, new GenericMessage<>(message.getOrderIds()), RocketMqConstant.TIMEOUT, RocketMqConstant.COMBO_ORDER_DELAY_LEVEL).getSendStatus(); + if (!Objects.equals(comboSendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + + Integer orderType = ordersStatus.get(0).getOrderType(); + Integer preSaleType = ordersStatus.get(0).getPreSaleType(); + Integer status = ordersStatus.get(0).getStatus(); + message.setPreSaleType(preSaleType); + message.setOrderStatus(status); + message.setOrderType(orderType); + + // 定金预售订单付定金时不用全部分账 + boolean isPreSale = Objects.nonNull(preSaleType) && Objects.equals(preSaleType, PreSaleType.DEPOSIT.value()) && Objects.equals(status, OrderStatus.UNPAY.value()); + if (!isPreSale) { + int supplierOrderNum = Long.valueOf(ordersStatus.stream().filter(orderStatusBO -> Objects.nonNull(orderStatusBO.getSupplierId())).count()).intValue(); + // 生成店铺钱包日志id列表 + List ids = segmentManager.listSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG, ordersStatus.size() + (supplierOrderNum << 1)); + message.setShopWalletIds(ids); + LOG.info("商家钱包记录ID: {}", message.getShopWalletIds()); + } + + // 发送消息,订单支付成功 + // 通知库存扣减&&通知优惠券扣减&&团购支付成功回调&&秒杀支付成功回调&&商家分账&&通知用户余额支付成功 + SendStatus sendCouponStatus = orderNotifyServiceTemplate.syncSend(RocketMqConstant.ORDER_NOTIFY_SERVICE_TOPIC, new GenericMessage<>(message)).getSendStatus(); + if (!Objects.equals(sendCouponStatus, SendStatus.SEND_OK)) { + LOG.error("发送消息,订单支付成功,通知库存扣减&&通知优惠券扣减&&团购支付成功回调&&秒杀支付成功回调&&商家分账&&通知用户余额支付成功失败,sendCouponStatus: {}", sendCouponStatus); + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 发送消息,订单支付成功 + // 通知用户余额支付成功 + SendStatus sendBalanceStatus = allinPayBalanceOrderSuccessTemplate.syncSend(RocketMqConstant.ALLINPAY_BALANCE_ORDER_SUCCESS_TOPIC, new GenericMessage<>(message)).getSendStatus(); + if (!Objects.equals(sendBalanceStatus, SendStatus.SEND_OK)) { + LOG.error("发送消息,订单支付成功,通知用户余额支付成功失败,sendBalanceStatus: {}", sendBalanceStatus); + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 发送消息,订单支付成功,推送通知给用户 + sendMsgToUser(message, isPreSale); + } + + private void sendMsgToUser(PayNotifyBO message, boolean isPreSale) { + List notifyList = orderService.listSendNotifyByOrderIds(message.getOrderIds()); + for (SendNotifyBO sendNotifyBO : notifyList) { + sendNotifyBO.setPrice(PriceUtil.toDecimalPrice(sendNotifyBO.getActualTotal()).toString()); + sendNotifyBO.setSendType(SendTypeEnum.PAY_SUCCESS.getValue()); + } + // 订单支付成功推送消息给用户 + if (!isPreSale) { + SendStatus sendStockStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(notifyList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + List shopNotifies = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SendNotifyBO sendNotifyBO : notifyList) { + // 代销商品为供应商发货则发送 待发货提醒给供应商 + if (Objects.nonNull(sendNotifyBO.getSupplierDeliveryType()) && Objects.equals(sendNotifyBO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + // 改过价的供应商发货订单,支付后会变成采购订单,支付消息暂不发送给供应商,商家采购后再发送 + if (sendNotifyBO.getShopChangeFreeAmount() != null + && sendNotifyBO.getShopChangeFreeAmount() != 0) { + continue; + } + sendNotifyBO.setSendType(SendTypeEnum.USER_PAY_SUCCESS_TO_SUPPLIER.getValue()); + sendNotifyBO.setShopId(null); + LOG.info("代销商品为供应商发货则发送 待发货提醒给供应商,sendNotifyBO: {}", sendNotifyBO); + } else { + sendNotifyBO.setSendType(SendTypeEnum.USER_PAY_SUCCESS.getValue()); + LOG.info("商家发货则发送 待发货提醒给商家,sendNotifyBO: {}", sendNotifyBO); + } + shopNotifies.add(sendNotifyBO); + } + if (CollUtil.isNotEmpty(shopNotifies)) { + // 发送消息给商家|供应商,订单支付成功(即 待发货提醒) + for (SendNotifyBO notifyBO : shopNotifies) { + SendStatus sendShopMsgStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyBO)).getSendStatus(); + if (!Objects.equals(sendShopMsgStatus, SendStatus.SEND_OK)) { + LOG.error("发送消息给商家或供应商,订单支付成功(即 待发货提醒)失败,sendShopMsgStatus: {}", sendShopMsgStatus); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderPurchaseConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderPurchaseConsumer.java new file mode 100644 index 0000000..af1abbf --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderPurchaseConsumer.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 修改订单为待采购状态 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SHOP_WALLET_NOTIFY_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_NOTIFY_PURCHASE_GROUP) +public class OrderPurchaseConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderPurchaseConsumer.class); + + + @Autowired + private OrderService orderService; + @Autowired + private RocketMQTemplate sendOrderToPurchaseNotifyToShopTemplate; + + /** + * 修改订单为待采购状态 + */ + @Override + public void onMessage(PayNotifyBO message) { + List orderStatusList = message.getOrderStatusList(); + if (CollUtil.isEmpty(orderStatusList)) { + return; + } + LOG.info("订单支付成功,修改订单为待采购状态... message: {}", Json.toJsonString(message)); + List orders = BeanUtil.mapAsList(orderStatusList, Order.class); + // 修改订单的采购状态 + orderService.updateWaitPurchaseBatchById(orders); + + //推送订单待采购消息给店铺 + List notifyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderStatusBO order : orderStatusList) { + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setSendType(SendTypeEnum.TO_PURCHASE.getValue()); + sendNotifyBO.setBizId(order.getOrderId()); + notifyList.add(sendNotifyBO); + } + SendStatus sendStockStatus = sendOrderToPurchaseNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_ORDER_TO_PURCHASE_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderReceiptConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderReceiptConsumer.java new file mode 100644 index 0000000..8b16e8d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderReceiptConsumer.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.SendNotifyBO; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 确认收货 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_RECEIPT_TOPIC, consumerGroup = RocketMqConstant.ORDER_RECEIPT_TOPIC) +public class OrderReceiptConsumer implements RocketMQListener { + + private static final Logger logger = LoggerFactory.getLogger(OrderReceiptConsumer.class); + + + @Autowired + private RocketMQTemplate sendNotifyToShopTemplate; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @Autowired + private OrderService orderService; + @Autowired + private RocketMQTemplate sendNotifyToUserExtensionTemplate; + + /** + * 订单确认收货监听 + */ + @Override + public void onMessage(Long orderId) { + logger.info("订单确认收货监听-ORDER_RECEIPT_TOPIC, order:{}", orderId); + + // 推送确认收货的通知 + List sendNotifyList = orderService.listSimpleSendNotifyBO(Collections.singletonList(orderId)); + SendNotifyBO sendNotifyBO = sendNotifyList.get(0); + sendNotifyBO.setSendType(SendTypeEnum.RECEIPT_ORDER.getValue()); + SendStatus sendStockStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + //供应商发货的订单 同时发送确认收货提醒给商家和供应商 + if (Objects.equals(sendNotifyBO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + sendNotifyBO.setShopId(null); + sendNotifyBO.setSendType(SendTypeEnum.RECEIPT_ORDER_TO_SUPPLIER.getValue()); + SendStatus sendToSupplierStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(sendNotifyBO)).getSendStatus(); + if (!Objects.equals(sendToSupplierStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + + // 推送用户积分、成长值增加的通知 + SendStatus growthSendStatus = sendNotifyToUserExtensionTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_EXTENSION_TOPIC, new GenericMessage<>(orderId)).getSendStatus(); + if (!Objects.equals(growthSendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundCanalConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundCanalConsumer.java new file mode 100644 index 0000000..cbd2d4b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundCanalConsumer.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.commons.collections.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_CANAL_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_CANAL_TOPIC) +public class OrderRefundCanalConsumer implements RocketMQListener> { + + @Autowired + private OrderRefundService orderRefundService; + @Autowired + private RedissonClient redissonClient; + @DubboReference + private PaymentFeignClient paymentFeignClient; + + private static final Logger LOG = LoggerFactory.getLogger(OrderRefundCanalConsumer.class); + + @Override + public void onMessage(List refundIds) { + LOG.info("取消退款订单回调开始... message: {}", Json.toJsonString(refundIds)); + if (CollectionUtil.isEmpty(refundIds)) { + return; + } + if (CollectionUtils.isNotEmpty(refundIds)) { + for (Long refundId : refundIds) { + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_REFUND_HANDLE_PREFIX + refundId); + lock.lock(); + try { + OrderRefundVO orderRefundDb = orderRefundService.getByRefundId(refundId); + if (Objects.isNull(orderRefundDb)) { + continue; + } + if (Objects.equals(orderRefundDb.getReturnMoneySts(), ReturnProcessStatusEnum.PROCESSING.value())) { + // 商家处理状态,查询退款是否成功 + ServerResponseEntity serverResponse = paymentFeignClient.checkRefundStatus(refundId); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + if (serverResponse.getData()) { + LOG.info("退款订单{}已经退款完成并回调", refundId); + continue; + } + } + if (ReturnProcessStatusEnum.shouldClous(orderRefundDb.getReturnMoneySts())) { + LOG.info("退款订单超时关闭" + orderRefundDb.getRefundId()); + orderRefundService.cancelWhenTimeOut(orderRefundDb); + } + } finally { + lock.unlock(); + } + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundConsumer.java new file mode 100644 index 0000000..7d0da6c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundConsumer.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.order.constant.PurchaseOrderWaitStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.constant.RefundInterventionType; +import com.tmerclub.cloud.order.constant.RefundType; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_TOPIC) +public class OrderRefundConsumer implements RocketMQListener { + + @Autowired + private RocketMQTemplate orderRefundPaymentTemplate; + @Autowired + private RocketMQTemplate orderRefundShopTemplate; + @Autowired + private OrderService orderService; + @Autowired + private OrderItemService orderItemService; + @Autowired + private SegmentManager segmentManager; + + private static final Logger LOG = LoggerFactory.getLogger(OrderRefundConsumer.class); + + @Override + public void onMessage(OrderRefundVO orderRefundVo) { + LOG.info("订单退款{}", orderRefundVo); + + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setRefundId(orderRefundVo.getRefundId()); + payRefundBO.setRefundAmount(orderRefundVo.getRefundAmount()); + payRefundBO.setAllinpayRefundPurchaseAmount(orderRefundVo.getAllinpayRefundPurchaseAmount()); + payRefundBO.setOrderId(orderRefundVo.getOrderId()); + payRefundBO.setPayId(orderRefundVo.getPayId()); + payRefundBO.setPayIds(orderRefundVo.getPayIds()); + payRefundBO.setShopId(orderRefundVo.getShopId()); + SendStatus sendPaymentStatus = null; + // 未成团退款的订单已经处理过了,不需要再处理 + if (!Objects.equals(orderRefundVo.getUnSuccessGroupOrder(), 1)) { + // 发送退款服务进行退款的通知 + sendPaymentStatus = orderRefundPaymentTemplate.syncSend(RocketMqConstant.ORDER_REFUND_PAYMENT_TOPIC, new GenericMessage<>(payRefundBO)).getSendStatus(); + } + // 如果是待采购的订单,商家平台供应商不用退钱 + if (Objects.equals(orderRefundVo.getWaitPurchase(), 1)) { + return; + } + // 锁定商家钱包结算金额 + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = getOrderChangeShopWalletAmountBO(orderRefundVo); + + // 生成钱包id + int num = 1; + if (!Objects.equals(orderChangeShopWalletAmountBO.getSupplierHandleStatus(), -1)) { + LOG.info("非商家自行处理{}", orderChangeShopWalletAmountBO.getSupplierHandleStatus()); + num++; + } + boolean checkPlatformRefundType = Objects.isNull(orderChangeShopWalletAmountBO.getInterventionRefundType()) || !Objects.equals(orderChangeShopWalletAmountBO.getInterventionRefundType(),2); + if (!checkPlatformRefundType) { + LOG.info("退款平台介入且同意为商家供应商承担{}", orderChangeShopWalletAmountBO); + num++; + } + // 店铺记录id + if (Objects.equals(orderChangeShopWalletAmountBO.getWaitPurchase(), PurchaseOrderWaitStatus.PURCHASED.value())) { + LOG.info("采购完成{}", orderChangeShopWalletAmountBO.getWaitPurchase()); + num++; + } + if (Objects.nonNull(orderChangeShopWalletAmountBO.getSupplierId()) && !Objects.equals(orderChangeShopWalletAmountBO.getSupplierId(), 0L)) { + LOG.info("供应商id不为空{}", orderChangeShopWalletAmountBO.getSupplierId()); + num++; + } + // 生成店铺钱包日志id列表 + List ids = segmentManager.listSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG, num); + // 平台介入同意退款商家承担的时候,设置一下只能自行处理 + if(Objects.equals(orderRefundVo.getInterventionRefundType(), RefundInterventionType.SHOP.value())){ + orderChangeShopWalletAmountBO.setSupplierHandleStatus(-1); + } + orderChangeShopWalletAmountBO.setInterventionRefundType(orderRefundVo.getInterventionRefundType()); + orderChangeShopWalletAmountBO.setWalletLogIds(ids); + // 减少商家待结算金额 + SendStatus sendShopStatus = orderRefundShopTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SHOP_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountBO)).getSendStatus(); + + if (Objects.nonNull(sendPaymentStatus) && !Objects.equals(sendPaymentStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + if (!Objects.equals(sendShopStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + + /** + * 获取订单待结算金额 + */ + private OrderChangeShopWalletAmountBO getOrderChangeShopWalletAmountBO(OrderRefundVO orderRefundVO) { + + // 同意退款,判断商家是否还有金额进行退款 + Order order = orderService.getByOrderId(orderRefundVO.getOrderId()); + if (order == null) { + throw new LuckException("未找到该订单信息"); + } + + // 实付金额 + Long actualTotal; + Long platformCommission; + Double rate = 0.0; + Long distributionAmount; + long shopAllowanceAmount; + if (Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())) { + actualTotal = order.getActualTotal(); + platformCommission = order.getPlatformCommission(); + distributionAmount = order.getDistributionAmount(); + shopAllowanceAmount = order.getReduceAmount() - order.getPlatformAmount(); + } else { + OrderItemVO item = orderItemService.getByOrderItemId(orderRefundVO.getOrderItemId()); + actualTotal = item.getActualTotal(); + // 平台佣金 + platformCommission = item.getPlatformCommission(); + rate = item.getRate(); + shopAllowanceAmount = item.getShareReduce() - item.getPlatformShareReduce(); + distributionAmount = item.getDistributionAmount() + item.getDistributionParentAmount(); + } + + + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = new OrderChangeShopWalletAmountBO(); + orderChangeShopWalletAmountBO.setOrderStatus(order.getStatus()); + orderChangeShopWalletAmountBO.setActualTotal(actualTotal); + orderChangeShopWalletAmountBO.setRefundAmount(orderRefundVO.getRefundAmount()); + orderChangeShopWalletAmountBO.setPlatformAllowanceAmount(orderRefundVO.getPlatformRefundAmount()); + orderChangeShopWalletAmountBO.setShopAllowanceAmount(shopAllowanceAmount); + orderChangeShopWalletAmountBO.setOrderId(order.getOrderId()); + orderChangeShopWalletAmountBO.setRefundId(orderRefundVO.getRefundId()); + orderChangeShopWalletAmountBO.setShopId(orderRefundVO.getShopId()); + orderChangeShopWalletAmountBO.setOrderItemId(orderRefundVO.getOrderItemId()); + orderChangeShopWalletAmountBO.setPlatformCommission(platformCommission); + orderChangeShopWalletAmountBO.setChangePlatformCommission(orderRefundVO.getPlatformRefundCommission()); + orderChangeShopWalletAmountBO.setRate(rate); + orderChangeShopWalletAmountBO.setDistributionAmount(distributionAmount); + orderChangeShopWalletAmountBO.setFreightAmount(orderRefundVO.getFreightAmount()); + orderChangeShopWalletAmountBO.setWaitPurchase(order.getWaitPurchase()); + orderChangeShopWalletAmountBO.setPlatformFreeFreightAmount(order.getPlatformFreeFreightAmount()); + // 供应商相关 + orderChangeShopWalletAmountBO.setSupplierFreightAmount(orderRefundVO.getSupplierFreightAmount()); + orderChangeShopWalletAmountBO.setSupplierHandleStatus(orderRefundVO.getSupplierHandleStatus()); + orderChangeShopWalletAmountBO.setSupplierId(order.getSupplierId()); + orderChangeShopWalletAmountBO.setChangePurchaseAmount(orderRefundVO.getPurchaseRefundAmount()); + orderChangeShopWalletAmountBO.setChangePurchasePlatformCommission(orderRefundVO.getPurPlatformRefundCommission()); + orderChangeShopWalletAmountBO.setLastOrder(orderRefundVO.isLastOrder()); + orderChangeShopWalletAmountBO.setPaySysType(order.getPaySysType()); + + orderChangeShopWalletAmountBO.setInterventionRefundType(orderRefundVO.getInterventionRefundType()); + + return orderChangeShopWalletAmountBO; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundRequestConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundRequestConsumer.java new file mode 100644 index 0000000..7f0e539 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundRequestConsumer.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * 发放退款 + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_REQUEST_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_REQUEST_TOPIC) +public class OrderRefundRequestConsumer implements RocketMQListener> { + + @Autowired + private OrderRefundService orderRefundService; + @Autowired + private RedissonClient redissonClient; + @DubboReference + private PaymentFeignClient paymentFeignClient; + + private static final Logger logger = LoggerFactory.getLogger(OrderRefundRequestConsumer.class); + + @Override + public void onMessage(List refundIds) { + if (CollUtil.isEmpty(refundIds)) { + return; + } + logger.info("发放回调开始... message: {}", Json.toJsonString(refundIds)); + for (Long refundId : refundIds) { + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_REFUND_HANDLE_PREFIX + refundId); + lock.lock(); + try { + OrderRefundVO orderRefundVO = orderRefundService.getByRefundId(refundId); + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.PROCESSING.value())) { + // 商家处理状态,查询退款是否成功 + ServerResponseEntity serverResponse = paymentFeignClient.checkRefundStatus(refundId); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + if (serverResponse.getData()) { + logger.info("退款订单{}已经退款完成并回调", refundId); + continue; + } + // 申请退款失败,重新申请 + logger.info("退款单号为{}的订单开始进行发放退款", refundId); + // 提交退款请求 + orderRefundService.refundRequest(refundId); + } + } catch (Exception e) { + // 该mq不需要反复回调回来,反正定时任务会一直执行 + logger.info("退款单号:{}订单发放退款失败,原因为:{}", refundId, e.getMessage()); + } finally { + lock.unlock(); + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundSuccessConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundSuccessConsumer.java new file mode 100644 index 0000000..3aff964 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundSuccessConsumer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import com.tmerclub.cloud.common.order.bo.RefundNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.order.service.OrderRefundService; +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.Objects; + +/** + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SUCCESS_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SUCCESS_TOPIC) +public class OrderRefundSuccessConsumer implements RocketMQListener { + + @Autowired + private OrderRefundService orderRefundService; + + @Override + public void onMessage(RefundNotifyBO refundNotifyBO) { + // 因为未成团进行团购订单的退款 + if (Objects.equals(refundNotifyBO.getUnSuccessGroupOrder(), 1)) { + // 创建退款订单然后再退款 + orderRefundService.createGroupUnSuccessRefundInfo(refundNotifyBO); + } else { + // 退款 + orderRefundService.refundSuccess(refundNotifyBO); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundTransactionListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundTransactionListener.java new file mode 100644 index 0000000..0e45d6c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderRefundTransactionListener.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import com.tmerclub.cloud.common.order.constant.ReturnProcessStatusEnum; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.constant.PlatformInterventionStatus; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.service.OrderRefundService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 订单退款事务监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "orderRefundTemplate", maximumPoolSize = 20) +public class OrderRefundTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private OrderRefundService orderRefundService; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) { + OrderRefundVO orderRefundVO = Json.parseObject((byte[]) msg.getPayload(), OrderRefundVO.class); + + OrderRefundDTO orderRefundParam = (OrderRefundDTO) arg; + // 同意退款 + int updateStats = orderRefundService.agreeRefund(orderRefundVO, orderRefundParam); + + if (updateStats == 0) { + // 如果啥都没有更新,就检查一下 + return checkLocalTransaction(msg); + } + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + OrderRefundVO orderRefundVO = Json.parseObject((byte[]) msg.getPayload(), OrderRefundVO.class); + OrderRefundVO dbRefundStatus = orderRefundService.getByRefundId(orderRefundVO.getRefundId()); + if (Objects.equals(dbRefundStatus.getPlatformInterventionStatus(),-1) && !Objects.equals(dbRefundStatus.getReturnMoneySts(), ReturnProcessStatusEnum.PROCESSING.value())) { + return RocketMQLocalTransactionState.ROLLBACK; + } + if (!Objects.equals(dbRefundStatus.getPlatformInterventionStatus(),-1) && !Objects.equals(dbRefundStatus.getPlatformInterventionStatus(), PlatformInterventionStatus.AGREE.value())) { + return RocketMQLocalTransactionState.ROLLBACK; + } + return RocketMQLocalTransactionState.COMMIT; + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderSettledTransactionListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderSettledTransactionListener.java new file mode 100644 index 0000000..11254ac --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/OrderSettledTransactionListener.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.service.OrderService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 确认收货事务监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "orderSettledShopTemplate", maximumPoolSize = 20) +public class OrderSettledTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private OrderService orderService; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) { + List orderIds = (List) arg; + // 众所周知,结算之后是不能改变状态的 + int updateStats = orderService.settledOrder(orderIds); + if (updateStats == 0) { + // 如果啥都没有更新,就检查一下 + return checkLocalTransaction(msg); + } + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + Date now = new Date(); + // 确认收货15天的订单,进行结算 + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setStatus(OrderStatus.SUCCESS.value()); + orderSearchDTO.setFinallyTime(DateUtil.beginOfDay(DateUtil.offsetDay(now, -15))); + ServerResponseEntity orderResponseEntity = searchOrderFeignClient.countOrder(orderSearchDTO); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + + if (Objects.nonNull(orderResponseEntity.getData()) && Objects.equals(orderResponseEntity.getData(), 0L)) { + return RocketMQLocalTransactionState.COMMIT; + } + return RocketMQLocalTransactionState.ROLLBACK; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PresaleOrderCanalConsumer.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PresaleOrderCanalConsumer.java new file mode 100644 index 0000000..dddb3df --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PresaleOrderCanalConsumer.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.constant.Constant; +import com.tmerclub.cloud.order.service.OrderPreSaleInfoService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +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.List; + +/** + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.PRESALE_ORDER_CANAL_TOPIC, consumerGroup = RocketMqConstant.PRESALE_ORDER_CANAL_TOPIC) +public class PresaleOrderCanalConsumer implements RocketMQListener> { + + @Autowired + private OrderPreSaleInfoService orderPreSaleInfoService; + + private static final Logger LOG = LoggerFactory.getLogger(PresaleOrderCanalConsumer.class); + + @Override + public void onMessage(List orderIds) { + LOG.info("取消预售订单回调开始... message: {}", Json.toJsonString(orderIds)); + if (CollectionUtil.isEmpty(orderIds)) { + return; + } + List canalOrderList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 取消订单,不用退回金额,但因为商家平台供应商收入了一笔,还需要进行结算 + orderPreSaleInfoService.handleBalanceTimeExpireOrder(orderIds, canalOrderList); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseExcelListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseExcelListener.java new file mode 100644 index 0000000..723e058 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseExcelListener.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.util.ConverterUtils; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.order.vo.PurchaseSpuExcelVO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 商品excel导入监听 + * 有个很重要的点 SpuExcelListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 + * + * @author cl + * @date 2021/5/14 + */ + +public class PurchaseExcelListener extends AnalysisEventListener { + + private List list; + private List partyCodeList; + public static final String OTHER = "other"; + public static final String ERROR_ROWS = "error_rows"; + public static final String IMPORT_ROWS = "import_rows"; + + public PurchaseExcelListener() { + } + + public PurchaseExcelListener(Map> errorMap, List list) { + errorMap.put(OTHER, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(ERROR_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(IMPORT_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + this.list = list; + this.partyCodeList = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + /** + * 这个每一条数据解析都会来调用 + */ + + @Override + public void invoke(PurchaseSpuExcelVO userExcelDTO, AnalysisContext analysisContext) { + if (StrUtil.isBlank(userExcelDTO.getPartyCode()) || partyCodeList.contains(userExcelDTO.getPartyCode())) { + return; + } + partyCodeList.add(userExcelDTO.getPartyCode()); + if (StrUtil.isBlank(userExcelDTO.getSpuName())) { + userExcelDTO.setSpuName(""); + } + if (Objects.isNull(userExcelDTO.getPurchaseStock())) { + userExcelDTO.setPurchaseStock(0); + } + list.add(userExcelDTO); + } + + /** + * 所有数据解析完成了 都会来调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + } + + /** + * 获取excel表头数据 + * + * @param headMap 表头数据 + * @param context 上下文 + */ + @Override + public void invokeHead(Map> headMap, AnalysisContext context) { + Map strHeadMap = ConverterUtils.convertToStringMap(headMap, context); + int row = context.readRowHolder().getRowIndex(); + // 合并表头检验 + if (Objects.equals(row, 0)) { + if (!Objects.equals(strHeadMap.get(0), PurchaseSpuExcelVO.HEADER)) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + return; + } + // 表头检验 + if (Objects.equals(row, 1)) { + if (!Objects.equals(strHeadMap.size(), PurchaseSpuExcelVO.HEADER_ARRAY.length)) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + for (Map.Entry entry : strHeadMap.entrySet()) { + if (!Objects.equals(entry.getValue(), PurchaseSpuExcelVO.HEADER_ARRAY[entry.getKey()])) { + throw new LuckException("导入模板错误,请下载最新模板!"); + } + } + } + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseOrderExcelListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseOrderExcelListener.java new file mode 100644 index 0000000..b82dac3 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseOrderExcelListener.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.order.constant.OrderExportError; +import com.tmerclub.cloud.order.service.PurchaseOrderExcelService; +import com.tmerclub.cloud.order.vo.UnDeliveryPurchaseOrderExcelVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 待发货订单导入监听,对数据进行校验 + * + * @author Pineapple + * @date 2021/7/20 11:11 + */ +public class PurchaseOrderExcelListener extends AnalysisEventListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(PurchaseOrderExcelListener.class); + private PurchaseOrderExcelService orderExcelService; + private Map> errorMap; + private List list; + private UnDeliveryPurchaseOrderExcelVO unDeliveryOrderExcel; + + private static final int BATCH_COUNT = 1000; + private static String seq; + + public PurchaseOrderExcelListener() { + + } + + public PurchaseOrderExcelListener(PurchaseOrderExcelService orderExcelService, Map> errorMap) { + this.orderExcelService = orderExcelService; + this.errorMap = errorMap; + this.list = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + /** + * 每条数据解析时均会调用 + */ + @Override + public void invoke(UnDeliveryPurchaseOrderExcelVO unDeliveryOrderExcelVO, AnalysisContext analysisContext) { + if (Objects.isNull(unDeliveryOrderExcelVO.getSeq())) { + if (Objects.isNull(unDeliveryOrderExcel)) { + return; + } + unDeliveryOrderExcelVO.setSeq(unDeliveryOrderExcel.getSeq()); + unDeliveryOrderExcelVO.setPurchaseOrderId(unDeliveryOrderExcel.getPurchaseOrderId()); + unDeliveryOrderExcelVO.setDeliveryType(unDeliveryOrderExcel.getDeliveryType()); + unDeliveryOrderExcelVO.setDeliveryCompanyName(unDeliveryOrderExcel.getDeliveryCompanyName()); + unDeliveryOrderExcelVO.setDeliveryNo(unDeliveryOrderExcel.getDeliveryNo()); + } + boolean isSave = Objects.nonNull(seq) && !Objects.equals(seq, unDeliveryOrderExcelVO.getSeq()) && list.size() > BATCH_COUNT; + if (isSave) { + saveData(); + } + seq = unDeliveryOrderExcelVO.getSeq(); + unDeliveryOrderExcel = unDeliveryOrderExcelVO; + list.add(unDeliveryOrderExcelVO); + } + + /** + * 所有数据解析完成调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + saveData(); + } + + private void saveData() { + if (CollUtil.isEmpty(list)) { + return; + } + try { + orderExcelService.exportOrderExcel(list, errorMap); + } catch (Exception e) { + List errorList = errorMap.get(OrderExportError.OTHER.value()); + if (CollUtil.isEmpty(errorList)) { + errorList = new ArrayList<>(Constant.INITIAL_CAPACITY); + errorMap.put(OrderExportError.OTHER.value(), errorList); + } + errorList.add(e.getMessage()); + } + list.clear(); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseOrderInboundExcelListener.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseOrderInboundExcelListener.java new file mode 100644 index 0000000..576e405 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/listener/PurchaseOrderInboundExcelListener.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.listener; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.order.vo.PurchaseOrderInboundExcelVO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 商品excel导入监听 + * 有个很重要的点 SpuExcelListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 + * + * @author cl + * @date 2021/5/14 + */ + +public class PurchaseOrderInboundExcelListener extends AnalysisEventListener { + + private List list; + public static final String OTHER = "other"; + public static final String ERROR_ROWS = "error_rows"; + public static final String IMPORT_ROWS = "import_rows"; + + public PurchaseOrderInboundExcelListener() { + } + + public PurchaseOrderInboundExcelListener(Map> errorMap, List list) { + errorMap.put(OTHER, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(ERROR_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(IMPORT_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + this.list = list; + } + + /** + * 这个每一条数据解析都会来调用 + */ + + @Override + public void invoke(PurchaseOrderInboundExcelVO userExcelDTO, AnalysisContext analysisContext) { + if (StrUtil.isBlank(userExcelDTO.getPartyCode()) && Objects.isNull(userExcelDTO.getPurchaseStock())) { + return; + } + if (StrUtil.isBlank(userExcelDTO.getSpuName())) { + userExcelDTO.setSpuName(""); + } + if (Objects.isNull(userExcelDTO.getActualStock())) { + userExcelDTO.setActualStock(0); + } + list.add(userExcelDTO); + } + + /** + * 所有数据解析完成了 都会来调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoAllotOrderManager.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoAllotOrderManager.java new file mode 100644 index 0000000..0e9a5f0 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoAllotOrderManager.java @@ -0,0 +1,106 @@ +package com.tmerclub.cloud.order.manager; + +import com.tmerclub.cloud.order.bo.mongo.MongoAllotOrderBO; +import com.tmerclub.cloud.order.bo.mongo.MongoAllotOrderItemBO; +import com.tmerclub.cloud.order.bo.mongo.MongoPurchaseOrderBO; +import com.tmerclub.cloud.order.constant.AllotOrderStatusEnum; +import com.tmerclub.cloud.order.dto.AllotOrderDTO; +import com.tmerclub.cloud.order.mapper.AllotOrderMapper; +import com.tmerclub.cloud.order.vo.AllotOrderItemVO; +import com.tmerclub.cloud.order.vo.AllotOrderVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 调拨订单 + * @author gaozijie + * @since 2023-11-24 + */ +@Component +public class MongoAllotOrderManager { + + private static final Logger logger = LoggerFactory.getLogger(MongoAllotOrderManager.class); + + @Autowired + private AllotOrderMapper allotOrderMapper; + + @Autowired + private MongoTemplate mongoTemplate; + + /** + * 新增调拨订单并返回 + * @param allotOrderId 调拨订单id + * @return 调拨订单mongo数据 + */ + public MongoAllotOrderBO saveAllotOrder(Long allotOrderId) { + AllotOrderDTO allotOrderDTO = new AllotOrderDTO(); + allotOrderDTO.setAllotOrderId(allotOrderId); + AllotOrderVO allotOrderVO = allotOrderMapper.getAllotOrder(allotOrderDTO); + // 转成mongo数据 + MongoAllotOrderBO mongoAllotOrderBO = new MongoAllotOrderBO(); + BeanUtils.copyProperties(allotOrderVO, mongoAllotOrderBO); + List mongoItems = new ArrayList<>(allotOrderVO.getAllotOrderItemVOList().size()); + for (AllotOrderItemVO allotOrderItemVO : allotOrderVO.getAllotOrderItemVOList()) { + MongoAllotOrderItemBO mongoItem = new MongoAllotOrderItemBO(); + BeanUtils.copyProperties(allotOrderItemVO, mongoItem); + mongoItems.add(mongoItem); + } + mongoAllotOrderBO.setAllotOrderItemBOList(mongoItems); + mongoTemplate.save(mongoAllotOrderBO); + return mongoAllotOrderBO; + } + + /** + * 统计未完成的调拨订单数量 + * @param warehouseId 仓库id + * @return 未完成数 + */ + public Long countUnFinishAllot(Long warehouseId) { + Criteria criteria = new Criteria() + .orOperator(Criteria.where("inWarehouseId").is(warehouseId), + Criteria.where("outWarehouseId").is(warehouseId)) + .and("status").nin(AllotOrderStatusEnum.COMPLETION.getNum(), AllotOrderStatusEnum.VOIDED.getNum()); + Query query = new Query(criteria); + logger.info("countUnFinishAllot()的mongodb查询语句: {}", query); + return mongoTemplate.count(query, MongoAllotOrderBO.class); + } + + /** + * 获取调拨订单列表 + * @param allotOrderDTO 调拨订单dto + * @return 调拨订单集合 + */ + public List listAllotOrder(AllotOrderDTO allotOrderDTO) { + Query query = new Query(this.buildListCriteria(allotOrderDTO)); + logger.info("listAllotOrder()的mongodb查询语句: {}", query); + return mongoTemplate.find(query, MongoAllotOrderBO.class); + } + + /** + * 构建list查询条件 + * @param allotOrderDTO 调拨订单dto + * @return 查询条件 + */ + private Criteria buildListCriteria(AllotOrderDTO allotOrderDTO) { + Criteria criteria = new Criteria(); + if (!Objects.isNull(allotOrderDTO.getWarehouseId())) { + criteria.orOperator(Criteria.where("inWarehouseId").is(allotOrderDTO.getWarehouseId()), + Criteria.where("outWarehouseId").is(allotOrderDTO.getWarehouseId())); + } + if (!CollectionUtils.isEmpty(allotOrderDTO.getStatuses())) { + criteria.and("status").in(allotOrderDTO.getStatuses()); + } + return criteria; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoPurchaseOrderManager.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoPurchaseOrderManager.java new file mode 100644 index 0000000..e75ee3b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/manager/MongoPurchaseOrderManager.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.manager; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.order.bo.mongo.MongoPurchaseOrderBO; +import com.tmerclub.cloud.order.constant.PurchasesStatusEnum; +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import org.checkerframework.checker.units.qual.C; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationOperation; +import org.springframework.data.mongodb.core.aggregation.AggregationResults; +import org.springframework.data.mongodb.core.aggregation.TypedAggregation; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单统计 + * @author FrozenWatermelon + * @date 2020/12/07 + */ +@Component +public class MongoPurchaseOrderManager { + private static final Logger logger = LoggerFactory.getLogger(MongoPurchaseOrderManager.class); + + @Autowired + private MongoTemplate mongoTemplate; + + public void save(MongoPurchaseOrderBO mongoPurchaseOrderBO) { + mongoTemplate.save(mongoPurchaseOrderBO); + } + + public List listSpuIdOfStockChange(Date beginTime, Date endTime) { + List aggregationOperations = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(beginTime) && Objects.nonNull(endTime)) { + aggregationOperations.add(Aggregation.match(Criteria.where("updateTime").gt(beginTime).lte(endTime))); + } + aggregationOperations.add(Aggregation.unwind("purchaseOrderItems")); + + aggregationOperations.add(Aggregation.group("purchaseOrderItems.spuId")); + + Aggregation aggregation = Aggregation.newAggregation( + aggregationOperations + ); + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoPurchaseOrderBO.class, + aggregationOperations + ); + logger.info("listSpuIdOfStockChange()的mongodb查询语句: {}", typedAggregation); + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoPurchaseOrderBO.class); + List spuList = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(spuList)) { + return Collections.emptyList(); + } + + return spuList.stream().map(MongoPurchaseOrderBO::getPurchaseOrderId).collect(Collectors.toList()); + } + + /** + * 统计未完成的采购订单数 + * @param warehouseId 仓库id + * @return 未完成数 + */ + public Long countUnFinishPurchase(Long warehouseId) { + Criteria criteria = new Criteria() + .orOperator(Criteria.where("warehouseId").is(warehouseId), + Criteria.where("supplierWarehouseId").is(warehouseId)) + .and("status").nin(PurchasesStatusEnum.COMPLETION.value(), PurchasesStatusEnum.VOIDED.value()); + Query query = new Query(criteria); + logger.info("countUnFinishPurchase()的mongodb查询语句: {}", query); + return mongoTemplate.count(query, MongoPurchaseOrderBO.class); + } + + /** + * 获取采购订单列表 + * @param purchaseOrderDTO 采购订单dto + * @return 采购订单列表 + */ + public List listPurchaseOrder(PurchaseOrderDTO purchaseOrderDTO) { + Query query = new Query(this.buildListCriteria(purchaseOrderDTO)); + logger.info("listPurchaseOrder()的mongodb查询语句: {}", query); + return mongoTemplate.find(query, MongoPurchaseOrderBO.class); + } + + /** + * 构建获取列表查询语句 + * @param purchaseOrderDTO 采购订单dto + * @return 查询语句 + */ + private Criteria buildListCriteria(PurchaseOrderDTO purchaseOrderDTO) { + Criteria criteria = new Criteria(); + if (!Objects.isNull(purchaseOrderDTO.getWarehouseId())) { + criteria.orOperator(Criteria.where("warehouseId").is(purchaseOrderDTO.getWarehouseId()), + Criteria.where("supplierWarehouseId").is(purchaseOrderDTO.getWarehouseId())); + } + if (!CollectionUtils.isEmpty(purchaseOrderDTO.getNotInStatuses())) { + criteria.and("status").nin(purchaseOrderDTO.getNotInStatuses()); + } + return criteria; + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/AllotOrderItemMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/AllotOrderItemMapper.java new file mode 100644 index 0000000..71d1299 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/AllotOrderItemMapper.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.AllotOrderItem; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-11-20 + */ +public interface AllotOrderItemMapper { + /** + * 批量新增调拨订单商品 + * @param allotOrderItems 调拨订单商品 + */ + void addBatchAllotOrderItem(@Param("allotOrderItems") List allotOrderItems); + + /** + * 批量更新调拨订单商品 + * @param allotOrderItems 调拨订单商品dto + */ + void updateBatchAllotOrderItem(@Param("allotOrderItems") List allotOrderItems); + + /** + * 更新调拨订单商品 + * @param allotOrderItem 调拨订单商品 + */ + void updateAllotOrderItem(@Param("allotOrderItem") AllotOrderItem allotOrderItem); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderAddrMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderAddrMapper.java new file mode 100644 index 0000000..cf56f1f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderAddrMapper.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.common.order.vo.OrderAddrVO; +import com.tmerclub.cloud.order.model.OrderAddr; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderAddrMapper { + + /** + * 获取用户订单配送地址列表 + * + * @return 用户订单配送地址列表 + */ + List list(); + + /** + * 根据用户订单配送地址id获取用户订单配送地址 + * + * @param orderAddrId 用户订单配送地址id + * @return 用户订单配送地址 + */ + OrderAddr getByOrderAddrId(@Param("orderAddrId") Long orderAddrId); + + /** + * 保存用户订单配送地址 + * + * @param orderAddr 用户订单配送地址 + */ + void save(@Param("orderAddr") OrderAddr orderAddr); + + /** + * 更新用户订单配送地址 + * + * @param orderAddr 用户订单配送地址 + */ + void update(@Param("orderAddr") OrderAddr orderAddr); + + /** + * 根据用户订单配送地址id删除用户订单配送地址 + * + * @param orderAddrId + */ + void deleteById(@Param("orderAddrId") Long orderAddrId); + + /** + * 根据订单id获取订单地址 + * + * @param orderId + * @return + */ + OrderAddrVO getByOrderId(@Param("orderId") Long orderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderInvoiceMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderInvoiceMapper.java new file mode 100644 index 0000000..8ef0295 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderInvoiceMapper.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.api.order.bo.EsOrderInvoiceBO; +import com.tmerclub.cloud.order.model.OrderInvoice; +import com.tmerclub.cloud.order.vo.OrderInvoiceVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author Pineapple + * @date 2021/8/2 8:54 + */ +public interface OrderInvoiceMapper { + + /** + * 根据id获取 + * + * @param orderInvoiceId id + * @return + */ + OrderInvoice getByOrderInvoiceId(@Param("orderInvoiceId") Long orderInvoiceId); + + /** + * 保存 + * + * @param orderInvoice + */ + void save(@Param("orderInvoice") OrderInvoice orderInvoice); + + /** + * 批量保存 + * + * @param orderInvoices + */ + void saveBatch(@Param("orderInvoices") List orderInvoices); + + /** + * 更新 + * + * @param orderInvoice + */ + void update(@Param("orderInvoice") OrderInvoice orderInvoice); + + /** + * 根据id删除 + * + * @param orderInvoiceId + */ + void deleteById(@Param("orderInvoiceId") Long orderInvoiceId); + + /** + * 根据订单发票id获取,app端使用 + * + * @param orderInvoiceId 订单发票id + * @param lang 语言 + * @return 信息 + */ + OrderInvoiceVO getById(@Param("orderInvoiceId") Long orderInvoiceId, @Param("lang") Integer lang); + + /** + * 该订单是否已经开具发票 + * + * @param orderId + * @return + */ + int isUpload(@Param("orderId") Long orderId, + @Param("shopId") Long shopId, + @Param("supplierId") Long supplierId); + + /** + * 根据订单id获取发票id + * + * @param orderId 订单id + * @return + */ + Long getByOrderId(@Param("orderId") Long orderId, + @Param("shopId") Long shopId, + @Param("supplierId") Long supplierId); + + /** + * 根据订单ids获取发票信息 + * + * @param orderIds 订单ids + * @return + */ + List listByOrderIds(@Param("orderIds") List orderIds); + + /** + * 批量删除 + * + * @param orderIds 被取消的订单id + */ + void deleteBatch(@Param("orderIds") List orderIds); + + /** + * 获取订单发票数据 + * + * @param orderInvoiceId + * @return + */ + EsOrderInvoiceBO getEsOrderInvoice(@Param("orderInvoiceId") Long orderInvoiceId); + + /** + * 根据订单id获取es发票更新数据 + * + * @param orderId + * @return + */ + List listEsOrderInvoiceByOrderId(@Param("orderId") Long orderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundAddrMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundAddrMapper.java new file mode 100644 index 0000000..219717c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundAddrMapper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.OrderRefundAddr; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户退货物流地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 13:44:31 + */ +public interface OrderRefundAddrMapper { + + /** + * 获取用户退货物流地址列表 + * + * @return 用户退货物流地址列表 + */ + List list(); + + /** + * 根据用户退货物流地址id获取用户退货物流地址 + * + * @param refundAddrId 用户退货物流地址id + * @return 用户退货物流地址 + */ + OrderRefundAddr getByRefundAddrId(@Param("refundAddrId") Long refundAddrId); + + /** + * 保存用户退货物流地址 + * + * @param orderRefundAddr 用户退货物流地址 + */ + void save(@Param("orderRefundAddr") OrderRefundAddr orderRefundAddr); + + /** + * 更新用户退货物流地址 + * + * @param orderRefundAddr 用户退货物流地址 + */ + void update(@Param("orderRefundAddr") OrderRefundAddr orderRefundAddr); + + /** + * 根据用户退货物流地址id删除用户退货物流地址 + * + * @param refundAddrId + */ + void deleteById(@Param("refundAddrId") Long refundAddrId); + + /** + * 根据退款订单id获取退款地址信息 + * + * @param refundId + * @return + */ + OrderRefundAddr getByRefundId(@Param("refundId") Long refundId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundMapper.java new file mode 100644 index 0000000..c31fbab --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderRefundMapper.java @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.api.order.vo.OrderRefundSimpleVO; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderRefundBO; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderRefundItemBO; +import com.tmerclub.cloud.order.model.OrderRefund; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单退款记录信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderRefundMapper { + + /** + * 根据订单退款记录信息id获取订单退款记录信息 + * + * @param refundId 订单退款记录信息id + * @return 订单退款记录信息 + */ + OrderRefundVO getByRefundId(@Param("refundId") Long refundId); + + /** + * 保存订单退款记录信息 + * + * @param orderRefund 订单退款记录信息 + */ + void save(@Param("orderRefund") OrderRefund orderRefund); + + /** + * 更新订单退款记录信息 + * + * @param orderRefund 订单退款记录信息 + */ + void update(@Param("orderRefund") OrderRefund orderRefund); + + /** + * 根据订单退款记录信息id删除订单退款记录信息 + * + * @param refundId + */ + void deleteById(@Param("refundId") Long refundId); + + /** + * 根据订单id,获取正在退款中或退款成功的订单 + * + * @param orderId + * @return + */ + List getProcessOrderRefundByOrderId(@Param("orderId") Long orderId); + + /** + * 根据订单id,获取退款成功的退款 + * + * @param orderId + * @return + */ + List listSuccessOrderRefundByOrderId(@Param("orderId") Long orderId); + + /** + * 根据订单id,获取正在退款中或退款成功的订单 + * + * @param orderIds + * @return + */ + List getProcessOrderRefundByOrderIds(@Param("orderIds") List orderIds); + + /** + * 根据订单id,获取正在退款中或退款成功的订单 + * + * @param orderId 订单id + * @param returnMoneySts 退款状态 + * @return 成功的退款订单 + */ + List getOrderRefundByOrderIdAndRefundStatus(@Param("orderId") Long orderId, @Param("returnMoneySts") Integer returnMoneySts); + + /** + * 获取订单正在进行退款的退款数量 + * + * @param returnMoneySts + * @param returnMoneySts2 + * @param orderId + * @return + */ + Integer countByReturnMoneyStsAndOrderId(@Param("returnMoneySts") Integer returnMoneySts, @Param("returnMoneySts2") Integer returnMoneySts2, @Param("orderId") Long orderId); + + /** + * 正在进行退款的退款订单数量 + * + * @param orderId 订单号 + * @return 正在进行退款的退款订单数量 + */ + Integer countReturnProcessingItemByOrderId(@Param("orderId") Long orderId); + + + /** + * 查询退款成功的订单商品数量 + * + * @param orderId + * @return + */ + Integer countRefundSuccessRefundCountByOrderId(@Param("orderId") Long orderId); + + + /** + * 同意退货 + *

+ * 注意:如果你无法理解下面这句话的话,请不要随意更改里面sql的where语句 + * 众所周知,如果不是申请的话,下一步不可能是同意退货, + * 但是在执行下面代码之前,退款的状态是可能发生改变的, + * 也就是下面这条sql执行之前进行了退款状态的改变(比如同意退款),那会造成不可预知的后果, + * 所以更新订单状态的时候也要在条件当中加上退款状态,确定这条sql是原子性的 + * + * @param sellerMsg + * @param refundId + * @return + */ + int agreeReturns(@Param("sellerMsg") String sellerMsg, @Param("refundId") Long refundId); + + /** + * 拒绝退款 + *

+ * 注意:如果你无法理解下面这句话的话,请不要随意更改里面的sql的where语句 + * 众所周知,如果不是申请的话,下一步不可能是拒绝, + * 但是在执行下面代码之前,退款的状态是可能发生改变的, + * 也就是下面这条sql执行之前进行了退款状态的改变(比如同意退款),那会造成不可预知的后果, + * 所以更新订单状态的时候也要在条件当中加上退款状态,确定这条sql是原子性的 + * + * @param sellerMsg + * @param rejectMessage + * @param refundId + * @param returnMoneySts + * @param receiver + * @param supplierHandleStatus + * @param imgUrls + * @return + */ + int disagreeRefund(@Param("sellerMsg") String sellerMsg, @Param("rejectMessage") String rejectMessage, @Param("refundId") Long refundId, + @Param("returnMoneySts") Integer returnMoneySts, @Param("receiver") Boolean receiver, @Param("supplierHandleStatus") Integer supplierHandleStatus, @Param("imgUrls") String imgUrls); + + /** + * 拒绝退款介入申请 + * + * @param platformMessage + * @param refundId + * @param applyInterventionStatus + * @return + */ + int disagreeIntervention(@Param("platformMessage") String platformMessage, @Param("refundId") Long refundId, + @Param("applyInterventionStatus") Integer applyInterventionStatus); + + /** + * 同意退款 + * + * @param sellerMsg + * @param refundId + * @param returnMoneySts + * @param receiver + * @param applyType + * @param refundAmount + * @param purchaseRefundAmount + * @param applyInterventionStatus + * @return + */ + int agreeRefund(@Param("sellerMsg") String sellerMsg, @Param("refundId") Long refundId, @Param("returnMoneySts") Integer returnMoneySts, + @Param("receiver") Boolean receiver, @Param("applyType") Integer applyType, @Param("refundAmount") Long refundAmount, @Param("purchaseRefundAmount") Long purchaseRefundAmount); + + /** + * 平台同意退款 + * + * @param orderRefundVO 退款信息 + * @return + */ + int platformAgreeRefund(@Param("orderRefundVO") OrderRefundVO orderRefundVO); + + /** + * 获取退款状态 + * + * @param refundId + * @return + */ + Integer getRefundStatus(@Param("refundId") Long refundId); + + /** + * 通过订单id获取正在处理中和处理成功的退款订单 + * + * @param orderId 订单id + * @return 正在处理中的退款订单 + */ + List getProcessingOrderRefundByOrderId(@Param("orderId") Long orderId); + + /** + * 通过订单id获取正在处理中的退款订单 + * + * @param orderId 订单id + * @return 正在处理中的退款订单 + */ + List getProcessingRefundByOrderId(@Param("orderId") Long orderId); + + /** + * 通过订单id获取正在处理中和退款平台介入拒绝的退款订单 + * + * @param orderId 订单id + * @return 正在处理中和退款平台介入拒绝的退款订单 + */ + List listOrderRefundByOrderId(@Param("orderId") Long orderId); + + /** + * 根据退款单号列表获取订单号列表 + * + * @param refundIds + * @return + */ + List listOrderIdsByRefundIds(@Param("refundIds") List refundIds); + + /** + * 移交供应商处理,改变下状态即可 + * + * @param oldSupplierHandleStatus 供应商处理状态(旧) + * @param supplierHandleStatus 移交供应商处理状态 + * @param refundId 退款id + * @param returnMoneySts 退款状态 + * @return 结果 + */ + int transferRefundOrderToSupplier(@Param("oldSupplierHandleStatus") Integer oldSupplierHandleStatus, @Param("supplierHandleStatus") Integer supplierHandleStatus, + @Param("refundId") Long refundId, @Param("returnMoneySts") Integer returnMoneySts); + + /** + * 获取退款成功总数 + * + * @param orderId + * @return + */ + int countSuccessItemNum(Long orderId); + + /** + * 获取订单的移交供应商处理的状态 + * + * @param orderId 订单id + * @return 移交供应商处理的状态 + */ + int getSupplierHandleStatusByOrderId(@Param("orderId") Long orderId); + + /** + * 获取mongodb和es的退款订单信息 + * + * @param refundId + * @return + */ + MongoOrderRefundBO mongoAndEsOrderRefundInfo(@Param("refundId") Long refundId); + + /** + * 获取订单有关信息 + * + * @param orderId + * @return + */ + MongoOrderRefundBO mongoEsOrder(@Param("orderId") Long orderId); + + /** + * 取mongodb和es的退款订单项信息 + * @param orderId + * @param orderItemId + * @param giveawayList + * @return + */ + List mongoAndEsOrderRefundItems(@Param("orderId") Long orderId, @Param("orderItemId") Long orderItemId, @Param("giveawayList") List giveawayList); + + /** + * 根据信息列表 + * @param orderRefundSearchDTO + * @return + */ + List listUserOrderRefund(@Param("orderRefundSearchDTO") OrderRefundSearchDTO orderRefundSearchDTO); + + /** + * 根据订单单号列表获取退款订单列表 + * + * @param orderIds + * @return + */ + List listOrderRefundByOrderIds(@Param("orderIds") List orderIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderSelfStationMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderSelfStationMapper.java new file mode 100644 index 0000000..d17ac57 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderSelfStationMapper.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.order.model.OrderSelfStation; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 自提订单自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderSelfStationMapper { + + /** + * 获取自提订单自提点信息列表 + * @return 自提订单自提点信息列表 + */ + List list(); + + /** + * 根据自提订单自提点信息id获取自提订单自提点信息 + * + * @param id 自提订单自提点信息id + * @return 自提订单自提点信息 + */ + OrderSelfStationVO getById(@Param("id") Long id); + + /** + * 保存自提订单自提点信息 + * @param orderSelfStation 自提订单自提点信息 + */ + void save(@Param("orderSelfStation") OrderSelfStation orderSelfStation); + + + /** + * 批量保存自提订单自提点信息 + * + * @param orderSelfStations 自提订单自提点信息 + */ + void saveBatch(@Param("orderSelfStations") List orderSelfStations); + + /** + * 更新自提订单自提点信息 + * @param orderSelfStation 自提订单自提点信息 + */ + void update(@Param("orderSelfStation") OrderSelfStation orderSelfStation); + + /** + * 根据自提订单自提点信息id删除自提订单自提点信息 + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 根据用户id获取用户自提订单信息 + * + * @param userId 用户id + * @return 用户自提订单信息 + */ + List getStationUserInfo(@Param("userId") Long userId); + + /** + * 根据订单号获取用户自提订单信息 + * + * @param orderId 订单号 + * @return 用户自提订单信息 + */ + OrderSelfStationVO getStationByOrderId(@Param("orderId") Long orderId); + + /** + * 根据用户id获取用户自提信息 + * + * @param userId 用户id + * @return 用户自提信息 + */ + List getUserStation(@Param("userId") Long userId); + + /** + * 根据用户id获取待核销的自提订单 + * @param userId 用户id + * @param stationId 自提点id + * @param shopId 店铺id + * @return + */ + List getOrderSelfStationByStationIdOrShopId(@Param("userId") Long userId, @Param("stationId") Long stationId, @Param("shopId") Long shopId); + + /** + * 根据订单ids获取对应的自提信息 + * @param orderIds + * @return + */ + List listSelfStationByOrderIds(@Param("orderIds") List orderIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderSettlementMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderSettlementMapper.java new file mode 100644 index 0000000..748591e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/OrderSettlementMapper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.api.order.vo.OrderSettlementSimpleVO; +import com.tmerclub.cloud.order.model.OrderSettlement; +import com.tmerclub.cloud.order.vo.OrderSettlementVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单结算表 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderSettlementMapper { + + /** + * 获取订单结算表列表 + * + * @return 订单结算表列表 + */ + List list(); + + /** + * 根据订单结算表id获取订单结算表 + * + * @param settlementId 订单结算表id + * @return 订单结算表 + */ + OrderSettlementVO getBySettlementId(@Param("settlementId") Long settlementId); + + /** + * 更新订单结算表 + * + * @param orderSettlement 订单结算表 + */ + void update(@Param("orderSettlement") OrderSettlement orderSettlement); + + /** + * 根据订单结算表id删除订单结算表 + * + * @param settlementId + */ + void deleteById(@Param("settlementId") Long settlementId); + + /** + * 批量保存 + * + * @param orderSettlement 结算单 + */ + void save(@Param("orderSettlement") OrderSettlement orderSettlement); + + /** + * 批量保存 + * + * @param orderSettlements 结算单列表 + */ + void saveBatch(@Param("orderSettlements") List orderSettlements); + + /** + * 获取订单支付信息 + * + * @param orderId + * @return + */ + OrderSettlement getByOrderId(@Param("orderId") Long orderId); + + /** + * 更新为已支付状态 + * + * @param orderIds + * @param payId + * @param payType + * @param payIds 支付号集合 + * @param actualTotal + */ + void updateToPaySuccess(@Param("orderIds") List orderIds, @Param("payId") Long payId, @Param("payType") Integer payType, + @Param("payIds") String payIds, @Param("actualTotal") Long actualTotal); + + /** + * 根据支付单号列表获取订单号列表 + * + * @param userId + * @param payIds + * @return + */ + List listOrderIdsByPayIds(@Param("userId") Long userId, @Param("payIds") List payIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderAddrMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderAddrMapper.java new file mode 100644 index 0000000..f4cbdcb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderAddrMapper.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.PurchaseOrderAddr; +import org.apache.ibatis.annotations.Param; + +/** + * 采购订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface PurchaseOrderAddrMapper { + + + /** + * 根据采购订单配送地址id获取采购订单配送地址 + * + * @param purchaseOrderAddrId 采购订单配送地址id + * @return 采购订单配送地址 + */ + PurchaseOrderAddr getByPurchaseOrderAddrId(@Param("purchaseOrderAddrId") Long purchaseOrderAddrId); + + /** + * 保存采购订单配送地址 + * + * @param purchaseOrderAddr 采购订单配送地址 + */ + void save(@Param("purchaseOrderAddr") PurchaseOrderAddr purchaseOrderAddr); + + /** + * 更新采购订单配送地址 + * + * @param purchaseOrderAddr 采购订单配送地址 + */ + void update(@Param("purchaseOrderAddr") PurchaseOrderAddr purchaseOrderAddr); + + /** + * 根据采购订单配送地址id删除采购订单配送地址 + * + * @param purchaseOrderAddrId + */ + void deleteById(@Param("purchaseOrderAddrId") Long purchaseOrderAddrId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderItemLangMapper.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderItemLangMapper.java new file mode 100644 index 0000000..71cee47 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/mapper/PurchaseOrderItemLangMapper.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.mapper; + +import com.tmerclub.cloud.order.model.PurchaseOrderItemLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单项-国际化 + * + * @author lhd + * @date 2022-06-27 17:49:07 + */ +public interface PurchaseOrderItemLangMapper { + + /** + * 获取订单项-国际化列表 + * @return 订单项-国际化列表 + */ + List list(); + + /** + * 根据订单项-国际化id获取订单项-国际化 + * + * @param purchaseItemId 订单项-国际化id + * @return 订单项-国际化 + */ + PurchaseOrderItemLang getByPurchaseItemId(@Param("purchaseItemId") Long purchaseItemId); + + /** + * 保存订单项-国际化 + * @param purchaseOrderItemLang 订单项-国际化 + */ + void save(@Param("purchaseOrderItemLang") PurchaseOrderItemLang purchaseOrderItemLang); + + /** + * 更新订单项-国际化 + * @param purchaseOrderItemLang 订单项-国际化 + */ + void update(@Param("purchaseOrderItemLang") PurchaseOrderItemLang purchaseOrderItemLang); + + /** + * 根据订单项-国际化id删除订单项-国际化 + * @param purchaseItemId + */ + void deleteById(@Param("purchaseItemId") Long purchaseItemId); + + /** + * 保存订单项-国际化 + * @param orderItemLangList 订单项-国际化 + */ + void saveBatch(@Param("orderItemLangList") List orderItemLangList); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/AllotOrderItem.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/AllotOrderItem.java new file mode 100644 index 0000000..9859a0a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/AllotOrderItem.java @@ -0,0 +1,132 @@ +package com.tmerclub.cloud.order.model; + +import java.time.LocalDateTime; + +/** + * 调拨订单商品entity + * @author gaozijie + * @date 2023-11-20 + */ +public class AllotOrderItem { + + /** + * 调拨订单商品id + */ + private Long allotOrderItemId; + + /** + * 调拨订单id + */ + private Long allotOrderId; + + /** + * 商品spuId + */ + private Long spuId; + + /** + * 商品skuId + */ + private Long skuId; + + /** + * 调拨数量 + */ + private Integer allotCount; + + /** + * 调拨入库数量 + */ + private Integer allotInCount; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + public AllotOrderItem() { + } + + public Long getAllotOrderItemId() { + return allotOrderItemId; + } + + public void setAllotOrderItemId(Long allotOrderItemId) { + this.allotOrderItemId = allotOrderItemId; + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + public Integer getAllotInCount() { + return allotInCount; + } + + public void setAllotInCount(Integer allotInCount) { + this.allotInCount = allotInCount; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public LocalDateTime getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(LocalDateTime updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "AllotOrderItem{" + + "allotOrderItemId=" + allotOrderItemId + + ", allotOrderId=" + allotOrderId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", allotCount=" + allotCount + + ", allotInCount=" + allotInCount + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderAddr.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderAddr.java new file mode 100644 index 0000000..0197f61 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderAddr.java @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderAddr extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ID + */ + private Long orderAddrId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 收货人 + */ + @NotBlank(message = "收货人名称不能为空") + @Length(max = 50, message = "收货人名称字符长度不能超过50") + private String consignee; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区域ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 地址 + */ + @NotBlank(message = "地址不能为空") + @Length(max = 255, message = "地址长度不能超过255") + private String addr; + + /** + * 邮编 + */ + private String postCode; + + /** + * 手机 + */ + @NotBlank(message = "收货人手机不能为空") + @Length(max = 11, message = "收货人手机长度不能超过11") + private String mobile; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + + public Long getOrderAddrId() { + return orderAddrId; + } + + public void setOrderAddrId(Long orderAddrId) { + this.orderAddrId = orderAddrId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "OrderAddr{" + + "orderAddrId=" + orderAddrId + + ", userId=" + userId + + ", consignee='" + consignee + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", addr='" + addr + '\'' + + ", postCode='" + postCode + '\'' + + ", mobile='" + mobile + '\'' + + ", lng=" + lng + + ", lat=" + lat + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderItem.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderItem.java new file mode 100644 index 0000000..4f77945 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderItem.java @@ -0,0 +1,940 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 订单项 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +public class OrderItem extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单项ID + */ + private Long orderItemId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 产品ID + */ + private Long spuId; + + /** + * 产品SkuID + */ + private Long skuId; + + /** + * 用户Id + */ + private Long userId; + + /** + * 最终的退款id + */ + private Long finalRefundId; + + /** + * 推广员id + */ + private Long distributionUserId; + + /** + * 库存点id 自提:自提点id, 其他:仓库id + */ + private Long stockPointId; + + /** + * 购物车产品个数 + */ + private Integer count; + + /** + * 产品名称 + */ + private String spuName; + + /** + * sku名称 + */ + private String skuName; + + /** + * 产品主图片路径 + */ + private String pic; + + /** + * 是否以评价(0.未评价1.已评价) + */ + private Integer isComm; + + /** + * 评论时间 + */ + private Date commTime; + + /** + * 订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败) + */ + private Integer refundStatus; + + /** + * -1待发货 0全部发货 其他数量为剩余待发货数量 + */ + private Integer beDeliveredNum; + + /** + * 单个orderItem的配送类型 1:快递 2:自提 3:无需快递 4:同城配送 + */ + private Integer deliveryType; + + /** + * 加入购物车时间 + */ + private Date shopCartTime; + + /** + * 产品价格 + */ + private Long price; + + /** + * 商品总金额 + */ + private Long spuTotalAmount; + + /** + * 商品实际金额 = 商品总金额 - 分摊的优惠金额 + */ + private Long actualTotal; + + /** + * 分摊的优惠金额 + */ + private Long shareReduce; + + /** + * 平台优惠金额 + */ + private Long platformShareReduce; + + /** + * 推广员佣金 + */ + private Long distributionAmount; + + /** + * 上级推广员佣金 + */ + private Long distributionParentAmount; + + /** + * 积分价格(单价) + */ + private Long scoreFee; + + /** + * 使用积分 + */ + private Long useScore; + + /** + * 获得积分 + */ + private Long gainScore; + + /** + * 分账比例 + */ + private Double rate; + + /** + * 平台佣金(商品实际金额 * 分账比例) + */ + private Long platformCommission; + + /** + * 积分抵扣金额 + */ + private Long scoreAmount; + + /** + * 会员折扣金额 + */ + private Long memberAmount; + + /** + * 平台优惠券优惠金额 + */ + private Long platformCouponAmount; + + /** + * 商家优惠券优惠金额 + */ + private Long shopCouponAmount; + + /** + * 满减优惠金额 + */ + private Long discountAmount; + + + /** + * 商家运费减免金额 + */ + private Long freeFreightAmount; + + /** + * 平台运费减免金额 + */ + private Long platformFreeFreightAmount; + + /** + * 店铺改价优惠金额 + */ + private Long shopChangeFreeAmount; + + + /** + * 供应商商品发货方式 1.供应商发货 2.仓库发货 + */ + private Long itemPurchaseAmount; + + /** + * 是否待采购 1.是 0.否 + */ + private Long waitPurchase; + /** + * 供应商id + */ + private Long supplierId; + /** + * 供应商佣金比例 + */ + private Double supplierRate; + /** + * 供应商佣金金额 + */ + private Long purchasePlatformCommission; + /** + * 订单项国际化信息 + */ + private List orderItemLangList; + /** + * 商品编码 + */ + private String spuCode; + /** + * sku编码 + */ + private String partyCode; + /** + * 供应商商品id + */ + private Long supplierSpuId; + /** + * 供应商规格id + */ + private Long supplierSkuId; + /** + * 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 + */ + private Integer spuMold; + /** + * 是否可以退款 1.可以 0不可以 + */ + private Integer isRefund; + /** + * 虚拟商品的留言备注 + */ + private String virtualRemark; + /** + * 赠品金额 + */ + private Long giveawayAmount; + /** + * 主赠品 1:主赠品 0:赠品 + */ + private Integer mainGiveaway; + + /** + * 套餐优惠金额 + */ + private Long comboAmount; + + /** + * 活动id + */ + private Long activityId; + + /** + * 活动类型 OrderActivityType + */ + private Integer activityType; + + /** + * 供应商主商品图片 + */ + private String supplierPic; + + /** + * 供应商主商品名称 + */ + private String supplierSpuName; + + /** + * 供应商sku名称 + */ + private String supplierSkuName; + + /** + * 核销次数 -1.多次核销 0.无需核销 1.单次核销 + */ + private Integer writeOffNum; + + /** + * 多次核销次数 -1.无限次 + */ + private Integer writeOffMultipleCount; + + /** + * 核销开始时间 + */ + private Date writeOffStart; + + /** + * 核销结束时间 + */ + private Date writeOffEnd; +// +// /** +// * 主商品组合订单项id +// */ +// private Long mainComboItemId; + + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public Long getComboAmount() { + return comboAmount; + } + + public void setComboAmount(Long comboAmount) { + this.comboAmount = comboAmount; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + + public Long getGiveawayAmount() { + return giveawayAmount; + } + + public void setGiveawayAmount(Long giveawayAmount) { + this.giveawayAmount = giveawayAmount; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Double getSupplierRate() { + return supplierRate; + } + + public void setSupplierRate(Double supplierRate) { + this.supplierRate = supplierRate; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getItemPurchaseAmount() { + return itemPurchaseAmount; + } + + public void setItemPurchaseAmount(Long itemPurchaseAmount) { + this.itemPurchaseAmount = itemPurchaseAmount; + } + + public Long getWaitPurchase() { + return waitPurchase; + } + + public void setWaitPurchase(Long waitPurchase) { + this.waitPurchase = waitPurchase; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getFinalRefundId() { + return finalRefundId; + } + + public void setFinalRefundId(Long finalRefundId) { + this.finalRefundId = finalRefundId; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public Date getShopCartTime() { + return shopCartTime; + } + + public void setShopCartTime(Date shopCartTime) { + this.shopCartTime = shopCartTime; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getShareReduce() { + return shareReduce; + } + + public void setShareReduce(Long shareReduce) { + this.shareReduce = shareReduce; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getDistributionParentAmount() { + return distributionParentAmount; + } + + public void setDistributionParentAmount(Long distributionParentAmount) { + this.distributionParentAmount = distributionParentAmount; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Long getGainScore() { + return gainScore; + } + + public void setGainScore(Long gainScore) { + this.gainScore = gainScore; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + public Date getCommTime() { + return commTime; + } + + public void setCommTime(Date commTime) { + this.commTime = commTime; + } + + public List getOrderItemLangList() { + return orderItemLangList; + } + + public void setOrderItemLangList(List orderItemLangList) { + this.orderItemLangList = orderItemLangList; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Integer getMainGiveaway() { + return mainGiveaway; + } + + public void setMainGiveaway(Integer mainGiveaway) { + this.mainGiveaway = mainGiveaway; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + @Override + public String toString() { + return "OrderItem{" + + "orderItemId=" + orderItemId + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", categoryId=" + categoryId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", userId=" + userId + + ", finalRefundId=" + finalRefundId + + ", distributionUserId=" + distributionUserId + + ", stockPointId=" + stockPointId + + ", count=" + count + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", pic='" + pic + '\'' + + ", isComm=" + isComm + + ", commTime=" + commTime + + ", refundStatus=" + refundStatus + + ", beDeliveredNum=" + beDeliveredNum + + ", deliveryType=" + deliveryType + + ", shopCartTime=" + shopCartTime + + ", price=" + price + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", shareReduce=" + shareReduce + + ", platformShareReduce=" + platformShareReduce + + ", distributionAmount=" + distributionAmount + + ", distributionParentAmount=" + distributionParentAmount + + ", scoreFee=" + scoreFee + + ", useScore=" + useScore + + ", gainScore=" + gainScore + + ", rate=" + rate + + ", platformCommission=" + platformCommission + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", itemPurchaseAmount=" + itemPurchaseAmount + + ", waitPurchase=" + waitPurchase + + ", supplierId=" + supplierId + + ", supplierRate=" + supplierRate + + ", purchasePlatformCommission=" + purchasePlatformCommission + + ", orderItemLangList=" + orderItemLangList + + ", spuCode='" + spuCode + '\'' + + ", partyCode='" + partyCode + '\'' + + ", supplierSpuId=" + supplierSpuId + + ", supplierSkuId=" + supplierSkuId + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", virtualRemark='" + virtualRemark + '\'' + + ", giveawayAmount=" + giveawayAmount + + ", mainGiveaway=" + mainGiveaway + + ", comboAmount=" + comboAmount + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefund.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefund.java new file mode 100644 index 0000000..0ed8f49 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefund.java @@ -0,0 +1,690 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.api.payment.constant.PaySysType; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单退款记录信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderRefund extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款记录ID + */ + private Long refundId; + + /** + * 店铺ID + */ + private Long shopId; + /** + * 供应商id + */ + private Long supplierId; + + /** + * 买家ID + */ + private Long userId; + + /** + * 订单号 + */ + private Long orderId; + + /** + * 订单项ID(0:为全部订单项) + */ + private Long orderItemId; + + /** + * 支付系统类型 + * + * @see PaySysType + */ + private Integer paySysType; + + /** + * 退货数量(0:为全部订单项) + */ + private Integer refundCount; + + /** + * 退还积分 + */ + private Long refundScore; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额) + */ + private Long platformRefundAmount; + + /** + * 平台退款佣金 + */ + private Long platformRefundCommission; + + /** + * 退款单总分销金额 + */ + private Long distributionTotalAmount; + + /** + * 退款单类型(1:整单退款,2:单个物品退款) + */ + private Integer refundType; + + /** + * 申请类型:1,仅退款,2退款退货 + */ + private Integer applyType; + + /** + * 是否接收到商品(1:已收到,0:未收到) + */ + private Integer isReceived; + + /** + * 退款关闭原因(1.买家撤销退款 2.卖家拒绝退款 3.退款申请超时被系统关闭) + */ + private Integer closeType; + + /** + * 处理退款状态:(1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭)详情见ReturnMoneyStsType + */ + private Integer returnMoneySts; + + /** + * 申请原因 见 BuyerReasonType + */ + private Integer buyerReason; + + /** + * 申请说明 + */ + private String buyerDesc; + + /** + * 联系方式(退款时留下的手机号码) + */ + private String buyerMobile; + + /** + * 文件凭证(逗号隔开) + */ + private String imgUrls; + + /** + * 商家/供应商文件凭证(逗号隔开) + */ + private String shopImgUrls; + + /** + * 超时时间(超过该时间不处理,系统将自动处理)(保留字段) + */ + private Date overTime; + + /** + * 拒绝原因 + */ + private String rejectMessage; + + /** + * 卖家备注 + */ + private String sellerMsg; + + /** + * 受理时间 + */ + private Date handelTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 收货时间 + */ + private Date receiveTime; + + /** + * 关闭时间 + */ + private Date closeTime; + + /** + * 确定时间(确定退款时间) + */ + private Date decisionTime; + + /** + * 退款时间 + */ + private Date refundTime; + + /** + * 移交供应商时间 + */ + private Date supplierTime; + + /** + * 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + */ + private Integer supplierHandleStatus; + /** + * 采购退款金额 + */ + private Long purchaseRefundAmount; + /** + * 采购的平台佣金退款金额 + */ + private Long purPlatformRefundCommission; + + /** + * 退款退回的赠品订单项ids + */ + private String returnGiveawayIds; + + /** + * 当前退款的实付金额(实付金额减去不退回赠品的金额) + */ + private Long refundActualTotal; + + /** + * 商家备注(商家将退款单移交供应商处理时保存) + */ + private String shopSellerMsg; + + /** + * 平台介入状态 -1.没有介入 1.用户申请介入 2.平台同意介入 3.平台拒绝介入 5.平台同意退款成功 + */ + private Integer platformInterventionStatus; + + /** + * 用户申请介入理由 + */ + private String applyInterventionReason; + + /** + * 用户申请介入凭证 + */ + private String applyInterventionImgUrls; + + /** + * 平台介入退款方式 1.商家承担 2.商家供应商承担(供应商发货订单) 3.不同意退款 + */ + private Integer interventionRefundType; + + /** + * 平台介入前的退款金额 + */ + private Long afterInterventionRefundAmount; + + /** + * 平台留言 + */ + private String platformMessage; + + /** + * 申请介入时间 + */ + private Date applyInterventionTime; + + /** + * 介入完成时间 + */ + private Date interventionFinishTime; + + public String getShopImgUrls() { + return shopImgUrls; + } + + public void setShopImgUrls(String shopImgUrls) { + this.shopImgUrls = shopImgUrls; + } + + public String getApplyInterventionImgUrls() { + return applyInterventionImgUrls; + } + + public void setApplyInterventionImgUrls(String applyInterventionImgUrls) { + this.applyInterventionImgUrls = applyInterventionImgUrls; + } + + public String getApplyInterventionReason() { + return applyInterventionReason; + } + + public void setApplyInterventionReason(String applyInterventionReason) { + this.applyInterventionReason = applyInterventionReason; + } + + public String getPlatformMessage() { + return platformMessage; + } + + public void setPlatformMessage(String platformMessage) { + this.platformMessage = platformMessage; + } + + public Integer getInterventionRefundType() { + return interventionRefundType; + } + + public void setInterventionRefundType(Integer interventionRefundType) { + this.interventionRefundType = interventionRefundType; + } + + public Long getAfterInterventionRefundAmount() { + return afterInterventionRefundAmount; + } + + public void setAfterInterventionRefundAmount(Long afterInterventionRefundAmount) { + this.afterInterventionRefundAmount = afterInterventionRefundAmount; + } + + public Date getApplyInterventionTime() { + return applyInterventionTime; + } + + public void setApplyInterventionTime(Date applyInterventionTime) { + this.applyInterventionTime = applyInterventionTime; + } + + public Integer getPlatformInterventionStatus() { + return platformInterventionStatus; + } + + public void setPlatformInterventionStatus(Integer platformInterventionStatus) { + this.platformInterventionStatus = platformInterventionStatus; + } + + public Date getInterventionFinishTime() { + return interventionFinishTime; + } + + public void setInterventionFinishTime(Date interventionFinishTime) { + this.interventionFinishTime = interventionFinishTime; + } + + public String getReturnGiveawayIds() { + return returnGiveawayIds; + } + + public void setReturnGiveawayIds(String returnGiveawayIds) { + this.returnGiveawayIds = returnGiveawayIds; + } + + public Long getRefundActualTotal() { + return refundActualTotal; + } + + public void setRefundActualTotal(Long refundActualTotal) { + this.refundActualTotal = refundActualTotal; + } + + public Date getSupplierTime() { + return supplierTime; + } + + public void setSupplierTime(Date supplierTime) { + this.supplierTime = supplierTime; + } + + public Long getPurPlatformRefundCommission() { + return purPlatformRefundCommission; + } + + public void setPurPlatformRefundCommission(Long purPlatformRefundCommission) { + this.purPlatformRefundCommission = purPlatformRefundCommission; + } + + public Long getPurchaseRefundAmount() { + return purchaseRefundAmount; + } + + public void setPurchaseRefundAmount(Long purchaseRefundAmount) { + this.purchaseRefundAmount = purchaseRefundAmount; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSupplierHandleStatus() { + return supplierHandleStatus; + } + + public void setSupplierHandleStatus(Integer supplierHandleStatus) { + this.supplierHandleStatus = supplierHandleStatus; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + public Long getPlatformRefundCommission() { + return platformRefundCommission; + } + + public void setPlatformRefundCommission(Long platformRefundCommission) { + this.platformRefundCommission = platformRefundCommission; + } + + public Long getDistributionTotalAmount() { + return distributionTotalAmount; + } + + public void setDistributionTotalAmount(Long distributionTotalAmount) { + this.distributionTotalAmount = distributionTotalAmount; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public Integer getApplyType() { + return applyType; + } + + public void setApplyType(Integer applyType) { + this.applyType = applyType; + } + + public Integer getIsReceived() { + return isReceived; + } + + public void setIsReceived(Integer isReceived) { + this.isReceived = isReceived; + } + + public Integer getCloseType() { + return closeType; + } + + public void setCloseType(Integer closeType) { + this.closeType = closeType; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(Integer buyerReason) { + this.buyerReason = buyerReason; + } + + public String getBuyerDesc() { + return buyerDesc; + } + + public void setBuyerDesc(String buyerDesc) { + this.buyerDesc = buyerDesc; + } + + public String getBuyerMobile() { + return buyerMobile; + } + + public void setBuyerMobile(String buyerMobile) { + this.buyerMobile = buyerMobile; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public Date getOverTime() { + return overTime; + } + + public void setOverTime(Date overTime) { + this.overTime = overTime; + } + + public String getRejectMessage() { + return rejectMessage; + } + + public void setRejectMessage(String rejectMessage) { + this.rejectMessage = rejectMessage; + } + + public String getSellerMsg() { + return sellerMsg; + } + + public void setSellerMsg(String sellerMsg) { + this.sellerMsg = sellerMsg; + } + + public Date getHandelTime() { + return handelTime; + } + + public void setHandelTime(Date handelTime) { + this.handelTime = handelTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public Date getCloseTime() { + return closeTime; + } + + public void setCloseTime(Date closeTime) { + this.closeTime = closeTime; + } + + public Date getDecisionTime() { + return decisionTime; + } + + public void setDecisionTime(Date decisionTime) { + this.decisionTime = decisionTime; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Long getRefundScore() { + return refundScore; + } + + public void setRefundScore(Long refundScore) { + this.refundScore = refundScore; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public String getShopSellerMsg() { + return shopSellerMsg; + } + + public void setShopSellerMsg(String shopSellerMsg) { + this.shopSellerMsg = shopSellerMsg; + } + + @Override + public String toString() { + return "OrderRefund{" + + "refundId=" + refundId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", userId=" + userId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", paySysType=" + paySysType + + ", refundCount=" + refundCount + + ", refundScore=" + refundScore + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", platformRefundCommission=" + platformRefundCommission + + ", distributionTotalAmount=" + distributionTotalAmount + + ", refundType=" + refundType + + ", applyType=" + applyType + + ", isReceived=" + isReceived + + ", closeType=" + closeType + + ", returnMoneySts=" + returnMoneySts + + ", buyerReason=" + buyerReason + + ", buyerDesc='" + buyerDesc + '\'' + + ", buyerMobile='" + buyerMobile + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", shopImgUrls='" + shopImgUrls + '\'' + + ", overTime=" + overTime + + ", rejectMessage='" + rejectMessage + '\'' + + ", sellerMsg='" + sellerMsg + '\'' + + ", handelTime=" + handelTime + + ", deliveryTime=" + deliveryTime + + ", receiveTime=" + receiveTime + + ", closeTime=" + closeTime + + ", decisionTime=" + decisionTime + + ", refundTime=" + refundTime + + ", supplierTime=" + supplierTime + + ", supplierHandleStatus=" + supplierHandleStatus + + ", purchaseRefundAmount=" + purchaseRefundAmount + + ", purPlatformRefundCommission=" + purPlatformRefundCommission + + ", returnGiveawayIds='" + returnGiveawayIds + '\'' + + ", refundActualTotal=" + refundActualTotal + + ", shopSellerMsg='" + shopSellerMsg + '\'' + + ", platformInterventionStatus=" + platformInterventionStatus + + ", applyInterventionReason='" + applyInterventionReason + '\'' + + ", applyInterventionImgUrls='" + applyInterventionImgUrls + '\'' + + ", interventionRefundType=" + interventionRefundType + + ", afterInterventionRefundAmount=" + afterInterventionRefundAmount + + ", platformMessage='" + platformMessage + '\'' + + ", applyInterventionTime=" + applyInterventionTime + + ", interventionFinishTime=" + interventionFinishTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundIntervention.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundIntervention.java new file mode 100644 index 0000000..e7ea678 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundIntervention.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单退款平台介入相关介入信息 + * + * @author lhd + * @date 2023-08-24 14:13:50 + */ +public class OrderRefundIntervention extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款介入记录ID + */ + private Long refundIntervertionId; + /** + * 商家/供应商/用户id + */ + private Long bizId; + /** + * 系统类型 + */ + private Integer sysType; + /** + * 退款号 + */ + private Long refundId; + /** + * 凭证说明 + */ + private String voucherDesc; + /** + * 文件凭证 + */ + private String imgUrls; + + public Long getRefundIntervertionId() { + return refundIntervertionId; + } + + public void setRefundIntervertionId(Long refundIntervertionId) { + this.refundIntervertionId = refundIntervertionId; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public String getVoucherDesc() { + return voucherDesc; + } + + public void setVoucherDesc(String voucherDesc) { + this.voucherDesc = voucherDesc; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + @Override + public String toString() { + return "OrderRefundIntervention{" + + "refundIntervertionId=" + refundIntervertionId + + ", bizId=" + bizId + + ", sysType=" + sysType + + ", refundId=" + refundId + + ", reason='" + voucherDesc + '\'' + + ", imgUrls='" + imgUrls + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundSettlement.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundSettlement.java new file mode 100644 index 0000000..7a55e09 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderRefundSettlement.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 退款支付结算单据 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderRefundSettlement extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款结算单据id + */ + private Long settlementId; + + /** + * 订单支付单号 + */ + private Long payId; + + /** + * 订单编号 + */ + private Long orderId; + + /** + * 退款单编号(本系统退款单号) + */ + private Long refundId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 微信/支付宝退款单号(支付平台退款单号) + */ + private String bizRefundNo; + + /** + * 支付方式(1:微信支付 2支付宝支付) + */ + private Integer payType; + + /** + * 退款状态(1:申请中 2:已完成 -1失败) + */ + private Integer refundStatus; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 订单总额 + */ + private Long orderTotalAmount; + + /** + * 版本号 + */ + private Integer version; + + public Long getSettlementId() { + return settlementId; + } + + public void setSettlementId(Long settlementId) { + this.settlementId = settlementId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getBizRefundNo() { + return bizRefundNo; + } + + public void setBizRefundNo(String bizRefundNo) { + this.bizRefundNo = bizRefundNo; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Long getOrderTotalAmount() { + return orderTotalAmount; + } + + public void setOrderTotalAmount(Long orderTotalAmount) { + this.orderTotalAmount = orderTotalAmount; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public String toString() { + return "OrderRefundSettlement{" + + "settlementId=" + settlementId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",payId=" + payId + + ",orderId=" + orderId + + ",refundId=" + refundId + + ",userId=" + userId + + ",bizRefundNo=" + bizRefundNo + + ",payType=" + payType + + ",refundStatus=" + refundStatus + + ",refundAmount=" + refundAmount + + ",orderTotalAmount=" + orderTotalAmount + + ",version=" + version + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderReturnReason.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderReturnReason.java new file mode 100644 index 0000000..2280d9a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderReturnReason.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 退款原因 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderReturnReason extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单退款原因ID + */ + private Long reasonId; + + /** + * 退货原因名 + */ + private String reason; + + /** + * 排序 + */ + private Integer seq; + + /** + * 启用状态 + */ + private Integer status; + + /** + * 优惠总额 + */ + private Long reduceAmount; + + public Long getReasonId() { + return reasonId; + } + + public void setReasonId(Long reasonId) { + this.reasonId = reasonId; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + @Override + public String toString() { + return "OrderReturnReason{" + + "reasonId=" + reasonId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",reason=" + reason + + ",seq=" + seq + + ",status=" + status + + ",reduceAmount=" + reduceAmount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderSettlement.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderSettlement.java new file mode 100644 index 0000000..c5e354a --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderSettlement.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单结算表 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderSettlement extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付结算单据ID + */ + private Long settlementId; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 支付单号 + */ + private Long payId; + + /** + * 支付单号集合 + */ + private String payIds; + + /** + * 是否清算 0:否 1:是 + */ + private Integer isClearing; + + /** + * 支付积分 + */ + private Long payScore; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 清算时间 + */ + private Date clearingTime; + + /** + * 版本号 + */ + private Integer version; + + /** + * 支付方式 + */ + private Integer payType; + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Long getSettlementId() { + return settlementId; + } + + public void setSettlementId(Long settlementId) { + this.settlementId = settlementId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getIsClearing() { + return isClearing; + } + + public void setIsClearing(Integer isClearing) { + this.isClearing = isClearing; + } + + public Long getPayScore() { + return payScore; + } + + public void setPayScore(Long payScore) { + this.payScore = payScore; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Date getClearingTime() { + return clearingTime; + } + + public void setClearingTime(Date clearingTime) { + this.clearingTime = clearingTime; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + @Override + public String toString() { + return "OrderSettlement{" + + "settlementId=" + settlementId + + ", userId=" + userId + + ", orderId=" + orderId + + ", payId=" + payId + + ", payIds='" + payIds + '\'' + + ", isClearing=" + isClearing + + ", payScore=" + payScore + + ", payAmount=" + payAmount + + ", clearingTime=" + clearingTime + + ", version=" + version + + ", payType=" + payType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderVirtualInfo.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderVirtualInfo.java new file mode 100644 index 0000000..fb84365 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/OrderVirtualInfo.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 虚拟订单核销信息 + * + * @author lhd + * @date 2023-02-24 13:45:35 + */ +public class OrderVirtualInfo extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long orderVirtualInfoId; + /** + * 订单id + */ + private Long orderId; + /** + * 订单项id + */ + private Long orderItemId; + /** + * 店铺id + */ + private Long shopId; + /** + * 门店id + */ + private Long stationId; + /** + * 核销码 + */ + private String writeOffCode; + + /** + * 剩余的多次核销次数 + */ + private Integer writeOffMultipleCount; + + /** + * 是否核销 1.已核销 0.未核销 + */ + private Integer isWriteOff; + /** + * 创建时间 + */ + private Date createTime; + /** + * 核销时间 + */ + private Date writeOffTime; + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getOrderVirtualInfoId() { + return orderVirtualInfoId; + } + + public void setOrderVirtualInfoId(Long orderVirtualInfoId) { + this.orderVirtualInfoId = orderVirtualInfoId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Integer getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Integer isWriteOff) { + this.isWriteOff = isWriteOff; + } + + @Override + public Date getCreateTime() { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Date writeOffTime) { + this.writeOffTime = writeOffTime; + } + + @Override + public String toString() { + return "OrderVirtualInfo{" + + "orderVirtualInfoId=" + orderVirtualInfoId + + ", orderId=" + orderId + + ", orderItemId=" + orderItemId + + ", shopId=" + shopId + + ", stationId=" + stationId + + ", writeOffCode='" + writeOffCode + '\'' + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", isWriteOff=" + isWriteOff + + ", createTime=" + createTime + + ", writeOffTime=" + writeOffTime + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderAddr.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderAddr.java new file mode 100644 index 0000000..e6fde1d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderAddr.java @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import jakarta.validation.constraints.NotBlank; +import org.hibernate.validator.constraints.Length; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class PurchaseOrderAddr extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * ID + */ + private Long purchaseOrderAddrId; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 收货人 + */ + @NotBlank(message = "收货人名称不能为空") + @Length(max = 50, message = "收货人名称字符长度不能超过50") + private String consignee; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区域ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 地址 + */ + @NotBlank(message = "地址不能为空") + @Length(max = 255, message = "地址长度不能超过255") + private String addr; + + /** + * 手机 + */ + @NotBlank(message = "收货人手机不能为空") + @Length(max = 11, message = "收货人手机长度不能超过11") + private String mobile; + + public Long getPurchaseOrderAddrId() { + return purchaseOrderAddrId; + } + + public void setPurchaseOrderAddrId(Long purchaseOrderAddrId) { + this.purchaseOrderAddrId = purchaseOrderAddrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "PurchaseOrderAddr{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", purchaseOrderAddrId=" + purchaseOrderAddrId + + ", shopId=" + shopId + + ", consignee='" + consignee + '\'' + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + ", addr='" + addr + '\'' + + ", mobile='" + mobile + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderItemLang.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderItemLang.java new file mode 100644 index 0000000..8fe2f29 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderItemLang.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 订单项-国际化 + * + * @author lhd + * @date 2022-06-27 17:49:07 + */ +public class PurchaseOrderItemLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单项ID + */ + private Long purchaseItemId; + + /** + * 语言 1.中文 2.英文 + */ + private Integer lang; + + /** + * 商品名称 + */ + private String spuName; + + /** + * sku名称 + */ + private String skuName; + + public Long getPurchaseItemId() { + return purchaseItemId; + } + + public void setPurchaseItemId(Long purchaseItemId) { + this.purchaseItemId = purchaseItemId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + @Override + public String toString() { + return "PurchaseOrderItemLang{" + + "purchaseItemId=" + purchaseItemId + + ",lang=" + lang + + ",spuName=" + spuName + + ",skuName=" + skuName + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderLang.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderLang.java new file mode 100644 index 0000000..f95ffbb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/PurchaseOrderLang.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 采购订单-国际化 + * + * @author lhd + * @date 2022-07-12 13:57:20 + */ +public class PurchaseOrderLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long purchaseOrderId; + + /** + * + */ + private Integer lang; + + /** + * 商品名称 + */ + private String spuName; + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + @Override + public String toString() { + return "PurchaseOrderLang{" + + "purchaseOrderId=" + purchaseOrderId + + ",lang=" + lang + + ",prodName=" + spuName + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/SpuPriceLog.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/SpuPriceLog.java new file mode 100644 index 0000000..d032b77 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/model/SpuPriceLog.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品调价记录 + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +public class SpuPriceLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品调价记录id + */ + private Long id; + + /** + * 商品id + */ + private Long spuId; + + /** + * 规格id + */ + private Long skuId; + + /** + * 原供货价 + */ + private Long beforePrice; + + /** + * 现供货价 + */ + private Long afterPrice; + + /** + * 差价 + */ + private Long price; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getBeforePrice() { + return beforePrice; + } + + public void setBeforePrice(Long beforePrice) { + this.beforePrice = beforePrice; + } + + public Long getAfterPrice() { + return afterPrice; + } + + public void setAfterPrice(Long afterPrice) { + this.afterPrice = afterPrice; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "SpuPriceLog{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",beforePrice=" + beforePrice + + ",afterPrice=" + afterPrice + + ",price=" + price + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/AllotOrderItemService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/AllotOrderItemService.java new file mode 100644 index 0000000..90383e5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/AllotOrderItemService.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.order.dto.AllotOrderItemDTO; + +import java.util.List; + +/** + * @author gaozijie + * @date 2023-11-20 + */ +public interface AllotOrderItemService { + + /** + * 批量新增调拨订单商品 + * @param allotOrderItemDTOList 调拨订单商品dto集合 + */ + void addBatchAllotOrderItem(List allotOrderItemDTOList); + + /** + * 批量更新调拨订单商品 + * @param allotOrderItemDTOList 调拨订单商品dto集合 + */ + void updateBatchAllotOrderItem(List allotOrderItemDTOList); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderExcelService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderExcelService.java new file mode 100644 index 0000000..8c1d1be --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderExcelService.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.order.vo.UnDeliveryOrderExcelVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.List; +import java.util.Map; + +/** + * 订单excel + * + * @author Pineapple + * @date 2021/7/20 8:48 + */ +public interface OrderExcelService { + + /** + * 获取待发货的订单信息列表(excel) + * + * @param response + * @param orderSearchDTO 搜索参数 + */ + void excelUnDeliveryOrderList(HttpServletResponse response, OrderSearchDTO orderSearchDTO); + + /** + * 导入待发货订单 + * + * @param list + * @param errorMap + */ + void exportOrderExcel(List list, Map> errorMap); + + /** + * 待发货订单导入的错误信息 + * + * @param errorMap + * @return + */ + String orderExportError(Map> errorMap); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderFinanceService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderFinanceService.java new file mode 100644 index 0000000..3c7bfc0 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderFinanceService.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; + +import java.util.List; + +/** + * @author TRACK + */ +public interface OrderFinanceService { + + /** + * 分页获取财务明细 + * @param pageDTO + * @param financeDetailDTO + * @return + */ + PageVO pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO); + + /** + * 获取导出财务明细列表 + * @param financeDetailDTO + * @return + */ + List listExcelFinanceDetail(FinanceDetailDTO financeDetailDTO); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundAddrService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundAddrService.java new file mode 100644 index 0000000..0cf798f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundAddrService.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.model.OrderRefundAddr; + +/** + * 用户退货物流地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 13:44:31 + */ +public interface OrderRefundAddrService { + + /** + * 分页获取用户退货物流地址列表 + * @param pageDTO 分页参数 + * @return 用户退货物流地址列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据用户退货物流地址id获取用户退货物流地址 + * + * @param refundAddrId 用户退货物流地址id + * @return 用户退货物流地址 + */ + OrderRefundAddr getByRefundAddrId(Long refundAddrId); + + /** + * 保存用户退货物流地址 + * @param orderRefundAddr 用户退货物流地址 + */ + void save(OrderRefundAddr orderRefundAddr); + + /** + * 更新用户退货物流地址 + * @param orderRefundAddr 用户退货物流地址 + */ + void update(OrderRefundAddr orderRefundAddr); + + /** + * 根据用户退货物流地址id删除用户退货物流地址 + * @param refundAddrId 用户退货物流地址id + */ + void deleteById(Long refundAddrId); + + /** + * 根据退款订单id获取退款地址信息 + * @param refundId + * @return + */ + OrderRefundAddr getByRefundId(Long refundId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundService.java new file mode 100644 index 0000000..aceace2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderRefundService.java @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO; +import com.tmerclub.cloud.api.order.vo.AccountOrderDetailVO; +import com.tmerclub.cloud.api.order.vo.OrderRefundProdEffectRespVO; +import com.tmerclub.cloud.api.order.vo.OrderRefundSimpleVO; +import com.tmerclub.cloud.api.order.vo.PageShopAccountOrderVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.bo.RefundNotifyBO; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderRefund; +import com.tmerclub.cloud.order.model.OrderRefundAddr; +import com.tmerclub.cloud.order.model.OrderSettlement; +import com.tmerclub.cloud.order.vo.OrderRefundVO; + +import java.util.Date; +import java.util.List; + +/** + * 订单退款记录信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderRefundService { + + /** + * 分页获取订单退款记录信息列表 + * + * @param pageDTO 分页参数 + * @param orderRefundPageDTO + * @return 订单退款记录信息列表分页数据 + */ + EsPageVO page(PageDTO pageDTO, OrderRefundSearchDTO orderRefundPageDTO); + + /** + * 根据订单退款记录信息id获取订单退款记录信息 + * + * @param refundId 订单退款记录信息id + * @return 订单退款记录信息 + */ + OrderRefundVO getByRefundId(Long refundId); + + /** + * 根据订单退款记录信息id获取订单退款记录信息 详情,包括订单项,订单信息等 + * + * @param refundId 订单退款记录信息id + * @return 订单退款记录信息 + */ + OrderRefundVO getDetailByRefundId(Long refundId); + + /** + * 保存订单退款记录信息 + * + * @param orderRefund 订单退款记录信息 + */ + void save(OrderRefund orderRefund); + + /** + * 更新订单退款记录信息 + * + * @param orderRefund 订单退款记录信息 + */ + void update(OrderRefund orderRefund); + + /** + * 获取该退款单号是否为最后一个订单项 + * + * @param refundSn + * @param shopId + * @return + */ + Boolean getIsLastRefund(Long refundSn, Long shopId); + + /** + * 根据订单退款记录信息id删除订单退款记录信息 + * + * @param refundId + */ + void deleteById(Long refundId); + + /** + * 校验订单是否在退款时间内,是否可以进行申请退款 + * + * @param order 订单信息 + * @return + */ + boolean checkRefundDate(Order order); + + /** + * 根据订单id,获取正在退款中或退款成功的订单 + * + * @param orderId + * @return + */ + List getProcessOrderRefundByOrderId(Long orderId); + + /** + * 生成退款单 + * + * @param orderRefund 退款对象 + */ + void applyRefund(OrderRefund orderRefund); + + /** + * 买家提交物流信息 + * + * @param orderRefund 退款单对象 + * @param orderRefundAddr 退款物流单对象 + */ + void submitExpress(OrderRefund orderRefund, OrderRefundAddr orderRefundAddr); + + /** + * 获取订单正在进行退款的退款数量 + * + * @param returnMoneySts + * @param returnMoneySts2 + * @param orderId + * @return + */ + Integer countByReturnMoneyStsAndOrderId(Integer returnMoneySts, Integer returnMoneySts2, Long orderId); + + /** + * 订单退款成功处理 + * + * @param refundNotifyBO + */ + void refundSuccess(RefundNotifyBO refundNotifyBO); + + /** + * 用户取消退款 + * + * @param orderRefundVO + */ + void cancelRefund(OrderRefundVO orderRefundVO); + + /** + * 商家拒绝退款 + * + * @param orderRefundParam + * @param orderRefundVo + */ + void disagreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo); + + /** + * 平台拒绝介入 + * + * @param orderRefundParam + * @param orderRefundVo + */ + void disagreeIntervention(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVo); + + /** + * 商家同意退款 + * + * @param orderRefundParam + * @param orderRefundVo + * @return + */ + ServerResponseEntity agreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo); + + /** + * 移交供应商处理,改变下状态即可 + * + * @param orderRefundParam + * @param orderRefundVo + */ + void transferRefundOrderToSupplier(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo); + + /** + * 商家同意退货,并返回一个退货地址 + * + * @param orderRefundParam + * @param orderRefundVo + * @param sysType + */ + void agreeReturns(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo, Integer sysType); + + /** + * 同意退款 + * + * @param orderRefundVO + * @param orderRefundParam + * @return 是否成功 + */ + int agreeRefund(OrderRefundVO orderRefundVO, OrderRefundDTO orderRefundParam); + /** + * 获取退款状态 + * + * @param refundId + * @return + */ + Integer getRefundStatus(Long refundId); + + /** + * 创建未曾团而退款的团购订单 + * + * @param refundNotifyBO 退款 + */ + void createGroupUnSuccessRefundInfo(RefundNotifyBO refundNotifyBO); + + /** + * 通过订单id获取正在处理中的退款订单 + * + * @param orderId 订单id + * @return 正在处理中的退款订单 + */ + List getProcessingOrderRefundByOrderId(Long orderId); + + /** + * 通过订单id获取正在处理中和退款平台介入拒绝的退款订单 + * + * @param orderId 订单id + * @return 正在处理中的退款订单 + */ + List listOrderRefundByOrderId(Long orderId); + + /** + * 获取订单的移交供应商处理的状态 + * + * @param orderId 订单id + * @return 移交供应商处理的状态 + */ + Integer getSupplierHandleStatusByOrderId(Long orderId); + + /** + * 根据参数获取商品退款订单数据分析 + * + * @param spuIds 商品id列表 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 商品退款订单数据 + */ + List getProdRefundEffectByDateAndProdIds(List spuIds, Date startTime, Date endTime); + + /** + * 根据订单id及退款状态,获取订单退款信息 + * + * @param orderId 订单id + * @param returnMoneySts 退款状态 + * @return 订单退款数据列表 + */ + List getOrderRefundByOrderIdAndRefundStatus(Long orderId, Integer returnMoneySts); + + /** + * 根据退款单号列表获取订单号列表 + * + * @param refundIds + * @return + */ + List listOrderIdsByRefundIds(List refundIds); + + /** + * 处理的超时申请的退款订单 + * + * @param orderRefundDb 超时退款订单 + */ + void cancelWhenTimeOut(OrderRefundVO orderRefundDb); + + /** + * 退款信息 + * + * @param refundId 退款编号 + * @return 获取退款信息 + */ + com.tmerclub.cloud.api.order.vo.OrderRefundVO getOrderRefundByRefundId(Long refundId); + + /** + * 获取退款成功总数 + * + * @param orderId + * @return + */ + int countSuccessItemNum(Long orderId); + + /** + * 获取mongodb和es的退款订单信息 + * + * @param refundId + * @return + */ + EsOrderRefundBO saveMongoAndGetEsOrderRefundInfo(Long refundId); + + /** + * 用户退款订单列表查询 + * + * @param pageDTO + * @param orderRefundSearchDTO + * @return + */ + PageVO userOrderRefundPage(PageDTO pageDTO, OrderRefundSearchDTO orderRefundSearchDTO); + + /** + * 获取财务对账信息 + * + * @param startTime + * @param endTime + * @param shopName + * @param shopId + * @return + */ + AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId); + + /** + * 获取店铺财务对账信息 + * + * @param startTime + * @param endTime + * @param shopName + * @param pageSize + * @param pageNum + * @return + */ + PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum); + + /** + * 获取店铺财务对账详情 + * + * @param startTime + * @param endTime + * @param shopId + * @param shopName + * @param pageSize + * @param pageNum + * @return + */ + PageShopAccountOrderVO listOrderRefundInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum); + + /** + * 发放退款 + * @param refundId + */ + void refundRequest(Long refundId); + + /** + * 供应商退款订单设置数值 + * @param orderRefundVo + * @param orderSettlement + */ + void setSupplierOrderRefundInfo(OrderRefundVO orderRefundVo, OrderSettlement orderSettlement); + + /** + * 申请平台介入 + * + * @param orderRefundParam + * @param orderRefundVO + */ + void applyPlatormIntervertion(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO); + + /** + * 撤销平台介入 + * + * @param orderRefundParam + * @param orderRefundVO + */ + void cacelPlatormIntervertion(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO); + + /** + * 根据订单单号列表获取退款订单列表 + * @param orderIds + * @return + */ + List listOrderRefundByOrderIds(List orderIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderReturnReasonService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderReturnReasonService.java new file mode 100644 index 0000000..ea1db48 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderReturnReasonService.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.model.OrderReturnReason; +import com.tmerclub.cloud.order.vo.OrderReturnReasonVO; + +/** + * 退款原因 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderReturnReasonService { + + /** + * 分页获取退款原因列表 + * @param pageDTO 分页参数 + * @return 退款原因列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据退款原因id获取退款原因 + * + * @param reasonId 退款原因id + * @return 退款原因 + */ + OrderReturnReasonVO getByReasonId(Long reasonId); + + /** + * 保存退款原因 + * @param orderReturnReason 退款原因 + */ + void save(OrderReturnReason orderReturnReason); + + /** + * 更新退款原因 + * @param orderReturnReason 退款原因 + */ + void update(OrderReturnReason orderReturnReason); + + /** + * 根据退款原因id删除退款原因 + * @param reasonId + */ + void deleteById(Long reasonId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderSelfStationService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderSelfStationService.java new file mode 100644 index 0000000..14bb6f2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderSelfStationService.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.vo.OrderSelfStationVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.order.model.OrderSelfStation; + +import java.util.List; + +/** + * 自提订单自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderSelfStationService { + + /** + * 分页获取自提订单自提点信息列表 + * + * @param pageDTO 分页参数 + * @return 自提订单自提点信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据自提订单自提点信息id获取自提订单自提点信息 + * + * @param id 自提订单自提点信息id + * @return 自提订单自提点信息 + */ + OrderSelfStationVO getById(Long id); + + /** + * 保存自提订单自提点信息 + * + * @param orderSelfStation 自提订单自提点信息 + */ + void save(OrderSelfStation orderSelfStation); + + /** + * 保存自提订单自提点信息 + * + * @param orderSelfStations 自提订单自提点信息列表 + */ + void saveBatch(List orderSelfStations); + + /** + * 更新自提订单自提点信息 + * + * @param orderSelfStation 自提订单自提点信息 + */ + void update(OrderSelfStation orderSelfStation); + + /** + * 根据自提订单自提点信息id删除自提订单自提点信息 + * + * @param id + */ + void deleteById(Long id); + + + /** + * 根据用户id获取用户自提订单信息 + * + * @param userId 用户id + * @return 用户自提订单信息 + */ + List getStationUserInfo(Long userId); + + /** + * 根据自提点id和自提码获取订单信息 + * + * @param stationId + * @param code + * @return + */ + OrderVO getOrderByStationCode(Long stationId, String code); + + /** + * 根据订单号获取用户自提订单信息 + * + * @param orderSelfStation + * @param orderId 订单号 + * @return 用户自提订单信息 + */ + OrderSelfStationVO getStationByOrderId(OrderSelfStationVO orderSelfStation, Long orderId); + + /** + * 计算实时距离 + * + * @param stationId + * @param lat + * @param lng + * @return + */ + Double setStationDistance(Long stationId, Double lat, Double lng); + + + /** + * 获取用户的常用自提信息 + * + * @param userId 用户id + * @return 用户的常用自提信息 + */ + List getUserStation(Long userId); + + /** + * 根据用户id获取待核销的自提订单 + * + * @param userId 用户id + * @param stationId 自提点id + * @param shopId 店铺id + * @return + */ + List getOrderSelfStationByStationIdOrShopId(Long userId, Long stationId, Long shopId); + + /** + * 根据订单ids获取对应的自提信息 + * + * @param orderIds + * @return + */ + List listSelfStationByOrderIds(List orderIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderSettlementService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderSettlementService.java new file mode 100644 index 0000000..2be8e73 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderSettlementService.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.order.vo.OrderSettlementSimpleVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.model.OrderSettlement; +import com.tmerclub.cloud.order.vo.OrderSettlementVO; + +import java.util.List; + +/** + * 订单结算表 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public interface OrderSettlementService { + + /** + * 分页获取订单结算表列表 + * @param pageDTO 分页参数 + * @return 订单结算表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据订单结算表id获取订单结算表 + * + * @param settlementId 订单结算表id + * @return 订单结算表 + */ + OrderSettlementVO getBySettlementId(Long settlementId); + + /** + * 更新订单结算表 + * @param orderSettlement 订单结算表 + */ + void update(OrderSettlement orderSettlement); + + /** + * 根据订单结算表id删除订单结算表 + * @param settlementId + */ + void deleteById(Long settlementId); + + /** + * 根据订单id获取订单结算信息 + * @param orderId + * @return + */ + OrderSettlement getByOrderId(Long orderId); + + /** + * 根据支付单号列表获取订单号列表 + * @param userId + * @param payIds + * @return + */ + List listOrderIdsByPayIds(Long userId, List payIds); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderStatisticsService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderStatisticsService.java new file mode 100644 index 0000000..88b1029 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderStatisticsService.java @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.order.dto.FormExcelDTO; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticBO; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticListBO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.OrderActivityVO; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.order.vo.OrderOverviewVO; +import com.tmerclub.cloud.order.vo.OrderRefundStatisticsVO; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * @author lth + */ +public interface OrderStatisticsService { + + /** + * 根据店铺id查询不同状态的订单数量 + * @param shopId + * @return + */ + OrderCountVO getOrderCountOfStatusByShopId(Long shopId); + + /** + * 获取指定时间范围的退款订单比率信息及退款金额统计列表 + * @param shopId + * @param dayCount + * @param endTime + * @return + */ + List listOrderRefundInfoInDateRange(Long shopId, Date endTime, Integer dayCount); + + /** + * 根据指定时间范围获取根据商品名生成退款排行 + * @param shopId + * @param endTime + * @param dayCount + * @return + */ + List listRefundRankingByProd(Long shopId, Date endTime, Integer dayCount); + + /** + * 以小时分段获取当天订单实时统计数据 + * @param shopId + * @param startTime + * @param endTime + * @return + */ + OrderOverviewVO getToDayInfoByHour(Long shopId, Date startTime, Date endTime); + + /** + * 根据shopId与时间范围获取当月订单的统计数据 + * @param shopId + * @param startTime + * @param endTime + * @return + */ + OrderOverviewVO getCurrentMonthByDay(Long shopId, Date startTime, Date endTime); + + /** + * 根据退款原因生成退款排行 + * @param shopId + * @param endTime + * @param dayCount + * @return + */ + List listRefundRankingByReason(Long shopId, Date endTime, int dayCount); + + /** + * 获取当天与昨天订单实时统计数据 + * @param shopId + * @return + */ + OrderOverviewVO getDetailInfoByHour(Long shopId); + + /** + * 根据订单数量生成商品排行 + * @param shopId 店铺ID + * @param endTime 结束时间 + * @param dayCount 距离结束时间的天数 + * @param limit 排行榜取几条数据 + * @return + */ + List listSpuRankingByOrderCount(Long shopId, Date endTime, int dayCount, int limit); + + /** + * 根据支付金额生成商品排行 + * @param endTime 结束时间 + * @param dayCount 距离结束时间的天数 + * @param limit 排行榜取几条数据 + * @return + */ + List listShopRankingByPayActual(Date endTime, int dayCount, int limit); + + /** + * 获取店铺退款订单数量排行榜 + * @param endTime 结束时间 + * @param dayCount 距离结束时间的天数 + * @param limit 排行榜取几条数据 + * @return + */ + List listShopRankingByRefundCount(Date endTime, Integer dayCount, Integer limit); + + /** + * 获取近多少天内的订单统计数据 + * @param shopId 店铺id + * @param dayCount 天数 + * @return + */ + OrderOverviewVO getOrderInfoByDayCountAndShopId(Long shopId, Integer dayCount); + + /** + * 统计用户相关的订单信息 + * @param userIds + * @param shopId + * @return + */ + List countOrderByUserIds(List userIds, Long shopId); + + /** + * 会员支付信息 + * + * @param param 参数 + * @return 会员支付信息 + */ + UserOrderStatisticBO getPaidMemberByParam(MemberReqDTO param); + + /** + * 获取新老会员成交数据 + * + * @param param 筛选参数 + * @return 新老会员成交数据 + */ + UserOrderStatisticListBO getMemberPayData(MemberReqDTO param); + + /** + * 付款用户列表 + * @param orderSearchDTO + * @return + */ + List getOrderUserIdsBySearchDTO(OrderSearchDTO orderSearchDTO); + + /** + * 获取在一定时间内消费一定次数的会员信息 + * + * @param isPayed 是否已支付 + * @param deleteStatus 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param status 状态 + * @param minNum 最小数量 + * @param maxNum 最大数量 + * @return 会员id + */ + List listUserIdByPurchaseNum(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minNum, Long maxNum); + + /** + * 获取在一定时间内消费一定金额的会员信息 + * @param isPayed 是否已支付 + * @param deleteStatus 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param status 状态 + * @param minAmount 最小支付金额 + * @param maxAmount 最大支付金额 + * @return 会员id + */ + List listUserIdByAverageActualTotal(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minAmount, Long maxAmount); + + /** + * 根据参数获取数据分析中的订单信息 + * @param spuIds 产品id列表 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 商品分析数据 + */ + List getProdEffectByDateAndProdIds(List spuIds, Date startTime, Date endTime); + + /** + * 根据订单id列表, 获取订单流量信息列表 + * @param orderIds 订单id列表 + * @return 订单流量信息列表 + */ + List listFlowOrderByOrderIds(Collection orderIds); + + /** + * 获取商品洞察的商品id + * @param begin + * @param size + * @param shopId + * @param startTime + * @param endTime + * @return + */ + List getInsightSpuIdsByDate(Integer begin, Integer size, Long shopId, Date startTime, Date endTime); + + /** + * 根据用户id列表获取积累消费金额和积累消费笔数 + * @param userIds 用户id列表 + * @return + */ + List listSumDataByUserIds(List userIds); + + /** + * 获取用户购买过的商品数量 + * @param spuId 商品id + * @param userId 分销员userId + * @return + */ + Long hasBuySuccessProd(Long spuId, Long userId); + + /** + * 统计用户购物数据 + * @param userId 用户id + * @return 用户购物数据 + */ + UserShoppingDataVO calculateUserInShopData(Long userId); + + /** + * 获取活动销售的商品数量 + * @param activityIds + * @param activityType + * @return + */ + List getActivitySalesQuantity(List activityIds, Integer activityType); + + /** + * 统计活动订单的销量 + * + * @param skuId + * @param activityId + * @param activityType + * @return + */ + Long countActivityOrderSale(Long skuId, Long activityId, Integer activityType); + + /** + * 获取财务对账信息 + * @param startTime + * @param endTime + * @param shopName + * @param shopId + * @return + */ + AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId); + + /** + * 获取店铺财务对账信息 + * @param startTime + * @param endTime + * @param shopName + * @param pageSize + * @param pageNum + * @return + */ + PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum); + + /** + * 获取店铺财务对账详情 + * @param startTime + * @param endTime + * @param shopId + * @param shopName + * @param pageSize + * @param pageNum + * @return + */ + PageShopAccountOrderVO listOrderPayInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum); + + /** + * 获取时间范围内的销量排序,放入redis + * @param key + * @param shopId 店铺id + * @param time 时间范围内 + * @param expireTime + * @param esRenovationSpuSort + * @param primaryCategoryId + * @return + */ + List addSoldNumRankCacheByShopIdAndTime(String key, Long shopId, Integer time, Integer expireTime, Integer esRenovationSpuSort, Long primaryCategoryId); + + /** + * 获取团购活动信息 + * @param groupActivityId + * @return + */ + GroupInfoVO getGroupInfo(Long groupActivityId); + + /** + * 获取报表信息 + * @param formExcelParamVO + * @return + */ + List listFormExcel(FormExcelParamVO formExcelParamVO); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderVirtualInfoLogService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderVirtualInfoLogService.java new file mode 100644 index 0000000..d28d422 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderVirtualInfoLogService.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.order.bo.OrderVirtualInfoLogBO; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderVirtualInfoLogBO; + +import java.util.List; + +/** + * @author TRACK + */ +public interface OrderVirtualInfoLogService { + + /** + * 保存核销日志到mongo + * @param mongoOrderVirtualInfoLogBO + */ + void saveLog(MongoOrderVirtualInfoLogBO mongoOrderVirtualInfoLogBO); + + /** + * 批量保存核销日志到mongodb + * @param mongoOrderVirtualInfoLogBOList + */ + void saveBatch(List mongoOrderVirtualInfoLogBOList); + + /** + * 根据订单id获取核销记录 + * @param orderId + * @return + */ + List getByOrderId(Long orderId); + + /** + * 根据核销码获取核销记录 + * @param writeOffCode + * @return + */ + List getByWriteOffCode(String writeOffCode); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderVirtualInfoService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderVirtualInfoService.java new file mode 100644 index 0000000..3a35491 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/OrderVirtualInfoService.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.OrderVirtualInfoVO; +import com.tmerclub.cloud.order.bo.OrderVirtualInfoLogBO; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderVirtualInfo; +import com.tmerclub.cloud.order.vo.OrderShopVO; +import com.tmerclub.cloud.order.vo.OrderVirtualInfoLogVO; + +import java.util.Date; +import java.util.List; + +/** + * 订单虚拟商品信息 + * + * @author FrozenWatermelon + * @date 2023-02-24 13:55:55 + */ +public interface OrderVirtualInfoService { + + /** + * 分页获取订单虚拟商品信息列表 + * @param pageDTO 分页参数 + * @return 订单虚拟商品信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据订单虚拟商品信息id获取订单虚拟商品信息 + * + * @param id 订单虚拟商品信息id + * @return 订单虚拟商品信息 + */ + OrderVirtualInfo getById(Long id); + + /** + * 保存订单虚拟商品信息 + * @param orderVirtualInfo 订单虚拟商品信息 + */ + void save(OrderVirtualInfo orderVirtualInfo); + + /** + * 更新订单虚拟商品信息 + * @param orderVirtualInfo 订单虚拟商品信息 + */ + void update(OrderVirtualInfoVO orderVirtualInfo); + + /** + * 根据订单虚拟商品信息id删除订单虚拟商品信息 + * @param id 订单虚拟商品信息id + */ + void deleteById(Long id); + + /** + * 批量保存虚拟订单信息 + * @param orderVirtualInfoList + */ + void saveBatch(List orderVirtualInfoList); + + /** + * 获取虚拟订单卡券信息 + * @param order + * @param orderShopVO + * @param stationId + */ + void handlerVirtualProdOrder(Order order, OrderShopVO orderShopVO, Long stationId); + + /** + * 根据订单id和自提点id获取虚拟订单 + * @param orderId + * @param stationId + * @return + */ + List getByOrderIdAndStationId(Long orderId, Long stationId); + + /** + * 根据订单id和店铺id获取虚拟订单 + * @param orderId + * @param shopId + * @param isWriteOff 1.已核销 0.未核销 + * @return + */ + List getByOrderIdAndShopId(Long orderId, Long shopId, Integer isWriteOff); + + /** + * 用户卡券订单核销操作 + * @param orderVirtualInfoDTO 订单核销信息 + * @param order 订单信息 + * @param stationId 门店id + */ + void orderWriteOffByOrderId(OrderVirtualInfoDTO orderVirtualInfoDTO, Order order, Long stationId); + + /** + * 根据订单id和核销码获取虚拟订单 + * @param orderId + * @param code + * @return + */ + List getByOrderIdAndCode(Long orderId, String code); + + /** + * 根据订单id获取核销数量 + * @param orderId + * @return + */ + int countWriteOffByOrderId(Long orderId); + + /** + * 根据订单号获取核销记录 + * @param orderId + * @return + */ + OrderVirtualInfoLogVO getByOrderId(Long orderId); + + /** + * 根据核销码获取核销记录 + * @param writeOffCode + * @return + */ + List getByWriteOffCode(String writeOffCode); + + /** + * 批量修改 + * + * @param updateVirtualInfos + * @param userId + * @param date + */ + void updateBatchByItemIds(List updateVirtualInfos, Long userId, Date date); + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderItemLangService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderItemLangService.java new file mode 100644 index 0000000..b555375 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderItemLangService.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.model.PurchaseOrderItem; +import com.tmerclub.cloud.order.model.PurchaseOrderItemLang; + +import java.util.List; + +/** + * 订单项-国际化 + * + * @author lhd + * @date 2022-06-27 17:49:07 + */ +public interface PurchaseOrderItemLangService { + + /** + * 分页获取订单项-国际化列表 + * @param pageDTO 分页参数 + * @return 订单项-国际化列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据订单项-国际化id获取订单项-国际化 + * + * @param purchaseItemId 订单项-国际化id + * @return 订单项-国际化 + */ + PurchaseOrderItemLang getByPurchaseItemId(Long purchaseItemId); + + /** + * 保存订单项-国际化 + * @param purchaseOrderItemLang 订单项-国际化 + */ + void save(PurchaseOrderItemLang purchaseOrderItemLang); + + /** + * 更新订单项-国际化 + * @param purchaseOrderItemLang 订单项-国际化 + */ + void update(PurchaseOrderItemLang purchaseOrderItemLang); + + /** + * 根据订单项-国际化id删除订单项-国际化 + * @param purchaseItemId 订单项-国际化id + */ + void deleteById(Long purchaseItemId); + + /** + * 保存订单项语言信息 + * @param purchaseOrderItems + */ + void saveOrderItemLang(List purchaseOrderItems); + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderItemService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderItemService.java new file mode 100644 index 0000000..59d0d74 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderItemService.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.model.PurchaseOrderItem; + +import java.util.List; + +/** + * 采购商品 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public interface PurchaseOrderItemService { + + /** + * 分页获取采购商品列表 + * + * @param pageDTO 分页参数 + * @return 采购商品列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据采购商品id获取采购商品 + * + * @param purchaseSpuId 采购商品id + * @return 采购商品 + */ + PurchaseOrderItem getByPurchaseSpuId(Long purchaseSpuId); + + /** + * 保存采购商品 + * + * @param purchaseOrderItem 采购商品 + */ + void save(PurchaseOrderItem purchaseOrderItem); + + /** + * 修改订单项发货状态 + * + * @param selectOrderItems + * @param deliveryType + */ + void updateByDeliveries(List selectOrderItems, Integer deliveryType); + + /** + * 计算未发货商品数量 + * + * @param orderId + * @return + */ + int countUnDeliveryNumByOrderId(Long orderId); + + /** + * 根据订单号获取订单项的物流类型 + * + * @param orderId 订单号 + * @return 物流类型 + */ + boolean getDevTypeByOrderId(Long orderId); + + /** + * 批量修改 + * + * @param purchaseOrderItemListDb + */ + void updateBatchById(List purchaseOrderItemListDb); + + + /** + * 批量根据订单号修改为订单状态 + * + * @param purchaseOrderStatus 订单状态 + * @param purchaseOrderId 订单号 + */ + void updateStatusByPurchaseOrderId(Integer purchaseOrderStatus, Long purchaseOrderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderLangService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderLangService.java new file mode 100644 index 0000000..b7d3a6f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/PurchaseOrderLangService.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +/** + * 采购订单-国际化 + * + * @author lhd + * @date 2022-07-12 13:57:20 + */ +public interface PurchaseOrderLangService { + + /** + * 保存采购订单-国际化 + * @param orderSpuNameCn 采购订单-国际化 + * @param orderSpuNameEn 采购订单-国际化 + * @param purchaseOrderId 采购订单-国际化 + */ + void saveBatch(StringBuilder orderSpuNameCn, StringBuilder orderSpuNameEn, Long purchaseOrderId); +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/SupplierOrderStatisticsService.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/SupplierOrderStatisticsService.java new file mode 100644 index 0000000..01ad97e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/SupplierOrderStatisticsService.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service; + +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.order.vo.HotProductVO; +import com.tmerclub.cloud.order.vo.SupplierOrderOverviewVO; + +import java.util.Date; +import java.util.List; + +/** + * @author lth + */ +public interface SupplierOrderStatisticsService { + + /** + * 根据供应商id查询供应商店铺各种状态下的订单和商品数量 + * @param supplierId + * @return + */ + OrderCountVO getOrderCountOfStatusBySupplierId(Long supplierId); + + /** + * 以小时分段获取当天订单实时统计数据 + * @param supplierId + * @param startTime + * @param endTime + * @return + */ + SupplierOrderOverviewVO getTodayInfoByHour(Long supplierId, Date startTime, Date endTime); + + /** + * 根据支付金额生成商品排行 + * + * @param supplierId 供应商店铺Id + * @param dayCount 距离结束时间的天数 + * @param limit 排行榜取几条数据 + * @return + */ + List listProdRankingByPayActual(Long supplierId, Integer dayCount, Integer limit); + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/AllotOrderItemServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/AllotOrderItemServiceImpl.java new file mode 100644 index 0000000..ae6f707 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/AllotOrderItemServiceImpl.java @@ -0,0 +1,75 @@ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.dto.AllotOrderItemDTO; +import com.tmerclub.cloud.order.mapper.AllotOrderItemMapper; +import com.tmerclub.cloud.order.model.AllotOrderItem; +import com.tmerclub.cloud.order.service.AllotOrderItemService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * @author gaozijie + * @date 2023-11-20 + */ +@Service +public class AllotOrderItemServiceImpl implements AllotOrderItemService { + + @Autowired + private AllotOrderItemMapper allotOrderItemMapper; + + @Autowired + private SegmentManager segmentManager; + + @Override + public void addBatchAllotOrderItem(List allotOrderItemDTOList) { + if (CollectionUtils.isEmpty(allotOrderItemDTOList)) { + return; + } + List allotOrderItems = new ArrayList<>(allotOrderItemDTOList.size()); + AllotOrderItem allotOrderItem; + for (AllotOrderItemDTO allotOrderItemDTO : allotOrderItemDTOList) { + allotOrderItem = this.buildAllotOrderItem(allotOrderItemDTO); + allotOrderItems.add(allotOrderItem); + } + allotOrderItemMapper.addBatchAllotOrderItem(allotOrderItems); + } + + @Override + public void updateBatchAllotOrderItem(List allotOrderItemDTOList) { + if (CollectionUtils.isEmpty(allotOrderItemDTOList)) { + return; + } + List allotOrderItems = allotOrderItemDTOList.stream().map(x -> { + AllotOrderItem allotOrderItem = new AllotOrderItem(); + BeanUtils.copyProperties(x, allotOrderItem); + allotOrderItem.setUpdateTime(LocalDateTime.now()); + return allotOrderItem; + }).toList(); + for (AllotOrderItem allotOrderItem : allotOrderItems) { + allotOrderItemMapper.updateAllotOrderItem(allotOrderItem); + } + } + + /** + * 构建调拨订单商品实体类 + * @param allotOrderItemDTO 调拨订单商品dto + * @return 调拨订单商品 + */ + private AllotOrderItem buildAllotOrderItem(AllotOrderItemDTO allotOrderItemDTO) { + AllotOrderItem allotOrderItem = new AllotOrderItem(); + BeanUtils.copyProperties(allotOrderItemDTO, allotOrderItem); + allotOrderItem.setAllotOrderItemId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ALLOT_ORDER_ITEM, allotOrderItemDTO.getShopId())); + allotOrderItem.setAllotInCount(0); + allotOrderItem.setCreateTime(LocalDateTime.now()); + allotOrderItem.setUpdateTime(LocalDateTime.now()); + return allotOrderItem; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/AllotOrderServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/AllotOrderServiceImpl.java new file mode 100644 index 0000000..bf705c1 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/AllotOrderServiceImpl.java @@ -0,0 +1,813 @@ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.order.bo.EsAllotOrderBO; +import com.tmerclub.cloud.api.order.bo.EsAllotOrderItemBO; +import com.tmerclub.cloud.api.product.dto.SkuStockLockDTO; +import com.tmerclub.cloud.api.product.feign.*; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.product.constant.StockBillStatus; +import com.tmerclub.cloud.common.product.constant.StockBillType; +import com.tmerclub.cloud.common.product.constant.StockPointType; +import com.tmerclub.cloud.common.product.constant.StockType; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.delivery.mapper.StationMapper; +import com.tmerclub.cloud.delivery.service.DeliveryCompanyService; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import com.tmerclub.cloud.order.bo.mongo.MongoAllotOrderBO; +import com.tmerclub.cloud.order.bo.mongo.MongoAllotOrderItemBO; +import com.tmerclub.cloud.order.constant.AllotOrderStatusEnum; +import com.tmerclub.cloud.order.dto.AllotOrderDTO; +import com.tmerclub.cloud.order.dto.AllotOrderItemDTO; +import com.tmerclub.cloud.order.listener.AllotSpuExcelListener; +import com.tmerclub.cloud.order.listener.AllotSpuInboundExcelListener; +import com.tmerclub.cloud.order.manager.MongoAllotOrderManager; +import com.tmerclub.cloud.order.mapper.AllotOrderMapper; +import com.tmerclub.cloud.order.model.AllotOrder; +import com.tmerclub.cloud.order.service.AllotOrderItemService; +import com.tmerclub.cloud.order.service.AllotOrderService; +import com.tmerclub.cloud.order.vo.*; +import com.tmerclub.cloud.order.vo.*; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author gaozijie + * @since 2023-11-20 + */ +@Service +public class AllotOrderServiceImpl implements AllotOrderService { + + private static final Logger log = LoggerFactory.getLogger(AllotOrderServiceImpl.class); + + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoAllotOrderManager mongoAllotOrderManager; + @Autowired + private RocketMQTemplate stockBillLogPurchaseStorageTemplate; + + @Autowired + private AllotOrderMapper allotOrderMapper; + + @Autowired + private AllotOrderItemService allotOrderItemService; + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + @Autowired + private DeliveryCompanyService deliveryCompanyService; + @Autowired + private StationMapper stationMapper; + + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private SkuStockChangeFeignClient skuStockChangeFeignClient; + @DubboReference + private StockPointFeignClient stockPointFeignClient; + + @Override + public AllotOrderVO getAllotOrder(AllotOrderDTO allotOrderDTO) { + AllotOrderVO allotOrderVO = allotOrderMapper.getAllotOrder(allotOrderDTO); + // 补充物流公司名称 + DeliveryCompanyVO deliveryCompany = deliveryCompanyService.getByDeliveryCompanyId(allotOrderVO.getDvyCompanyId()); + if (!Objects.isNull(deliveryCompany)) { + allotOrderVO.setDvyCompanyName(deliveryCompany.getName()); + } + // 补充仓库名称 + WarehouseVO warehouseVO = warehouseFeignClient.getWarehouseById(allotOrderVO.getOutWarehouseId()); + if (!Objects.isNull(warehouseVO)) { + allotOrderVO.setOutStockPointName(warehouseVO.getWarehouseName()); + } + warehouseVO = warehouseFeignClient.getWarehouseById(allotOrderVO.getInWarehouseId()); + if (!Objects.isNull(warehouseVO)) { + allotOrderVO.setInStockPointName(warehouseVO.getWarehouseName()); + } + // 补充商品名称 + this.fillAllotItemInfo(allotOrderVO.getAllotOrderItemVOList()); + return allotOrderVO; + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public void addAllotOrder(AllotOrderDTO allotOrderDTO) { + this.checkParam(allotOrderDTO); + AllotOrder allotOrder = this.buildAllotOrder(allotOrderDTO); + allotOrderDTO.setAllotOrderId(allotOrder.getAllotOrderId()); + // 库存锁定 + List skuStockLocks = allotOrderDTO.getAllotOrderItemDTOList().stream() + .map(x -> new SkuStockLockDTO(allotOrder.getAllotOrderId(), allotOrderDTO.getOutWarehouseId(), x.getSkuId(), x.getAllotCount())).toList(); + this.lockStock(skuStockLocks); + // 新增调拨订单 + allotOrderMapper.addAllotOrder(allotOrder); + // 新增调拨订单商品 + List skuIds = new ArrayList<>(allotOrderDTO.getAllotOrderItemDTOList().size()); + for (AllotOrderItemDTO allotOrderItemDTO : allotOrderDTO.getAllotOrderItemDTOList()) { + allotOrderItemDTO.setAllotOrderId(allotOrder.getAllotOrderId()); + allotOrderItemDTO.setShopId(allotOrderDTO.getShopId()); + allotOrderItemDTO.setInboundCount(allotOrderItemDTO.getAllotCount()); + skuIds.add(allotOrderItemDTO.getSkuId()); + } + allotOrderItemService.addBatchAllotOrderItem(allotOrderDTO.getAllotOrderItemDTOList()); + // 解锁库存(调拨订单不存在支付,创建成功后直接解锁) + skuStockChangeFeignClient.reduceLockAllotOrder(skuStockLocks); + // 更新仓库和商品关联 + stockPointFeignClient.updateStockPointSkuRelate(Collections.singletonList(allotOrderDTO.getOutWarehouseId()), skuIds); + // 新增出库库存流水 + StockBillLogVO stockBillLog = this.buildStockBillLog(allotOrderDTO, allotOrder.getOutWarehouseId(), allotOrder.getOutStockPointType(), StockBillType.ALLOT_OUT); + TransactionSendResult transactionSendResult = stockBillLogPurchaseStorageTemplate.sendMessageInTransaction(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC, new GenericMessage<>(stockBillLog), stockBillLog); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void updateAllotOrder(AllotOrderDTO allotOrderDTO) { + if (Objects.isNull(allotOrderDTO)) { + return; + } + AllotOrder allotOrder = new AllotOrder(); + BeanUtils.copyProperties(allotOrderDTO, allotOrder); + allotOrder.setUpdateTime(LocalDateTime.now()); + allotOrderMapper.updateAllotOrder(allotOrder); + } + + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public void inbound(AllotOrderDTO allotOrderDTO) { + AllotOrderVO dbAllotOrder = this.checkOrderStatus(allotOrderDTO); + // 过滤掉入库数量为0的数据 + List allotOrderItems = allotOrderDTO.getAllotOrderItemDTOList().stream().filter(x -> x.getInboundCount() != null && x.getInboundCount() > 0).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(allotOrderItems)) { + throw new LuckException("入库数量不能为0"); + } + allotOrderDTO.setAllotOrderItemDTOList(allotOrderItems); + allotOrderDTO.setOutStockPointType(dbAllotOrder.getOutStockPointType()); + allotOrderDTO.setInStockPointType(dbAllotOrder.getInStockPointType()); + // 修改调拨商品入库数量 + Map dbItemMap = dbAllotOrder.getAllotOrderItemVOList().stream().collect(Collectors.toMap(AllotOrderItemVO::getSkuId, x -> x)); + List updateItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + AllotOrderItemDTO updateItem; + AllotOrderItemVO dbItem; + for (AllotOrderItemDTO inboundItem : allotOrderItems) { + dbItem = dbItemMap.get(inboundItem.getSkuId()); + if (Objects.isNull(dbItem)) { + throw new LuckException("入库商品不是该订单的商品"); + } + if (inboundItem.getInboundCount() > dbItem.getAllotCount() - dbItem.getAllotInCount()) { + throw new LuckException("入库数量超出可入库数量"); + } + dbItem.setAllotInCount(dbItem.getAllotInCount() + inboundItem.getInboundCount()); + updateItem = new AllotOrderItemDTO(); + updateItem.setAllotOrderId(dbAllotOrder.getAllotOrderId()); + updateItem.setAllotOrderItemId(dbItem.getAllotOrderItemId()); + updateItem.setAllotInCount(dbItem.getAllotInCount()); + updateItems.add(updateItem); + } + allotOrderItemService.updateBatchAllotOrderItem(updateItems); + // 修改调拨订单状态 + boolean isCompete = true; + for (AllotOrderItemVO item : dbAllotOrder.getAllotOrderItemVOList()) { + isCompete = isCompete && (Objects.equals(item.getAllotCount(), item.getAllotInCount())); + } + AllotOrderDTO updateOrder = new AllotOrderDTO(); + updateOrder.setAllotOrderId(allotOrderDTO.getAllotOrderId()); + updateOrder.setRemark(allotOrderDTO.getRemark()); + updateOrder.setStatus(isCompete ? AllotOrderStatusEnum.COMPLETION.getNum() : AllotOrderStatusEnum.PARTIALLY_STOCK.getNum()); + this.updateAllotOrder(updateOrder); + // 修改库存(入库仓增加库存) + List skuStockVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AllotOrderItemDTO allotOrderItemDTO : allotOrderItems) { + skuStockVOList.add(this.buildSkuStockVO(allotOrderItemDTO, allotOrderDTO.getInWarehouseId(), LuaOperateEnum.SKU_ADD)); + } + skuStockFeignClient.changeSkuStock(skuStockVOList); + // 新增入库库存流水 + StockBillLogVO stockBillLog = this.buildStockBillLog(allotOrderDTO, allotOrderDTO.getInWarehouseId(), allotOrderDTO.getInStockPointType(), StockBillType.ALLOT_IN); + TransactionSendResult transactionSendResult = stockBillLogPurchaseStorageTemplate.sendMessageInTransaction(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC, new GenericMessage<>(stockBillLog), stockBillLog); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void completeOrder(AllotOrderDTO allotOrderDTO) { + this.checkOrderStatus(allotOrderDTO); + allotOrderDTO.setStatus(AllotOrderStatusEnum.COMPLETION.getNum()); + this.updateAllotOrder(allotOrderDTO); + } + + @Override + public void nullifyOrder(AllotOrderDTO allotOrderDTO) { + AllotOrderVO dbAllotOrder = this.checkOrderStatus(allotOrderDTO); + // 过滤出需要退还库存的数据,并转成dto + List allotOrderItems = dbAllotOrder.getAllotOrderItemVOList().stream() + .filter(x -> x.getAllotCount() > x.getAllotInCount()) + .map(x -> { + AllotOrderItemDTO allotOrderItemDTO = new AllotOrderItemDTO(); + BeanUtils.copyProperties(x, allotOrderItemDTO); + return allotOrderItemDTO; + }).toList(); + if (CollectionUtils.isEmpty(allotOrderItems)) { + return; + } + // 作废 + AllotOrderDTO allotOrder = new AllotOrderDTO(); + BeanUtils.copyProperties(dbAllotOrder, allotOrder); + allotOrder.setAllotOrderItemDTOList(allotOrderItems); + this.nullify(allotOrder); + } + + @Override + public void nullifyOrderByWarehouseId(Long warehouseId) { + // 查找未完成/作废的调拨订单 + AllotOrderDTO allotOrderDTO = new AllotOrderDTO(); + allotOrderDTO.setWarehouseId(warehouseId); + allotOrderDTO.setStatuses(Arrays.asList(AllotOrderStatusEnum.WAIT_STOCK.getNum(), AllotOrderStatusEnum.PARTIALLY_STOCK.getNum())); + List allotOrderBOS = mongoAllotOrderManager.listAllotOrder(allotOrderDTO); + if (CollectionUtils.isEmpty(allotOrderBOS)) { + return; + } + // 循环作废 + for (MongoAllotOrderBO allotOrderBO : allotOrderBOS) { + List allotOrderItems = allotOrderBO.getAllotOrderItemBOList().stream() + .filter(x -> x.getAllotCount() > x.getAllotInCount()) + .map(x -> { + AllotOrderItemDTO allotOrderItemDTO = new AllotOrderItemDTO(); + BeanUtils.copyProperties(x, allotOrderItemDTO); + return allotOrderItemDTO; + }).toList(); + if (CollectionUtils.isEmpty(allotOrderItems)) { + continue; + } + // 作废 + AllotOrderDTO allotOrder = new AllotOrderDTO(); + BeanUtils.copyProperties(allotOrderBO, allotOrder); + allotOrder.setAllotOrderItemDTOList(allotOrderItems); + this.nullify(allotOrder); + } + } + + @Override + public EsAllotOrderBO saveMongoAndGetEsInfo(Long allotOrderId) { + MongoAllotOrderBO mongoAllotOrderBO = mongoAllotOrderManager.saveAllotOrder(allotOrderId); + // 转成es数据 + EsAllotOrderBO esAllotOrderBO = new EsAllotOrderBO(); + BeanUtils.copyProperties(mongoAllotOrderBO, esAllotOrderBO); + List esItems = new ArrayList<>(mongoAllotOrderBO.getAllotOrderItemBOList().size()); + for (MongoAllotOrderItemBO itemBO : mongoAllotOrderBO.getAllotOrderItemBOList()) { + EsAllotOrderItemBO esItem = new EsAllotOrderItemBO(); + BeanUtils.copyProperties(itemBO, esItem); + esItems.add(esItem); + } + esAllotOrderBO.setAllotOrderItems(esItems); + return esAllotOrderBO; + } + + @Override + public void downloadModel(HttpServletResponse response) { + Map map = new HashMap<>(8); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, AllotSpuExcelVO.EXCEL_NAME, AllotSpuExcelVO.MERGE_ROW_INDEX, AllotSpuExcelVO.MERGE_COLUMN_INDEX); + // useDefaultStyle false 不需要默认的头部加粗/自动换行样式 + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, 1).useDefaultStyle(false).build(); + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(AllotSpuExcelVO.SHEET_NAME).head(AllotSpuExcelVO.class).build(); + excelWriter.write(Collections.emptyList(), sheetWriter); + } catch (Exception e) { + log.error("导出调拨商品excel模板失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + @Override + public AllotSpuImportVO parseFile(MultipartFile excelFile, AllotOrderDTO allotOrderDTO) { + // 参数检查 + if (excelFile == null) { + throw new LuckException("网络繁忙,请稍后重试"); + } + this.checkWarehouse(allotOrderDTO.getOutWarehouseId(), allotOrderDTO.getShopId(), allotOrderDTO.getSysType()); + this.checkWarehouse(allotOrderDTO.getInWarehouseId(), allotOrderDTO.getShopId(), allotOrderDTO.getSysType()); + // 读取excel文件数据 + List allotSpuExcels = new ArrayList<>(Constant.INITIAL_CAPACITY); + AllotSpuExcelListener excelListener = new AllotSpuExcelListener(allotSpuExcels); + try { + EasyExcel.read(excelFile.getInputStream(), AllotSpuExcelVO.class, excelListener).sheet().doRead(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + if (CollectionUtil.isEmpty(allotSpuExcels)) { + throw new LuckException("导入数据为空,请检查下文件"); + } + // 查询sku数据 + Map partyCodeMap = allotSpuExcels.stream().collect(Collectors.toMap(AllotSpuExcelVO::getPartyCode, x -> x)); + List skuVOList = skuFeignClient.listByPartyCodes(new ArrayList<>(partyCodeMap.keySet())); + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + List skuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map skuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuVOList) { + spuIds.add(skuVO.getSpuId()); + skuIds.add(skuVO.getSkuId()); + skuMap.put(skuVO.getSkuId(), skuVO); + } + // 检查sku + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + stockPointSkuDTO.setSkuIds(skuIds); + stockPointSkuDTO.setStockPointIds(Collections.singletonList(allotOrderDTO.getOutWarehouseId())); + List stockPointSkus = stockPointFeignClient.listStockPointSku(stockPointSkuDTO); + if (CollectionUtils.isEmpty(stockPointSkus)) { + throw new LuckException("调拨商品非该调出点的商品"); + } + // 查询spu数据 + List spuVOList = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)).getData(); + Map spuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(spuVOList)) { + spuMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, x -> x)); + } + // 查询sku对应调出/入仓库存 + List skuStockVOList = new ArrayList<>(skuIds.size() * 2); + for (Long skuId : skuIds) { + SkuStockVO outSkuStockVO = new SkuStockVO(skuId); + outSkuStockVO.setStockPointId(allotOrderDTO.getOutWarehouseId()); + skuStockVOList.add(outSkuStockVO); + SkuStockVO inSkuStockVO = new SkuStockVO(skuId); + inSkuStockVO.setStockPointId(allotOrderDTO.getInWarehouseId()); + skuStockVOList.add(inSkuStockVO); + } + Map skuStockMap = skuStockFeignClient.listSkuStock(skuStockVOList); + // 补充商品信息 + List allotSpuVOList = new ArrayList<>(allotSpuExcels.size()); + AllotSpuVO allotSpuVO; + for (StockPointSkuVO stockPointSku : stockPointSkus) { + SkuVO skuVO = skuMap.get(stockPointSku.getSkuId()); + allotSpuVO = this.buildAllotSpuVO(partyCodeMap.get(skuVO.getPartyCode()), spuMap.get(skuVO.getSpuId()), skuVO, skuStockMap, stockPointSku.getStockPointId(), allotOrderDTO.getInWarehouseId()); + if (Objects.isNull(allotSpuVO)) { + continue; + } + allotSpuVOList.add(allotSpuVO); + } + // 构建返回信息 + AllotSpuImportVO allotSpuImportVO = new AllotSpuImportVO(); + allotSpuImportVO.setAllotSpuVOList(allotSpuVOList); + allotSpuImportVO.setTips(String.format("检查到%d条商品信息,成功导入%d条商品信息!错误%d条商品信息!", allotSpuExcels.size(), allotSpuVOList.size(), allotSpuExcels.size()-allotSpuVOList.size())); + return allotSpuImportVO; + } + + @Override + public void downloadInboundModel(HttpServletResponse response, AllotOrderDTO allotOrderDTO) { + // 获取订单导入项数据 + AllotOrderVO allotOrder = allotOrderMapper.getAllotOrder(allotOrderDTO); + if (Objects.isNull(allotOrder)) { + throw new LuckException("调拨订单不存在"); + } + // 补充商品信息 + this.fillAllotItemInfo(allotOrder.getAllotOrderItemVOList()); + // 转成excel数据集合 + int seq = 1; + List inboundExcels = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AllotOrderItemVO allotOrderItemVO : allotOrder.getAllotOrderItemVOList()) { + inboundExcels.add(this.buildInboundExcelVO(allotOrderItemVO, seq++)); + } + Map map = new HashMap<>(8); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, AllotSpuInboundExcelVO.EXCEL_NAME, AllotSpuInboundExcelVO.MERGE_ROW_INDEX, AllotSpuInboundExcelVO.MERGE_COLUMN_INDEX); + // useDefaultStyle false 不需要默认的头部加粗/自动换行样式 + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, 1).useDefaultStyle(false).build(); + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(AllotSpuInboundExcelVO.SHEET_NAME).head(AllotSpuInboundExcelVO.class).build(); + excelWriter.write(inboundExcels, sheetWriter); + } catch (Exception e) { + log.error("导出调拨商品入库excel模板失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + @Override + public AllotSpuInboundImportVO parseInboundFile(MultipartFile excelFile, AllotOrderDTO allotOrderDTO) { + AllotOrderVO allotOrder = allotOrderMapper.getAllotOrder(allotOrderDTO); + if (Objects.isNull(allotOrder)) { + throw new LuckException("调拨订单不存在"); + } + // 补充商品信息 + this.fillAllotItemInfo(allotOrder.getAllotOrderItemVOList()); + // 解析excel文件 + List inboundExcels = new ArrayList<>(Constant.INITIAL_CAPACITY); + AllotSpuInboundExcelListener excelListener = new AllotSpuInboundExcelListener(inboundExcels); + try { + EasyExcel.read(excelFile.getInputStream(), AllotSpuInboundExcelVO.class, excelListener).sheet().doRead(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + if (CollectionUtil.isEmpty(inboundExcels)) { + throw new LuckException("导入数据为空,请检查下文件"); + } + Map inboundExcelMap = inboundExcels.stream().collect(Collectors.toMap(AllotSpuInboundExcelVO::getPartyCode, x -> x)); + // 补充入库数量 + int successCount = 0; + AllotSpuInboundExcelVO inboundExcel; + for (AllotOrderItemVO allotOrderItemVO : allotOrder.getAllotOrderItemVOList()) { + inboundExcel = inboundExcelMap.get(allotOrderItemVO.getPartyCode()); + if (Objects.isNull(inboundExcel)) { + allotOrderItemVO.setInboundCount(0); + continue; + } + allotOrderItemVO.setInboundCount(inboundExcel.getInboundCount()); + successCount ++; + } + // 构建返回信息 + AllotSpuInboundImportVO importVO = new AllotSpuInboundImportVO(); + importVO.setAllotOrderItemVOList(allotOrder.getAllotOrderItemVOList()); + importVO.setTips(String.format("检查到%d条商品信息,成功导入%d条商品信息!错误%d条商品信息!", inboundExcels.size(), successCount, inboundExcels.size()-successCount)); + return importVO; + } + + @Override + public Long countUnFinish(Long warehouseId) { + if (Objects.isNull(warehouseId)) { + return 0L; + } + return mongoAllotOrderManager.countUnFinishAllot(warehouseId); + } + + /** + * 校验参数 + * @param allotOrderDTO 调拨订单dto + */ + private void checkParam(AllotOrderDTO allotOrderDTO) { + // 校验库存点 + WarehouseVO outWarehouse = this.checkWarehouse(allotOrderDTO.getOutWarehouseId(), allotOrderDTO.getShopId(), allotOrderDTO.getSysType()); + allotOrderDTO.setOutStockPointType(this.getStockPointType(outWarehouse.getSysType())); + WarehouseVO inWarehouse = this.checkWarehouse(allotOrderDTO.getInWarehouseId(), allotOrderDTO.getShopId(), allotOrderDTO.getSysType()); + allotOrderDTO.setInStockPointType(this.getStockPointType(inWarehouse.getSysType())); + // 校验商品库存 + List allotOrderItemDTOList = allotOrderDTO.getAllotOrderItemDTOList(); + if (CollectionUtils.isEmpty(allotOrderItemDTOList)) { + throw new LuckException("调拨订单商品不能为空"); + } + List skuIds = new ArrayList<>(allotOrderItemDTOList.size()); + for (AllotOrderItemDTO allotOrderItemDTO : allotOrderItemDTOList) { + if (Objects.isNull(allotOrderItemDTO.getAllotCount()) + || Objects.equals(allotOrderItemDTO.getAllotCount(), 0)) { + throw new LuckException("调拨数量不能为0"); + } + skuIds.add(allotOrderItemDTO.getSkuId()); + } + List containSkuIds = skuStockFeignClient.checkStockPointContainSku(Collections.singletonList(allotOrderDTO.getOutWarehouseId()), skuIds); + if (!Objects.equals(skuIds.size(), containSkuIds.size())) { + throw new LuckException("调拨商品非该调出点的商品"); + } + } + + /** + * 检查仓库 + * @param warehouseId 仓库id + * @param shopId 店铺id + * @param sysType 系统类型 + */ + private WarehouseVO checkWarehouse(Long warehouseId, + Long shopId, + Integer sysType) { + WarehouseVO warehouse = warehouseFeignClient.getWarehouseById(warehouseId); + if (Objects.isNull(warehouse)) { + throw new LuckException(String.format("仓库[%s]不存在", warehouseId)); + } + if (Objects.equals(warehouse.getSysType(), SysTypeEnum.STATION.value())) { + // 检查门店仓库 + if(Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + throw new LuckException("供应商不存在门店"); + } + StationVO station = stationMapper.getByStationId(warehouse.getShopId()); + if (!Objects.equals(station.getShopId(), shopId)) { + throw new LuckException(String.format("门店[%s]非该店铺的门店", station.getStationId())); + } + } else if (!Objects.equals(shopId, warehouse.getShopId()) + || !Objects.equals(sysType, warehouse.getSysType())) { + // 检查商家/供应商仓库 + throw new LuckException(String.format("仓库[%s]非该店铺的仓库", warehouseId)); + } + return warehouse; + } + + /** + * 构建调拨订单实体类 + * @param allotOrderDTO 调拨订单dto + * @return 调拨订单 + */ + private AllotOrder buildAllotOrder(AllotOrderDTO allotOrderDTO) { + AllotOrder allotOrder = new AllotOrder(); + BeanUtils.copyProperties(allotOrderDTO, allotOrder); + allotOrder.setAllotOrderId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ALLOT_ORDER, allotOrderDTO.getShopId())); + allotOrder.setStatus(AllotOrderStatusEnum.WAIT_STOCK.getNum()); + allotOrder.setTotalAllotCount(allotOrderDTO.getAllotOrderItemDTOList().stream().mapToInt(AllotOrderItemDTO::getAllotCount).sum()); + allotOrder.setCreateTime(LocalDateTime.now()); + allotOrder.setUpdateTime(LocalDateTime.now()); + return allotOrder; + } + + /** + * 检查订单状态 + * @param allotOrderDTO 调拨订单dto + */ + private AllotOrderVO checkOrderStatus(AllotOrderDTO allotOrderDTO) { + AllotOrderVO dbAllotOrder = allotOrderMapper.getAllotOrder(allotOrderDTO); + if (Objects.isNull(dbAllotOrder)) { + throw new LuckException("调拨订单不存在"); + } + if (Objects.equals(dbAllotOrder.getStatus(), AllotOrderStatusEnum.VOIDED.getNum())) { + throw new LuckException("调拨订单已作废"); + } + if (Objects.equals(dbAllotOrder.getStatus(), AllotOrderStatusEnum.COMPLETION.getNum())) { + throw new LuckException("调拨订单已完成"); + } + return dbAllotOrder; + } + + /** + * 获取库存点类型 + * @param warehouseSysType 库存点系统类型 + * @return 库存点类型 + */ + private Integer getStockPointType(Integer warehouseSysType) { + // 系统类型为门店,库存点则为门店,其余都是仓库 + return Objects.equals(warehouseSysType, SysTypeEnum.STATION.value()) ? StockPointType.STATION.getValue() : StockPointType.WAREHOUSE.getValue(); + } + + /** + * 补充调拨商品信息 + * @param allotOrderItemVOList 调拨商品集合 + */ + private void fillAllotItemInfo(List allotOrderItemVOList) { + if (CollectionUtils.isEmpty(allotOrderItemVOList)) { + return; + } + // 补充spu和sku名称 + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set skuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (AllotOrderItemVO allotOrderItemVO : allotOrderItemVOList) { + spuIds.add(allotOrderItemVO.getSpuId()); + skuIds.add(allotOrderItemVO.getSkuId()); + } + List spuVOList = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)).getData(); + List skuVOList = skuFeignClient.listBySkuIds(new ArrayList<>(skuIds)); + Map spuMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, x -> x)); + Map skuMap = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, x -> x)); + for (AllotOrderItemVO allotOrderItemVO : allotOrderItemVOList) { + SpuVO spuVO = spuMap.get(allotOrderItemVO.getSpuId()); + if (!Objects.isNull(spuVO)) { + allotOrderItemVO.setSpuLangVOList(spuVO.getSpuLangList()); + allotOrderItemVO.setMainImgUrl(spuVO.getMainImgUrl()); + } + SkuVO skuVO = skuMap.get(allotOrderItemVO.getSkuId()); + if (!Objects.isNull(skuVO)) { + allotOrderItemVO.setPartyCode(skuVO.getPartyCode()); + allotOrderItemVO.setSkuLangVOList(skuVO.getSkuLangList()); + allotOrderItemVO.setImgUrl(skuVO.getImgUrl()); + } + } + } + + /** + * 构建sku库存VO + * @param allotOrderItemDTO 调拨订单项 + * @param warehouseId 仓库id + * @param luaOperateEnum lua库存脚本操作 + * @return sku库存VO + */ + private SkuStockVO buildSkuStockVO(AllotOrderItemDTO allotOrderItemDTO, + Long warehouseId, + LuaOperateEnum luaOperateEnum) { + SkuStockVO skuStockVO = new SkuStockVO(); + BeanUtils.copyProperties(allotOrderItemDTO, skuStockVO); + skuStockVO.setStockPointId(warehouseId); + skuStockVO.setStock(allotOrderItemDTO.getInboundCount()); + skuStockVO.setOperateType(luaOperateEnum.value()); + return skuStockVO; + } + + /** + * 构建库存流水VO集合 + * @param allotOrderDTO 调拨订单dto + * @param warehouseId 仓库id + * @param stockPointType 库存点类型 + * @param stockBillType 库存流水类型 + * @return 库存流水VO集合 + */ + private StockBillLogVO buildStockBillLog(AllotOrderDTO allotOrderDTO, + Long warehouseId, + Integer stockPointType, + StockBillType stockBillType) { + // 商品数据准备 + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set skuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (AllotOrderItemDTO allotOrderItemDTO : allotOrderDTO.getAllotOrderItemDTOList()) { + spuIds.add(allotOrderItemDTO.getSpuId()); + skuIds.add(allotOrderItemDTO.getSkuId()); + } + List spuVOList = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)).getData(); + List skuVOList = skuFeignClient.listBySkuIds(new ArrayList<>(skuIds)); + Map spuMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, x -> x)); + Map skuMap = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, x -> x)); + // 获取库存入库单号 + boolean isOut = Objects.equals(stockBillType, StockBillType.ALLOT_OUT); + StockBillLogVO stockBillLog = new StockBillLogVO(); + stockBillLog.setSourceOrderNo(allotOrderDTO.getAllotOrderId().toString()); + stockBillLog.setStockBillType(stockBillType.value()); + stockBillLog.setBusinessTime(new Date()); + stockBillLog.setChangeStock(false); + stockBillLog.setRemark(allotOrderDTO.getRemark()); + if (Objects.equals(allotOrderDTO.getSysType(), SysTypeEnum.MULTISHOP.value())) { + stockBillLog.setShopId(allotOrderDTO.getShopId()); + } else { + stockBillLog.setSupplierId(allotOrderDTO.getShopId()); + } + stockBillLog.setEmployeeId(allotOrderDTO.getUserId()); + stockBillLog.setType(isOut ? StockType.OUT_OF_STOCK.value() : StockType.WAREHOUSING.value()); + stockBillLog.setStatus(StockBillStatus.SUCCESS.value()); + stockBillLog.setStockPointId(warehouseId); + stockBillLog.setStockPointType(stockPointType); + long totalAmount = 0L; + int totalCount = 0; + List stockBillLogItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + StockBillLogItemVO stockBillLogItem; + for (AllotOrderItemDTO allotOrderItemDTO : allotOrderDTO.getAllotOrderItemDTOList()) { + stockBillLogItem = this.buildStockBillLogItem(allotOrderItemDTO, spuMap, skuMap); + stockBillLogItems.add(stockBillLogItem); + totalCount += stockBillLogItem.getStockCount(); + totalAmount += stockBillLogItem.getStockCount() * stockBillLogItem.getUnitPrice(); + } + stockBillLog.setTotalAmount(totalAmount); + stockBillLog.setTotalCount(totalCount); + stockBillLog.setStockBillLogItems(stockBillLogItems); + return stockBillLog; + } + + /** + * 构建库存流水项VO + * @param allotOrderItemDTO 调拨订单dto + * @param spuMap 商品spuMap + * @param skuMap 商品skuMap + * @return 库存流水项VO + */ + private StockBillLogItemVO buildStockBillLogItem(AllotOrderItemDTO allotOrderItemDTO, + Map spuMap, + Map skuMap) { + SkuVO skuVO = skuMap.get(allotOrderItemDTO.getSkuId()); + SpuVO spuVO = spuMap.get(allotOrderItemDTO.getSpuId()); + StockBillLogItemVO stockBillLogItem = new StockBillLogItemVO(); + stockBillLogItem.setStockCount(allotOrderItemDTO.getInboundCount()); + stockBillLogItem.setSpuId(spuVO.getSpuId()); + stockBillLogItem.setSkuId(skuVO.getSkuId()); + stockBillLogItem.setSpuName(spuVO.getName()); + stockBillLogItem.setSkuName(skuVO.getSkuName()); + stockBillLogItem.setPartyCode(skuVO.getPartyCode()); + stockBillLogItem.setMainImgUrl(spuVO.getMainImgUrl()); + stockBillLogItem.setImgUrl(skuVO.getImgUrl()); + stockBillLogItem.setUnitPrice(skuVO.getPriceFee()); + return stockBillLogItem; + } + + /** + * 构建调拨商品数据 + * @param allotSpuExcelVO 调拨商品excel数据 + * @param spuVO 商品spuVO + * @param skuVO 商品skuVO + * @param skuStockMap 商品库存映射 + * @param outWarehouseId 出库仓id + * @param inWarehouseId 入库仓id + * @return 调拨商品 + */ + private AllotSpuVO buildAllotSpuVO(AllotSpuExcelVO allotSpuExcelVO, + SpuVO spuVO, + SkuVO skuVO, + Map skuStockMap, + Long outWarehouseId, + Long inWarehouseId) { + if (Objects.isNull(spuVO) + || Objects.isNull(skuVO) + || Objects.isNull(allotSpuExcelVO)) { + return null; + } + AllotSpuVO allotSpuVO = new AllotSpuVO(); + allotSpuVO.setPartyCode(allotSpuExcelVO.getPartyCode()); + allotSpuVO.setAllotCount(allotSpuExcelVO.getAllotCount()); + allotSpuVO.setSkuId(skuVO.getSkuId()); + allotSpuVO.setImgUrl(skuVO.getImgUrl()); + allotSpuVO.setSkuLangVOList(skuVO.getSkuLangList()); + allotSpuVO.setSpuId(spuVO.getSpuId()); + allotSpuVO.setMainImgUrl(spuVO.getMainImgUrl()); + allotSpuVO.setSpuLangVOList(spuVO.getSpuLangList()); + SkuStockVO skuStockVO; + allotSpuVO.setOutWarehouseStock(Objects.isNull((skuStockVO = skuStockMap.get(allotSpuVO.getSkuId() + "_" + outWarehouseId))) ? 0 : skuStockVO.getStock()); + allotSpuVO.setInWarehouseStock(Objects.isNull((skuStockVO = skuStockMap.get(allotSpuVO.getSkuId() + "_" + inWarehouseId))) ? 0 : skuStockVO.getStock()); + // 更新调拨数量(负数改为0,超出库存改为当前库存) + if (allotSpuVO.getAllotCount() < 0) { + allotSpuVO.setAllotCount(0); + } else if (allotSpuVO.getAllotCount() > allotSpuVO.getOutWarehouseStock()) { + allotSpuVO.setAllotCount(allotSpuVO.getOutWarehouseStock()); + } + return allotSpuVO; + } + + /** + * 构建商品入库excelVO + * @param allotOrderItem 调拨订单商品 + * @param seq 序号 + * @return 商品入库excelVO + */ + private AllotSpuInboundExcelVO buildInboundExcelVO(AllotOrderItemVO allotOrderItem, Integer seq) { + AllotSpuInboundExcelVO inboundExcel = new AllotSpuInboundExcelVO(); + BeanUtils.copyProperties(allotOrderItem, inboundExcel); + inboundExcel.setSeq(seq); + inboundExcel.setSpuName(allotOrderItem.getSpuLangVOList().get(0).getSpuName()); + inboundExcel.setSkuName(CollectionUtils.isEmpty(allotOrderItem.getSkuLangVOList()) ? "" : allotOrderItem.getSkuLangVOList().get(0).getSkuName()); + inboundExcel.setCanInboundCount(allotOrderItem.getAllotCount() - allotOrderItem.getAllotInCount()); + inboundExcel.setInboundCount(inboundExcel.getCanInboundCount()); + return inboundExcel; + } + + /** + * 库存锁定 + * @param skuStockLocks sku库存锁定类 + */ + private void lockStock(List skuStockLocks) { + String result = skuStockChangeFeignClient.lockAllotOrder(skuStockLocks); + if (result.contains(Constant.UNDERLINE)) { + return; + } + // 提示商品库存不足 + long skuId = Long.parseLong(result); + SkuVO skuVO = skuFeignClient.getSkuAndNameById(skuId); + throw new LuckException(String.format("sku:【%s】 的库存不足", skuVO.getSkuName())); + } + + /** + * 作废操作 + * @param allotOrderDTO 调拨订单dto + */ + private void nullify(AllotOrderDTO allotOrderDTO) { + // 退还库存 + List skuStockVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (AllotOrderItemDTO allotOrderItemDTO : allotOrderDTO.getAllotOrderItemDTOList()) { + allotOrderItemDTO.setInboundCount(allotOrderItemDTO.getAllotCount() - allotOrderItemDTO.getAllotInCount()); + skuStockVOList.add(this.buildSkuStockVO(allotOrderItemDTO, allotOrderDTO.getOutWarehouseId(), LuaOperateEnum.SKU_ADD)); + } + skuStockFeignClient.changeSkuStock(skuStockVOList); + // 新增入库库存流水 + StockBillLogVO stockBillLog = this.buildStockBillLog(allotOrderDTO, allotOrderDTO.getOutWarehouseId(), allotOrderDTO.getOutStockPointType(), StockBillType.ORDER_CANCEL); + TransactionSendResult transactionSendResult = stockBillLogPurchaseStorageTemplate.sendMessageInTransaction(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC, new GenericMessage<>(stockBillLog), stockBillLog); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 更新订单状态 + allotOrderDTO.setStatus(AllotOrderStatusEnum.VOIDED.getNum()); + this.updateAllotOrder(allotOrderDTO); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderExcelServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderExcelServiceImpl.java new file mode 100644 index 0000000..4dcde60 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderExcelServiceImpl.java @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryCompanyExcelVO; +import com.tmerclub.cloud.api.feign.EsOrderFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.constant.OrderExportError; +import com.tmerclub.cloud.order.service.OrderExcelService; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.service.OrderService; +import com.tmerclub.cloud.order.vo.SupplierUnDeliveryOrderExcelVO; +import com.tmerclub.cloud.order.vo.UnDeliveryOrderExcelVO; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单excel + * + * @author Pineapple + * @date 2021/7/20 8:48 + */ +@Service +public class OrderExcelServiceImpl implements OrderExcelService { + @Autowired + private OrderService orderService; + @Autowired + private DeliveryManager deliveryManager; + @Autowired + private OrderItemService orderItemService; + + @DubboReference + private EsOrderFeignClient esOrderFeignClient; + + /** + * 配送类型 + */ + public static final int DELIVERY_MODE_INDEX = 2; + + /** + * 快递公司名称 + */ + public static final int DELIVERY_COMPANY_NAME_INDEX = 3; + + private static final int FLOW_ID_MIN = 4; + private static final int FLOW_ID_MAX = 30; + + public static final String[] DELIVERY_MODE = {DeliveryType.DELIVERY.description(), DeliveryType.NOT_DELIVERY.description()}; + + private static final Logger log = LoggerFactory.getLogger(OrderExcelServiceImpl.class); + + @Override + public void excelUnDeliveryOrderList(HttpServletResponse response, OrderSearchDTO orderSearchDTO) { + List esOrderBOList = esOrderFeignClient.getUndeliveryOrder(orderSearchDTO); + log.info("查询未发货订单列表,参数:{},结果:{}", orderSearchDTO, esOrderBOList); + List unDeliveryOrderList = esOrderBOList.stream().map(esOrderVO -> { + UnDeliveryOrderExcelVO unDeliveryOrderExcelVO = new UnDeliveryOrderExcelVO(); + unDeliveryOrderExcelVO.setOrderId(esOrderVO.getOrderId().toString()); + unDeliveryOrderExcelVO.setDeliveryType(String.valueOf(esOrderVO.getDeliveryType())); + unDeliveryOrderExcelVO.setMobile(esOrderVO.getMobile()); + unDeliveryOrderExcelVO.setConsignee(esOrderVO.getConsignee()); + if (Objects.nonNull(esOrderVO.getAddr())) { + unDeliveryOrderExcelVO.setReceivingAddr(esOrderVO.getProvince() + esOrderVO.getCity() + esOrderVO.getArea() + esOrderVO.getAddr()); + } + + List orderItemVOList = esOrderVO.getOrderItems().stream().map(esOrderItemBO -> { + OrderItemVO orderItemVO = new OrderItemVO(); + orderItemVO.setOrderItemId(esOrderItemBO.getOrderItemId()); + orderItemVO.setSpuName(esOrderItemBO.getSpuNameZh()); + orderItemVO.setOrderId(esOrderItemBO.getOrderId()); + orderItemVO.setSkuName(esOrderItemBO.getSkuNameZh()); + orderItemVO.setCount(esOrderItemBO.getCount()); + orderItemVO.setGiveawayAmount(esOrderItemBO.getGiveawayAmount()); + orderItemVO.setActivityId(esOrderItemBO.getActivityId()); + orderItemVO.setActivityType(esOrderItemBO.getActivityType()); + orderItemVO.setBeDeliveredNum(esOrderItemBO.getBeDeliveredNum()); + return orderItemVO; + }).collect(Collectors.toList()); + unDeliveryOrderExcelVO.setOrderItemList(orderItemVOList); + return unDeliveryOrderExcelVO; + }).collect(Collectors.toList()); + + + List excelVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map map = new HashMap<>(8); + map.put(DELIVERY_MODE_INDEX, DELIVERY_MODE); + int index = 0; + //合并单元格 + Long orderId = null; + for (UnDeliveryOrderExcelVO orderExcel : unDeliveryOrderList) { + List orderItemList = orderExcel.getOrderItemList(); + if (CollectionUtil.isEmpty(orderItemList)) { + continue; + } + if (!Objects.equals(Long.valueOf(orderExcel.getOrderId()), orderId)) { + index++; + orderId = Long.valueOf(orderExcel.getOrderId()); + } + orderExcel.setSeq(String.valueOf(index)); + //物流信息 + orderExcel.setDeliveryType(DeliveryType.getDescription(Integer.valueOf(orderExcel.getDeliveryType()))); + //快递公司名称 + map.put(DELIVERY_COMPANY_NAME_INDEX, getDeliveryCompanyName()); + + handleSpuExcelInfo(excelVOList, orderItemList, orderExcel); + } + writeExcel(response, excelVOList, map); + } + + private void handleSpuExcelInfo(List excelVOList, List orderItemVOList, UnDeliveryOrderExcelVO orderExcel) { + Map> map = orderItemVOList.stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + + for (OrderItemVO orderItemVO : orderItemVOList) { + // 赠品订单项不需要进行处理 + // TODO 组合待测试 + if (Objects.equals(orderItemVO.getActivityType(), OrderActivityType.GIVEAWAY.value())) { + continue; + } + int num = 0; + if (map.containsKey(orderItemVO.getOrderItemId())) { + for (OrderItemVO giveawayVO : map.get(orderItemVO.getOrderItemId())) { + num++; + UnDeliveryOrderExcelVO unOrderExcel = new UnDeliveryOrderExcelVO(); + addNewExcelVo(unOrderExcel, orderItemVO, orderExcel); + String giveawayName = giveawayVO.getSpuName() + (StrUtil.isBlank(giveawayVO.getSkuName()) ? "" : " " + giveawayVO.getSkuName()); + unOrderExcel.setGiveawayName(giveawayName); + unOrderExcel.setGiveawayCount(giveawayVO.getBeDeliveredNum()); + if (num > 1) { + unOrderExcel.setSpuName(null); + unOrderExcel.setSkuName(null); + unOrderExcel.setCount(null); + } + excelVOList.add(unOrderExcel); + } + } else { + UnDeliveryOrderExcelVO unOrderExcel = new UnDeliveryOrderExcelVO(); + addNewExcelVo(unOrderExcel, orderItemVO, orderExcel); + excelVOList.add(unOrderExcel); + } + } + } + + private void addNewExcelVo(UnDeliveryOrderExcelVO unOrderExcel, OrderItemVO orderItemVO, UnDeliveryOrderExcelVO orderExcel) { + unOrderExcel.setOrderId(orderExcel.getOrderId()); + unOrderExcel.setSeq(orderExcel.getSeq()); + unOrderExcel.setDeliveryType(orderExcel.getDeliveryType()); + unOrderExcel.setDeliveryCompanyName(orderExcel.getDeliveryCompanyName()); + unOrderExcel.setDeliveryNo(orderExcel.getDeliveryNo()); + unOrderExcel.setConsignee(orderExcel.getConsignee()); + unOrderExcel.setMobile(orderExcel.getMobile()); + unOrderExcel.setReceivingAddr(orderExcel.getReceivingAddr()); + unOrderExcel.setSpuName(orderItemVO.getSpuName()); + unOrderExcel.setSkuName(orderItemVO.getSkuName()); + unOrderExcel.setCount(orderItemVO.getBeDeliveredNum()); + } + + + @Override + public void exportOrderExcel(List list, Map> errorMap) { + List companyExcelList = deliveryManager.listDeliveryCompany(); + Map companyNameMap = companyExcelList.stream().collect(Collectors.toMap(DeliveryCompanyExcelVO::getName, DeliveryCompanyExcelVO::getDeliveryCompanyId)); + Map> orderMap = list.stream().collect(Collectors.groupingBy(UnDeliveryOrderExcelVO::getSeq)); + for (String seq : orderMap.keySet()) { + List orderExcels = orderMap.get(seq); + DeliveryOrderDTO deliveryOrder = new DeliveryOrderDTO(); + try { + loadOrderData(orderExcels, deliveryOrder, companyNameMap, errorMap); + } catch (Exception e) { + addOrderExcelError(errorMap, OrderExportError.OTHER, e.getMessage()); + continue; + } + if (Objects.nonNull(deliveryOrder.getSelectOrderItems())) { + try { + //订单发货 + orderService.delivery(deliveryOrder); + } catch (Exception e) { + addOrderExcelError(errorMap, OrderExportError.ORDER_ID, seq); + } + } + } + } + + @Override + public String orderExportError(Map> errorMap) { + StringBuilder info = new StringBuilder(Constant.INITIAL_CAPACITY); + for (Integer key : errorMap.keySet()) { + OrderExportError orderExportError = OrderExportError.instance(key); + List list = errorMap.get(key); + if (Objects.equals(orderExportError, OrderExportError.OTHER)) { + info.append(list.toString()).append("\n"); + continue; + } + info.append(Objects.requireNonNull(orderExportError).errorInfo()).append(list.toString()).append("\n"); + } + return info.toString(); + } + + private void loadOrderData(List orderExcels, DeliveryOrderDTO deliveryOrder, Map companyNameMap, Map> errorMap) { + UnDeliveryOrderExcelVO orderExcel = orderExcels.get(0); + //订单id不能为空且该订单必须为当前店铺的订单,并为待发货状态 + if (Objects.isNull(orderExcel.getOrderId())) { + addOrderExcelError(errorMap, OrderExportError.ORDER_ID, orderExcel.getSeq()); + return; + } + OrderVO order = orderService.getOrderByOrderId(Long.valueOf(orderExcel.getOrderId())); + if (Objects.isNull(order) || !Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + addOrderExcelError(errorMap, OrderExportError.ORDER_ID, orderExcel.getSeq()); + return; + } + deliveryOrder.setOrderAddrId(order.getOrderAddrId()); + List orderItemVOList = orderItemService.listOrderItemAndLangByOrderId(Long.valueOf(orderExcel.getOrderId())); + for (OrderItemVO orderItemVO : orderItemVOList) { + if (Objects.equals(orderItemVO.getBeDeliveredNum(), 0) || !Objects.equals(orderItemVO.getBeDeliveredNum(), orderItemVO.getCount())) { + //如果该订单已经被部分发货或全部发货则不予发货 + addOrderExcelError(errorMap, OrderExportError.BE_DELIVERY, orderExcel.getSeq()); + return; + } + } + deliveryOrder.setOrderId(Long.valueOf(orderExcel.getOrderId())); + //配送方式不为空 + if (Objects.isNull(orderExcel.getDeliveryType())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_TYPE, orderExcel.getSeq()); + return; + } + if (Objects.equals(orderExcel.getDeliveryType(), DeliveryType.NOT_DELIVERY.description())) { + deliveryOrder.setDeliveryType(DeliveryType.NOT_DELIVERY.value()); + } else if (Objects.equals(orderExcel.getDeliveryType(), DeliveryType.DELIVERY.description())) { + deliveryOrder.setDeliveryType(DeliveryType.DELIVERY.value()); + } else { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_TYPE, orderExcel.getSeq()); + return; + } + //订单的配送方式为快递配送时,导入的配送方式可选择快递配送和无需快递,其他情况订单的配送方式与导入的配送方式需保持一致 + if (!Objects.equals(deliveryOrder.getDeliveryType(), order.getDeliveryType()) && Objects.equals(order.getDeliveryType(), DeliveryType.DELIVERY.value())) { + if (!Objects.equals(deliveryOrder.getDeliveryType(), DeliveryType.NOT_DELIVERY.value())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_TYPE, orderExcel.getSeq()); + return; + } + } else if (!Objects.equals(deliveryOrder.getDeliveryType(), order.getDeliveryType()) && !Objects.equals(order.getDeliveryType(), DeliveryType.DELIVERY.value())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_TYPE, orderExcel.getSeq()); + return; + } + + //只有快递才需要快递校验 + if (Objects.equals(orderExcel.getDeliveryType(), DeliveryType.DELIVERY.description())) { + //快递公司校验 + if (Objects.isNull(orderExcel.getDeliveryCompanyName())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_COMPANY_NAME, orderExcel.getSeq()); + return; + } + Long deliveryCompanyId = companyNameMap.get(orderExcel.getDeliveryCompanyName()); + deliveryOrder.setDeliveryCompanyId(deliveryCompanyId); + //快递单号校验 + String deliveryNo = orderExcel.getDeliveryNo(); + deliveryNo = StringUtils.deleteWhitespace(deliveryNo); + boolean isTrue = StrUtil.isBlank(deliveryNo) || + !PrincipalUtil.isMatching(PrincipalUtil.WITHOUT_CHINESE, deliveryNo) + || (FLOW_ID_MAX < deliveryNo.length() || FLOW_ID_MIN > deliveryNo.length()); + if (isTrue) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_NO, orderExcel.getSeq()); + return; + } + deliveryOrder.setDeliveryNo(deliveryNo); + } + List orderItemFeignVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItemVO : orderItemVOList) { + DeliveryOrderItemDTO deliveryOrderItemFeignVO = new DeliveryOrderItemDTO(); + deliveryOrderItemFeignVO.setOrderItemId(orderItemVO.getOrderItemId()); + deliveryOrderItemFeignVO.setChangeNum(orderItemVO.getBeDeliveredNum()); + deliveryOrderItemFeignVO.setPic(orderItemVO.getPic()); + deliveryOrderItemFeignVO.setSpuName(orderItemVO.getSpuName()); + deliveryOrderItemFeignVO.setSupplierPic(orderItemVO.getPic()); + deliveryOrderItemFeignVO.setSupplierSpuName(orderItemVO.getSpuName()); + orderItemFeignVOList.add(deliveryOrderItemFeignVO); + } + deliveryOrder.setSelectOrderItems(orderItemFeignVOList); + } + + private void addOrderExcelError(Map> errorMap, OrderExportError orderExportError, String error) { + List list = errorMap.get(orderExportError.value()); + if (CollUtil.isEmpty(list)) { + list = new ArrayList<>(0); + errorMap.put(orderExportError.value(), list); + } + list.add(error); + } + + private String[] getDeliveryCompanyName() { + //快递公司名称 + List companyExcelList = deliveryManager.listDeliveryCompany(); + if (!CollUtil.isEmpty(companyExcelList)) { + String[] companyNames = new String[companyExcelList.size()]; + for (int i = 0; i < companyExcelList.size(); i++) { + DeliveryCompanyExcelVO companyExcel = companyExcelList.get(i); + companyNames[i] = companyExcel.getName(); + } + return companyNames; + } + return null; + } + + private void writeExcel(HttpServletResponse response, List list, Map map) { + ExcelWriter excelWriter = null; + Integer sysType = AuthUserContext.get().getSysType(); + try { + ExcelWriterBuilder excelWriterMerge; + WriteSheet writeSheet; + if (Objects.equals(SysTypeEnum.SUPPLIER.value(), sysType)) { + excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, SupplierUnDeliveryOrderExcelVO.EXCEL_NAME, SupplierUnDeliveryOrderExcelVO.MERGE_ROW_INDEX, + SupplierUnDeliveryOrderExcelVO.MERGE_COLUMN_INDEX); + writeSheet = EasyExcel.writerSheet(SupplierUnDeliveryOrderExcelVO.EXCEL_NAME).head(SupplierUnDeliveryOrderExcelVO.class).build(); + } else if (Objects.equals(SysTypeEnum.PLATFORM.value(), sysType)) { + excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, UnDeliveryOrderExcelVO.EXCEL_NAME, UnDeliveryOrderExcelVO.MERGE_ROW_INDEX, + UnDeliveryOrderExcelVO.MERGE_COLUMN_INDEX); + writeSheet = EasyExcel.writerSheet(UnDeliveryOrderExcelVO.EXCEL_NAME) + .head(UnDeliveryOrderExcelVO.class) + .excludeColumnFieldNames(Arrays.asList("giveawayName", "giveawayCount")).build(); + }else { + excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, UnDeliveryOrderExcelVO.EXCEL_NAME, UnDeliveryOrderExcelVO.MERGE_ROW_INDEX, + UnDeliveryOrderExcelVO.MERGE_COLUMN_INDEX); + writeSheet = EasyExcel.writerSheet(UnDeliveryOrderExcelVO.EXCEL_NAME).head(UnDeliveryOrderExcelVO.class).build(); + } + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, Constant.START_ROW).build(); + excelWriter.write(list, writeSheet); + } catch (Exception e) { + log.error("导出excel失败", e); + } finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderFinanceServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderFinanceServiceImpl.java new file mode 100644 index 0000000..58cfd4f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderFinanceServiceImpl.java @@ -0,0 +1,150 @@ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.feign.UserBalanceLogFeignClient; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.feign.UserLevelLogFeignClient; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.order.constant.Constant; +import com.tmerclub.cloud.order.constant.FinanceBizType; +import com.tmerclub.cloud.order.manager.MongoOrderManager; +import com.tmerclub.cloud.order.manager.MongoOrderRefundManager; +import com.tmerclub.cloud.order.service.OrderFinanceService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单财务 + * + * @author TRACK + */ +@Service +public class OrderFinanceServiceImpl implements OrderFinanceService { + + @Autowired + private MongoOrderRefundManager mongoOrderRefundManager; + @DubboReference + private UserBalanceLogFeignClient userBalanceLogFeignClient; + @DubboReference + private UserLevelLogFeignClient userLevelLogFeignClient; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private MongoOrderManager mongoOrderManager; + + @Override + public PageVO pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO) { + financeDetailDTO.setPageSize(pageDTO.getPageSize()); + financeDetailDTO.setPageNum(pageDTO.getPageNum()); + PageVO result = new PageVO<>(); + if (Objects.equals(financeDetailDTO.getFinanceBizType(), FinanceBizType.ORDER.value())) { + result = mongoOrderManager.pageOrderFinanceDetail(pageDTO, financeDetailDTO); + } else if (Objects.equals(financeDetailDTO.getFinanceBizType(), FinanceBizType.REFUND.value())) { + result = mongoOrderRefundManager.pageRefundFinanceDetail(pageDTO, financeDetailDTO); + } else if (Objects.equals(financeDetailDTO.getFinanceBizType(), FinanceBizType.RECHARGE.value())) { + ServerResponseEntity> balanceResponse = userBalanceLogFeignClient.pageFinanceDetail(financeDetailDTO); + if (!balanceResponse.isSuccess()) { + throw new LuckException(balanceResponse.getMsg()); + } + result = balanceResponse.getData(); + } else if (Objects.equals(financeDetailDTO.getFinanceBizType(), FinanceBizType.LEVEL.value())) { + ServerResponseEntity> levelResponse = userLevelLogFeignClient.pageFinanceDetail(financeDetailDTO); + if (!levelResponse.isSuccess()) { + throw new LuckException(levelResponse.getMsg()); + } + result = levelResponse.getData(); + } + if (CollUtil.isNotEmpty(result.getList())) { + List userIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set shopIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (FinanceDetailVO financeDetailVO : result.getList()) { + userIds.add(financeDetailVO.getUserId()); + shopIds.add(financeDetailVO.getShopId()); + } + // 查询用户信息 + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(userIds); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + List userResponseData = userResponse.getData(); + Map userMap = userResponseData.stream().collect(Collectors.toMap(UserApiVO::getUserId, UserApiVO::getNickName)); + // 查询店铺信息 + List shops = shopDetailFeignClient.listByShopIds(new ArrayList<>(shopIds)).getData(); + Map shopNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(shops)) { + shopNameMap = shops.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + } + // 补充信息 + String shopName; + for (FinanceDetailVO financeDetailVO : result.getList()) { + String userName = userMap.get(financeDetailVO.getUserId()); + financeDetailVO.setUserName(Objects.isNull(userName) ? "用户已注销" : userName); + if (!ObjectUtils.isEmpty(shopName = shopNameMap.get(financeDetailVO.getShopId()))) { + financeDetailVO.setShopName(shopName); + } + } + } + return result; + } + + @Override + public List listExcelFinanceDetail(FinanceDetailDTO financeDetailDTO) { + List listFinanceDetail = mongoOrderManager.listOrderFinanceDetail(financeDetailDTO); + List listRefundFinanceDetail = mongoOrderRefundManager.listRefundFinanceDetail(financeDetailDTO); + if (CollUtil.isNotEmpty(listRefundFinanceDetail)) { + listFinanceDetail.addAll(listRefundFinanceDetail); + } + List financeDetailExcelList = BeanUtil.mapAsList(listFinanceDetail, FinanceDetailExcelVO.class); + ServerResponseEntity> balanceResponse = userBalanceLogFeignClient.listFinanceDetail(financeDetailDTO); + if (!balanceResponse.isSuccess()) { + throw new LuckException(balanceResponse.getMsg()); + } + if (CollUtil.isNotEmpty(balanceResponse.getData())) { + financeDetailExcelList.addAll(balanceResponse.getData()); + } + ServerResponseEntity> levelResponse = userLevelLogFeignClient.listFinanceDetail(financeDetailDTO); + if (!levelResponse.isSuccess()) { + throw new LuckException(levelResponse.getMsg()); + } + if (CollUtil.isNotEmpty(levelResponse.getData())) { + financeDetailExcelList.addAll(levelResponse.getData()); + } + if (CollUtil.isNotEmpty(financeDetailExcelList)) { + financeDetailExcelList = financeDetailExcelList.stream().sorted(Comparator.comparing(FinanceDetailExcelVO::getTransDate).reversed()).collect(Collectors.toList()); + List userIds = financeDetailExcelList.stream().map(FinanceDetailExcelVO::getUserId).collect(Collectors.toList()); + ServerResponseEntity> userResponse = userFeignClient.getUserByUserIds(userIds); + if (!userResponse.isSuccess()) { + throw new LuckException(userResponse.getMsg()); + } + Map userMap = userResponse.getData().stream().collect(Collectors.toMap(UserApiVO::getUserId, UserApiVO::getNickName)); + for (FinanceDetailExcelVO financeDetailVO : financeDetailExcelList) { + String userName = userMap.get(financeDetailVO.getUserId()); + financeDetailVO.setUserName(Objects.isNull(userName) ? "用户已注销" : userName); + financeDetailVO.setBizTypeStr(Objects.requireNonNull(FinanceBizType.instance(financeDetailVO.getBizType())).str()); + financeDetailVO.setPayTypeName(PayType.getPayTypeName(financeDetailVO.getPayType())); + financeDetailVO.setAmount(PriceUtil.toDecimalPrice(financeDetailVO.getTransAmount()).toString()); + } + } + return financeDetailExcelList; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderInvoiceServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderInvoiceServiceImpl.java new file mode 100644 index 0000000..77a268e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderInvoiceServiceImpl.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.mapper.OrderInvoiceMapper; +import com.tmerclub.cloud.order.mapper.OrderMapper; +import com.tmerclub.cloud.order.model.OrderInvoice; +import com.tmerclub.cloud.order.service.OrderInvoiceService; +import com.tmerclub.cloud.order.vo.OrderInvoiceVO; +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.Objects; + +/** + * @author Pineapple + * @date 2021/8/2 8:58 + */ +@Service +public class OrderInvoiceServiceImpl implements OrderInvoiceService { + + @Autowired + private OrderInvoiceMapper orderInvoiceMapper; + @Autowired + private OrderMapper orderMapper; + @Autowired + private SegmentManager segmentManager; + + @Override + public OrderInvoice getByOrderInvoiceId(Long orderInvoiceId) { + return orderInvoiceMapper.getByOrderInvoiceId(orderInvoiceId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(Long userId, OrderInvoice orderInvoice) { + Long orderInvoiceId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_INVOICE, userId); + orderInvoice.setOrderInvoiceId(orderInvoiceId); + orderInvoiceMapper.save(orderInvoice); + orderMapper.updateOrderTime(orderInvoice.getOrderId()); + } + + @Override + public void saveBatch(List orderInvoices) { + orderInvoiceMapper.saveBatch(orderInvoices); + } + + @Override + public void update(OrderInvoice orderInvoice) { + orderInvoiceMapper.update(orderInvoice); + } + + @Override + public void deleteById(Long orderInvoiceId) { + orderInvoiceMapper.deleteById(orderInvoiceId); + } + + @Override + public OrderInvoiceVO getById(Long orderInvoiceId) { + return orderInvoiceMapper.getById(orderInvoiceId, I18nMessage.getLang()); + } + + @Override + public Long getByOrderId(Long orderId, Long shopId, Long supplierId) { + return orderInvoiceMapper.getByOrderId(orderId, shopId, supplierId); + } + + @Override + public boolean isUpload(Long orderId, Long shopId, Long supplierId) { + return orderInvoiceMapper.isUpload(orderId, shopId, supplierId) >= 1; + } + + @Override + public void deleteBatch(List orderIds) { + List orderDeleteIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long orderId : orderIds) { + if (Objects.nonNull(orderInvoiceMapper.getByOrderId(orderId, null, null))) { + //如果该订单有发票信息 + orderDeleteIds.add(orderId); + } + } + if (CollectionUtil.isNotEmpty(orderDeleteIds)) { + orderInvoiceMapper.deleteBatch(orderDeleteIds); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderItemLangServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderItemLangServiceImpl.java new file mode 100644 index 0000000..e904471 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderItemLangServiceImpl.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.order.mapper.OrderItemLangMapper; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.model.OrderItemLang; +import com.tmerclub.cloud.order.service.OrderItemLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 订单项-国际化 + * + * @author YXF + * @date 2021-05-17 15:26:54 + */ +@Service +public class OrderItemLangServiceImpl implements OrderItemLangService { + + @Autowired + private OrderItemLangMapper orderItemLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderItemLangMapper.list()); + } + + @Override + public OrderItemLang getByOrderItemId(Long orderItemId) { + return orderItemLangMapper.getByOrderItemId(orderItemId); + } + + @Override + public void update(OrderItemLang orderItemLang) { + orderItemLangMapper.update(orderItemLang); + } + + @Override + public void deleteById(Long orderItemId) { + orderItemLangMapper.deleteById(orderItemId); + } + + @Override + public void saveOrderItemLang(List orderItems) { + List orderItemLangList = new ArrayList<>(orderItems.size()); + for (OrderItem orderItem : orderItems) { + for (OrderItemLang orderItemLang : orderItem.getOrderItemLangList()) { + orderItemLang.setOrderItemId(orderItem.getOrderItemId()); + orderItemLangList.add(orderItemLang); + } + } +// for (OrderItemLang orderItemLang : orderItemLangList) { +// orderItemLangMapper.save(orderItemLang); +// } + orderItemLangMapper.saveBatch(orderItemLangList); + } + + @Override + public List listOrderItemLangByIds(List orderItemIds) { + return orderItemLangMapper.listOrderItemLangByIds(orderItemIds, I18nMessage.getLang()); + } + + @Override + public List getListByOrderItemId(List orderItemIds, Integer lang) { + return orderItemLangMapper.getListByOrderItemId(orderItemIds, lang); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderItemServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderItemServiceImpl.java new file mode 100644 index 0000000..2e5b2e6 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderItemServiceImpl.java @@ -0,0 +1,479 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.order.bo.DistributionAmountWithOrderIdBO; +import com.tmerclub.cloud.api.order.bo.UserScoreLogOrderBO; +import com.tmerclub.cloud.api.product.feign.CategoryFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.bo.EsOrderItemBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.LangUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.order.mapper.*; +import com.tmerclub.cloud.order.mapper.*; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderItem; +import com.tmerclub.cloud.order.model.OrderItemLang; +import com.tmerclub.cloud.order.model.OrderRefund; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.vo.OrderDetailVO; +import com.tmerclub.cloud.order.vo.OrderItemDetailVO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.BigInteger; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单项 + * + * @author FrozenWatermelon + * @date 2020-12-04 11:27:35 + */ +@Service +public class OrderItemServiceImpl implements OrderItemService { + + private final Logger LOGGER = LoggerFactory.getLogger(OrderItemService.class); + + @Autowired + private OrderItemMapper orderItemMapper; + + @Autowired + private OrderItemLangMapper orderItemLangMapper; + + @DubboReference + private CategoryFeignClient categoryFeignClient; + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private OrderRefundMapper orderRefundMapper; + + @Autowired + private OrderMapper orderMapper; + @Autowired + private OrderPreSaleInfoMapper orderPreSaleInfoMapper; + @DubboReference + private SkuFeignClient skuFeignClient; + + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderItemMapper.list()); + } + + @Override + public com.tmerclub.cloud.common.order.vo.OrderItemVO getByOrderItemId(Long orderItemId) { + return orderItemMapper.getByOrderItemId(orderItemId, I18nMessage.getLang()); + } + + @Override + public void save(OrderItem orderItem) { + orderItemMapper.save(orderItem); + } + + @Override + public void update(OrderItem orderItem) { + orderItemMapper.update(orderItem); + } + + @Override + public void deleteById(Long orderItemId) { + orderItemMapper.deleteById(orderItemId); + } + + @Override + public void deleteBatchByIds(List orderItemIds) { + orderItemMapper.deleteBatchByIds(orderItemIds); + } + + @Override + public List listOrderItemsByOrderId(Long orderId) { + return orderItemMapper.listOrderItemsByOrderId(orderId); + } + + @Override + public List listOrderItemsByOrderIds(Long orderId) { + return orderItemMapper.listOrderItemsByOrderIds(orderId); + } + + @Override + public List listOrderItemAndLangByOrderId(Long orderId) { + List orderItems = orderItemMapper.listOrderItemAndLangByOrderIds(Collections.singletonList(orderId)); + OrderLangUtil.orderItemVOList(orderItems); + return orderItems; + } + + @Override + public List listOrderItemAndLangByOrderIds(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return Collections.emptyList(); + } + List orderItems = orderItemMapper.listOrderItemAndLangByOrderIds(orderIds); + OrderLangUtil.orderItemVOList(orderItems); + return orderItems; + } + + @Override + public List sumTotalDistributionAmountByOrderIds(List orderIds) { + return orderItemMapper.sumTotalDistributionAmountByOrderIds(orderIds); + } + + @Override + public void saveBatch(List orderItems) { + if (CollUtil.isEmpty(orderItems)) { + return; + } + orderItemMapper.saveBatch(orderItems); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBatch(List orderItems) { + for (OrderItem orderItem : orderItems) { + orderItemMapper.update(orderItem); + } + } + + @Override + public List getSpuNameListByOrderIds(long[] orderIdList) { + List spuNameList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderItemLangList = orderItemLangMapper.getLangListByOrderIds(orderIdList); + Map> orderItemLangMap = orderItemLangList.stream().collect(Collectors.groupingBy(OrderItemLangVO::getOrderItemId)); + for (Long orderItemId : orderItemLangMap.keySet()) { + Map spuNameMap = orderItemLangMap.get(orderItemId).stream().collect(Collectors.toMap(OrderItemLangVO::getLang, OrderItemLangVO::getSpuName)); + spuNameList.add(LangUtil.getLangValue(spuNameMap)); + } + return spuNameList; + } + + @Override + public Integer countByOrderId(Long orderId) { + return orderItemMapper.countByOrderId(orderId); + } + + @Override + public Integer sumNumByOrderId(Long orderId) { + return orderItemMapper.sumNumByOrderId(orderId); + } + + @Override + public void updateByDeliveries(List deliveryOrderItems, Integer deliveryType, Long orderId) { + Integer initDeliveryType = deliveryType; + int devType; + for (DeliveryOrderItemDTO deliveryOrderItem : deliveryOrderItems) { + devType = orderItemMapper.getDevTypeByOrderItemId(deliveryOrderItem.getOrderItemId()); + LOGGER.info("物流配送方式为:" + devType + "传参为:" + deliveryType); + if (Objects.equals(devType, DeliveryType.DELIVERY.value()) || Objects.equals(devType, DeliveryType.ONLINE.value())) { + // 如果快递项已有快递类型,则set进去应当是快递类型 + deliveryType = devType; + } + if (Objects.equals(devType, DeliveryType.ONLINE.value()) && Objects.equals(initDeliveryType, DeliveryType.DELIVERY.value())) { + // 如果是线上发货,现改为线下的话就更新为线下 + deliveryType = DeliveryType.DELIVERY.value(); + } + orderItemMapper.updateByDelivery(deliveryOrderItem, deliveryType); + } + // 处理一下组合商品的发货 + List orderItems = listOrderItemsByOrderId(orderId); + if(orderItems.stream().filter(orderItem -> Objects.equals(orderItem.getSpuMold(), SpuMold.COMBO.value())).count() < 1){ + return; + } + Map> childComboItems = orderItems.stream().filter(orderItem -> Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value()) && !Objects.equals(orderItem.getBeDeliveredNum(),-1L)) + .collect(Collectors.groupingBy(OrderItem::getActivityId)); + List updateOrderItems = new ArrayList<>(); + for (Long mainItemId : childComboItems.keySet()) { + // 检查下是否所有的子组合项都发货了 + boolean isDelivery = true; + List items = childComboItems.get(mainItemId); + long unDeliveryCount = items.stream().filter(orderItem -> !Objects.equals(orderItem.getBeDeliveredNum(), 0)).count(); + if(unDeliveryCount == 0){ + long count = items.stream().filter(orderItem -> Objects.equals(orderItem.getDeliveryType(), DeliveryType.DELIVERY.value())).count(); + OrderItem orderItem = new OrderItem(); + orderItem.setOrderItemId(mainItemId); + orderItem.setBeDeliveredNum(0); + // 如果有一个快递发货的方式,那就是快递发货,否则就是第一个的发货方式,因为如果是自提/同城配送/无需快递那就都是这三 + orderItem.setDeliveryType(count > 0 ? DeliveryType.DELIVERY.value() : items.get(0).getDeliveryType()); + orderItemMapper.update(orderItem); + } + } + + } + + @Override + public int countUnDeliveryNumByOrderId(Long orderId) { + return orderItemMapper.countUnDeliveryNumByOrderId(orderId); + } + + @Override + public void reduceUnDeliveryNumByOrderItemId(Long orderItemId, Integer count) { + orderItemMapper.reduceUnDeliveryNumByOrderItemId(orderItemId, count); + } + + @Override + public void updateRefundStatusByOrderId(Long orderId, Integer refundStatus) { + orderItemMapper.updateRefundStatusByOrderId(orderId, refundStatus); + } + + @Override + public OrderDetailVO listDetailByParam(Long orderId, Long refundId) { + OrderDetailVO orderDetailVO = new OrderDetailVO(); + Integer lang = I18nMessage.getLang(); + List list = orderItemMapper.listDetailByOrderId(orderId, lang); + Order order = orderMapper.getByOrderId(orderId); + OrderPreSaleInfoVO orderPreSaleInfoVO = orderPreSaleInfoMapper.getByOrderId(orderId); + List orderItems = orderItemMapper.listOrderItemsByOrderId(orderId); + HashSet spuIdSet = new HashSet<>(Constant.INITIAL_CAPACITY); + orderItems.forEach(s -> spuIdSet.add(s.getSpuId())); + List spuIds = new ArrayList<>(spuIdSet); + List skuVOList = skuFeignClient.listBySpuIds(spuIds); + List supplierSkuIdList = skuVOList.stream() + .filter(sku -> sku.getSupplierSkuId() != null && sku.getSupplierSkuId() != 0) + .map(SkuVO::getSupplierSkuId).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(supplierSkuIdList)) { + LOGGER.info("获取代销商品对应的供应商商品的sku信息,supplierSkuIdList:{}", supplierSkuIdList); + List supplierSkuVOList = skuFeignClient.getByIds(supplierSkuIdList).getData(); + Map supplierSkuMap = supplierSkuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getPriceFee)); + Map skuMap = skuVOList.stream() + .filter(sku -> sku.getSupplierSkuId() != null && sku.getSupplierSkuId() != 0) + .collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getSupplierSkuId)); + Map itemIdMap = orderItems.stream().collect(Collectors.toMap(OrderItem::getOrderItemId, OrderItem::getSkuId)); + for (OrderItemDetailVO detailVO : list) { + Long skuId = itemIdMap.get(detailVO.getOrderItemId()); + if (skuMap.containsKey(skuId)) { + detailVO.setSupplyPriceFee(supplierSkuMap.get(skuMap.get(skuId)) * detailVO.getCount()); + } + } + } + // 过滤掉组合的子商品项 + list = list.stream().filter(orderItemDetailVO -> !Objects.equals(orderItemDetailVO.getActivityType(),OrderActivityType.COMBO_PROD.value())).toList(); + + handleOrderData(refundId, list, order, orderPreSaleInfoVO); + + ServerResponseEntity shopDetailResponseEntity = shopDetailFeignClient.getShopByShopId(order.getShopId()); + LOGGER.info("获取店铺信息,shopDetailResponseEntity:{}", shopDetailResponseEntity); + if (!shopDetailResponseEntity.isSuccess()) { + throw new LuckException(shopDetailResponseEntity.getMsg()); + } + EsShopDetailBO shopDetailBO = shopDetailResponseEntity.getData(); + if (Objects.nonNull(shopDetailBO)) { + orderDetailVO.setShopName(shopDetailBO.getShopName()); + } + + orderDetailVO.setOrderItemDetailList(list); + orderDetailVO.setFreeFreightAmount(order.getFreeFreightAmount()); + orderDetailVO.setPlatformFreeFreightAmount(order.getPlatformFreeFreightAmount()); + orderDetailVO.setFreightAmount(order.getFreightAmount()); + return orderDetailVO; + } + + private void handleOrderData(Long refundId, List list, Order order, OrderPreSaleInfoVO orderPreSaleInfoVO) { + List orderRefunds = new ArrayList<>(); + if (Objects.nonNull(refundId)) { + OrderRefundVO orderRefundVO = orderRefundMapper.getByRefundId(refundId); + LOGGER.info("获取退款单信息,orderRefundVO:{}", orderRefundVO); + orderRefunds.add(BeanUtil.map(orderRefundVO,OrderRefund.class)); + }else{ + orderRefunds = orderRefundMapper.listSuccessOrderRefundByOrderId(order.getOrderId()); + } + Map orderRefundMap = orderRefunds.stream().collect(Collectors.toMap(OrderRefund::getOrderItemId, orderRefund -> orderRefund)); + OrderRefund orderRefund = null; + if(orderRefundMap.containsKey(0L)) { + orderRefund = orderRefundMap.get(0L); + } + for (OrderItemDetailVO detailVO : list) { + if (Objects.equals(order.getOrderType(), OrderType.SECKILL.value())) { + detailVO.setSeckillAmount(detailVO.getMultishopReduce()); + } else if (Objects.equals(order.getOrderType(), OrderType.GROUP.value())) { + detailVO.setGroupAmount(detailVO.getMultishopReduce()); + } + if (Objects.equals(order.getPreSaleType(), PreSaleType.DEPOSIT.value()) && Objects.equals(orderPreSaleInfoVO.getPayStatus(),1)) { + // 平台佣金 + long platformCommission = PriceUtil.divideByBankerRounding((long) (orderPreSaleInfoVO.getDepositAmount() * detailVO.getRate()), 100); + detailVO.setActualTotal(orderPreSaleInfoVO.getDepositAmount()); + detailVO.setPlatformCommission(platformCommission); + } + CategoryVO categoryVO = categoryFeignClient.getByCategoryId(detailVO.getCategoryId()).getData(); + LOGGER.info("获取商品分类信息,categoryVO:{}", categoryVO); + if (Objects.nonNull(categoryVO)) { + ProductLangUtil.category(categoryVO); + detailVO.setCategoryName(categoryVO.getName()); + } + if (Objects.nonNull(orderRefund)) { + detailVO.setRefundCount(detailVO.getCount()); + detailVO.setRefundAmount(detailVO.getActualTotal()); + } else if (orderRefundMap.containsKey(detailVO.getOrderItemId())) { + OrderRefund orderRefundVO = orderRefundMap.get(detailVO.getOrderItemId()); + detailVO.setRefundCount(orderRefundVO.getRefundCount()); + detailVO.setRefundAmount(orderRefundVO.getRefundAmount()); + if (Objects.equals(detailVO.getActivityType(), OrderActivityType.GIVEAWAY.value())) { + detailVO.setRefundCount(detailVO.getCount()); + } + } + } + } + + @Override + public com.tmerclub.cloud.common.order.vo.OrderItemVO getSpuInfoByOrderItemId(Long orderItemId) { + return orderItemMapper.getSpuInfoByOrderItemId(orderItemId, I18nMessage.getLang()); + } + + @Override + public boolean getDevTypeByOrderId(Long orderId) { + List devTypes = orderItemMapper.getDevTypeByOrderId(orderId); + return devTypes.contains(DeliveryType.DELIVERY.value()) || devTypes.contains(DeliveryType.ONLINE.value()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBatchDistributionAmount(List message) { + if (CollUtil.isEmpty(message)) { + return; + } + int row = 0; + for (EsOrderItemBO esOrderItemBO : message) { + row += orderItemMapper.updateBatchDistributionAmount(esOrderItemBO); + } + if (row <= 0) { + return; + } + // 将订单项里面的分销金额统计起来,加到订单的分销总金额里面 + List orderItemIds = message.stream().map(EsOrderItemBO::getOrderItemId).collect(Collectors.toList()); + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setOrderItemIds(orderItemIds); + orderSearchDTO.setPageSize(orderItemIds.size()); + orderSearchDTO.setPageNum(1); + ServerResponseEntity> orderResponseEntity = searchOrderFeignClient.listOrder(orderSearchDTO); + List updateOrders = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map amountMap = message.stream().collect(Collectors.toMap(EsOrderItemBO::getOrderItemId, EsOrderItemBO::getDistributionAmount)); + Map parentAmountMap = message.stream().collect(Collectors.toMap(EsOrderItemBO::getOrderItemId, EsOrderItemBO::getDistributionParentAmount)); + for (EsOrderVO esOrderBO : orderResponseEntity.getData()) { + List items = esOrderBO.getOrderItems(); + Order update = new Order(); + update.setOrderId(esOrderBO.getOrderId()); + BigDecimal distributionAmount = new BigDecimal(BigInteger.ZERO.toString()); + for (EsOrderItemVO item : items) { + if (amountMap.containsKey(item.getOrderItemId())) { + // 直推分销金额 + distributionAmount = distributionAmount.add(new BigDecimal(amountMap.get(item.getOrderItemId()).toString())); + // 间推分销金额 + if (Objects.nonNull(parentAmountMap.get(item.getOrderItemId())) && parentAmountMap.get(item.getOrderItemId()) >= 0) { + distributionAmount = distributionAmount.add(new BigDecimal(parentAmountMap.get(item.getOrderItemId()).toString())); + } + } + } + update.setDistributionAmount(distributionAmount.longValue()); + updateOrders.add(update); + } + // 修改订单分销金额 + for (Order updateOrder : updateOrders) { + orderMapper.updateDistributionAmount(updateOrder); + } + } + + @Override + public List getUserScoreLogDetail(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + return orderItemMapper.getUserScoreLogDetail(orderIds); + } + + @Override + public List getOrderItemByGiveawayOrderItemId(Long userId, Long giveawayOrderItemId) { + if (Objects.isNull(userId) || Objects.equals(giveawayOrderItemId, 0L)) { + return new ArrayList<>(0); + } + List orderItems = orderItemMapper.getOrderItemByGiveawayOrderItemId(userId, giveawayOrderItemId); + OrderLangUtil.orderItemVOList(orderItems); + return orderItems; + } + + @Override + public List getOrderItemByGiveawayOrderItemIds(List giveawayOrderItemIds, Long userId, Integer sysType) { + List orderItems = orderItemMapper.getOrderItemByGiveawayOrderItemIds(giveawayOrderItemIds, userId, sysType); + OrderLangUtil.orderItemVOList(orderItems); + return orderItems; + } + + @Override + public List listOrderItemsByUserIdAndOrderIds(Long userId, List orderIds) { + if (Objects.isNull(userId) || CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + List orderItemList = orderItemMapper.listOrderItemsByUserIdAndOrderIds(userId, orderIds); + OrderLangUtil.orderItemVOList(orderItemList); + return orderItemList; + } + + @Override + public List listByIds(List itemIds) { + return orderItemMapper.listByIds(itemIds); + } + + @Override + public List listOrderItemAndLangByOrderItemIds(List orderItemIds) { + List orderItemList = orderItemMapper.listOrderItemAndLangByOrderItemIds(orderItemIds); + OrderLangUtil.orderItemVOList(orderItemList); + return orderItemList; + } + + @Override + public void updateByGroupSplit(List insertOrderItems) { + List removeItemIds = insertOrderItems.stream().map(OrderItemVO::getOldOderItemId).toList(); + // 1.订单项处理,先删除后保存 + deleteBatchByIds(removeItemIds); + saveBatch(BeanUtil.mapAsList(insertOrderItems,OrderItem.class)); + Map oldItemMap = insertOrderItems.stream().collect(Collectors.toMap(OrderItemVO::getOldOderItemId, OrderItemVO::getOrderItemId)); + // 2.订单语言项处理,先删除之后保存 + List orderItemLangList = orderItemLangMapper.listOrderItemLangByIds(removeItemIds, LanguageEnum.LANGUAGE_ZH_CN.ordinal()); + orderItemLangMapper.deleteBatchByIds(removeItemIds); + for (OrderItemLangVO orderItemLangVO : orderItemLangList) { + orderItemLangVO.setOrderItemId(oldItemMap.get(orderItemLangVO.getOrderItemId())); + } + orderItemLangMapper.saveBatch(BeanUtil.mapAsList(orderItemLangList, OrderItemLang.class)); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderPreSaleInfoServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderPreSaleInfoServiceImpl.java new file mode 100644 index 0000000..b8bc568 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderPreSaleInfoServiceImpl.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.RefundReductionStockBO; +import com.tmerclub.cloud.common.order.bo.RefundStockOperateBO; +import com.tmerclub.cloud.common.order.constant.OrderCloseType; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderPreSaleInfoVO; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.mapper.OrderMapper; +import com.tmerclub.cloud.order.mapper.OrderPreSaleInfoMapper; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderPreSaleInfo; +import com.tmerclub.cloud.order.service.OrderPreSaleInfoService; +import com.tmerclub.cloud.order.vo.OrderAndPreSaleVO; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 订单预售信息 + * + * @author lhd + * @date 2022-08-17 16:36:47 + */ +@Service +public class OrderPreSaleInfoServiceImpl implements OrderPreSaleInfoService { + + @Autowired + private OrderPreSaleInfoMapper orderPreSaleInfoMapper; + @Autowired + private RocketMQTemplate orderRefundSuccessStockTemplate; + @Autowired + private RocketMQTemplate orderPreSaleFailSettlementTemplate; + @Autowired + private RocketMQTemplate couponMqTemplate; + @Autowired + private OrderMapper orderMapper; + @Autowired + private SegmentManager segmentManager; + + @Override + public OrderPreSaleInfoVO getByOrderId(Long orderId) { + return orderPreSaleInfoMapper.getByOrderId(orderId); + } + + @Override + public List listByOrderIds(List orderIds) { + + return orderPreSaleInfoMapper.listByOrderIds(orderIds); + } + + @Override + public void saveBatch(List orderPreSaleInfo, Date createTime) { + if (CollUtil.isEmpty(orderPreSaleInfo)) { + return; + } + + // 获取订单id列表 + for (OrderPreSaleInfo preSaleInfo : orderPreSaleInfo) { + Long id = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_PRE_SALE, preSaleInfo.getUserId()); + preSaleInfo.setCreateTime(createTime); + preSaleInfo.setOrderPreSaleInfoId(id); + } + orderPreSaleInfoMapper.saveBatch(orderPreSaleInfo); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBatch(List orderPreSaleInfoList) { + for (OrderPreSaleInfo orderPreSaleInfo : orderPreSaleInfoList) { + orderPreSaleInfoMapper.update(orderPreSaleInfo); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void handleBalanceTimeExpireOrder(List orderIds, List canalOrderList) { + if (CollectionUtils.isEmpty(orderIds)) { + return; + } + for (Long orderId : orderIds) { + OrderAndPreSaleVO orderAndPreSaleVO = orderMapper.getBalanceTimeExpireByOrderId(orderId); + + // 幂等处理,不符合条件的跳过 + if (Objects.isNull(orderAndPreSaleVO)) { + continue; + } + + if (Objects.equals(orderAndPreSaleVO.getStatus(), OrderStatus.UNPAY.value())) { + // 如果订单未支付的话,将订单设为取消状态 + canalOrderList.add(orderAndPreSaleVO.getOrderId()); + continue; + } + + // 处理订单退款更新 + handleOrderRefund(orderAndPreSaleVO); + // 库存回退 + OrderItemVO dbOrderItem = new OrderItemVO(); + // 供应商发货 + boolean supplierDelivery = Objects.equals(orderAndPreSaleVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()) && + !Objects.equals(orderAndPreSaleVO.getSupplierId(), 0L); + List refundReductionStocks = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItem : orderAndPreSaleVO.getOrderItems()) { + if (orderItem.getMainGiveaway() == null || orderItem.getMainGiveaway() == 1) { + dbOrderItem = orderItem; + } + RefundReductionStockBO refundReductionStockBO = new RefundReductionStockBO(); + refundReductionStockBO.setOrderId(orderAndPreSaleVO.getOrderId()); + refundReductionStockBO.setShopId(orderAndPreSaleVO.getShopId()); + refundReductionStockBO.setActivityId(orderItem.getActivityId()); + refundReductionStockBO.setSpuName(orderItem.getSpuName()); + refundReductionStockBO.setSkuName(orderItem.getSkuName()); + refundReductionStockBO.setCount(orderItem.getCount()); + refundReductionStockBO.setPrice(orderItem.getPrice()); + refundReductionStockBO.setPartyCode(orderItem.getPartyCode()); + refundReductionStockBO.setPic(orderItem.getPic()); + if (supplierDelivery) { + refundReductionStockBO.setSupplierProd(1); + refundReductionStockBO.setSkuId(orderItem.getSupplierSkuId()); + refundReductionStockBO.setSpuId(orderItem.getSupplierSpuId()); + } else { + refundReductionStockBO.setSkuId(orderItem.getSkuId()); + refundReductionStockBO.setSpuId(orderItem.getSpuId()); + } + refundReductionStocks.add(refundReductionStockBO); + } + // 获取商品入库id + Long id = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_BILL_LOG); + + + // 通知还原库存 + SendStatus sendStatus = orderRefundSuccessStockTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SUCCESS_STOCK_TOPIC, new GenericMessage<>(new RefundStockOperateBO(refundReductionStocks, id))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + // 订单超时未支付尾款 商家结算操作 + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = new OrderChangeShopWalletAmountBO(); + orderChangeShopWalletAmountBO.setActualTotal(orderAndPreSaleVO.getDepositAmount()); + orderChangeShopWalletAmountBO.setOrderId(orderAndPreSaleVO.getOrderId()); + orderChangeShopWalletAmountBO.setShopId(orderAndPreSaleVO.getShopId()); + // 平台佣金 + long platformCommission = PriceUtil.divideByBankerRounding((long) ((orderChangeShopWalletAmountBO.getActualTotal()) * dbOrderItem.getRate()), 100); + orderChangeShopWalletAmountBO.setPlatformCommission(platformCommission); + orderChangeShopWalletAmountBO.setPaySysType(orderAndPreSaleVO.getPaySysType()); + SendStatus status = orderPreSaleFailSettlementTemplate.syncSend(RocketMqConstant.ORDER_PRE_SALE_FAIL_SETTLEMENT_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountBO)).getSendStatus(); + if (!Objects.equals(status, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + // 通知退还优惠券 + SendStatus couponSendStatus = couponMqTemplate.syncSend(RocketMqConstant.COUPON_UNLOCK_TOPIC, new GenericMessage<>(orderIds)).getSendStatus(); + if (!Objects.equals(couponSendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + /** + * 处理订单退款更新 + * + * @param orderAndPreSaleVO 订单信息 + */ + private void handleOrderRefund(OrderAndPreSaleVO orderAndPreSaleVO) { + Order order = new Order(); + order.setOrderId(orderAndPreSaleVO.getOrderId()); + order.setStatus(OrderStatus.CLOSE.value()); + order.setCancelTime(new Date()); + order.setUpdateTime(new Date()); + order.setCloseType(OrderCloseType.REFUND.value()); + orderMapper.update(order); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundAddrServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundAddrServiceImpl.java new file mode 100644 index 0000000..3a975d3 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundAddrServiceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.mapper.OrderRefundAddrMapper; +import com.tmerclub.cloud.order.model.OrderRefundAddr; +import com.tmerclub.cloud.order.service.OrderRefundAddrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 用户退货物流地址 + * + * @author FrozenWatermelon + * @date 2021-03-09 13:44:31 + */ +@Service +public class OrderRefundAddrServiceImpl implements OrderRefundAddrService { + + @Autowired + private OrderRefundAddrMapper orderRefundAddrMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderRefundAddrMapper.list()); + } + + @Override + public OrderRefundAddr getByRefundAddrId(Long refundAddrId) { + return orderRefundAddrMapper.getByRefundAddrId(refundAddrId); + } + + @Override + public void save(OrderRefundAddr orderRefundAddr) { + orderRefundAddrMapper.save(orderRefundAddr); + } + + @Override + public void update(OrderRefundAddr orderRefundAddr) { + orderRefundAddrMapper.update(orderRefundAddr); + } + + @Override + public void deleteById(Long refundAddrId) { + orderRefundAddrMapper.deleteById(refundAddrId); + } + + @Override + public OrderRefundAddr getByRefundId(Long refundId) { + return orderRefundAddrMapper.getByRefundId(refundId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundServiceImpl.java new file mode 100644 index 0000000..dd810ec --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundServiceImpl.java @@ -0,0 +1,1845 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONArray; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.feign.SearchOrderRefundFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopRefundAddrFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.multishop.vo.ShopRefundAddrVO; +import com.tmerclub.cloud.api.order.bo.EsOrderRefundBO; +import com.tmerclub.cloud.api.order.constant.BuyerReasonType; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.constant.PurchaseOrderWaitStatus; +import com.tmerclub.cloud.api.order.vo.AccountOrderDetailVO; +import com.tmerclub.cloud.api.order.vo.OrderRefundProdEffectRespVO; +import com.tmerclub.cloud.api.order.vo.OrderRefundSimpleVO; +import com.tmerclub.cloud.api.order.vo.PageShopAccountOrderVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.seckill.dto.SecKillRefundDTO; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierRefundAddrFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiRefundAddrVO; +import com.tmerclub.cloud.api.user.feign.UserFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.constant.OrderCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SendTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.common.order.bo.RefundNotifyBO; +import com.tmerclub.cloud.common.order.bo.RefundReductionStockBO; +import com.tmerclub.cloud.common.order.bo.RefundStockOperateBO; +import com.tmerclub.cloud.common.order.constant.*; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderRefundBO; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderRefundItemBO; +import com.tmerclub.cloud.order.constant.*; +import com.tmerclub.cloud.order.constant.*; +import com.tmerclub.cloud.order.dto.OrderRefundInterventionDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.manager.MongoOrderRefundManager; +import com.tmerclub.cloud.order.mapper.OrderRefundInterventionMapper; +import com.tmerclub.cloud.order.mapper.OrderRefundMapper; +import com.tmerclub.cloud.order.mapper.OrderRefundSettlementMapper; +import com.tmerclub.cloud.order.model.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.model.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.OrderRefundInterventionVO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单退款记录信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class OrderRefundServiceImpl implements OrderRefundService { + + private static final Logger logger = LoggerFactory.getLogger(OrderRefundServiceImpl.class); + + @Autowired + private OrderRefundMapper orderRefundMapper; + @Autowired + private OrderService orderService; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderRefundAddrService orderRefundAddrService; + @Autowired + private OrderRefundSettlementMapper orderRefundSettlementMapper; + @Autowired + private RocketMQTemplate orderRefundSuccessServiceTemplate; + @Autowired + private RocketMQTemplate orderRefundSuccessSettlementTemplate; + @Autowired + private RocketMQTemplate orderSettlementShopByAllinpayTemplate; + @Autowired + private RocketMQTemplate refundSuccessNotifySupplierTemplate; + @Autowired + private RocketMQTemplate orderRefundSuccessStockTemplate; + @Autowired + private RocketMQTemplate sendNotifyToShopTemplate; + @Autowired + private RocketMQTemplate sendNotifyToUserTemplate; + @Autowired + private RocketMQTemplate seckillOrderRefundMqTemplate; + @Autowired + private RocketMQTemplate orderRefundTemplate; + @Autowired + private OrderSettlementService orderSettlementService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoOrderRefundManager mongoOrderRefundManager; + @Autowired + private OrderVirtualInfoService orderVirtualInfoService; + @Autowired + private RocketMQTemplate orderRefundPaymentTemplate; + @Autowired + private OrderRefundInterventionMapper orderRefundInterventionMapper; + @DubboReference + private UserFeignClient userFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @DubboReference + private ShopRefundAddrFeignClient shopRefundAddrFeignClient; + @DubboReference + private SupplierRefundAddrFeignClient supplierRefundAddrFeignClient; + @DubboReference + private SearchOrderRefundFeignClient searchOrderRefundFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + + + @Override + public EsPageVO page(PageDTO pageDTO, OrderRefundSearchDTO orderRefundPage) { + orderRefundPage.setPageNum(pageDTO.getPageNum()); + orderRefundPage.setPageSize(pageDTO.getPageSize()); + // 替换成es的分页查询 + ServerResponseEntity> orderRefundResponseEntity = searchOrderRefundFeignClient.pageOrderRefund(orderRefundPage); + if (!orderRefundResponseEntity.isSuccess()) { + logger.error("查询订单退款记录信息失败,失败原因:{}", orderRefundResponseEntity.getMsg()); + throw new LuckException(orderRefundResponseEntity.getMsg()); + } + for (EsOrderRefundVO esOrderVO : orderRefundResponseEntity.getData().getList()) { + Map> comboMap = esOrderVO.getOrderItems().stream() + .filter(order -> Objects.equals(order.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(EsOrderRefundItemVO::getActivityId)); + if (MapUtil.isEmpty(comboMap)) { + continue; + } + Iterator iterator = esOrderVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + EsOrderRefundItemVO orderItem = iterator.next(); + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + } + orderItem.setComboList(comboMap.get(orderItem.getOrderItemId())); + } + } + return orderRefundResponseEntity.getData(); + } + + @Override + public OrderRefundVO getByRefundId(Long refundId) { + return orderRefundMapper.getByRefundId(refundId); + } + + @Override + public OrderRefundVO getDetailByRefundId(Long refundId) { + OrderRefundVO orderRefundVO = orderRefundMapper.getByRefundId(refundId); + List processingOrderRefunds = orderRefundMapper.getProcessingOrderRefundByOrderId(orderRefundVO.getOrderId()); + // 如果是整单退款,判断一下能否进行平台介入,如果有其他正在进行的就不能进行 + if(Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())){ + orderRefundVO.setCanApplyRefund(CollectionUtil.isEmpty(processingOrderRefunds)); + }else { + List filterOrderRefunds = processingOrderRefunds.stream().filter(orderRefund -> Objects.equals(orderRefund.getOrderItemId(), 0L) || Objects.equals(orderRefund.getOrderItemId(), orderRefundVO.getOrderItemId())).toList(); + orderRefundVO.setCanApplyRefund(CollectionUtil.isEmpty(filterOrderRefunds)); + } + // 获取订单数据 + Order order = orderService.getOrderAndOrderItemData(orderRefundVO.getOrderId(), orderRefundVO.getShopId()); + orderRefundVO.setPayTime(order.getPayTime()); + orderRefundVO.setActualTotal(order.getActualTotal()); + orderRefundVO.setOrderStatus(order.getStatus()); + orderRefundVO.setRefundStatus(order.getRefundStatus()); + orderRefundVO.setShopName(order.getShopName()); + orderRefundVO.setOrderScore(order.getOrderScore()); + orderRefundVO.setOrderItems(new ArrayList<>(0)); + orderRefundVO.setPayType(order.getPayType()); + orderRefundVO.setPlatformFreeFreightAmount(order.getPlatformFreeFreightAmount()); + orderRefundVO.setPaySysType(order.getPaySysType()); + for (OrderItem orderItem : order.getOrderItems()) { + RefundOrderItemVO refundOrderItemVO = BeanUtil.map(orderItem, RefundOrderItemVO.class); + refundOrderItemVO.setRefundScore(orderItem.getUseScore()); + if (Objects.isNull(refundOrderItemVO.getRefundScore())) { + refundOrderItemVO.setRefundScore(0L); + } + orderRefundVO.getOrderItems().add(refundOrderItemVO); + } + + orderRefundVO.setBuyerReasonValue(BuyerReasonType.instance(orderRefundVO.getBuyerReason()).getCn()); + List orderItems = orderRefundVO.getOrderItems(); + getRefundTypeByOrderItem(orderRefundVO, orderRefundVO.getRefundType()); + // 不是整单退款 + if (!Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())) { + orderItems.removeIf(next -> !Objects.equals(orderRefundVO.getOrderItemId(), next.getOrderItemId())); + logger.info("不是整单退款,退款订单项信息:{}", orderItems); + } + OrderLangUtil.orderRefundVOList(orderRefundVO.getOrderItems()); + // 如果有平台介入信息,添加一下介入信息 + handleIntervention(orderRefundVO); + return orderRefundVO; + } + + @Override + public void save(OrderRefund orderRefund) { + Long userId = AuthUserContext.get().getUserId(); + orderRefund.setRefundId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_REFUND, userId)); + orderRefundMapper.save(orderRefund); + } + + @Override + public void update(OrderRefund orderRefund) { + orderRefundMapper.update(orderRefund); + } + + @Override + public void deleteById(Long refundId) { + orderRefundMapper.deleteById(refundId); + } + + @Override + public boolean checkRefundDate(Order order) { + // 判断是否超过支持的退款天数 + if (Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value())) { + long finallyTime = order.getFinallyTime().getTime(); + long currentTime = System.currentTimeMillis(); + int miniTime = Constant.MAX_FINALLY_REFUND_TIME * 24 * 60 * 60 * 1000; + return currentTime - finallyTime <= miniTime; + } + return true; + } + + @Override + public List getProcessOrderRefundByOrderId(Long orderId) { + return orderRefundMapper.getProcessOrderRefundByOrderId(orderId); + } + + /** + * 生成退款单 + * + * @param orderRefund 退款对象 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void applyRefund(OrderRefund orderRefund) { + // 生成退款单 + save(orderRefund); + // 更新订单状态 + Order order = new Order(); + order.setOrderId(orderRefund.getOrderId()); + order.setRefundStatus(RefundStatusEnum.APPLY.value()); + orderService.update(order); + + // 更新订单项状态 + if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) { + orderItemService.updateRefundStatusByOrderId(order.getOrderId(), RefundStatusEnum.APPLY.value()); + logger.info("整单退款,更新订单项状态为申请退款,订单id:{}", order.getOrderId()); + } else { + OrderItem orderItem = new OrderItem(); + orderItem.setOrderItemId(orderRefund.getOrderItemId()); + orderItem.setRefundStatus(RefundStatusEnum.APPLY.value()); + orderItem.setFinalRefundId(orderRefund.getRefundId()); + orderItemService.update(orderItem); + logger.info("部分退款,更新订单项状态为申请退款,订单项id:{}", orderItem.getOrderItemId()); + } + //如果是赠品,需要处理关联赠品订单项 + List giveawayOrderItems = orderItemService.getOrderItemByGiveawayOrderItemId(orderRefund.getUserId(), orderRefund.getOrderItemId()); + if (giveawayOrderItems.size() != 0) { + logger.info("赠品退款,关联赠品订单项,更新订单项状态为申请退款,订单项id:{}", orderRefund.getOrderItemId()); + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItemVO : giveawayOrderItems) { + OrderItem orderItems = BeanUtil.map(orderItemVO, OrderItem.class); + orderItems.setRefundStatus(RefundStatusEnum.APPLY.value()); + list.add(orderItems); + } + orderItemService.updateBatch(list); + } + + // TODO -y 改为mysql查询 + // 消息推送-申请退款 + SendNotifyBO notifyBO = getSendNotifyBO(orderRefund.getOrderId()); + notifyBO.setPrice(PriceUtil.toDecimalPrice(orderRefund.getRefundAmount()).toString()); + notifyBO.setSendType(SendTypeEnum.LAUNCH_REFUND.getValue()); + notifyBO.setBizId(orderRefund.getOrderId()); + notifyBO.setRemark(orderRefund.getBuyerDesc()); + notifyBO.setRejectMessage(BuyerReasonType.instance(orderRefund.getBuyerReason()).getCn()); + SendStatus sendBizStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyBO)).getSendStatus(); + } + + private SendNotifyBO getSendNotifyBO(Long orderId) { + List sendNotifyList = orderService.listSimpleSendNotifyBO(Collections.singletonList(orderId)); + if (CollUtil.isEmpty(sendNotifyList)) { + return new SendNotifyBO(); + } + return sendNotifyList.get(0); + } + + + /** + * 买家提交物流信息 + * + * @param orderRefund 退款单对象 + * @param orderRefundAddr 退款物流单对象 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void submitExpress(OrderRefund orderRefund, OrderRefundAddr orderRefundAddr) { + orderRefundAddrService.update(orderRefundAddr); + + // 更新退款单信息 + if (!Objects.equals(ReturnProcessStatusEnum.CONSIGNMENT.value(), orderRefund.getReturnMoneySts())) { + orderRefund.setReturnMoneySts(ReturnProcessStatusEnum.CONSIGNMENT.value()); + logger.info("买家提交物流信息,更新退款单状态为买家已发货,退款单id:{}", orderRefund.getRefundId()); + } + orderRefund.setDeliveryTime(new Date()); + orderRefund.setUpdateTime(new Date()); + update(orderRefund); + + // 消息推送-用户已退货 + SendNotifyBO notifyBO = getSendNotifyBO(orderRefund.getOrderId()); + notifyBO.setPrice(PriceUtil.toDecimalPrice(orderRefund.getRefundAmount()).toString()); + //供应商处理的退款,给供应商发送用户退货提醒 + // 供应商处理状态, -1.商家自行处理 0.待供应商处理 1.供应商已同意 2.供应商已拒绝 + if (!Objects.equals(orderRefund.getSupplierHandleStatus(), -1)) { + notifyBO.setShopId(null); + notifyBO.setSupplierId(orderRefund.getSupplierId()); + notifyBO.setSendType(SendTypeEnum.RETURN_REFUND_TO_SUPPLIER.getValue()); + } else { + notifyBO.setSendType(SendTypeEnum.RETURN_REFUND.getValue()); + } + + notifyBO.setBizId(orderRefund.getOrderId()); + notifyBO.setRemark(orderRefund.getBuyerDesc()); + notifyBO.setRejectMessage(BuyerReasonType.instance(orderRefund.getBuyerReason()).getCn()); + SendStatus sendBizStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyBO)).getSendStatus(); + + //notifyTemplateService.sendNotifyByUserRefundDelivery(order, SendType.RETURN_REFUND); + } + + @Override + public Integer countByReturnMoneyStsAndOrderId(Integer returnMoneySts, Integer returnMoneySts2, Long orderId) { + return orderRefundMapper.countByReturnMoneyStsAndOrderId(returnMoneySts, returnMoneySts2, orderId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void agreeReturns(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVO, Integer sysType) { + if (Objects.isNull(orderRefundParam.getShopRefundAddrId())) { + throw new LuckException("请设置退货物流信息"); + } + // 同意退款退货操作 + // 设置退货物流信息 + if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + ServerResponseEntity refundAddrResponse = supplierRefundAddrFeignClient.getSupplierRefundAddrByRefundAddrId(orderRefundParam.getShopRefundAddrId()); + if (!refundAddrResponse.isSuccess() || refundAddrResponse.getData() == null) { + throw new LuckException("请设置退货物流信息"); + } + SupplierApiRefundAddrVO refundAddr = refundAddrResponse.getData(); + OrderRefundAddr orderRefundAddr = new OrderRefundAddr(); + orderRefundAddr.setUserId(orderRefundVO.getUserId()); + orderRefundAddr.setShopId(orderRefundVO.getShopId()); + orderRefundAddr.setRefundId(orderRefundVO.getRefundId()); + orderRefundAddr.setConsigneeName(refundAddr.getConsignee()); + orderRefundAddr.setConsigneeMobile(refundAddr.getMobile()); + orderRefundAddr.setConsigneePostCode(refundAddr.getPostCode()); + String addr = refundAddr.getProvince() + refundAddr.getCity() + refundAddr.getArea() + refundAddr.getAddr(); + orderRefundAddr.setConsigneeAddr(addr); + orderRefundAddrService.save(orderRefundAddr); + } else { + ServerResponseEntity refundAddrResponse = shopRefundAddrFeignClient.getShopRefundAddrByRefundAddrId(orderRefundParam.getShopRefundAddrId()); + if (!refundAddrResponse.isSuccess() || refundAddrResponse.getData() == null) { + throw new LuckException("请设置退货物流信息"); + } + ShopRefundAddrVO refundAddr = refundAddrResponse.getData(); + OrderRefundAddr orderRefundAddr = new OrderRefundAddr(); + orderRefundAddr.setShopId(orderRefundVO.getShopId()); + orderRefundAddr.setRefundId(orderRefundVO.getRefundId()); + orderRefundAddr.setUserId(orderRefundVO.getUserId()); + orderRefundAddr.setConsigneeMobile(refundAddr.getMobile()); + orderRefundAddr.setConsigneeName(refundAddr.getConsignee()); + orderRefundAddr.setConsigneePostCode(refundAddr.getPostCode()); + String addr = refundAddr.getProvince() + refundAddr.getCity() + refundAddr.getArea() + refundAddr.getAddr(); + orderRefundAddr.setConsigneeAddr(addr); + orderRefundAddrService.save(orderRefundAddr); + } + + + int agreeStats = orderRefundMapper.agreeReturns(orderRefundParam.getSellerMsg(), orderRefundVO.getRefundId()); + if (agreeStats == 0) { + throw new LuckException("订单退款状态已发生改变,请勿重复操作"); + } + // TODO 消息推送--同意退款 + List notifyBOList = orderService.listSendNotifyByOrderIds(Collections.singletonList(orderRefundVO.getOrderId())); + SendNotifyBO sendNotifyBO = notifyBOList.get(0); + sendNotifyBO.setSendType(SendTypeEnum.AGREE_REFUND.getValue()); + sendNotifyBO.setPrice(PriceUtil.toDecimalPrice(orderRefundVO.getRefundAmount()).toString()); + SendStatus sendBizStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(notifyBOList)).getSendStatus(); + } + + @Override + public Boolean getIsLastRefund(Long refundId, Long shopId) { + OrderRefundVO orderRefundVo = getDetailByRefundId(refundId); + if (Objects.isNull(orderRefundVo)) { + //退款单不存在 + logger.error("退款单不存在"); + throw new LuckException("退款单不存在"); + } + if (Objects.equals(orderRefundVo.getRefundType(), RefundType.ALL.value())) { + //整单退款 + logger.info("整单退款"); + return false; + } + if (Objects.equals(orderRefundVo.getApplyType(), RefundApplyType.REFUND_AND_RETURNS.value())) { + //退货退款 + logger.info("退货退款"); + return false; + } + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVo.getOrderId(), orderRefundVo.getUserId()); + if (!Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + //非待发货 + logger.info("非待发货"); + return false; + } + // 如果存在分销订单,则计算分销总金额 + List orderItemList = orderItemService.listOrderItemsByOrderIds(order.getOrderId()); + // 获取所有的订单项总数 + int orderItemCount = orderItemList.size(); + //退款成功总数 + // 获取所有正在进行中的退款订单 + int refundCount = countSuccessItemNum(order.getOrderId()); + return Objects.equals(refundCount, orderItemCount - 1); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundSuccess(RefundNotifyBO refundNotifyBO) { + Long refundId = refundNotifyBO.getRefundId(); + OrderRefundVO orderRefundVO = orderRefundMapper.getByRefundId(refundId); + // 已经进行过退款了 + if (Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value())) { + return; + } + + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundId(refundId); + orderRefund.setRefundTime(new Date()); + if (Objects.equals(orderRefundVO.getSupplierHandleStatus(), SupplierHandleStatus.TRANSFER_SUPPLIER.value())) { + orderRefund.setSupplierHandleStatus(SupplierHandleStatus.SUPPLIER_AGREE.value()); + } + if (Objects.equals(orderRefundVO.getPlatformInterventionStatus(), PlatformInterventionStatus.AGREE.value())) { + orderRefund.setPlatformInterventionStatus(PlatformInterventionStatus.SUCCESS.value()); + orderRefund.setInterventionFinishTime(new Date()); + }else { + orderRefund.setReturnMoneySts(ReturnProcessStatusEnum.SUCCESS.value()); + } + // 更新退款状态 + orderRefundMapper.update(orderRefund); + // 更新结算单状态 + int updateStatus = orderRefundSettlementMapper.updateToSuccessByRefundId(refundId); + if (updateStatus < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + Order dbOrder = orderService.getByOrderId(refundNotifyBO.getOrderId()); + OrderItemVO dbOrderItem = orderItemService.getByOrderItemId(orderRefundVO.getOrderItemId()); + Order order = new Order(); + + // 处理订单退款更新 + this.handleOrderRefund(refundNotifyBO, orderRefundVO, dbOrder, order,dbOrderItem); + + // 还原库存和商品销量 + this.reductionStock(orderRefundVO, dbOrder, dbOrderItem); + + boolean canRefundFlag = Objects.equals(dbOrder.getStatus(), OrderStatus.PAYED.value()) + || Objects.equals(dbOrder.getStatus(), OrderStatus.CONSIGNMENT.value()) + || Objects.equals(dbOrder.getStatus(), OrderStatus.SUCCESS.value()); + // 退款订单关闭,还原优惠券以及订单结算 + if (canRefundFlag && Objects.equals(order.getStatus(), OrderStatus.CLOSE.value())) { + // 订单在已支付,已发货,确认收货的情况下,退款导致订单关闭 + // 需要判断下是否要进行结算给商家的操作,这个结算的计算是退款完成后结算的,所以不要随便改变顺序 + handlePartialRefund(dbOrder, orderRefundVO); + } + refundNotifyBO.setCanRefund(canRefundFlag); + refundNotifyBO.setOrderStatus(order.getStatus()); + refundNotifyBO.setDbOrderStatus(dbOrder.getStatus()); + refundNotifyBO.setUserId(dbOrder.getUserId()); + refundNotifyBO.setOrderScore(dbOrder.getOrderScore()); + // 通知还原优惠券&&还原成长值&&退还积分&&添加余额退款记录 + SendStatus sendStatus = orderRefundSuccessServiceTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SUCCESS_SERVICE_TOPIC, new GenericMessage<>(refundNotifyBO)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + + OrderRefundVO orderRefundDb = orderRefundMapper.getByRefundId(orderRefund.getRefundId()); + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(refundNotifyBO.getOrderId()); + OrderRefundVO orderRefundVo = new OrderRefundVO(); + orderRefundVo.setRefundId(refundNotifyBO.getRefundId()); + orderRefundVo.setRefundAmount(orderRefundDb.getRefundAmount()); + orderRefundVo.setOrderId(order.getOrderId()); + orderRefundVo.setPayId(orderSettlement.getPayId()); + orderRefundVo.setPayType(orderSettlement.getPayType()); + orderRefundVo.setRefundType(RefundType.ALL.value()); + orderRefundVo.setPlatformRefundAmount(orderRefundDb.getPlatformRefundAmount()); + orderRefundVo.setShopId(orderRefundDb.getShopId()); + orderRefundVo.setPlatformRefundCommission(orderRefundDb.getPlatformRefundCommission()); + orderRefundVo.setPurPlatformRefundCommission(orderRefundDb.getPurPlatformRefundCommission()); + orderRefundVo.setPurchaseRefundAmount(orderRefundDb.getPurchaseRefundAmount()); + orderRefundVo.setWaitPurchase(dbOrder.getWaitPurchase()); + if(Objects.equals(dbOrder.getStatus(),OrderStatus.PAYED.value()) || Objects.equals(dbOrder.getStatus(),OrderStatus.WAIT_GROUP.value())) { + orderRefundVo.setFreightAmount(dbOrder.getFreightAmount()); + } + orderRefundVo.setUnSuccessGroupOrder(1); + + SendStatus sendStockStatus = orderRefundTemplate.syncSend(RocketMqConstant.ORDER_REFUND_TOPIC, new GenericMessage<>(orderRefundVo)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private void handleIntervention(OrderRefundVO orderRefundVO) { + if(Objects.nonNull(orderRefundVO.getApplyInterventionTime())){ + orderRefundVO.setInterventionEndTime(DateUtil.offsetHour(orderRefundVO.getApplyInterventionTime(),72)); + orderRefundVO.setPlatformProcessingEndTime(DateUtil.offsetDay(orderRefundVO.getApplyInterventionTime(), 7)); + } + List orderRefundInterventionList = orderRefundInterventionMapper.listByRefundId(orderRefundVO.getRefundId()); + // 处理一下名称?还是直接在保存时存入名称?还是处理名称比较好 + Map> refundInterventionMap = orderRefundInterventionList.stream().collect(Collectors.groupingBy(OrderRefundInterventionVO::getSysType)); + String userNickName = ""; + if(CollectionUtil.isNotEmpty(refundInterventionMap.get(SysTypeEnum.ORDINARY.value()))) { + ServerResponseEntity userData = userFeignClient.getUserData(refundInterventionMap.get(SysTypeEnum.ORDINARY.value()).get(0).getBizId()); + if (!userData.isSuccess()) { + throw new LuckException(userData.getMsg()); + } + userNickName = Objects.isNull(userData.getData()) ? "用户已注销" : userData.getData().getNickName(); + } + String shopName = ""; + if(CollectionUtil.isNotEmpty(refundInterventionMap.get(SysTypeEnum.MULTISHOP.value()))) { + ServerResponseEntity shopResp = shopDetailFeignClient.getShopByShopId(refundInterventionMap.get(SysTypeEnum.MULTISHOP.value()).get(0).getBizId()); + if (!shopResp.isSuccess()) { + throw new LuckException(shopResp.getMsg()); + } + shopName = Objects.isNull(shopResp.getData()) ? "" : shopResp.getData().getShopName(); + } + String supplierName = ""; + if(CollectionUtil.isNotEmpty(refundInterventionMap.get(SysTypeEnum.SUPPLIER.value()))) { + ServerResponseEntity suppierResp = supplierDetailFeignClient.getSupplierBySupplierId(refundInterventionMap.get(SysTypeEnum.SUPPLIER.value()).get(0).getBizId()); + if (!suppierResp.isSuccess()) { + throw new LuckException(suppierResp.getMsg()); + } + supplierName = Objects.isNull(suppierResp.getData()) ? "" : suppierResp.getData().getSupplierShopName(); + } + for (OrderRefundInterventionVO orderRefundIntervention : orderRefundInterventionList) { + switch (orderRefundIntervention.getSysType()){ + case 0: + orderRefundIntervention.setBizName(userNickName); + break; + case 1: + orderRefundIntervention.setBizName(shopName); + break; + case 3: + orderRefundIntervention.setBizName(supplierName); + break; + default: + break; + } + } + orderRefundVO.setOrderRefundInterventionList(orderRefundInterventionList); + } + + + /** + * 处理订单退款更新 + * + * @param refundNotifyBO 退款通知 + * @param orderRefundVO 订单退款信息 + * @param dbOrder 订单信息 + * @param order 订单更新数据 + * @param dbOrderItem + */ + private void handleOrderRefund(RefundNotifyBO refundNotifyBO, OrderRefundVO orderRefundVO, Order dbOrder, Order order, OrderItemVO dbOrderItem) { + order.setOrderId(refundNotifyBO.getOrderId()); + if (Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())) { + order.setStatus(OrderStatus.CLOSE.value()); + } else { + // 查看是否已经达到了所有的订单商品数量,如是则订单关闭 + // 已退款单 + Integer refundSuccessRefundCount = orderRefundMapper.countRefundSuccessRefundCountByOrderId(refundNotifyBO.getOrderId()); + Integer itemNum = orderItemService.sumNumByOrderId(refundNotifyBO.getOrderId()); + // 整个订单完成退款的时候 + if (refundSuccessRefundCount >= itemNum) { + order.setStatus(OrderStatus.CLOSE.value()); + } else { + order.setRefundStatus(RefundStatusEnum.PARTIAL_SUCCESS.value()); + } + + // 判断一下如果是虚拟订单且不是无需核销,其他的订单项都是已经核销成功的情况下,那么订单也是关闭的 + int unVerifyNum = orderVirtualInfoService.countWriteOffByOrderId(refundNotifyBO.getOrderId()); + if (itemNum == (unVerifyNum + refundSuccessRefundCount)) { + order.setStatus(OrderStatus.CLOSE.value()); + } + + // 退款成功后,订单没有关闭,且订单为待发货,减少订单待发货商品数量 + if (!Objects.equals(order.getStatus(), OrderStatus.CLOSE.value()) && Objects.equals(dbOrder.getStatus(), OrderStatus.PAYED.value())) { + Long orderItemId = orderRefundVO.getOrderItemId(); + // 减少订单待发货商品数量 + orderItemService.reduceUnDeliveryNumByOrderItemId(orderItemId, orderRefundVO.getRefundCount()); + // + int unDeliveryNum = orderItemService.countUnDeliveryNumByOrderId(refundNotifyBO.getOrderId()); + if (Objects.equals(unDeliveryNum, 0)) { + // 如果订单为快递发货情况,查询所有的订单项发货情况,如果有个是快递发货则是快递发货,否则全是无需快递则订单也为无需快递方式。 + if (Objects.equals(dbOrder.getDeliveryType(), DeliveryType.DELIVERY.value())) { + List orderItemList = orderItemService.listOrderItemAndLangByOrderId(refundNotifyBO.getOrderId()); + int deliveryType = DeliveryType.NOT_DELIVERY.value(); + for (OrderItemVO orderItemVO : orderItemList) { + if (Objects.nonNull(orderItemVO.getDeliveryType()) && Objects.equals(orderItemVO.getDeliveryType(), DeliveryType.DELIVERY.value())) { + deliveryType = DeliveryType.DELIVERY.value(); + break; + } + } + order.setDeliveryType(deliveryType); + } + order.setStatus(OrderStatus.CONSIGNMENT.value()); + order.setDeliveryTime(new Date()); + } + // 如果是待采购状态,退款成功后,订单的采购金额要重新计算 + if(Objects.equals(dbOrder.getWaitPurchase(),PurchaseOrderWaitStatus.WAIT_PURCHASE.value())){ + // 当前订单项需要补充采购的金额 = 订单实际支付金额 + 平台优惠金额 - 平台佣金 - 分销佣金 - 采购金额 + long purchaseAmount = dbOrderItem.getActualTotal() + dbOrderItem.getPlatformShareReduce() + - dbOrderItem.getDistributionAmount() - dbOrderItem.getPlatformCommission() - dbOrderItem.getItemPurchaseAmount(); + // 如果大于0则表示这个item不需要补采购金额,否则需要补采购金额 + purchaseAmount = purchaseAmount > 0 ? 0 : Math.abs(purchaseAmount); + order.setPurchaseSpreadAmount(dbOrder.getPurchaseSpreadAmount() - Math.abs(purchaseAmount)); + } + } + } + if (Objects.equals(order.getStatus(), OrderStatus.CLOSE.value())) { + order.setCancelTime(new Date()); + order.setUpdateTime(new Date()); + order.setCloseType(OrderCloseType.REFUND.value()); + order.setRefundStatus(RefundStatusEnum.SUCCEED.value()); + } + // 更新订单项状态 + if (Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())) { + orderItemService.updateRefundStatusByOrderId(order.getOrderId(), RefundStatusEnum.SUCCEED.value()); + } else { + OrderItem orderItem = new OrderItem(); + orderItem.setOrderItemId(orderRefundVO.getOrderItemId()); + // 因为我们商城目前设计为一个订单项只能进行一次退款,无法进行多次退款 + if (dbOrderItem.getCount() > orderRefundVO.getRefundCount()) { + orderItem.setRefundStatus(RefundStatusEnum.PARTIAL_SUCCESS.value()); + } else { + orderItem.setRefundStatus(RefundStatusEnum.SUCCEED.value()); + } + orderItemService.update(orderItem); + } + orderService.update(order); + } + + /** + * 处理下部分退款完成,订单关闭的时候未结算变成已结算的金额处理,退款超时定时任务。 + * + * @param order 订单信息 + * @param orderRefundVO + */ + private void handlePartialRefund(Order order, OrderRefundVO orderRefundVO) { +// // 待采购订单退款不需要结算 +// if (Objects.equals(order.getWaitPurchase(), PurchaseOrderWaitStatus.WAIT_PURCHASE.value())) { +// return; +// } + // 1.获取到部分退款并且订单关闭后,需要结算给商家、平台的钱 + // 获取所有正在进行中的退款订单 + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = getPartialRefundOrderChangeShopWalletAmountBO(order, orderRefundVO); + // 商家要结算的钱 - 实际金额 - 退款金额 + long partialRefundAmount = order.getActualTotal() - orderChangeShopWalletAmountBO.getRefundAmount(); + + // 已发货的订单,如果有平台优惠的运费金额,结算时要把钱给到商家 + if (!Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + partialRefundAmount = partialRefundAmount + orderChangeShopWalletAmountBO.getPlatformFreeFreightAmount(); + } + + + // 如果商家和供应商需要结算的钱都为0,则不需要进行结算了 + if (partialRefundAmount > 0) { + // 2.发送消息给商家,将需要结算的钱进行结算 + SendStatus sendStatus = orderRefundSuccessSettlementTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountBO)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 因为商家结算这里也有结算供应商,所以直接return + return; + } + + + // 非供应商订单到这一步已经结束了 + if (Objects.equals(orderChangeShopWalletAmountBO.getSupplierId(), 0L)) { + return; + } + + // 供应商要结算的钱 + long supplierAmount = orderChangeShopWalletAmountBO.getChangePurchaseAmount() + orderChangeShopWalletAmountBO.getFreightAmount() + - orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission(); + + if (supplierAmount > 0) { + // 供应商 添加结算金额 + SendStatus sendSupplierStatus = refundSuccessNotifySupplierTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SUCCESS_SETTLEMENT_SUPPLIER_TOPIC, new GenericMessage<>(orderChangeShopWalletAmountBO)).getSendStatus(); + if (!Objects.equals(sendSupplierStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + + private OrderChangeShopWalletAmountBO getPartialRefundOrderChangeShopWalletAmountBO(Order order, OrderRefundVO orderRefundVO) { + List orderRefunds = getProcessOrderRefundByOrderId(order.getOrderId()); + long alreadyRefundAmount = 0L; + long changePlatformCommission = 0L; + long platformRefundAllowanceAmount = 0L; + long changePurchasePlatformCommission = 0L; + long changePurchaseRefundAmount = 0L; + long refundPurchaseRefundAmount = 0L; + long refundPurchasePlatformCommission = 0L; + long supplierFreightAmount = 0L; + List orderItemList = orderItemService.listOrderItemsByOrderId(order.getOrderId()); + long purchaseAmount = orderItemList.stream().mapToLong(OrderItem::getItemPurchaseAmount).sum(); + long purchasePlatformCommission = orderItemList.stream().mapToLong(OrderItem::getPurchasePlatformCommission).sum(); + for (OrderRefund orderRefund : orderRefunds) { + alreadyRefundAmount += orderRefund.getRefundAmount(); + changePlatformCommission += orderRefund.getPlatformRefundCommission(); + platformRefundAllowanceAmount += orderRefund.getPlatformRefundAmount(); + + refundPurchaseRefundAmount += orderRefund.getPurchaseRefundAmount(); + refundPurchasePlatformCommission += orderRefund.getPurPlatformRefundCommission(); + // 需要判断下是采购前的退款,还是采购后的 + // 采购前的自行处理退款,不需要结算给供应商,采购后的自行处理退款需要结算给供应商 + // 如果是退款平台介入先判断退款平台介入,如果平台处理方式为共同承担的情况下,供应商才需要退款减少金额 + boolean checkPlatformRefundType = Objects.nonNull(orderRefund.getInterventionRefundType()) && Objects.equals(orderRefund.getInterventionRefundType(), RefundInterventionType.COMMON.value()); + if(!Objects.equals(orderRefund.getPlatformInterventionStatus(),-1) && checkPlatformRefundType){ + changePurchaseRefundAmount += orderRefund.getPurchaseRefundAmount(); + changePurchasePlatformCommission += orderRefund.getPurPlatformRefundCommission(); + } + // 没有平台介入,那么退款供应商有处理过就共同退款,此时供应商才需要退款减少金额 + if (Objects.equals(orderRefund.getPlatformInterventionStatus(),-1) && !Objects.equals(orderRefund.getSupplierHandleStatus(), SupplierHandleStatus.NORMAL.value())) { + changePurchaseRefundAmount += orderRefund.getPurchaseRefundAmount(); + changePurchasePlatformCommission += orderRefund.getPurPlatformRefundCommission(); + } + if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) { + break; + } + } + + // 待发货的订单结算时,平台优惠金额要加上运费优惠的金额(待发货退款是要退运费的,所以这时要把平台优惠的运费也算上,下面计算改变金额时才不会重复计算运费的金额了) + if (Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + platformRefundAllowanceAmount = platformRefundAllowanceAmount + order.getPlatformFreeFreightAmount(); + } + + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = getOrderChangeShopWalletAmountBO(order, orderRefunds,orderRefundVO, alreadyRefundAmount, changePlatformCommission, platformRefundAllowanceAmount, changePurchasePlatformCommission, changePurchaseRefundAmount, refundPurchaseRefundAmount, refundPurchasePlatformCommission, supplierFreightAmount, purchaseAmount, purchasePlatformCommission); + // 商家要结算的钱 + long partialRefundAmount = order.getActualTotal() - alreadyRefundAmount; + // 供应商要结算的钱 + long supplierAmount = orderChangeShopWalletAmountBO.getChangePurchaseAmount() + orderChangeShopWalletAmountBO.getFreightAmount() + - orderChangeShopWalletAmountBO.getChangePurchasePlatformCommission(); + // 如果是通联支付,先进行通联结算,再回调进行商家结算 + boolean settlementAllinpay = partialRefundAmount > 0 || orderChangeShopWalletAmountBO.getPlatformAllowanceAmount() > 0 || supplierAmount > 0; + if (Objects.equals(orderChangeShopWalletAmountBO.getPaySysType(), PaySysType.ALLINPAY.value()) && settlementAllinpay) { + // 1.发送消息给通联,进行通联结算 + // 开启消息 + SendStatus sendStatus = orderSettlementShopByAllinpayTemplate.syncSend(RocketMqConstant.ORDER_SETTLED_SHOP_BY_ALLINPAY_TOPIC, new GenericMessage<>(Collections.singletonList(orderChangeShopWalletAmountBO))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new LuckException(ResponseEnum.EXCEPTION); + } + return orderChangeShopWalletAmountBO; + } + // 如果是待采购订单,退款结算时,计算一下佣金 + if(Objects.equals(order.getWaitPurchase(),1)){ + Map orderRefundMap = orderRefunds.stream().collect(Collectors.toMap(OrderRefund::getOrderItemId, orderRefund -> orderRefund)); + OrderRefund orderRefund = null; + if(orderRefundMap.containsKey(0L)) { + orderRefund = orderRefundMap.get(0L); + } + List orderItems = orderItemService.listOrderItemsByOrderId(order.getOrderId()); + Long settlementAmount = orderChangeShopWalletAmountBO.getActualTotal() - orderChangeShopWalletAmountBO.getRefundAmount(); + Long platformCommission = 0L; + for (OrderItem orderItem : orderItems) { + // 商品佣金 = (订单项实付金额 - 订单项应退金额(订单项实付金额 * 订单退款金额 / 订单实际金额)) * 佣金比例 + Long itemSettlementAmount = orderItem.getActualTotal(); + if(Objects.nonNull(orderRefund)){ + itemSettlementAmount = orderItem.getActualTotal() - PriceUtil.divideByBankerRounding(orderItem.getActualTotal() * orderRefund.getRefundAmount(),order.getActualTotal()); + }else if(orderRefundMap.containsKey(orderItem.getOrderItemId())){ + OrderRefund itemOrderRefund = orderRefundMap.get(orderItem.getOrderItemId()); + itemSettlementAmount = orderItem.getActualTotal() - itemOrderRefund.getRefundAmount(); + } + long itemPlatformCommission = PriceUtil.divideByBankerRounding((long)(itemSettlementAmount * orderItem.getRate()),100); + platformCommission += itemPlatformCommission; + } + orderChangeShopWalletAmountBO.setPlatformCommission(platformCommission); + } + return orderChangeShopWalletAmountBO; + } + + private static OrderChangeShopWalletAmountBO getOrderChangeShopWalletAmountBO(Order order, List orderRefunds, OrderRefundVO orderRefundVO, long alreadyRefundAmount, long changePlatformCommission, long platformRefundAllowanceAmount, long changePurchasePlatformCommission, long changePurchaseRefundAmount, long refundPurchaseRefundAmount, long refundPurchasePlatformCommission, long supplierFreightAmount, long purchaseAmount, long purchasePlatformCommission) { + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = new OrderChangeShopWalletAmountBO(); + orderChangeShopWalletAmountBO.setOrderStatus(order.getStatus()); + orderChangeShopWalletAmountBO.setRefundId(orderRefundVO.getRefundId()); + orderChangeShopWalletAmountBO.setActualTotal(order.getActualTotal()); + orderChangeShopWalletAmountBO.setRefundAmount(alreadyRefundAmount); + orderChangeShopWalletAmountBO.setPlatformFreeFreightAmount(order.getPlatformFreeFreightAmount()); + orderChangeShopWalletAmountBO.setPlatformAllowanceAmount(order.getPlatformAmount() - platformRefundAllowanceAmount); + // 如果是待发货状态,运费要退给用户,此时供应商是不能加上运费 + if (Objects.equals(order.getStatus(), OrderStatus.PAYED.value()) && !Objects.equals(order.getSupplierId(), 0L)) { + orderChangeShopWalletAmountBO.setFreightAmount(0L); + + // 如果是退款平台介入先判断退款平台介入,如果平台处理方式为商家承担的情况下,供应商可以收入一笔运费 + boolean checkPlatformRefundType = Objects.nonNull(orderRefundVO.getInterventionRefundType()) && Objects.equals(orderRefundVO.getInterventionRefundType(), RefundInterventionType.SHOP.value()); + if(!Objects.equals(orderRefundVO.getPlatformInterventionStatus(),-1) && checkPlatformRefundType){ + supplierFreightAmount = order.getFreightAmount() - Math.abs(order.getFreeFreightAmount()); + } + // 没有平台介入,如果是待发货状态且为商家自行处理,则还是需要加上运费,供应商可以收入一笔运费 + if (Objects.equals(orderRefundVO.getPlatformInterventionStatus(),-1) && Objects.equals(orderRefundVO.getSupplierHandleStatus(), SupplierHandleStatus.NORMAL.value())) { + supplierFreightAmount = order.getFreightAmount() - Math.abs(order.getFreeFreightAmount()); + } + + // 供应商发货订单的待采购订单-单项退款,如果有会员包邮,平台补贴金额中就会包含运费补贴的金额 + // 然而运费金额不需要从商家结算金额中扣除,因为平台补贴的运费金额虽然经过商家,但是最终给的是供应商,也就是说商家待结算金额中没有包含平台补贴的运费 + // 但这一步还不能直接从平台补贴金额中扣除,否则会导致结算记录中的平台补贴金额不正确(按目前逻辑,平台补贴金额是包含运费补贴金额的) + // 因此添加一个供应商运费补贴金额,在下一步计算变化金额时再减去补贴的运费即可 + if (Objects.equals(order.getWaitPurchase(), 1) && order.getPlatformFreeFreightAmount() > 0) { + orderChangeShopWalletAmountBO.setSupplierFreightAmount(order.getPlatformFreeFreightAmount()); + } + refundPurchaseRefundAmount = purchaseAmount - refundPurchaseRefundAmount - orderChangeShopWalletAmountBO.getFreightAmount(); + } else { + orderChangeShopWalletAmountBO.setFreightAmount(order.getFreightAmount() - Math.abs(order.getFreeFreightAmount())); + refundPurchaseRefundAmount = purchaseAmount - refundPurchaseRefundAmount + orderChangeShopWalletAmountBO.getFreightAmount(); + } + orderChangeShopWalletAmountBO.setOrderId(order.getOrderId()); + orderChangeShopWalletAmountBO.setPaySysType(order.getPaySysType()); + orderChangeShopWalletAmountBO.setShopId(order.getShopId()); + orderChangeShopWalletAmountBO.setPlatformCommission(order.getPlatformCommission()); + orderChangeShopWalletAmountBO.setChangePlatformCommission(changePlatformCommission); + orderChangeShopWalletAmountBO.setDistributionAmount(order.getDistributionAmount()); + // 供应商金额 + orderChangeShopWalletAmountBO.setSupplierId(order.getSupplierId()); + orderChangeShopWalletAmountBO.setWaitPurchase(order.getWaitPurchase()); + // 商家自行处理金额 + 运费 + orderChangeShopWalletAmountBO.setRefundPurchaseAmount(refundPurchaseRefundAmount); + orderChangeShopWalletAmountBO.setChangePurchaseAmount(purchaseAmount + supplierFreightAmount - changePurchaseRefundAmount); + orderChangeShopWalletAmountBO.setChangePurchasePlatformCommission(purchasePlatformCommission - changePurchasePlatformCommission); + orderChangeShopWalletAmountBO.setRefundPurchasePlatformCommission(purchasePlatformCommission - refundPurchasePlatformCommission); + return orderChangeShopWalletAmountBO; + } + + private void reductionStock(OrderRefundVO orderRefundVO, Order dbOrder, OrderItemVO dbOrderItem) { + boolean shouldReturnStock = Objects.equals(dbOrder.getStatus(), OrderStatus.PAYED.value()) || Objects.equals(dbOrder.getStatus(), OrderStatus.WAIT_GROUP.value()) || (dbOrder.getOrderMold() != null && dbOrder.getOrderMold() == 1); + if (!shouldReturnStock) { + return; + } + // 是否为秒杀订单 + boolean isSecKillOrder = Objects.equals(dbOrder.getOrderType(), OrderType.SECKILL.value()); + // 订单待发货或待成团订单超时,结果就被取消了以及虚拟商品订单,还原库存 + List refundReductionStocks; + List orderItems = orderItemService.listOrderItemAndLangByOrderId(orderRefundVO.getOrderId()); + // 整单退款 + if (Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())) { + // 组装退款数据列表 + refundReductionStocks = this.loadRefundReductionStockList(orderItems, orderRefundVO, dbOrder); + } + // 单项退款 + else { + // 单个退单时,获取商品是否有赠品订单项,如果有,一并退还 + List orderItemIds = new ArrayList<>(); + orderItemIds.add(dbOrderItem.getOrderItemId()); + Object result = RedisUtil.get(OrderCacheNames.REFUND_GIVEAWAY_ORDER_ITEM + dbOrderItem.getOrderItemId()); + if(Objects.nonNull(result)){ + List giveawayOrderItemList = JSONArray.parseArray(result.toString(), Long.class); + orderItemIds.addAll(giveawayOrderItemList); + } + List orderItemList = orderItemService.listOrderItemAndLangByOrderItemIds(orderItemIds); + List childComboOrderItems = orderItems.stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.COMBO_PROD.value()) && Objects.equals(orderItemVO.getActivityId(), dbOrderItem.getOrderItemId())).toList(); + if(CollectionUtil.isNotEmpty(childComboOrderItems)) { + orderItemList.addAll(childComboOrderItems); + } + // 组装退款数据列表 + refundReductionStocks = this.loadRefundReductionStockList(orderItemList, orderRefundVO, dbOrder); + } + if (CollUtil.isEmpty(refundReductionStocks)) { + return; + } + + + // 通知还原库存 + SendStatus sendStatus; + // 秒杀订单统一走秒杀库存,跟秒杀活动是否关闭没有关系 + if (isSecKillOrder) { + Long activityId = refundReductionStocks.get(0).getActivityId(); + SecKillRefundDTO secKillRefundDTO = new SecKillRefundDTO(activityId, refundReductionStocks,dbOrder.getUserId()); + sendStatus = seckillOrderRefundMqTemplate.syncSend(RocketMqConstant.SECKILL_ORDER_REFUND_TOPIC, new GenericMessage<>(secKillRefundDTO)) + .getSendStatus(); + } else { + // 获取商品入库id + Long id = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_BILL_LOG); + sendStatus = orderRefundSuccessStockTemplate.syncSend(RocketMqConstant.ORDER_REFUND_SUCCESS_STOCK_TOPIC, new GenericMessage<>(new RefundStockOperateBO(refundReductionStocks, id))) + .getSendStatus(); + } + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private List loadRefundReductionStockList(List orderItemList, OrderRefundVO orderRefundVO, Order dbOrder) { + if (CollUtil.isEmpty(orderItemList)) { + return Collections.emptyList(); + } + boolean supplierDelivery = !Objects.equals(dbOrder.getOrderType(), OrderType.SECKILL.value()) && Objects.equals(dbOrder.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + // 过滤掉组合商品的主商品 + orderItemList = orderItemList.stream().filter(orderItemVO -> !Objects.equals(orderItemVO.getSpuMold(),SpuMold.COMBO.value())).toList(); + List refundReductionStocks = orderItemList.stream().map(orderItem -> { + RefundReductionStockBO refundReductionStockBO = new RefundReductionStockBO(); + refundReductionStockBO.setOrderId(orderRefundVO.getOrderId()); + refundReductionStockBO.setShopId(orderRefundVO.getShopId()); + refundReductionStockBO.setActivityId(orderItem.getActivityId()); + refundReductionStockBO.setSpuName(orderItem.getSpuName()); + refundReductionStockBO.setSkuName(orderItem.getSkuName()); + refundReductionStockBO.setSkuId(orderItem.getSkuId()); + refundReductionStockBO.setSupplierId(dbOrder.getSupplierId()); + refundReductionStockBO.setStockPointId(orderItem.getStockPointId()); + // 如果是整单退款或者是组合的子商品,修改数量为全部 + if (Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value()) || Objects.equals(orderItem.getActivityType(),OrderActivityType.COMBO_PROD.value())) { + refundReductionStockBO.setCount(orderItem.getCount()); + } else { + // 单项退款可以修改退款数量,所以用实际的退款数量 + refundReductionStockBO.setCount(orderRefundVO.getRefundCount()); + } + refundReductionStockBO.setPrice(orderItem.getPrice()); + refundReductionStockBO.setPartyCode(orderItem.getPartyCode()); + refundReductionStockBO.setPic(orderItem.getPic()); + if (supplierDelivery) { + refundReductionStockBO.setSupplierProd(1); + refundReductionStockBO.setSkuId(orderItem.getSupplierSkuId()); + refundReductionStockBO.setSpuId(orderItem.getSupplierSpuId()); + } else { + refundReductionStockBO.setSkuId(orderItem.getSkuId()); + refundReductionStockBO.setSpuId(orderItem.getSpuId()); + } + return refundReductionStockBO; + }).collect(Collectors.toList()); + return refundReductionStocks; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelRefund(OrderRefundVO orderRefundVO) { + + + // 更新退款状态为已取消 + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setReturnMoneySts(ReturnProcessStatusEnum.FAIL.value()); + orderRefund.setCloseType(RefundCloseType.CANCEL.value()); + orderRefund.setCloseTime(new Date()); + orderRefund.setRefundId(orderRefundVO.getRefundId()); + orderRefund.setUserId(orderRefundVO.getUserId()); + update(orderRefund); + + closeOrderAndOrderItemRefundStatus(orderRefundVO); + } + + /** + * 关闭订单和订单项的退款状态 + * + * @param orderRefundVo + */ + private void closeOrderAndOrderItemRefundStatus(OrderRefundVO orderRefundVo) { + Integer orderRefundSuccessCount = orderRefundMapper.countReturnProcessingItemByOrderId(orderRefundVo.getOrderId()); + + // 更新订单 + // 如果有订单项退款成功,则订单状态为部分退款成功,否则为退款失败 + if (Objects.equals(orderRefundSuccessCount, 0)) { + Order order = new Order(); + order.setOrderId(orderRefundVo.getOrderId()); + order.setRefundStatus(RefundStatusEnum.DISAGREE.value()); + orderService.update(order); + } + // 更新订单项状态 + if (Objects.equals(orderRefundVo.getRefundType(), RefundType.ALL.value())) { + orderItemService.updateRefundStatusByOrderId(orderRefundVo.getOrderId(), RefundStatusEnum.DISAGREE.value()); + } else { + // 拒绝退款 + OrderItem orderItem = new OrderItem(); + orderItem.setRefundStatus(RefundStatusEnum.DISAGREE.value()); + orderItem.setOrderItemId(orderRefundVo.getOrderItemId()); + orderItemService.update(orderItem); + } + + //如果是赠品,需要处理关联赠品订单项 + List giveawayOrderItems = orderItemService.getOrderItemByGiveawayOrderItemId(orderRefundVo.getUserId(), orderRefundVo.getOrderItemId()); + if (giveawayOrderItems.size() != 0) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItemVO : giveawayOrderItems) { + OrderItem orderItems = BeanUtil.map(orderItemVO, OrderItem.class); + orderItems.setRefundStatus(RefundStatusEnum.DISAGREE.value()); + list.add(orderItems); + } + orderItemService.updateBatch(list); + } + + + } + + /** + * 不同意退款 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void disagreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVO) { + int agreeStats = orderRefundMapper.disagreeRefund(orderRefundParam.getSellerMsg(), orderRefundParam.getRejectMessage(), orderRefundVO.getRefundId(), + orderRefundVO.getReturnMoneySts(), orderRefundParam.getIsReceived(), orderRefundVO.getSupplierHandleStatus(), orderRefundParam.getImgUrls()); + if (agreeStats == 0) { + throw new LuckException("订单退款状态已发生改变,请勿重复操作"); + } + closeOrderAndOrderItemRefundStatus(orderRefundVO); + + // 消息推送--拒绝退款 + List notifyBOList = orderService.listSimpleSendNotifyBO(Collections.singletonList(orderRefundVO.getOrderId())); + SendNotifyBO sendNotifyBO = notifyBOList.get(0); + sendNotifyBO.setSendType(SendTypeEnum.REFUSE_REFUND.getValue()); + sendNotifyBO.setRejectMessage(orderRefundParam.getRejectMessage()); + sendNotifyBO.setMobile(orderRefundVO.getBuyerMobile()); + sendNotifyBO.setPrice(PriceUtil.toDecimalPrice(orderRefundVO.getRefundAmount()).toString()); + SendStatus sendBizStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(notifyBOList)).getSendStatus(); + if (!Objects.equals(sendBizStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void disagreeIntervention(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO) { + int agreeStats = orderRefundMapper.disagreeIntervention(orderRefundParam.getPlatformMessage(), + orderRefundVO.getRefundId(), orderRefundVO.getPlatformInterventionStatus()); + if (agreeStats == 0) { + throw new LuckException("订单退款状态已发生改变,请勿重复操作"); + } + closeOrderAndOrderItemRefundStatus(orderRefundVO); + } + + @Override + public ServerResponseEntity agreeRefund(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo) { + setOrderRefundInfo(orderRefundVo); + // 执行退款,真正意义上的退款,需要确保 + // 发送事务消息 + TransactionSendResult transactionSendResult = orderRefundTemplate.sendMessageInTransaction(RocketMqConstant.ORDER_REFUND_TOPIC, new GenericMessage<>(orderRefundVo), orderRefundParam); + + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + logger.error("退款事务消息发送失败,事务状态:{}", transactionSendResult.getLocalTransactionState()); + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } + return ServerResponseEntity.success(); + } + + private void setOrderRefundInfo(OrderRefundVO orderRefundVo) { + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(orderRefundVo.getOrderId()); + orderRefundVo.setPayId(orderSettlement.getPayId()); + orderRefundVo.setPayType(orderSettlement.getPayType()); + + // -----最后一件运费计算----------- + long freightAmount = 0L; + orderRefundVo.setFreightAmount(0L); + // 获取订单信息 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVo.getOrderId(), orderRefundVo.getUserId()); + if (Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + // 如果存在分销订单,则计算分销总金额 + List orderItemList = orderItemService.listOrderItemsByOrderIds(order.getOrderId()); + // 获取所有的订单项总数 + int orderItemCount = orderItemList.size(); + //退款成功总数 + // 获取所有正在进行中的退款订单 + int refundCount = countSuccessItemNum(order.getOrderId()); + //最后一单 + if (Objects.equals(refundCount, orderItemCount - 1)) { + if (order.getFreightAmount() > 0.0 && order.getPlatformFreeFreightAmount() >= 0.0) { + freightAmount = order.getFreightAmount() - order.getPlatformFreeFreightAmount(); + logger.info("最后一单运费计算:freightAmount={},platformFreeFreightAmount={}", freightAmount, order.getPlatformFreeFreightAmount()); + } + // 单项退款,且平台减免运费---平台减免的运费要从商家钱包退还给平台,所以将运费添加到平台优惠金额中 + if (Objects.equals(orderRefundVo.getRefundType(), RefundType.SINGLE.value()) && order.getPlatformFreeFreightAmount() > 0.0) { + orderRefundVo.setPlatformRefundAmount(orderRefundVo.getPlatformRefundAmount() + order.getPlatformFreeFreightAmount()); + logger.info("单项退款,且平台减免运费,平台减免的运费要从商家钱包退还给平台,所以将运费添加到平台优惠金额中:platformRefundAmount={}", orderRefundVo.getPlatformRefundAmount()); + } + } + // 供应商发货的订单,放进去实际的支付运费金额,用于后续的供应商金额退款 + if (Objects.equals(order.getSupplierDeliveryType(), 1) && !Objects.equals(order.getSupplierId(), 0L)) { + orderRefundVo.setFreightAmount(freightAmount + Math.abs(order.getFreeFreightAmount())); + logger.info("供应商发货的订单,放进去实际的支付运费金额,用于后续的供应商金额退款:freightAmount={}", orderRefundVo.getFreightAmount()); + } + } + // 如果是定金预售,需要注意下是两笔退款 + if (Objects.equals(order.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + orderRefundVo.setPayIds(orderSettlement.getPayIds()); + logger.info("定金预售,需要注意下是两笔退款:payIds={}", orderSettlement.getPayIds()); + } + // 只有单个退款才需要加上运费 + if (Objects.equals(orderRefundVo.getRefundType(), RefundType.SINGLE.value())) { + orderRefundVo.setRefundAmount(orderRefundVo.getRefundAmount() + freightAmount); + logger.info("单个退款需要加上运费:refundAmount={}", orderRefundVo.getRefundAmount()); + } + // 如果是通联支付,且为采购完成的,则需要在进行采购金额的退款,这里直接用后续的金额计算 + if (Objects.equals(order.getPaySysType(), PaySysType.ALLINPAY.value()) && Objects.nonNull(order.getPurchaseSpreadAmount()) && Objects.equals(order.getWaitPurchase(), PurchaseOrderWaitStatus.PURCHASED.value())) { + Long distributionAmount; + logger.info("通联支付,且为采购完成的,则需要在进行采购金额的退款,这里直接用后续的金额计算:purchaseSpreadAmount={}", order.getPurchaseSpreadAmount()); + if (Objects.equals(orderRefundVo.getRefundType(), RefundType.ALL.value())) { + distributionAmount = order.getDistributionAmount(); + logger.info("整单退款,分销金额为:distributionAmount={}", distributionAmount); + } else { + OrderItemVO item = orderItemService.getByOrderItemId(orderRefundVo.getOrderItemId()); + distributionAmount = item.getDistributionAmount() + item.getDistributionParentAmount(); + logger.info("单项退款,分销金额为:distributionAmount={}", distributionAmount); + } + + // 商家改变金额 = 退款金额 + 平台补贴改变量 - 平台佣金改变量 -分销金额 - 供应商金额改变量 - 运费 + // 43 + 0 - 0 - 0 - 99.5 = + long shopRealRefundAmount = orderRefundVo.getRefundAmount() + orderRefundVo.getPlatformRefundAmount() + - orderRefundVo.getPlatformRefundCommission() - distributionAmount + - orderRefundVo.getPurchaseRefundAmount() - orderRefundVo.getFreightAmount(); + + // 供应商发货订单,未发货单项退款运费处理:供应商订单的运费最终是给供应商的,商家不会得到运费的钱,按目前的业务供应商发货订单的运费可以有以下两种理解 + // 情况一:用户支付运费,运费先给到商家,然后商家将运费给供应商。按业务来说是这样的,因为用户是跟商家购买的商品,商家再到供应商去请求发货 + // 情况二:平台会员包邮,用户需要支付的运费由平台出了,所以平台需要补贴运费给商家,商家再把平台补贴的运费给供应商 + // 因为供应商发货订单的运费,最终都是给到供应商,商家只是做一个中转,所以在退款的时候,商家不需要去扣除运费的金额 + // 但情况二的平台补贴金额中包含了供应商商品运费,因此在商家的计算要扣除运费的金额,避免商家又扣了一次运费造成亏损 + if (Objects.nonNull(orderRefundVo.getSupplierFreightAmount()) && !Objects.equals(orderRefundVo.getShopId(), 0L)) { + shopRealRefundAmount = shopRealRefundAmount - orderRefundVo.getSupplierFreightAmount(); + logger.info("供应商发货订单,未发货单项退款运费处理:shopRealRefundAmount={}", shopRealRefundAmount); + } + orderRefundVo.setAllinpayRefundPurchaseAmount(shopRealRefundAmount); + } + } + + + /** + * 移交供应商 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void transferRefundOrderToSupplier(OrderRefundDTO orderRefundParam, OrderRefundVO orderRefundVo) { + int agreeStats = orderRefundMapper.transferRefundOrderToSupplier(orderRefundVo.getSupplierHandleStatus(), orderRefundParam.getSupplierHandleStatus(), + orderRefundVo.getRefundId(), orderRefundVo.getReturnMoneySts()); + // 退款移交供应商处理,需发送退款提醒给供应商 + SendNotifyBO notifyBO = getSendNotifyBO(orderRefundVo.getOrderId()); + notifyBO.setShopId(null); + notifyBO.setSupplierId(orderRefundVo.getSupplierId()); + notifyBO.setPrice(PriceUtil.toDecimalPrice(orderRefundVo.getRefundAmount()).toString()); + notifyBO.setSendType(SendTypeEnum.LAUNCH_REFUND_TO_SUPPLIER.getValue()); + notifyBO.setBizId(orderRefundVo.getOrderId()); + notifyBO.setRemark(orderRefundVo.getBuyerDesc()); + notifyBO.setRejectMessage(BuyerReasonType.instance(orderRefundVo.getBuyerReason()).getCn()); + SendStatus sendBizStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyBO)).getSendStatus(); + if (!Objects.equals(sendBizStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + if (agreeStats == 0) { + throw new LuckException("订单退款状态已发生改变,请勿重复操作"); + } + // 若商家有进行备注,保存备注信息 + if (!ObjectUtils.isEmpty(orderRefundParam.getSellerMsg())) { + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundId(orderRefundVo.getRefundId()); + orderRefund.setShopSellerMsg(orderRefundParam.getSellerMsg()); + orderRefundMapper.update(orderRefund); + } + } + + /** + * 同意退款操作(生成结算记录) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int agreeRefund(OrderRefundVO orderRefundVO, OrderRefundDTO orderRefundParam) { + Date nowDate = new Date(); + // 订单正在进行退款结算,之前已经同意过了,不需要再操作了 + if (orderRefundSettlementMapper.countByRefundId(orderRefundVO.getRefundId()) > 0) { + return 0; + } + + long freightAmount = checkLastRefund(orderRefundVO); + // 生成退款结算记录 + OrderRefundSettlement orderRefundSettlement = new OrderRefundSettlement(); + orderRefundSettlement.setOrderId(orderRefundVO.getOrderId()); + orderRefundSettlement.setPayId(orderRefundVO.getPayId()); + orderRefundSettlement.setRefundId(orderRefundVO.getRefundId()); + orderRefundSettlement.setPayType(orderRefundVO.getPayType()); + orderRefundSettlement.setRefundAmount(orderRefundVO.getRefundAmount() + freightAmount); + orderRefundSettlement.setOrderTotalAmount(orderRefundVO.getActualTotal()); + orderRefundSettlement.setUserId(orderRefundVO.getUserId()); + orderRefundSettlement.setRefundStatus(1); + orderRefundSettlement.setCreateTime(nowDate); + orderRefundSettlement.setUpdateTime(nowDate); + orderRefundSettlementMapper.save(orderRefundSettlement); + + // 获取退款单信息 + OrderRefundVO orderRefundDb = orderRefundMapper.getByRefundId(orderRefundVO.getRefundId()); + // 进入这里会有两种情况 1.商家/供应商同意退款 2.平台统一用户退款 + int updateStatus = 0; + if (Objects.equals(orderRefundVO.getPlatformInterventionStatus(),-1)) { + // 商家同意退款 + // 如果有商家自行处理,则加上关联商家自行处理的支付id用以记录 + updateStatus = orderRefundMapper.agreeRefund(orderRefundParam.getSellerMsg(), orderRefundVO.getRefundId(), orderRefundVO.getReturnMoneySts(), orderRefundParam.getIsReceived(), + orderRefundDb.getApplyType(), orderRefundVO.getRefundAmount(), orderRefundVO.getPurchaseRefundAmount()); + } else { + // 平台同意退款 + updateStatus = orderRefundMapper.platformAgreeRefund(orderRefundVO); + } + + if (updateStatus == 0) { + return 0; + } + return 1; + } + + + private long checkLastRefund(OrderRefundVO orderRefundDto) { + if (Objects.equals(orderRefundDto.getRefundType(), RefundType.ALL.value())) { + return 0L; + } + // 获取订单信息 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundDto.getOrderId(), orderRefundDto.getUserId()); + if (!Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + return 0L; + } + //所有订单项总数 + + // 如果存在分销订单,则计算分销总金额 + List orderItemList = orderItemService.listOrderItemsByOrderId(order.getOrderId()); + // 获取所有的订单项总数 + int orderItemCount = orderItemList.size(); + //退款成功总数 + // 获取所有正在进行中的退款订单 + int refundCount = countSuccessItemNum(order.getOrderId()); + if (Objects.equals(refundCount, orderItemCount - 1) && order.getFreightAmount() > 0.0) { + //最后一单 + if (order.getPlatformFreeFreightAmount() == 0.0) { + return order.getFreightAmount() - order.getPlatformFreeFreightAmount(); + } + } + return 0L; + } + + @Override + public Integer getRefundStatus(Long refundId) { + return orderRefundMapper.getRefundStatus(refundId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createGroupUnSuccessRefundInfo(RefundNotifyBO refundNotifyBO) { + Order dbOrder = orderService.getByOrderId(refundNotifyBO.getOrderId()); + List orderItemList = orderItemService.listOrderItemsByOrderId(refundNotifyBO.getOrderId()); + // 生成退款单信息 + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundId(refundNotifyBO.getRefundId()); + orderRefund.setShopId(dbOrder.getShopId()); + orderRefund.setOrderId(refundNotifyBO.getOrderId()); + orderRefund.setRefundType(RefundType.ALL.value()); + orderRefund.setRefundAmount(refundNotifyBO.getRefundAmount()); + orderRefund.setApplyType(1); + orderRefund.setIsReceived(0); + orderRefund.setPlatformRefundAmount(dbOrder.getPlatformAmount()); + orderRefund.setBuyerReason(BuyerReasonType.GROUP_FAILED.value()); + orderRefund.setBuyerDesc("拼团失败:系统自动退款"); + orderRefund.setReturnMoneySts(ReturnProcessStatusEnum.APPLY.value()); + orderRefund.setSellerMsg("拼团失败:系统自动退款"); + orderRefund.setHandelTime(new Date()); + orderRefund.setUpdateTime(new Date()); + orderRefund.setUserId(dbOrder.getUserId()); + orderRefund.setOrderItemId(0L); + orderRefund.setRefundCount(dbOrder.getAllCount()); + orderRefund.setPlatformRefundCommission(dbOrder.getPlatformCommission()); + orderRefund.setSupplierId(dbOrder.getSupplierId()); + orderRefund.setPaySysType(dbOrder.getPaySysType()); + orderRefund.setPurchaseRefundAmount(orderItemList.stream().mapToLong(OrderItem::getItemPurchaseAmount).sum()); + orderRefund.setPurPlatformRefundCommission(orderItemList.stream().mapToLong(OrderItem::getPurchasePlatformCommission).sum()); + orderRefundMapper.save(orderRefund); + + OrderRefundSettlement orderRefundSettlement = new OrderRefundSettlement(); + orderRefundSettlement.setOrderId(refundNotifyBO.getOrderId()); + orderRefundSettlement.setPayId(refundNotifyBO.getPayId()); + orderRefundSettlement.setRefundId(refundNotifyBO.getRefundId()); + orderRefundSettlement.setRefundAmount(refundNotifyBO.getRefundAmount()); + orderRefundSettlement.setOrderTotalAmount(refundNotifyBO.getRefundAmount()); + orderRefundSettlement.setRefundStatus(1); + orderRefundSettlement.setUserId(dbOrder.getUserId()); + orderRefundSettlement.setPayType(dbOrder.getPayType()); + orderRefundSettlementMapper.save(orderRefundSettlement); + + refundSuccess(refundNotifyBO); + } + + @Override + public List getProcessingOrderRefundByOrderId(Long orderId) { + return orderRefundMapper.getProcessingOrderRefundByOrderId(orderId); + } + + @Override + public List listOrderRefundByOrderId(Long orderId) { + return orderRefundMapper.listOrderRefundByOrderId(orderId); + } + + @Override + public Integer getSupplierHandleStatusByOrderId(Long orderId) { + return orderRefundMapper.getSupplierHandleStatusByOrderId(orderId); + } + + @Override + public List getProdRefundEffectByDateAndProdIds(List spuIds, Date startTime, Date endTime) { + return mongoOrderRefundManager.getProdRefundEffectByDateAndProdIds(spuIds, startTime, endTime); + } + + @Override + public List getOrderRefundByOrderIdAndRefundStatus(Long orderId, Integer returnMoneySts) { + return orderRefundMapper.getOrderRefundByOrderIdAndRefundStatus(orderId, returnMoneySts); + } + + @Override + public List listOrderIdsByRefundIds(List refundIds) { + if (CollUtil.isEmpty(refundIds)) { + return new ArrayList<>(0); + } + return orderRefundMapper.listOrderIdsByRefundIds(refundIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelWhenTimeOut(OrderRefundVO orderRefundDb) { + List returnMoneyStsList = ReturnProcessStatusEnum.closeStatus(); + long createTime = DateUtil.offsetDay(new Date(), -Constant.MAX_REFUND_APPLY_TIME).getTime(); + Date now = new Date(); + OrderRefund orderRefund = new OrderRefund(); + Order order = new Order(); + order.setOrderId(orderRefundDb.getOrderId()); + order.setUpdateTime(now); + orderRefund.setRefundId(orderRefundDb.getRefundId()); + orderRefund.setUpdateTime(now); + //create_time #{date} AND return_money_sts in(1,2,3,4) AND + // 创建时间在15天内或处理退款状态不符合条件的不进行取消退款处理 + if (orderRefundDb.getCreateTime().getTime() > createTime || !returnMoneyStsList.contains(orderRefundDb.getReturnMoneySts())) { + // 更新退款的更新时间,同步es、mongo中的退款数据 + orderRefundMapper.update(orderRefund); + orderService.update(order); + return; + } + orderRefund.setReturnMoneySts(ReturnProcessStatusEnum.FAIL.value()); + orderRefund.setSellerMsg("申请退款超时"); + orderRefund.setCloseTime(now); + orderRefund.setCloseType(RefundCloseType.TIME_OUT.value()); + orderRefund.setHandelTime(now); + // 批量修改订单退款状态 + // 查询退款成功的订单商品数量 + Integer orderRefundSuccessCount = orderRefundMapper.countRefundSuccessRefundCountByOrderId(orderRefundDb.getOrderId()); + // 更新订单,如果有订单项退款成功,则订单状态为部分退款成功,否则为退款失败 + if (orderRefundSuccessCount > 0) { + order.setRefundStatus(RefundStatusEnum.PARTIAL_SUCCESS.value()); + } else { + order.setRefundStatus(RefundStatusEnum.DISAGREE.value()); + } + + // 更新订单项状态 + if (Objects.equals(orderRefundDb.getRefundType(), RefundType.ALL.value())) { + orderItemService.updateRefundStatusByOrderId(orderRefundDb.getOrderId(), RefundStatusEnum.DISAGREE.value()); + } else { + // 退款失败 + OrderItem orderItem = new OrderItem(); + orderItem.setOrderItemId(orderRefundDb.getOrderItemId()); + orderItem.setRefundStatus(RefundStatusEnum.DISAGREE.value()); + orderItemService.update(orderItem); + } + orderRefundMapper.update(orderRefund); + orderService.update(order); + } + + @Override + public com.tmerclub.cloud.api.order.vo.OrderRefundVO getOrderRefundByRefundId(Long refundId) { + OrderRefundVO orderRefundVO = getByRefundId(refundId); + Order order = orderService.getByOrderId(orderRefundVO.getOrderId()); + orderRefundVO.setPaySysType(order.getPaySysType()); + return BeanUtil.map(orderRefundVO, com.tmerclub.cloud.api.order.vo.OrderRefundVO.class); + } + + @Override + public int countSuccessItemNum(Long orderId) { + return orderRefundMapper.countSuccessItemNum(orderId); + } + + @Override + public EsOrderRefundBO saveMongoAndGetEsOrderRefundInfo(Long refundId) { + MongoOrderRefundBO mongoOrderRefundBO = orderRefundMapper.mongoAndEsOrderRefundInfo(refundId); + if (Objects.isNull(mongoOrderRefundBO)) { + return null; + } + MongoOrderRefundBO mongoOrder = orderRefundMapper.mongoEsOrder(mongoOrderRefundBO.getOrderId()); + mongoOrderRefundBO.setShopName(mongoOrder.getShopName()); + mongoOrderRefundBO.setOrderType(mongoOrder.getOrderType()); + mongoOrderRefundBO.setFreightAmount(mongoOrder.getFreightAmount()); + mongoOrderRefundBO.setOrderStatus(mongoOrder.getOrderStatus()); + mongoOrderRefundBO.setWaitPurchase(mongoOrder.getWaitPurchase()); + mongoOrderRefundBO.setPayType(mongoOrder.getPayType()); + mongoOrderRefundBO.setPayId(mongoOrder.getPayId()); + // 处理包含赠品还有组合商品的退款订单 + List giveawayList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(mongoOrderRefundBO.getReturnGiveawayIds())) { + String[] split = mongoOrderRefundBO.getReturnGiveawayIds().split(StrUtil.COMMA); + giveawayList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); + } + List mongoOrderRefundItems = orderRefundMapper.mongoAndEsOrderRefundItems(mongoOrderRefundBO.getOrderId(), mongoOrderRefundBO.getOrderItemId(), giveawayList); + List allItems = orderRefundMapper.mongoAndEsOrderRefundItems(mongoOrderRefundBO.getOrderId(), null, null); + Map> itemMap = allItems.stream().filter(orderItem -> Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())).collect(Collectors.groupingBy(MongoOrderRefundItemBO::getActivityId)); + // 获取订单数据 + if (Objects.equals(mongoOrderRefundBO.getRefundType(), RefundType.SINGLE.value())) { + mongoOrderRefundItems.get(0).setRefundAmount(mongoOrderRefundBO.getRefundAmount()); + if(MapUtil.isNotEmpty(itemMap) && itemMap.containsKey(mongoOrderRefundItems.get(0).getOrderItemId())){ + mongoOrderRefundItems.addAll(itemMap.get(mongoOrderRefundItems.get(0).getOrderItemId())); + } + } + + mongoOrderRefundBO.setOrderItems(mongoOrderRefundItems); + + // 单项商品退款,要把订单项中的商品数量换成退款的商品数量 + for (MongoOrderRefundItemBO mongoOrderRefundItem : mongoOrderRefundItems) { + // 单项退款处理订单项 + if (Objects.equals(mongoOrderRefundBO.getRefundType(), RefundType.SINGLE.value())) { + if (Objects.equals(mongoOrderRefundItem.getOrderItemId(), mongoOrderRefundBO.getOrderItemId())) { + mongoOrderRefundItem.setCount(mongoOrderRefundBO.getRefundCount()); + mongoOrderRefundBO.setRefundScore(mongoOrderRefundItem.getRefundScore()); + } + } + if (Objects.equals(mongoOrderRefundBO.getRefundType(), RefundType.SINGLE.value())) { + mongoOrderRefundItem.setRefundAmount(mongoOrderRefundBO.getRefundAmount()); + } else { + mongoOrderRefundItem.setRefundAmount(mongoOrderRefundItem.getActualTotal()); + } + for (OrderItemLangVO orderItemLangVO : mongoOrderRefundItem.getOrderItemLangList()) { + if (Objects.equals(orderItemLangVO.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + mongoOrderRefundItem.setSkuNameEn(orderItemLangVO.getSkuName()); + mongoOrderRefundItem.setSpuNameEn(orderItemLangVO.getSpuName()); + mongoOrderRefundItem.setSupplierSkuNameEn(orderItemLangVO.getSupplierSkuName()); + mongoOrderRefundItem.setSupplierSpuNameEn(orderItemLangVO.getSupplierSpuName()); + } else { + mongoOrderRefundItem.setSkuNameZh(orderItemLangVO.getSkuName()); + mongoOrderRefundItem.setSpuNameZh(orderItemLangVO.getSpuName()); + mongoOrderRefundItem.setSupplierSkuNameZh(orderItemLangVO.getSupplierSkuName()); + mongoOrderRefundItem.setSupplierSpuNameZh(orderItemLangVO.getSupplierSpuName()); + } + } + } + mongoOrderRefundManager.save(mongoOrderRefundBO); + return BeanUtil.map(mongoOrderRefundBO, EsOrderRefundBO.class); + } + + @Override + public PageVO userOrderRefundPage(PageDTO pageDTO, OrderRefundSearchDTO orderRefundSearchDTO) { + Long userId = AuthUserContext.get().getUserId(); + orderRefundSearchDTO.setUserId(userId); + PageVO pageVO = PageUtil.doPage(pageDTO, () -> orderRefundMapper.listUserOrderRefund(orderRefundSearchDTO)); + if (CollUtil.isEmpty(pageVO.getList())) { + return pageVO; + } + List orderIds = pageVO.getList().stream().map(OrderRefundVO::getOrderId).collect(Collectors.toList()); + List orderItemList = orderItemService.listOrderItemsByUserIdAndOrderIds(userId, orderIds); + Map> orderItemMap = orderItemList.stream().collect(Collectors.groupingBy(OrderItemVO::getOrderId)); + List shopIds = pageVO.getList().stream().map(OrderRefundVO::getShopId).collect(Collectors.toList()); + List shops = shopDetailFeignClient.listByShopIds(shopIds).getData(); + Map shopNameMap = shops.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + for (OrderRefundVO orderRefundVO : pageVO.getList()) { + if(Objects.nonNull(orderRefundVO.getApplyInterventionTime())) { + orderRefundVO.setInterventionEndTime(DateUtil.offsetHour(orderRefundVO.getApplyInterventionTime(), 72)); + orderRefundVO.setPlatformProcessingEndTime(DateUtil.offsetDay(orderRefundVO.getApplyInterventionTime(), 7)); + } + List orderItems = orderItemMap.get(orderRefundVO.getOrderId()); + String shopName = shopNameMap.get(orderRefundVO.getShopId()); + if (CollUtil.isEmpty(orderItems) || Objects.isNull(shopName)) { + continue; + } + orderRefundVO.setShopName(shopName); + List refundOrderItems = BeanUtil.mapAsList(orderItems, RefundOrderItemVO.class); + orderRefundVO.setOrderItems(refundOrderItems); + // 整单退款不需要处理赠品和退款数量 + if (Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())) { + giveawayRefundOrderItem(orderRefundVO); + continue; + } + + // 获取赠品id列表 + List giveawayList; + if (StrUtil.isNotBlank(orderRefundVO.getReturnGiveawayIds())) { + String[] split = orderRefundVO.getReturnGiveawayIds().split(","); + giveawayList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); + } else { + giveawayList = new ArrayList<>(0); + } + + // 单项退款处理订单项 + Iterator iterator = refundOrderItems.iterator(); + while (iterator.hasNext()) { + RefundOrderItemVO refundOrderItem = iterator.next(); + // 移除不是退款或退款项赠品的订单项 + if (!Objects.equals(refundOrderItem.getOrderItemId(), orderRefundVO.getOrderItemId()) && !giveawayList.contains(refundOrderItem.getOrderItemId())) { + iterator.remove(); + continue; + } + // 单项商品退款,要把订单项中的商品数量换成退款的商品数量 + if (Objects.equals(refundOrderItem.getOrderItemId(), orderRefundVO.getOrderItemId())) { + refundOrderItem.setCount(orderRefundVO.getRefundCount()); + refundOrderItem.setRefundScore(orderRefundVO.getRefundScore()); + } + } + giveawayRefundOrderItem(orderRefundVO); + } + return pageVO; + } + + /** + * 处理赠品退款订单项 + * @param orderRefundVO + */ + private void giveawayRefundOrderItem(OrderRefundVO orderRefundVO) { + Map> map = orderRefundVO.getOrderItems().stream() + .filter(s -> Objects.equals(s.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(RefundOrderItemVO::getActivityId)); + Map> comboMap = orderRefundVO.getOrderItems().stream() + .filter(s -> Objects.equals(s.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(RefundOrderItemVO::getActivityId)); + // 如果没有赠品,就不需要处理 + if (MapUtil.isEmpty(map) && MapUtil.isEmpty(comboMap)) { + return; + } + // 将赠品放到对应的主订单项中 + Iterator iterator = orderRefundVO.getOrderItems().iterator(); + while (iterator.hasNext()) { + RefundOrderItemVO refundOrderItemVO = iterator.next(); + // 移除赠品的订单项,进入下一个循环 + if (Objects.equals(refundOrderItemVO.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(refundOrderItemVO.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + continue; + } + // 主订单项插入赠品订单项 + if (map.containsKey(refundOrderItemVO.getOrderItemId())) { + refundOrderItemVO.setGiveawayList(map.get(refundOrderItemVO.getOrderItemId())); + } + // 主订单项插入赠品订单项 + if (comboMap.containsKey(refundOrderItemVO.getOrderItemId())) { + refundOrderItemVO.setComboList(comboMap.get(refundOrderItemVO.getOrderItemId())); + } + } + } + + @Override + public AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId) { + return mongoOrderRefundManager.getAccountRefundOrderDetail(startTime, endTime, shopName, shopId); + } + + @Override + public PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum) { + return mongoOrderRefundManager.listShopRefundAccountDetail(startTime, endTime, shopName, pageSize, pageNum); + } + + @Override + public PageShopAccountOrderVO listOrderRefundInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum) { + if (Objects.isNull(pageNum) && Objects.isNull(pageSize)) { + return mongoOrderRefundManager.listOrderRefundInfo(startTime, endTime, shopName); + } + return mongoOrderRefundManager.pageOrderRefundInfo(startTime, endTime, shopId, pageSize, pageNum); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void refundRequest(Long refundId) { + // 获取退款信息 + OrderRefundVO orderRefundVO = getDetailByRefundId(refundId); + if (Objects.isNull(orderRefundVO)) { + logger.error("退款订单{}不存在", refundId); + } + if (!Objects.equals(orderRefundVO.getReturnMoneySts(), ReturnProcessStatusEnum.PROCESSING.value())) { + logger.error("退款订单{}不在商家处理状态,发放退款失败", refundId); + } + // 如果有移交供应商时间就属于供应商退款,额外处理 + if (Objects.nonNull(orderRefundVO.getSupplierTime()) && Objects.equals(orderRefundVO.getSupplierHandleStatus(), SupplierHandleStatus.SUPPLIER_AGREE.value())) { + logger.info("退款订单{}由供应商处理,设置供应商相关数值", refundId); + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(orderRefundVO.getOrderId()); + setSupplierOrderRefundInfo(orderRefundVO, orderSettlement); + } else { + setOrderRefundInfo(orderRefundVO); + } + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setRefundId(orderRefundVO.getRefundId()); + payRefundBO.setRefundAmount(orderRefundVO.getRefundAmount()); + payRefundBO.setAllinpayRefundPurchaseAmount(orderRefundVO.getAllinpayRefundPurchaseAmount()); + payRefundBO.setOrderId(orderRefundVO.getOrderId()); + payRefundBO.setPayId(orderRefundVO.getPayId()); + payRefundBO.setPayIds(orderRefundVO.getPayIds()); + payRefundBO.setShopId(orderRefundVO.getShopId()); + SendStatus sendStatus = orderRefundPaymentTemplate.syncSend(RocketMqConstant.ORDER_REFUND_PAYMENT_TOPIC, new GenericMessage<>(payRefundBO)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为定时任务回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void setSupplierOrderRefundInfo(OrderRefundVO orderRefundVo, OrderSettlement orderSettlement) { + orderRefundVo.setPayId(orderSettlement.getPayId()); + orderRefundVo.setPayType(orderSettlement.getPayType()); + orderRefundVo.setFreightAmount(0L); + // 获取订单信息 + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVo.getOrderId(), orderRefundVo.getUserId()); + if (Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + // -----最后一件商品的运费计算----------- + long freightAmount = 0L; + // 如果存在分销订单,则计算分销总金额 + List orderItemList = orderItemService.listOrderItemsByOrderId(order.getOrderId()); + // 获取所有的订单项总数 + int orderItemCount = orderItemList.size(); + //退款成功总数 + // 获取所有正在进行中的退款订单 + int refundCount = countSuccessItemNum(order.getOrderId()); + //最后一单 + if (Objects.equals(refundCount, orderItemCount - 1)) { + if (order.getFreightAmount() > 0.0 && order.getPlatformFreeFreightAmount() >= 0.0) { + freightAmount = order.getFreightAmount() - order.getPlatformFreeFreightAmount(); + logger.info("最后一单退款,freightAmount:{}", freightAmount); + } + // 单项退款,且平台减免运费---平台减免的运费要从商家钱包退还给平台,所以将运费添加到平台优惠金额中 + if (Objects.equals(orderRefundVo.getRefundType(), RefundType.SINGLE.value()) && order.getPlatformFreeFreightAmount() > 0.0) { + orderRefundVo.setPlatformRefundAmount(orderRefundVo.getPlatformRefundAmount() + order.getPlatformFreeFreightAmount()); + orderRefundVo.setLastOrder(true); + logger.info("单项退款,且平台减免运费,平台减免的运费要从商家钱包退还给平台,所以将运费添加到平台优惠金额中,platformRefundAmount:{}", orderRefundVo.getPlatformRefundAmount()); + } + } + // 供应商发货的订单,放进去实际的支付运费金额,用于后续的供应商金额退款 + if (Objects.equals(order.getSupplierDeliveryType(), 1) && !Objects.equals(order.getSupplierId(), 0L)) { + orderRefundVo.setFreightAmount(freightAmount + Math.abs(order.getFreeFreightAmount())); + logger.info("供应商发货的订单,放进去实际的支付运费金额,用于后续的供应商金额退款,freightAmount:{}", orderRefundVo.getFreightAmount()); + } + // 只有单个退款才需要加上运费 + if (Objects.equals(orderRefundVo.getRefundType(), RefundType.SINGLE.value())) { + // 退款金额加上运费 + orderRefundVo.setRefundAmount(orderRefundVo.getRefundAmount() + freightAmount); + logger.info("单个退款,退款金额加上运费,refundAmount:{}", orderRefundVo.getRefundAmount()); + // 平台减免运费金额的时候,添加供应商发货的订单的运费,商家退款金额需要单独减去上面退款金额中添加的运费 + // 供应商发货的订单单项退款包含的运费为商品原本的运费,不受平台和商家运费减免金额的影响(商家不能修改供应商发货订单的运费,平台减免金额是给商家的,跟供应商没有关系) + if (Objects.nonNull(order.getPlatformFreeFreightAmount()) && order.getPlatformFreeFreightAmount() > 0.0) { + orderRefundVo.setSupplierFreightAmount(order.getFreightAmount()); + logger.info("平台减免运费金额的时候,添加供应商发货的订单的运费,商家退款金额需要单独减去上面退款金额中添加的运费,supplierFreightAmount:{}", orderRefundVo.getSupplierFreightAmount()); + } + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void applyPlatormIntervertion(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO) { + // 更新订单状态 + Order order = new Order(); + order.setOrderId(orderRefundVO.getOrderId()); + order.setRefundStatus(RefundStatusEnum.APPLY.value()); + orderService.update(order); + + // 更新订单项状态 + if (Objects.equals(RefundType.ALL.value(), orderRefundVO.getRefundType())) { + orderItemService.updateRefundStatusByOrderId(order.getOrderId(), RefundStatusEnum.APPLY.value()); + logger.info("整单退款,更新订单项状态为申请退款,订单id:{}", order.getOrderId()); + } else { + OrderItem orderItem = new OrderItem(); + orderItem.setOrderItemId(orderRefundVO.getOrderItemId()); + orderItem.setRefundStatus(RefundStatusEnum.APPLY.value()); + orderItem.setFinalRefundId(orderRefundVO.getRefundId()); + orderItemService.update(orderItem); + logger.info("部分退款,更新订单项状态为申请退款,订单项id:{}", orderItem.getOrderItemId()); + } + //如果是赠品,需要处理关联赠品订单项 + List giveawayOrderItems = orderItemService.getOrderItemByGiveawayOrderItemId(orderRefundVO.getUserId(), orderRefundVO.getOrderItemId()); + if (giveawayOrderItems.size() != 0) { + logger.info("赠品退款,关联赠品订单项,更新订单项状态为申请退款,订单项id:{}", orderRefundVO.getOrderItemId()); + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItemVO orderItemVO : giveawayOrderItems) { + OrderItem orderItems = BeanUtil.map(orderItemVO, OrderItem.class); + orderItems.setRefundStatus(RefundStatusEnum.APPLY.value()); + list.add(orderItems); + } + orderItemService.updateBatch(list); + } + // 修改退款信息 + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundId(orderRefundParam.getRefundId()); + orderRefund.setPlatformInterventionStatus(PlatformInterventionStatus.APPLY.value()); + orderRefund.setApplyInterventionTime(new Date()); + // 保存用户申请平台介入信息 + orderRefund.setApplyInterventionReason(orderRefundParam.getVoucherDesc()); + orderRefund.setApplyInterventionImgUrls(orderRefundParam.getImgUrls()); + orderRefundMapper.update(orderRefund); + orderRefundInterventionMapper.deleteById(orderRefundParam.getRefundId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cacelPlatormIntervertion(OrderRefundInterventionDTO orderRefundParam, OrderRefundVO orderRefundVO) { + // 修改退款信息 + OrderRefund orderRefund = new OrderRefund(); + orderRefund.setRefundId(orderRefundParam.getRefundId()); + orderRefund.setPlatformInterventionStatus(PlatformInterventionStatus.NONE.value()); + orderRefund.setInterventionFinishTime(new Date()); + // 保存用户申请平台介入信息 + orderRefundMapper.update(orderRefund); + closeOrderAndOrderItemRefundStatus(orderRefundVO); + } + + + @Override + public List listOrderRefundByOrderIds(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + return orderRefundMapper.listOrderRefundByOrderIds(orderIds); + } + + /** + * 判断退款单类型(1:整单退款,2:单个物品退款) + * sysType,1.展示赠品信息,0.不展示 + */ + private void getRefundTypeByOrderItem(OrderRefundVO orderRefundVO, Integer sysType) { + Order order = orderService.getOrderByOrderIdAndUserId(orderRefundVO.getOrderId(), orderRefundVO.getUserId()); + orderRefundVO.setWaitPurchase(order.getWaitPurchase()); + if (Objects.equals(orderRefundVO.getRefundType(), RefundType.ALL.value())) { + List items = orderRefundVO.getOrderItems(); + List reItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + orderRefundVO.setRefundScore(items.stream().mapToLong(RefundOrderItemVO::getRefundScore).sum()); + //放入赠品信息 + if (Objects.equals(sysType, 1)) { + List itemIds = items.stream().map(RefundOrderItemVO::getOrderItemId).collect(Collectors.toList()); + List giveawayAndComboItems = orderItemService.getOrderItemByGiveawayOrderItemIds(itemIds, order.getUserId(), sysType); + List itemVOList = BeanUtil.mapAsList(giveawayAndComboItems, RefundOrderItemVO.class); + Map> giveawayAndComboItemMap = itemVOList.stream().collect(Collectors.groupingBy(RefundOrderItemVO::getActivityId)); + for (RefundOrderItemVO orderItem : items) { + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + continue; + } + if(giveawayAndComboItemMap.containsKey(orderItem.getOrderItemId())){ + Map> activityTypeItemMap = giveawayAndComboItemMap.get(orderItem.getOrderItemId()).stream().collect(Collectors.groupingBy(RefundOrderItemVO::getActivityType)); + // 放入赠品 + orderItem.setGiveawayList(activityTypeItemMap.get(OrderActivityType.GIVEAWAY.value())); + // 放入组合 + orderItem.setComboList(activityTypeItemMap.get(OrderActivityType.COMBO_PROD.value())); + } + reItems.add(orderItem); + } + } + orderRefundVO.setOrderItems(reItems); + } else { + OrderItemVO item = orderItemService.getByOrderItemId(orderRefundVO.getOrderItemId()); + orderRefundVO.setRefundScore(item.getUseScore()); + orderRefundVO.setFreightAmount(order.getFreightAmount()); + RefundOrderItemVO reItemVo = BeanUtil.map(item, RefundOrderItemVO.class); + //放入赠品信息 + String returnGiveawayIds = orderRefundVO.getReturnGiveawayIds(); + // 获取当前组合的子商品ids + List comboItemIds = orderRefundVO.getOrderItems().stream().filter(refundOrderItemVO -> Objects.equals(refundOrderItemVO.getActivityType(),OrderActivityType.COMBO_PROD.value()) + && Objects.equals(refundOrderItemVO.getActivityId(),orderRefundVO.getOrderItemId())).map(RefundOrderItemVO::getOrderItemId).toList(); + // 如果组合商品或者赠品都没有则不需要处理了 + boolean flag = StrUtil.isBlank(returnGiveawayIds) && CollectionUtil.isEmpty(comboItemIds); + if ( flag || Objects.equals(sysType, 0)) { + return; + } + List itemIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + if(StrUtil.isNotBlank(returnGiveawayIds)) { + String[] split = returnGiveawayIds.split(StrUtil.COMMA); + itemIds = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).toList(); + } + if (CollUtil.isNotEmpty(comboItemIds)) { + itemIds.addAll(comboItemIds); + } + + List giveawayAndComboItems = orderItemService.getOrderItemByGiveawayOrderItemIds(itemIds, item.getUserId(), null); + List itemVOList = BeanUtil.mapAsList(giveawayAndComboItems, RefundOrderItemVO.class); + List reItems = new ArrayList<>(0); + for (RefundOrderItemVO refundOrderItemVO : orderRefundVO.getOrderItems()) { + if (refundOrderItemVO.getOrderItemId().equals(reItemVo.getOrderItemId())) { + Map> activityTypeItemMap = itemVOList.stream().collect(Collectors.groupingBy(RefundOrderItemVO::getActivityType)); + // 放入赠品 + refundOrderItemVO.setGiveawayList(activityTypeItemMap.get(OrderActivityType.GIVEAWAY.value())); + // 放入组合 + refundOrderItemVO.setComboList(activityTypeItemMap.get(OrderActivityType.COMBO_PROD.value())); + reItems.add(refundOrderItemVO); + break; + } + } + orderRefundVO.setOrderItems(reItems); + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundSettlementServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundSettlementServiceImpl.java new file mode 100644 index 0000000..c383732 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderRefundSettlementServiceImpl.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.mapper.OrderRefundSettlementMapper; +import com.tmerclub.cloud.order.model.OrderRefundSettlement; +import com.tmerclub.cloud.order.service.OrderRefundSettlementService; +import com.tmerclub.cloud.order.vo.OrderRefundSettlementVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 退款支付结算单据 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class OrderRefundSettlementServiceImpl implements OrderRefundSettlementService { + + @Autowired + private OrderRefundSettlementMapper orderRefundSettlementMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderRefundSettlementMapper.list()); + } + + @Override + public OrderRefundSettlementVO getBySettlementId(Long settlementId) { + return orderRefundSettlementMapper.getBySettlementId(settlementId); + } + + @Override + public void save(OrderRefundSettlement orderRefundSettlement) { + orderRefundSettlementMapper.save(orderRefundSettlement); + } + + @Override + public void update(OrderRefundSettlement orderRefundSettlement) { + orderRefundSettlementMapper.update(orderRefundSettlement); + } + + @Override + public void deleteById(Long settlementId) { + orderRefundSettlementMapper.deleteById(settlementId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderReturnReasonServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderReturnReasonServiceImpl.java new file mode 100644 index 0000000..361e3b5 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderReturnReasonServiceImpl.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.order.mapper.OrderReturnReasonMapper; +import com.tmerclub.cloud.order.model.OrderReturnReason; +import com.tmerclub.cloud.order.service.OrderReturnReasonService; +import com.tmerclub.cloud.order.vo.OrderReturnReasonVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 退款原因 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class OrderReturnReasonServiceImpl implements OrderReturnReasonService { + + @Autowired + private OrderReturnReasonMapper orderReturnReasonMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderReturnReasonMapper.list()); + } + + @Override + public OrderReturnReasonVO getByReasonId(Long reasonId) { + return orderReturnReasonMapper.getByReasonId(reasonId); + } + + @Override + public void save(OrderReturnReason orderReturnReason) { + orderReturnReasonMapper.save(orderReturnReason); + } + + @Override + public void update(OrderReturnReason orderReturnReason) { + orderReturnReasonMapper.update(orderReturnReason); + } + + @Override + public void deleteById(Long reasonId) { + orderReturnReasonMapper.deleteById(reasonId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderSelfStationServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderSelfStationServiceImpl.java new file mode 100644 index 0000000..f0cb650 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderSelfStationServiceImpl.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.delivery.constant.DistanceUtil; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.mapper.OrderSelfStationMapper; +import com.tmerclub.cloud.order.model.OrderSelfStation; +import com.tmerclub.cloud.order.service.OrderSelfStationService; +import com.tmerclub.cloud.order.service.OrderVirtualInfoService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 自提订单自提点信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class OrderSelfStationServiceImpl implements OrderSelfStationService { + + @Autowired + private OrderSelfStationMapper orderSelfStationMapper; + + @Autowired + private DeliveryManager deliveryManager; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @Autowired + private OrderVirtualInfoService orderVirtualInfoService; + + /** + * 默认地球半径 + * //赤道半径(单位m) + */ + private static final double EARTH_RADIUS = 6371000; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderSelfStationMapper.list()); + } + + @Override + public OrderSelfStationVO getById(Long id) { + return orderSelfStationMapper.getById(id); + } + + @Override + public void save(OrderSelfStation orderSelfStation) { + orderSelfStationMapper.save(orderSelfStation); + } + + @Override + public void saveBatch(List orderSelfStations) { + orderSelfStationMapper.saveBatch(orderSelfStations); + } + + @Override + public void update(OrderSelfStation orderSelfStation) { + orderSelfStationMapper.update(orderSelfStation); + } + + @Override + public void deleteById(Long id) { + orderSelfStationMapper.deleteById(id); + } + + @Override + public List getStationUserInfo(Long userId) { + return orderSelfStationMapper.getStationUserInfo(userId); + } + + @Override + public OrderVO getOrderByStationCode(Long stationId, String code) { + StationVO stationVO = deliveryManager.getStation(stationId); + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setPageSize(1); + orderSearchDTO.setPageNum(1); + orderSearchDTO.setStatus(OrderStatus.PAYED.value()); + orderSearchDTO.setStationCode(code); + orderSearchDTO.setStationId(stationId); + orderSearchDTO.setShopId(stationVO.getShopId()); + List orderList = searchOrderFeignClient.listEsOrder(orderSearchDTO).getData(); + if (Objects.isNull(orderList) || orderList.size() == 0) { + orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setPageSize(1); + orderSearchDTO.setPageNum(1); + orderSearchDTO.setStatusList(Arrays.asList( + OrderStatus.CONSIGNMENT.value(), + OrderStatus.SUCCESS.value()) + ); + orderSearchDTO.setWriteOffStatus(0); + orderSearchDTO.setOrderMold(1); + orderSearchDTO.setWriteOffCode(code); + orderSearchDTO.setShopId(stationVO.getShopId()); + // 如果查询不到,就去查询虚拟商品的券码信息 + orderList = searchOrderFeignClient.listEsOrder(orderSearchDTO).getData(); + if (Objects.isNull(orderList) || orderList.size() == 0) { + throw new LuckException("该提货码,没有对应的订单"); + } else { + List orderVirtualInfoVOList = orderVirtualInfoService.getByOrderIdAndCode(orderList.get(0).getOrderId(), code); + if (Objects.nonNull(orderVirtualInfoVOList)) { + List infoList = orderVirtualInfoVOList.stream().filter(infoVO -> infoVO.getIsWriteOff() == 0).collect(Collectors.toList()); + if (infoList.size() == 0) { + throw new LuckException("该提货码,没有对应的订单"); + } + orderList.get(0).setOrderVirtualInfoList(infoList); + } + } + } else if (Objects.equals(orderList.get(0).getRefundStatus(), RefundStatusEnum.SUCCEED.value())) { + // 该提货码,没有对应的订单 + throw new LuckException("该提货码,没有对应的订单"); + } + OrderVO orderByStationCode = BeanUtil.map(orderList.get(0), OrderVO.class); + if (Objects.isNull(stationId)) { + return orderByStationCode; + } + if (StrUtil.isBlank(orderByStationCode.getShopName())) { + orderByStationCode.setShopName(Constant.PLATFORM_SHOP_NAME); + } + orderByStationCode.setOrderSelfStationVO(orderSelfStationMapper.getStationByOrderId(orderByStationCode.getOrderId())); + Map> giveawayMap = orderByStationCode.getOrderItems().stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.GIVEAWAY.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + Map> comboMap = orderByStationCode.getOrderItems().stream().filter(orderItemVO -> Objects.equals(orderItemVO.getActivityType(), OrderActivityType.COMBO_PROD.value())) + .collect(Collectors.groupingBy(OrderItemVO::getActivityId)); + if (MapUtil.isEmpty(giveawayMap) && MapUtil.isEmpty(comboMap)) { + return orderByStationCode; + } + Iterator iterator = orderByStationCode.getOrderItems().iterator(); + while (iterator.hasNext()) { + OrderItemVO orderItem = iterator.next(); + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + iterator.remove(); + } + orderItem.setGiveawayList(giveawayMap.get(orderItem.getOrderItemId())); + orderItem.setComboItemList(comboMap.get(orderItem.getOrderItemId())); + } + return orderByStationCode; + } + + @Override + public OrderSelfStationVO getStationByOrderId(OrderSelfStationVO orderSelfStation, Long orderId) { + OrderSelfStationVO stationByOrderId; + if(Objects.nonNull(orderSelfStation)){ + stationByOrderId = orderSelfStation; + }else { + stationByOrderId = orderSelfStationMapper.getStationByOrderId(orderId); + } + if (Objects.isNull(stationByOrderId)) { + throw new LuckException("订单不存在"); + } + StationVO stationVO = deliveryManager.getStation(stationByOrderId.getStationId()); + String addr = stationByOrderId.getStationAddress(); + if(StrUtil.isBlank(addr)){ + addr = stationVO.getProvince() + stationVO.getCity() + stationVO.getArea() + stationVO.getAddr(); + } + stationByOrderId.setStationName(stationVO.getStationName()); + stationByOrderId.setLat(stationVO.getLat()); + stationByOrderId.setLng(stationVO.getLng()); + stationByOrderId.setTimeInfo(stationVO.getTimeInfo()); + stationByOrderId.setStationStatus(stationVO.getStatus()); + stationByOrderId.setStationImgUrl(stationVO.getImgUrl()); + stationByOrderId.setStationAddress(addr); + // 自提点营业时间(不包含月和日) + return stationByOrderId; + } + + @Override + public Double setStationDistance(Long stationId, Double lat, Double lng) { + StationVO stationVO = deliveryManager.getStation(stationId); + return DistanceUtil.getDistance(lng, lat, stationVO.getLng(), stationVO.getLat()); + } + + @Override + public List getUserStation(Long userId) { + return orderSelfStationMapper.getUserStation(userId); + } + + @Override + public List listSelfStationByOrderIds(List orderIds) { + if (CollectionUtils.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + return orderSelfStationMapper.listSelfStationByOrderIds(orderIds); + } + + @Override + public List getOrderSelfStationByStationIdOrShopId(Long userId, Long stationId, Long shopId) { + return orderSelfStationMapper.getOrderSelfStationByStationIdOrShopId(userId, stationId, shopId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..6335d63 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderServiceImpl.java @@ -0,0 +1,2456 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.bo.DistributionAmountWithOrderIdBO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.constant.PreSalePayStatus; +import com.tmerclub.cloud.api.order.constant.PurchaseOrderWaitStatus; +import com.tmerclub.cloud.api.order.vo.OrderAmountVO; +import com.tmerclub.cloud.api.order.vo.ShopAmountVO; +import com.tmerclub.cloud.api.payment.dto.OrderPayInfoDTO; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.api.product.bo.PlatformCommissionItemBO; +import com.tmerclub.cloud.api.product.bo.PlatformCommissionOrderItemBO; +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.user.bo.UserScoreBO; +import com.tmerclub.cloud.api.user.dto.UserTypeDTO; +import com.tmerclub.cloud.api.user.feign.UserLevelAndScoreOrderFeignClient; +import com.tmerclub.cloud.api.user.feign.UserLevelLogFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.constant.*; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.mongodb.bo.order.MongoOrderBO; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.EsOrderItemBO; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.constant.*; +import com.tmerclub.cloud.common.order.dto.*; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.*; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.delivery.constant.DeliveryCompanyType; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.delivery.mapper.DeliveryCompanyMapper; +import com.tmerclub.cloud.delivery.service.StationService; +import com.tmerclub.cloud.delivery.vo.DeliveryCompanyVO; +import com.tmerclub.cloud.order.bo.SubmitOrderPayAmountInfoBO; +import com.tmerclub.cloud.order.constant.PlatformInterventionStatus; +import com.tmerclub.cloud.order.constant.RefundType; +import com.tmerclub.cloud.order.dto.multishop.OrderAdminDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderItemDTO; +import com.tmerclub.cloud.order.dto.multishop.OrderRefundDTO; +import com.tmerclub.cloud.order.manager.MongoOrderRefundManager; +import com.tmerclub.cloud.order.mapper.OrderMapper; +import com.tmerclub.cloud.order.mapper.OrderRefundMapper; +import com.tmerclub.cloud.order.mapper.OrderSettlementMapper; +import com.tmerclub.cloud.order.model.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.model.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.OrderAndPreSaleVO; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单信息 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class OrderServiceImpl implements OrderService { + private static final Logger log = LoggerFactory.getLogger(OrderServiceImpl.class); + @Autowired + private OrderMapper orderMapper; + @Autowired + private RocketMQTemplate orderPurchaseNotifyShopTemplate; + @Autowired + private OrderSettlementMapper orderSettlementMapper; + @Autowired + private OrderItemService orderItemService; + @Autowired + private DeliveryCompanyMapper deliveryCompanyMapper; + @Autowired + private OrderItemLangService orderItemLangService; + @Autowired + private OrderPreSaleInfoService orderPreSaleInfoService; + @Autowired + private OrderRefundMapper orderRefundMapper; + @Autowired + private RedissonClient redissonClient; + @Autowired + private DeliveryManager deliveryManager; + @Autowired + private OrderAddrService orderAddrService; + @Autowired + private OrderSettlementService orderSettlementService; + @Autowired + private RocketMQTemplate stockMqTemplate; + @Autowired + private RocketMQTemplate couponMqTemplate; + @Autowired + private RocketMQTemplate sendNotifyToUserTemplate; + @Autowired + private RocketMQTemplate groupOrderCancelMqTemplate; + @Autowired + private RocketMQTemplate seckillOrderCancelMqTemplate; + @Autowired + private RocketMQTemplate userScoreTemplate; + @Autowired + private RocketMQTemplate sendNotifyToShopTemplate; + @Autowired + private OrderSelfStationService orderSelfStationService; + @Autowired + private OrderInvoiceService orderInvoiceService; + @Autowired + private OrderVirtualInfoService orderVirtualInfoService; + @Autowired + private RocketMQTemplate orderSubmitShopCartTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoOrderRefundManager mongoOrderRefundManager; + @Autowired + private StationService stationService; + @DubboReference + private CategoryShopFeignClient categoryShopFeignClient; + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @DubboReference + private PaymentFeignClient paymentFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private UserLevelLogFeignClient userLevelLogFeignClient; + @DubboReference + private UserLevelAndScoreOrderFeignClient userLevelAndScoreOrderFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + + @Override + public Order getByOrderId(Long orderId) { + return orderMapper.getByOrderId(orderId); + } + + @Override + public void update(Order order) { + orderMapper.update(order); + } + + @Override + public void deleteById(Long orderId) { + orderMapper.deleteById(orderId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submit(ShopCartOrderMergerVO mergerOrder) { + Long userId = mergerOrder.getUserId(); + // 订单商品参数 + List shopCartOrders = mergerOrder.getShopCartOrders(); + + List orderSettlements = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orders = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + List giveawayOrderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderPreSaleInfos = new ArrayList<>(Constant.INITIAL_CAPACITY); + Set shopCartItemIds = new HashSet<>(Constant.INITIAL_CAPACITY); + OrderAddr orderAddr = BeanUtil.map(mergerOrder.getUserAddr(), OrderAddr.class); + if (Objects.nonNull(mergerOrder.getUserAddr())) { + Long addrId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_ADDR, userId); + orderAddr.setOrderAddrId(addrId); + } + + Map> virtualRemarkMap = new HashMap<>(8); + List orderVirtualInfos = new ArrayList<>(Constant.INITIAL_CAPACITY); + List orderSelfStations = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 虚拟商品备注信息列表 + if (CollUtil.isNotEmpty(mergerOrder.getVirtualRemarkList())) { + virtualRemarkMap = mergerOrder.getVirtualRemarkList().stream().collect(Collectors.groupingBy(VirtualRemarkVO::getSpuId)); + } + // 只会有一个 + StationVO station = null; + Map dvyTypeMap = mergerOrder.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + // 每个店铺生成一个订单 + for (ShopCartOrderVO shopCartOrderDto : shopCartOrders) { + Order order = this.getOrder(userId, dvyTypeMap.get(shopCartOrderDto.getShopId()), mergerOrder.getSpuMold(), shopCartOrderDto); + // 获取订单id + order.setOrderId(shopCartOrderDto.getOrderId()); + this.saveOrderInvoice(mergerOrder, order); + this.addOrderSettlement(mergerOrder, userId, orderSettlements, shopCartOrderDto, order); + + List shopCartItemDiscounts = shopCartOrderDto.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + for (ShopCartItemVO shopCartItem : shopCartItems) { + if (!Objects.equals(shopCartItem.getCartItemId(), 0L)) { + shopCartItemIds.add(shopCartItem.getCartItemId()); + } + if (order.getOrderItems() == null) { + order.setOrderItems(new ArrayList<>(0)); + } + OrderItem orderItem = getOrderItem(mergerOrder, order, shopCartItem, virtualRemarkMap, shopCartOrderDto); + orderItem.setOrderItemId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_ITEM, userId)); + shopCartItem.setOrderItemId(orderItem.getOrderItemId()); + orderItems.add(orderItem); + order.getOrderItems().add(orderItem); + handleGiveawayAndCombo(giveawayOrderItems, order, shopCartItem, orderItem); + handlePreSaleInfo(orderPreSaleInfos, order, shopCartItem); + } + } + setOrderAddrId(orderAddr, order); + orders.add(order); + // 处理自提和同城配送的订单 + int dvyType = dvyTypeMap.get(shopCartOrderDto.getShopId()); + this.deliverySubmitOrderListener(mergerOrder, order, dvyType, station); + // 处理下虚拟商品订单 + handlerVirtualProdOder(orderVirtualInfos, mergerOrder, shopCartOrderDto, order); + } + + // 添加赠品订单项 + if (CollUtil.isNotEmpty(giveawayOrderItems)) { + orderItems.addAll(giveawayOrderItems); + } + + saveInfo(orderSettlements, orders, orderItems, orderPreSaleInfos, orderVirtualInfos, orderSelfStations, orderAddr); + + // 购物车下单的订单,提交成功后要删掉购物车中的商品信息 + if (CollUtil.isNotEmpty(shopCartItemIds)) { + SendStatus sendStatus = orderSubmitShopCartTemplate.syncSend(RocketMqConstant.ORDER_SUBMIT_SHOP_CART, + new GenericMessage<>(new OrderSubmitShopCartItemDTO(userId, new ArrayList<>(shopCartItemIds)))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + + private void saveInfo(List orderSettlements, List orders, List orderItems, + List orderPreSaleInfos, List orderVirtualInfos, + List orderSelfStations, OrderAddr orderAddr) { + Date createTime = new Date(); + orders.forEach(order -> order.setCreateTime(createTime)); + orderItems.forEach(item -> item.setCreateTime(createTime)); + orderSettlements.forEach(item -> item.setCreateTime(createTime)); + orderMapper.saveBatch(orders); + orderItemService.saveBatch(orderItems); + orderItemLangService.saveOrderItemLang(orderItems); + + // 保存收货地址 + if (Objects.nonNull(orderAddr)) { + orderAddr.setCreateTime(createTime); + // 保存收货地址 + orderAddrService.save(orderAddr); + } + // 保存订单结算信息 + orderSettlementMapper.saveBatch(orderSettlements); + // 保存预售信息 + if (CollectionUtil.isNotEmpty(orderPreSaleInfos)) { + orderPreSaleInfoService.saveBatch(orderPreSaleInfos,createTime); + } + // 保存虚拟订单核销信息 + if (CollUtil.isNotEmpty(orderVirtualInfos)) { + orderVirtualInfoService.saveBatch(orderVirtualInfos); + } + // 保存自提订单信息 + if (CollUtil.isNotEmpty(orderSelfStations)) { + orderSelfStationService.saveBatch(orderSelfStations); + } + } + + private void handleGiveawayAndCombo(List giveawayOrderItems, Order order, ShopCartItemVO shopCartItem, OrderItem orderItem) { + + // 赠品 + List orderItemList = giveawayOrderItems(order, shopCartItem); + if (CollectionUtil.isNotEmpty(orderItemList)) { + orderItem.setMainGiveaway(1); + giveawayOrderItems.addAll(orderItemList); + }else{ + orderItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + // 组合商品 + if (CollUtil.isEmpty(shopCartItem.getComboShopCartItems())) { + return; + } +// int allCount = order.getAllCount(); + List comboOrderItemList = new ArrayList<>(shopCartItem.getComboShopCartItems().size()); + for (ShopCartItemVO shopCartItemVO : shopCartItem.getComboShopCartItems()) { + OrderItem comboOrderItem = BeanUtil.map(shopCartItemVO, OrderItem.class); + comboOrderItem.setOrderItemId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_ITEM, order.getUserId())); + comboOrderItem.setShopId(order.getShopId()); + comboOrderItem.setOrderItemLangList(getOrderItemLangList(shopCartItemVO, comboOrderItem)); + comboOrderItem.setOrderId(order.getOrderId()); + comboOrderItem.setPic(shopCartItemVO.getImgUrl()); + comboOrderItem.setSpuMold(shopCartItemVO.getMold()); + // 保存中英文名称 + comboOrderItem.setCount(shopCartItemVO.getCount()); + //代发货数量 + comboOrderItem.setBeDeliveredNum(shopCartItemVO.getCount()); + comboOrderItem.setPrice(shopCartItemVO.getSkuPriceFee()); + comboOrderItem.setSpuTotalAmount(shopCartItemVO.getTotalAmount()); + comboOrderItem.setUserId(orderItem.getUserId()); + comboOrderItem.setIsComm(0); + setAmount(shopCartItem, comboOrderItem); + comboOrderItem.setGiveawayAmount(Constant.ZERO_LONG); + comboOrderItem.setActivityId(shopCartItem.getOrderItemId()); + // 库存区域id + comboOrderItem.setStockPointId(shopCartItemVO.getStockPointId()); + comboOrderItem.setActivityType(OrderActivityType.COMBO_PROD.value()); + + // 供应商相关信息保存 + comboOrderItem.setPartyCode(shopCartItem.getPartyCode()); + comboOrderItem.setSupplierSpuId(shopCartItem.getSupplierSpuId()); + comboOrderItem.setSupplierSkuId(shopCartItem.getSupplierSkuId()); +// comboOrderItem.setItemPurchaseAmount(shopCartItem.getTotalPurchaseAmount() != null ? shopCartItem.getTotalPurchaseAmount() : 0L); +// comboOrderItem.setSupplierId(shopCartItem.getSupplierId()); +// comboOrderItem.setSpuCode(shopCartItem.getSpuCode()); +// comboOrderItem.setComboAmount(shopCartItem.getComboAmount()); + //供应商订单字段数据 + if (Objects.nonNull(comboOrderItem.getSupplierSpuId())) { + comboOrderItem.setSupplierPic(shopCartItem.getSupplierUrl()); + } + + orderItemList.add(comboOrderItem); + } + + if (CollectionUtil.isNotEmpty(orderItemList)) { + giveawayOrderItems.addAll(orderItemList); + } + } + + private void handlePreSaleInfo(List orderPreSaleInfos, Order order, ShopCartItemVO shopCartItem) { + // 如果是预售商品保存下下预售信息 + if (Objects.nonNull(shopCartItem.getPreSaleType()) && !Objects.equals(shopCartItem.getPreSaleType(), PreSaleType.DISABLE.value())) { + order.setPreSaleType(shopCartItem.getPreSaleType()); + OrderPreSaleInfo orderPreSaleInfo = getOrderPresaleInfo(order, shopCartItem); + orderPreSaleInfo.setUserId(order.getUserId()); + orderPreSaleInfos.add(orderPreSaleInfo); + } + } + + private static void setOrderAddrId(OrderAddr orderAddr, Order order) { + if (Objects.nonNull(orderAddr)) { + order.setOrderAddrId(orderAddr.getOrderAddrId()); + } else { + order.setOrderAddrId(0L); + } + } + + private void addOrderSettlement(ShopCartOrderMergerVO mergerOrder, Long userId, List orderSettlements, ShopCartOrderVO shopCartOrderDto, Order order) { + // 插入订单结算表 + OrderSettlement orderSettlement = new OrderSettlement(); + Long settlementId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_SETTLEMENT, userId); + orderSettlement.setSettlementId(settlementId); + orderSettlement.setUserId(userId); + orderSettlement.setIsClearing(0); + orderSettlement.setOrderId(order.getOrderId()); + orderSettlement.setPayAmount(order.getActualTotal()); + orderSettlement.setVersion(0); + //如果用使用积分,结算表将积分价格插入 + if (mergerOrder.getIsScorePay() != null && mergerOrder.getIsScorePay() == 1) { + orderSettlement.setPayScore(shopCartOrderDto.getUseScore()); + } else { + orderSettlement.setPayScore(0L); + } + orderSettlements.add(orderSettlement); + } + + private void saveOrderInvoice(ShopCartOrderMergerVO mergerOrder, Order order) { + //保存发票信息,每个店铺一个 + if (CollectionUtil.isNotEmpty(mergerOrder.getOrderInvoiceList())) { + for (OrderInvoiceDTO orderInvoiceDTO : mergerOrder.getOrderInvoiceList()) { + if (Objects.equals(order.getShopId(), orderInvoiceDTO.getShopId())) { + OrderInvoice orderInvoice = BeanUtil.map(orderInvoiceDTO, OrderInvoice.class); + orderInvoice.setInvoiceState(1); + orderInvoice.setInvoiceType(1); + orderInvoice.setInvoiceContext(1); + orderInvoice.setApplicationTime(new Date()); + orderInvoice.setOrderId(order.getOrderId()); + orderInvoice.setShopId(order.getShopId()); + orderInvoiceService.save(order.getUserId(), orderInvoice); + } + } + } + } + + + /** + * 计算分摊金额 + */ + private void calculatePlatformCommission(List orders, List orderItems) { + List platformCommissionOrderItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderItem orderItem : orderItems) { + PlatformCommissionOrderItemBO platformCommissionOrderItemBO = getPlatformCommissionOrderItemBO(orderItem); + platformCommissionOrderItems.add(platformCommissionOrderItemBO); + } + + + ServerResponseEntity> listServerResponseEntity = categoryShopFeignClient.calculatePlatformCommission(platformCommissionOrderItems); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity); + } + + + List data = listServerResponseEntity.getData(); + for (OrderItem orderItem : orderItems) { + for (PlatformCommissionOrderItemBO platformCommissionOrderItemBO : data) { + // 积分订单属于平台的订单不需要计算平台佣金 + if (Objects.equals(orders.get(0).getOrderType(), OrderType.SCORE.value())) { + // 分摊比例 + orderItem.setRate(0.0); + // 平台佣金 + orderItem.setPlatformCommission(0L); + orderItem.setSupplierRate(0.0); + orderItem.setPurchasePlatformCommission(0L); + continue; + } + //赠品和子组合订单不需要计算佣金 + if (Objects.equals(orderItem.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItem.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + // 分摊比例 + orderItem.setRate(0.0); + // 平台佣金 + orderItem.setPlatformCommission(0L); + orderItem.setSupplierRate(0.0); + orderItem.setPurchasePlatformCommission(0L); + break; + } + // 通过商品确定订单项 + if (Objects.equals(orderItem.getSkuId(), platformCommissionOrderItemBO.getSkuId())) { + // 分摊比例 + orderItem.setRate(platformCommissionOrderItemBO.getRate()); + // 平台佣金,如果是商家代销,供应商采购价的佣金也需要计算 + // 平台对商家的差价抽佣 = (商家定的销售价格 - 供应商价格)-(商家定的销售价格 - 供应商价格)* 平台抽佣百分比 + // 平台对商家的差价抽佣 = (用户实付金额 + 平台优惠金额 - 供应商金额) * 比例 + long shopAmount = orderItem.getActualTotal() + orderItem.getPlatformShareReduce() - orderItem.getItemPurchaseAmount(); + shopAmount = Math.max(shopAmount, 0L); + orderItem.setPlatformCommission(PriceUtil.divideByBankerRounding((long) ((shopAmount) * platformCommissionOrderItemBO.getRate()), 100)); + orderItem.setSupplierRate(0.0); + orderItem.setPurchasePlatformCommission(0L); + if (!Objects.equals(orderItem.getSupplierId(), 0L)) { + // 供应商没有平台优惠,此时不用加上平台优惠进行计算 + // 平台对供应商的抽佣 = 供应商定价 * 平台抽佣百分比 + orderItem.setPurchasePlatformCommission(PriceUtil.divideByBankerRounding((long) (orderItem.getItemPurchaseAmount() * platformCommissionOrderItemBO.getSupplierRate()), 100)); + orderItem.setSupplierRate(platformCommissionOrderItemBO.getSupplierRate()); + } + } + } + } + Map> orderIdMap = orderItems.stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + for (Order order : orders) { + Long totalPlatformCommission = 0L; + List orderItemList = orderIdMap.get(order.getOrderId()); + for (OrderItem orderItem : orderItemList) { + totalPlatformCommission += orderItem.getPlatformCommission(); + } + order.setPlatformCommission(totalPlatformCommission); + } + + } + + private static PlatformCommissionOrderItemBO getPlatformCommissionOrderItemBO(OrderItem orderItem) { + PlatformCommissionOrderItemBO platformCommissionOrderItemBO = new PlatformCommissionOrderItemBO(); + PlatformCommissionItemBO platformCommissionShop = new PlatformCommissionItemBO(); + platformCommissionShop.setShopId(orderItem.getShopId()); + platformCommissionShop.setSysType(SysTypeEnum.MULTISHOP.value()); + platformCommissionOrderItemBO.setShopItem(platformCommissionShop); + // 如果有供应商也放进去 + if (!Objects.equals(orderItem.getSupplierId(), 0L)) { + PlatformCommissionItemBO platformCommissionSupplierItem = new PlatformCommissionItemBO(); + platformCommissionSupplierItem.setShopId(orderItem.getSupplierId()); + platformCommissionSupplierItem.setSysType(SysTypeEnum.SUPPLIER.value()); + platformCommissionOrderItemBO.setSupplierItem(platformCommissionSupplierItem); + } + platformCommissionOrderItemBO.setCategoryId(orderItem.getCategoryId()); + platformCommissionOrderItemBO.setSkuId(orderItem.getSkuId()); + return platformCommissionOrderItemBO; + } + + @Override + public List getOrdersStatus(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return new ArrayList<>(0); + } + List orderStatusList = orderMapper.getOrdersStatus(orderIds); + if (CollUtil.isEmpty(orderStatusList)) { + return new ArrayList<>(0); + } + for (Long orderId : orderIds) { + boolean hasOrderId = false; + for (OrderStatusBO orderStatusBO : orderStatusList) { + if (Objects.equals(orderStatusBO.getOrderId(), orderId)) { + hasOrderId = true; + break; + } + } + if (!hasOrderId) { + OrderStatusBO orderStatusBO = new OrderStatusBO(); + orderStatusBO.setOrderId(orderId); + orderStatusList.add(orderStatusBO); + } + } + return orderStatusList; + } + + @Override + public OrderAmountVO getOrdersActualAmount(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return null; + } + List orderAmountList = orderMapper.listOrderActualAmount(orderIds); + OrderAmountVO orderAmountVO = new OrderAmountVO(); + orderAmountVO.setPayAmount(0L); + Map shopAmountMap = new HashMap<>(16); + for (OrderAndPreSaleVO orderVO : orderAmountList) { + orderAmountVO.setPayScore(orderVO.getOrderScore()); + // 定金预售判断 + boolean flag = Objects.equals(orderVO.getPreSaleType(), PreSaleType.DEPOSIT.value()); + long payAmount = 0L; + if (flag) { + // 未付定金 + if (Objects.equals(orderVO.getStatus(), OrderStatus.UNPAY.value())) { + payAmount = orderVO.getDepositAmount(); + } + // 未付尾款 + long balanceAmount = orderVO.getBalanceAmount() + orderVO.getFreightAmount() - orderVO.getPlatformFreeFreightAmount(); + if (Objects.equals(orderVO.getStatus(), OrderStatus.WAIT_BALANCE.value()) && balanceAmount <= 0L) { + throw new LuckException("尾款为0,无需进行支付尾款"); + } + if (Objects.equals(orderVO.getStatus(), OrderStatus.WAIT_BALANCE.value())) { + // 如果是支付尾款还需要加上运费 + payAmount = balanceAmount; + } + } else { + // 普通订单 + payAmount = orderVO.getActualTotal(); + } + orderAmountVO.setPayAmount(orderAmountVO.getPayAmount() + payAmount); + // 添加下收款人和金额 + if (!shopAmountMap.containsKey(orderVO.getShopId())) { + ShopAmountVO shopAmountVO = new ShopAmountVO(); + shopAmountVO.setBizUserId(orderVO.getShopId().toString()); + shopAmountVO.setAmount(payAmount); + shopAmountMap.put(orderVO.getShopId(), shopAmountVO); + } else { + ShopAmountVO shopAmount = shopAmountMap.get(orderVO.getShopId()); + shopAmount.setAmount(shopAmount.getAmount() + payAmount); + shopAmountMap.put(orderVO.getShopId(), shopAmount); + } + } + List shopAmountList = new ArrayList<>(shopAmountMap.values()); + orderAmountVO.setShopAmountList(shopAmountList); + return orderAmountVO; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public List updateByToPaySuccess(PayNotifyBO message, List ordersStatus, List orderIds) { + + if (CollectionUtil.isEmpty(ordersStatus) && Objects.isNull(message.getShopCartOrderMergerVO())) { + log.error("无法找到订单信息,message: + {}", Json.toJsonString(message)); + return null; + } + // 如果数据库没有,但是messag有则直接保存到数据库 + if(Objects.nonNull(message.getShopCartOrderMergerVO()) && CollectionUtil.isEmpty(ordersStatus)){ + ShopCartOrderMergerVO shopCartOrderMergerVO = message.getShopCartOrderMergerVO(); + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_SECKILL_ORDER_PAY_SUCCESS_PERFIX + shopCartOrderMergerVO.getUserId()); + lock.lock(); + try { +// // 再查询一遍确定没有数据 +// List ordersStatusResponse = getOrdersStatus(orderIdList); + // 从redis中查询到了数据,存入到数据库,此处用到了分布式锁,防止多个线程同时操作数据库 + submit(message.getShopCartOrderMergerVO()); + } finally { + lock.unlock(); + } + ordersStatus = getOrdersStatus(orderIds); + } + // 还有可能是取消订单再支付的,这里加上已取消的订单 + ordersStatus = ordersStatus.stream() + .filter(orderStatusBO -> Objects.equals(orderStatusBO.getStatus(), OrderStatus.UNPAY.value()) + || Objects.equals(orderStatusBO.getStatus(), OrderStatus.CLOSE.value()) + || Objects.equals(orderStatusBO.getStatus(), OrderStatus.WAIT_BALANCE.value())) + .collect(Collectors.toList()); + if (CollectionUtil.isEmpty(ordersStatus)) { + return ordersStatus; + } + List needUpdateOrderIds = ordersStatus.stream().map(OrderStatusBO::getOrderId).collect(Collectors.toList()); + Integer orderType = ordersStatus.get(0).getOrderType(); + Long actualTotal; + StringBuilder payIds = new StringBuilder(Constant.INITIAL_CAPACITY); + // 团购订单 + if (Objects.equals(orderType, OrderType.GROUP.value())) { + // 待成团 + orderMapper.updateByToGroupPaySuccess(needUpdateOrderIds, message.getPayType(), message.getPaySysType()); + } else { + for (OrderStatusBO esOrderVO : ordersStatus) { + // 待发货 或待收货 + orderMapper.updateByToPaySuccess(esOrderVO, message.getPayType(), message.getPaySysType()); + } + } + for (OrderStatusBO esOrderVO : ordersStatus) { + if (Objects.equals(esOrderVO.getOrderMold(), 1)) { + // 如果是虚拟订单,发货时间为当前支付成功时间 + log.info("虚拟订单发货,订单id:{}", esOrderVO.getOrderId()); + Order order = new Order(); + order.setOrderId(esOrderVO.getOrderId()); + order.setDeliveryTime(new Date()); + orderMapper.update(order); + } + } + // 预售信息处理,并且获取当前已经支付的金额 + actualTotal = handleOrderPreSale(needUpdateOrderIds, ordersStatus, message, payIds); + orderSettlementMapper.updateToPaySuccess(needUpdateOrderIds, message.getPayId(), message.getPayType(), payIds.toString(), actualTotal); + return ordersStatus; + } + + private Long handleOrderPreSale(List needUpdateOrderIds, List ordersStatusList, PayNotifyBO payNotifyBO, StringBuilder payIds) { + Integer statusDb = ordersStatusList.get(0).getStatus(); + OrderStatusBO order = ordersStatusList.get(0); + long payAmount = 0L; + List orderPreSaleInfoList = orderPreSaleInfoService.listByOrderIds(needUpdateOrderIds); + // 如果为空则不需要处理预售信息,且不需要修改金额 + if (CollectionUtil.isEmpty(orderPreSaleInfoList)) { + return 0L; + } + OrderPreSaleInfo dbOrderPreSaleInfo = orderPreSaleInfoList.get(0); + // 如果是定金预售,还需要修改下订单支付后的状态 + if (Objects.equals(dbOrderPreSaleInfo.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + // 当前如果尾款为0且(邮费减去平台包邮金额也为0),并且尾款支付时间已开始,设置订单为待发货状态 + boolean flag = order.getFreightAmount() - order.getPlatformFreeFreightAmount() == 0L && dbOrderPreSaleInfo.getBalanceAmount() == 0L; + if (dbOrderPreSaleInfo.getBalanceStartTime().getTime() < System.currentTimeMillis() && flag) { + statusDb = OrderStatus.WAIT_BALANCE.value(); + ordersStatusList.get(0).setStatus(statusDb); + } + // 定金预售订单,1.待付尾款 2.待发货 + orderMapper.updateByToPreSaleSuccess(needUpdateOrderIds, statusDb); + } + // 处理下预售的发货时间 + for (OrderPreSaleInfo orderPreSaleInfo : orderPreSaleInfoList) { + if (Objects.equals(orderPreSaleInfo.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + orderPreSaleInfo.setPayStatus(Objects.equals(statusDb, OrderStatus.UNPAY.value()) ? PreSalePayStatus.PAYED_DEPOSIT.value() : PreSalePayStatus.PAYED_BALANCE.value()); + //尾款支付时间 + orderPreSaleInfo.setBalancePayTime(Objects.equals(statusDb, OrderStatus.UNPAY.value()) ? null : new Date()); + // 定金预售,待支付时支付后的实付金额为定金 + payAmount = Objects.equals(statusDb, OrderStatus.UNPAY.value()) ? orderPreSaleInfo.getDepositAmount() : ordersStatusList.get(0).getActualTotal(); + // 如果发货时间不是固定时间,且为支付尾款设置下发货时间 + if (!Objects.equals(orderPreSaleInfo.getPreSaleDeliveryType(), -1) && Objects.equals(statusDb, OrderStatus.WAIT_BALANCE.value())) { + orderPreSaleInfo.setPreSaleDeliveryTime(DateUtil.offsetDay(new DateTime(), orderPreSaleInfo.getPreSaleDeliveryType())); + } + } else if (!Objects.equals(orderPreSaleInfo.getPreSaleDeliveryType(), -1)) { + // 如果全款预售发货时间不是固定时间,设置下发货时间 + orderPreSaleInfo.setPreSaleDeliveryTime(DateUtil.offsetDay(new DateTime(), orderPreSaleInfo.getPreSaleDeliveryType())); + } + } + if (CollectionUtil.isNotEmpty(orderPreSaleInfoList)) { + orderPreSaleInfoService.updateBatch(orderPreSaleInfoList); + } + if (Objects.equals(statusDb, OrderStatus.WAIT_BALANCE.value())) { + OrderSettlement orderSettlement = orderSettlementMapper.getByOrderId(needUpdateOrderIds.get(0)); + if (Objects.nonNull(payNotifyBO.getPayId())) { + if (Objects.nonNull(orderSettlement.getPayId())) { + payIds.append(orderSettlement.getPayId()).append(StrUtil.COMMA).append(payNotifyBO.getPayId()); + } else { + payIds.append(payNotifyBO.getPayId()); + } + }else{ + payIds.append(orderSettlement.getPayId()); + } + } + return payAmount; + } + + @Override + public List getOrdersSimpleAmountInfo(List orderIds) { + + + List ordersSimpleAmountInfos = orderMapper.getOrdersSimpleAmountInfo(orderIds); + Map> refundMap; + if (CollUtil.isNotEmpty(orderIds)) { + List refunds = orderRefundMapper.getProcessOrderRefundByOrderIds(orderIds); + List itemIds = refunds.stream().map(OrderRefundVO::getOrderItemId).filter(itemId -> !Objects.equals(itemId, 0L)).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(itemIds)) { + List orderItems = orderItemService.listByIds(itemIds); + Map orderItemMap = orderItems.stream().collect(Collectors.toMap(OrderItem::getOrderItemId, orderItem -> orderItem)); + for (OrderRefundVO refund : refunds) { + if (orderItemMap.containsKey(refund.getOrderItemId())) { + OrderItem orderItem = orderItemMap.get(refund.getOrderItemId()); + refund.setItemPurchaseAmount(orderItem.getItemPurchaseAmount()); + refund.setActualTotal(orderItem.getActualTotal()); + refund.setPurPlatformRefundCommission(orderItem.getPurchasePlatformCommission()); + } + } + } + refundMap = refunds.stream().collect(Collectors.groupingBy(OrderRefundVO::getOrderId)); + } else { + refundMap = new HashMap<>(0); + } + List distributionAmountWithOrderIds = orderItemService.sumTotalDistributionAmountByOrderIds(orderIds); + + for (OrderSimpleAmountInfoBO ordersSimpleAmountInfo : ordersSimpleAmountInfos) { + long purchaseAmount = 0L; + long actualTotal = 0L; + long purchasePlatformCommission = 0L; + if (refundMap.containsKey(ordersSimpleAmountInfo.getOrderId()) && !Objects.equals(ordersSimpleAmountInfo.getSupplierId(), 0L)) { + // 减去退款的实付金额,采购金额,采购佣金 + List orderRefunds = refundMap.get(ordersSimpleAmountInfo.getOrderId()); + for (OrderRefundVO orderRefund : orderRefunds) { + if (orderRefund.getItemPurchaseAmount() == null) { + continue; + } + purchaseAmount += orderRefund.getItemPurchaseAmount(); + actualTotal += orderRefund.getActualTotal(); + purchasePlatformCommission += orderRefund.getPurPlatformRefundCommission(); + } + ordersSimpleAmountInfo.setPurchaseAmount(ordersSimpleAmountInfo.getPurchaseAmount() - purchaseAmount); + ordersSimpleAmountInfo.setActualTotal(ordersSimpleAmountInfo.getActualTotal() - actualTotal); + ordersSimpleAmountInfo.setPurchasePlatformCommission(ordersSimpleAmountInfo.getPurchasePlatformCommission() - purchasePlatformCommission); + } + + ordersSimpleAmountInfo.setShopAmount(ordersSimpleAmountInfo.getReduceAmount() - ordersSimpleAmountInfo.getPlatformAmount()); + Long orderId = ordersSimpleAmountInfo.getOrderId(); + ordersSimpleAmountInfo.setDistributionAmount(0L); + // 订单总分销金额 + for (DistributionAmountWithOrderIdBO distributionAmountWithOrderId : distributionAmountWithOrderIds) { + if (Objects.equals(distributionAmountWithOrderId.getOrderId(), orderId)) { + ordersSimpleAmountInfo.setDistributionAmount(distributionAmountWithOrderId.getDistributionAmount() + distributionAmountWithOrderId.getDistributionParentAmount()); + } + } + } + + return ordersSimpleAmountInfos; + } + + /** + * 取消订单和mq日志要同时落地 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelOrderAndGetCancelOrderIds(ShopCartOrderMergerVO mergerOrder, List orderIds) { + List ordersStatus = this.getOrdersStatus(orderIds); + List cancelOrderIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer orderType = null; + Long userId = null; + // 未支付的订单才插入数据 + for (OrderStatusBO orderStatusBO : ordersStatus) { + // 状态为空或者 + if (!OrderStatus.unPay(orderStatusBO.getStatus())) { + continue; + } + cancelOrderIds.add(orderStatusBO.getOrderId()); + orderType = orderStatusBO.getOrderType(); + userId = orderStatusBO.getUserId(); + } + if(Objects.nonNull(mergerOrder) && OrderStatus.unPay(mergerOrder.getStatus())){ + cancelOrderIds.add(orderIds.get(0)); + userId = mergerOrder.getUserId(); + orderType = mergerOrder.getOrderType().value(); + } + + if (CollUtil.isEmpty(cancelOrderIds)) { + log.info("订单已支付成功,不能取消,订单id:{}", orderIds); + return; + } + + // 取消订单之前,先查询下是否已支付成功 + List paySuccessList = paymentFeignClient.queryAndHandleOrderPaySuccess(new OrderPayInfoDTO(cancelOrderIds, userId)); + + + // 移除已支付成功的订单id + if (CollUtil.isNotEmpty(paySuccessList)) { + cancelOrderIds.removeAll(paySuccessList); + } + if (CollectionUtil.isEmpty(cancelOrderIds)) { + log.info("订单已支付成功,不能取消,订单id:{}", orderIds); + return; + } + // 如果是支付宝支付,或者微信 二维码支付直接使二维码失效 + ServerResponseEntity cancelOrderQrCodeResponseEntity = paymentFeignClient.cancelOrderQrCode(new OrderPayInfoDTO(cancelOrderIds, userId)); + if (!cancelOrderQrCodeResponseEntity.isSuccess()) { + log.error("失效订单支付宝、微信支付二维码失败,订单id:{},错误信息:{}", cancelOrderIds, cancelOrderQrCodeResponseEntity.getMsg()); + throw new LuckException(cancelOrderQrCodeResponseEntity.getMsg()); + } + // 如果是redis中拿的订单且数据库没有这个订单,创建订单 + if(Objects.nonNull(mergerOrder) && CollectionUtil.isEmpty(ordersStatus)) { + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_SECKILL_ORDER_PAY_SUCCESS_PERFIX + mergerOrder.getUserId()); + lock.lock(); + try { +// // 再查询一遍确定没有数据 +// List ordersStatusResponse = getOrdersStatus(orderIdList); + // 从redis中查询到了数据,存入到数据库,此处用到了分布式锁,防止多个线程同时操作数据库 + submit(mergerOrder); + } finally { + lock.unlock(); + } + } + // 取消订单 + int updateStatus = orderMapper.cancelOrders(cancelOrderIds); + // 订单已经支付就不能取消了 + if (updateStatus == 0) { + throw new LuckException("订单状态已发生改变,请刷新后再试"); + } + + sendOrderMsg(mergerOrder,orderIds, ordersStatus, orderType); + } + + private void sendOrderMsg(ShopCartOrderMergerVO mergerOrder, List orderIds, List ordersStatus, Integer orderType) { + // 团购订单 + if (Objects.equals(orderType, OrderType.GROUP.value())) { + SendStatus groupSendStatus = groupOrderCancelMqTemplate.syncSend(RocketMqConstant.GROUP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderIds)).getSendStatus(); + if (!Objects.equals(groupSendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + log.error("团购订单取消失败,订单id:{}, 错误信息:{}", orderIds, groupSendStatus); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + // 秒杀有自己的库存 + if (Objects.equals(orderType, OrderType.SECKILL.value())) { + SendStatus groupSendStatus = seckillOrderCancelMqTemplate.syncSend(RocketMqConstant.SECKILL_ORDER_CANCEL_TOPIC, new GenericMessage<>(mergerOrder)).getSendStatus(); + if (!Objects.equals(groupSendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + log.error("秒杀订单取消失败,订单id:{}, 错误信息:{}", orderIds, groupSendStatus); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } else { + // 解锁库存状态 + log.info("解锁库存,订单id:{}", orderIds); + SendStatus stockSendStatus = stockMqTemplate.syncSend(RocketMqConstant.STOCK_UNLOCK_TOPIC_BY_ORDER_ID, new GenericMessage<>(orderIds)).getSendStatus(); + if (!Objects.equals(stockSendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + log.error("库存解锁失败,订单id:{}, 错误信息:{}", orderIds, stockSendStatus); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + if (Objects.equals(orderType, OrderType.ORDINARY.value())) { + // 解锁优惠券状态 + log.info("解锁优惠券,订单id:{}", orderIds); + SendStatus couponSendStatus = couponMqTemplate.syncSend(RocketMqConstant.COUPON_UNLOCK_TOPIC, new GenericMessage<>(orderIds)).getSendStatus(); + // 为什么不用批量消息,因为rocketmq不支持topic不一样发批量消息 + if (!Objects.equals(couponSendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + log.error("优惠券解锁失败,订单id:{}, 错误信息:{}", orderIds, couponSendStatus); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + if (Objects.equals(orderType, OrderType.ORDINARY.value()) || Objects.equals(orderType, OrderType.SCORE.value())) { + // 解锁用户积分状态 + log.info("解锁用户积分,订单id:{}", orderIds); + UserScoreBO userScoreBo = new UserScoreBO(); + userScoreBo.setUserId(ordersStatus.get(0).getUserId()); + userScoreBo.setOrderIds(orderIds); + userScoreBo.setFlag(true); + SendStatus userScoreSendStatus = userScoreTemplate.syncSend(RocketMqConstant.SCORE_UNLOCK_TOPIC, new GenericMessage<>(userScoreBo)).getSendStatus(); + if (!Objects.equals(userScoreSendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + log.error("用户积分解锁失败,订单id:{}, 用户id:{}", orderIds, ordersStatus.get(0).getUserId()); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + if(Objects.nonNull(mergerOrder)) { + // 直接删除redis中该订单 + ServerResponseEntity responseEntity = seckillFeignClient.deleteRedisOrderByUserIdAndOrderId(mergerOrder.getUserId(), orderIds.get(0)); + if (!responseEntity.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + // todo 如果涉及到用户积分成长值之类的,要考虑下要不要分布式,取消的订单,除了支付成功,不然都不会改变订单状态 + } + + @Override + public Order getOrderByOrderIdAndUserId(Long orderId, Long userId) { + Order order = orderMapper.getOrderByOrderIdAndUserId(orderId, userId); + if (order == null) { + // 订单不存在 + log.error("订单不存在,订单id:{}", orderId); + throw new LuckException(ResponseEnum.ORDER_NOT_EXIST); + } + return order; + } + + @Override + public Order getOrderByOrderIdAndStationId(Long orderId, Long stationId) { + Order order = orderMapper.getOrderByOrderIdAndStationId(orderId, stationId); + if (order == null) { + // 订单不存在 + log.error("订单不存在,订单id:{}", orderId); + throw new LuckException(ResponseEnum.ORDER_NOT_EXIST); + } + return order; + } + + @Override + public OrderVO getOrderByOrderId(Long orderId) { + Order order = orderMapper.getOrderByOrderIdAndShopId(orderId, AuthUserContext.get().getTenantId()); + if (order == null) { + // 订单不存在 + log.error("订单不存在,订单id:{}", orderId); + throw new LuckException(ResponseEnum.ORDER_NOT_EXIST); + } + return BeanUtil.map(order, OrderVO.class); + } + + @Override + public int receiptOrder(Long orderId) { + return orderMapper.receiptOrder(orderId); + } + + @Override + public void deleteOrder(Long orderId) { + orderMapper.deleteOrder(orderId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delivery(DeliveryOrderDTO deliveryOrderParam) { + List orderRefunds = orderRefundMapper.getProcessingOrderRefundByOrderId(deliveryOrderParam.getOrderId()); + // 移除退款成功的退款记录 + orderRefunds.removeIf(orderRefund -> Objects.equals(orderRefund.getReturnMoneySts(), ReturnProcessStatusEnum.SUCCESS.value()) || Objects.equals(orderRefund.getPlatformInterventionStatus(), PlatformInterventionStatus.SUCCESS.value())); + if (CollectionUtil.isNotEmpty(orderRefunds)) { + throw new LuckException("该订单有退款信息正在处理当中,请处理完毕之后再进行发货的操作!"); + } + // 设置好收货人信息 + OrderAddr orderAddr = orderAddrService.getById(deliveryOrderParam.getOrderAddrId()); + OrderAddrVO orderAddrVO = BeanUtil.map(orderAddr, OrderAddrVO.class); + if (Objects.nonNull(orderAddrVO)) { + deliveryOrderParam.setConsignee(orderAddrVO.getConsignee()); + deliveryOrderParam.setMobile(orderAddrVO.getMobile()); + } + deliveryOrderParam.setUserId(orderAddr.getUserId()); + + Order orderDb = orderMapper.getDeliveryInfoByOrderId(deliveryOrderParam.getOrderId()); + // 订单不是待发货状态或者订单正在申请退款中,此时不能对订单进行发货操作 + if (!Objects.equals(orderDb.getStatus(), OrderStatus.PAYED.value()) || Objects.equals(orderDb.getRefundStatus(), RefundStatusEnum.APPLY.value())) { + log.error("订单不是待发货状态或者订单正在申请退款中,此时不能对订单进行发货操作,订单id:{}", deliveryOrderParam.getOrderId()); + throw new LuckException(ResponseEnum.DATA_ERROR); + } + orderItemService.updateByDeliveries(deliveryOrderParam.getSelectOrderItems(), deliveryOrderParam.getDeliveryType(),deliveryOrderParam.getOrderId()); + // 算下未发货商品数量 + int unDeliveryNum = orderItemService.countUnDeliveryNumByOrderId(deliveryOrderParam.getOrderId()); + if (Objects.equals(deliveryOrderParam.getDeliveryType(), DeliveryType.DELIVERY.value()) + || Objects.equals(deliveryOrderParam.getDeliveryType(), DeliveryType.ONLINE.value())) { + log.info("发货操作,推送给用户发货提醒,订单号为:{},未发货商品数量为:{}", deliveryOrderParam.getOrderId(), unDeliveryNum); + String companyName = getCompanyName(deliveryOrderParam); + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + for (DeliveryOrderItemDTO selectOrderItem : deliveryOrderParam.getSelectOrderItems()) { + sb.append(selectOrderItem.getSpuName()).append(StrUtil.COMMA); + } + sb.deleteCharAt(sb.length() - 1); + // 获取订单发货信息, 发送消息给用户 + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setUserId(orderDb.getUserId()); + sendNotifyBO.setBizId(orderDb.getOrderId()); + sendNotifyBO.setSpuName(sb.toString()); + sendNotifyBO.setShopId(orderDb.getShopId()); + sendNotifyBO.setMobile(orderDb.getMobile()); + sendNotifyBO.setDvyName(companyName); + sendNotifyBO.setSendType(SendTypeEnum.DELIVERY.getValue()); + sendNotifyBO.setDvyFlowId(deliveryOrderParam.getDeliveryNo()); + if (Objects.equals(deliveryOrderParam.getDeliveryType(), DeliveryType.ONLINE.value())) { + deliveryOrderParam.setSendNotifyBO(sendNotifyBO); + } else { + List sendNotifyList = Collections.singletonList(sendNotifyBO); + SendStatus sendStockStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyList)).getSendStatus(); + } + } + //修改为发货状态 + if (Objects.equals(unDeliveryNum, 0)) { + log.info("订单已全部发货,订单号为:{}", deliveryOrderParam.getOrderId()); + Date date = new Date(); + Order order = new Order(); + order.setOrderId(deliveryOrderParam.getOrderId()); + order.setStatus(OrderStatus.CONSIGNMENT.value()); + order.setUpdateTime(date); + order.setDeliveryTime(date); + //判断是无需物流还是快递发货,如果是无需快递,则判断该订单是否包含有物流的项,若有物流则配送类型为快递配送,没有物流则不变 + if (orderItemService.getDevTypeByOrderId(deliveryOrderParam.getOrderId())) { + order.setDeliveryType(DeliveryType.DELIVERY.value()); + } else { + order.setDeliveryType(deliveryOrderParam.getDeliveryType()); + } + orderMapper.update(order); + } + // 确定订单发货后,保存订单包裹数据 + deliveryManager.saveDeliveryInfo(deliveryOrderParam, 0, unDeliveryNum); + } + + private String getCompanyName(DeliveryOrderDTO deliveryOrderParam) { + String companyName; + if (Objects.equals(deliveryOrderParam.getDeliveryType(), DeliveryType.DELIVERY.value())) { + DeliveryCompanyVO deliveryCompanyVO = deliveryCompanyMapper.getByDeliveryCompanyId(deliveryOrderParam.getDeliveryCompanyId()); + companyName = deliveryCompanyVO.getName(); + } else { + DeliveryCompanyType deliveryCompanyType = DeliveryCompanyType.instance(deliveryOrderParam.getDeliveryCompanyType()); + if (Objects.isNull(deliveryCompanyType)) { + throw new LuckException("网点关联快递公司配置为空"); + } + companyName = deliveryCompanyType.getName(); + } + return companyName; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeAmount(OrderAdminDTO orderAdminDTO, Order dbOrder) { + if (!Objects.equals(dbOrder.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!Objects.equals(dbOrder.getStatus(), OrderStatus.UNPAY.value())) { + throw new LuckException("订单状态已发生改变,无法更改订单金额"); + } + //减少金额 + Long amount = 0L; + //平台优惠金额 + Long platformAmount = 0L; + Map collect = orderAdminDTO.getOrderItems().stream().collect(Collectors.toMap(OrderItemDTO::getOrderItemId, orderItem -> orderItem)); + for (OrderItem orderItemDb : dbOrder.getOrderItems()) { + orderItemDb.setSupplierId(dbOrder.getSupplierId()); + //判断是否是赠品或者子组合订单项 + if (Objects.equals(orderItemDb.getActivityType(), OrderActivityType.GIVEAWAY.value()) || Objects.equals(orderItemDb.getActivityType(), OrderActivityType.COMBO_PROD.value())) { + continue; + } + OrderItemDTO orderItem = collect.get(orderItemDb.getOrderItemId()); + boolean notChange = Objects.isNull(orderItem.getChangeAmount()) || + Objects.equals(orderItem.getChangeAmount(), orderItemDb.getActualTotal()) || + orderItemDb.getShopChangeFreeAmount() > 0; + if (notChange) { + continue; + } + if (orderItem.getChangeAmount() < Constant.MIN_ORDER_AMOUNT) { + throw new LuckException("订单金额必须大于0"); + } + Long changeAmount; + // 改变金额大于订单金额-仅修改店铺改价优惠金额 + if (orderItem.getChangeAmount() > orderItemDb.getActualTotal()) { + changeAmount = orderItem.getChangeAmount() - orderItemDb.getActualTotal(); + orderItemDb.setShopChangeFreeAmount(orderItemDb.getShopChangeFreeAmount() + changeAmount); + //实际金额 = 原实际金额 - 变化金额 + orderItemDb.setActualTotal(orderItem.getChangeAmount()); + amount = amount + changeAmount; + continue; + } + changeAmount = orderItemDb.getActualTotal() - orderItem.getChangeAmount(); + //修改平台优惠金额 + Long playformItemAmount = 0L; + // 如果改变后金额小于当前金额,则进行修改平台优惠金额 + if (orderItem.getChangeAmount() < orderItemDb.getActualTotal() && orderItemDb.getPlatformShareReduce() > 0) { + //金额减少比例 = 减少金额 % 总金额 + double proportion = Arith.div(changeAmount, orderItemDb.getSpuTotalAmount(), 6); + //平台优惠金额减少金额 = 减少比例 * 原平台优惠金额 + playformItemAmount = Double.valueOf(Arith.round(Arith.mul(proportion, orderItemDb.getPlatformShareReduce()), 0)).longValue(); + //平台优惠金额 = 原平台优惠金额 - 平台优惠金额减少金额 + orderItemDb.setPlatformShareReduce(orderItemDb.getPlatformShareReduce() - playformItemAmount); + } + //实际金额 = 原实际金额 - 变化金额 + orderItemDb.setActualTotal(orderItemDb.getActualTotal() - changeAmount); + //总优惠金额 = 变化金额 + 原总优惠金额 + orderItemDb.setShareReduce(changeAmount + orderItemDb.getShareReduce()); + // 店铺改价金额为订单项减少的金额 + orderItemDb.setShopChangeFreeAmount(orderItemDb.getShopChangeFreeAmount() - changeAmount); + amount = amount - changeAmount; + platformAmount = platformAmount + playformItemAmount; + // 优惠总额 + dbOrder.setReduceAmount(dbOrder.getReduceAmount() + changeAmount); + } + // 重新计算佣金 + calculatePlatformCommission(Collections.singletonList(dbOrder), dbOrder.getOrderItems()); + orderItemService.updateBatch(dbOrder.getOrderItems()); + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(dbOrder.getOrderId()); + // 修改订单信息 + dbOrder.setActualTotal(dbOrder.getActualTotal() + amount); + dbOrder.setPlatformAmount(dbOrder.getPlatformAmount() - platformAmount); + // 计算运费变化金额 + calculTransFee(orderAdminDTO, dbOrder, amount); + orderSettlement.setPayAmount(dbOrder.getActualTotal()); + orderSettlementService.update(orderSettlement); + // 修改运费信息 + orderMapper.update(dbOrder); + } + + private void calculTransFee(OrderAdminDTO orderAdminDTO, Order dbOrder, Long amount) { + Long changeFreightAmount; + Long freightAmount = orderAdminDTO.getFreightAmount() + dbOrder.getPlatformFreeFreightAmount(); + if (!Objects.equals(dbOrder.getFreightAmount(), freightAmount)) { + ServerResponseEntity serverResponse = userLevelAndScoreOrderFeignClient.getHaveFreeFeeRight(dbOrder.getUserId(), dbOrder.getShopId()); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + if (BooleanUtil.isTrue(serverResponse.getData())) { + throw new LuckException("平台会员包邮不能修改运费"); + } + if (orderAdminDTO.getFreightAmount() < 0L) { + throw new LuckException("运费金额不能小于0"); + } + changeFreightAmount = freightAmount - dbOrder.getFreightAmount(); + if (Objects.equals(dbOrder.getFreightAmount(), 0L) && dbOrder.getFreeFreightAmount() < 0L) { + // 商家运费模板包邮,改价的运费由商家承担 + dbOrder.setFreeFreightAmount(-changeFreightAmount); + } else if (dbOrder.getFreeFreightAmount() < 0L) { + // 商家有商品运费模板包邮,改价的运费由不包邮商品承担 + dbOrder.setFreightAmount(freightAmount); + if (changeFreightAmount < 0L) { + dbOrder.setFreeFreightAmount(dbOrder.getFreeFreightAmount() + changeFreightAmount); + } + dbOrder.setActualTotal(dbOrder.getActualTotal() + changeFreightAmount); + } else { + dbOrder.setFreightAmount(freightAmount); + dbOrder.setActualTotal(dbOrder.getActualTotal() + changeFreightAmount); + } + } + dbOrder.setShopChangeFreeAmount(dbOrder.getShopChangeFreeAmount() + amount); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeAmountByPreSale(OrderAdminDTO orderAdminDTO, Order dbOrder) { + if (!Objects.equals(dbOrder.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!Objects.equals(dbOrder.getStatus(), OrderStatus.UNPAY.value())) { + throw new LuckException("订单状态已发生改变,无法更改订单金额"); + } + OrderPreSaleInfoVO orderPreSaleInfoVO = orderPreSaleInfoService.getByOrderId(dbOrder.getOrderId()); + //减少金额 + Long amount = 0L; + //平台优惠金额 + Long platformAmount = 0L; + Map collect = orderAdminDTO.getOrderItems().stream().collect(Collectors.toMap(OrderItemDTO::getOrderItemId, orderItem -> orderItem)); + OrderItem orderItemDb = dbOrder.getOrderItems().get(0); + // 如果大于1则表示有赠品,筛选一下 + if (dbOrder.getOrderItems().size() > 1) { + List mainItemList = dbOrder.getOrderItems().stream().filter(orderItem -> Objects.equals(orderItem.getMainGiveaway(), 1)).toList(); + orderItemDb = mainItemList.get(0); + } + orderItemDb.setSupplierId(dbOrder.getSupplierId()); + OrderItemDTO orderItem = collect.get(orderItemDb.getOrderItemId()); + boolean notChange = Objects.isNull(orderItem.getChangeAmount()) || + Objects.equals(orderItem.getChangeAmount(), orderPreSaleInfoVO.getBalanceAmount()) || + orderItemDb.getShopChangeFreeAmount() > 0; + if (!notChange) { + if (orderItem.getChangeAmount() < Constant.MIN_ORDER_AMOUNT && Objects.isNull(orderPreSaleInfoVO)) { + throw new LuckException("订单金额必须大于0"); + } + // 改变金额大于尾款金额-仅修改店铺改价优惠金额 + if (orderItem.getChangeAmount() > orderPreSaleInfoVO.getBalanceAmount()) { + long changeBalanceAmount = orderItem.getChangeAmount() - orderPreSaleInfoVO.getBalanceAmount(); + orderItemDb.setShopChangeFreeAmount(orderItemDb.getShopChangeFreeAmount() + changeBalanceAmount); + //实际金额 = 原实际金额 - 变化金额 + orderItemDb.setActualTotal(orderItemDb.getActualTotal() + changeBalanceAmount); + amount = amount + changeBalanceAmount; + } else { + long changeBalanceAmount = orderPreSaleInfoVO.getBalanceAmount() - orderItem.getChangeAmount(); + //修改平台优惠金额 + Long playformItemAmount = 0L; + // 如果改变后金额小于当前金额,则进行修改平台优惠金额 + if (orderItemDb.getPlatformShareReduce() > 0) { + //金额减少比例 = 减少金额 % 总金额 + double proportion = Arith.div(changeBalanceAmount, orderItemDb.getSpuTotalAmount(), 6); + //平台优惠金额减少金额 = 减少比例 * 原平台优惠金额 + playformItemAmount = Double.valueOf(Arith.round(Arith.mul(proportion, orderItemDb.getPlatformShareReduce()), 0)).longValue(); + //平台优惠金额 = 原平台优惠金额 - 平台优惠金额减少金额 + orderItemDb.setPlatformShareReduce(orderItemDb.getPlatformShareReduce() - playformItemAmount); + } + //实际金额 = 原实际金额 - 变化金额 + orderItemDb.setActualTotal(orderItemDb.getActualTotal() - changeBalanceAmount); + //总优惠金额 = 变化金额 + 原总优惠金额 + orderItemDb.setShareReduce(changeBalanceAmount + orderItemDb.getShareReduce()); + // 店铺改价金额为订单项减少的金额 + orderItemDb.setShopChangeFreeAmount(orderItemDb.getShopChangeFreeAmount() - changeBalanceAmount); + amount = amount - changeBalanceAmount; + platformAmount = platformAmount + playformItemAmount; + // 优惠总额 + dbOrder.setReduceAmount(dbOrder.getReduceAmount() + changeBalanceAmount); + } + // 修改预售信息 + orderPreSaleInfoVO.setBalanceAmount(orderItem.getChangeAmount()); + OrderPreSaleInfo orderPreSaleInfo = BeanUtil.map(orderPreSaleInfoVO, OrderPreSaleInfo.class); + orderPreSaleInfoService.updateBatch(Collections.singletonList(orderPreSaleInfo)); + //---------for------ + // 重新计算佣金 + calculatePlatformCommission(Collections.singletonList(dbOrder), dbOrder.getOrderItems()); + orderItemService.updateBatch(dbOrder.getOrderItems()); + // 修改订单信息 + dbOrder.setActualTotal(dbOrder.getActualTotal() + amount); + dbOrder.setPlatformAmount(dbOrder.getPlatformAmount() - platformAmount); + } + OrderSettlement orderSettlement = orderSettlementService.getByOrderId(dbOrder.getOrderId()); + // 计算运费变化金额 + calculTransFee(orderAdminDTO, dbOrder, amount); + orderSettlement.setPayAmount(dbOrder.getActualTotal()); + orderSettlementService.update(orderSettlement); + // 修改运费信息 + orderMapper.update(dbOrder); + } + + @Override + public SubmitOrderPayAmountInfoBO getSubmitOrderPayAmountInfo(long[] orderIdList) { + if (ArrayUtil.isEmpty(orderIdList)) { + return null; + } + return orderMapper.getSubmitOrderPayAmountInfo(orderIdList); + } + + @Override + public EsOrderBO getEsOrder(Long orderId) { + return orderMapper.getEsOrder(orderId); + } + + private OrderItem getOrderItem(ShopCartOrderMergerVO mergerOrder, Order order, ShopCartItemVO shopCartItem, Map> virtualRemarkMap, ShopCartOrderVO shopCartOrderVO) { + OrderItem orderItem = new OrderItem(); + orderItem.setOrderId(order.getOrderId()); + orderItem.setShopId(shopCartItem.getShopId()); + orderItem.setSkuId(shopCartItem.getSkuId()); + orderItem.setSpuId(shopCartItem.getSpuId()); + orderItem.setCategoryId(shopCartItem.getCategoryId()); + // TODO 国际化 + orderItem.setOrderItemLangList(getOrderItemLangList(shopCartItem,orderItem)); + // 库存区域id + orderItem.setStockPointId(Objects.equals(shopCartItem.getMold(),SpuMold.COMBO.value()) ? 0L : shopCartItem.getStockPointId()); + orderItem.setCount(shopCartItem.getCount()); + // 待发货数量 + orderItem.setBeDeliveredNum(shopCartItem.getCount()); + orderItem.setPic(shopCartItem.getImgUrl()); + orderItem.setPrice(shopCartItem.getSkuPriceFee()); + orderItem.setUserId(order.getUserId()); + orderItem.setSpuTotalAmount(shopCartItem.getTotalAmount()); + orderItem.setIsComm(0); + orderItem.setShopCartTime(shopCartItem.getCreateTime()); + // 分销金额 + orderItem.setDistributionAmount(0L); + orderItem.setDistributionParentAmount(0L); + //平台的补贴优惠金额 + orderItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce()); + // 实际订单项支付金额 + orderItem.setActualTotal(shopCartItem.getActualTotal()); + // 分摊优惠金额 + orderItem.setShareReduce(shopCartItem.getShareReduce()); + //推广员卡号 + orderItem.setDistributionUserId(shopCartItem.getDistributionUserId()); + // 积分价格(单价) + orderItem.setScoreFee(shopCartItem.getScoreFee()); + //使用积分价格 + orderItem.setUseScore(shopCartItem.getScorePrice() != null ? shopCartItem.getScorePrice() : 0L); + orderItem.setScoreAmount(shopCartItem.getScoreReduce() != null ? shopCartItem.getScoreReduce() : 0L); + orderItem.setMemberAmount(shopCartItem.getLevelReduce() != null ? shopCartItem.getLevelReduce() : 0L); + + orderItem.setPlatformCouponAmount(shopCartItem.getPlatformCouponAmount() != null ? shopCartItem.getPlatformCouponAmount() : 0L); + orderItem.setShopCouponAmount(shopCartItem.getShopCouponAmount() != null ? shopCartItem.getShopCouponAmount() : 0L); + orderItem.setDiscountAmount(shopCartItem.getDiscountAmount() != null ? shopCartItem.getDiscountAmount() : 0L); + orderItem.setPlatformFreeFreightAmount(shopCartItem.getPlatformFreeFreightAmount() != null ? shopCartItem.getPlatformFreeFreightAmount() : 0L); + // 平台佣金 + orderItem.setRate(shopCartItem.getRate() != null ? shopCartItem.getRate() : 0.0); + orderItem.setPlatformCommission(shopCartItem.getPlatformCommission() != null ? shopCartItem.getPlatformCommission() : 0L); + orderItem.setSupplierRate(Objects.nonNull(shopCartItem.getSupplierRate()) ? shopCartItem.getSupplierRate() : 0.0); + orderItem.setPurchasePlatformCommission(Objects.nonNull(shopCartItem.getPurchasePlatformCommission()) ? shopCartItem.getPurchasePlatformCommission() : 0L); + + // 获取积分,确认收货之后才会获取积分 + orderItem.setGainScore(0L); + // 生成订单之后才会进行订单改价 + orderItem.setShopChangeFreeAmount(0L); + // 改价之后才会商家免运费,注意:要是改变了规则,这里也要改 + orderItem.setFreeFreightAmount(0L); + orderItem.setSpuMold(shopCartItem.getMold()); + // 如果是虚拟商品,则修改为无需快递的发货方式 + handleVirtual(shopCartItem, virtualRemarkMap, shopCartOrderVO, orderItem); + // 供应商相关信息保存 + orderItem.setItemPurchaseAmount(shopCartItem.getTotalPurchaseAmount() != null ? shopCartItem.getTotalPurchaseAmount() : 0L); + orderItem.setSupplierId(shopCartItem.getSupplierId()); + orderItem.setSpuCode(shopCartItem.getSpuCode()); + orderItem.setPartyCode(shopCartItem.getPartyCode()); + orderItem.setSupplierSkuId(shopCartItem.getSupplierSkuId()); + orderItem.setSupplierSpuId(shopCartItem.getSupplierSpuId()); + orderItem.setComboAmount(shopCartItem.getComboAmount()); + orderItem.setGiveawayAmount(0L); + //供应商订单字段数据 + if (Objects.nonNull(orderItem.getSupplierSpuId())) { + orderItem.setSupplierPic(shopCartItem.getSupplierUrl()); + } + + setActivityInfo(mergerOrder, shopCartItem, orderItem); + return orderItem; + } + + private static void setActivityInfo(ShopCartOrderMergerVO mergerOrder, ShopCartItemVO shopCartItem, OrderItem orderItem) { + if (Objects.nonNull(shopCartItem.getComboId())) { + orderItem.setActivityId(shopCartItem.getComboId()); + orderItem.setActivityType(OrderActivityType.COMBO.value()); + } + + if (Objects.equals(mergerOrder.getActivityType(), OrderActivityType.GROUP.value()) || + Objects.equals(mergerOrder.getActivityType(), OrderActivityType.SECKILL.value())) { + orderItem.setActivityId(mergerOrder.getActivityId()); + orderItem.setActivityType(mergerOrder.getActivityType()); + } + } + + private void handleVirtual(ShopCartItemVO shopCartItem, Map> virtualRemarkMap, ShopCartOrderVO shopCartOrderVO, OrderItem orderItem) { + if (Objects.equals(shopCartItem.getMold(), 1)) { + // 存入留言 + String virtualRemarkStr = Json.toJsonString(virtualRemarkMap.get(shopCartItem.getSpuId())); + orderItem.setVirtualRemark(virtualRemarkStr); + orderItem.setSpuMold(SpuMold.VIRTUAL.value()); + orderItem.setIsRefund(shopCartItem.getIsRefund()); + orderItem.setDeliveryType(DeliveryType.NOT_DELIVERY.value()); + SpuVO spuVO = spuFeignClient.getDetailById(shopCartItem.getSpuId()).getData(); + if (Objects.nonNull(spuVO)) { + shopCartOrderVO.setWriteOffNum(spuVO.getWriteOffNum()); + shopCartOrderVO.setIsRefund(spuVO.getIsRefund()); + orderItem.setWriteOffNum(spuVO.getWriteOffNum()); + // 如果是虚拟商品且需要核销,放进去 + if (!Objects.equals(spuVO.getWriteOffNum(), 0) && !Objects.equals(spuVO.getWriteOffNum(), null)) { + Date startTime = new Date(); + Date endTime; + // 判断有效期 + switch (spuVO.getWriteOffTime()) { + case -1: + endTime = null; + break; + case 0: + startTime = spuVO.getWriteOffStart(); + endTime = spuVO.getWriteOffEnd(); + break; + case 1: + endTime = DateUtil.endOfDay(startTime); + break; + default: + endTime = DateUtil.offsetDay(startTime, spuVO.getWriteOffTime()); + break; + } + shopCartOrderVO.setWriteOffStart(startTime); + shopCartOrderVO.setWriteOffEnd(endTime); + if (Objects.equals(spuVO.getWriteOffNum(), -1)) { + shopCartOrderVO.setWriteOffMultipleCount(spuVO.getWriteOffMultipleCount()); + orderItem.setWriteOffMultipleCount(spuVO.getWriteOffMultipleCount()); + } + orderItem.setWriteOffStart(startTime); + orderItem.setWriteOffEnd(endTime); + } + } + } + } + + private List giveawayOrderItems(Order order, ShopCartItemVO shopCartItem) { + int allCount = order.getAllCount(); + if (CollUtil.isEmpty(shopCartItem.getGiveawayShopCartItemList())) { + return Collections.emptyList(); + } + List orderItemList = new ArrayList<>(shopCartItem.getGiveawayShopCartItemList().size()); + for (ShopCartItemVO shopCartItemVO : shopCartItem.getGiveawayShopCartItemList()) { + OrderItem orderItem = BeanUtil.map(shopCartItemVO, OrderItem.class); + orderItem.setOrderItemId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_ITEM, order.getUserId())); + orderItem.setShopId(order.getShopId()); + orderItem.setOrderItemLangList(getOrderItemLangList(shopCartItemVO, orderItem)); + orderItem.setOrderId(order.getOrderId()); + orderItem.setPic(shopCartItemVO.getImgUrl()); + orderItem.setSpuMold(shopCartItemVO.getMold()); + // 保存中英文名称 + orderItem.setCount(orderItem.getCount()); + //代发货数量 + orderItem.setBeDeliveredNum(orderItem.getCount()); + orderItem.setPrice(shopCartItemVO.getSkuPriceFee()); + orderItem.setSpuTotalAmount(shopCartItemVO.getTotalAmount()); + orderItem.setIsComm(0); + setAmount(shopCartItem, orderItem); + + orderItem.setGiveawayAmount((long) Arith.mul(shopCartItemVO.getGiveawayRefundPrice(), shopCartItemVO.getCount())); + orderItem.setMainGiveaway(0); + orderItem.setActivityId(shopCartItem.getOrderItemId()); + // 库存区域id + orderItem.setStockPointId(shopCartItem.getStockPointId()); + orderItem.setActivityType(OrderActivityType.GIVEAWAY.value()); + orderItemList.add(orderItem); + allCount += shopCartItemVO.getCount(); + } + order.setAllCount(allCount); + + return orderItemList; + } + + private static void setAmount(ShopCartItemVO shopCartItem, OrderItem orderItem) { + //平台的补贴优惠金额 + orderItem.setPlatformShareReduce(Constant.ZERO_LONG); + // 实际订单项支付金额 + orderItem.setActualTotal(Constant.ZERO_LONG); + // 分摊优惠金额 + orderItem.setShareReduce(Constant.ZERO_LONG); + orderItem.setMemberAmount(Constant.ZERO_LONG); + orderItem.setScoreAmount(Constant.ZERO_LONG); + orderItem.setDistributionAmount(Constant.ZERO_LONG); + orderItem.setDistributionParentAmount(Constant.ZERO_LONG); + orderItem.setPlatformCouponAmount(Constant.ZERO_LONG); + orderItem.setShopCouponAmount(Constant.ZERO_LONG); + orderItem.setDiscountAmount(Constant.ZERO_LONG); + orderItem.setPlatformFreeFreightAmount(Constant.ZERO_LONG); + // 平台佣金 + orderItem.setRate(shopCartItem.getRate() != null ? shopCartItem.getRate() : 0.0); + orderItem.setPlatformCommission(Constant.ZERO_LONG); + orderItem.setSupplierRate(Objects.nonNull(shopCartItem.getSupplierRate()) ? shopCartItem.getSupplierRate() : 0.0); + orderItem.setPurchasePlatformCommission(Constant.ZERO_LONG); + //使用积分价格 + orderItem.setUseScore(Constant.ZERO_LONG); + // 改价之后才会商家免运费,注意:要是改变了规则,这里也要改 + orderItem.setFreeFreightAmount(Constant.ZERO_LONG); + // 获取积分,确认收货之后才会获取积分 + orderItem.setGainScore(Constant.ZERO_LONG); + // 生成订单之后才会进行订单改价 + orderItem.setShopChangeFreeAmount(Constant.ZERO_LONG); + // 供应商相关信息保存 + orderItem.setItemPurchaseAmount(Constant.ZERO_LONG); + } + + + + private OrderPreSaleInfo getOrderPresaleInfo(Order order, ShopCartItemVO shopCartItem) { + OrderPreSaleInfo orderPreSaleInfo = new OrderPreSaleInfo(); + orderPreSaleInfo.setOrderId(order.getOrderId()); + orderPreSaleInfo.setPreSaleType(shopCartItem.getPreSaleType()); + // 如果是定金预售,保存下定金信息,否则只保存发货信息 + if (Objects.equals(shopCartItem.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + orderPreSaleInfo.setDepositAmount(shopCartItem.getActualDepositAmount()); + orderPreSaleInfo.setDepositExpansionAmount(shopCartItem.getDepositExpansionAmount()); + orderPreSaleInfo.setDepositReduceAmount(shopCartItem.getDepositReduceAmount()); + orderPreSaleInfo.setBalanceAmount(shopCartItem.getActualBalanceAmount()); + orderPreSaleInfo.setBalanceStartTime(shopCartItem.getBalanceStartTime()); + orderPreSaleInfo.setBalanceEndTime(shopCartItem.getBalanceEndTime()); + orderPreSaleInfo.setUserId(order.getUserId()); + } + orderPreSaleInfo.setPreSaleDeliveryTime(shopCartItem.getPreSaleDeliveryTime()); + orderPreSaleInfo.setPreSaleDeliveryType(shopCartItem.getPreSaleDeliveryType()); + // 供应商相关信息保存 + return orderPreSaleInfo; + } + + /** + * 获取订单项的国际化信息 + * + * @param shopCartItem 购物车项 + * @param orderItem + * @return 订单项的国际化信息列表 + */ + private List getOrderItemLangList(ShopCartItemVO shopCartItem, OrderItem orderItem) { + List orderItemLangList = new ArrayList<>(2); + Map spuNameMap = shopCartItem.getSpuLangList().stream() + .filter(orderSpuLangVO -> CharSequenceUtil.isNotBlank(orderSpuLangVO.getSpuName())) + .collect(Collectors.toMap(OrderSpuLangVO::getLang, OrderSpuLangVO::getSpuName)); + Map skuNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + Map comboSkuNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if(CollectionUtil.isNotEmpty(shopCartItem.getSkuLangList())) { + skuNameMap = shopCartItem.getSkuLangList().stream() + .filter(orderSkuLangVO -> CharSequenceUtil.isNotBlank(orderSkuLangVO.getSkuName())) + .collect(Collectors.toMap(OrderSkuLangVO::getLang, OrderSkuLangVO::getSkuName)); + comboSkuNameMap = shopCartItem.getSkuLangList().stream() + .filter(orderSkuLangVO -> CharSequenceUtil.isNotBlank(orderSkuLangVO.getComboSkuName())) + .collect(Collectors.toMap(OrderSkuLangVO::getLang, OrderSkuLangVO::getComboSkuName)); + } + Map supplierspuNameMap = null == shopCartItem.getSupplierSpuLangList() ? + new HashMap<>(2) : shopCartItem.getSupplierSpuLangList().stream() + .filter(orderSpuLangVO -> CharSequenceUtil.isNotBlank(orderSpuLangVO.getSpuName())) + .collect(Collectors.toMap(OrderSpuLangVO::getLang, OrderSpuLangVO::getSpuName)); + Map supplierskuNameMap = null == shopCartItem.getSupplierSkuLangList() ? + new HashMap<>(2) : shopCartItem.getSupplierSkuLangList().stream() + .filter(orderSkuLangVO -> CharSequenceUtil.isNotBlank(orderSkuLangVO.getSkuName())) + .collect(Collectors.toMap(OrderSkuLangVO::getLang, OrderSkuLangVO::getSkuName)); +// for (LanguageEnum value : LanguageEnum.values()) { + Integer lang = LanguageEnum.LANGUAGE_ZH_CN.getLang(); +// if (!spuNameMap.containsKey(lang) && !skuNameMap.containsKey(lang)) { +// continue; +// } + OrderItemLang orderItemLang = new OrderItemLang(); + orderItemLang.setLang(lang); + orderItemLang.setSkuName(LangUtil.getLangValue(skuNameMap, lang)); + orderItemLang.setSpuName(LangUtil.getLangValue(spuNameMap, lang)); +// orderItemLang.setComboSpuName(LangUtil.getLangValue(comboSpuNameMap, lang)); +// orderItemLang.setComboSkuName(LangUtil.getLangValue(comboSkuNameMap, lang)); + orderItem.setSpuName(orderItemLang.getSpuName()); + orderItem.setSkuName(orderItemLang.getSkuName()); + orderItemLangList.add(orderItemLang); + if (supplierspuNameMap.containsKey(lang) || supplierskuNameMap.containsKey(lang)) { + log.info("判断是否有供应商国际化信息"); + orderItemLang.setSupplierSpuName(LangUtil.getLangValue(supplierspuNameMap, lang)); + orderItemLang.setSupplierSkuName(LangUtil.getLangValue(supplierskuNameMap, lang)); + } +// } + return orderItemLangList; + } + + private Order getOrder(Long userId, Integer dvyType, Integer spuMold, ShopCartOrderVO shopCartOrderVO) { + if (Objects.nonNull(shopCartOrderVO.getHasComboOrder()) && shopCartOrderVO.getHasComboOrder()) { + spuMold = shopCartOrderVO.getSpuMold(); + }else { + spuMold = Objects.isNull(shopCartOrderVO.getSpuMold()) ? spuMold : shopCartOrderVO.getSpuMold(); + } + dvyType = Objects.equals(spuMold, 1) ? DeliveryType.NOT_DELIVERY.value() : dvyType; + // 订单信息 + Order order = new Order(); + order.setOrderId(shopCartOrderVO.getOrderId()); + + order.setShopId(shopCartOrderVO.getShopId()); + order.setShopName(shopCartOrderVO.getShopName()); + // 用户id + order.setUserId(userId); + // 商品总额 + order.setTotal(shopCartOrderVO.getTotal()); + // 实际总额 + order.setActualTotal(shopCartOrderVO.getActualTotal()); + order.setStatus(OrderStatus.UNPAY.value()); + order.setIsPayed(0); + order.setDeleteStatus(0); + order.setAllCount(shopCartOrderVO.getTotalCount()); + order.setReduceAmount(shopCartOrderVO.getShopReduce()); + order.setFreightAmount(shopCartOrderVO.getTransfee()); + order.setRemarks(shopCartOrderVO.getRemarks()); + order.setDeliveryType(dvyType); + order.setOrderScore(shopCartOrderVO.getUseScore()); + order.setOrderType(shopCartOrderVO.getOrderType() != null ? shopCartOrderVO.getOrderType() : OrderType.ORDINARY.value()); + order.setPlatformAmount(shopCartOrderVO.getPlatformAmount() != null ? shopCartOrderVO.getPlatformAmount() : 0L); + order.setScoreAmount(shopCartOrderVO.getScoreReduce() != null ? shopCartOrderVO.getScoreReduce() : 0L); + order.setMemberAmount(shopCartOrderVO.getLevelReduce() != null ? shopCartOrderVO.getLevelReduce() : 0L); + order.setPlatformCouponAmount(shopCartOrderVO.getPlatformCouponReduce() != null ? shopCartOrderVO.getPlatformCouponReduce() : 0L); + order.setShopCouponAmount(shopCartOrderVO.getCouponReduce() != null ? shopCartOrderVO.getCouponReduce() : 0L); + order.setDiscountAmount(shopCartOrderVO.getDiscountReduce() != null ? shopCartOrderVO.getDiscountReduce() : 0L); + order.setPlatformAmount(shopCartOrderVO.getPlatformAmount() != null ? shopCartOrderVO.getPlatformAmount() : 0L); + order.setReduceAmount(shopCartOrderVO.getShopReduce() != null ? shopCartOrderVO.getShopReduce() : 0L); + order.setFreeFreightAmount(shopCartOrderVO.getFreeTransfee() != null ? shopCartOrderVO.getFreeTransfee() : 0L); + order.setPlatformFreeFreightAmount(shopCartOrderVO.getLevelFreeTransfee() != null ? shopCartOrderVO.getLevelFreeTransfee() : 0L); + order.setPlatformCommission(shopCartOrderVO.getPlatformCommission() != null ? shopCartOrderVO.getPlatformCommission() : 0L); + order.setDistributionAmount(0L); + order.setShopChangeFreeAmount(0L); + order.setIsSettled(0); + order.setSupplierId(0L); + order.setSupplierDeliveryType(0); + order.setWaitPurchase(0); + order.setPurchaseSpreadAmount(0L); + order.setPreSaleType(shopCartOrderVO.getPreSaleType()); + order.setOrderMold(spuMold); + order.setShopComboAmount(calculateShopComboAmount(shopCartOrderVO)); + if (Objects.isNull(shopCartOrderVO.getMainOrderId())) { + shopCartOrderVO.setMainOrderId(Constant.ZERO_LONG); + } + order.setMainOrderId(shopCartOrderVO.getMainOrderId()); + // 供应商相关 + // 判断下是否为供应商商品,如果是商家代销供应商商品且为供应商发货设置供应商信息 + if (Objects.nonNull(shopCartOrderVO.getSupplierId()) && !Objects.equals(shopCartOrderVO.getSupplierId(), 0L)) { + order.setSupplierId(shopCartOrderVO.getSupplierId()); + if (Objects.equals(shopCartOrderVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + order.setSupplierDeliveryType(SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + } else { + order.setSupplierDeliveryType(SupplierDeliveryType.SHOP_DELIVERY.value()); + } + } + + return order; + } + + /** + * 计算订单套餐商品优惠金额 + * + * @param shopCartOrderVO + * @return + */ + private Long calculateShopComboAmount(ShopCartOrderVO shopCartOrderVO) { + List shopCartItemDiscounts = shopCartOrderVO.getShopCartItemDiscounts(); + Long shopComboAmount = 0L; + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + for (ShopCartItemVO shopCartItem : shopCartItems) { + if (Objects.nonNull(shopCartItem.getComboId()) && shopCartItem.getComboId() > 0) { + shopComboAmount += shopCartItem.getComboAmount(); + } + } + } + return shopComboAmount; + } + + @Override + public Long sumTotalDistributionAmountByOrderItem(List orderItems) { + // 订单总分销金额 + long totalDistributionAmount = 0L; + if (CollectionUtil.isNotEmpty(orderItems)) { + for (OrderItem orderItem : orderItems) { + if (Objects.isNull(orderItem.getDistributionUserId())) { + continue; + } + // 如果改订单项已经退款了的话,分销员的佣金就已经回退了,不需要继续算钱 + if (Objects.equals(orderItem.getRefundStatus(), RefundStatusEnum.SUCCEED.value())) { + continue; + } + // 分销佣金 + if (orderItem.getDistributionAmount() != null && orderItem.getDistributionAmount() > 0) { + totalDistributionAmount = totalDistributionAmount + orderItem.getDistributionAmount(); + } + // 上级分销佣金 + if (orderItem.getDistributionParentAmount() != null && orderItem.getDistributionParentAmount() > 0) { + totalDistributionAmount = totalDistributionAmount + orderItem.getDistributionParentAmount(); + } + } + } + return totalDistributionAmount; + } + + @Override + public Order getOrderAndOrderItemData(Long orderId, Long shopId) { + Order order = orderMapper.getOrderAndOrderItemData(orderId, shopId); + orderLangHandle(order); + return order; + } + + @Override + public OrderCountVO countNumberOfStatus(Long userId) { + OrderCountVO orderCountVO = orderMapper.countNumberOfStatus(userId); + // 补充退款订单数据 + OrderRefundDTO orderRefundDTO = new OrderRefundDTO(); + orderRefundDTO.setUserId(userId); + orderRefundDTO.setNotInStatuses(Arrays.asList(ReturnProcessStatusEnum.SUCCESS.value(), ReturnProcessStatusEnum.FAIL.value())); + Long refundCount = mongoOrderRefundManager.countRefundOrder(orderRefundDTO); + orderCountVO.setRefund(refundCount.intValue()); + return orderCountVO; + } + + + @Override + public EsPageVO myOrderPage(OrderSearchDTO orderSearchDTO) { + EsPageVO page = new EsPageVO<>(); + int pageSize = orderSearchDTO.getPageSize(); + int begin = 0; + int size = orderSearchDTO.getPageSize(); + int redisOrderTotal = 0; + List orderList = new ArrayList<>(); + boolean getRedisOrder = Objects.isNull(orderSearchDTO.getStatus()) + || Objects.equals(orderSearchDTO.getStatus(), OrderStatus.UNPAY.value()) + || Objects.equals(orderSearchDTO.getStatus(), OrderStatus.PAYED.value()); + if(getRedisOrder) { + // 获取redis是否存在订单,并返回符合条件的redis订单总数 + redisOrderTotal = getRedisOrderAndTotal(orderSearchDTO, redisOrderTotal, orderList); + } + // 计算一下当前页,数据库的订单还需要补充多少条数据 + // 比如redis中有5条数据,数据库 30条,总计35条,一页 10条 + PageAdapter pageAdapter = new PageAdapter(orderSearchDTO.getPageNum(), orderSearchDTO.getPageSize()); + // 如果redis有值,判断一下 + // 比如redis有23条,一页10条 + // 如果是第一页,redis这一页有10条,redisTotal > begin + size ,则数据库的size只需要拿0条 + // 如果是第二页,redisTotal > begin + size ,则数据库的size只需要拿0条 + // 如果是第三页,begin < redisTotal < begin + size ,20 < 23 < 20 + 10,则数据库的begin = 0, size只需要拿begin + size - redisTotal = 7条 + // 如果是第四页,redisTotal < begin,20 < 30,则数据库的begin = begin - redisTotal = 30 - 23 = 7, size = 10条 + if(redisOrderTotal > pageAdapter.getBegin() && redisOrderTotal < pageAdapter.getBegin() + pageAdapter.getSize()){ + size = pageAdapter.getBegin() + pageAdapter.getSize() - redisOrderTotal; + }else if(redisOrderTotal <= pageAdapter.getBegin()){ + begin = pageAdapter.getBegin() - redisOrderTotal; + } + pageAdapter.setSize(size); + // begin最小从0开始,如果是负数,begin = 0 + pageAdapter.setBegin(begin); + orderSearchDTO.setBegin(begin); + orderSearchDTO.setPageSize(size); + if (StrUtil.isNotBlank(orderSearchDTO.getSpuName())) { + EsPageVO esOrderVOEsPageVO = orderPage(orderSearchDTO); + orderList.addAll(esOrderVOEsPageVO.getList()); + page.setTotal(esOrderVOEsPageVO.getTotal() + redisOrderTotal); + page.setPages(PageUtil.getPages(page.getTotal(), pageSize)); + page.setList(orderList); + return page; + } + + Long orderTotal = orderMapper.countPageOrderIds(orderSearchDTO); + + page.setTotal(orderTotal + redisOrderTotal); + page.setPages(PageUtil.getPages(page.getTotal(), pageSize)); + // 如果缓存中的订单已经超过当前页的总数,直接return + if(CollectionUtil.isNotEmpty(orderList) && orderList.size() >= pageSize){ + page.setList(orderList); + return page; + } + List orderIds = orderMapper.pageOrderIds(orderSearchDTO,pageAdapter); + if (CollUtil.isNotEmpty(orderIds)) { + List orderListDb = orderMapper.userOrderList(orderIds, I18nMessage.getLang()); + OrderLangUtil.esOrderLang(orderListDb); + orderList.addAll(orderListDb); + page.setList(orderList); + } else { + page.setList(orderList); + } + // 判断一下,如果redisTotal的行数小于10条,则和数据库/es查询出来的一起排序 + // 如果redisTotal的行数大于10条,则不需要排序,默认redis的订单排在前面 + if(redisOrderTotal < pageSize){ + orderList.sort(Comparator.comparing(EsOrderVO::getCreateTime).reversed()); + } + return page; + } + + private int getRedisOrderAndTotal(OrderSearchDTO orderSearchDTO, int redisOrderTotal, List orderList) { + // 获取当前用户缓存中的秒杀订单 + ServerResponseEntity> mapServerResponseEntity = seckillFeignClient.mapSeckillOrderByUserIdAndRedis(orderSearchDTO.getUserId()); + if (!mapServerResponseEntity.isSuccess()) { + throw new LuckException(mapServerResponseEntity.getMsg()); + } + Map entries = mapServerResponseEntity.getData(); + if(CollectionUtil.isEmpty(entries)){ + return 0; + } + // 分页查询 + Integer pageSize = orderSearchDTO.getPageSize(); + List orderIds = new ArrayList<>(); + // 因为要分页,所以需要排序,而且由于这里是单个用户的redis订单列表,直接按照时间排序就好 + for (Object orderIdKey : entries.keySet()) { + String orderKey = orderIdKey.toString(); + if(orderKey.startsWith(SeckillOrderCacheConstant.STATUS)) { + continue; + } + String orderIdStr = orderKey.replace(SeckillOrderCacheConstant.ORDER_INFO,""); + orderIds.add(Long.valueOf(orderIdStr)); + } + // 获取当前页数 + PageAdapter pageAdapter = new PageAdapter(orderSearchDTO.getPageNum(), orderSearchDTO.getPageSize()); + // 第二页起始就是,(2-1) * 10 = 10 + // 10 + 10 < 15 ? 20 : 15 + int begin = pageAdapter.getBegin(); + orderIds = orderIds.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()); + // 目前map有存订单和订单状态信息,需要拆分一下 + for (Long orderId : orderIds) { + // 获取订单信息转成order + Object orderInfoObj = entries.get(SeckillOrderCacheConstant.ORDER_INFO + orderId); + ShopCartOrderMergerVO shopCartOrderMergerVO = JSONObject.parseObject((String) orderInfoObj, ShopCartOrderMergerVO.class); + Order order = getOrderInfoByShopCartOrderMerger(shopCartOrderMergerVO); + + // 获取订单状态 + Object statusObj = entries.get(SeckillOrderCacheConstant.STATUS + order.getOrderId()); + order.setStatus(Integer.valueOf(statusObj.toString())); + if(Objects.nonNull(orderSearchDTO.getStatus()) && !Objects.equals(orderSearchDTO.getStatus(),order.getStatus())){ + continue; + } + EsOrderVO esOrderVO = BeanUtil.map(order, EsOrderVO.class); + // 在用户商品名称搜索时,由于缓存存的是秒杀订单,所以只有一个订单项,直接模糊搜索 + OrderLangUtil.esOrderList(esOrderVO.getOrderItems()); + EsOrderItemVO esOrderItemVO = esOrderVO.getOrderItems().get(0); + esOrderVO.setOrderItems(BeanUtil.mapAsList(order.getOrderItems(), EsOrderItemVO.class)); + // 处理一下预售 + if(Objects.nonNull(esOrderVO.getPreSaleType())){ + ShopCartItemVO shopCartItem = shopCartOrderMergerVO.getShopCartOrders().get(0).getShopCartItemDiscounts().get(0).getShopCartItems().get(0); + esOrderVO.setPreSaleDeliveryTime(shopCartItem.getPreSaleDeliveryTime()); + esOrderVO.setPreSaleDeliveryType(shopCartItem.getPreSaleDeliveryType()); + } + boolean orderIdCheck = Objects.isNull(orderSearchDTO.getOrderId()) || Objects.equals(esOrderVO.getOrderId(),orderSearchDTO.getOrderId()); + boolean nameCheck = StrUtil.isBlank(orderSearchDTO.getSpuName()) || esOrderItemVO.getSpuName().contains(orderSearchDTO.getSpuName()); + if(orderIdCheck && nameCheck) { + // redis符合条件的条数 + redisOrderTotal++; + // 判断一下,每次进来起始数都减去1,如果小于0就可以放入了 + begin--; + if(begin >= 0){ + continue; + } + if(pageSize > 0) { + orderList.add(esOrderVO); + } + // 开始一页数据扣减 + pageSize--; + } + } + return redisOrderTotal; + } + + + @Override + public EsPageVO orderPage(OrderSearchDTO orderSearchDTO) { + + // 处理下payType + List payTypeList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.WECHATPAY.value())) { + payTypeList.addAll(Arrays.asList(PayType.WE_CHAT_PAY_ARRAY)); + } else if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.ALIPAY.value())) { + payTypeList.addAll(Arrays.asList(PayType.ALI_PAY_ARRAY)); + } else if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.BALANCE.value())) { + payTypeList.add(PayType.BALANCE.value()); + } else if (Objects.equals(orderSearchDTO.getPayType(), SearchPayType.SCOREPAY.value())) { + payTypeList.add(PayType.SCOREPAY.value()); + } + orderSearchDTO.setPayTypeList(payTypeList); + ServerResponseEntity> orderResponse = searchOrderFeignClient.pageOrder(orderSearchDTO); + return orderResponse.getData(); + } + + @Override + public int countByOrderId(Long orderId) { + return orderMapper.countByOrderId(orderId); + } + + + @Override + public EsPageVO pageByUserId(PageDTO pageDTO, String userId) { + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setUserId(Long.valueOf(userId)); + orderSearchDTO.setPageNum(pageDTO.getPageNum()); + orderSearchDTO.setPageSize(pageDTO.getPageSize()); + orderSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + ServerResponseEntity> orderResponseEntity = searchOrderFeignClient.pageOrder(orderSearchDTO); + if (!orderResponseEntity.isSuccess()) { + log.info("查询订单列表失败,失败原因:{}", orderResponseEntity.getMsg()); + throw new LuckException(orderResponseEntity.getMsg()); + } + return orderResponseEntity.getData(); + } + + + @Override + public int settledOrder(List orderIds) { + return orderMapper.settledOrder(orderIds); + } + + @Override + public EsOrderBO getEsOrderInfo(Long orderId) { + EsOrderBO order = orderMapper.getEsOrderInfo(orderId); + if (Objects.isNull(order)) { + return null; + } + this.loadMongoOrderBo(order); + EsOrderBO esOrderBO = BeanUtil.map(order, EsOrderBO.class); + if (Objects.nonNull(order.getAddr())) { + esOrderBO.setReceivingAddr(order.getProvince() + order.getCity() + order.getArea() + order.getAddr()); + } + return esOrderBO; + } + + private void loadMongoOrderBo(EsOrderBO orderBO) { + // 拼接字符串 + StringBuilder spuCodes = new StringBuilder(500); + StringBuilder partyCodes = new StringBuilder(500); + List spuIds = new ArrayList<>(10); + for (EsOrderItemBO orderItem : orderBO.getOrderItems()) { + spuIds.add(orderItem.getSpuId()); + for (OrderItemLangVO orderItemLang : orderItem.getOrderItemLangList()) { + if (Objects.equals(orderItemLang.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + orderItem.setSpuNameZh(orderItemLang.getSpuName()); + orderItem.setSkuNameZh(orderItemLang.getSkuName()); + orderItem.setSupplierSpuNameZh(orderItemLang.getSupplierSpuName()); + orderItem.setSupplierSkuNameZh(orderItemLang.getSupplierSkuName()); + } else if (Objects.equals(orderItemLang.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + orderItem.setSpuNameEn(orderItemLang.getSpuName()); + orderItem.setSkuNameEn(orderItemLang.getSkuName()); + orderItem.setSupplierSpuNameEn(orderItemLang.getSupplierSpuName()); + orderItem.setSupplierSkuNameEn(orderItemLang.getSupplierSkuName()); + } + } + orderItem.setOrderItemLangList(null); + if (StrUtil.isNotBlank(orderItem.getSpuCode())) { + spuCodes.append(orderItem.getSpuCode()).append(StrUtil.COMMA); + } + if (StrUtil.isNotBlank(orderItem.getPartyCode())) { + partyCodes.append(orderItem.getPartyCode()).append(StrUtil.COMMA); + } + } + this.setPrimaryCategoryId(orderBO, spuIds); + // 判断是否为新成交用户 + MongoOrderBO firstOrderData = orderMapper.getUserFirstUserOrder(orderBO.getUserId(), orderBO.getSupplierId(), orderBO.getOrderId()); + orderBO.setFirstOrder(firstOrderData.getFirstOrder()); + orderBO.setFirstSupplierOrder(firstOrderData.getFirstSupplierOrder()); + + // 插入会员类型 + UserApiVO user = userLevelLogFeignClient.getUserTypeAndUserNameAtTime(new UserTypeDTO(orderBO.getUserId(), orderBO.getCreateTime())); + orderBO.setUserType(user.getLevelType()); + if (spuCodes.length() > 1 && spuCodes.lastIndexOf(StrUtil.COMMA) == spuCodes.length() - 1) { + spuCodes.deleteCharAt(spuCodes.length() - 1); + } + + if (partyCodes.length() > 1 && partyCodes.lastIndexOf(StrUtil.COMMA) == partyCodes.length() - 1) { + partyCodes.deleteCharAt(partyCodes.length() - 1); + } + orderBO.setSpuCodes(spuCodes.toString()); + orderBO.setPartyCodes(partyCodes.toString()); + // 如果是自提订单,查询自提点信息 + if (Objects.equals(orderBO.getDeliveryType(), DeliveryType.STATION.value())) { + OrderSelfStationVO orderSelfStationVO = orderSelfStationService.getStationByOrderId(null, orderBO.getOrderId()); + orderBO.setConsignee(orderSelfStationVO.getStationUserName()); + orderBO.setMobile(orderSelfStationVO.getStationUserMobile()); + orderBO.setAddr(null); + } + // 虚拟订单的收货人姓名就是用于昵称,用于收货人姓名的筛选 + if (Objects.equals(orderBO.getOrderMold(), 1)) { + orderBO.setConsignee(user.getNickName()); + } + } + + private void setPrimaryCategoryId(EsOrderBO orderBO, List spuIds) { + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setPageSize(PageDTO.MAX_PAGE_SIZE); + productSearchDTO.setPageNum(PageDTO.DEFAULT_PAGE_NUM); + productSearchDTO.setSpuIds(spuIds); + ServerResponseEntity> searchResponse = searchSpuFeignClient.adminPage(productSearchDTO); + if (!searchResponse.isSuccess()) { + throw new LuckException(searchResponse.getMsg()); + } + List spuList = searchResponse.getData().getList(); + if (CollUtil.isNotEmpty(spuList)) { + Map categoryMap = spuList.stream().collect(Collectors.toMap(SpuAdminVO::getSpuId, SpuAdminVO::getPrimaryCategoryId)); + for (EsOrderItemBO orderItem : orderBO.getOrderItems()) { + Long categoryId = categoryMap.get(orderItem.getSpuId()); + orderItem.setPrimaryCategoryId(categoryId); + } + } + } + + private EsOrderBO loadEsOrderBo(Order order) { + EsOrderBO esOrderBO = BeanUtil.map(order, EsOrderBO.class); + esOrderBO.setOrderItems(new ArrayList<>(Constant.INITIAL_CAPACITY)); + // 拼接字符串 + StringBuilder spuCodes = new StringBuilder(500); + StringBuilder partyCodes = new StringBuilder(500); + for (OrderItem orderItem : order.getOrderItems()) { + EsOrderItemBO orderItemVO = BeanUtil.map(orderItem, EsOrderItemBO.class); + esOrderBO.getOrderItems().add(orderItemVO); + for (OrderItemLang orderItemLang : orderItem.getOrderItemLangList()) { + if (Objects.equals(orderItemLang.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + orderItemVO.setSpuNameZh(orderItemLang.getSpuName()); + orderItemVO.setSkuNameZh(orderItemLang.getSkuName()); + } else if (Objects.equals(orderItemLang.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + orderItemVO.setSpuNameEn(orderItemLang.getSpuName()); + orderItemVO.setSkuNameEn(orderItemLang.getSkuName()); + } + } + if (StrUtil.isNotBlank(orderItem.getSpuCode())) { + spuCodes.append(orderItem.getSpuCode()).append(StrUtil.COMMA); + } + if (StrUtil.isNotBlank(orderItem.getPartyCode())) { + partyCodes.append(orderItem.getPartyCode()).append(StrUtil.COMMA); + } + } + if (spuCodes.length() > 1 && spuCodes.lastIndexOf(StrUtil.COMMA) == spuCodes.length() - 1) { + spuCodes.deleteCharAt(spuCodes.length() - 1); + } + + if (partyCodes.length() > 1 && partyCodes.lastIndexOf(StrUtil.COMMA) == partyCodes.length() - 1) { + partyCodes.deleteCharAt(partyCodes.length() - 1); + } + esOrderBO.setSpuCodes(spuCodes.toString()); + esOrderBO.setPartyCodes(partyCodes.toString()); + return esOrderBO; + } + + @Override + public SendNotifyBO getOrderInfoByOrderId(Long orderId) { + // 获取订单信息 + EsOrderBO order = orderMapper.getEsOrder(orderId); + List orderItems = orderItemService.listOrderItemAndLangByOrderId(orderId); + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + for (com.tmerclub.cloud.common.order.vo.OrderItemVO selectOrderItem : orderItems) { + String skuName = Objects.isNull(selectOrderItem.getSkuName()) ? "" : selectOrderItem.getSkuName(); + sb.append(selectOrderItem.getSpuName()).append(skuName).append(StrUtil.COMMA); + } + sb.deleteCharAt(sb.length() - 1); + + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setUserId(order.getUserId()); + sendNotifyBO.setBizId(order.getOrderId()); + sendNotifyBO.setMobile(order.getMobile()); + sendNotifyBO.setSpuName(sb.toString()); + sendNotifyBO.setPrice(PriceUtil.toDecimalPrice(order.getActualTotal()).toString()); + sendNotifyBO.setShopId(order.getShopId()); + return sendNotifyBO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateWaitPurchaseBatchById(List orders) { + if (CollUtil.isEmpty(orders)) { + return; + } + for (Order order : orders) { + orderMapper.updateWaitPurchase(order); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void sourcingOrder(Order order) { + Order orderDb = getByOrderId(order.getOrderId()); + if (Objects.equals(orderDb.getWaitPurchase(), PurchaseOrderWaitStatus.PURCHASED.value())) { + log.info("订单已经采购,不需要再次采购"); + return; + } + order.setWaitPurchase(PurchaseOrderWaitStatus.PURCHASED.value()); + orderMapper.update(order); + // 发送消息,订单支付成功 通知商家分账 + PayNotifyBO payNotifyBO = new PayNotifyBO(); + payNotifyBO.setOrderIds(Collections.singletonList(order.getOrderId())); + payNotifyBO.setAgreePurchase(1); + // 生成店铺钱包日志id列表 + List shopWalletIds = segmentManager.listSegmentId(DistributedIdKey.MALL4CLOUD_SHOP_WALLET_LOG, payNotifyBO.getOrderIds().size() * 3); + payNotifyBO.setShopWalletIds(shopWalletIds); + SendStatus sendShopStatus = orderPurchaseNotifyShopTemplate.syncSend(RocketMqConstant.ORDER_PURCHASE_NOTIFY_SHOP_TOPIC, new GenericMessage<>(payNotifyBO)).getSendStatus(); + if (!Objects.equals(sendShopStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + log.info("订单采购后,通知商家分账失败"); + throw new LuckException(ResponseEnum.EXCEPTION); + } + + //商家采购后,给对应供应商发送待发货提醒 + List notifyList = this.listSimpleSendNotifyBO(Collections.singletonList(order.getOrderId())); + for (SendNotifyBO sendNotifyBO : notifyList) { + sendNotifyBO.setPrice(PriceUtil.toDecimalPrice(sendNotifyBO.getActualTotal()).toString()); + sendNotifyBO.setSendType(SendTypeEnum.USER_PAY_SUCCESS_TO_SUPPLIER.getValue()); + sendNotifyBO.setShopId(null); + } + SendStatus sendShopMsgStatus = sendNotifyToShopTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_SHOP_TOPIC, new GenericMessage<>(notifyList.get(0))).getSendStatus(); + if (!Objects.equals(sendShopMsgStatus, SendStatus.SEND_OK)) { + log.info("订单采购后,通知供应商发货失败"); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + + @Override + public List listSimpleSendNotifyBO(List orderIds) { + List orderItemList = orderItemService.listOrderItemAndLangByOrderIds(orderIds); + Map> orderItemMap = orderItemList.stream().collect(Collectors.groupingBy(OrderItemVO::getOrderId)); + + List sendNotifyList = new ArrayList<>(orderIds.size()); + for (List orderItems : orderItemMap.values()) { + OrderItemVO orderItemVO = orderItems.get(0); + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setBizId(orderItemVO.getOrderId()); + sendNotifyBO.setSpuName(orderItemVO.getSpuName()); + sendNotifyList.add(sendNotifyBO); + } + return sendNotifyList; + } + + @Override + public List listSendNotifyByOrderIds(List orderIds) { + List orderList = orderMapper.listOrderAndLangByOrderIds(orderIds); + // 获取自提订单的订单id + List stationOrderIds = orderList.stream().filter(orderVO -> Objects.equals(orderVO.getDeliveryType(), DeliveryType.STATION.value())).map(OrderVO::getOrderId).collect(Collectors.toList()); + List orderSelfStationVOS = orderSelfStationService.listSelfStationByOrderIds(stationOrderIds); + Map orderStationMap = orderSelfStationVOS.stream().collect(Collectors.toMap(OrderSelfStationVO::getOrderId, orderSelfStationVO -> orderSelfStationVO)); + List sendNotifyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderVO orderVO : orderList) { + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setShopId(orderVO.getShopId()); + sendNotifyBO.setSupplierId(orderVO.getSupplierId()); + sendNotifyBO.setBizId(orderVO.getOrderId()); + sendNotifyBO.setUserId(orderVO.getUserId()); + sendNotifyBO.setSupplierDeliveryType(orderVO.getSupplierDeliveryType()); + sendNotifyBO.setActualTotal(orderVO.getActualTotal()); + sendNotifyBO.setMobile(Objects.equals(orderVO.getDeliveryType(), DeliveryType.STATION.value()) ? orderStationMap.get(orderVO.getOrderId()).getStationUserMobile() : orderVO.getMobile()); + sendNotifyBO.setShopChangeFreeAmount(orderVO.getShopChangeFreeAmount()); + OrderLangUtil.orderItemVOList(orderVO.getOrderItems()); + StringBuilder stringBuilder = new StringBuilder(Constant.INITIAL_CAPACITY); + for (com.tmerclub.cloud.common.order.vo.OrderItemVO orderItem : orderVO.getOrderItems()) { + stringBuilder.append(orderItem.getSpuName()).append(" "); + if (StrUtil.isNotBlank(orderItem.getSkuName())) { + stringBuilder.append(orderItem.getSkuName()); + } + stringBuilder.append(","); + } + if (stringBuilder.length() > 0) { + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + sendNotifyBO.setSpuName(stringBuilder.toString()); + } + sendNotifyList.add(sendNotifyBO); + } + return sendNotifyList; + } + + /** + * 订单语言信息处理 + * + * @param order 订单 + */ + private void orderLangHandle(Order order) { + Integer lang = I18nMessage.getLang(); + for (OrderItem orderItem : order.getOrderItems()) { + if (CollUtil.isEmpty(orderItem.getOrderItemLangList())) { + continue; + } + Map langMap = orderItem.getOrderItemLangList().stream().collect(Collectors.toMap(OrderItemLang::getLang, s -> s)); + OrderItemLang orderItemLang; + if (langMap.containsKey(lang)) { + orderItemLang = langMap.get(lang); + } else { + orderItemLang = langMap.get(Constant.DEFAULT_LANG); + } + if (Objects.isNull(orderItemLang)) { + continue; + } + orderItem.setSpuName(orderItemLang.getSpuName()); + orderItem.setSkuName(orderItemLang.getSkuName()); + orderItem.setSupplierSpuName(orderItemLang.getSupplierSpuName()); + orderItem.setSupplierSkuName(orderItemLang.getSupplierSkuName()); + } + } + + @Override + public void getReturnOrderStatus(OrderVO orderVO) { + List returnOrderList = orderRefundMapper.getProcessOrderRefundByOrderId(orderVO.getOrderId()); + if (CollUtil.isEmpty(returnOrderList)) { + return; + } + Map itemMap = orderVO.getOrderItems().stream().collect(Collectors.toMap(com.tmerclub.cloud.common.order.vo.OrderItemVO::getOrderItemId, s -> s)); + for (OrderRefund orderRefund : returnOrderList) { + if (Objects.equals(orderRefund.getRefundType(), RefundType.ALL.value())) { + orderVO.getOrderItems().forEach(item -> item.setReturnMoneySts(orderRefund.getReturnMoneySts())); + break; + } else { + itemMap.get(orderRefund.getOrderItemId()).setReturnMoneySts(orderRefund.getReturnMoneySts()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void orderStationByOrderId(List orderIdList, Long userId, Long stationId) { + if (CollUtil.isEmpty(orderIdList)) { + // 请选择最少一个需要自提的订单 + throw new LuckException("请选择最少一个需要自提的订单"); + } + List orderList = orderMapper.getStationOrderByOrderIds(orderIdList, userId, null); + OrderVO orderParam = new OrderVO(); + if (CollectionUtils.isEmpty(orderList)) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + for (OrderVO order : orderList) { + if (Objects.isNull(order)) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + orderParam = order; + if (Objects.equals(order.getOrderMold(), 1)) { + orderVirtualInfoService.orderWriteOffByOrderId(null, BeanUtil.map(order, Order.class), stationId); + continue; + } + // 如果不是自提订单且不是核销订单就直接报错,如果是扫商家码进来的就不需要自提点id + if (!Objects.equals(order.getDeliveryType(), DeliveryType.STATION.value()) && !Objects.equals(stationId, null)) { + // 订单不存在 + throw new LuckException("订单不存在"); + } + boolean isRefund = Objects.equals(order.getRefundStatus(), RefundStatusEnum.APPLY.value()) + || Objects.equals(order.getRefundStatus(), RefundStatusEnum.SUCCEED.value()); + if (Objects.nonNull(order.getRefundStatus()) && isRefund) { + // 订单退款中,无法自提 + throw new LuckException(order.getOrderId() + "订单退款中,无法自提"); + } + List processOrderRefunds = orderRefundMapper.getProcessingRefundByOrderId(order.getOrderId()); + if (CollectionUtil.isNotEmpty(processOrderRefunds)) { + // 订单退款中,无法自提 + throw new LuckException(order.getOrderId() + "订单退款中,无法自提"); + } + if (!Objects.equals(order.getStatus(), OrderStatus.PAYED.value())) { + // 订单已提货 + throw new LuckException(order.getOrderId() + "订单已提货"); + } + order.setStatus(OrderStatus.CONSIGNMENT.value()); + order.setDeliveryTime(new Date()); + order.setUpdateTime(new Date()); + } + if (Objects.isNull(stationId)) { + stationId = orderParam.getStationId(); + } + StationVO stationVO = deliveryManager.getStation(stationId); + List sendNotifyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderVO orderVO : orderList) { + if (orderVO.getOrderMold() == null || orderVO.getOrderMold() != 1) { + updateList.add(orderVO.getOrderId()); + } + Integer lang = I18nMessage.getLang(); + String spuNames = orderVO.getOrderItems().stream().map(x -> { + for (OrderItemLangVO itemLang : x.getOrderItemLangList()) { + if (Objects.equals(itemLang.getLang(), lang)) { + return itemLang.getSpuName(); + } + } + return ""; + }).collect(Collectors.joining(" ")); + // 添加消息通知 + addSendNotify(sendNotifyList, orderVO, spuNames); + sendNotifyList.forEach(item -> { + item.setStationName(stationVO.getStationName()); + }); + } + if (updateList.size() != 0) { + orderMapper.updateByToStatinoSuccess(updateList); + } + SendStatus sendStockStatus = sendNotifyToUserTemplate.syncSend(RocketMqConstant.SEND_NOTIFY_TO_USER_TOPIC, new GenericMessage<>(sendNotifyList)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + log.info("自提订单提货后,推送用户消息发送失败"); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + private static void addSendNotify(List sendNotifyList, OrderVO orderVO, String spuNames) { + // TODO 消息推送-发货提醒,通知其他服务 + SendNotifyBO sendNotifyBO = new SendNotifyBO(); + sendNotifyBO.setUserId(orderVO.getUserId()); + sendNotifyBO.setBizId(orderVO.getOrderId()); + sendNotifyBO.setSpuName(spuNames); + sendNotifyBO.setShopId(orderVO.getShopId()); + sendNotifyBO.setMobile(orderVO.getMobile()); + sendNotifyBO.setPrice(String.valueOf((orderVO.getActualTotal() / 100))); + sendNotifyBO.setProdNum(orderVO.getAllCount()); + sendNotifyBO.setDvyName(null); + sendNotifyBO.setSendType(SendTypeEnum.WRITE_OFF.getValue()); + sendNotifyBO.setDvyFlowId(null); + sendNotifyList.add(sendNotifyBO); + } + + @Override + public List listStationOrder(OrderDTO orderDTO) { + return orderMapper.listStationOrder(orderDTO); + } + + @Override + public Map checkShopName(OrderSearchDTO orderSearchDTO) { + Map shopNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (null != orderSearchDTO.getShopName() && !Objects.equals(orderSearchDTO.getShopName(), "")) { + log.info("根据店铺名称查询店铺信息,防止店铺被改名导致的订单数据不准确"); + List shopList = shopDetailFeignClient.getShopDetailByShopIdAndShopName(orderSearchDTO.getShopName()).getData(); + orderSearchDTO.setShopName(null); + if (CollUtil.isNotEmpty(shopList)) { + log.info("将数据库查询的店铺id放入查询条件中"); + shopNameMap.putAll(shopList.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName))); + orderSearchDTO.setShopIds(shopList.stream().map(ShopDetailVO::getShopId).collect(Collectors.toList())); + } else { + orderSearchDTO.setShopId(Constant.DEFAULT_SHOP_ID); + } + } + return shopNameMap; + } + + @Override + public Map checkSupplierName(OrderSearchDTO orderSearchDTO) { + Map supplierNameMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (null != orderSearchDTO.getSupplierName() && !Objects.equals(orderSearchDTO.getSupplierName(), "")) { + log.info("根据供应商名称查询供应商信息,防止供应商被改名导致的订单数据不准确"); + List supplierList = supplierDetailFeignClient.getSupplierDetailBySupplierName(orderSearchDTO.getSupplierName()).getData(); + orderSearchDTO.setSupplierName(null); + if (CollUtil.isNotEmpty(supplierList)) { + log.info("将数据库查询的店铺id放入查询条件中"); + supplierNameMap.putAll(supplierList.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName))); + orderSearchDTO.setSupplierIds(supplierList.stream().map(SupplierApiDetailVO::getSupplierId).collect(Collectors.toList())); + } else { + orderSearchDTO.setSupplierId(Constant.DEFAULT_SUPPLIER_ID); + } + } + return supplierNameMap; + } + + /** + * 处理自提订单操作 + * + * @param mergerOrder 聚合订单信息 + * @param order 订单 + * @param dvyType 配送方式 + * @param station 自提点信息 + */ + private void deliverySubmitOrderListener(ShopCartOrderMergerVO mergerOrder, Order order, + Integer dvyType, StationVO station) { + //判断是否是自提订单 + if (!Objects.equals(dvyType, DeliveryType.STATION.value())) { + return; + } + Date now = new Date(); + //自提订单的地址信息 + OrderSelfStation orderSelfStation = BeanUtil.map(mergerOrder.getOrderSelfStation(), OrderSelfStation.class); + if (orderSelfStation == null) { + // 请填写自提信息 + throw new LuckException("请填写自提信息"); + } + if (order.getOrderItems().get(0).getSpuMold().equals(SpuMold.VIRTUAL.value())) { + // 虚拟商品不支持自提 + log.info("虚拟商品不需要设置自提信息"); + return; + } + if (Objects.isNull(station)) { + log.info("获取自提点信息:{}", orderSelfStation.getStationId()); + station = stationService.getByStationId(orderSelfStation.getStationId()); + } + Long userId = mergerOrder.getUserId(); + if (Objects.isNull(station)) { + // 自提点信息不存在,请重新选择自提点 + throw new LuckException("自提点信息不存在,请重新选择自提点"); + } + orderSelfStation.setOrderSelfStationId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_SELF_STATION, userId)); + orderSelfStation.setUserId(userId); + String addr = station.getProvince() + station.getCity() + station.getArea() + station.getAddr(); + //获取最新的随机码 + String code = Constant.PICKUP_CODE_PREFIX + segmentManager.getSegmentCode(DistributedIdKey.MALL4CLOUD_ORDER_STATION_CODE, 8); + orderSelfStation.setStationCode(code); + orderSelfStation.setOrderId(order.getOrderId()); + orderSelfStation.setShopId(order.getShopId()); + orderSelfStation.setStationAddress(addr); + //若是固定电话,则拼接上区号 + String mobilePrefix = StrUtil.isNotBlank(station.getMobilePrefix()) ? station.getMobilePrefix() : ""; + orderSelfStation.setStationPhone(mobilePrefix + station.getMobile()); + orderSelfStation.setCreateTime(now); + orderSelfStation.setUpdateTime(now); + orderSelfStationService.save(orderSelfStation); + } + + /** + * 处理虚拟商品操作 + * + * @param orderVirtualInfos 虚拟订单核销信息列表 + * @param mergerOrder 聚合订单信息 + * @param shopCartOrderDto 店铺订单信息 + * @param order 订单信息 + */ + private void handlerVirtualProdOder(List orderVirtualInfos, ShopCartOrderMergerVO mergerOrder, ShopCartOrderVO shopCartOrderDto, Order order) { + Long userId = mergerOrder.getUserId(); + order.setOrderMold(order.getOrderItems().get(0).getSpuMold()); + for (OrderItem orderItem : order.getOrderItems()) { + if(!Objects.equals(orderItem.getSpuMold(),SpuMold.VIRTUAL.value())){ + continue; + } + orderItem.setIsRefund(shopCartOrderDto.getIsRefund()); + Map> map = new HashMap<>(8); + ShopCartItemVO shopCartItemVO = shopCartOrderDto.getShopCartItemDiscounts().get(0).getShopCartItems().get(0); + Long prodId = shopCartItemVO.getSpuId(); + // 虚拟商品备注信息列表 + if (CollUtil.isNotEmpty(mergerOrder.getVirtualRemarkList())) { + for (VirtualRemarkVO virtualRemarkVO : mergerOrder.getVirtualRemarkList()) { + if (Objects.isNull(virtualRemarkVO.getSpuId())) { + virtualRemarkVO.setSpuId(prodId); + } + } + map = mergerOrder.getVirtualRemarkList().stream().collect(Collectors.groupingBy(VirtualRemarkVO::getSpuId)); + } + // 存入留言 + String virtualRemarkStr = Json.toJsonString(map.get(prodId)); + orderItem.setVirtualRemark(virtualRemarkStr); + // 虚拟商品默认无需快递 + order.setDeliveryType(DeliveryType.NOT_DELIVERY.value()); + // 存入核销信息 + order.setWriteOffStart(shopCartOrderDto.getWriteOffStart()); + order.setWriteOffEnd(shopCartOrderDto.getWriteOffEnd()); + if (Objects.nonNull(shopCartOrderDto.getWriteOffEnd()) && DateUtil.compare(shopCartOrderDto.getWriteOffEnd(), new Date()) < 0) { + throw new LuckException("卡券已过期!"); + } + order.setWriteOffNum(shopCartOrderDto.getWriteOffNum()); + order.setWriteOffMultipleCount(shopCartOrderDto.getWriteOffMultipleCount()); + order.setWriteOffStatus(0); + order.setWriteOffCount(0); + if (Objects.equals(order.getWriteOffNum(), 0)) { + continue; + } + + for (int i = 0; i < order.getAllCount(); i++) { + OrderVirtualInfo orderVirtualInfo = new OrderVirtualInfo(); + orderVirtualInfo.setOrderVirtualInfoId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_VIRTUAL_INFO, userId)); + orderVirtualInfo.setOrderId(order.getOrderId()); + orderVirtualInfo.setOrderItemId(orderItem.getOrderItemId()); + orderVirtualInfo.setShopId(order.getShopId()); + orderVirtualInfo.setIsWriteOff(0); + orderVirtualInfo.setWriteOffMultipleCount(order.getWriteOffMultipleCount()); + //获取最新的随机码 + String code = Constant.VIRTUAL_CODE_PREFIX + segmentManager.getSegmentCode(DistributedIdKey.MALL4CLOUD_ORDER_VIRTUAL_CODE, 8); + orderVirtualInfo.setWriteOffCode(code); + orderVirtualInfo.setCreateTime(new Date()); + orderVirtualInfos.add(orderVirtualInfo); + } + } + } + + @Override + public Order getOrderInfoByShopCartOrderMerger(ShopCartOrderMergerVO mergerOrder) { + Long userId = mergerOrder.getUserId(); + ShopCartOrderVO shopCartOrderDto = mergerOrder.getShopCartOrders().get(0); + ShopCartItemVO shopCartItem = mergerOrder.getShopCartOrders().get(0).getShopCartItemDiscounts().get(0).getShopCartItems().get(0); + OrderAddr orderAddr = BeanUtil.map(mergerOrder.getUserAddr(), OrderAddr.class); + if (Objects.nonNull(mergerOrder.getUserAddr())) { + orderAddr.setOrderAddrId(mergerOrder.getUserAddr().getAddrId()); + } + Map dvyTypeMap = mergerOrder.getDvyTypes().stream().collect(Collectors.toMap(DvyTypeDTO::getShopId, DvyTypeDTO::getDvyType)); + Order order = getOrder(userId, dvyTypeMap.get(shopCartOrderDto.getShopId()), mergerOrder.getSpuMold(), shopCartOrderDto); + Map> virtualRemarkMap = new HashMap<>(8); + // 虚拟商品备注信息列表 + if (CollUtil.isNotEmpty(mergerOrder.getVirtualRemarkList())) { + virtualRemarkMap = mergerOrder.getVirtualRemarkList().stream().collect(Collectors.groupingBy(VirtualRemarkVO::getSpuId)); + } + OrderItem orderItem = getOrderItem(mergerOrder, order, shopCartItem, virtualRemarkMap, shopCartOrderDto); + order.setOrderItems(Collections.singletonList(orderItem)); + order.setOrderAddr(orderAddr); + order.setStatus(mergerOrder.getStatus()); + order.setCreateTime(mergerOrder.getCreateTime()); + + // 处理一下预售 + order.setPreSaleType(shopCartItem.getPreSaleType()); + OrderPreSaleInfo orderPreSaleInfo = new OrderPreSaleInfo(); + orderPreSaleInfo.setPreSaleDeliveryTime(shopCartItem.getPreSaleDeliveryTime()); + orderPreSaleInfo.setPreSaleType(shopCartItem.getPreSaleType()); + orderPreSaleInfo.setPreSaleDeliveryType(shopCartItem.getPreSaleDeliveryType()); + order.setOrderPreSaleInfo(orderPreSaleInfo); + // 秒杀不能定金预售 +// OrderPreSaleInfo orderPresaleInfo = getOrderPresaleInfo(shopCartOrderDto.getOrderId(), userId, shopCartItem); + return order; + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderStatisticsServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderStatisticsServiceImpl.java new file mode 100644 index 0000000..f94f068 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderStatisticsServiceImpl.java @@ -0,0 +1,652 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.feign.SearchOrderRefundFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.constant.BuyerReasonType; +import com.tmerclub.cloud.api.order.dto.FormExcelDTO; +import com.tmerclub.cloud.api.order.vo.*; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticBO; +import com.tmerclub.cloud.api.user.bo.UserOrderStatisticListBO; +import com.tmerclub.cloud.api.user.dto.MemberReqDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderRefundSearchDTO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderRefundVO; +import com.tmerclub.cloud.common.order.vo.OrderActivityVO; +import com.tmerclub.cloud.common.order.vo.OrderCountVO; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.order.manager.MongoOrderManager; +import com.tmerclub.cloud.order.manager.MongoOrderRefundManager; +import com.tmerclub.cloud.order.mapper.OrderSettlementMapper; +import com.tmerclub.cloud.order.service.OrderStatisticsService; +import com.tmerclub.cloud.order.vo.OrderOverviewVO; +import com.tmerclub.cloud.order.vo.OrderRefundStatisticsVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author lth + */ +@Service +public class OrderStatisticsServiceImpl implements OrderStatisticsService { + + @Autowired + private MongoOrderRefundManager mongoOrderRefundManager; + + @Autowired + private MongoOrderManager mongoOrderManager; + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + @Autowired + private RedissonClient redissonClient; + + @Autowired + private OrderSettlementMapper orderSettlementMapper; + @DubboReference + private SearchOrderRefundFeignClient searchOrderRefundFeignClient; + + public static final Logger log = LoggerFactory.getLogger(OrderStatisticsServiceImpl.class); + + @Override + public OrderCountVO getOrderCountOfStatusByShopId(Long shopId) { + OrderCountVO orderCountVO = mongoOrderManager.getOrderCountOfStatusByShopId(shopId); + // 暂时改为es进行统计退款数量 + OrderRefundSearchDTO searchDTO = new OrderRefundSearchDTO(); + searchDTO.setShopId(shopId); + searchDTO.setReturnMoneyStsList(new ArrayList<>(Arrays.asList(1, 2, 3, 4))); + searchDTO.setSysType(AuthUserContext.get().getSysType()); + EsPageVO data = searchOrderRefundFeignClient.pageOrderRefund(searchDTO).getData(); + // 获取退款数量 + orderCountVO.setRefund(Integer.parseInt(String.valueOf(data.getTotal()))); + return orderCountVO; + } + + @Override + public List listOrderRefundInfoInDateRange(Long shopId, Date endTime, Integer dayCount) { + Date startTime = this.getStartTime(endTime, dayCount); + // 根据时间范围查询订单概况与退款数据 + List orderRefundStatisticsVOList = mongoOrderRefundManager.listOrderRefundInfoByShopIdAndDateRange(shopId, startTime, endTime, dayCount); + List orderOverviewVOList = mongoOrderManager.listOrderOverviewInfoByShopIdAndDateRange(shopId, startTime, endTime, dayCount); + Map orderRefundStatisticsMap = orderRefundStatisticsVOList.stream().collect(Collectors.toMap(OrderRefundStatisticsVO::getRefundDateToString, o -> o)); + Map orderOverviewMap = orderOverviewVOList.stream().collect(Collectors.toMap(OrderOverviewVO::getTimeData, o -> o)); + // 返回结果 + List refundStatisticsVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 处理数据 + for (int i = 0; i < dayCount; i++) { + OrderRefundStatisticsVO resItem = new OrderRefundStatisticsVO(); + // 日期key + String dateKey = DateUtils.dateToStrYmd(startTime); + OrderOverviewVO orderOverviewVO = orderOverviewMap.get(dateKey); + OrderRefundStatisticsVO refundStatisticsVO = orderRefundStatisticsMap.get(dateKey); + + if (Objects.nonNull(orderOverviewVO)) { + resItem.setTotalOrderCount(orderOverviewVO.getPayOrderCount()); + if (Objects.nonNull(refundStatisticsVO)) { + resItem.setRefundRate(this.getRatioRate(refundStatisticsVO.getRefundCount(), orderOverviewVO.getPayOrderCount())); + resItem.setPayActualTotal(refundStatisticsVO.getPayActualTotal()); + resItem.setRefundCount(refundStatisticsVO.getRefundCount()); + } else { + resItem.setRefundRate(0.0); + resItem.setPayActualTotal(0L); + resItem.setRefundCount(0); + } + } else { + resItem.setTotalOrderCount(0); + if (Objects.nonNull(refundStatisticsVO)) { + resItem.setRefundRate(100.00); + resItem.setPayActualTotal(refundStatisticsVO.getPayActualTotal()); + resItem.setRefundCount(refundStatisticsVO.getRefundCount()); + } else { + resItem.setRefundRate(0.0); + resItem.setPayActualTotal(0L); + resItem.setRefundCount(0); + } + } + resItem.setRefundDateToString(dateKey); + refundStatisticsVOList.add(resItem); + startTime = getNextTime(startTime); + } + return refundStatisticsVOList; + } + + @Override + public List listRefundRankingByProd(Long shopId, Date endTime, Integer dayCount) { + Date startTime = this.getStartTime(endTime, dayCount); + return mongoOrderRefundManager.listRefundRankingByProd(shopId, startTime, endTime); + } + + @Override + public OrderOverviewVO getToDayInfoByHour(Long shopId, Date startTime, Date endTime) { + OrderOverviewVO orderOverviewVO = this.getOrderStatisticsByShopIdAndDateRange(shopId, startTime, endTime); + List actualList = this.getActualByHour(shopId, startTime, endTime); + orderOverviewVO.setPayActualList(actualList); + return orderOverviewVO; + } + + @Override + public OrderOverviewVO getCurrentMonthByDay(Long shopId, Date startTime, Date endTime) { + OrderOverviewVO orderOverviewVO = this.getOrderStatisticsByShopIdAndDateRange(shopId, startTime, endTime); + this.getOrderInfoByDayCount(shopId, endTime, Calendar.getInstance().get(Calendar.DAY_OF_MONTH), orderOverviewVO); + return orderOverviewVO; + } + + @Override + public List listRefundRankingByReason(Long shopId, Date endTime, int dayCount) { + Date startTime = this.getStartTime(endTime, dayCount); + List ranking = mongoOrderRefundManager.listRefundRankingByReason(shopId, startTime, endTime); + Integer totalRefundCount = 0; + for (OrderRefundStatisticsVO orderRefundStatisticsVO : ranking) { + totalRefundCount += orderRefundStatisticsVO.getRefundCount(); + } + for (OrderRefundStatisticsVO orderRefundStatisticsVO : ranking) { + try { + BuyerReasonType reasonType = BuyerReasonType.instance(Integer.valueOf(orderRefundStatisticsVO.getBuyerReason())); + if (Objects.nonNull(reasonType)) { + orderRefundStatisticsVO.setBuyerReason(reasonType.getCn()); + } + } catch (NumberFormatException numberFormatException) { + log.error(numberFormatException.getMessage(), numberFormatException); + } + orderRefundStatisticsVO.setRefundRate(Arith.div(Arith.mul(orderRefundStatisticsVO.getRefundCount(), 100), totalRefundCount, 2)); + } + ranking.sort(Comparator.comparing(OrderRefundStatisticsVO::getRefundRate).reversed()); + return ranking; + } + + @Override + public OrderOverviewVO getDetailInfoByHour(Long shopId) { + Date now = new Date(); + // 获取今天的订单概况 + OrderOverviewVO toDayInfoByHour = this.getOrderStatisticsByShopIdAndDateRange(shopId, DateUtil.beginOfDay(now), DateUtil.endOfDay(now)); + // 获取昨天的订单概况 + OrderOverviewVO yesToDayInfoByHour = this.getOrderStatisticsByShopIdAndDateRange(shopId, DateUtil.beginOfDay(DateUtils.getBeforeDay(now, -1)), DateUtil.endOfDay(DateUtils.getBeforeDay(now, -1))); + // 获取今天的支付金额列表 + List toDayActualList = this.getActualByHour(shopId, DateUtil.beginOfDay(DateUtil.date()), DateUtil.endOfDay(DateUtil.date())); + // 获取昨天的支付金额列表 + List yesToDayActualList = this.getActualByHour(shopId, DateUtil.beginOfDay(DateUtils.getBeforeDay(now, -1)), DateUtil.endOfDay(DateUtils.getBeforeDay(now, -1))); + toDayInfoByHour.setPayActualList(toDayActualList); + toDayInfoByHour.setYesterdayPayActualList(yesToDayActualList); + // 计算今天与昨天数值变化的比率 + toDayInfoByHour.setYesterdayPayUserRate(this.getChangeRate(toDayInfoByHour.getPayUserCount(), yesToDayInfoByHour.getPayUserCount())); + toDayInfoByHour.setYesterdayPayOrderRate(this.getChangeRate(toDayInfoByHour.getPayOrderCount(), yesToDayInfoByHour.getPayOrderCount())); + toDayInfoByHour.setYesterdayRefundRate(this.getChangeRate(toDayInfoByHour.getRefund(), yesToDayInfoByHour.getRefund())); + toDayInfoByHour.setYesterdayOnePriceRate(this.getChangeRate(toDayInfoByHour.getOnePrice(), yesToDayInfoByHour.getOnePrice())); + toDayInfoByHour.setYesterdayPayActualRate(this.getChangeRate(toDayInfoByHour.getPayActual(), yesToDayInfoByHour.getPayActual())); + return toDayInfoByHour; + } + + @Override + public List listSpuRankingByOrderCount(Long shopId, Date endTime, int dayCount, int limit) { + Date startTime = this.getStartTime(endTime, dayCount); + return mongoOrderManager.listSpuRankingByOrderCount(shopId, startTime, endTime, limit); + } + + @Override + public List listShopRankingByPayActual(Date endTime, int dayCount, int limit) { + Date startTime = this.getStartTime(endTime, dayCount); + List orderOverviewVOList = mongoOrderManager.listShopRankingByPayActual(startTime, endTime, limit); + if (CollUtil.isEmpty(orderOverviewVOList)) { + // 数据为空,直接返回 + log.info("listShopRankingByPayActual 数据为空,直接返回"); + return orderOverviewVOList; + } + List shopIds = orderOverviewVOList.stream().map(OrderOverviewVO::getShopId).collect(Collectors.toList()); + ServerResponseEntity> listServerResponseEntity = shopDetailFeignClient.listByShopIds(shopIds); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + if (CollUtil.isEmpty(listServerResponseEntity.getData())) { + return new ArrayList<>(0); + } + // 赋值店铺名称 + Map shopDetailMap = listServerResponseEntity.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, p -> p)); + Iterator iterator = orderOverviewVOList.iterator(); + while (iterator.hasNext()) { + OrderOverviewVO orderOverviewVO = iterator.next(); + if (Objects.isNull(shopDetailMap.get(orderOverviewVO.getShopId()))) { + iterator.remove(); + continue; + } + orderOverviewVO.setShopName(shopDetailMap.get(orderOverviewVO.getShopId()).getShopName()); + } + return orderOverviewVOList; + } + + @Override + public List listShopRankingByRefundCount(Date endTime, Integer dayCount, Integer limit) { + Date startTime = this.getStartTime(endTime, dayCount); + List orderRefundStatisticsVOList = mongoOrderRefundManager.listShopRankingByRefundCount(startTime, endTime, limit); + if (CollUtil.isEmpty(orderRefundStatisticsVOList)) { + // 数据为空,直接返回 + log.info("listShopRankingByRefundCount 数据为空,直接返回"); + return orderRefundStatisticsVOList; + } + List shopIds = orderRefundStatisticsVOList.stream().map(OrderRefundStatisticsVO::getShopId).collect(Collectors.toList()); + ServerResponseEntity> listServerResponseEntity = shopDetailFeignClient.listByShopIds(shopIds); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + if (CollUtil.isEmpty(listServerResponseEntity.getData())) { + log.info("listShopRankingByRefundCount 店铺数据为空,直接返回"); + return new ArrayList<>(0); + } + // 赋值店铺名称 + Map shopDetailMap = listServerResponseEntity.getData().stream().collect(Collectors.toMap(ShopDetailVO::getShopId, p -> p)); + Iterator iterator = orderRefundStatisticsVOList.iterator(); + while (iterator.hasNext()) { + OrderRefundStatisticsVO orderRefundStatisticsVO = iterator.next(); + if (Objects.isNull(shopDetailMap.get(orderRefundStatisticsVO.getShopId()))) { + iterator.remove(); + continue; + } + orderRefundStatisticsVO.setShopName(shopDetailMap.get(orderRefundStatisticsVO.getShopId()).getShopName()); + } + return orderRefundStatisticsVOList; + } + + @Override + public OrderOverviewVO getOrderInfoByDayCountAndShopId(Long shopId, Integer dayCount) { + Date endTime = DateUtil.endOfDay(DateUtil.date()); + Date startTime = this.getStartTime(endTime, dayCount); + OrderOverviewVO orderOverviewVO = this.getOrderStatisticsByShopIdAndDateRange(shopId, startTime, endTime); + this.getOrderInfoByDayCount(shopId, endTime, dayCount, orderOverviewVO); + return orderOverviewVO; + } + + @Override + public List countOrderByUserIds(List userIds, Long shopId) { + // 统计用户的订单相关信息 + // es一个月内的,直接查数据库(一个月后的数据进行冷备),一个月之前的数据查es + // 所以需要将数据库中的订单信息和es中的订单加起来才行完整的订单信息 + + // 查询数据库中订单信息 + List orderStatisticList = mongoOrderManager.statisticalUserOrderData(userIds, shopId); + List orderRefundStatisticList = mongoOrderRefundManager.statisticalUserOrderData(userIds, shopId); + List totalOrderTimesList = mongoOrderManager.getShopOrderCountByUserIdAndShopId(userIds, shopId); + + if (CollUtil.isEmpty(orderStatisticList)) { + return orderStatisticList; + } + + Map map = orderRefundStatisticList.stream().collect(Collectors.toMap(UserOrderStatisticVO::getUserId, u -> u)); + Map orderStatisticMap = orderStatisticList.stream().collect(Collectors.toMap(UserOrderStatisticVO::getUserId, u -> u)); + for (UserOrderStatisticVO userOrderStatisticVO : totalOrderTimesList) { + if(!orderStatisticMap.containsKey(userOrderStatisticVO.getUserId())){ + userOrderStatisticVO.setConsTimes(0); + userOrderStatisticVO.setConsAmount(new BigDecimal(0)); + userOrderStatisticVO.setActualAmount(new BigDecimal(0)); + userOrderStatisticVO.setReduceAmount(new BigDecimal(0)); + userOrderStatisticVO.setReConsTime(null); + userOrderStatisticVO.setAverDiscount(new BigDecimal(0)); + }else{ + UserOrderStatisticVO userOrderStatistic = orderStatisticMap.get(userOrderStatisticVO.getUserId()); + userOrderStatisticVO.setConsTimes(userOrderStatistic.getConsTimes()); + userOrderStatisticVO.setConsAmount(userOrderStatistic.getConsAmount()); + userOrderStatisticVO.setActualAmount(userOrderStatistic.getActualAmount()); + userOrderStatisticVO.setReduceAmount(userOrderStatistic.getReduceAmount()); + userOrderStatisticVO.setReConsTime(userOrderStatistic.getReConsTime()); + userOrderStatisticVO.setAverDiscount(userOrderStatistic.getAverDiscount()); + + } + if (!map.containsKey(userOrderStatisticVO.getUserId())) { + userOrderStatisticVO.setAfterSaleAmount(new BigDecimal(0)); + userOrderStatisticVO.setAfterSaleTimes(0); + }else{ + UserOrderStatisticVO userOrderRefund = map.get(userOrderStatisticVO.getUserId()); + userOrderStatisticVO.setAfterSaleAmount(userOrderRefund.getAfterSaleAmount()); + userOrderStatisticVO.setAfterSaleTimes(userOrderRefund.getAfterSaleTimes()); + } + } + + return totalOrderTimesList; + } + + @Override + public UserOrderStatisticBO getPaidMemberByParam(MemberReqDTO param) { + return mongoOrderManager.getPaidMemberByParam(param); + } + + @Override + public UserOrderStatisticListBO getMemberPayData(MemberReqDTO param) { + return mongoOrderManager.getMemberPayData(param); + } + + @Override + public List getOrderUserIdsBySearchDTO(OrderSearchDTO orderSearchDTO) { + return mongoOrderManager.getOrderUserIdsBySearchDTO(orderSearchDTO); + } + + @Override + public List listUserIdByPurchaseNum(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minNum, Long maxNum) { + return mongoOrderManager.listUserIdByPurchaseNum(isPayed, deleteStatus, startDate, endDate, status, minNum, maxNum); + } + + @Override + public List listUserIdByAverageActualTotal(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minAmount, Long maxAmount) { + return mongoOrderManager.listUserIdByAverageActualTotal(isPayed, deleteStatus, startDate, endDate, status, minAmount, maxAmount); + } + + @Override + public List getProdEffectByDateAndProdIds(List spuIds, Date startTime, Date endTime) { + return mongoOrderManager.getProdEffectByDateAndProdIds(spuIds, startTime, endTime); + } + + @Override + public List listFlowOrderByOrderIds(Collection orderIds) { + return mongoOrderManager.listFlowOrderByOrderIds(orderIds); + } + + @Override + public List getInsightSpuIdsByDate(Integer begin, Integer size, Long shopId, Date startTime, Date endTime) { + return mongoOrderManager.getInsightSpuIdsByDate(begin, size, shopId, startTime, endTime); + } + + @Override + public List listSumDataByUserIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return new ArrayList<>(0); + } + return mongoOrderManager.listSumDataByUserIds(userIds); + } + + @Override + public Long hasBuySuccessProd(Long spuId, Long userId) { + return mongoOrderManager.hasBuySuccessProd(spuId, userId); + } + + @Override + public UserShoppingDataVO calculateUserInShopData(Long userId) { + return mongoOrderManager.calculateUserInShopData(userId); + } + + @Override + public List getActivitySalesQuantity(List activityIds, Integer activityType) { + return mongoOrderManager.getActivitySalesQuantity(activityIds, activityType); + } + + @Override + public Long countActivityOrderSale(Long skuId, Long activityId, Integer activityType) { + // 查询sku销量不需要缓存 + if (Objects.nonNull(skuId)) { + return mongoOrderManager.countActivityOrderSale(skuId, activityId, activityType); + } + // 查询活动的销量,实时性要求不高,可以通过缓存获取 + String key = "ACTIVETY_ORDER_SALE" + CacheNames.UNION_KEY + activityId + CacheNames.UNION_KEY + activityType; + return getActivityOrderSaleCache(key, activityId, activityType); + } + + @Override + public AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId) { + return mongoOrderManager.getAccountOrderDetail(startTime, endTime, shopName, shopId); + } + + @Override + public PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum) { + return mongoOrderManager.listShopAccountDetail(startTime, endTime, shopName, pageSize, pageNum); + } + + @Override + public PageShopAccountOrderVO listOrderPayInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum) { + if (Objects.isNull(pageNum) && Objects.isNull(pageSize)) { + return mongoOrderManager.listOrderPayInfo(startTime, endTime, shopName); + } + return mongoOrderManager.pageOrderPayInfo(startTime, endTime, shopId, pageSize, pageNum); + } + + @Override + @SuppressWarnings("unchecked") + public List addSoldNumRankCacheByShopIdAndTime(String key, Long shopId, Integer time, Integer expireTime, Integer esRenovationSpuSort, Long primaryCategoryId) { + List spuIds = RedisUtil.getListRange(key, 0L, 10L); + + if (CollectionUtil.isNotEmpty(spuIds)) { + return spuIds; + } + + // 加锁,防止缓存击穿 + RLock rLock = redissonClient.getLock("redisson_lock:sold_num_rank:" + key); + try { + int lockWait = 30; + if (rLock.tryLock(lockWait, lockWait, TimeUnit.SECONDS)) { + spuIds = RedisUtil.getListRange(key, 0L, 10L); + if (CollectionUtil.isEmpty(spuIds)) { + spuIds = mongoOrderManager.getSoldNumRankCacheByShopIdAndTime(shopId, time, esRenovationSpuSort, primaryCategoryId); + return spuIds; + } + } else { + throw new LuckException("网络繁忙,请稍后再试"); + } + } catch (InterruptedException e) { + log.error("InterruptedException:", e); + } finally { + try { + if (Objects.requireNonNull(rLock).isLocked()) { + rLock.unlock(); + } + } catch (Exception e) { + log.error("Exception:", e); + } + } + return spuIds; + } + + @Override + public GroupInfoVO getGroupInfo(Long groupActivityId) { + return mongoOrderManager.getGroupInfo(groupActivityId); + } + + @Override + public List listFormExcel(FormExcelParamVO formExcelParamVO) { + return mongoOrderManager.listFormExcel(formExcelParamVO); + } + + private Long getActivityOrderSaleCache(String key, Long activityId, Integer activityType) { + Long activityOrderSale = RedisUtil.getLongValue(key); + + if (Objects.nonNull(activityOrderSale)) { + return activityOrderSale; + } + + // 加锁,防止缓存击穿 + RLock rLock = redissonClient.getLock("redisson_lock:order_sale:" + activityType + CacheNames.UNION_KEY + activityId); + try { + int lockWait = 1; + if (rLock.tryLock(lockWait, lockWait, TimeUnit.SECONDS)) { + activityOrderSale = RedisUtil.getLongValue(key); + if (activityOrderSale == null) { + activityOrderSale = mongoOrderManager.countActivityOrderSale(null, activityId, activityType); + RedisUtil.setLongValue(Objects.requireNonNull(key), activityOrderSale, 1); + } + } else { + throw new LuckException("网络繁忙,请稍后再试"); + } + } catch (InterruptedException e) { + log.error("InterruptedException:", e); + } finally { + try { + if (Objects.requireNonNull(rLock).isLocked()) { + rLock.unlock(); + } + } catch (Exception e) { + Objects.requireNonNull(log).error("Exception:", e); + } + } + return activityOrderSale; + } + + + /** + * 根据店铺Id与时间范围获取订单概况信息 + * + * @param shopId + * @param startTime + * @param endTime + * @return + */ + private OrderOverviewVO getOrderStatisticsByShopIdAndDateRange(Long shopId, Date startTime, Date endTime) { + OrderOverviewVO orderOverviewVO = mongoOrderManager.getOrderOverviewInfoByShopId(shopId, startTime, endTime); + OrderRefundStatisticsVO orderRefundStatisticsVO = mongoOrderRefundManager.getOrderRefundInfoByShopId(shopId, startTime, endTime); + double onePrice = (orderOverviewVO.getPayUserCount() == 0) ? + 0 : (Arith.div(orderOverviewVO.getPayActual(), orderOverviewVO.getPayUserCount(), 2)); + orderOverviewVO.setOnePrice(onePrice); + orderOverviewVO.setRefund(orderRefundStatisticsVO.getPayActualTotal()); + orderOverviewVO.setChargebackCount(orderRefundStatisticsVO.getRefundCount()); + return orderOverviewVO; + } + + /** + * 根据店铺Id与时间范围按小时分段获取数据支付金额列表 + * + * @param shopId + * @param startTime + * @param endTime + */ + private List getActualByHour(Long shopId, Date startTime, Date endTime) { + List orderOverviewVOList = mongoOrderManager.listActualByHour(shopId, startTime, endTime); + Map payMap = new HashMap<>(orderOverviewVOList.size()); + // mongo格式化后的时间字符串存在时差,需转化为对应时区的时间 + int offset = TimeZone.getDefault().getRawOffset() / 3600000; + for (OrderOverviewVO temp : orderOverviewVOList) { + int hour = (Integer.parseInt(temp.getTimeData()) + offset) % 24; + payMap.put(hour, temp.getPayActual()); + } + List nowActual = new ArrayList<>(Constant.INITIAL_CAPACITY); + double sum = 0.00; + for (int i = 0; i < Constant.MAX_HOUR_NUM_BY_DAY; i++) { + if (payMap.get(i) != null) { + sum = Arith.add(sum, Arith.div(payMap.get(i), 100, 2)); + } + nowActual.add(Arith.round(sum, 2)); + } + return nowActual; + } + + /** + * 根据店铺Id与时间范围按天分段获取支付金额列表 + * + * @param shopId + * @param dayCount + * @param endTime + * @param orderOverviewVO + */ + private void getOrderInfoByDayCount(Long shopId, Date endTime, Integer dayCount, OrderOverviewVO orderOverviewVO) { + Date startTime = this.getStartTime(endTime, dayCount); + // 获取支付金额列表 + List orderOverviewVOList = mongoOrderManager.listOrderOverviewInfoByShopIdAndDateRange(shopId, startTime, endTime, dayCount); + Map orderOverviewMap = orderOverviewVOList.stream().collect(Collectors.toMap(OrderOverviewVO::getTimeData, o -> o)); + + List actualList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List dateToStringList = new ArrayList<>(Constant.INITIAL_CAPACITY); + + for (int i = 0; i < dayCount; i++) { + if (orderOverviewMap.containsKey(DateUtils.dateToStrYmd(startTime))) { + actualList.add(Arith.div(orderOverviewMap.get(DateUtils.dateToStrYmd(startTime)).getPayActual(), 100, 2)); + } else { + actualList.add(0.0); + } + dateToStringList.add(DateUtils.dateToStrYmd(startTime)); + startTime = getNextTime(startTime); + } + + orderOverviewVO.setDateToStringList(dateToStringList); + orderOverviewVO.setPayActualList(actualList); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(endTime); + // 获取本月的第几天 + int monthDay = calendar.get(Calendar.DAY_OF_MONTH); + + if (dayCount <= monthDay) { + orderOverviewVO.setCurrentMonthPayActual(orderOverviewVO.getPayActual()); + } else { + double currentMonthPayActual = 0L; + // 累加本月支付金额 + for (int i = actualList.size() - 1, j = 0; j < monthDay && i >= 0; j++, i--) { + currentMonthPayActual = Arith.add(currentMonthPayActual, actualList.get(i)); + } + orderOverviewVO.setCurrentMonthPayActual(currentMonthPayActual); + } + } + + /** + * 根据结束时间与天数获取起始时间 + * + * @param endTime + * @param dayCount + * @return + */ + private Date getStartTime(Date endTime, Integer dayCount) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(endTime); + calendar.add(Calendar.DATE, -dayCount + 1); + return DateUtil.beginOfDay(calendar.getTime()); + } + + private Double getChangeRate(double nowValue, double oldValue) { + if (Objects.equals(oldValue, 0.0)) { + return Objects.equals(nowValue, 0.0) ? 0.0 : 1.0; + } + double minus = Arith.sub(nowValue, oldValue); + return Arith.div(minus, oldValue, 4); + } + + /** + * 获取下一次循环的开始时间,以及设置后台显示的时间字符串 + * + * @param startTime 开始时间 + * @return + */ + private Date getNextTime(Date startTime) { + startTime = DateUtil.offsetDay(startTime, 1); + return startTime; + } + + /** + * 计算两个数的百分比 + * + * @param dividend 被除数 + * @param divisor 除数 + * @return + */ + private Double getRatioRate(Integer dividend, Integer divisor) { + if (Objects.isNull(dividend) || dividend == 0.0) { + return 0.0; + } + if (Objects.isNull(divisor) || divisor == 0.0) { + return 100.0; + } + return Arith.mul(Arith.div(dividend, divisor, 4), 100.00); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderVirtualInfoServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderVirtualInfoServiceImpl.java new file mode 100644 index 0000000..542bbcb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/OrderVirtualInfoServiceImpl.java @@ -0,0 +1,427 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.RefundStatusEnum; +import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO; +import com.tmerclub.cloud.common.order.vo.OrderVirtualInfoVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.constant.DistributedIdKey; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.delivery.service.StationService; +import com.tmerclub.cloud.order.bo.OrderVirtualInfoLogBO; +import com.tmerclub.cloud.order.bo.mongo.MongoOrderVirtualInfoLogBO; +import com.tmerclub.cloud.order.mapper.OrderMapper; +import com.tmerclub.cloud.order.mapper.OrderRefundMapper; +import com.tmerclub.cloud.order.mapper.OrderVirtualInfoMapper; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.model.OrderVirtualInfo; +import com.tmerclub.cloud.order.service.OrderVirtualInfoLogService; +import com.tmerclub.cloud.order.service.OrderVirtualInfoService; +import com.tmerclub.cloud.order.vo.OrderRefundVO; +import com.tmerclub.cloud.order.vo.OrderShopVO; +import com.tmerclub.cloud.order.vo.OrderVirtualInfoLogVO; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单虚拟商品信息 + * + * @author FrozenWatermelon + * @date 2023-02-24 13:55:55 + */ +@Service +public class OrderVirtualInfoServiceImpl implements OrderVirtualInfoService { + + @Autowired + private OrderVirtualInfoMapper orderVirtualInfoMapper; + @Autowired + private DeliveryManager deliveryManager; + @Autowired + private OrderMapper orderMapper; + @Autowired + private RocketMQTemplate orderReceiptTemplate; + @Autowired + private OrderRefundMapper orderRefundMapper; + @Autowired + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private StationService stationService; + @Autowired + private SegmentManager segmentManager; + @Autowired + private OrderVirtualInfoLogService orderVirtualInfoLogService; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> orderVirtualInfoMapper.list()); + } + + @Override + public OrderVirtualInfo getById(Long id) { + return orderVirtualInfoMapper.getById(id); + } + + @Override + public void save(OrderVirtualInfo orderVirtualInfo) { + orderVirtualInfoMapper.save(orderVirtualInfo); + } + + @Override + public void update(OrderVirtualInfoVO orderVirtualInfo) { + orderVirtualInfoMapper.update(orderVirtualInfo); + } + + @Override + public void deleteById(Long id) { + orderVirtualInfoMapper.deleteById(id); + } + + @Override + public void saveBatch(List orderVirtualInfoList) { + orderVirtualInfoMapper.saveBatch(orderVirtualInfoList); + } + + /** + * 添加下虚拟商品的信息 + * + * @param order 订单信息 + * @param orderShopVO 用于前端展示的订单信息 + * @param stationId 门店id + */ + @Override + public void handlerVirtualProdOrder(Order order, OrderShopVO orderShopVO, Long stationId) { + orderShopVO.setOrderMold(order.getOrderMold()); + orderShopVO.setWriteOffStart(order.getWriteOffStart()); + orderShopVO.setWriteOffEnd(order.getWriteOffEnd()); + orderShopVO.setWriteOffNum(order.getWriteOffNum()); + orderShopVO.setWriteOffMultipleCount(order.getWriteOffMultipleCount()); + if (Objects.equals(order.getOrderItems().get(0).getIsRefund(), 0)) { + orderShopVO.setCanAllRefund(false); + orderShopVO.setCanRefund(false); + } + + // 卡券信息 + List virtualInfoList = getByOrderIdAndStationId(order.getOrderId(), stationId); + boolean flag = Objects.equals(order.getStatus(), OrderStatus.WAIT_GROUP.value()) || Objects.equals(order.getStatus(), OrderStatus.UNPAY.value()); + if (CollectionUtil.isNotEmpty(virtualInfoList) && !flag) { + orderShopVO.setVirtualInfoList(virtualInfoList); + orderShopVO.setTotalNum(virtualInfoList.size()); + } + } + + @Override + public List getByOrderIdAndStationId(Long orderId, Long stationId) { + return orderVirtualInfoMapper.getByOrderIdAndStationId(orderId, stationId); + } + + @Override + public List getByOrderIdAndShopId(Long orderId, Long shopId, Integer isWriteOff) { + return orderVirtualInfoMapper.getByOrderIdAndShopId(orderId, shopId, isWriteOff); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void orderWriteOffByOrderId(OrderVirtualInfoDTO orderVirtualInfoDTO, Order order, Long stationId) { + List processOrderRefunds = orderRefundMapper.getProcessingRefundByOrderId(order.getOrderId()); + if (CollectionUtil.isNotEmpty(processOrderRefunds)) { + // 订单退款中,无法自提 + throw new LuckException(order.getOrderId() + "订单退款中,无法核销"); + } + Date date = new Date(); + List orderVirtualInfoList = checkInfoAndGetVirtualInfo(orderVirtualInfoDTO, order, stationId, date); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Order updateOrder = new Order(); + updateOrder.setOrderId(order.getOrderId()); + updateOrder.setUpdateTime(date); + // 如果是多次核销且无限次则无需进行核销 + boolean unWrite = Objects.equals(order.getWriteOffNum(), -1) && + (Objects.equals(order.getWriteOffMultipleCount(), -1) || Objects.isNull(order.getWriteOffMultipleCount())); + if (unWrite) { + // 多次核销且无限次的添加被核销次数 + updateOrder.setWriteOffCount((updateOrder.getWriteOffCount() == null ? 0 : updateOrder.getWriteOffCount()) + 1); + orderMapper.update(updateOrder); + // 添加日志 + handleSaveOrderVirtualInfoLog(orderVirtualInfoDTO, order, stationId, orderVirtualInfoList); + return; + } + // 是否全部核销完成 + boolean isAllWriteOff; + // 核销码存在时表示直接是核销码核销,否则直接是整单核销 + if (Objects.nonNull(orderVirtualInfoDTO) && StrUtil.isNotBlank(orderVirtualInfoDTO.getWriteOffCode())) { + isAllWriteOff = orderVirtualInfoList.size() < 2; + for (OrderVirtualInfoVO orderVirtualInfo : orderVirtualInfoList) { + if (StrUtil.equals(orderVirtualInfoDTO.getWriteOffCode(), orderVirtualInfo.getWriteOffCode())) { + orderVirtualInfo.setWriteOffTime(date); + orderVirtualInfo.setStationId(stationId); + // 多次核销次数还没到 + if (Objects.equals(order.getWriteOffNum(), -1) && 0 < orderVirtualInfo.getWriteOffMultipleCount() - 1) { + isAllWriteOff = false; + orderVirtualInfo.setWriteOffMultipleCount(orderVirtualInfo.getWriteOffMultipleCount() - 1); + updateList.add(orderVirtualInfo); + continue; + } + orderVirtualInfo.setIsWriteOff(1); + updateList.add(orderVirtualInfo); + break; + } + } + } else { + isAllWriteOff = true; + for (OrderVirtualInfoVO orderVirtualInfo : orderVirtualInfoList) { + orderVirtualInfo.setStationId(stationId); + orderVirtualInfo.setWriteOffTime(date); + // 多次核销次数还没到 + if (Objects.equals(order.getWriteOffNum(), -1) && 0 < orderVirtualInfo.getWriteOffMultipleCount() - 1) { + orderVirtualInfo.setWriteOffMultipleCount(orderVirtualInfo.getWriteOffMultipleCount() - 1); + isAllWriteOff = false; + updateList.add(orderVirtualInfo); + continue; + } + orderVirtualInfo.setIsWriteOff(1); + updateList.add(orderVirtualInfo); + } + } + updateList.forEach(this::update); + // 全部提货完成就直接确认收货 + if (isAllWriteOff) { + updateOrder.setWriteOffStatus(1); + if (Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value())) { + updateOrder.setStatus(OrderStatus.SUCCESS.value()); + updateOrder.setFinallyTime(new Date()); + // 开启事务消息,添加积分 + TransactionSendResult transactionSendResult = orderReceiptTemplate.sendMessageInTransaction(RocketMqConstant.ORDER_RECEIPT_TOPIC, new GenericMessage<>(updateOrder.getOrderId()), null); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + updateOrder.setWriteOffCount((updateOrder.getWriteOffCount() == null ? 0 : updateOrder.getWriteOffCount()) + 1); + orderMapper.update(updateOrder); + // 添加日志 + handleSaveOrderVirtualInfoLog(orderVirtualInfoDTO, order, stationId, orderVirtualInfoList); + } + + + private List checkInfoAndGetVirtualInfo(OrderVirtualInfoDTO orderVirtualInfoDTO, Order orderDb, Long stationId, Date date) { + if (Objects.nonNull(stationId)) { + StationVO station = deliveryManager.getStation(stationId); + if (Objects.isNull(station) || !Objects.equals(station.getStatus(), 1)) { + // 该自提点未在营业状态 + throw new LuckException("该自提点未在营业状态"); + } + } + boolean isRefund = Objects.equals(orderDb.getRefundStatus(), RefundStatusEnum.APPLY.value()) + || Objects.equals(orderDb.getRefundStatus(), RefundStatusEnum.SUCCEED.value()) + || Objects.equals(orderDb.getRefundStatus(), RefundStatusEnum.PARTIAL_SUCCESS.value()); + if (Objects.nonNull(orderDb.getRefundStatus()) && isRefund) { + // 订单退款中,无法核销 + throw new LuckException("订单" + orderDb.getOrderId() + "退款中,无法核销"); + } + if (Objects.equals(orderDb.getWriteOffNum(), 0)) { + // 订单无需核销 + throw new LuckException("订单无需核销"); + } + // 查询出未核销的卡券 + List orderVirtualInfoList = getByOrderIdAndShopId(orderDb.getOrderId(), orderDb.getShopId(), 0); + if (CollectionUtils.isEmpty(orderVirtualInfoList)) { + // 卡券不存在或者已核销 + throw new LuckException("卡券不存在或者已核销"); + } + if (DateUtil.compare(orderDb.getWriteOffStart(), date) > 0) { + // 卡券未到使用时间或已过期 + throw new LuckException("卡券未到使用时间或已过期"); + } + if (Objects.nonNull(orderDb.getWriteOffEnd()) && DateUtil.compare(date, orderDb.getWriteOffEnd()) > 0) { + // 卡券未到使用时间或已过期 + throw new LuckException("卡券未到使用时间或已过期"); + } + // 核销码是否存在 + if (Objects.nonNull(orderVirtualInfoDTO) && StrUtil.isNotBlank(orderVirtualInfoDTO.getWriteOffCode())) { + boolean isExist = false; + for (OrderVirtualInfoVO orderVirtualInfo : orderVirtualInfoList) { + if (StrUtil.equals(orderVirtualInfoDTO.getWriteOffCode(), orderVirtualInfo.getWriteOffCode())) { + isExist = true; + break; + } + } + if (!isExist) { + // 卡券不存在或者已核销 + throw new LuckException("核销码错误"); + } + } + return orderVirtualInfoList; + } + + private void handleSaveOrderVirtualInfoLog(OrderVirtualInfoDTO orderVirtualInfoDTO, Order order, Long stationId, List orderVirtualInfoList) { + Long shopId = order.getShopId(); + Long orderId = order.getOrderId(); + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.isNull(orderVirtualInfoDTO) || StrUtil.isBlank(orderVirtualInfoDTO.getWriteOffCode())) { + // 批量核销 + List idList = segmentManager.listSegmentId(DistributedIdKey.MALL4CLOUD_ORDER_VIRTUAL_INFO_LOG, orderVirtualInfoList.size()); + int i = 0; + for (OrderVirtualInfoVO orderVirtualInfoVO : orderVirtualInfoList) { + MongoOrderVirtualInfoLogBO mongoOrderVirtualInfoLogBO = new MongoOrderVirtualInfoLogBO(); + mongoOrderVirtualInfoLogBO.setOrderVirutalInfoLogId(idList.get(i)); + mongoOrderVirtualInfoLogBO.setCreateTime(LocalDateTime.now()); + mongoOrderVirtualInfoLogBO.setShopId(shopId); + mongoOrderVirtualInfoLogBO.setOrderId(orderId); + mongoOrderVirtualInfoLogBO.setStationId(stationId); + mongoOrderVirtualInfoLogBO.setWriteOffCode(orderVirtualInfoVO.getWriteOffCode()); + saveList.add(mongoOrderVirtualInfoLogBO); + i++; + } + } else { + MongoOrderVirtualInfoLogBO mongoOrderVirtualInfoLogBO = new MongoOrderVirtualInfoLogBO(); + mongoOrderVirtualInfoLogBO.setOrderVirutalInfoLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_ORDER_VIRTUAL_INFO_LOG)); + mongoOrderVirtualInfoLogBO.setCreateTime(LocalDateTime.now()); + mongoOrderVirtualInfoLogBO.setShopId(shopId); + mongoOrderVirtualInfoLogBO.setOrderId(orderId); + mongoOrderVirtualInfoLogBO.setStationId(stationId); + mongoOrderVirtualInfoLogBO.setWriteOffCode(orderVirtualInfoDTO.getWriteOffCode()); + saveList.add(mongoOrderVirtualInfoLogBO); + } + if (CollUtil.isNotEmpty(saveList)) { + orderVirtualInfoLogService.saveBatch(saveList); + } + } + + @Override + public List getByOrderIdAndCode(Long orderId, String code) { + return orderVirtualInfoMapper.getByOrderIdAndCode(orderId, code); + } + + @Override + public int countWriteOffByOrderId(Long orderId) { + return orderVirtualInfoMapper.countWriteOffByOrderId(orderId); + } + + @Override + public OrderVirtualInfoLogVO getByOrderId(Long orderId) { + OrderVirtualInfoLogVO res = new OrderVirtualInfoLogVO(); + res.setOrderId(orderId); + List mongoOrderVirtualInfoLogBOList = orderVirtualInfoLogService.getByOrderId(orderId); + if (CollUtil.isEmpty(mongoOrderVirtualInfoLogBOList)) { + return res; + } + List orderVirtualInfoList = orderVirtualInfoMapper.getByOrderId(orderId); + if (CollUtil.isEmpty(orderVirtualInfoList)) { + return res; + } + Map orderVirtualInfoMap = orderVirtualInfoList.stream().collect(Collectors.toMap(OrderVirtualInfoVO::getWriteOffCode, o -> o)); + Map shopMap = getShopMap(mongoOrderVirtualInfoLogBOList); + Map stationMap = getStationMap(mongoOrderVirtualInfoLogBOList); + for (OrderVirtualInfoLogBO mongoOrderVirtualInfoLogBO : mongoOrderVirtualInfoLogBOList) { + OrderVirtualInfoVO orderVirtualInfoVO = orderVirtualInfoMap.get(mongoOrderVirtualInfoLogBO.getWriteOffCode()); + if (Objects.nonNull(orderVirtualInfoVO)) { + mongoOrderVirtualInfoLogBO.setIsExpired(orderVirtualInfoVO.getIsExpired()); + mongoOrderVirtualInfoLogBO.setIsWriteOff(orderVirtualInfoVO.getIsWriteOff()); + } + if (Objects.nonNull(mongoOrderVirtualInfoLogBO.getStationId())) { + String stationName = stationMap.get(mongoOrderVirtualInfoLogBO.getStationId()); + mongoOrderVirtualInfoLogBO.setStationName(stationName); + continue; + } + String shopName = shopMap.get(mongoOrderVirtualInfoLogBO.getShopId()); + mongoOrderVirtualInfoLogBO.setStationName(shopName); + } + res.setOrderVirtualInfoList(mongoOrderVirtualInfoLogBOList); + return res; + } + + @Override + public List getByWriteOffCode(String writeOffCode) { + List mongoOrderVirtualInfoLogBOList = orderVirtualInfoLogService.getByWriteOffCode(writeOffCode); + if (CollUtil.isEmpty(mongoOrderVirtualInfoLogBOList)) { + return new ArrayList<>(); + } + Map shopMap = getShopMap(mongoOrderVirtualInfoLogBOList); + Map stationMap = getStationMap(mongoOrderVirtualInfoLogBOList); + for (OrderVirtualInfoLogBO mongoOrderVirtualInfoLogBO : mongoOrderVirtualInfoLogBOList) { + if (Objects.nonNull(mongoOrderVirtualInfoLogBO.getStationId())) { + String stationName = stationMap.get(mongoOrderVirtualInfoLogBO.getStationId()); + mongoOrderVirtualInfoLogBO.setStationName(stationName); + continue; + } + String shopName = shopMap.get(mongoOrderVirtualInfoLogBO.getShopId()); + mongoOrderVirtualInfoLogBO.setStationName(shopName); + } + return mongoOrderVirtualInfoLogBOList; + } + + @Override + public void updateBatchByItemIds(List updateVirtualInfos, Long userId, Date date) { + List itemIds = updateVirtualInfos.stream().map(OrderVirtualInfoVO::getOrderItemId).toList(); + Map orderItemMap = updateVirtualInfos.stream().collect(Collectors.toMap(OrderVirtualInfoVO::getOrderItemId, OrderVirtualInfoVO::getOrderId)); + List orderVirtualInfoList = orderVirtualInfoMapper.listByOrderItemIds(itemIds); + if(CollUtil.isEmpty(orderVirtualInfoList)){ + return; + } + List orderVirtualInfos = BeanUtil.mapAsList(orderVirtualInfoList, OrderVirtualInfo.class); + for (OrderVirtualInfo orderVirtualInfoDb : orderVirtualInfos) { + orderVirtualInfoDb.setOrderVirtualInfoId(segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER_VIRTUAL_INFO, userId)); + orderVirtualInfoDb.setCreateTime(date); + orderVirtualInfoDb.setOrderId(orderItemMap.get(orderVirtualInfoDb.getOrderItemId())); + } + // 删除旧的 + orderVirtualInfoMapper.deleteByOrderItemId(itemIds); + saveBatch(orderVirtualInfos); + } + + private Map getStationMap(List orderVirtualInfoLogBOList) { + List stationIds = orderVirtualInfoLogBOList.stream().map(OrderVirtualInfoLogBO::getStationId).filter(stationId -> Objects.nonNull(stationId)).collect(Collectors.toList()); + List stationList = stationService.listByStationId(stationIds); + Map stationMap = stationList.stream().collect(Collectors.toMap(StationVO::getStationId, StationVO::getStationName)); + return stationMap; + } + + private Map getShopMap(List orderVirtualInfoLogBOList) { + List shopIds = orderVirtualInfoLogBOList.stream().filter(o -> Objects.isNull(o.getStationId())).map(OrderVirtualInfoLogBO::getShopId).collect(Collectors.toList()); + Map shopMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(shopIds)) { + ServerResponseEntity> serverResponse = shopDetailFeignClient.listByShopIds(shopIds); + if (!serverResponse.isSuccess()) { + throw new LuckException(serverResponse.getMsg()); + } + List shopList = serverResponse.getData(); + shopMap = shopList.stream().collect(Collectors.toMap(ShopDetailVO::getShopId, ShopDetailVO::getShopName)); + } + return shopMap; + } + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderAddrServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderAddrServiceImpl.java new file mode 100644 index 0000000..e44b1aa --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderAddrServiceImpl.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.order.mapper.PurchaseOrderAddrMapper; +import com.tmerclub.cloud.order.model.PurchaseOrderAddr; +import com.tmerclub.cloud.order.service.PurchaseOrderAddrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 用户订单配送地址 + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +@Service +public class PurchaseOrderAddrServiceImpl implements PurchaseOrderAddrService { + + @Autowired + private PurchaseOrderAddrMapper purchaseOrderAddrMapper; + + @Override + public PurchaseOrderAddr getById(Long purchaseOrderAddrId) { + return purchaseOrderAddrMapper.getByPurchaseOrderAddrId(purchaseOrderAddrId); + } + + @Override + public void save(PurchaseOrderAddr purchaseOrderAddr) { + purchaseOrderAddrMapper.save(purchaseOrderAddr); + } + + @Override + public void update(PurchaseOrderAddr purchaseOrderAddr) { + purchaseOrderAddrMapper.update(purchaseOrderAddr); + } + + @Override + public void deleteById(Long purchaseOrderAddrId) { + purchaseOrderAddrMapper.deleteById(purchaseOrderAddrId); + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderExcelServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderExcelServiceImpl.java new file mode 100644 index 0000000..0535194 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderExcelServiceImpl.java @@ -0,0 +1,361 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO; +import com.tmerclub.cloud.api.delivery.vo.DeliveryCompanyExcelVO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.AnalysisUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.order.constant.OrderExportError; +import com.tmerclub.cloud.order.constant.PurchasesStatusEnum; +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import com.tmerclub.cloud.order.listener.PurchaseOrderInboundExcelListener; +import com.tmerclub.cloud.order.mapper.PurchaseOrderMapper; +import com.tmerclub.cloud.order.model.OrderAddr; +import com.tmerclub.cloud.order.service.OrderAddrService; +import com.tmerclub.cloud.order.service.PurchaseOrderExcelService; +import com.tmerclub.cloud.order.service.PurchaseOrderService; +import com.tmerclub.cloud.order.vo.*; +import com.tmerclub.cloud.order.vo.*; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 采购订单 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +@Service +public class PurchaseOrderExcelServiceImpl implements PurchaseOrderExcelService { + @Autowired + private PurchaseOrderMapper purchaseOrderMapper; + @Autowired + private OrderAddrService orderAddrService; + @Autowired + private PurchaseOrderService purchaseOrderService; + @Autowired + private DeliveryManager deliveryManager; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + /** + * 配送类型 + */ + public static final int DELIVERY_MODE_INDEX = 2; + + /** + * 快递公司名称 + */ + public static final int DELIVERY_COMPANY_NAME_INDEX = 3; + + private static final int FLOW_ID_MIN = 4; + private static final int FLOW_ID_MAX = 30; + + public static final String[] DELIVERY_MODE = {DeliveryType.DELIVERY.description(), DeliveryType.NOT_DELIVERY.description()}; + + private static final Logger log = LoggerFactory.getLogger(PurchaseOrderExcelServiceImpl.class); + + @Override + public List excelOrderList(PurchaseOrderDTO purchaseOrderDTO) { + ServerResponseEntity> shopResp = shopDetailFeignClient.getShopDetailByShopIdAndShopName(purchaseOrderDTO.getShopName()); + if (!shopResp.isSuccess()) { + throw new LuckException(shopResp.getMsg()); + } + List shopIds = shopResp.getData().stream().map(ShopDetailVO::getShopId).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(shopIds)) { + shopIds.add(-1L); + } + List purchaseOrderList = purchaseOrderMapper.listPurchaseOrderDetail(purchaseOrderDTO, null, shopIds); + int index = 0; + Long orderId = null; + for (PurchaseOrderExcelVO orderExcel : purchaseOrderList) { + if (!Objects.equals(Long.valueOf(orderExcel.getPurchaseOrderId()), orderId)) { + index++; + orderId = Long.valueOf(orderExcel.getPurchaseOrderId()); + } + orderExcel.setSeq(String.valueOf(index)); + // 订单信息 + Integer deliveryType = Integer.valueOf(orderExcel.getDeliveryType()); + orderExcel.setDeliveryType(DeliveryType.getDescription(deliveryType)); + orderExcel.setTotalAmount(AnalysisUtil.conversionPrices(orderExcel.getTotalAmount())); + String payType = Constant.OFFLINE_PAID; + orderExcel.setPayType(payType); + //收货手机号 + orderExcel.setMobile(PhoneUtil.hideBetween(orderExcel.getMobile()).toString()); + orderExcel.setStatus(PurchasesStatusEnum.getStatusName(Integer.valueOf(orderExcel.getStatus()))); + // 订单项信息 + orderExcel.setPurchasePrice(AnalysisUtil.conversionPrices(orderExcel.getPurchasePrice())); + orderExcel.setPurchaseAmount(AnalysisUtil.conversionPrices(orderExcel.getPurchaseAmount())); + // 国际化信息 + Map spuNameMap = orderExcel.getOrderItemLangList().stream().collect(Collectors.toMap(PurchaseOrderItemLangVO::getLang, o -> o)); + PurchaseOrderItemLangVO orderItemLangVO = spuNameMap.get(I18nMessage.getLang()); + if (Objects.isNull(orderItemLangVO)) { + orderItemLangVO = spuNameMap.get(Constant.DEFAULT_LANG); + } + if (Objects.nonNull(orderItemLangVO)) { + orderExcel.setSkuName(orderItemLangVO.getSkuName()); + orderExcel.setSpuName(orderItemLangVO.getSpuName()); + } + } + return purchaseOrderList; + } + + @Override + public void excelUnDeliveryOrderList(HttpServletResponse response, PurchaseOrderDTO purchaseOrderDTO) { + ServerResponseEntity> shopResp = shopDetailFeignClient.getShopDetailByShopIdAndShopName(purchaseOrderDTO.getShopName()); + if (!shopResp.isSuccess()) { + throw new LuckException(shopResp.getMsg()); + } + List shopIds = shopResp.getData().stream().map(ShopDetailVO::getShopId).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(shopIds)) { + shopIds.add(-1L); + } + purchaseOrderDTO.setStatus(PurchasesStatusEnum.WAIT_STOCK.value()); + List purchaseOrderList = purchaseOrderMapper.listUnDeliveryPurchaseOrder(purchaseOrderDTO, null, shopIds); + Map map = new HashMap<>(8); + map.put(DELIVERY_MODE_INDEX, DELIVERY_MODE); + int index = 0; + //合并单元格 + Long orderId = null; + for (UnDeliveryPurchaseOrderExcelVO orderExcel : purchaseOrderList) { + if (!Objects.equals(Long.valueOf(orderExcel.getPurchaseOrderId()), orderId)) { + index++; + orderId = Long.valueOf(orderExcel.getPurchaseOrderId()); + } + orderExcel.setSeq(String.valueOf(index)); + //物流信息 + orderExcel.setDeliveryType(DeliveryType.getDescription(Integer.valueOf(orderExcel.getDeliveryType()))); + //快递公司名称 + map.put(DELIVERY_COMPANY_NAME_INDEX, getDeliveryCompanyName()); + + } + writeExcel(response, purchaseOrderList, map); + } + + @Override + public void exportOrderExcel(List list, Map> errorMap) { + List companyExcelList = deliveryManager.listDeliveryCompany(); + Map companyNameMap = companyExcelList.stream().collect(Collectors.toMap(DeliveryCompanyExcelVO::getName, DeliveryCompanyExcelVO::getDeliveryCompanyId)); + Map> orderMap = list.stream().collect(Collectors.groupingBy(UnDeliveryPurchaseOrderExcelVO::getSeq)); + for (String seq : orderMap.keySet()) { + List orderExcels = orderMap.get(seq); + DeliveryOrderDTO deliveryOrder = new DeliveryOrderDTO(); + try { + loadOrderData(orderExcels, deliveryOrder, companyNameMap, errorMap); + } catch (Exception e) { + addOrderExcelError(errorMap, OrderExportError.OTHER, e.getMessage()); + continue; + } + if (Objects.nonNull(deliveryOrder.getSelectOrderItems())) { + //订单发货 + purchaseOrderService.delivery(deliveryOrder); + } + } + } + + @Override + public String orderExportError(Map> errorMap) { + StringBuilder info = new StringBuilder(Constant.INITIAL_CAPACITY); + for (Integer key : errorMap.keySet()) { + List list = errorMap.get(key); + OrderExportError orderExportError = OrderExportError.instance(key); + if (Objects.equals(orderExportError, OrderExportError.OTHER)) { + info.append(list.toString()).append("\n"); + continue; + } + info.append(Objects.requireNonNull(orderExportError).errorInfo()).append(list.toString()).append("\n"); + } + return info.toString(); + } + + @Override + public List inboundParseFile(MultipartFile excelFile, Long shopId, Long purchaseOrderId) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map> errorMap = new HashMap<>(16); + PurchaseOrderInboundExcelListener purchaseExcelListener = new PurchaseOrderInboundExcelListener(errorMap, list); + // 获取数据库的采购订单信息,并转换成map + PurchaseOrderVO purchaseOrderVO = purchaseOrderService.info(purchaseOrderId, null); + List purchaseOrderItemList = purchaseOrderVO.getPurchaseOrderItemList(); + Map purchaseOrderItemMap = purchaseOrderItemList.stream() + .filter(purchaseProd -> !Objects.equals(purchaseOrderVO.getStatus(), 0)) + .collect(Collectors.toMap(PurchaseOrderItemVO::getPartyCode, p -> p)); + try { + EasyExcel.read(excelFile.getInputStream(), PurchaseOrderInboundExcelVO.class, purchaseExcelListener).sheet().doRead(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + if (CollectionUtil.isEmpty(list)) { + throw new LuckException("导入数据为空,请检查下文件"); + } + for (PurchaseOrderInboundExcelVO purchaseOrderInboundExcelVO : list) { + String partyCode = purchaseOrderInboundExcelVO.getPartyCode(); + if (StrUtil.isBlank(partyCode)) { + throw new LuckException("商品编码不能为空"); + } + if (!purchaseOrderItemMap.containsKey(partyCode)) { + throw new LuckException("商品编码填写错误"); + } + PurchaseOrderItemVO purchaseOrderItemVO = purchaseOrderItemMap.get(partyCode); + purchaseOrderItemVO.setChangeStock(purchaseOrderInboundExcelVO.getBeDeliveredNum()); + } + return purchaseOrderItemList; + } + + private void loadOrderData(List orderExcels, DeliveryOrderDTO deliveryOrder, Map companyNameMap, Map> errorMap) { + UnDeliveryPurchaseOrderExcelVO orderExcel = orderExcels.get(0); + //订单id不能为空且该订单必须为当前店铺的订单,并为待发货状态 + if (Objects.isNull(orderExcel.getPurchaseOrderId())) { + addOrderExcelError(errorMap, OrderExportError.ORDER_ID, orderExcel.getSeq()); + return; + } + PurchaseOrderVO purchaseOrderVO = purchaseOrderService.info(Long.valueOf(orderExcel.getPurchaseOrderId()), null); + if (Objects.isNull(purchaseOrderVO) || !Objects.equals(purchaseOrderVO.getStatus(), PurchasesStatusEnum.WAIT_STOCK.value())) { + addOrderExcelError(errorMap, OrderExportError.ORDER_ID, orderExcel.getSeq()); + return; + } + List purchaseOrderItemList = purchaseOrderVO.getPurchaseOrderItemList(); + for (PurchaseOrderItemVO orderItemVO : purchaseOrderItemList) { + if (Objects.equals(orderItemVO.getBeDeliveredNum(), 0) || !Objects.equals(orderItemVO.getBeDeliveredNum(), orderItemVO.getPurchaseStock())) { + // 如果该订单已经被部分发货或全部发货则不予发货 + addOrderExcelError(errorMap, OrderExportError.BE_DELIVERY, orderExcel.getSeq()); + return; + } + } + deliveryOrder.setOrderId(Long.valueOf(orderExcel.getPurchaseOrderId())); + //配送方式不为空 + if (Objects.isNull(orderExcel.getDeliveryType())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_TYPE, orderExcel.getSeq()); + return; + } + if (Objects.equals(orderExcel.getDeliveryType(), DeliveryType.DELIVERY.description())) { + deliveryOrder.setDeliveryType(DeliveryType.DELIVERY.value()); + } else if (Objects.equals(orderExcel.getDeliveryType(), DeliveryType.NOT_DELIVERY.description())) { + deliveryOrder.setDeliveryType(DeliveryType.NOT_DELIVERY.value()); + } + //订单的配送方式为快递配送时,导入的配送方式可选择快递配送和无需快递,其他情况订单的配送方式与导入的配送方式需保持一致 + if (!Objects.equals(deliveryOrder.getDeliveryType(), purchaseOrderVO.getDeliveryType()) && !Objects.equals(purchaseOrderVO.getDeliveryType(), DeliveryType.DELIVERY.value())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_TYPE, orderExcel.getSeq()); + return; + } else if (!Objects.equals(deliveryOrder.getDeliveryType(), purchaseOrderVO.getDeliveryType()) && Objects.equals(purchaseOrderVO.getDeliveryType(), DeliveryType.DELIVERY.value())) { + if (!Objects.equals(deliveryOrder.getDeliveryType(), DeliveryType.NOT_DELIVERY.value())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_TYPE, orderExcel.getSeq()); + return; + } + } + //只有快递才需要快递校验 + if (Objects.equals(orderExcel.getDeliveryType(), DeliveryType.DELIVERY.description())) { + //快递公司校验 + if (Objects.isNull(orderExcel.getDeliveryCompanyName())) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_COMPANY_NAME, orderExcel.getSeq()); + return; + } + deliveryOrder.setDeliveryCompanyId(companyNameMap.get(orderExcel.getDeliveryCompanyName())); + //快递单号校验 + String deliveryNo = orderExcel.getDeliveryNo(); + deliveryNo = StringUtils.deleteWhitespace(deliveryNo); + boolean isTrue = StrUtil.isBlank(deliveryNo) || + (deliveryNo.length() > FLOW_ID_MAX || deliveryNo.length() < FLOW_ID_MIN) + || !PrincipalUtil.isMatching(PrincipalUtil.WITHOUT_CHINESE, deliveryNo); + if (isTrue) { + addOrderExcelError(errorMap, OrderExportError.DELIVERY_NO, orderExcel.getSeq()); + return; + } + deliveryOrder.setDeliveryNo(deliveryNo); + } + List orderItemFeignVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (PurchaseOrderItemVO orderItemVO : purchaseOrderItemList) { + DeliveryOrderItemDTO deliveryOrderItemFeignVO = new DeliveryOrderItemDTO(); + deliveryOrderItemFeignVO.setOrderItemId(orderItemVO.getPurchaseItemId()); + deliveryOrderItemFeignVO.setChangeNum(orderItemVO.getBeDeliveredNum()); + deliveryOrderItemFeignVO.setPic(orderItemVO.getPic()); + deliveryOrderItemFeignVO.setSpuName(orderItemVO.getSpuName()); + orderItemFeignVOList.add(deliveryOrderItemFeignVO); + } + deliveryOrder.setSelectOrderItems(orderItemFeignVOList); + // 用户收货地址 + OrderAddr orderAddr = orderAddrService.getById(purchaseOrderVO.getPurchaseOrderAddrId()); + if (Objects.nonNull(orderAddr)) { + deliveryOrder.setConsignee(orderAddr.getConsignee()); + deliveryOrder.setMobile(orderAddr.getMobile()); + } + } + + private void addOrderExcelError(Map> errorMap, OrderExportError orderExportError, String error) { + List list = errorMap.get(orderExportError.value()); + if (CollUtil.isEmpty(list)) { + list = new ArrayList<>(0); + errorMap.put(orderExportError.value(), list); + } + list.add(error); + } + + private String[] getDeliveryCompanyName() { + //快递公司名称 + List companyExcelList = deliveryManager.listDeliveryCompany(); + if (CollUtil.isNotEmpty(companyExcelList)) { + String[] companyNames = new String[companyExcelList.size()]; + for (int i = 0; i < companyExcelList.size(); i++) { + DeliveryCompanyExcelVO companyExcel = companyExcelList.get(i); + companyNames[i] = companyExcel.getName(); + } + return companyNames; + } + return null; + } + + private void writeExcel(HttpServletResponse response, List list, Map map) { + ExcelWriter excelWriter = null; + try { + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, UnDeliveryPurchaseOrderExcelVO.EXCEL_NAME, UnDeliveryPurchaseOrderExcelVO.MERGE_ROW_INDEX, + UnDeliveryPurchaseOrderExcelVO.MERGE_COLUMN_INDEX); + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, Constant.START_ROW).build(); + //订单信息 + //写入 + WriteSheet writeSheet = EasyExcel.writerSheet(UnDeliveryPurchaseOrderExcelVO.EXCEL_NAME).head(UnDeliveryPurchaseOrderExcelVO.class).build(); + excelWriter.write(list, writeSheet); + } catch (Exception e) { + log.error("导出excel失败", e); + } finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderItemLangServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderItemLangServiceImpl.java new file mode 100644 index 0000000..a944dc0 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderItemLangServiceImpl.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.order.mapper.PurchaseOrderItemLangMapper; +import com.tmerclub.cloud.order.model.PurchaseOrderItem; +import com.tmerclub.cloud.order.model.PurchaseOrderItemLang; +import com.tmerclub.cloud.order.service.PurchaseOrderItemLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 订单项-国际化 + * + * @author lhd + * @date 2022-06-27 17:49:07 + */ +@Service +public class PurchaseOrderItemLangServiceImpl implements PurchaseOrderItemLangService { + + @Autowired + private PurchaseOrderItemLangMapper purchaseOrderItemLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> purchaseOrderItemLangMapper.list()); + } + + @Override + public PurchaseOrderItemLang getByPurchaseItemId(Long purchaseItemId) { + return purchaseOrderItemLangMapper.getByPurchaseItemId(purchaseItemId); + } + + @Override + public void save(PurchaseOrderItemLang purchaseOrderItemLang) { + purchaseOrderItemLangMapper.save(purchaseOrderItemLang); + } + + @Override + public void update(PurchaseOrderItemLang purchaseOrderItemLang) { + purchaseOrderItemLangMapper.update(purchaseOrderItemLang); + } + + @Override + public void deleteById(Long purchaseItemId) { + purchaseOrderItemLangMapper.deleteById(purchaseItemId); + } + + @Override + public void saveOrderItemLang(List purchaseOrderItems) { + List orderItemLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (PurchaseOrderItem orderItem : purchaseOrderItems) { + for (PurchaseOrderItemLang orderItemLang : orderItem.getPurchaseOrderItemLangList()) { + // sharing 需要单独字段做主键,暂只保存中文数据,避免插入key重复 + if (Objects.equals(orderItemLang.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + orderItemLang.setPurchaseItemId(orderItem.getPurchaseItemId()); + orderItemLangList.add(orderItemLang); + } + } + } + purchaseOrderItemLangMapper.saveBatch(orderItemLangList); + } + + +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderServiceImpl.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderServiceImpl.java new file mode 100644 index 0000000..86768fd --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/service/impl/PurchaseOrderServiceImpl.java @@ -0,0 +1,1226 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderDTO; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.api.dto.PurchaseOrderUpdateDTO; +import com.tmerclub.cloud.api.feign.SearchPurchaseOrderFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.bo.EsPurchaseOrderBO; +import com.tmerclub.cloud.api.product.dto.SkuStockLockDTO; +import com.tmerclub.cloud.api.product.dto.WarehouseSearchDTO; +import com.tmerclub.cloud.api.product.feign.*; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.product.constant.StockPointType; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.constant.PurchaseAmountType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.order.bo.PurchaseAmountLogBO; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.product.constant.StockBillStatus; +import com.tmerclub.cloud.common.product.constant.StockBillType; +import com.tmerclub.cloud.common.product.constant.StockType; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.LangUtil; +import com.tmerclub.cloud.delivery.manager.DeliveryManager; +import com.tmerclub.cloud.delivery.service.StationService; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.order.bo.mongo.MongoPurchaseOrderBO; +import com.tmerclub.cloud.order.bo.mongo.MongoPurchaseOrderItemBO; +import com.tmerclub.cloud.order.constant.PurchasesStatusEnum; +import com.tmerclub.cloud.order.dto.PurchaseOrderDTO; +import com.tmerclub.cloud.order.dto.PurchaseOrderItemDTO; +import com.tmerclub.cloud.order.listener.PurchaseExcelListener; +import com.tmerclub.cloud.order.manager.MongoPurchaseOrderManager; +import com.tmerclub.cloud.order.mapper.PurchaseOrderItemMapper; +import com.tmerclub.cloud.order.mapper.PurchaseOrderMapper; +import com.tmerclub.cloud.order.model.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.model.*; +import com.tmerclub.cloud.order.service.*; +import com.tmerclub.cloud.order.vo.PurchaseOrderItemVO; +import com.tmerclub.cloud.order.vo.PurchaseOrderVO; +import com.tmerclub.cloud.order.vo.PurchaseSpuExcelVO; +import com.tmerclub.cloud.order.vo.PurchaseSpuImportVO; +import io.seata.spring.annotation.GlobalTransactional; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.LocalTransactionState; +import org.apache.rocketmq.client.producer.TransactionSendResult; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 采购订单 + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +@Service +public class PurchaseOrderServiceImpl implements PurchaseOrderService { + + private static final Logger log = LoggerFactory.getLogger(PurchaseOrderServiceImpl.class); + + @Autowired + private PurchaseOrderMapper purchaseOrderMapper; + @Autowired + private DeliveryManager deliveryManager; + @Autowired + private PurchaseOrderItemMapper purchaseOrderItemMapper; + @Autowired + private PurchaseOrderLangService purchaseOrderLangService; + @Autowired + private PurchaseOrderItemService purchaseOrderItemService; + @Autowired + private MongoPurchaseOrderManager mongoPurchaseOrderManager; + @Autowired + private PurchaseOrderAddrService purchaseOrderAddrService; + @Autowired + private PurchaseOrderItemLangService purchaseOrderItemLangService; + @Autowired + private StationService stationService; + @Autowired + private RocketMQTemplate stockBillLogPurchaseStorageTemplate; + @Autowired + private RocketMQTemplate addPurchaseAmountLogTemplate; + @DubboReference + private WarehouseFeignClient warehouseFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SkuStockChangeFeignClient skuStockChangeFeignClient; + @DubboReference + private SearchPurchaseOrderFeignClient searchPurchaseOrderFeignClient; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private CategoryShopFeignClient categoryShopFeignClient; + @DubboReference + private StockPointFeignClient stockPointFeignClient; + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void savePurchaseOrder(PurchaseOrderDTO purchaseOrderDTO) { + long begintTimeMillis = System.currentTimeMillis(); + // 获取商家仓库 + WarehouseVO warehouse = this.checkWarehouse(purchaseOrderDTO.getWarehouseId(), purchaseOrderDTO.getShopId(), SysTypeEnum.MULTISHOP.value()); + purchaseOrderDTO.setStockPointType(Objects.equals(warehouse.getSysType(), SysTypeEnum.STATION.value()) ? StockPointType.STATION.getValue() : StockPointType.WAREHOUSE.getValue()); + // 获取供应商仓库 + WarehouseSearchDTO warehouseDTO = new WarehouseSearchDTO(); + warehouseDTO.setAreaId(warehouse.getAreaId()); + warehouseDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + warehouseDTO.setShopIds(Collections.singletonList(purchaseOrderDTO.getSupplierId())); + List warehouses = warehouseFeignClient.listCanDeliveryWarehouse(warehouseDTO); + if (CollectionUtils.isEmpty(warehouses)) { + throw new LuckException("含有当前仓库不能采购的商品"); + } + log.info("savePurchaseOrder-warehouseFeignClient, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + WarehouseVO supplierWarehouse = warehouses.get(0); + // 检查商品是否为该供应商仓库商品 + List skuIds = purchaseOrderDTO.getPurchaseOrderItemList().stream().map(PurchaseOrderItemDTO::getSkuId).collect(Collectors.toList()); + List containSkuIds = skuStockFeignClient.checkStockPointContainSku(Collections.singletonList(supplierWarehouse.getWarehouseId()), skuIds); + log.info("savePurchaseOrder-skuStockFeignClient, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + if (!Objects.equals(skuIds.size(), containSkuIds.size())) { + throw new LuckException("含有该仓库/门店不能采购的商品"); + } + // 检查sku库存是否充足,并锁定库存-- 生成采购订单再进行库存的扣除 + List skuStockLockList = this.checkStock(purchaseOrderDTO, supplierWarehouse.getWarehouseId()); + ServerResponseEntity shopDetailResp = shopDetailFeignClient.getShopDetailByShopId(purchaseOrderDTO.getShopId()); + log.info("savePurchaseOrder-shopDetailResp, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + if (!shopDetailResp.isSuccess()) { + throw new LuckException(shopDetailResp.getMsg()); + } + List skuList = getSkuVOList(purchaseOrderDTO); + Map spuAndSkuMap = getSpuAndSkuMap(purchaseOrderDTO, skuList); + double totalAmount = 0.0D; + int totalStock = 0; + List purchaseOrderItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 订单商品中文名称 + StringBuilder orderSpuNameCn = new StringBuilder(100); + // 订单商品英文名称 + StringBuilder orderSpuNameEn = new StringBuilder(100); + // 商品排序,同spu放相邻位置 + List purchaseOrderItemDTOS = this.sortPurchaseItem(purchaseOrderDTO.getPurchaseOrderItemList()); + for (PurchaseOrderItemDTO purchaseOrderItemDTO : purchaseOrderItemDTOS) { + purchaseOrderItemDTO.setInboundStock(purchaseOrderItemDTO.getPurchaseStock()); + PurchaseOrderItem purchaseOrderItem = BeanUtil.map(purchaseOrderItemDTO, PurchaseOrderItem.class); + SpuAndSkuVO spuAndSkuVO = spuAndSkuMap.get(purchaseOrderItem.getSkuId()); + SpuVO spu = spuAndSkuVO.getSpu(); + SkuVO sku = spuAndSkuVO.getSku(); + setPurchaseInfo(purchaseOrderDTO, orderSpuNameCn, orderSpuNameEn, purchaseOrderItem, spu, sku); + purchaseOrderItemList.add(purchaseOrderItem); + totalAmount = Arith.add(totalAmount, purchaseOrderItem.getPurchaseAmount()); + totalStock += purchaseOrderItem.getPurchaseStock(); + } + + // 1.保存订单地址 + if (Objects.isNull(shopDetailResp.getData())) { + // 请填写收货地址 + throw new LuckException("请先去填写店铺收货地址"); + } + PurchaseOrderAddr purchaseOrderAddr = getAndSavePurchaseOrderAddr(purchaseOrderDTO, warehouse); + + // 2.保存订单信息 + Date date = new Date(); + purchaseOrderDTO.setCreateTime(date); + purchaseOrderDTO.setUpdateTime(date); + purchaseOrderDTO.setSupplierWarehouseId(supplierWarehouse.getWarehouseId()); + purchaseOrderDTO.setTotalAmount(totalAmount); + purchaseOrderDTO.setTotalStock(totalStock); + purchaseOrderDTO.setActualTotalStock(0); + purchaseOrderDTO.setStatus(PurchasesStatusEnum.UNPAY.value()); + + PurchaseOrder purchaseOrder = BeanUtil.map(purchaseOrderDTO, PurchaseOrder.class); + // 1.设置配送方式 + purchaseOrder.setDeliveryType(DeliveryType.DELIVERY.value()); + purchaseOrder.setPurchaseOrderAddrId(purchaseOrderAddr.getPurchaseOrderAddrId()); + purchaseOrderMapper.save(purchaseOrder); + log.info("savePurchaseOrder-purchaseOrderMapper, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + // 2.处理下订单商品语言 + orderSpuNameCn = new StringBuilder(orderSpuNameCn.subSequence(0, Math.min(orderSpuNameCn.length() - 1, 100))); + if (orderSpuNameCn.lastIndexOf(StrUtil.COMMA) == orderSpuNameCn.length() - 1) { + orderSpuNameCn.deleteCharAt(orderSpuNameCn.length() - 1); + } + if (StrUtil.isNotBlank(orderSpuNameEn)) { + orderSpuNameEn = new StringBuilder(orderSpuNameEn.subSequence(0, Math.min(orderSpuNameEn.length() - 1, 100))); + if (orderSpuNameEn.lastIndexOf(StrUtil.COMMA) == orderSpuNameEn.length() - 1) { + orderSpuNameEn.deleteCharAt(orderSpuNameEn.length() - 1); + } + } + purchaseOrderLangService.saveBatch(orderSpuNameCn, orderSpuNameEn, purchaseOrder.getPurchaseOrderId()); + log.info("savePurchaseOrder-purchaseOrderLangService, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + + purchaseOrderItemMapper.saveBatch(purchaseOrderItemList); + log.info("savePurchaseOrder-purchaseOrderItemMapper, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + + // 3.保存订单商品名称 + purchaseOrderItemLangService.saveOrderItemLang(purchaseOrderItemList); + log.info("savePurchaseOrder-purchaseOrderItemLangService, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + + // 4.采购的商品未导入时自动导入供应商商品 + voluntarilyImportSupplierSpu(purchaseOrderDTO); + // 库存解锁 + skuStockChangeFeignClient.purchaseOrderReduceLockStock(skuStockLockList); + log.info("savePurchaseOrder-skuStockChangeFeignClient, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + // 更新仓库和商品关系 + stockPointFeignClient.updateStockPointSkuRelate(Collections.singletonList(supplierWarehouse.getWarehouseId()), skuIds); + log.info("savePurchaseOrder-stockPointFeignClient, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + // 供应商新增采购出库记录 + purchaseOrderDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + StockBillLogVO stockBillLog = this.buildStockBillLog(purchaseOrderDTO, supplierWarehouse.getWarehouseId(), StockBillType.PURCHASE_OUTBOUND); + TransactionSendResult transactionSendResult = stockBillLogPurchaseStorageTemplate.sendMessageInTransaction(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC, new GenericMessage<>(stockBillLog), stockBillLog); + log.info("savePurchaseOrder-transactionSendResult, 执行时间:{}", System.currentTimeMillis() - begintTimeMillis); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public PurchaseOrderVO info(Long purchaseOrderId, Long supplierId) { + PurchaseOrderVO purchaseOrder = purchaseOrderMapper.info(purchaseOrderId, supplierId, I18nMessage.getLang()); + if (Objects.isNull(purchaseOrder)) { + throw new LuckException("采购订单不存在"); + } + // 补充店铺信息 + ServerResponseEntity shopResp = shopDetailFeignClient.getShopDetailByShopId(purchaseOrder.getShopId()); + if (!shopResp.isSuccess()) { + throw new LuckException(shopResp.getMsg()); + } + purchaseOrder.setShopName(shopResp.getData().getMerchantName()); + // 补充供应商信息 + ServerResponseEntity supplierResp = supplierDetailFeignClient.getSupplierBySupplierId(purchaseOrder.getSupplierId()); + if (!supplierResp.isSuccess()) { + throw new LuckException(supplierResp.getMsg()); + } + purchaseOrder.setSupplierName(supplierResp.getData().getSupplierName()); + // 补充仓库信息 + if (!Objects.isNull(purchaseOrder.getWarehouseId())) { + WarehouseVO warehouse = warehouseFeignClient.getWarehouseById(purchaseOrder.getWarehouseId()); + if (!Objects.isNull(warehouse)) { + purchaseOrder.setWarehouseName(warehouse.getWarehouseName()); + } + } + // 订单商品多语言处理 + orderLangHandle(purchaseOrder); + return purchaseOrder; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void delivery(DeliveryOrderDTO deliveryOrderParam) { + PurchaseOrderVO purchaseOrderVO = purchaseOrderMapper.info(deliveryOrderParam.getOrderId(), AuthUserContext.get().getTenantId(), I18nMessage.getLang()); + deliveryOrderParam.setUserId(purchaseOrderVO.getShopId()); + deliveryOrderParam.setOrderAddrId(purchaseOrderVO.getPurchaseOrderAddrId()); + purchaseOrderItemService.updateByDeliveries(deliveryOrderParam.getSelectOrderItems(), deliveryOrderParam.getDeliveryType()); + // 算下未发货商品数量 + int unDeliveryNum = purchaseOrderItemService.countUnDeliveryNumByOrderId(deliveryOrderParam.getOrderId()); + //修改为发货状态 + if (Objects.equals(unDeliveryNum, 0)) { + Date date = new Date(); + PurchaseOrder order = new PurchaseOrder(); + order.setPurchaseOrderId(deliveryOrderParam.getOrderId()); + order.setStatus(PurchasesStatusEnum.DELIVERY.value()); + order.setUpdateTime(date); + order.setDeliveryTime(date); + //判断是无需物流还是快递发货,如果是无需快递,则判断该订单是否包含有物流的项,若有物流则配送类型为快递配送,没有物流则不变 + if (purchaseOrderItemService.getDevTypeByOrderId(deliveryOrderParam.getOrderId())) { + order.setDeliveryType(DeliveryType.DELIVERY.value()); + } else { + order.setDeliveryType(deliveryOrderParam.getDeliveryType()); + } + purchaseOrderMapper.updateByPurchaseId(order); + purchaseOrderItemService.updateStatusByPurchaseOrderId(PurchasesStatusEnum.DELIVERY.value(), order.getPurchaseOrderId()); + updatePurchaseOrderStatus(order); + } + // 先更改订单状态,再保存包裹信息 + deliveryManager.saveDeliveryInfo(deliveryOrderParam, 1, 0); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updatePayVoucher(PurchaseOrderDTO purchaseOrder) { + PurchaseOrder purchaseOrderDb = purchaseOrderMapper.getByPurchaseOrderId(purchaseOrder.getPurchaseOrderId()); + if (!Objects.equals(purchaseOrderDb.getShopId(), purchaseOrder.getShopId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!Objects.equals(purchaseOrderDb.getStatus(), PurchasesStatusEnum.UNPAY.value())) { + throw new LuckException("此订单状态已改变,不能进行此操作"); + } + purchaseOrderDb.setVoucherImgUrls(purchaseOrder.getVoucherImgUrls()); + purchaseOrderDb.setStatus(PurchasesStatusEnum.WAITAUDIT.value()); + purchaseOrderMapper.updateByPurchaseId(purchaseOrderDb); + purchaseOrderItemService.updateStatusByPurchaseOrderId(purchaseOrderDb.getStatus(), purchaseOrderDb.getPurchaseOrderId()); + updatePurchaseOrderStatus(purchaseOrderDb); + // 新增采购金额日志 + this.addPurchaseAmountLog(purchaseOrderDb, PurchaseAmountType.IN_OR_OUT.getValue()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void auditVoucher(PurchaseOrderDTO purchaseOrder) { + PurchaseOrder purchaseOrderDb = purchaseOrderMapper.getByPurchaseOrderId(purchaseOrder.getPurchaseOrderId()); + if (!Objects.equals(purchaseOrder.getSupplierId(), purchaseOrderDb.getSupplierId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!Objects.equals(purchaseOrderDb.getStatus(), PurchasesStatusEnum.WAITAUDIT.value())) { + throw new LuckException("此订单状态已改变,不能进行此操作"); + } + // 1-审核通过 + if (Objects.equals(purchaseOrder.getStatus(), 1)) { + purchaseOrderDb.setStatus(PurchasesStatusEnum.WAIT_STOCK.value()); + // 0-审核不通过 + } else if (Objects.equals(purchaseOrder.getStatus(), 0)) { + purchaseOrderDb.setStatus(PurchasesStatusEnum.VOIDED.value()); + // 审核不通过,采购订单作废 + this.reductionStock(purchaseOrderMapper.info(purchaseOrderDb.getPurchaseOrderId(), purchaseOrderDb.getSupplierId(), I18nMessage.getLang())); + // 新增采购金额作废日志 + this.addPurchaseAmountLog(purchaseOrderDb, PurchaseAmountType.CANCEL.getValue()); + } else { + return; + } + purchaseOrderMapper.updateByPurchaseId(purchaseOrderDb); + purchaseOrderItemService.updateStatusByPurchaseOrderId(purchaseOrderDb.getStatus(), purchaseOrderDb.getPurchaseOrderId()); + updatePurchaseOrderStatus(purchaseOrderDb); + } + + /** + * 更新供应商订单时,手动更新状态 + * 更新状态失败后续还有canal监听进行更新,优先原本功能的执行,所以不能抛出异常 + * + * @param order + */ + private void updatePurchaseOrderStatus(PurchaseOrder order) { + try { + searchPurchaseOrderFeignClient.updatePurchaseOrderStatus(new PurchaseOrderUpdateDTO(order.getPurchaseOrderId(), order.getStatus())); + } catch (Exception e) { + log.error("供应商订单更新状态失败", e); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void inbound(PurchaseOrderDTO purchaseOrderDTO) { + if (CollectionUtils.isEmpty(purchaseOrderDTO.getPurchaseOrderItemList())) { + throw new LuckException("入库商品为空"); + } + // 过滤出入库数量不为0的数据,并转成Map + Map itemMap = purchaseOrderDTO.getPurchaseOrderItemList().stream() + .filter(x -> x.getActualStock() > 0) + .collect(Collectors.toMap(PurchaseOrderItemDTO::getSkuId, x -> x)); + if (CollectionUtils.isEmpty(itemMap)) { + throw new LuckException("入库商品为空"); + } + // 检查采购订单 + PurchaseOrderVO purchaseOrderDb = this.checkPurchaseOrder(purchaseOrderDTO.getPurchaseOrderId(), purchaseOrderDTO.getShopId()); + if (Objects.equals(purchaseOrderDb.getStatus(), PurchasesStatusEnum.UNPAY.value())) { + throw new LuckException("采购订单未付款"); + } + if (Objects.equals(purchaseOrderDb.getStatus(), PurchasesStatusEnum.WAIT_STOCK.value())) { + throw new LuckException("采购订单未发货"); + } + // 更新采购商品入库数量以及状态 + List updateItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer actualTotalStock = 0; + boolean complete = true; + PurchaseOrderItemDTO purchaseOrderItemDTO; + for (PurchaseOrderItemVO dbItem : purchaseOrderDb.getPurchaseOrderItemList()) { + purchaseOrderItemDTO = itemMap.get(dbItem.getSkuId()); + if (!Objects.isNull(purchaseOrderItemDTO)) { + if (purchaseOrderItemDTO.getActualStock() > dbItem.getPurchaseStock() - dbItem.getActualStock()) { + throw new LuckException("商品入库数量不可以大于采购数量"); + } + dbItem.setActualStock(dbItem.getActualStock() + purchaseOrderItemDTO.getActualStock()); + dbItem.setStatus(Objects.equals(dbItem.getPurchaseStock(), dbItem.getActualStock()) ? PurchasesStatusEnum.COMPLETION.value() : PurchasesStatusEnum.PARTIALLY_STOCK.value()); + updateItems.add(dbItem); + } + complete = complete && Objects.equals(dbItem.getPurchaseStock(), dbItem.getActualStock()); + actualTotalStock += dbItem.getActualStock(); + } + // 更新采购订单商品 + List purchaseOrderItems = BeanUtil.mapAsList(updateItems, PurchaseOrderItem.class); + purchaseOrderItemService.updateBatchById(purchaseOrderItems); + // 更新采购订单 + PurchaseOrder purchaseOrder = BeanUtil.map(purchaseOrderDb, PurchaseOrder.class); + purchaseOrder.setDeliverTime(new Date()); + purchaseOrder.setRemark(purchaseOrderDTO.getRemark()); + purchaseOrder.setActualTotalStock(actualTotalStock); + purchaseOrder.setStatus(complete ? PurchasesStatusEnum.COMPLETION.value() : PurchasesStatusEnum.PARTIALLY_STOCK.value()); + purchaseOrderMapper.updateByPurchaseId(purchaseOrder); + // 新增库存(商家自己的代销商品库存) + List saleItems = this.buildSalePurchaseOrderItem(purchaseOrderDTO.getShopId(), updateItems); + List skuStockVOList = new ArrayList<>(saleItems.size()); + for (PurchaseOrderItemDTO saleItem : saleItems) { + PurchaseOrderItemDTO itemDTO = itemMap.get(saleItem.getSupplierSkuId()); + saleItem.setInboundStock(itemDTO.getActualStock()); + skuStockVOList.add(this.buildSkuStockVO(saleItem, purchaseOrderDb.getWarehouseId(), LuaOperateEnum.SKU_ADD)); + } + skuStockFeignClient.changeSkuStock(skuStockVOList); + // 新增库存流水日志 + purchaseOrderDTO = new PurchaseOrderDTO(); + BeanUtils.copyProperties(purchaseOrder, purchaseOrderDTO); + purchaseOrderDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + purchaseOrderDTO.setPurchaseOrderItemList(saleItems); + StockBillLogVO stockBillLog = this.buildStockBillLog(purchaseOrderDTO, purchaseOrderDTO.getWarehouseId(), StockBillType.PURCHASE_STORAGE); + TransactionSendResult transactionSendResult = stockBillLogPurchaseStorageTemplate.sendMessageInTransaction(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC, new GenericMessage<>(stockBillLog), stockBillLog); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + // 更新商家代销商品信息(触发canal,从而更新es数据) + List supplierSpuIds = purchaseOrderDb.getPurchaseOrderItemList().stream().map(PurchaseOrderItemVO::getSpuId).collect(Collectors.toList()); + List spuList = spuFeignClient.listShopSpuBySupplierSpuIds(purchaseOrderDTO.getShopId(), supplierSpuIds); + if (CollUtil.isNotEmpty(spuList)) { + spuFeignClient.updateSpuUpdateTimeBySpuIds(spuList.stream().map(SpuVO::getSpuId).collect(Collectors.toList())); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void nullify(Long shopId, Long purchaseOrderId) { + PurchaseOrderVO purchaseOrderVO = purchaseOrderMapper.info(purchaseOrderId, null, I18nMessage.getLang()); + if (!Objects.equals(purchaseOrderVO.getShopId(), shopId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + Integer status = purchaseOrderVO.getStatus(); + if (Objects.equals(purchaseOrderVO.getStatus(), PurchasesStatusEnum.VOIDED.value())) { + throw new LuckException("此订单已作废"); + } + purchaseOrderVO.setStatus(PurchasesStatusEnum.VOIDED.value()); + PurchaseOrder purchaseOrder = BeanUtil.map(purchaseOrderVO, PurchaseOrder.class); + purchaseOrderMapper.updateByPurchaseId(purchaseOrder); + purchaseOrderItemMapper.updateStatusByPurchaseOrderId(Collections.singletonList(purchaseOrder.getPurchaseOrderId()), PurchasesStatusEnum.VOIDED.value()); + this.updatePurchaseOrderStatus(purchaseOrder); + boolean isPay = !Objects.equals(PurchasesStatusEnum.UNPAY.value(), status); + if (isPay) { + // 新增采购金额作废日志(待付款不用新增) + this.addPurchaseAmountLog(purchaseOrder, PurchaseAmountType.CANCEL.getValue()); + } + // 发货后的订单,不需要还原供应商库存 + if (!PurchasesStatusEnum.unDelivery(status)) { + return; + } + // 未发货之前作废订单,需要还原供应商库存 + // 增加供应商的库存数量, 订单只能作废一次,如果报错直接回滚,等待下次操作 + this.reductionStock(purchaseOrderVO); + } + + @Override + public void nullifyByWarehouseId(Long warehouseId) { + // 查询未完成/作废的采购订单 + PurchaseOrderDTO purchaseOrderDTO = new PurchaseOrderDTO(); + purchaseOrderDTO.setWarehouseId(warehouseId); + purchaseOrderDTO.setNotInStatuses(Arrays.asList(PurchasesStatusEnum.COMPLETION.value(), PurchasesStatusEnum.VOIDED.value())); + List purchaseOrderBOS = mongoPurchaseOrderManager.listPurchaseOrder(purchaseOrderDTO); + if (CollectionUtils.isEmpty(purchaseOrderBOS)) { + return; + } + // 循环作废 + for (MongoPurchaseOrderBO purchaseOrderBO : purchaseOrderBOS) { + PurchaseOrderVO purchaseOrderVO = purchaseOrderMapper.info(purchaseOrderBO.getPurchaseOrderId(), null, I18nMessage.getLang()); + Integer status = purchaseOrderVO.getStatus(); + purchaseOrderVO.setStatus(PurchasesStatusEnum.VOIDED.value()); + PurchaseOrder purchaseOrder = BeanUtil.map(purchaseOrderVO, PurchaseOrder.class); + purchaseOrderMapper.updateByPurchaseId(purchaseOrder); + purchaseOrderItemMapper.updateStatusByPurchaseOrderId(Collections.singletonList(purchaseOrder.getPurchaseOrderId()), PurchasesStatusEnum.VOIDED.value()); + this.updatePurchaseOrderStatus(purchaseOrder); + // 新增采购金额作废日志(待付款不用新增) + boolean isPay = !Objects.equals(PurchasesStatusEnum.UNPAY.value(), status); + if (isPay) { + this.addPurchaseAmountLog(purchaseOrder, PurchaseAmountType.CANCEL.getValue()); + } + // 发货后的订单,不需要还原供应商库存 + if (!PurchasesStatusEnum.unDelivery(status)) { + continue; + } + // 未发货之前作废订单,需要还原供应商库存 + this.reductionStock(purchaseOrderVO); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void complete(Long shopId, Long purchaseOrderId) { + PurchaseOrderVO purchaseOrderVO = purchaseOrderMapper.info(purchaseOrderId, null, I18nMessage.getLang()); + if (!Objects.equals(purchaseOrderVO.getShopId(), shopId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!Objects.equals(purchaseOrderVO.getStatus(), PurchasesStatusEnum.PARTIALLY_STOCK.value())) { + throw new LuckException("数据已过期,请刷新页面"); + } + purchaseOrderVO.setStatus(PurchasesStatusEnum.COMPLETION.value()); + PurchaseOrder purchaseOrder = BeanUtil.map(purchaseOrderVO, PurchaseOrder.class); + purchaseOrderMapper.updateByPurchaseId(purchaseOrder); + purchaseOrderItemMapper.updateStatusByPurchaseOrderId(Collections.singletonList(purchaseOrder.getPurchaseOrderId()), PurchasesStatusEnum.COMPLETION.value()); + updatePurchaseOrderStatus(purchaseOrder); + // 不是全部商品都入库,则新增采购金额作废日志 + if (!Objects.equals(purchaseOrder.getTotalStock(), purchaseOrder.getActualTotalStock())) { + this.addPurchaseAmountLog(purchaseOrder, PurchaseAmountType.CANCEL.getValue()); + } + } + + @Override + public void downloadModel(HttpServletResponse response) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + list.add(new PurchaseSpuExcelVO()); + Map map = new HashMap<>(8); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, PurchaseSpuExcelVO.EXCEL_NAME, PurchaseSpuExcelVO.MERGE_ROW_INDEX, PurchaseSpuExcelVO.MERGE_COLUMN_INDEX); + // useDefaultStyle false 不需要默认的头部加粗/自动换行样式 + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, 1).useDefaultStyle(false).build(); + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(PurchaseSpuExcelVO.SHEET_NAME).head(PurchaseSpuExcelVO.class).build(); + excelWriter.write(list, sheetWriter); + } + } catch (Exception e) { + log.error("导出用户信息模板excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + @Override + public PurchaseSpuImportVO parseFile(MultipartFile file, Long shopId, Long warehouseId) { + // 读取excel文件 + Map> errorMap = new HashMap<>(16); + List purchaseSpuExcelVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + PurchaseExcelListener purchaseExcelListener = new PurchaseExcelListener(errorMap, purchaseSpuExcelVOList); + try { + EasyExcel.read(file.getInputStream(), PurchaseSpuExcelVO.class, purchaseExcelListener).sheet().doRead(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + if (CollectionUtil.isEmpty(purchaseSpuExcelVOList)) { + throw new LuckException("导入数据为空,请检查下文件"); + } + // 检查仓库 + WarehouseVO warehouse = this.checkWarehouse(warehouseId, shopId, SysTypeEnum.MULTISHOP.value()); + // 获取可采购的供应商集合 + List categoryIds = categoryShopFeignClient.getCategoryIdsByShopId(shopId, SysTypeEnum.MULTISHOP.value()).getData(); + List supplierIds = categoryShopFeignClient.getSupplyIdByCategoryIds(categoryIds).getData(); + if (CollectionUtils.isEmpty(supplierIds)) { + throw new LuckException("无可采购的供应商"); + } + // 查询供应商可配送的仓库 + WarehouseSearchDTO warehouseDTO = new WarehouseSearchDTO(); + warehouseDTO.setShopIds(supplierIds); + warehouseDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + warehouseDTO.setAreaId(warehouse.getAreaId()); + List canDeliveryWarehouses = warehouseFeignClient.listCanDeliveryWarehouse(warehouseDTO); + Map warehouseMap = canDeliveryWarehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getShopId)); + // 查询商品,并转成Map + Map partyCodeMap = purchaseSpuExcelVOList.stream() + .collect(Collectors.toMap(PurchaseSpuExcelVO::getPartyCode, PurchaseSpuExcelVO::getPurchaseStock)); + List skuVOList = skuFeignClient.listByPartyCodes(new ArrayList<>(partyCodeMap.keySet())); + if (CollectionUtils.isEmpty(skuVOList)) { + throw new LuckException("导入商品不存在"); + } + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + List skuIds = new ArrayList<>(skuVOList.size()); + Map skuVOMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuVOList) { + spuIds.add(skuVO.getSpuId()); + skuIds.add(skuVO.getSkuId()); + skuVOMap.put(skuVO.getSkuId(), skuVO); + } + List spuVOList = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)).getData(); + Map spuVOMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, x -> x)); + // 过滤出可以采购的商品 + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + stockPointSkuDTO.setSkuIds(skuIds); + stockPointSkuDTO.setStockPointIds(new ArrayList<>(warehouseMap.keySet())); + List stockPointSkuVOList = stockPointFeignClient.listStockPointSku(stockPointSkuDTO); + if (CollectionUtils.isEmpty(stockPointSkuVOList)) { + throw new LuckException("无可采购商品"); + } + // 查询代销商品信息(用于查询商家库存) + List saleSkus = skuFeignClient.listShopSaleSku(skuIds, shopId); + Map saleSkuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(saleSkus)) { + saleSkuMap = saleSkus.stream().collect(Collectors.toMap(SkuVO::getSupplierSkuId, SkuVO::getSkuId)); + } + // 查询商品库存 + List skuStockVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long skuId : skuIds) { + for (Long supplierWarehouseId : warehouseMap.keySet()) { + skuStockVOList.add(new SkuStockVO(skuId, supplierWarehouseId)); + } + } + for (Long shopSkuId : saleSkuMap.values()) { + skuStockVOList.add(new SkuStockVO(shopSkuId, warehouseId)); + } + Map stockMap = skuStockFeignClient.listSkuStock(skuStockVOList); + // 查询供应商信息 + List suppliers = supplierDetailFeignClient.listBySupplierIds(new ArrayList<>(warehouseMap.values())).getData(); + Map supplierMap = suppliers.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, x -> x)); + Map warehouseSupplierMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (Map.Entry entry :warehouseMap.entrySet()) { + warehouseSupplierMap.put(entry.getKey(), supplierMap.get(entry.getValue())); + } + // 构建采购商品excel导入类 + List purchaseSpuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (StockPointSkuVO stockPointSkuVO : stockPointSkuVOList) { + purchaseSpuList.add(this.buildPurchaseImportExcel( + skuVOMap.get(stockPointSkuVO.getSkuId()), partyCodeMap, spuVOMap, + saleSkuMap, stockMap, warehouseSupplierMap, warehouseId, stockPointSkuVO.getStockPointId() + )); + } + // 返回数据 + PurchaseSpuImportVO purchaseSpuImportVO = new PurchaseSpuImportVO(); + purchaseSpuImportVO.setPurchaseSpuList(purchaseSpuList); + purchaseSpuImportVO.setTips(String.format("检查到%d条商品信息,成功导入%d条商品信息!错误%d条商品信息!", purchaseSpuExcelVOList.size(), purchaseSpuList.size(), purchaseSpuExcelVOList.size() - purchaseSpuList.size())); + return purchaseSpuImportVO; + } + + @Override + public EsPurchaseOrderBO saveMongoAndGetEsInfo(Long purchaseOrderId) { + MongoPurchaseOrderBO pruchaseOrder = purchaseOrderMapper.getMongoPruchaseOrderInfo(purchaseOrderId); + loadMongoPurchaseOrderBo(pruchaseOrder); + mongoPurchaseOrderManager.save(pruchaseOrder); + return BeanUtil.map(pruchaseOrder, EsPurchaseOrderBO.class); + } + + private void loadMongoPurchaseOrderBo(MongoPurchaseOrderBO purchaseOrderBO) { + purchaseOrderBO.setUpdateTime(new Date()); + for (MongoPurchaseOrderItemBO purchaseOrderItem : purchaseOrderBO.getPurchaseOrderItems()) { + for (PurchaseOrderItemLang purchaseOrderItemLang : purchaseOrderItem.getPurchaseOrderItemLangs()) { + if (Objects.equals(purchaseOrderItemLang.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + purchaseOrderItem.setSpuNameZh(purchaseOrderItemLang.getSpuName()); + purchaseOrderItem.setSkuNameZh(purchaseOrderItemLang.getSkuName()); + } else if (Objects.equals(purchaseOrderItemLang.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + purchaseOrderItem.setSpuNameEn(purchaseOrderItemLang.getSpuName()); + purchaseOrderItem.setSkuNameEn(purchaseOrderItemLang.getSkuName()); + } + } + purchaseOrderItem.setPurchaseOrderItemLangs(null); + } + for (PurchaseOrderLang purchaseOrderLang : purchaseOrderBO.getPurchaseOrderLangs()) { + if (Objects.equals(purchaseOrderLang.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + purchaseOrderBO.setSpuNameZh(purchaseOrderLang.getSpuName()); + } else if (Objects.equals(purchaseOrderLang.getLang(), LanguageEnum.LANGUAGE_EN.getLang())) { + purchaseOrderBO.setSpuNameEn(purchaseOrderLang.getSpuName()); + } + } + purchaseOrderBO.setPurchaseOrderLangs(null); + ServerResponseEntity shopDetailResponseEntity = shopDetailFeignClient.getShopDetailByShopId(purchaseOrderBO.getShopId()); + if (!shopDetailResponseEntity.isSuccess()) { + throw new LuckException(shopDetailResponseEntity.getMsg()); + } + purchaseOrderBO.setShopName(shopDetailResponseEntity.getData().getShopName()); + + ServerResponseEntity supplierResponseEntity = supplierDetailFeignClient.getSupplierBySupplierId(purchaseOrderBO.getSupplierId()); + if (!supplierResponseEntity.isSuccess()) { + throw new LuckException(supplierResponseEntity.getMsg()); + } + purchaseOrderBO.setSupplierName(supplierResponseEntity.getData().getSupplierName()); + } + + /** + * 检查采购商品库存 + * + * @param purchaseOrderDTO + */ + private List checkStock(PurchaseOrderDTO purchaseOrderDTO, Long warehouseId) { + List skuStockLocks = new ArrayList<>(purchaseOrderDTO.getPurchaseOrderItemList().size()); + List purchaseOrderItemList = purchaseOrderDTO.getPurchaseOrderItemList(); + for (PurchaseOrderItemDTO purchaseOrderItemDTO : purchaseOrderItemList) { + skuStockLocks.add(new SkuStockLockDTO( + purchaseOrderDTO.getPurchaseOrderId(), + warehouseId, + purchaseOrderItemDTO.getSkuId(), + purchaseOrderItemDTO.getPurchaseStock()) + ); + } + String stockInfo = skuStockChangeFeignClient.lockPurchaseOrder(skuStockLocks); + // 提示具体哪个商品sku库存不足, 如果stockInfo是 null 代表代码出问题了,请检查传参是否正确 + if (!stockInfo.contains(Constant.UNDERLINE)) { + long skuId = Long.parseLong(stockInfo); + SkuVO skuVO = skuFeignClient.getSkuAndNameById(skuId); + throw new LuckException(String.format("sku:【%s】 的库存不足", skuVO.getSkuName())); + } + return skuStockLocks; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updatePurchaseOrderStatus(List purchaseOrderIds, Integer purchaseOrderStatus) { + List purchaseOrderVOList = purchaseOrderMapper.listByPurchaseOrderIds(purchaseOrderIds); + List purchaseOrderIdList = purchaseOrderVOList.stream().map(PurchaseOrderVO::getPurchaseOrderId).collect(Collectors.toList()); + purchaseOrderVOList.forEach(purchaseOrderVO -> { + purchaseOrderVO.setStatus(purchaseOrderStatus); + PurchaseOrder purchaseOrder = BeanUtil.map(purchaseOrderVO, PurchaseOrder.class); + purchaseOrderMapper.updateByPurchaseId(purchaseOrder); + // 还原库存 - 待付款作废订单 + this.reductionStock(purchaseOrderVO); + updatePurchaseOrderStatus(purchaseOrder); + }); + purchaseOrderItemMapper.updateStatusByPurchaseOrderId(purchaseOrderIdList, PurchasesStatusEnum.VOIDED.value()); + + } + + @Override + public Long countUnFinish(Long warehouseId) { + if (Objects.isNull(warehouseId)) { + return 0L; + } + return mongoPurchaseOrderManager.countUnFinishPurchase(warehouseId); + } + + /** + * 订单语言信息处理 + * + * @param purchaseOrder 订单 + */ + private void orderLangHandle(PurchaseOrderVO purchaseOrder) { + Integer lang = I18nMessage.getLang(); + for (PurchaseOrderItemVO orderItem : purchaseOrder.getPurchaseOrderItemList()) { + if (CollUtil.isEmpty(orderItem.getPurchaseOrderItemLangList())) { + continue; + } + Map langMap = orderItem.getPurchaseOrderItemLangList().stream().collect(Collectors.toMap(PurchaseOrderItemLang::getLang, s -> s)); + PurchaseOrderItemLang orderItemLang; + if (langMap.containsKey(lang)) { + orderItemLang = langMap.get(lang); + } else { + orderItemLang = langMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang()); + } + if (Objects.isNull(orderItemLang)) { + continue; + } + orderItem.setSpuName(orderItemLang.getSpuName()); + orderItem.setSkuName(orderItemLang.getSkuName()); + } + } + + /** + * 新增采购金额日志 + * @param purchaseOrder 采购订单 + * @param purchaseAmountType 采购金额类型 + */ + private void addPurchaseAmountLog(PurchaseOrder purchaseOrder, Integer purchaseAmountType) { + int prodCount = 0; + long changeAmount = 0L; + if (Objects.equals(purchaseAmountType, PurchaseAmountType.IN_OR_OUT.getValue())) { + // 金额采购日志 + prodCount = purchaseOrder.getTotalStock(); + changeAmount = BigDecimal.valueOf(purchaseOrder.getTotalAmount()).longValue(); + } else if (Objects.equals(purchaseAmountType, PurchaseAmountType.CANCEL.getValue())) { + // 金额作废日志 + prodCount = purchaseOrder.getTotalStock() - purchaseOrder.getActualTotalStock(); + if (Objects.equals(prodCount, purchaseOrder.getTotalStock())) { + // 全部商品作废,作废金额=采购金额 + changeAmount = BigDecimal.valueOf(purchaseOrder.getTotalAmount()).longValue(); + } else { + // 部分商品作废,计算作废金额 + List orderItems = purchaseOrderItemMapper.listItemByPurchaseOrderId(purchaseOrder.getPurchaseOrderId()); + for (PurchaseOrderItem orderItem : orderItems) { + changeAmount += orderItem.getPurchasePrice() * (orderItem.getPurchaseStock() - orderItem.getActualStock()); + } + } + } + // MQ发消息新建日志 + PurchaseAmountLogBO purchaseAmountLogBO = this.buildPurchaseLogBO(purchaseOrder, changeAmount, purchaseAmountType, prodCount); + addPurchaseAmountLogTemplate.syncSend(RocketMqConstant.ADD_PURCHASE_AMOUNT_LOG_TOPIC, new GenericMessage<>(purchaseAmountLogBO)); + } + + private PurchaseAmountLogBO buildPurchaseLogBO(PurchaseOrder purchaseOrder, + Long changeAmount, + Integer purchaseAmountType, + Integer prodCount) { + PurchaseAmountLogBO purchaseAmountLogBO = new PurchaseAmountLogBO(); + purchaseAmountLogBO.setPurchaseOrderId(purchaseOrder.getPurchaseOrderId()); + purchaseAmountLogBO.setShopId(purchaseOrder.getShopId()); + purchaseAmountLogBO.setSupplierId(purchaseOrder.getSupplierId()); + purchaseAmountLogBO.setPurchaseTotalAmount(BigDecimal.valueOf(purchaseOrder.getTotalAmount()).longValue()); + purchaseAmountLogBO.setChangeAmount(changeAmount); + purchaseAmountLogBO.setPurchaseAmountType(purchaseAmountType); + purchaseAmountLogBO.setProdCount(prodCount); + return purchaseAmountLogBO; + } + + /** + * 排序采购商品(按同spu排序) + * @param purchaseOrderItems 采购商品集合 + * @return + */ + private List sortPurchaseItem(List purchaseOrderItems) { + if (CollectionUtils.isEmpty(purchaseOrderItems)) { + return new ArrayList<>(); + } + // 按spuId分类 + Map> spuMap = purchaseOrderItems.stream().collect(Collectors.groupingBy(PurchaseOrderItemDTO::getSpuId)); + // 组成list并返回 + List sortItems = new ArrayList<>(purchaseOrderItems.size()); + spuMap.values().forEach(sortItems::addAll); + return sortItems; + } + + /** + * 检查仓库 + * @param warehouseId 仓库id + * @param shopId 店铺id + * @param sysType 系统类型 + */ + private WarehouseVO checkWarehouse(Long warehouseId, + Long shopId, + Integer sysType) { + WarehouseVO warehouse = warehouseFeignClient.getWarehouseById(warehouseId); + if (Objects.isNull(warehouse)) { + throw new LuckException(String.format("仓库[%s]不存在", warehouseId)); + } + if (Objects.equals(warehouse.getSysType(), com.tmerclub.cloud.api.auth.constant.SysTypeEnum.STATION.value())) { + // 检查门店仓库 + if(Objects.equals(sysType, com.tmerclub.cloud.api.auth.constant.SysTypeEnum.SUPPLIER.value())) { + throw new LuckException("供应商不存在门店"); + } + StationVO station = stationService.getByStationId(warehouse.getShopId()); + if (!Objects.equals(station.getShopId(), shopId)) { + throw new LuckException(String.format("门店[%s]非该店铺的门店", station.getStationId())); + } + } else if (!Objects.equals(shopId, warehouse.getShopId()) + || !Objects.equals(sysType, warehouse.getSysType())) { + // 检查商家/供应商仓库 + throw new LuckException(String.format("仓库[%s]非该店铺的仓库", warehouseId)); + } + return warehouse; + } + + /** + * 检查采购订单 + * @param purchaseOrderId 采购订单id + * @param shopId 店铺id + * @return + */ + private PurchaseOrderVO checkPurchaseOrder(Long purchaseOrderId, Long shopId) { + PurchaseOrderVO purchaseOrder = purchaseOrderMapper.info(purchaseOrderId, null, I18nMessage.getLang()); + if (Objects.isNull(purchaseOrder)) { + throw new LuckException("采购订单不存在"); + } + if (!Objects.equals(purchaseOrder.getShopId(), shopId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (Objects.equals(purchaseOrder.getStatus(), PurchasesStatusEnum.VOIDED.value())) { + throw new LuckException("采购订单已作废"); + } + if (Objects.equals(purchaseOrder.getStatus(), PurchasesStatusEnum.COMPLETION.value())) { + throw new LuckException("采购订单已完成"); + } + return purchaseOrder; + } + + /** + * 构建库存流水VO集合 + * @param purchaseOrderDTO 采购订单dto + * @return 库存流水VO集合 + */ + private StockBillLogVO buildStockBillLog(PurchaseOrderDTO purchaseOrderDTO, + Long warehouseId, + StockBillType stockBillType) { + // 商品数据准备 + Set spuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set skuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (PurchaseOrderItemDTO purchaseOrderItemDTO : purchaseOrderDTO.getPurchaseOrderItemList()) { + spuIds.add(purchaseOrderItemDTO.getSpuId()); + skuIds.add(purchaseOrderItemDTO.getSkuId()); + } + List spuVOList = spuFeignClient.listSpuBySpuIds(new ArrayList<>(spuIds)).getData(); + List skuVOList = skuFeignClient.listBySkuIds(new ArrayList<>(skuIds)); + Map spuMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSpuId, x -> x)); + Map skuMap = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, x -> x)); + // 构建库存流水日志 + StockBillLogVO stockBillLog = new StockBillLogVO(); + stockBillLog.setSourceOrderNo(purchaseOrderDTO.getPurchaseOrderId().toString()); + stockBillLog.setStockBillType(stockBillType.value()); + stockBillLog.setBusinessTime(new Date()); + stockBillLog.setRemark(purchaseOrderDTO.getRemark()); + if (Objects.equals(purchaseOrderDTO.getSysType(), SysTypeEnum.MULTISHOP.value())) { + stockBillLog.setShopId(purchaseOrderDTO.getShopId()); + stockBillLog.setStockPointType(purchaseOrderDTO.getStockPointType()); + } else { + stockBillLog.setSupplierId(purchaseOrderDTO.getSupplierId()); + stockBillLog.setStockPointType(StockPointType.WAREHOUSE.getValue()); + } + stockBillLog.setEmployeeId(purchaseOrderDTO.getEmployeeId()); + stockBillLog.setType(Objects.equals(stockBillType, StockBillType.PURCHASE_OUTBOUND) ? StockType.OUT_OF_STOCK.value() : StockType.WAREHOUSING.value()); + stockBillLog.setStatus(StockBillStatus.SUCCESS.value()); + stockBillLog.setStockPointId(warehouseId); + long totalAmount = 0L; + int totalCount = 0; + List stockBillLogItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + StockBillLogItemVO stockBillLogItem; + for (PurchaseOrderItemDTO purchaseOrderItemDTO : purchaseOrderDTO.getPurchaseOrderItemList()) { + stockBillLogItem = this.buildStockBillLogItem(purchaseOrderItemDTO, spuMap, skuMap); + stockBillLogItems.add(stockBillLogItem); + totalCount += stockBillLogItem.getStockCount(); + totalAmount += stockBillLogItem.getStockCount() * stockBillLogItem.getUnitPrice(); + } + stockBillLog.setTotalAmount(totalAmount); + stockBillLog.setTotalCount(totalCount); + stockBillLog.setStockBillLogItems(stockBillLogItems); + return stockBillLog; + } + + /** + * 构建库存流水项VO + * @param purchaseOrderItemDTO 采购订单项dto + * @param spuMap 商品spuMap + * @param skuMap 商品skuMap + * @return 库存流水项VO + */ + private StockBillLogItemVO buildStockBillLogItem(PurchaseOrderItemDTO purchaseOrderItemDTO, + Map spuMap, + Map skuMap) { + SkuVO skuVO = skuMap.get(purchaseOrderItemDTO.getSkuId()); + SpuVO spuVO = spuMap.get(purchaseOrderItemDTO.getSpuId()); + StockBillLogItemVO stockBillLogItem = new StockBillLogItemVO(); + stockBillLogItem.setStockCount(purchaseOrderItemDTO.getInboundStock()); + stockBillLogItem.setSpuId(spuVO.getSpuId()); + stockBillLogItem.setSkuId(skuVO.getSkuId()); + stockBillLogItem.setSpuName(spuVO.getName()); + stockBillLogItem.setSkuName(skuVO.getSkuName()); + stockBillLogItem.setPartyCode(skuVO.getPartyCode()); + stockBillLogItem.setMainImgUrl(spuVO.getMainImgUrl()); + stockBillLogItem.setImgUrl(skuVO.getImgUrl()); + stockBillLogItem.setUnitPrice(skuVO.getPriceFee()); + return stockBillLogItem; + } + + /** + * 构建sku库存VO + * @param purchaseOrderItemDTO 采购订单项dto + * @param warehouseId 仓库id + * @param luaOperateEnum lua库存脚本操作 + * @return sku库存VO + */ + private SkuStockVO buildSkuStockVO(PurchaseOrderItemDTO purchaseOrderItemDTO, + Long warehouseId, + LuaOperateEnum luaOperateEnum) { + SkuStockVO skuStockVO = new SkuStockVO(); + BeanUtils.copyProperties(purchaseOrderItemDTO, skuStockVO); + skuStockVO.setStockPointId(warehouseId); + skuStockVO.setStock(purchaseOrderItemDTO.getInboundStock()); + skuStockVO.setOperateType(luaOperateEnum.value()); + return skuStockVO; + } + + /** + * 构建商家代销采购订单项集合 + * @param shopId 店铺id + * @param purchaseOrderItems 采购订单项集合 + * @return 商家代销采购订单项集合 + */ + private List buildSalePurchaseOrderItem(Long shopId, + List purchaseOrderItems) { + // 查询商家代销商品信息 + List supplierSpuIds = purchaseOrderItems.stream().map(PurchaseOrderItemVO::getSpuId).collect(Collectors.toList()); + List spuVOList = spuFeignClient.listShopSpuBySupplierSpuIds(shopId, supplierSpuIds); + Map spuMap = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSupplierSpuId, s -> s)); + List spuIds = spuVOList.stream().map(SpuVO::getSpuId).toList(); + List skuVOList = skuFeignClient.listBySpuIds(spuIds); + Map skuMap = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSupplierSkuId, s -> s)); + // 将采购订单项中的spu和sku换成商家的,方便后续对商家数据进行处理 + List saleItems = new ArrayList<>(purchaseOrderItems.size()); + PurchaseOrderItemDTO saleItem; + SpuVO spuVO; + SkuVO skuVO; + for (PurchaseOrderItemVO purchaseOrderItem : purchaseOrderItems) { + spuVO = spuMap.get(purchaseOrderItem.getSpuId()); + skuVO = skuMap.get(purchaseOrderItem.getSkuId()); + saleItem = new PurchaseOrderItemDTO(); + BeanUtils.copyProperties(purchaseOrderItem, saleItem); + saleItem.setSpuId(spuVO.getSpuId()); + saleItem.setSkuId(skuVO.getSkuId()); + saleItem.setSupplierSkuId(skuVO.getSupplierSkuId()); + saleItems.add(saleItem); + } + return saleItems; + } + + private PurchaseOrderAddr getAndSavePurchaseOrderAddr(PurchaseOrderDTO purchaseOrderDTO, WarehouseVO warehouseVO) { + PurchaseOrderAddr purchaseOrderAddr = BeanUtil.map(warehouseVO, PurchaseOrderAddr.class); + purchaseOrderAddr.setPurchaseOrderAddrId(purchaseOrderDTO.getAddrId()); + // 仓库收货人是仓库管理者,门店收货人是门店名称 + purchaseOrderAddr.setConsignee(Objects.equals(warehouseVO.getSysType(), SysTypeEnum.STATION.value()) ? warehouseVO.getWarehouseName() : warehouseVO.getManage()); + purchaseOrderAddr.setMobile(warehouseVO.getPhone()); + purchaseOrderAddr.setAddr(warehouseVO.getAddress()); + purchaseOrderAddr.setPurchaseOrderAddrId(purchaseOrderDTO.getAddrId()); + purchaseOrderAddrService.save(purchaseOrderAddr); + return purchaseOrderAddr; + } + + private void setPurchaseInfo(PurchaseOrderDTO purchaseOrderDTO, StringBuilder orderSpuNameCn, StringBuilder orderSpuNameEn, PurchaseOrderItem purchaseOrderItem, SpuVO spu, SkuVO sku) { + purchaseOrderItem.setStatus(PurchasesStatusEnum.UNPAY.value()); + purchaseOrderItem.setActualStock(0); + purchaseOrderItem.setSpuId(spu.getSpuId()); + purchaseOrderItem.setSkuId(sku.getSkuId()); + purchaseOrderItem.setSpuCode(spu.getSpuCode()); + purchaseOrderItem.setPartyCode(sku.getPartyCode()); + purchaseOrderItem.setPic(StrUtil.isNotBlank(sku.getImgUrl()) ? sku.getImgUrl() : spu.getMainImgUrl()); + purchaseOrderItem.setPurchaseOrderId(purchaseOrderDTO.getPurchaseOrderId()); + purchaseOrderItem.setPurchasePrice(sku.getPriceFee()); + purchaseOrderItem.setPurchaseAmount(sku.getPriceFee() * purchaseOrderItem.getPurchaseStock()); + purchaseOrderItem.setBeDeliveredNum(purchaseOrderItem.getPurchaseStock()); + purchaseOrderItem.setPurchaseOrderItemLangList(getOrderItemLangList(sku.getSkuLangList(), spu.getSpuLangList(), orderSpuNameCn, orderSpuNameEn)); + } + + private Map getSpuAndSkuMap(PurchaseOrderDTO purchaseOrderDTO, List skuList) { + ServerResponseEntity> spuAndSkuResponse = spuFeignClient.listSpuAndSkuById(skuList, purchaseOrderDTO.getSupplierId()); + if (!spuAndSkuResponse.isSuccess()) { + throw new LuckException(spuAndSkuResponse.getMsg()); + } + List spuAndSkuList = spuAndSkuResponse.getData(); + Map spuAndSkuMap = spuAndSkuList.stream().collect(Collectors.toMap(SpuAndSkuVO::getSkuId, spuAndSkuVO -> spuAndSkuVO)); + if (spuAndSkuList.size() == 0) { + throw new LuckException("yami.purchased.prod.not.exist.or.disabled"); + } + return spuAndSkuMap; + } + + private static List getSkuVOList(PurchaseOrderDTO purchaseOrderDTO) { + List skuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (PurchaseOrderItemDTO purchaseOrderItem : purchaseOrderDTO.getPurchaseOrderItemList()) { + SkuVO skuVO = new SkuVO(); + skuVO.setSkuId(purchaseOrderItem.getSkuId()); + skuVO.setSpuId(purchaseOrderItem.getSpuId()); + skuList.add(skuVO); + } + return skuList; + } + + + /** + * 采购订单中商品未导入自动导入 + * + * @param purchaseOrder + */ + private void voluntarilyImportSupplierSpu(PurchaseOrderDTO purchaseOrder) { + List spuVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (PurchaseOrderItemDTO purchaseOrderItemDTO : purchaseOrder.getPurchaseOrderItemList()) { + SpuVO spuVO = new SpuVO(); + spuVO.setShopId(purchaseOrder.getShopId()); + spuVO.setSupplierSpuId(purchaseOrderItemDTO.getSpuId()); + spuVOList.add(spuVO); + } + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity voidServerResponseEntity = spuFeignClient.voluntarilyImportSupplierSpu(spuVOList, sysType, + AuthUserContext.get().getUserId()); + if (!voidServerResponseEntity.isSuccess()) { + throw new LuckException(voidServerResponseEntity.getMsg()); + } + } + + /** + * 获取订单项的国际化信息 + * + * @param skuLangList 规格语言信息 + * @param spuLangList 商品语言信息 + * @param orderSpuNameCn + * @param orderSpuNameCn + * @return 订单项的国际化信息列表 + */ + private List getOrderItemLangList(List skuLangList, List spuLangList, + StringBuilder orderSpuNameCn, StringBuilder orderSpuNameEn) { + List orderItemLangList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map spuNameMap = spuLangList.stream() + .filter(orderSpuLangVO -> StrUtil.isNotBlank(orderSpuLangVO.getSpuName())) + .collect(Collectors.toMap(SpuLangVO::getLang, SpuLangVO::getSpuName)); + Map skuNameMap = skuLangList.stream() + .filter(orderSkuLangVO -> StrUtil.isNotBlank(orderSkuLangVO.getSkuName())) + .collect(Collectors.toMap(SkuLangVO::getLang, SkuLangVO::getSkuName)); + + for (LanguageEnum value : LanguageEnum.values()) { + Integer lang = value.getLang(); + if (!spuNameMap.containsKey(lang) && !skuNameMap.containsKey(lang)) { + continue; + } + PurchaseOrderItemLang orderItemLang = new PurchaseOrderItemLang(); + orderItemLang.setLang(value.getLang()); + orderItemLang.setSkuName(LangUtil.getLangValue(skuNameMap, lang)); + orderItemLang.setSpuName(LangUtil.getLangValue(spuNameMap, lang)); + orderItemLangList.add(orderItemLang); + if (Objects.equals(value, LanguageEnum.LANGUAGE_ZH_CN)) { + orderSpuNameCn.append(orderItemLang.getSpuName()).append(StrUtil.COMMA); + } else { + orderSpuNameEn.append(orderItemLang.getSpuName()).append(StrUtil.COMMA); + } + } + return orderItemLangList; + } + + /** + * 库存回退,并新增供应商库存流水 + * @param purchaseOrderVO 采购订单VO + */ + private void reductionStock(PurchaseOrderVO purchaseOrderVO) { + if (CollUtil.isEmpty(purchaseOrderVO.getPurchaseOrderItemList())) { + log.info("采购单商品为空,采购单id:{}", purchaseOrderVO.getPurchaseOrderId()); + return; + } + // 过滤出部分入库商品 + List purchaseOrderItems = purchaseOrderVO.getPurchaseOrderItemList().stream() + .filter(x -> x.getPurchaseStock() > x.getActualStock()).map(x -> { + PurchaseOrderItemDTO purchaseOrderItemDTO = new PurchaseOrderItemDTO(); + BeanUtils.copyProperties(x, purchaseOrderItemDTO); + purchaseOrderItemDTO.setInboundStock(x.getPurchaseStock() - x.getActualStock()); + return purchaseOrderItemDTO; + }).toList(); + if (CollectionUtils.isEmpty(purchaseOrderItems)) { + return; + } + // 修改库存 + List skuStockVOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (PurchaseOrderItemDTO purchaseOrderItemDTO : purchaseOrderItems) { + skuStockVOList.add(this.buildSkuStockVO(purchaseOrderItemDTO, purchaseOrderVO.getSupplierWarehouseId(), LuaOperateEnum.SKU_ADD)); + } + skuStockFeignClient.changeSkuStock(skuStockVOList); + // 新增流水记录 + PurchaseOrderDTO purchaseOrderDTO = new PurchaseOrderDTO(); + BeanUtils.copyProperties(purchaseOrderVO, purchaseOrderDTO); + purchaseOrderDTO.setPurchaseOrderItemList(purchaseOrderItems); + purchaseOrderDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + StockBillLogVO stockBillLog = this.buildStockBillLog(purchaseOrderDTO, purchaseOrderVO.getSupplierWarehouseId(), StockBillType.ORDER_CANCEL); + TransactionSendResult transactionSendResult = stockBillLogPurchaseStorageTemplate.sendMessageInTransaction(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC, new GenericMessage<>(stockBillLog), stockBillLog); + if (!Objects.equals(transactionSendResult.getLocalTransactionState(), LocalTransactionState.COMMIT_MESSAGE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + /** + * 构建采购导入excel数据 + * @param skuVO skuVO + * @param partyCodeMap excel导入文件数据映射 + * @param spuMap spuVO映射 + * @param saleMap 商家代销商品映射 + * @param stockMap 商品库存映射 + * @param warehouseSupplierMap 仓库供应商映射 + * @param inWarehouseId 入库仓库id + * @param outWarehouseId 出库仓库id + */ + private PurchaseSpuVO buildPurchaseImportExcel(SkuVO skuVO, + Map partyCodeMap, + Map spuMap, + Map saleMap, + Map stockMap, + Map warehouseSupplierMap, + Long inWarehouseId, + Long outWarehouseId) { + SpuVO spuVO = spuMap.get(skuVO.getSpuId()); + PurchaseSpuVO purchaseSpuVO = new PurchaseSpuVO(); + BeanUtils.copyProperties(skuVO, purchaseSpuVO); + purchaseSpuVO.setSkuName(CollectionUtils.isEmpty(skuVO.getSkuLangList()) ? "" : skuVO.getSkuLangList().get(0).getSkuName()); + purchaseSpuVO.setName(spuVO.getSpuLangList().get(0).getSpuName()); + purchaseSpuVO.setMainImgUrl(spuVO.getMainImgUrl()); + purchaseSpuVO.setPurchaseStock(partyCodeMap.get(skuVO.getPartyCode())); + SupplierApiDetailVO supplier = warehouseSupplierMap.get(outWarehouseId); + purchaseSpuVO.setSupplierId(supplier.getSupplierId()); + purchaseSpuVO.setSupplierName(supplier.getSupplierName()); + SkuStockVO skuStockVO; + purchaseSpuVO.setStock(Objects.isNull((skuStockVO = stockMap.get(saleMap.get(skuVO.getSkuId()) + "_" + inWarehouseId))) ? 0 : skuStockVO.getStock()); + purchaseSpuVO.setSupplierStock(Objects.isNull((skuStockVO = stockMap.get(skuVO.getSkuId() + "_" + outWarehouseId))) ? 0 : skuStockVO.getStock()); + // 更新采购数量(负数改为0,超出库存改为当前库存) +// if (purchaseSpuVO.getPurchaseStock() < 0) { +// purchaseSpuVO.setPurchaseStock(0); +// } else if (purchaseSpuVO.getPurchaseStock() > purchaseSpuVO.getSupplierStock()) { +// purchaseSpuVO.setPurchaseStock(purchaseSpuVO.getSupplierStock()); +// } + return purchaseSpuVO; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderDeliveryTask.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderDeliveryTask.java new file mode 100644 index 0000000..d858693 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/task/OrderDeliveryTask.java @@ -0,0 +1,126 @@ +package com.tmerclub.cloud.order.task; + +import cn.binarywang.wx.miniapp.api.WxMaOrderShippingService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaOrderShippingServiceImpl; +import cn.binarywang.wx.miniapp.bean.shop.request.shipping.OrderKeyBean; +import cn.binarywang.wx.miniapp.bean.shop.request.shipping.PayerBean; +import cn.binarywang.wx.miniapp.bean.shop.request.shipping.ShippingListBean; +import cn.binarywang.wx.miniapp.bean.shop.request.shipping.WxMaOrderShippingInfoUploadRequest; +import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingInfoBaseResponse; +import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingInfoGetListResponse; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.feign.AuthSocialFeignClient; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.config.WxConfig; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.vo.OrderItemLangVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.order.model.Order; +import com.tmerclub.cloud.order.service.OrderItemService; +import com.tmerclub.cloud.order.service.OrderService; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 小程序虚拟和自提订单发货定时任务 + * @author zp + */ +@Component +public class OrderDeliveryTask { + + @Autowired + private WxConfig wxConfig; + @DubboReference + private AuthSocialFeignClient authSocialFeignClient; + @DubboReference + private AccountFeignClient accountFeignClient; + @DubboReference + private PaymentFeignClient paymentFeignClient; + @Autowired + private OrderService orderService; + @Autowired + private OrderItemService orderItemService; + + /** + * 小程序发货 + */ + @XxlJob("wxAppShipment") + public void wxAppShipment() { + XxlJobHelper.log("小程序发货定时任务"); + Boolean tradeManaged = wxConfig.getTradeManaged(); + if (tradeManaged) { + WxMaOrderShippingInfoGetListResponse response = wxConfig.getOrderIdList(); + if (CollectionUtil.isNotEmpty(response.getOrderList())) { + for (WxMaOrderShippingInfoBaseResponse.Order wxOrder : response.getOrderList()) { + WxMaOrderShippingInfoUploadRequest request = new WxMaOrderShippingInfoUploadRequest(); + OrderKeyBean orderKey = new OrderKeyBean(); + orderKey.setOrderNumberType(2); + orderKey.setTransactionId(wxOrder.getTransactionId()); + request.setOrderKey(orderKey); + request.setDeliveryMode(1); + PayInfoApiDto payInfoApiDto = paymentFeignClient.getPayInfoByPayId(Long.parseLong(wxOrder.getMerchantTradeNo())).getData(); + if (Objects.isNull(payInfoApiDto)) { + continue; + } + String[] orderIds = payInfoApiDto.getOrderIds().split(","); + // 因为只获取虚拟订单和自提订单,所以其实只有一个orderId + Order order = orderService.getByOrderId(Long.parseLong(orderIds[0])); + if (Objects.isNull(order)) { + // 不是虚拟订单或自提订单,不需要定时任务发货 + continue; + } + if (order.getDeliveryType().equals(DeliveryType.STATION.value())) { + request.setLogisticsType(4); + }else if (order.getOrderMold() == 1 ) { + request.setLogisticsType(3); + }else { + continue; + } + request.setLogisticsType(order.getDeliveryType()); + ShippingListBean shippingListBean = new ShippingListBean(); + String itemDesc = ""; + for (OrderItemVO orderItem : orderItemService.listOrderItemAndLangByOrderId(order.getOrderId())) { + if (CollectionUtil.isNotEmpty(orderItem.getOrderItemLangList())) { + Map nameMap = orderItem.getOrderItemLangList().stream().collect(Collectors.toMap(OrderItemLangVO::getLang, OrderItemLangVO::getSpuName)); + itemDesc += nameMap.get(1) + "*" + orderItem.getCount() + " "; + } else { + itemDesc += orderItem.getSpuName() + "*" + orderItem.getCount() + " "; + } + } + shippingListBean.setItemDesc(itemDesc); + request.setShippingList(Collections.singletonList(shippingListBean)); + DateFormat dft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + request.setUploadTime(dft.format(new Date())); + PayerBean payerBean = new PayerBean(); + payerBean.setOpenid(payInfoApiDto.getBizUserId()); + request.setPayer(payerBean); + try { + WxMaService wxMaService = wxConfig.getWxMaService(); + WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService); + XxlJobHelper.log("虚拟订单发货录入的参数" + Json.toJsonString(request)); + wxMaOrderShippingService.upload(request); + } catch (WxErrorException wxErrorException) { + wxErrorException.printStackTrace(); + XxlJobHelper.log("订单id为"+ order.getOrderId() +"的小程序发货错误信息:" + wxErrorException.getError().getErrorMsg()); + } + } + } + } + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotOrderVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotOrderVO.java new file mode 100644 index 0000000..24db21b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotOrderVO.java @@ -0,0 +1,251 @@ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.Date; +import java.util.List; + +/** + * 调拨订单VO + * @author gaozijie + * @date 2023-11-20 + */ +public class AllotOrderVO { + + @Schema(description = "调拨订单id") + private Long allotOrderId; + + @Schema(description = "调出点仓库id") + private Long outWarehouseId; + + @Schema(description = "调出点库存点类型(1:仓库, 2:门店)") + private Integer outStockPointType; + + @Schema(description = "调出点名称") + private String outStockPointName; + + @Schema(description = "调入点仓库id") + private Long inWarehouseId; + + @Schema(description = "调入点库存点类型(1:仓库, 2:门店)") + private Integer inStockPointType; + + @Schema(description = "调入点名称") + private String inStockPointName; + + @Schema(description = "物流公司id") + private Long dvyCompanyId; + + @Schema(description = "物流公司名称") + private String dvyCompanyName; + + @Schema(description = "物流方式") + private Integer dvyType; + + @Schema(description = "物流单号") + private String dvyOrderNumber; + + @Schema(description = "状态(0:作废, 1:待入库, 2:部分入库, 3:已完成)") + private Integer status; + + @Schema(description = "总调拨数量") + private Integer totalAllotCount; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "系统类型") + private Integer sysType; + + @Schema(description = "调拨订单商品集合") + private List allotOrderItemVOList; + + public AllotOrderVO() { + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getOutWarehouseId() { + return outWarehouseId; + } + + public void setOutWarehouseId(Long outWarehouseId) { + this.outWarehouseId = outWarehouseId; + } + + public Integer getOutStockPointType() { + return outStockPointType; + } + + public void setOutStockPointType(Integer outStockPointType) { + this.outStockPointType = outStockPointType; + } + + public String getOutStockPointName() { + return outStockPointName; + } + + public void setOutStockPointName(String outStockPointName) { + this.outStockPointName = outStockPointName; + } + + public Long getInWarehouseId() { + return inWarehouseId; + } + + public void setInWarehouseId(Long inWarehouseId) { + this.inWarehouseId = inWarehouseId; + } + + public Integer getInStockPointType() { + return inStockPointType; + } + + public void setInStockPointType(Integer inStockPointType) { + this.inStockPointType = inStockPointType; + } + + public String getInStockPointName() { + return inStockPointName; + } + + public void setInStockPointName(String inStockPointName) { + this.inStockPointName = inStockPointName; + } + + public Long getDvyCompanyId() { + return dvyCompanyId; + } + + public void setDvyCompanyId(Long dvyCompanyId) { + this.dvyCompanyId = dvyCompanyId; + } + + public String getDvyCompanyName() { + return dvyCompanyName; + } + + public void setDvyCompanyName(String dvyCompanyName) { + this.dvyCompanyName = dvyCompanyName; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public String getDvyOrderNumber() { + return dvyOrderNumber; + } + + public void setDvyOrderNumber(String dvyOrderNumber) { + this.dvyOrderNumber = dvyOrderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getTotalAllotCount() { + return totalAllotCount; + } + + public void setTotalAllotCount(Integer totalAllotCount) { + this.totalAllotCount = totalAllotCount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public List getAllotOrderItemVOList() { + return allotOrderItemVOList; + } + + public void setAllotOrderItemVOList(List allotOrderItemVOList) { + this.allotOrderItemVOList = allotOrderItemVOList; + } + + @Override + public String toString() { + return "AllotOrderVO{" + + "allotOrderId=" + allotOrderId + + ", outWarehouseId=" + outWarehouseId + + ", outStockPointType=" + outStockPointType + + ", outStockPointName='" + outStockPointName + '\'' + + ", inWarehouseId=" + inWarehouseId + + ", inStockPointType=" + inStockPointType + + ", inStockPointName='" + inStockPointName + '\'' + + ", dvyCompanyId=" + dvyCompanyId + + ", dvyCompanyName='" + dvyCompanyName + '\'' + + ", dvyType=" + dvyType + + ", dvyOrderNumber='" + dvyOrderNumber + '\'' + + ", status=" + status + + ", totalAllotCount=" + totalAllotCount + + ", remark='" + remark + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", shopId=" + shopId + + ", sysType=" + sysType + + ", allotOrderItemVOList=" + allotOrderItemVOList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuExcelVO.java new file mode 100644 index 0000000..89d22ce --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuExcelVO.java @@ -0,0 +1,90 @@ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.model.ExcelModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @since 2023-11-29 + */ +public class AllotSpuExcelVO extends ExcelModel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "调拨信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + /** + * xls文件 + */ + public static final String XLS_FILE = "xls"; + + /** + * xlsx文件 + */ + public static final String XLSX_FILE = "xlsx"; + + /** + * 表头(用于excel模板校验) + */ + public static final String HEADER = "商品信息"; + public static final String[] HEADER_ARRAY = {"*商品编码(必填)*", "商品名称", "调拨数量"}; + + @ExcelProperty(value = {HEADER, "*商品编码(必填)*"}, index = 0) + private String partyCode; + + @ExcelProperty(value = {HEADER, "商品名称"}, index = 1) + private String spuName; + + @ExcelProperty(value = {HEADER, "调拨数量"}, index = 2) + private Integer allotCount; + + public AllotSpuExcelVO() { + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + @Override + public String toString() { + return "AllotOrderSpuExcelVO{" + + "partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", allotCount=" + allotCount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuInboundImportVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuInboundImportVO.java new file mode 100644 index 0000000..7318829 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuInboundImportVO.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * @author gaozijie + * @since 2023-12-01 + */ +public class AllotSpuInboundImportVO { + + @Schema(description = "成功解析的数据项") + private List allotOrderItemVOList; + + @Schema(description = "导入结果提示") + private String tips; + + public AllotSpuInboundImportVO() { + } + + public List getAllotOrderItemVOList() { + return allotOrderItemVOList; + } + + public void setAllotOrderItemVOList(List allotOrderItemVOList) { + this.allotOrderItemVOList = allotOrderItemVOList; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + @Override + public String toString() { + return "AllotSpuInboundImportVO{" + + "allotOrderItemVOList=" + allotOrderItemVOList + + ", tips='" + tips + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuVO.java new file mode 100644 index 0000000..8bed156 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/AllotSpuVO.java @@ -0,0 +1,143 @@ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.product.vo.SkuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * @author gaozijie + * @since 2023-11-30 + */ +public class AllotSpuVO { + + @Schema(description = "商品spuId") + private Long spuId; + + @Schema(description = "spu名称多语言") + private List spuLangVOList; + + @Schema(description = "商品skuId") + private Long skuId; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "sku名称多语言") + private List skuLangVOList; + + @Schema(description = "商品主图") + private String mainImgUrl; + + @Schema(description = "商品规格图") + private String imgUrl; + + @Schema(description = "入库仓库存") + private Integer inWarehouseStock; + + @Schema(description = "出库仓库存") + private Integer outWarehouseStock; + + @Schema(description = "调拨数量") + private Integer allotCount; + + public AllotSpuVO() { + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public List getSpuLangVOList() { + return spuLangVOList; + } + + public void setSpuLangVOList(List spuLangVOList) { + this.spuLangVOList = spuLangVOList; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public List getSkuLangVOList() { + return skuLangVOList; + } + + public void setSkuLangVOList(List skuLangVOList) { + this.skuLangVOList = skuLangVOList; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getInWarehouseStock() { + return inWarehouseStock; + } + + public void setInWarehouseStock(Integer inWarehouseStock) { + this.inWarehouseStock = inWarehouseStock; + } + + public Integer getOutWarehouseStock() { + return outWarehouseStock; + } + + public void setOutWarehouseStock(Integer outWarehouseStock) { + this.outWarehouseStock = outWarehouseStock; + } + + public Integer getAllotCount() { + return allotCount; + } + + public void setAllotCount(Integer allotCount) { + this.allotCount = allotCount; + } + + @Override + public String toString() { + return "AllotSpuVO{" + + "spuId=" + spuId + + ", spuLangVOList=" + spuLangVOList + + ", skuId=" + skuId + + ", partyCode='" + partyCode + '\'' + + ", skuLangVOList=" + skuLangVOList + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", inWarehouseStock=" + inWarehouseStock + + ", outWarehouseStock=" + outWarehouseStock + + ", allotCount=" + allotCount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/MyOrderItemVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/MyOrderItemVO.java new file mode 100644 index 0000000..3274593 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/MyOrderItemVO.java @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.order.vo.EsOrderItemVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author FrozenWatermelon + */ +@Schema(description = "我的订单-订单项") +public class MyOrderItemVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED) + private String pic; + + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String spuName; + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer count; + + @Schema(description = "商品价格", requiredMode = Schema.RequiredMode.REQUIRED) + private Long price; + + @Schema(description = "产品购买花费积分", requiredMode = Schema.RequiredMode.REQUIRED) + private Long useScore; + + @Schema(description = "skuId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long skuId; + + @Schema(description = "skuName", requiredMode = Schema.RequiredMode.REQUIRED) + private String skuName; + + @Schema(description = "订单项id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderItemId; + + @Schema(description = "商品id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long spuId; + + @Schema(description = "评论状态: 0 未评价 1 已评价", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer isComm; + + @Schema(description = "评论时间", requiredMode = Schema.RequiredMode.REQUIRED) + private Date commTime; + + @Schema(description = "退款状态 1.买家申请 2.卖家接受 3.买家发货 4.卖家收货 5.退款成功 -1.退款关闭") + private Integer returnMoneySts; + + @Schema(description = "订单项退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)") + private Integer refundStatus; + + @Schema(description = "退款单类型(1:整单退款,2:单个物品退款)") + private Integer refundType; + + @Schema(description = "赠品列表") + private List giveawayList; + + @Schema(description = "订单类型1团购订单 2秒杀订单 3积分订单") + private Integer orderType; + + @Schema(description = "主商品关联退款赠品id") + private String returnGiveawayIds; + + /** + * 活动id + */ + private Long activityId; + + /** + * 活动类型 OrderActivityType + */ + private Integer activityType; + @Schema(description = "组合商品列表") + private List comboList; + + public List getComboList() { + return comboList; + } + + public void setComboList(List comboList) { + this.comboList = comboList; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public Integer getRefundType() { + return refundType; + } + + public void setRefundType(Integer refundType) { + this.refundType = refundType; + } + + public List getGiveawayList() { + return giveawayList; + } + + public void setGiveawayList(List giveawayList) { + this.giveawayList = giveawayList; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + public String getReturnGiveawayIds() { + return returnGiveawayIds; + } + + public void setReturnGiveawayIds(String returnGiveawayIds) { + this.returnGiveawayIds = returnGiveawayIds; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getReturnMoneySts() { + return returnMoneySts; + } + + public void setReturnMoneySts(Integer returnMoneySts) { + this.returnMoneySts = returnMoneySts; + } + + public Integer getIsComm() { + return isComm; + } + + public void setIsComm(Integer isComm) { + this.isComm = isComm; + } + + public Date getCommTime() { + return commTime; + } + + public void setCommTime(Date commTime) { + this.commTime = commTime; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } + + @Override + public String toString() { + return "MyOrderItemVO{" + + "pic='" + pic + '\'' + + ", spuName='" + spuName + '\'' + + ", orderId=" + orderId + + ", count=" + count + + ", price=" + price + + ", useScore=" + useScore + + ", skuId=" + skuId + + ", skuName='" + skuName + '\'' + + ", orderItemId=" + orderItemId + + ", spuId=" + spuId + + ", isComm=" + isComm + + ", commTime=" + commTime + + ", returnMoneySts=" + returnMoneySts + + ", refundStatus=" + refundStatus + + ", refundType=" + refundType + + ", giveawayList=" + giveawayList + + ", orderType=" + orderType + + ", returnGiveawayIds='" + returnGiveawayIds + '\'' + + ", activityId=" + activityId + + ", activityType=" + activityType + + ", comboList=" + comboList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderItemDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderItemDetailVO.java new file mode 100644 index 0000000..c810b44 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderItemDetailVO.java @@ -0,0 +1,462 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Pineapple + * @date 2021/6/9 9:25 + */ +public class OrderItemDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单项id") + private Long orderItemId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "规格名称") + private String skuName; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "购物车产品个数") + private Integer count; + + @Schema(description = "商品供货价(采购价)") + private Long itemPurchaseAmount; + + @Schema(description = "商品总金额") + private Long spuTotalAmount; + + /** + * 商品实际金额 = 商品总金额 - 分摊的优惠金额 + */ + @Schema(description = "商品实际金额") + private Long actualTotal; + + /** + * 商家优惠金额[shareReduce-platformShareReduce] + */ + @Schema(description = "商家优惠金额") + private Long multishopReduce; + + @Schema(description = "平台优惠金额") + private Long platformShareReduce; + + /** + * 分销金额[推广员佣金+上级推广员佣金] + */ + @Schema(description = "分销金额") + private Long distributionAmount; + + @Schema(description = "使用积分") + private Long useScore; + + @Schema(description = "分账比例") + private Double rate; + + /** + * 平台佣金(商品实际金额 * 分账比例) + */ + @Schema(description = "平台佣金") + private Long platformCommission; + + @Schema(description = "积分抵扣金额") + private Long scoreAmount; + + @Schema(description = "会员折扣金额") + private Long memberAmount; + + @Schema(description = "平台优惠券优惠金额") + private Long platformCouponAmount; + + @Schema(description = "商家优惠券优惠金额") + private Long shopCouponAmount; + + @Schema(description = "满减优惠金额") + private Long discountAmount; + + @Schema(description = "商家运费减免金额") + private Long freeFreightAmount; + + @Schema(description = "平台运费减免金额") + private Long platformFreeFreightAmount; + + @Schema(description = "店铺改价优惠金额") + private Long shopChangeFreeAmount; + + @Schema(description = "退款金额") + private Long refundAmount; + + @Schema(description = "退货数量") + private Integer refundCount; + + @Schema(description = "秒杀优惠金额") + private Long seckillAmount; + + @Schema(description = "分账比例") + private Double supplierRate; + + @Schema(description = "平台佣金") + private Long purchasePlatformCommission; + + @Schema(description = "拼团优惠金额") + private Long groupAmount; + + @Schema(description = "供货价") + private Long supplyPriceFee; + + @Schema(description = "供应商图片") + private String supplierPic; + + @Schema(description = "供应商商品名称") + private String supplierSpuName; + + @Schema(description = "供应商sku名称") + private String supplierSkuName; + + @Schema(description = "活动类型 具体类型参考枚举类:OrderActivityType") + private Integer activityType; + + public Integer getActivityType() { + return activityType; + } + + public void setActivityType(Integer activityType) { + this.activityType = activityType; + } + + public String getSupplierSpuName() { + return supplierSpuName; + } + + public void setSupplierSpuName(String supplierSpuName) { + this.supplierSpuName = supplierSpuName; + } + + public String getSupplierSkuName() { + return supplierSkuName; + } + + public void setSupplierSkuName(String supplierSkuName) { + this.supplierSkuName = supplierSkuName; + } + + public String getSupplierPic() { + return supplierPic; + } + + public void setSupplierPic(String supplierPic) { + this.supplierPic = supplierPic; + } + + public Long getSupplyPriceFee() { + return supplyPriceFee; + } + + public void setSupplyPriceFee(Long supplyPriceFee) { + this.supplyPriceFee = supplyPriceFee; + } + + public Double getSupplierRate() { + return supplierRate; + } + + public void setSupplierRate(Double supplierRate) { + this.supplierRate = supplierRate; + } + + public Long getPurchasePlatformCommission() { + return purchasePlatformCommission; + } + + public void setPurchasePlatformCommission(Long purchasePlatformCommission) { + this.purchasePlatformCommission = purchasePlatformCommission; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getItemPurchaseAmount() { + return itemPurchaseAmount; + } + + public void setItemPurchaseAmount(Long itemPurchaseAmount) { + this.itemPurchaseAmount = itemPurchaseAmount; + } + + public Long getSpuTotalAmount() { + return spuTotalAmount; + } + + public void setSpuTotalAmount(Long spuTotalAmount) { + this.spuTotalAmount = spuTotalAmount; + } + + public Long getActualTotal() { + return actualTotal; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getMultishopReduce() { + return multishopReduce; + } + + public void setMultishopReduce(Long multishopReduce) { + this.multishopReduce = multishopReduce; + } + + public Long getPlatformShareReduce() { + return platformShareReduce; + } + + public void setPlatformShareReduce(Long platformShareReduce) { + this.platformShareReduce = platformShareReduce; + } + + public Long getDistributionAmount() { + return distributionAmount; + } + + public void setDistributionAmount(Long distributionAmount) { + this.distributionAmount = distributionAmount; + } + + public Long getUseScore() { + return useScore; + } + + public void setUseScore(Long useScore) { + this.useScore = useScore; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + + public Long getPlatformCommission() { + return platformCommission; + } + + public void setPlatformCommission(Long platformCommission) { + this.platformCommission = platformCommission; + } + + public Long getScoreAmount() { + return scoreAmount; + } + + public void setScoreAmount(Long scoreAmount) { + this.scoreAmount = scoreAmount; + } + + public Long getMemberAmount() { + return memberAmount; + } + + public void setMemberAmount(Long memberAmount) { + this.memberAmount = memberAmount; + } + + public Long getPlatformCouponAmount() { + return platformCouponAmount; + } + + public void setPlatformCouponAmount(Long platformCouponAmount) { + this.platformCouponAmount = platformCouponAmount; + } + + public Long getShopCouponAmount() { + return shopCouponAmount; + } + + public void setShopCouponAmount(Long shopCouponAmount) { + this.shopCouponAmount = shopCouponAmount; + } + + public Long getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(Long discountAmount) { + this.discountAmount = discountAmount; + } + + public Long getFreeFreightAmount() { + return freeFreightAmount; + } + + public void setFreeFreightAmount(Long freeFreightAmount) { + this.freeFreightAmount = freeFreightAmount; + } + + public Long getPlatformFreeFreightAmount() { + return platformFreeFreightAmount; + } + + public void setPlatformFreeFreightAmount(Long platformFreeFreightAmount) { + this.platformFreeFreightAmount = platformFreeFreightAmount; + } + + public Long getShopChangeFreeAmount() { + return shopChangeFreeAmount; + } + + public void setShopChangeFreeAmount(Long shopChangeFreeAmount) { + this.shopChangeFreeAmount = shopChangeFreeAmount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public Long getSeckillAmount() { + return seckillAmount; + } + + public void setSeckillAmount(Long seckillAmount) { + this.seckillAmount = seckillAmount; + } + + public Long getGroupAmount() { + return groupAmount; + } + + public void setGroupAmount(Long groupAmount) { + this.groupAmount = groupAmount; + } + + + @Override + public String toString() { + return "OrderItemDetailVO{" + + "orderItemId=" + orderItemId + + ", shopName='" + shopName + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", categoryName='" + categoryName + '\'' + + ", categoryId=" + categoryId + + ", count=" + count + + ", itemPurchaseAmount=" + itemPurchaseAmount + + ", spuTotalAmount=" + spuTotalAmount + + ", actualTotal=" + actualTotal + + ", multishopReduce=" + multishopReduce + + ", platformShareReduce=" + platformShareReduce + + ", distributionAmount=" + distributionAmount + + ", useScore=" + useScore + + ", rate=" + rate + + ", platformCommission=" + platformCommission + + ", scoreAmount=" + scoreAmount + + ", memberAmount=" + memberAmount + + ", platformCouponAmount=" + platformCouponAmount + + ", shopCouponAmount=" + shopCouponAmount + + ", discountAmount=" + discountAmount + + ", freeFreightAmount=" + freeFreightAmount + + ", platformFreeFreightAmount=" + platformFreeFreightAmount + + ", shopChangeFreeAmount=" + shopChangeFreeAmount + + ", refundAmount=" + refundAmount + + ", refundCount=" + refundCount + + ", seckillAmount=" + seckillAmount + + ", supplierRate=" + supplierRate + + ", purchasePlatformCommission=" + purchasePlatformCommission + + ", groupAmount=" + groupAmount + + ", supplyPriceFee=" + supplyPriceFee + + ", supplierPic='" + supplierPic + '\'' + + ", supplierSpuName='" + supplierSpuName + '\'' + + ", supplierSkuName='" + supplierSkuName + '\'' + + ", activityType=" + activityType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderListCountVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderListCountVO.java new file mode 100644 index 0000000..fdf58bb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderListCountVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author YXF + */ +@Schema(description = "订单列表数量") +public class OrderListCountVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "所有订单数量") + private Integer allCount; + + @Schema(description = "部分订单数量") + private Integer count; + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "OrderListCountVO{" + + "allCount=" + allCount + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderOverviewVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderOverviewVO.java new file mode 100644 index 0000000..3f01181 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderOverviewVO.java @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author lth + */ +@Schema(description = "订单概况信息VO") +public class OrderOverviewVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付金额 + */ + @Schema(description = "支付金额") + private Double payActual; + /** + * 较前一日支付金额变化比率 + */ + @Schema(description = "较前一日支付金额变化比率") + private Double yesterdayPayActualRate; + /** + * 支付金额列表 + */ + @Schema(description = "支付金额列表") + private List payActualList; + /** + * 前一天支付金额列表 + */ + @Schema(description = "前一天支付金额列表") + private List yesterdayPayActualList; + /** + * 时间日期列表 + */ + @Schema(description = "时间日期列表") + private List payDateList; + /** + * 时间日期展示列表 + */ + @Schema(description = "时间日期展示列表") + private List dateToStringList; + /** + * 支付客户数 + */ + @Schema(description = "支付客户数") + private Integer payUserCount; + /** + * 较前一日支付客户数变化比率 + */ + @Schema(description = "较前一日支付客户数变化比率") + private Double yesterdayPayUserRate; + /** + * 支付订单数 + */ + @Schema(description = "支付订单数") + private Integer payOrderCount; + /** + * 较前一日支付订单数变化比率 + */ + @Schema(description = "较前一日支付订单数变化比率") + private Double yesterdayPayOrderRate; + /** + * 退单数 + */ + @Schema(description = "退单数") + private Integer chargebackCount; + /** + * 退款金额 + */ + @Schema(description = "退款金额") + private Long refund; + /** + * 较前一日退款金额变化比率 + */ + @Schema(description = "较前一日退款金额变化比率") + private Double yesterdayRefundRate; + /** + * 客单价 + */ + @Schema(description = "客单价") + private Double onePrice; + /** + * 较前一日客单价变化比率 + */ + @Schema(description = "较前一日客单价变化比率") + private Double yesterdayOnePriceRate; + /** + * 时间展示数据 + */ + @Schema(description = "时间展示数据") + private String timeData; + /** + * 支付天数 + */ + @Schema(description = "支付天数") + private Date payDay; + /** + * 商品名称 + */ + @Schema(description = "商品名称") + private String spuName; + /** + * 店铺id + */ + @Schema(description = "店铺id") + private Long shopId; + /** + * 店铺名称 + */ + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "本月支付金额") + private Double currentMonthPayActual; + + /** + * 商品id + */ + private Long spuId; + + public Double getCurrentMonthPayActual() { + return currentMonthPayActual; + } + + public void setCurrentMonthPayActual(Double currentMonthPayActual) { + this.currentMonthPayActual = currentMonthPayActual; + } + + public Double getYesterdayPayActualRate() { + return yesterdayPayActualRate; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public void setYesterdayPayActualRate(Double yesterdayPayActualRate) { + this.yesterdayPayActualRate = yesterdayPayActualRate; + } + + public List getYesterdayPayActualList() { + return yesterdayPayActualList; + } + + public void setYesterdayPayActualList(List yesterdayPayActualList) { + this.yesterdayPayActualList = yesterdayPayActualList; + } + + public Double getYesterdayPayUserRate() { + return yesterdayPayUserRate; + } + + public void setYesterdayPayUserRate(Double yesterdayPayUserRate) { + this.yesterdayPayUserRate = yesterdayPayUserRate; + } + + public Double getYesterdayPayOrderRate() { + return yesterdayPayOrderRate; + } + + public void setYesterdayPayOrderRate(Double yesterdayPayOrderRate) { + this.yesterdayPayOrderRate = yesterdayPayOrderRate; + } + + public Double getYesterdayRefundRate() { + return yesterdayRefundRate; + } + + public void setYesterdayRefundRate(Double yesterdayRefundRate) { + this.yesterdayRefundRate = yesterdayRefundRate; + } + + public Double getYesterdayOnePriceRate() { + return yesterdayOnePriceRate; + } + + public void setYesterdayOnePriceRate(Double yesterdayOnePriceRate) { + this.yesterdayOnePriceRate = yesterdayOnePriceRate; + } + + public Double getPayActual() { + return payActual; + } + + public void setPayActual(Double payActual) { + this.payActual = payActual; + } + + public List getPayActualList() { + return payActualList; + } + + public void setPayActualList(List payActualList) { + this.payActualList = payActualList; + } + + public List getPayDateList() { + return payDateList; + } + + public void setPayDateList(List payDateList) { + this.payDateList = payDateList; + } + + public Integer getPayUserCount() { + return payUserCount; + } + + public void setPayUserCount(Integer payUserCount) { + this.payUserCount = payUserCount; + } + + public Integer getPayOrderCount() { + return payOrderCount; + } + + public void setPayOrderCount(Integer payOrderCount) { + this.payOrderCount = payOrderCount; + } + + public Integer getChargebackCount() { + return chargebackCount; + } + + public void setChargebackCount(Integer chargebackCount) { + this.chargebackCount = chargebackCount; + } + + public Long getRefund() { + return refund; + } + + public void setRefund(Long refund) { + this.refund = refund; + } + + public Double getOnePrice() { + return onePrice; + } + + public void setOnePrice(Double onePrice) { + this.onePrice = onePrice; + } + + public String getTimeData() { + return timeData; + } + + public void setTimeData(String timeData) { + this.timeData = timeData; + } + + public Date getPayDay() { + return payDay; + } + + public void setPayDay(Date payDay) { + this.payDay = payDay; + } + + public List getDateToStringList() { + return dateToStringList; + } + + public void setDateToStringList(List dateToStringList) { + this.dateToStringList = dateToStringList; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "OrderOverviewVO{" + + "payActual=" + payActual + + ", yesterdayPayActualRate=" + yesterdayPayActualRate + + ", payActualList=" + payActualList + + ", yesterdayPayActualList=" + yesterdayPayActualList + + ", payDateList=" + payDateList + + ", dateToStringList=" + dateToStringList + + ", payUserCount=" + payUserCount + + ", yesterdayPayUserRate=" + yesterdayPayUserRate + + ", payOrderCount=" + payOrderCount + + ", yesterdayPayOrderRate=" + yesterdayPayOrderRate + + ", chargebackCount=" + chargebackCount + + ", refund=" + refund + + ", yesterdayRefundRate=" + yesterdayRefundRate + + ", onePrice=" + onePrice + + ", yesterdayOnePriceRate=" + yesterdayOnePriceRate + + ", timeData='" + timeData + '\'' + + ", payDay=" + payDay + + ", spuName='" + spuName + '\'' + + ", shopId='" + shopId + '\'' + + ", shopName='" + shopName + '\'' + + ", currentMonthPayActual=" + currentMonthPayActual + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundStatisticsVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundStatisticsVO.java new file mode 100644 index 0000000..2269413 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderRefundStatisticsVO.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lth + */ +public class OrderRefundStatisticsVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 退款金额 + */ + @Schema(description = "退款金额") + private Long payActualTotal; + + /** + * 退款商品数量 + */ + @Schema(description = "退款商品数量") + private Long refundSpuCount; + /** + * 退款成功订单数 + */ + @Schema(description = "退款成功订单数") + private Integer refundCount; + /** + * 总订单数 + */ + @Schema(description = "总订单数") + private Integer totalOrderCount; + /** + * 退款原因 + */ + @Schema(description = "退款原因") + private String buyerReason; + + /** + * 商品ID + */ + @Schema(description = "商品ID") + private Long spuId; + /** + * 退款商品名称 + */ + @Schema(description = "退款商品名称") + private String refundProdName; + /** + * 店铺id + */ + @Schema(description = "店铺id") + private Long shopId; + /** + * 店铺名称 + */ + @Schema(description = "店铺名称") + private String shopName; + /** + * 退款率 + */ + @Schema(description = "退款率") + private Double refundRate; + /** + * 退款日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Schema(description = "退款日期") + private Date refundDate; + /** + * 退款日期 + */ + @Schema(description = "退款日期") + private String refundDateToString; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getPayActualTotal() { + return payActualTotal; + } + + public void setPayActualTotal(Long payActualTotal) { + this.payActualTotal = payActualTotal; + } + + public Integer getRefundCount() { + return refundCount; + } + + public void setRefundCount(Integer refundCount) { + this.refundCount = refundCount; + } + + public String getBuyerReason() { + return buyerReason; + } + + public void setBuyerReason(String buyerReason) { + this.buyerReason = buyerReason; + } + + public String getRefundProdName() { + return refundProdName; + } + + public void setRefundProdName(String refundProdName) { + this.refundProdName = refundProdName; + } + + public Date getRefundDate() { + return refundDate; + } + + public void setRefundDate(Date refundDate) { + this.refundDate = refundDate; + } + + public String getRefundDateToString() { + return refundDateToString; + } + + public void setRefundDateToString(String refundDateToString) { + this.refundDateToString = refundDateToString; + } + + public Integer getTotalOrderCount() { + return totalOrderCount; + } + + public void setTotalOrderCount(Integer totalOrderCount) { + this.totalOrderCount = totalOrderCount; + } + + public Double getRefundRate() { + return refundRate; + } + + public void setRefundRate(Double refundRate) { + this.refundRate = refundRate; + } + + public Long getRefundSpuCount() { + return refundSpuCount; + } + + public void setRefundSpuCount(Long refundSpuCount) { + this.refundSpuCount = refundSpuCount; + } + + @Override + public String toString() { + return "OrderRefundStatisticsVO{" + + "payActualTotal=" + payActualTotal + + ", refundSpuCount=" + refundSpuCount + + ", refundCount=" + refundCount + + ", totalOrderCount=" + totalOrderCount + + ", buyerReason='" + buyerReason + '\'' + + ", spuId=" + spuId + + ", refundProdName='" + refundProdName + '\'' + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", refundRate=" + refundRate + + ", refundDate=" + refundDate + + ", refundDateToString='" + refundDateToString + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderReturnReasonVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderReturnReasonVO.java new file mode 100644 index 0000000..d6e15ba --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderReturnReasonVO.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 退款原因VO + * + * @author FrozenWatermelon + * @date 2020-12-05 14:13:50 + */ +public class OrderReturnReasonVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "订单退款原因ID") + private Long reasonId; + + @Schema(description = "退货原因名") + private String reason; + + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "启用状态") + private Integer status; + + @Schema(description = "优惠总额") + private Long reduceAmount; + + public Long getReasonId() { + return reasonId; + } + + public void setReasonId(Long reasonId) { + this.reasonId = reasonId; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + @Override + public String toString() { + return "OrderReturnReasonVO{" + + "reasonId=" + reasonId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",reason=" + reason + + ",seq=" + seq + + ",status=" + status + + ",reduceAmount=" + reduceAmount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderVirtualInfoLogVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderVirtualInfoLogVO.java new file mode 100644 index 0000000..dc26e0c --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderVirtualInfoLogVO.java @@ -0,0 +1,42 @@ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.order.bo.OrderVirtualInfoLogBO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +/** + * @author TRACK + */ +public class OrderVirtualInfoLogVO { + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "核销记录") + private List orderVirtualInfoList; + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public List getOrderVirtualInfoList() { + return orderVirtualInfoList; + } + + public void setOrderVirtualInfoList(List orderVirtualInfoList) { + this.orderVirtualInfoList = orderVirtualInfoList; + } + + @Override + public String toString() { + return "OrderVirtualInfoLogVO{" + + "orderId=" + orderId + + ", orderVirtualInfoList=" + orderVirtualInfoList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderWxDeliveryVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderWxDeliveryVO.java new file mode 100644 index 0000000..4d10476 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/OrderWxDeliveryVO.java @@ -0,0 +1,48 @@ +package com.tmerclub.cloud.order.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 小程序发货订单支付单号以及状态 + * + * @author FrozenWatermelon + */ +public class OrderWxDeliveryVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 微信小程序订单状态 (1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款 + */ + private Integer orderStatus; + + /** + * 微信支付单号 + */ + private String bizPayNo; + + public Integer getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(Integer orderStatus) { + this.orderStatus = orderStatus; + } + + @Override + public String toString() { + return "OrderWxDeliveryVO{" + + "orderStatus=" + orderStatus + + ", bizPayNo='" + bizPayNo + '\'' + + '}'; + } + + public String getBizPayNo() { + return bizPayNo; + } + + public void setBizPayNo(String bizPayNo) { + this.bizPayNo = bizPayNo; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderInboundExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderInboundExcelVO.java new file mode 100644 index 0000000..aa8723e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseOrderInboundExcelVO.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单excel信息 + * + * @author lhd + * @date 2022-7-8 + */ +public class PurchaseOrderInboundExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 "商品编号", "商品名称", "预计入库量", "剩余入库量", "实际入库量 + */ + public static final String EXCEL_NAME = "入库商品信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty(value = {"商品信息", "序号"}, index = 0) + private String seq; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = {"商品信息", "商品编号"}, index = 1) + private String partyCode; + + @ExcelProperty(value = {"商品信息", "商品名称"}, index = 2) + private String spuName; + + @ExcelProperty(value = {"商品信息", "预计入库量"}, index = 3) + private Integer purchaseStock; + + @ExcelProperty(value = {"商品信息", "剩余入库量"}, index = 4) + private Integer actualStock; + + @ExcelProperty(value = {"商品信息", "实际入库量"}, index = 5) + private Integer beDeliveredNum; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + public Integer getBeDeliveredNum() { + return beDeliveredNum; + } + + public void setBeDeliveredNum(Integer beDeliveredNum) { + this.beDeliveredNum = beDeliveredNum; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + @Override + public String toString() { + return "PurchaseOrderInboundExcelVO{" + + "seq='" + seq + '\'' + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", purchaseStock='" + purchaseStock + '\'' + + ", beDeliveredNum=" + beDeliveredNum + + ", actualStock='" + actualStock + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseSpuExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseSpuExcelVO.java new file mode 100644 index 0000000..1ceb165 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseSpuExcelVO.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.model.ExcelModel; + +import java.io.Serial; +import java.io.Serializable; + +/** + * spu信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class PurchaseSpuExcelVO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "采购信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + /** + * xls文件 + */ + public static final String XLS_FILE = "xls"; + + /** + * xlsx文件 + */ + public static final String XLSX_FILE = "xlsx"; + + /** + * 表头(用于excel模板校验) + */ + public static final String HEADER = "商品信息"; + public static final String[] HEADER_ARRAY = {"*商品编码(必填)*", "商品名称", "采购数量"}; + + @ExcelProperty(value = {HEADER, "*商品编码(必填)*"}, index = 0) + private String partyCode; + + @ExcelProperty(value = {HEADER, "商品名称"}, index = 1) + private String spuName; + + @ExcelProperty(value = {HEADER, "采购数量"}, index = 2) + private Integer purchaseStock; + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getPurchaseStock() { + return purchaseStock; + } + + public void setPurchaseStock(Integer purchaseStock) { + this.purchaseStock = purchaseStock; + } + + @Override + public String toString() { + return "PurchaseSpuExcelVO{" + + "partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", purchaseStock=" + purchaseStock + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseSpuImportVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseSpuImportVO.java new file mode 100644 index 0000000..72f8b7e --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/PurchaseSpuImportVO.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.order.vo; + +import com.tmerclub.cloud.common.product.vo.PurchaseSpuVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author admin + */ +public class PurchaseSpuImportVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "成功解析的数据项") + private List purchaseSpuList; + + @Schema(description = "导入结果提示") + private String tips; + + public List getPurchaseSpuList() { + return purchaseSpuList; + } + + public void setPurchaseSpuList(List purchaseSpuList) { + this.purchaseSpuList = purchaseSpuList; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + @Override + public String toString() { + return "PurchaseSpuImportVO{" + + "purchaseSpuList=" + purchaseSpuList + + ", tips='" + tips + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/StationDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/StationDetailVO.java new file mode 100644 index 0000000..248b30b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/StationDetailVO.java @@ -0,0 +1,429 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; + +/** + * @author lanhai + */ +public class StationDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 自提点id + */ + @Schema(description = "自提点id") + private Long stationId; + /** + * 联系人 + */ + @Schema(description = "联系人") + private String userName; + /** + * 自提点名称 + */ + @Schema(description = "自提点名称") + private String stationName; + /** + * 自提点图片 + */ + @Schema(description = "自提点图片") + private String imgUrl; + + /** + * 是否常用客服中心 1是 0不是 + */ + @Schema(description = "是否常用客服中心 1是 0不是") + private Integer defaultStation; + + @Schema(description = "库存模式 1共享总部库存 2独立销售库存") + private Integer stockMode; + + @Schema(description = "库存是否充足 1.库存充足 0.库存不足") + private Integer hasStock; + + /** + * 省 + */ + @Schema(description = "省") + private String province; + /** + * 省id + */ + @Schema(description = "省id") + private Long provinceId; + /** + * 市 + */ + @Schema(description = "市") + private String city; + /** + * 市id + */ + @Schema(description = "市id") + private Long cityId; + /** + * 区 + */ + @Schema(description = "区") + private String area; + /** + * 区id + */ + @Schema(description = "区id") + private Long areaId; + /** + * 详细地址 + */ + @Schema(description = "详细地址") + private String addr; + /** + * 电话区号 + */ + @Schema(description = "电话区号") + private String phonePrefix; + /** + * 电话 + */ + @Schema(description = "电话") + private String mobile; + /** + * 店铺所在纬度 + */ + @Schema(description = "店铺所在纬度") + private Double lat; + /** + * 店铺所在经度 + */ + @Schema(description = "店铺所在经度") + private Double lng; + /** + * 距离 + */ + @Schema(description = "距离") + private Double distance; + /** + * 是否默认自提点 1 默认 0 非默认 + */ + @Schema(description = "是否默认自提点 1 默认 0 非默认") + private String commonAddr; + + /** + * 用户自提点id + */ + @Schema(description = "用户自提点id") + private Long id; + + /** + * 时间日期数据 + */ + private String timeInfo; + + /** + * 营业时间 + */ + @Schema(description = "营业时间") + private String business; + /** + * 时间日期数据 + */ + private List timeVOs; + + public static class TimeInfoModeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 营业时间 + */ + private Long[] shopTime; + /** + * 时段间隔 1:天 2:上下午晚上(12:00和18:00为分界点) 3:小时 4:半小时 + */ + private Integer interval; + /** + * 自提开始时间 + */ + private String stationStartTime; + /** + * 自提结束时间 + */ + private String stationEndTime; + + public Long[] getShopTime() { + return shopTime; + } + + public void setShopTime(Long[] shopTime) { + this.shopTime = shopTime; + } + + public Integer getInterval() { + return interval; + } + + public void setInterval(Integer interval) { + this.interval = interval; + } + + public String getStationStartTime() { + return stationStartTime; + } + + public void setStationStartTime(String stationStartTime) { + this.stationStartTime = stationStartTime; + } + + public String getStationEndTime() { + return stationEndTime; + } + + public void setStationEndTime(String stationEndTime) { + this.stationEndTime = stationEndTime; + } + + @Override + public String toString() { + return "TimeInfoModeVO{" + + "shopTime=" + Arrays.toString(shopTime) + + ", interval=" + interval + + ", stationStartTime='" + stationStartTime + '\'' + + ", stationEndTime='" + stationEndTime + '\'' + + '}'; + } + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getDefaultStation() { + return defaultStation; + } + + public void setDefaultStation(Integer defaultStation) { + this.defaultStation = defaultStation; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public String getPhonePrefix() { + return phonePrefix; + } + + public void setPhonePrefix(String phonePrefix) { + this.phonePrefix = phonePrefix; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getDistance() { + return distance; + } + + public void setDistance(Double distance) { + this.distance = distance; + } + + public String getCommonAddr() { + return commonAddr; + } + + public void setCommonAddr(String commonAddr) { + this.commonAddr = commonAddr; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTimeInfo() { + return timeInfo; + } + + public void setTimeInfo(String timeInfo) { + this.timeInfo = timeInfo; + } + + public String getBusiness() { + return business; + } + + public void setBusiness(String business) { + this.business = business; + } + + public List getTimeVOs() { + return timeVOs; + } + + public void setTimeVOs(List timeVOs) { + this.timeVOs = timeVOs; + } + + public Integer getStockMode() { + return stockMode; + } + + public void setStockMode(Integer stockMode) { + this.stockMode = stockMode; + } + + public Integer getHasStock() { + return hasStock; + } + + public void setHasStock(Integer hasStock) { + this.hasStock = hasStock; + } + + @Override + public String toString() { + return "StationDetailVO{" + + "stationId=" + stationId + + ", userName='" + userName + '\'' + + ", stationName='" + stationName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", defaultStation=" + defaultStation + + ", province='" + province + '\'' + + ", provinceId=" + provinceId + + ", city='" + city + '\'' + + ", cityId=" + cityId + + ", area='" + area + '\'' + + ", areaId=" + areaId + + ", addr='" + addr + '\'' + + ", phonePrefix='" + phonePrefix + '\'' + + ", mobile='" + mobile + '\'' + + ", lat=" + lat + + ", lng=" + lng + + ", distance=" + distance + + ", commonAddr='" + commonAddr + '\'' + + ", id=" + id + + ", timeInfo='" + timeInfo + '\'' + + ", business='" + business + '\'' + + ", timeVOs=" + timeVOs + + ", stockMode=" + stockMode + + ", hasStock=" + hasStock + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SubmitOrderPayInfoVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SubmitOrderPayInfoVO.java new file mode 100644 index 0000000..5644e84 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SubmitOrderPayInfoVO.java @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 提交订单的支付信息 + * + * @author FrozenWatermelon + * @date 2021/2/4 + */ +public class SubmitOrderPayInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品名称") + private List spuNameList; + + @Schema(description = "收货人姓名") + private String consignee; + + @Schema(description = "收货地址") + private String userAddr; + + @Schema(description = "收货人手机号") + private String mobile; + + @Schema(description = "订单过期时间") + private Date endTime; + + @Schema(description = "定金预售支付状态 1.已支付定金 2.已支付尾款") + private Integer preSalePayStatus; + + @Schema(description = "尾款支付开始时间") + private Date balanceStartTime; + + @Schema(description = "总共需要支付金额") + private Long totalFee; + + @Schema(description = "总共需要支付积分(积分抵扣金额)") + private Long totalScore; + + @Schema(description = "总共需要支付积分数量") + private Long orderScore; + + @Schema(description = "订单类型") + private Integer orderType; + + public Integer getPreSalePayStatus() { + return preSalePayStatus; + } + + public void setPreSalePayStatus(Integer preSalePayStatus) { + this.preSalePayStatus = preSalePayStatus; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getUserAddr() { + return userAddr; + } + + public void setUserAddr(String userAddr) { + this.userAddr = userAddr; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getTotalFee() { + return totalFee; + } + + public void setTotalFee(Long totalFee) { + this.totalFee = totalFee; + } + + public Long getTotalScore() { + return totalScore; + } + + public void setTotalScore(Long totalScore) { + this.totalScore = totalScore; + } + + public List getSpuNameList() { + return spuNameList; + } + + public void setSpuNameList(List spuNameList) { + this.spuNameList = spuNameList; + } + + public Long getOrderScore() { + return orderScore; + } + + public void setOrderScore(Long orderScore) { + this.orderScore = orderScore; + } + + public Integer getOrderType() { + return orderType; + } + + public void setOrderType(Integer orderType) { + this.orderType = orderType; + } + + @Override + public String toString() { + return "SubmitOrderPayInfoVO{" + + "spuNameList=" + spuNameList + + ", consignee='" + consignee + '\'' + + ", userAddr='" + userAddr + '\'' + + ", mobile='" + mobile + '\'' + + ", endTime=" + endTime + + ", preSalePayStatus=" + preSalePayStatus + + ", balanceStartTime=" + balanceStartTime + + ", totalFee=" + totalFee + + ", totalScore=" + totalScore + + ", orderScore=" + orderScore + + ", orderType=" + orderType + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SupplierOrderOverviewVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SupplierOrderOverviewVO.java new file mode 100644 index 0000000..870e700 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SupplierOrderOverviewVO.java @@ -0,0 +1,366 @@ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author chiley + * @date 2022/6/27 16:54 + */ + +@Schema(description = "供应商订单概况信息VO") +public class SupplierOrderOverviewVO extends OrderOverviewVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 今天付款金额 + */ + @Schema(description = "今天付款金额") + private Double todayPayActual; + /** + * 昨天付款金额 + */ + @Schema(description = "昨天付款金额") + private Double yesterdayPayActual; + /** + * 较前一日支付金额变化比率 + */ + @Schema(description = "较前一日支付金额变化比率") + private Double yesterdayPayActualRate; + /** + * 时间日期列表 + */ + @Schema(description = "时间日期列表") + private List payDateList; + /** + * 时间日期展示列表 + */ + @Schema(description = "时间日期展示列表") + private List dateToStringList; + /** + * 今天新增客户数 + */ + @Schema(description = "今天新增客户数") + private Integer todayNewUserCount; + /** + * 昨天新增客户数 + */ + @Schema(description = "昨天新增客户数") + private Integer yesterdayNewUserCount; + + /** + * 今日支付客户数 + */ + @Schema(description = "今日支付客户数") + private Integer todayPayUserCount; + /** + * 昨日支付客户数 + */ + @Schema(description = "昨日支付客户数") + private Integer yesterdayPayUserCount; + /** + * 较前一日支付客户数变化比率 + */ + @Schema(description = "较前一日支付客户数变化比率") + private Double yesterdayPayUserRate; + /** + * 今天退款金额 + */ + @Schema(description = "今天退款金额") + private Long todayRefundAmount; + /** + * 昨天退款金额 + */ + @Schema(description = "昨天退款金额") + private Long yesterdayRefundAmount; + /** + * 较前一日退款金额变化比率 + */ + @Schema(description = "较前一日退款金额变化比率") + private Double yesterdayRefundRate; + /** + * 今日销售商品数 + */ + @Schema(description = "今日销售商品数") + private Integer todayProdSoldNums; + /** + * 昨日销售商品数 + */ + @Schema(description = "昨日销售商品数") + private Integer yesterdayProdSoldNums; + /** + * 较前一日销售商品数变化比率 + */ + @Schema(description = "较前一日销售商品数变化比率") + private Double yesterdayProdSoldNumsRate; + /** + * 今天商品销售量列表 + */ + @Schema(description = "今天售出商品数量列表") + private List todayProdSoldCountList; + /** + * 昨天商品销售量列表 + */ + @Schema(description = "昨天售出商品数量列表") + private List yesterdayProdSoldCountList; + + @Schema(description = "以天为单位的交易金额列表") + private List payActualList; + /** + * 客单价 + */ + @Schema(description = "客单价") + private Double onePrice; + /** + * 较前一日客单价变化比率 + */ + @Schema(description = "较前一日客单价变化比率") + private Double yesterdayOnePriceRate; + /** + * 店铺id + */ + @Schema(description = "店铺id") + private Long shopId; + /** + * 店铺名称 + */ + @Schema(description = "店铺名称") + private String shopName; + + public Double getTodayPayActual() { + return todayPayActual; + } + + public void setTodayPayActual(Double todayPayActual) { + this.todayPayActual = todayPayActual; + } + + public Double getYesterdayPayActual() { + return yesterdayPayActual; + } + + public void setYesterdayPayActual(Double yesterdayPayActual) { + this.yesterdayPayActual = yesterdayPayActual; + } + + @Override + public Double getYesterdayPayActualRate() { + return yesterdayPayActualRate; + } + + @Override + public void setYesterdayPayActualRate(Double yesterdayPayActualRate) { + this.yesterdayPayActualRate = yesterdayPayActualRate; + } + + public List getTodayProdSoldCountList() { + return todayProdSoldCountList; + } + + public void setTodayProdSoldCountList(List todayProdSoldCountList) { + this.todayProdSoldCountList = todayProdSoldCountList; + } + + public List getYesterdayProdSoldCountList() { + return yesterdayProdSoldCountList; + } + + public void setYesterdayProdSoldCountList(List yesterdayProdSoldCountList) { + this.yesterdayProdSoldCountList = yesterdayProdSoldCountList; + } + + @Override + public List getPayDateList() { + return payDateList; + } + + @Override + public void setPayDateList(List payDateList) { + this.payDateList = payDateList; + } + + @Override + public List getDateToStringList() { + return dateToStringList; + } + + @Override + public void setDateToStringList(List dateToStringList) { + this.dateToStringList = dateToStringList; + } + + public Integer getTodayNewUserCount() { + return todayNewUserCount; + } + + public void setTodayNewUserCount(Integer todayNewUserCount) { + this.todayNewUserCount = todayNewUserCount; + } + + public Integer getYesterdayNewUserCount() { + return yesterdayNewUserCount; + } + + public void setYesterdayNewUserCount(Integer yesterdayNewUserCount) { + this.yesterdayNewUserCount = yesterdayNewUserCount; + } + + public Integer getTodayPayUserCount() { + return todayPayUserCount; + } + + public void setTodayPayUserCount(Integer todayPayUserCount) { + this.todayPayUserCount = todayPayUserCount; + } + + public Integer getYesterdayPayUserCount() { + return yesterdayPayUserCount; + } + + public void setYesterdayPayUserCount(Integer yesterdayPayUserCount) { + this.yesterdayPayUserCount = yesterdayPayUserCount; + } + + @Override + public Double getYesterdayPayUserRate() { + return yesterdayPayUserRate; + } + + @Override + public void setYesterdayPayUserRate(Double yesterdayPayUserRate) { + this.yesterdayPayUserRate = yesterdayPayUserRate; + } + + public Long getTodayRefundAmount() { + return todayRefundAmount; + } + + public void setTodayRefundAmount(Long todayRefundAmount) { + this.todayRefundAmount = todayRefundAmount; + } + + public Long getYesterdayRefundAmount() { + return yesterdayRefundAmount; + } + + public void setYesterdayRefundAmount(Long yesterdayRefundAmount) { + this.yesterdayRefundAmount = yesterdayRefundAmount; + } + + @Override + public Double getYesterdayRefundRate() { + return yesterdayRefundRate; + } + + @Override + public void setYesterdayRefundRate(Double yesterdayRefundRate) { + this.yesterdayRefundRate = yesterdayRefundRate; + } + + public Integer getTodayProdSoldNums() { + return todayProdSoldNums; + } + + public void setTodayProdSoldNums(Integer todayProdSoldNums) { + this.todayProdSoldNums = todayProdSoldNums; + } + + public Integer getYesterdayProdSoldNums() { + return yesterdayProdSoldNums; + } + + public void setYesterdayProdSoldNums(Integer yesterdayProdSoldNums) { + this.yesterdayProdSoldNums = yesterdayProdSoldNums; + } + + public Double getYesterdayProdSoldNumsRate() { + return yesterdayProdSoldNumsRate; + } + + public void setYesterdayProdSoldNumsRate(Double yesterdayProdSoldNumsRate) { + this.yesterdayProdSoldNumsRate = yesterdayProdSoldNumsRate; + } + + @Override + public List getPayActualList() { + return payActualList; + } + + @Override + public void setPayActualList(List payActualList) { + this.payActualList = payActualList; + } + + @Override + public Double getOnePrice() { + return onePrice; + } + + @Override + public void setOnePrice(Double onePrice) { + this.onePrice = onePrice; + } + + @Override + public Double getYesterdayOnePriceRate() { + return yesterdayOnePriceRate; + } + + @Override + public void setYesterdayOnePriceRate(Double yesterdayOnePriceRate) { + this.yesterdayOnePriceRate = yesterdayOnePriceRate; + } + + @Override + public Long getShopId() { + return shopId; + } + + @Override + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String getShopName() { + return shopName; + } + + @Override + public void setShopName(String shopName) { + this.shopName = shopName; + } + + @Override + public String toString() { + return "SupplierOrderOverviewVO{" + + "todayPayActual=" + todayPayActual + + ", yesterdayPayActual=" + yesterdayPayActual + + ", yesterdayPayActualRate=" + yesterdayPayActualRate + + ", payDateList=" + payDateList + + ", dateToStringList=" + dateToStringList + + ", todayNewUserCount=" + todayNewUserCount + + ", yesterdayNewUserCount=" + yesterdayNewUserCount + + ", todayPayUserCount=" + todayPayUserCount + + ", yesterdayPayUserCount=" + yesterdayPayUserCount + + ", yesterdayPayUserRate=" + yesterdayPayUserRate + + ", todayRefundAmount=" + todayRefundAmount + + ", yesterdayRefundAmount=" + yesterdayRefundAmount + + ", yesterdayRefundRate=" + yesterdayRefundRate + + ", todayProdSoldNums=" + todayProdSoldNums + + ", yesterdayProdSoldNums=" + yesterdayProdSoldNums + + ", yesterdayProdSoldNumsRate=" + yesterdayProdSoldNumsRate + + ", todayProdSoldCountList=" + todayProdSoldCountList + + ", yesterdayProdSoldCountList=" + yesterdayProdSoldCountList + + ", payActualList=" + payActualList + + ", onePrice=" + onePrice + + ", yesterdayOnePriceRate=" + yesterdayOnePriceRate + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SupplierUnDeliveryOrderExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SupplierUnDeliveryOrderExcelVO.java new file mode 100644 index 0000000..fdc2810 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/SupplierUnDeliveryOrderExcelVO.java @@ -0,0 +1,165 @@ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-07-20 + */ +public class SupplierUnDeliveryOrderExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "待发货订单信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7}; + + @ExcelProperty(value = {"订单信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"订单信息", "订单ID"}, index = 1) + private String orderId; + + @ExcelProperty(value = {"物流信息", "配送方式*"}, index = 2) + private String deliveryType; + + @ExcelProperty(value = {"物流信息", "快递公司名称*(配送方式为快递配送时必填)"}, index = 3) + private String deliveryCompanyName; + + @ExcelProperty(value = {"物流信息", "快递单号*(配送方式为快递配送时必填)"}, index = 4) + private String deliveryNo; + + @ExcelProperty(value = {"物流信息", "收货人姓名"}, index = 5) + private String consignee; + + @ExcelProperty(value = {"物流信息", "收货人手机"}, index = 6) + private String mobile; + + @ExcelProperty(value = {"物流信息", "收货地址"}, index = 7) + private String receivingAddr; + + @ExcelProperty(value = {"订单项信息", "商品名称"}, index = 8) + private String spuName; + + @ExcelProperty(value = {"订单项信息", "sku名称"}, index = 9) + private String skuName; + + @ExcelProperty(value = {"订单项信息", "商品待发货数量"}, index = 10) + private Integer count; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public String getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(String deliveryType) { + this.deliveryType = deliveryType; + } + + public String getDeliveryCompanyName() { + return deliveryCompanyName; + } + + public void setDeliveryCompanyName(String deliveryCompanyName) { + this.deliveryCompanyName = deliveryCompanyName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "SupplierUnDeliveryOrderExcelVO{" + + "seq='" + seq + '\'' + + ", orderId='" + orderId + '\'' + + ", deliveryType='" + deliveryType + '\'' + + ", deliveryCompanyName='" + deliveryCompanyName + '\'' + + ", deliveryNo='" + deliveryNo + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/TimeVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/TimeVO.java new file mode 100644 index 0000000..c32e1e0 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/TimeVO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author Yami + */ +public class TimeVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "当前日期") + private String dateTime; + + @Schema(description = "当前营业时间集合") + private List hourTimes; + + public String getDateTime() { + return dateTime; + } + + public void setDateTime(String dateTime) { + this.dateTime = dateTime; + } + + public List getHourTimes() { + return hourTimes; + } + + public void setHourTimes(List hourTimes) { + this.hourTimes = hourTimes; + } + + public TimeVO(String dateTime, List hourTimes) { + this.dateTime = dateTime; + this.hourTimes = hourTimes; + } + + @Override + public String toString() { + return "TimeVO{" + + "dateTime='" + dateTime + '\'' + + ", hourTimes=" + hourTimes + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/UnDeliveryOrderExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/UnDeliveryOrderExcelVO.java new file mode 100644 index 0000000..8f09d02 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/UnDeliveryOrderExcelVO.java @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 待发货订单信息 + * + * @author Pineapple + * @date 2021/7/19 9:28 + */ +public class UnDeliveryOrderExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "待发货订单信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7}; + + @ExcelProperty(value = {"订单信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"订单信息", "订单ID"}, index = 1) + private String orderId; + + @ExcelProperty(value = {"物流信息", "配送方式*"}, index = 2) + private String deliveryType; + + @ExcelProperty(value = {"物流信息", "快递公司名称*(配送方式为快递配送时必填)"}, index = 3) + private String deliveryCompanyName; + + @ExcelProperty(value = {"物流信息", "快递单号*(配送方式为快递配送时必填)"}, index = 4) + private String deliveryNo; + + @ExcelProperty(value = {"物流信息", "收货人姓名"}, index = 5) + private String consignee; + + @ExcelProperty(value = {"物流信息", "收货人手机"}, index = 6) + private String mobile; + + @ExcelProperty(value = {"物流信息", "收货地址"}, index = 7) + private String receivingAddr; + + @ExcelProperty({"订单项信息", "商品名称"}) + private String spuName; + + @ExcelProperty({"订单项信息", "sku名称"}) + private String skuName; + + @ExcelProperty({"订单项信息", "商品待发货数量"}) + private Integer count; + + @ExcelProperty({"订单项信息", "赠品名称"}) + private String giveawayName; + + @ExcelProperty({"订单项信息", "赠品数量"}) + private Integer giveawayCount; + + /** + * 订单项列表 + */ + @ExcelIgnore + private List orderItemList; + + public List getOrderItemList() { + return orderItemList; + } + + public void setOrderItemList(List orderItemList) { + this.orderItemList = orderItemList; + } + + public String getGiveawayName() { + return giveawayName; + } + + public void setGiveawayName(String giveawayName) { + this.giveawayName = giveawayName; + } + + public Integer getGiveawayCount() { + return giveawayCount; + } + + public void setGiveawayCount(Integer giveawayCount) { + this.giveawayCount = giveawayCount; + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public String getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(String deliveryType) { + this.deliveryType = deliveryType; + } + + public String getDeliveryCompanyName() { + return deliveryCompanyName; + } + + public void setDeliveryCompanyName(String deliveryCompanyName) { + this.deliveryCompanyName = deliveryCompanyName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "UnDeliveryOrderExcelVO{" + + "seq='" + seq + '\'' + + ", orderId='" + orderId + '\'' + + ", deliveryType='" + deliveryType + '\'' + + ", deliveryCompanyName='" + deliveryCompanyName + '\'' + + ", deliveryNo='" + deliveryNo + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", count=" + count + + ", giveawayName='" + giveawayName + '\'' + + ", giveawayCount=" + giveawayCount + + ", orderItemList=" + orderItemList + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/UnDeliveryPurchaseOrderExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/UnDeliveryPurchaseOrderExcelVO.java new file mode 100644 index 0000000..8940497 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/UnDeliveryPurchaseOrderExcelVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 采购订单VO + * + * @author lhd + * @date 2022-06-22 17:12:02 + */ +public class UnDeliveryPurchaseOrderExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "待发货订单信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7}; + + @ExcelProperty(value = {"订单信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"订单信息", "订单ID"}, index = 1) + private String purchaseOrderId; + + @ExcelProperty(value = {"物流信息", "配送方式*"}, index = 2) + private String deliveryType; + + @ExcelProperty(value = {"物流信息", "快递公司名称*(配送方式为快递配送时必填)"}, index = 3) + private String deliveryCompanyName; + + @ExcelProperty(value = {"物流信息", "快递单号*(配送方式为快递配送时必填)"}, index = 4) + private String deliveryNo; + + @ExcelProperty(value = {"物流信息", "收货人姓名"}, index = 5) + private String consignee; + + @ExcelProperty(value = {"物流信息", "收货人手机"}, index = 6) + private String mobile; + + @ExcelProperty(value = {"物流信息", "收货地址"}, index = 7) + private String receivingAddr; + + @ExcelProperty({"订单项信息", "商品名称"}) + private String spuName; + + @ExcelProperty({"订单项信息", "sku名称"}) + private String skuName; + + @ExcelProperty({"订单项信息", "商品待发货数量"}) + private Integer count; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(String purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public String getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(String deliveryType) { + this.deliveryType = deliveryType; + } + + public String getDeliveryCompanyName() { + return deliveryCompanyName; + } + + public void setDeliveryCompanyName(String deliveryCompanyName) { + this.deliveryCompanyName = deliveryCompanyName; + } + + public String getDeliveryNo() { + return deliveryNo; + } + + public void setDeliveryNo(String deliveryNo) { + this.deliveryNo = deliveryNo; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getReceivingAddr() { + return receivingAddr; + } + + public void setReceivingAddr(String receivingAddr) { + this.receivingAddr = receivingAddr; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "UnDeliveryOrderExcelVO{" + + "seq='" + seq + '\'' + + ", purchaseOrderId=" + purchaseOrderId + + ", deliveryType='" + deliveryType + '\'' + + ", deliveryCompanyName='" + deliveryCompanyName + '\'' + + ", deliveryNo='" + deliveryNo + '\'' + + ", consignee='" + consignee + '\'' + + ", mobile='" + mobile + '\'' + + ", receivingAddr='" + receivingAddr + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoFinanceOrderDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoFinanceOrderDetailVO.java new file mode 100644 index 0000000..9556e0b --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoFinanceOrderDetailVO.java @@ -0,0 +1,218 @@ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author TRACK + */ +@Document("order") +public class MongoFinanceOrderDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "交易时间") + private Date transDate; + + @Schema(description = "订单号") + private String orderId; + + @Schema(description = "下单时间") + private Date placeTime; + + @Schema(description = "交易摘要") + private String prodName; + + @Schema(description = "商品名称列表") + private List prodNames; + + @Schema(description = "发生渠道") + private String shopName; + + @Schema(description = "资金变更申请人") + private String userName; + + @Schema(description = "业务类型 1.订单支付 2.订单退款 3.余额充值 4.购买会员") + private Integer bizType; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式 -1.不限") + private Integer payType; + + @Schema(description = "收支金额") + private Long transAmount; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "支付多单订单号") + private String orderIds; + + @Schema(description = "支付交易单号") + private String payIds; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "用户id") + private Long userId; + + public Date getTransDate() { + return transDate; + } + + public void setTransDate(Date transDate) { + this.transDate = transDate; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Date getPlaceTime() { + return placeTime; + } + + public void setPlaceTime(Date placeTime) { + this.placeTime = placeTime; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public List getProdNames() { + return prodNames; + } + + public void setProdNames(List prodNames) { + this.prodNames = prodNames; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getTransAmount() { + return transAmount; + } + + public void setTransAmount(Long transAmount) { + this.transAmount = transAmount; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "MongoFinanceOrderDetailVO{" + + "transDate=" + transDate + + ", orderId=" + orderId + + ", placeTime=" + placeTime + + ", prodName='" + prodName + '\'' + + ", prodNames=" + prodNames + + ", shopName='" + shopName + '\'' + + ", userName='" + userName + '\'' + + ", bizType=" + bizType + + ", payType=" + payType + + ", transAmount=" + transAmount + + ", payId=" + payId + + ", refundId=" + refundId + + ", orderIds='" + orderIds + '\'' + + ", payIds='" + payIds + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderFormExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderFormExcelVO.java new file mode 100644 index 0000000..2d84c58 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderFormExcelVO.java @@ -0,0 +1,242 @@ +package com.tmerclub.cloud.order.vo.mongo; + +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("order") +public class MongoOrderFormExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 时间(报表中显示的时间字符串) + */ + private String formatTime; + + /** + * 下单金额 + */ + private Long orderAmount; + /** + * 下单笔数 + */ + private Integer orderNums; + + /** + * 下单商品数 + */ + private Integer productNums; + + /** + * 下单人数 + */ + private Integer userNums; + + /** + * 自营金额 + */ + private Long selfOperatedAmount; + + /** + * 自营订单数 + */ + private Integer selfOperatedOrderNums; + + /** + * 自营商品数 + */ + private Integer selfOperatedProductNums; + + /** + * 自营下单人数 + */ + private Integer selfOperatedUserNums; + + /** + * 支付金额 + */ + private Long payAmount; + + /** + * 支付订单数 + */ + private Integer payOrderNums; + + /** + * 支付商品数 + */ + private Integer payProductNums; + + /** + * 支付人数 + */ + private Integer payUserNums; + + /** + * 退款金额 + */ + private Long refundAmount; + /** + * 退款订单数 + */ + private Integer refundOrderNums; + + /** + * 平台补贴金额 + */ + private Long platformAmount; + + public String getFormatTime() { + return formatTime; + } + + public void setFormatTime(String formatTime) { + this.formatTime = formatTime; + } + + public Long getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(Long orderAmount) { + this.orderAmount = orderAmount; + } + + public Integer getOrderNums() { + return orderNums; + } + + public void setOrderNums(Integer orderNums) { + this.orderNums = orderNums; + } + + public Integer getProductNums() { + return productNums; + } + + public void setProductNums(Integer productNums) { + this.productNums = productNums; + } + + public Integer getUserNums() { + return userNums; + } + + public void setUserNums(Integer userNums) { + this.userNums = userNums; + } + + public Long getSelfOperatedAmount() { + return selfOperatedAmount; + } + + public void setSelfOperatedAmount(Long selfOperatedAmount) { + this.selfOperatedAmount = selfOperatedAmount; + } + + public Integer getSelfOperatedOrderNums() { + return selfOperatedOrderNums; + } + + public void setSelfOperatedOrderNums(Integer selfOperatedOrderNums) { + this.selfOperatedOrderNums = selfOperatedOrderNums; + } + + public Integer getSelfOperatedProductNums() { + return selfOperatedProductNums; + } + + public void setSelfOperatedProductNums(Integer selfOperatedProductNums) { + this.selfOperatedProductNums = selfOperatedProductNums; + } + + public Integer getSelfOperatedUserNums() { + return selfOperatedUserNums; + } + + public void setSelfOperatedUserNums(Integer selfOperatedUserNums) { + this.selfOperatedUserNums = selfOperatedUserNums; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + public Integer getPayOrderNums() { + return payOrderNums; + } + + public void setPayOrderNums(Integer payOrderNums) { + this.payOrderNums = payOrderNums; + } + + public Integer getPayProductNums() { + return payProductNums; + } + + public void setPayProductNums(Integer payProductNums) { + this.payProductNums = payProductNums; + } + + public Integer getPayUserNums() { + return payUserNums; + } + + public void setPayUserNums(Integer payUserNums) { + this.payUserNums = payUserNums; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getRefundOrderNums() { + return refundOrderNums; + } + + public void setRefundOrderNums(Integer refundOrderNums) { + this.refundOrderNums = refundOrderNums; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + @Override + public String toString() { + return "MongoOrderFormExcelVO{" + + "formatTime='" + formatTime + '\'' + + ", orderAmount=" + orderAmount + + ", platformAmount=" + platformAmount + + ", orderNums=" + orderNums + + ", productNums=" + productNums + + ", userNums=" + userNums + + ", selfOperatedAmount=" + selfOperatedAmount + + ", selfOperatedOrderNums=" + selfOperatedOrderNums + + ", selfOperatedProductNums=" + selfOperatedProductNums + + ", selfOperatedUserNums=" + selfOperatedUserNums + + ", payAmount=" + payAmount + + ", payOrderNums=" + payOrderNums + + ", payProductNums=" + payProductNums + + ", payUserNums=" + payUserNums + + ", refundAmount=" + refundAmount + + ", refundOrderNums=" + refundOrderNums + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundFormExcelVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundFormExcelVO.java new file mode 100644 index 0000000..60ff3cb --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundFormExcelVO.java @@ -0,0 +1,76 @@ +package com.tmerclub.cloud.order.vo.mongo; + +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("order_refund") +public class MongoOrderRefundFormExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 时间(报表中显示的时间字符串) + */ + private String formatTime; + + /** + * 退款金额 + */ + private Long refundAmount; + + /** + * 退还平台的补贴金额 + */ + private Long platformRefundAmount; + /** + * 退款订单数 + */ + private Integer refundOrderNums; + + public String getFormatTime() { + return formatTime; + } + + public void setFormatTime(String formatTime) { + this.formatTime = formatTime; + } + + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + public Integer getRefundOrderNums() { + return refundOrderNums; + } + + public void setRefundOrderNums(Integer refundOrderNums) { + this.refundOrderNums = refundOrderNums; + } + + public Long getPlatformRefundAmount() { + return platformRefundAmount; + } + + public void setPlatformRefundAmount(Long platformRefundAmount) { + this.platformRefundAmount = platformRefundAmount; + } + + @Override + public String toString() { + return "MongoOrderRefundFormExcelVO{" + + "formatTime='" + formatTime + '\'' + + ", refundAmount=" + refundAmount + + ", platformRefundAmount=" + platformRefundAmount + + ", refundOrderNums=" + refundOrderNums + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundInfoVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundInfoVO.java new file mode 100644 index 0000000..2ca9e3f --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderRefundInfoVO.java @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo.mongo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 退款信息VO + * + * @author FrozenWatermelon + * @date 2021-03-15 15:26:03 + */ +@Document("order_refund") +public class MongoOrderRefundInfoVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "关联的支付订单id") + private Long orderId; + + @Schema(description = "关联的支付单id") + private Long payId; + + @Schema(description = "回调时间") + private Date callbackTime; + + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "退款时间") + private Date refundTime; + + @Schema(description = "退款入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long refundAmount; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Date getCallbackTime() { + return callbackTime; + } + + public void setCallbackTime(Date callbackTime) { + this.callbackTime = callbackTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + @Override + public String toString() { + return "MongoOrderRefundInfoVO{" + + "refundId=" + refundId + + ", orderId=" + orderId + + ", payId=" + payId + + ", callbackTime=" + callbackTime + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", refundTime=" + refundTime + + ", payEntry=" + payEntry + + ", payType=" + payType + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", refundAmount=" + refundAmount + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderStatisticsVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderStatisticsVO.java new file mode 100644 index 0000000..6756948 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoOrderStatisticsVO.java @@ -0,0 +1,541 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo.mongo; + +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lth + */ +@Document("order") +public class MongoOrderStatisticsVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 订单id + */ + private Long orderId; + + /** + * 支付客户数 + */ + private Integer payUserCount; + /** + * 支付订单数 + */ + private Integer payOrderCount; + /** + * 支付商品数 + */ + private Integer payProdCount; + /** + * 实际支付金额 + */ + private Double actualTotal; + /** + * 平台优惠金额 + */ + private Long platformAmount; + /** + * 时间 + */ + private String timeData; + /** + * 当前月 + */ + private String currentMonth; + /** + * 退单数 + */ + private Integer chargebackCount; + /** + * 订单数 + */ + private Integer allCount; + /** + * 待付款订单数 + */ + private Integer unPay; + /** + * 待发货订单数 + */ + private Integer payed; + /** + * 待收货订单数 + */ + private Integer consignment; + /** + * 已完成订单数 + */ + private Long success; + /** + * 商品id + */ + private Long spuId; + /** + * 商品名称 + */ + private String spuName; + /** + * 商品中文名称 + */ + private String spuNameZh; + /** + * 商品英文名称 + */ + private String spuNameEn; + /** + * 商品英文名称 + */ + private Long payActual; + /** + * 店铺id + */ + private Long shopId; + /** + * 活动id + */ + private Long activityId; + /** + * 支付时间 + */ + private Date payTime; + /** + * 消费金额 + */ + private Long consAmount; + /** + * 商品总金额 + */ + private Long total; + /** + * 运费 + */ + private Long freightAmount; + /** + * 实付金额 + */ + private Long actualAmount; + /** + * 消费次数 + */ + private Long consTimes; + /** + * 优惠总金额 + */ + private Long reduceAmount; + /** + * 总金额 + */ + private Long totalAmount; + /** + * 用户id + */ + private Long userId; + /** + * 用户类型 1:新成交用户 0:老成交用户 + */ + private Integer userType; + /** + * 下单人数 + */ + private Integer placeOrderPerson; + /** + * 支付人数 + */ + private Integer payPerson; + /** + * 下单商品件数 + */ + private Integer placeOrderNum; + /** + * 支付商品件数 + */ + private Integer payNum; + /** + * 商品下单金额 + */ + private Double placeOrderAmount; + /** + * 商品支付金额 + */ + private Double payAmount; + + /** + * 支付成功订单数,计算退款率使用 + */ + private Integer payOrderNum; + + /** + * 是否已支付,1.已支付0.未支付 + */ + private Integer isPayed; + + public Integer getPayUserCount() { + return payUserCount; + } + + public void setPayUserCount(Integer payUserCount) { + this.payUserCount = payUserCount; + } + + public Integer getPayOrderCount() { + return payOrderCount; + } + + public void setPayOrderCount(Integer payOrderCount) { + this.payOrderCount = payOrderCount; + } + + public Double getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Double actualTotal) { + this.actualTotal = actualTotal; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } + + public String getTimeData() { + return timeData; + } + + public void setTimeData(String timeData) { + this.timeData = timeData; + } + + public Integer getChargebackCount() { + return chargebackCount; + } + + public void setChargebackCount(Integer chargebackCount) { + this.chargebackCount = chargebackCount; + } + + public Integer getAllCount() { + return allCount; + } + + public void setAllCount(Integer allCount) { + this.allCount = allCount; + } + + public Integer getUnPay() { + return unPay; + } + + public void setUnPay(Integer unPay) { + this.unPay = unPay; + } + + public Integer getPayed() { + return payed; + } + + public void setPayed(Integer payed) { + this.payed = payed; + } + + public Integer getConsignment() { + return consignment; + } + + public void setConsignment(Integer consignment) { + this.consignment = consignment; + } + + public Long getSuccess() { + return success; + } + + public void setSuccess(Long success) { + this.success = success; + } + + public String getSpuNameZh() { + return spuNameZh; + } + + public void setSpuNameZh(String spuNameZh) { + this.spuNameZh = spuNameZh; + } + + public String getSpuNameEn() { + return spuNameEn; + } + + public void setSpuNameEn(String spuNameEn) { + this.spuNameEn = spuNameEn; + } + + public Long getPayActual() { + return payActual; + } + + public void setPayActual(Long payActual) { + this.payActual = payActual; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Long getConsAmount() { + return consAmount; + } + + public void setConsAmount(Long consAmount) { + this.consAmount = consAmount; + } + + public Long getActualAmount() { + return actualAmount; + } + + public void setActualAmount(Long actualAmount) { + this.actualAmount = actualAmount; + } + + public Long getConsTimes() { + return consTimes; + } + + public void setConsTimes(Long consTimes) { + this.consTimes = consTimes; + } + + public Long getReduceAmount() { + return reduceAmount; + } + + public void setReduceAmount(Long reduceAmount) { + this.reduceAmount = reduceAmount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public String getCurrentMonth() { + return currentMonth; + } + + public void setCurrentMonth(String currentMonth) { + this.currentMonth = currentMonth; + } + + public Integer getPayProdCount() { + return payProdCount; + } + + public void setPayProdCount(Integer payProdCount) { + this.payProdCount = payProdCount; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getPlaceOrderPerson() { + return placeOrderPerson; + } + + public void setPlaceOrderPerson(Integer placeOrderPerson) { + this.placeOrderPerson = placeOrderPerson; + } + + public Integer getPayPerson() { + return payPerson; + } + + public void setPayPerson(Integer payPerson) { + this.payPerson = payPerson; + } + + public Integer getPlaceOrderNum() { + return placeOrderNum; + } + + public void setPlaceOrderNum(Integer placeOrderNum) { + this.placeOrderNum = placeOrderNum; + } + + public Integer getPayNum() { + return payNum; + } + + public void setPayNum(Integer payNum) { + this.payNum = payNum; + } + + public Double getPlaceOrderAmount() { + return placeOrderAmount; + } + + public void setPlaceOrderAmount(Double placeOrderAmount) { + this.placeOrderAmount = placeOrderAmount; + } + + public Double getPayAmount() { + return payAmount; + } + + public void setPayAmount(Double payAmount) { + this.payAmount = payAmount; + } + + public Integer getPayOrderNum() { + return payOrderNum; + } + + public void setPayOrderNum(Integer payOrderNum) { + this.payOrderNum = payOrderNum; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Long getFreightAmount() { + return freightAmount; + } + + public void setFreightAmount(Long freightAmount) { + this.freightAmount = freightAmount; + } + + @Override + public String toString() { + return "MongoOrderStatisticsVO{" + + "orderId=" + orderId + + ", payUserCount=" + payUserCount + + ", payOrderCount=" + payOrderCount + + ", payProdCount=" + payProdCount + + ", actualTotal=" + actualTotal + + ", platformAmount=" + platformAmount + + ", timeData='" + timeData + '\'' + + ", currentMonth='" + currentMonth + '\'' + + ", chargebackCount=" + chargebackCount + + ", allCount=" + allCount + + ", unPay=" + unPay + + ", payed=" + payed + + ", consignment=" + consignment + + ", success=" + success + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", spuNameZh='" + spuNameZh + '\'' + + ", spuNameEn='" + spuNameEn + '\'' + + ", payActual=" + payActual + + ", shopId=" + shopId + + ", activityId=" + activityId + + ", payTime=" + payTime + + ", consAmount=" + consAmount + + ", total=" + total + + ", freightAmount=" + freightAmount + + ", actualAmount=" + actualAmount + + ", consTimes=" + consTimes + + ", reduceAmount=" + reduceAmount + + ", totalAmount=" + totalAmount + + ", userId=" + userId + + ", userType=" + userType + + ", placeOrderPerson=" + placeOrderPerson + + ", payPerson=" + payPerson + + ", placeOrderNum=" + placeOrderNum + + ", payNum=" + payNum + + ", placeOrderAmount=" + placeOrderAmount + + ", payAmount=" + payAmount + + ", payOrderNum=" + payOrderNum + + ", isPayed=" + isPayed + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoShopAccountOrderDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoShopAccountOrderDetailVO.java new file mode 100644 index 0000000..0ccffd2 --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoShopAccountOrderDetailVO.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("order") +public class MongoShopAccountOrderDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分数目") + private Long scoreCount; + + @Schema(description = "合计") + private Long total; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "实付金额") + private Long actualTotal; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + @Override + public String toString() { + return "ShopAccountOrderDetailVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", total=" + total + + ", payType=" + payType + + ", actualTotal=" + actualTotal + + '}'; + } +} diff --git a/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoShopAccountOrderRefundDetailVO.java b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoShopAccountOrderRefundDetailVO.java new file mode 100644 index 0000000..8aca68d --- /dev/null +++ b/tmerclub-order/src/main/java/com/tmerclub/cloud/order/vo/mongo/MongoShopAccountOrderRefundDetailVO.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.order.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("order_refund") +public class MongoShopAccountOrderRefundDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分数目") + private Long scoreCount; + + @Schema(description = "合计") + private Long total; + + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "实付金额") + private Long actualTotal; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getActualTotal() { + return actualTotal; + } + + public void setActualTotal(Long actualTotal) { + this.actualTotal = actualTotal; + } + + @Override + public String toString() { + return "ShopAccountOrderDetailVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", total=" + total + + ", payType=" + payType + + ", actualTotal=" + actualTotal + + '}'; + } +} diff --git a/tmerclub-order/src/main/resources/bootstrap.yml b/tmerclub-order/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..59dafdb --- /dev/null +++ b/tmerclub-order/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +server: + port: ${MALL4CLOUD_PORT:9106} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9506} diff --git a/tmerclub-order/src/main/resources/logback.xml b/tmerclub-order/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-order/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/AllotOrderItemMapper.xml b/tmerclub-order/src/main/resources/mapper/AllotOrderItemMapper.xml new file mode 100644 index 0000000..ac10b22 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/AllotOrderItemMapper.xml @@ -0,0 +1,49 @@ + + + + + + + INSERT INTO `allot_order_item`(`allot_order_item_id`, `allot_order_id`, `spu_id`, `sku_id`, `allot_count`, `allot_in_count`, `create_time`, + `update_time`) + VALUES + + (#{allotOrderItem.allotOrderItemId}, #{allotOrderItem.allotOrderId}, #{allotOrderItem.spuId}, #{allotOrderItem.skuId}, + #{allotOrderItem.allotCount}, #{allotOrderItem.allotInCount}, #{allotOrderItem.createTime}, #{allotOrderItem.updateTime}) + + + + + + UPDATE + allot_order_item + + + allot_in_count = #{allotOrderItem.allotInCount}, + + + update_time = #{allotOrderItem.updateTime} + + + WHERE + allot_order_id = #{allotOrderItem.allotOrderId} + AND allot_order_item_id = #{allotOrderItem.allotOrderItemId}; + + + + + UPDATE + allot_order_item + + + allot_in_count = #{allotOrderItem.allotInCount}, + + + update_time = #{allotOrderItem.updateTime} + + + WHERE + allot_order_id = #{allotOrderItem.allotOrderId} + AND allot_order_item_id = #{allotOrderItem.allotOrderItemId} + + \ No newline at end of file diff --git a/tmerclub-order/src/main/resources/mapper/DeliveryCompanyMapper.xml b/tmerclub-order/src/main/resources/mapper/DeliveryCompanyMapper.xml new file mode 100644 index 0000000..a37eaf3 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/DeliveryCompanyMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + `delivery_company_id`,`create_time`,`update_time`,`name`,`home_url`,`ali_no`,`bird_no`,`hundred_no`,`other_no` + + + + + + insert into delivery_company (`name`,`home_url`,`ali_no`,`bird_no`,`hundred_no`,`other_no`) + values (#{deliveryCompany.name},#{deliveryCompany.homeUrl},#{deliveryCompany.aliNo},#{deliveryCompany.birdNo},#{deliveryCompany.hundredNo},#{deliveryCompany.otherNo}); + + + update delivery_company + + + `name` = #{deliveryCompany.name}, + + + `home_url` = #{deliveryCompany.homeUrl}, + + + `ali_no` = #{deliveryCompany.aliNo}, + + + `bird_no` = #{deliveryCompany.birdNo}, + + + `hundred_no` = #{deliveryCompany.hundredNo}, + + + `other_no` = #{deliveryCompany.otherNo}, + + + where delivery_company_id = #{deliveryCompany.deliveryCompanyId} + + + delete from delivery_company where delivery_company_id = #{deliveryCompanyId} + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/DeliveryOrderItemMapper.xml b/tmerclub-order/src/main/resources/mapper/DeliveryOrderItemMapper.xml new file mode 100644 index 0000000..435539e --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/DeliveryOrderItemMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + `delivery_order_item_id`, + `create_time`, + `update_time`, + `delivery_order_id`, + `img_url`, + `spu_name`, + `supplier_img_url`, + `supplier_spu_name`, + `count` + + + + insert into delivery_order_item (`delivery_order_item_id`, `delivery_order_id`, `img_url`, `spu_name`, `count`) + values (#{deliveryOrderItem.deliveryOrderItemId}, #{deliveryOrderItem.deliveryOrderId}, #{deliveryOrderItem.imgUrl}, #{deliveryOrderItem.spuName}, + #{deliveryOrderItem.count}); + + + update delivery_order_item + + + `delivery_order_id` = #{deliveryOrderItem.deliveryOrderId}, + + + `img_url` = #{deliveryOrderItem.imgUrl}, + + + `spu_name` = #{deliveryOrderItem.spuName}, + + + `count` = #{deliveryOrderItem.count}, + + + `supplier_spu_name` = #{deliveryOrderItem.supplierSpuName}, + + + `supplier_img_url` = #{deliveryOrderItem.supplierImgUrl}, + + + where delivery_order_item_id = #{deliveryOrderItem.deliveryOrderItemId} + + + delete + from delivery_order_item + where delivery_order_item_id = #{id} + + + + insert into delivery_order_item (`delivery_order_item_id`, `delivery_order_id`, `img_url`, `spu_name`, `count`, `supplier_img_url`, `supplier_spu_name`) + values + + (#{deliveryOrderItem.deliveryOrderItemId}, #{deliveryOrderItem.deliveryOrderId}, #{deliveryOrderItem.imgUrl}, #{deliveryOrderItem.spuName}, #{deliveryOrderItem.count}, + #{deliveryOrderItem.supplierImgUrl}, #{deliveryOrderItem.supplierSpuName}) + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/DeliveryOrderMapper.xml b/tmerclub-order/src/main/resources/mapper/DeliveryOrderMapper.xml new file mode 100644 index 0000000..5a0b9a6 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/DeliveryOrderMapper.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `delivery_order_id`, + `create_time`, + `update_time`, + `order_id`, + `delivery_company_id`, + `delivery_no`, + `consignee_name`, + `consignee_mobile`, + `status`, + `all_count`, + `delete_time`, + `delivery_type` + + + dor.`delivery_order_id`, + dor.`create_time`, + dor.`update_time`, + dor.`order_id`, + dor.`delivery_company_id`, + dor.`delivery_no`, + dor.`consignee_name`, + dor.`consignee_mobile`, + dor.`status`, + dor.`all_count`, + dor.`delete_time`, + dor.`delivery_type` + + + + insert into delivery_order (`delivery_order_id`, `order_id`, `user_id`, `delivery_company_id`, `delivery_no`, `consignee_name`, + `consignee_mobile`, `status`, `all_count`, `delete_time`,`delivery_type`) + values (#{deliveryOrder.deliveryOrderId}, #{deliveryOrder.orderId}, #{deliveryOrder.userId}, #{deliveryOrder.deliveryCompanyId}, #{deliveryOrder.deliveryNo}, + #{deliveryOrder.consigneeName}, #{deliveryOrder.consigneeMobile}, #{deliveryOrder.status}, + #{deliveryOrder.allCount}, #{deliveryOrder.deleteTime},#{deliveryOrder.deliveryType}); + + + update delivery_order + + + `delivery_company_id` = #{deliveryOrder.deliveryCompanyId}, + + + `delivery_no` = #{deliveryOrder.deliveryNo}, + + + `consignee_name` = #{deliveryOrder.consigneeName}, + + + `consignee_mobile` = #{deliveryOrder.consigneeMobile}, + + + `status` = #{deliveryOrder.status}, + + + `all_count` = #{deliveryOrder.allCount}, + + + `delete_time` = #{deliveryOrder.deleteTime}, + + + `delivery_type` = #{deliveryOrder.deliveryType}, + + + where delivery_order_id = #{deliveryOrder.deliveryOrderId} + + + delete + from delivery_order + where delivery_order_id = #{deliveryOrderId} + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderInvoiceMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderInvoiceMapper.xml new file mode 100644 index 0000000..d8f7cea --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderInvoiceMapper.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `order_invoice_id`,`order_id`,`shop_id`,`supplier_id`,`invoice_type`,`invoice_context`,`header_type`,`invoice_state`,`header_name`,`invoice_tax_number`,`file_id`,`application_time`,`upload_time` + + + oi.`order_invoice_id`, + oi.`order_id`, + oi.`shop_id`, + oi.`supplier_id`, + oi.`invoice_type`, + oi.`invoice_context`, + oi.`header_type`, + oi.`invoice_state`, + oi.`header_name`, + oi.`invoice_tax_number`, + oi.`file_id`, + oi.`application_time`, + oi.`upload_time` + + + + insert into order_invoice (`order_invoice_id`,`order_id`,`shop_id`,`supplier_id`,`invoice_type`,`invoice_context`,`invoice_state`,`header_type`,`header_name`,`invoice_tax_number`,`file_id`,`application_time`,`upload_time`) + values (#{orderInvoice.orderInvoiceId},#{orderInvoice.orderId},#{orderInvoice.shopId},#{orderInvoice.supplierId},#{orderInvoice.invoiceType},#{orderInvoice.invoiceContext},#{orderInvoice.invoiceState},#{orderInvoice.headerType},#{orderInvoice.headerName},#{orderInvoice.invoiceTaxNumber},#{orderInvoice.fileId},#{orderInvoice.applicationTime},#{orderInvoice.uploadTime}); + + + + insert into order_invoice (`order_invoice_id`,`order_id`,`shop_id`,`supplier_id`,`invoice_type`,`invoice_context`,`invoice_state`,`header_type`,`header_name`,`invoice_tax_number`,`file_id`,`application_time`,`upload_time`) values + + (#{orderInvoice.orderInvoiceId},#{orderInvoice.orderId},#{orderInvoice.shopId},#{orderInvoice.supplierId},#{orderInvoice.invoiceType},#{orderInvoice.invoiceContext},#{orderInvoice.invoiceState},#{orderInvoice.headerType},#{orderInvoice.headerName},#{orderInvoice.invoiceTaxNumber},#{orderInvoice.fileId},#{orderInvoice.applicationTime},#{orderInvoice.uploadTime}) + + + + + update order_invoice + + + `invoice_type` = #{orderInvoice.invoiceType}, + + + `invoice_context` = #{orderInvoice.invoiceContext}, + + + `header_type` = #{orderInvoice.headerType}, + + + `invoice_state` = #{orderInvoice.invoiceState}, + + + `header_name` = #{orderInvoice.headerName}, + + + `invoice_tax_number` = #{orderInvoice.invoiceTaxNumber}, + + + `file_id` = #{orderInvoice.fileId}, + + + `application_time` = #{orderInvoice.applicationTime}, + + + `upload_time` = #{orderInvoice.uploadTime}, + + + where order_invoice_id = #{orderInvoice.orderInvoiceId} + + + delete from order_invoice where order_invoice_id = #{orderInvoiceId} + + + + + + + + delete from order_invoice where order_id in + + #{orderId} + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 0000000..13e3e4f --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,1537 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `order_id`, + `create_time`, + `update_time`, + `shop_id`, + `user_id`, + `order_addr_id`, + `delivery_type`, + `shop_name`, + `total`, + `actual_total`, + `freight_amount`, + `order_score`, + `status`, + `pay_type`, + `order_type`, + `all_count`, + `reduce_amount`, + `score_amount`, + `member_amount`, + `platform_coupon_amount`, + `shop_coupon_amount`, + `discount_amount`, + `platform_free_freight_amount`, + `free_freight_amount`, + `shop_change_free_amount`, + `distribution_amount`, + `platform_amount`, + `platform_commission`, + `pay_time`, + `delivery_time`, + `finally_time`, + `settled_time`, + `cancel_time`, + `book_time`, + `is_payed`, + `close_type`, + `refund_status`, + `shop_remarks`, + `remarks`, + `delete_status`, + `version`, + `is_settled`, + `supplier_id`, + `wait_purchase`, + `supplier_delivery_type`, + `purchase_spread_amount`, + `pre_sale_type`, + `order_mold`, + `order_mold`, + `write_off_status`, + `write_off_num`, + `write_off_multiple_count`, + `write_off_start`, + `write_off_end`, + `pay_sys_type`, + `write_off_count` + + + o.`order_id`, + o.`create_time`, + o.`update_time`, + o.`shop_id`, + o.`user_id`, + o.`order_addr_id`, + o.`delivery_type`, + o.`shop_name`, + o.`total`, + o.`actual_total`, + o.`freight_amount`, + o.`order_score`, + o.`status`, + o.`pay_type`, + o.`order_type`, + o.`all_count`, + o.`reduce_amount`, + o.`score_amount`, + o.`member_amount`, + o.`platform_coupon_amount`, + o.`shop_coupon_amount`, + o.`discount_amount`, + o.`platform_free_freight_amount`, + o.`free_freight_amount`, + o.`shop_change_free_amount`, + o.`distribution_amount`, + o.`platform_amount`, + o.`platform_commission`, + o.`pay_time`, + o.`delivery_time`, + o.`finally_time`, + o.`settled_time`, + o.`cancel_time`, + o.`book_time`, + o.`is_payed`, + o.`close_type`, + o.`refund_status`, + o.`shop_remarks`, + o.`remarks`, + o.`delete_status`, + o.`version`, + o.`is_settled`, + o.`supplier_id`, + o.`wait_purchase`, + o.`supplier_delivery_type`, + o.`purchase_spread_amount`, + o.`pre_sale_type`, + o.`order_mold`, + o.`pay_sys_type`, + o.`write_off_status`, + o.`write_off_num`, + o.`write_off_multiple_count`, + o.`write_off_start`, + o.`write_off_end`, + o.`shop_combo_amount`, + o.`write_off_count`, + o.`main_order_id` + + + + oi.order_item_id oi_order_item_id, + oi.create_time oi_create_time, + oi.update_time oi_update_time, + oi.shop_id oi_shop_id, + oi.order_id oi_order_id, + oi.category_id oi_category_id, + oi.spu_id oi_spu_id, + oi.sku_id oi_sku_id, + oi.supplier_spu_id oi_supplier_spu_id, + oi.supplier_sku_id oi_supplier_sku_id, + oi.final_refund_id oi_final_refund_id, + oi.distribution_user_id oi_distribution_user_id, + oi.user_id oi_user_id, + oi.stock_point_id oi_stock_point_id, + oi.score_fee oi_score_fee, + oi.shop_change_free_amount oi_shop_change_free_amount, + oi.final_refund_id oi_final_refund_id, + oi.distribution_user_id oi_distribution_user_id, + oi.count oi_count, + oi.pic oi_pic, + oi.is_comm oi_is_comm, + oi.comm_time oi_comm_time, + oi.free_freight_amount oi_free_freight_amount, + oi.comm_time oi_comm_time, + oi.refund_status oi_refund_status, + oi.be_delivered_num oi_be_delivered_num, + oi.delivery_type oi_delivery_type, + oi.shop_cart_time oi_shop_cart_time, + oi.price oi_price, + oi.spu_mold oi_spu_mold, + oi.rate oi_rate, + oi.spu_total_amount oi_spu_total_amount, + oi.actual_total oi_actual_total, + oi.share_reduce oi_share_reduce, + oi.platform_share_reduce oi_platform_share_reduce, + oi.distribution_amount oi_distribution_amount, + oi.distribution_parent_amount oi_distribution_parent_amount, + oi.score_fee oi_score_fee, + oi.use_score oi_use_score, + oi.gain_score oi_gain_score, + oi.spu_code oi_spu_code, + oi.party_code oi_party_code, + oi.supplier_pic oi_supplier_pic, + oi.platform_commission oi_platform_commission, + oi.score_amount oi_score_amount, + oi.member_amount oi_member_amount, + oi.platform_coupon_amount oi_platform_coupon_amount, + oi.shop_coupon_amount oi_shop_coupon_amount, + oi.discount_amount oi_discount_amount, + oi.platform_free_freight_amount oi_platform_free_freight_amount, + oi.free_freight_amount oi_free_freight_amount, + oi.shop_change_free_amount oi_shop_change_free_amount, + oi.spu_code oi_spu_code, + oi.party_code oi_party_code, + oi.activity_id oi_activity_id, + oi.activity_type oi_activity_type, + + + oi.activity_type oi_activity_type, + oi.activity_id oi_activity_id, + oi.item_purchase_amount oi_item_purchase_amount, + oi.purchase_platform_commission as oi_purchase_platform_commission, + oi.supplier_rate as oi_supplier_rate, + oi.stock_point_id as oi_stock_point_id, + oi.is_refund oi_is_refund, + oi.virtual_remark oi_virtual_remark, + oi.write_off_num as oi_write_off_num, + oi.write_off_multiple_count as oi_write_off_multiple_count, + oi.write_off_start as oi_write_off_start, + oi.write_off_end as oi_write_off_end + + + + + update `order` + + + `shop_name` = #{order.shopName}, + + + `order_addr_id` = #{order.orderAddrId}, + + + `total` = #{order.total}, + + + `actual_total` = #{order.actualTotal}, + + + `remarks` = #{order.remarks}, + + + `shop_remarks` = #{order.shopRemarks}, + + + `status` = #{order.status}, + + + `pay_type` = #{order.payType}, + + + `delivery_type` = #{order.deliveryType}, + + + `order_type` = #{order.orderType}, + + + `close_type` = #{order.closeType}, + + + `all_count` = #{order.allCount}, + + + `pay_time` = #{order.payTime}, + + + `delivery_time` = #{order.deliveryTime}, + + + `finally_time` = #{order.finallyTime}, + + + `cancel_time` = #{order.cancelTime}, + + + `book_time` = #{order.bookTime}, + + + `is_payed` = #{order.isPayed}, + + + `delete_status` = #{order.deleteStatus}, + + + `refund_status` = #{order.refundStatus}, + + + `freight_amount` = #{order.freightAmount}, + + + `score_amount` = #{order.scoreAmount}, + + + `member_amount` = #{order.memberAmount}, + + + `platform_coupon_amount` = #{order.platformCouponAmount}, + + + `shop_coupon_amount` = #{order.shopCouponAmount}, + + + `discount_amount` = #{order.discountAmount}, + + + `platform_amount` = #{order.platformAmount}, + + + `reduce_amount` = #{order.reduceAmount}, + + + `shop_change_free_amount` = #{order.shopChangeFreeAmount}, + + + `free_freight_amount` = #{order.freeFreightAmount}, + + + `platform_commission` = #{order.platformCommission}, + + + `update_time` = #{order.updateTime}, + + + `wait_purchase` = #{order.waitPurchase}, + + + `write_off_num` = #{order.writeOffNum}, + + + `write_off_status` = #{order.writeOffStatus}, + + + `write_off_multiple_count` = #{order.writeOffMultipleCount}, + + + `write_off_start` = #{order.writeOffStart}, + + + `write_off_end` = #{order.writeOffEnd}, + + + `purchase_spread_amount` = #{order.purchaseSpreadAmount}, + + + `write_off_count` = #{order.writeOffCount}, + + + `main_order_id` = #{order.mainOrderId}, + + update_time = now() + + where order_id = #{order.orderId} + + + delete + from `order` + where order_id = #{orderId} + + + insert into `order` (`order_id`, `shop_id`,`shop_name`, `user_id`, `order_addr_id`, `total`, `actual_total`, + `remarks`, + `shop_remarks`, `status`, `pay_type`, `delivery_type`, `order_type`, `close_type`, + `all_count`, `pay_time`, `delivery_time`, `finally_time`, `cancel_time`, `book_time`, + `is_payed`, `delete_status`, `refund_status`, `freight_amount`, `order_score`, + `score_amount`,`distribution_amount`, + `member_amount`, `platform_coupon_amount`, `shop_coupon_amount`, `discount_amount`, + `platform_amount`, `reduce_amount`,`free_freight_amount`, + `platform_free_freight_amount`,`shop_change_free_amount`, `platform_commission`, `is_settled`, + `supplier_delivery_type`, `supplier_id`,`order_mold`, `pre_sale_type`,`shop_combo_amount`, + `write_off_num`,`write_off_status`,`write_off_multiple_count`,`write_off_start`,`write_off_end`,`write_off_count`,`main_order_id`,`create_time`) + values + + (#{order.orderId}, #{order.shopId},#{order.shopName}, #{order.userId}, #{order.orderAddrId}, #{order.total}, + #{order.actualTotal}, #{order.remarks}, #{order.shopRemarks}, #{order.status}, + #{order.payType}, #{order.deliveryType}, #{order.orderType}, #{order.closeType}, + #{order.allCount}, #{order.payTime}, #{order.deliveryTime}, #{order.finallyTime}, + #{order.cancelTime}, #{order.bookTime}, #{order.isPayed}, #{order.deleteStatus}, + #{order.refundStatus}, #{order.freightAmount}, #{order.orderScore}, #{order.scoreAmount}, + #{order.distributionAmount}, #{order.memberAmount}, + #{order.platformCouponAmount}, #{order.shopCouponAmount}, #{order.discountAmount}, + #{order.platformAmount}, #{order.reduceAmount}, #{order.freeFreightAmount}, + #{order.platformFreeFreightAmount}, #{order.shopChangeFreeAmount}, #{order.platformCommission}, + #{order.isSettled}, #{order.supplierDeliveryType},#{order.supplierId},#{order.orderMold},#{order.preSaleType},#{order.shopComboAmount}, + #{order.writeOffNum}, #{order.writeOffStatus},#{order.writeOffMultipleCount},#{order.writeOffStart},#{order.writeOffEnd},#{order.writeOffCount},#{order.mainOrderId}, + #{order.createTime}) + + + + + + + + update `order` set + + `status` = 3,delivery_time=NOW(), + + + `status` = 2, + + + pay_sys_type=#{paySysType}, + + + pay_type =#{payType}, + + is_payed =1,update_time=NOW(),pay_time=NOW() + where order_id = #{orderStatus.orderId} + + + + update `order` set `status` = 7,is_payed =1,update_time=NOW(),pay_time=NOW(),pay_sys_type=#{paySysType},pay_type =#{payType} where + + order_id = #{orderId} + + + + + update `order` set + + `status` = 9 + + + `status` = 2 + + where order_id in + + #{orderId} + + + + + update `order` set `status` = 3,delivery_time =NOW(),update_time=NOW() where order_id in + + #{orderId} + + + + + + + + update `order` set `status`=6,cancel_time = NOW(),update_time=NOW() where is_payed = 0 and + + order_id = #{orderId} + + + + + + + + + update `order` + set `status`=5, + finally_time = NOW(), + update_time=NOW() + where order_id = #{orderId} + and `status` = 3 + and (refund_status ]]> 1 OR refund_status IS NULL) + + + + UPDATE `order` + SET `delete_status`=2 + where order_id = #{orderId} + + + + + + + + + + + + + + + + update `order` set + + status = 3 + + + status = 2 + + where order_id in + + #{orderId} + + and status = 7 + + + + update `order` set is_settled = 1,settled_time = NOW() where + + order_id = #{orderId} + + + + + + update `order` + set update_time = NOW() + where order_id = #{orderId} + + + + + + update `order` + set + `wait_purchase` = #{order.waitPurchase}, + `purchase_spread_amount` = #{order.purchaseSpreadAmount} + where + order_id = #{order.orderId} and `wait_purchase` = 0 + + + + + + update `order` set `distribution_amount` = #{order.distributionAmount} + where order_id = #{order.orderId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderPreSaleInfoMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderPreSaleInfoMapper.xml new file mode 100644 index 0000000..3c6a1b4 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderPreSaleInfoMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + `order_pre_sale_info_id`,`update_time`,`create_time`,`order_id`,`deposit_amount`,`deposit_reduce_amount`,`pay_status`,`deposit_expansion_amount`,`balance_amount`,pre_sale_type,`balance_start_time`,`balance_end_time`, `balance_pay_time`, `pre_sale_delivery_type`,`pre_sale_delivery_time` + + + + + + + insert into order_pre_sale_info (`order_pre_sale_info_id`,`order_id`,`deposit_amount`,`deposit_expansion_amount`,`deposit_reduce_amount`,`balance_amount`,`pre_sale_type`,`balance_start_time`,`balance_end_time`,`pre_sale_delivery_type`,`pre_sale_delivery_time`,`create_time`) + values (#{orderPreSaleInfo.orderPreSaleInfoId},#{orderPreSaleInfo.orderId},#{orderPreSaleInfo.depositAmount},#{orderPreSaleInfo.depositExpansionAmount},#{orderPreSaleInfo.depositReduceAmount},#{orderPreSaleInfo.balanceAmount},#{orderPreSaleInfo.preSaleType},#{orderPreSaleInfo.balanceStartTime},#{orderPreSaleInfo.balanceEndTime},#{orderPreSaleInfo.preSaleDeliveryType},#{orderPreSaleInfo.preSaleDeliveryTime},#{orderPreSaleInfo.createTime}); + + + insert into order_pre_sale_info (`order_pre_sale_info_id`,`order_id`,`deposit_amount`,`deposit_expansion_amount`,`deposit_reduce_amount`,`balance_amount`,`pre_sale_type`,`balance_start_time`,`balance_end_time`,`pre_sale_delivery_type`,`pre_sale_delivery_time`,`create_time`) + values + + (#{orderPreSaleInfo.orderPreSaleInfoId},#{orderPreSaleInfo.orderId},#{orderPreSaleInfo.depositAmount},#{orderPreSaleInfo.depositExpansionAmount},#{orderPreSaleInfo.depositReduceAmount},#{orderPreSaleInfo.balanceAmount},#{orderPreSaleInfo.preSaleType},#{orderPreSaleInfo.balanceStartTime},#{orderPreSaleInfo.balanceEndTime},#{orderPreSaleInfo.preSaleDeliveryType},#{orderPreSaleInfo.preSaleDeliveryTime},#{orderPreSaleInfo.createTime}) + + + + + update order_pre_sale_info + + + `deposit_amount` = #{orderPreSaleInfo.depositAmount}, + + + `deposit_expansion_amount` = #{orderPreSaleInfo.depositExpansionAmount}, + + + `balance_amount` = #{orderPreSaleInfo.balanceAmount}, + + + `balance_start_time` = #{orderPreSaleInfo.balanceStartTime}, + + + `balance_end_time` = #{orderPreSaleInfo.balanceEndTime}, + + + `pay_status` = #{orderPreSaleInfo.payStatus}, + + + `pre_sale_delivery_type` = #{orderPreSaleInfo.preSaleDeliveryType}, + + + `pre_sale_delivery_time` = #{orderPreSaleInfo.preSaleDeliveryTime}, + + + `balance_pay_time` = #{orderPreSaleInfo.balancePayTime}, + + + where order_pre_sale_info_id = #{orderPreSaleInfo.orderPreSaleInfoId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderRefundSettlementMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderRefundSettlementMapper.xml new file mode 100644 index 0000000..9ce79e2 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderRefundSettlementMapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + `settlement_id`,`create_time`,`update_time`,`pay_id`,`order_id`,`refund_id`,`user_id`,`biz_refund_no`,`pay_type`,`refund_status`,`refund_amount`,`order_total_amount`,`version` + + + + + insert into order_refund_settlement (`pay_id`,`order_id`,`refund_id`,`user_id`,`biz_refund_no`,`pay_type`,`refund_status`,`refund_amount`,`order_total_amount`,`version`) + values (#{orderRefundSettlement.payId},#{orderRefundSettlement.orderId},#{orderRefundSettlement.refundId},#{orderRefundSettlement.userId},#{orderRefundSettlement.bizRefundNo},#{orderRefundSettlement.payType},#{orderRefundSettlement.refundStatus},#{orderRefundSettlement.refundAmount},#{orderRefundSettlement.orderTotalAmount},#{orderRefundSettlement.version}); + + + update order_refund_settlement + + + `pay_id` = #{orderRefundSettlement.payId}, + + + `order_id` = #{orderRefundSettlement.orderId}, + + + `refund_id` = #{orderRefundSettlement.refundId}, + + + `user_id` = #{orderRefundSettlement.userId}, + + + `biz_refund_no` = #{orderRefundSettlement.bizRefundNo}, + + + `pay_type` = #{orderRefundSettlement.payType}, + + + `refund_status` = #{orderRefundSettlement.refundStatus}, + + + `refund_amount` = #{orderRefundSettlement.refundAmount}, + + + `order_total_amount` = #{orderRefundSettlement.orderTotalAmount}, + + + `version` = #{orderRefundSettlement.version}, + + + where settlement_id = #{orderRefundSettlement.settlementId} + + + delete from order_refund_settlement where settlement_id = #{settlementId} + + + + + + update order_refund_settlement set refund_status = 2 where refund_id = #{refundId} and refund_status = 1 + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderSelfStationMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderSelfStationMapper.xml new file mode 100644 index 0000000..2dad96c --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderSelfStationMapper.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `order_self_station_id`,`update_time`,`create_time`,`shop_id`,`order_id`,`station_id`,`station_user_mobile`,`station_user_name`,`station_time`,`station_code`,`station_address`,`station_phone` + + + + + insert into order_self_station (`order_self_station_id`,`shop_id`,`user_id`,`order_id`,`station_id`,`station_user_mobile`,`station_user_name`,`station_time`,`station_code`,`station_address`,`station_phone`) + values (#{orderSelfStation.orderSelfStationId},#{orderSelfStation.shopId},#{orderSelfStation.userId},#{orderSelfStation.orderId},#{orderSelfStation.stationId},#{orderSelfStation.stationUserMobile}, + #{orderSelfStation.stationUserName},#{orderSelfStation.stationTime},#{orderSelfStation.stationCode},#{orderSelfStation.stationAddress},#{orderSelfStation.stationPhone}); + + + insert into order_self_station (`order_self_station_id`,`shop_id`,`user_id`,`order_id`,`station_id`,`station_user_mobile`,`station_user_name`,`station_time`,`station_code`,`station_address`,`station_phone`) + values + + (#{orderSelfStation.orderSelfStationId},#{orderSelfStation.shopId},#{orderSelfStation.userId},#{orderSelfStation.orderId},#{orderSelfStation.stationId},#{orderSelfStation.stationUserMobile}, + #{orderSelfStation.stationUserName},#{orderSelfStation.stationTime},#{orderSelfStation.stationCode},#{orderSelfStation.stationAddress},#{orderSelfStation.stationPhone}) + + + + update order_self_station + + + `shop_id` = #{orderSelfStation.shopId}, + + + `order_id` = #{orderSelfStation.orderId}, + + + `station_id` = #{orderSelfStation.stationId}, + + + `station_user_mobile` = #{orderSelfStation.stationUserMobile}, + + + `station_user_name` = #{orderSelfStation.stationUserName}, + + + `station_time` = #{orderSelfStation.stationTime}, + + + `station_code` = #{orderSelfStation.stationCode}, + + + `station_address` = #{orderSelfStation.stationAddress}, + + + `station_phone` = #{orderSelfStation.stationPhone}, + + + where order_self_station_id = #{orderSelfStation.orderSelfStationId} + + + delete from order_self_station where order_self_station_id = #{id} + + + + + + + + + + + diff --git a/tmerclub-order/src/main/resources/mapper/OrderVirtualInfoMapper.xml b/tmerclub-order/src/main/resources/mapper/OrderVirtualInfoMapper.xml new file mode 100644 index 0000000..7eef987 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OrderVirtualInfoMapper.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `order_virtual_info_id`,`order_id`,`order_item_id`,`shop_id`,`station_id`,`write_off_code`,`is_write_off`,`create_time`,`update_time`,`write_off_time`,`write_off_multiple_count` + + + + + insert into order_virtual_info (`order_virtual_info_id`,`order_id`,`shop_id`,`station_id`,`write_off_code`,`is_write_off`,`write_off_time`,`write_off_multiple_count`) + values (#{orderVirtualInfo.orderVirtualInfoId}, #{orderVirtualInfo.orderId},#{orderVirtualInfo.shopId},#{orderVirtualInfo.stationId},#{orderVirtualInfo.writeOffCode},#{orderVirtualInfo.isWriteOff},#{orderVirtualInfo.writeOffTime},#{orderVirtualInfo.writeOffMultipleCount}); + + + update order_virtual_info + + + `station_id` = #{orderVirtualInfo.stationId}, + + + `is_write_off` = #{orderVirtualInfo.isWriteOff}, + + + `write_off_time` = #{orderVirtualInfo.writeOffTime}, + + + `write_off_multiple_count` = #{orderVirtualInfo.writeOffMultipleCount}, + + + where order_virtual_info_id = #{orderVirtualInfo.orderVirtualInfoId} + + + + + update order_virtual_info + + + `order_id` = #{orderVirtualInfo.orderId} + + + where order_item_id = #{orderVirtualInfo.orderItemId} + + + + + delete from order_virtual_info where order_virtual_info_id = #{id} + + + + insert into order_virtual_info (`order_virtual_info_id`,`order_id`,`order_item_id`,`shop_id`,`station_id`,`write_off_code`,`is_write_off`,`write_off_time`,`write_off_multiple_count`) + values + + (#{orderVirtualInfo.orderVirtualInfoId}, #{orderVirtualInfo.orderId},#{orderVirtualInfo.orderItemId},#{orderVirtualInfo.shopId},#{orderVirtualInfo.stationId},#{orderVirtualInfo.writeOffCode},#{orderVirtualInfo.isWriteOff},#{orderVirtualInfo.writeOffTime},#{orderVirtualInfo.writeOffMultipleCount}) + + + + + + + + + + + + + + + delete from order_virtual_info + WHERE order_item_id in + + #{orderItemId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/OutletConfigMapper.xml b/tmerclub-order/src/main/resources/mapper/OutletConfigMapper.xml new file mode 100644 index 0000000..48b1327 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/OutletConfigMapper.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `outlet_config_id`,`create_time`,`update_time`,`shop_id`,`supplier_id`,`delivery_company_type`, + `shipper`,`mobile`,`partner_id`,`partner_key`,`net`,`paper_size`,`is_default`, `print_addr` + + + + + insert into outlet_config (`shop_id`,`supplier_id`,`delivery_company_type`,`shipper`,`mobile`,`partner_id`,`partner_key`, + `net`,`paper_size`,`is_default`,`print_addr`) + values (#{outletConfig.shopId},#{outletConfig.supplierId},#{outletConfig.deliveryCompanyType},#{outletConfig.shipper}, + #{outletConfig.mobile},#{outletConfig.partnerId},#{outletConfig.partnerKey},#{outletConfig.net},#{outletConfig.paperSize}, + #{outletConfig.isDefault},#{outletConfig.printAddr}); + + + update outlet_config + + + `shop_id` = #{outletConfig.shopId}, + + + `supplier_id` = #{outletConfig.supplierId}, + + + `delivery_company_type` = #{outletConfig.deliveryCompanyType}, + + + `shipper` = #{outletConfig.shipper}, + + + `mobile` = #{outletConfig.mobile}, + + + `partner_id` = #{outletConfig.partnerId}, + + + `partner_key` = #{outletConfig.partnerKey}, + + + `net` = #{outletConfig.net}, + + + `paper_size` = #{outletConfig.paperSize}, + + + `is_default` = #{outletConfig.isDefault}, + + + where outlet_config_id = #{outletConfig.outletConfigId} + + + delete from outlet_config where outlet_config_id = #{outletConfigId} + + + + UPDATE `outlet_config` SET is_default = 0 + + + shop_id = #{shopId} + + + AND supplier_id = #{supplierId} + + + + + UPDATE `outlet_config` SET is_default = ABS(is_default - 1) WHERE outlet_config_id = #{outletConfigId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/PrinterMapper.xml b/tmerclub-order/src/main/resources/mapper/PrinterMapper.xml new file mode 100644 index 0000000..0a982d2 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/PrinterMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + `printer_id`,`create_time`,`update_time`,`shop_id`,`supplier_id`,`printer_name`,`siid`,`printer_remark`,`is_default` + + + + + insert into printer (`shop_id`,`supplier_id`,`printer_name`,`siid`,`printer_remark`,`is_default`) + values (#{printer.shopId},#{printer.supplierId},#{printer.printerName},#{printer.siid},#{printer.printerRemark},#{printer.isDefault}); + + + update printer + + + `shop_id` = #{printer.shopId}, + + + `supplier_id` = #{printer.supplierId}, + + + `printer_name` = #{printer.printerName}, + + + `siid` = #{printer.siid}, + + + `printer_remark` = #{printer.printerRemark}, + + + `is_default` = #{printer.isDefault}, + + + where printer_id = #{printer.printerId} + + + delete from printer where printer_id = #{printerId} + + + UPDATE `printer` SET is_default = 0 + + + shop_id = #{shopId} + + + AND supplier_id = #{supplierId} + + + + + UPDATE `printer` SET is_default = ABS(is_default - 1) WHERE printer_id = #{printerId} + + + + diff --git a/tmerclub-order/src/main/resources/mapper/PruchaseOrderAddrMapper.xml b/tmerclub-order/src/main/resources/mapper/PruchaseOrderAddrMapper.xml new file mode 100644 index 0000000..31aad8d --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/PruchaseOrderAddrMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + `purchase_order_addr_id`, + `create_time`, + `update_time`, + `shop_id`, + `consignee`, + `province_id`, + `province`, + `city_id`, + `city`, + `area_id`, + `area`, + `addr`, + `mobile` + + + + insert into purchase_order_addr (`purchase_order_addr_id`,`shop_id`,`consignee`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area`,`addr`,`mobile`) + values (#{purchaseOrderAddr.purchaseOrderAddrId},#{purchaseOrderAddr.shopId},#{purchaseOrderAddr.consignee},#{purchaseOrderAddr.provinceId}, + #{purchaseOrderAddr.province},#{purchaseOrderAddr.cityId},#{purchaseOrderAddr.city},#{purchaseOrderAddr.areaId},#{purchaseOrderAddr.area}, + #{purchaseOrderAddr.addr},#{purchaseOrderAddr.mobile}); + + + update purchase_order_addr + + + `shop_id` = #{purchaseOrderAddr.shopId}, + + + `consignee` = #{purchaseOrderAddr.consignee}, + + + `province_id` = #{purchaseOrderAddr.provinceId}, + + + `province` = #{purchaseOrderAddr.province}, + + + `city_id` = #{purchaseOrderAddr.cityId}, + + + `city` = #{purchaseOrderAddr.city}, + + + `area_id` = #{purchaseOrderAddr.areaId}, + + + `area` = #{purchaseOrderAddr.area}, + + + `addr` = #{purchaseOrderAddr.addr}, + + + `mobile` = #{purchaseOrderAddr.mobile}, + + + where purchase_order_addr_id = #{purchaseOrderAddr.purchaseOrderAddrId} + + + delete from purchase_order_addr where purchase_order_addr_id = #{purchaseOrderAddrId} + + + diff --git a/tmerclub-order/src/main/resources/mapper/PurchaseOrderLangMapper.xml b/tmerclub-order/src/main/resources/mapper/PurchaseOrderLangMapper.xml new file mode 100644 index 0000000..5befc70 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/PurchaseOrderLangMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + `purchase_order_id`,`lang`,`spu_name` + + + insert into purchase_order_lang (`purchase_order_id`,`lang`,`spu_name`) values + + (#{purchaseOrderLang.purchaseOrderId},#{purchaseOrderLang.lang},#{purchaseOrderLang.spuName}) + + + + diff --git a/tmerclub-order/src/main/resources/mapper/TranscityFreeMapper.xml b/tmerclub-order/src/main/resources/mapper/TranscityFreeMapper.xml new file mode 100644 index 0000000..3a62238 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/TranscityFreeMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + `transcity_free_id`,`create_time`,`update_time`,`transfee_free_id`,`free_city_id` + + + + + insert into transcity_free (`transfee_free_id`,`free_city_id`) + values (#{transcityFree.transfeeFreeId},#{transcityFree.freeCityId}); + + + update transcity_free + + + `transfee_free_id` = #{transcityFree.transfeeFreeId}, + + + `free_city_id` = #{transcityFree.freeCityId}, + + + where transcity_free_id = #{transcityFree.transcityFreeId} + + + + delete from transcity_free where transcity_free_id = #{transcityFreeId} + + + + insert into transcity_free (`transfee_free_id`,`free_city_id`) values + + (#{transCityFree.transfeeFreeId},#{transCityFree.freeCityId}) + + + + + delete from transcity_free where transfee_free_id in + + #{transFeeFreeId} + + + + diff --git a/tmerclub-order/src/main/resources/mapper/TranscityMapper.xml b/tmerclub-order/src/main/resources/mapper/TranscityMapper.xml new file mode 100644 index 0000000..282dd78 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/TranscityMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + `transcity_id`,`create_time`,`update_time`,`transfee_id`,`city_id` + + + + + insert into transcity (`transfee_id`,`city_id`) + values (#{transcity.transfeeId},#{transcity.cityId}); + + + update transcity + + + `transfee_id` = #{transcity.transfeeId}, + + + `city_id` = #{transcity.cityId}, + + + where transcity_id = #{transcity.transcityId} + + + delete from transcity where transcity_id = #{transcityId} + + + + insert into transcity (`transfee_id`,`city_id`) values + + (#{transCity.transfeeId},#{transCity.cityId}) + + + + + delete from transcity where transfee_id in + + #{transFeeId} + + + + diff --git a/tmerclub-order/src/main/resources/mapper/TransfeeFreeMapper.xml b/tmerclub-order/src/main/resources/mapper/TransfeeFreeMapper.xml new file mode 100644 index 0000000..25437d6 --- /dev/null +++ b/tmerclub-order/src/main/resources/mapper/TransfeeFreeMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + `transfee_free_id`,`create_time`,`update_time`,`transport_id`,`free_type`,`amount`,`piece` + + + + + + insert into transfee_free (`transport_id`,`free_type`,`amount`,`piece`) values + + (#{transFeeFree.transportId},#{transFeeFree.freeType},#{transFeeFree.amount},#{transFeeFree.piece}) + + + + + delete from transfee_free where transport_id = #{transportId} + + + diff --git a/tmerclub-payment/pom.xml b/tmerclub-payment/pom.xml new file mode 100644 index 0000000..79d4043 --- /dev/null +++ b/tmerclub-payment/pom.xml @@ -0,0 +1,99 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-payment + mall4cloud 支付服务 + jar + + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-seckill + ${project.version} + + + com.moyuer.cloud + tmerclub-api-payment + ${project.version} + + + com.moyuer.cloud + tmerclub-api-biz + ${project.version} + + + com.moyuer.cloud + tmerclub-api-flow + ${project.version} + + + com.alipay.sdk + alipay-sdk-java + + + com.github.binarywang + weixin-java-pay + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + true + + + + + diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/BizParameter.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/BizParameter.java new file mode 100644 index 0000000..40cb508 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/BizParameter.java @@ -0,0 +1,22 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; + +import com.alibaba.fastjson2.JSON; + +import java.util.LinkedHashMap; + +/** + * @author lanhai + */ +public class BizParameter extends LinkedHashMap { + private static final long serialVersionUID = 1L; + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenResponse.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenResponse.java new file mode 100644 index 0000000..3b450dc --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenResponse.java @@ -0,0 +1,77 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; + +import java.io.Serializable; +/** + * @author lanhai + */ +public class OpenResponse implements Serializable { + private static final long serialVersionUID = 1L; + private String code; + private String msg; + private String subCode; + private String subMsg; + private String data; + private String sign; + private String traceId; + + public String getCode() { + return this.code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return this.msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getSubCode() { + return this.subCode; + } + + public void setSubCode(String subCode) { + this.subCode = subCode; + } + + public String getSubMsg() { + return this.subMsg; + } + + public void setSubMsg(String subMsg) { + this.subMsg = subMsg; + } + + public String getData() { + return this.data; + } + + public void setData(String data) { + this.data = data; + } + + public String getSign() { + return this.sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getTraceId() { + return this.traceId; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenServiceRequest.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenServiceRequest.java new file mode 100644 index 0000000..3fb8e97 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/bean/OpenServiceRequest.java @@ -0,0 +1,31 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.bean; + +/** + * @author lanhai + */ +public class OpenServiceRequest extends OpenRequest { + private static final long serialVersionUID = 3020405199034536117L; + private String clientAppId; + private String jumpUrl; + + public String getClientAppId() { + return this.clientAppId; + } + + public void setClientAppId(String clientAppId) { + this.clientAppId = clientAppId; + } + + public String getJumpUrl() { + return this.jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/constant/AllinpayNoticeUrl.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/constant/AllinpayNoticeUrl.java new file mode 100644 index 0000000..e240335 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/constant/AllinpayNoticeUrl.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.payment.allinpay.constant; + +/** + * @author lanhai + */ +public interface AllinpayNoticeUrl { + + String NOTICE_URL = "/ua/notice/allinpay/member"; + + /** + * 设置公司信息 + */ + String SET_COMPANY_INFO = NOTICE_URL + "/setCompanyInfoResult"; + + /** + * 更新公司信息 + */ + String UPDATE_COMPANY_INFO = NOTICE_URL + "/updateCompanyInfoResult"; + + /** + * 影印件采集 + */ + String ID_CARD_COLLECT = NOTICE_URL + "/idCardCollectResult"; + + /** + * 签约账户提现协议 + */ + String SIGN_ACCT_PROTOCOL = NOTICE_URL + "/signAcctProtocol"; + + /** + * 设置支付密码 + */ + String SET_PAY_PWD = NOTICE_URL + "/setPayPwdResult"; + + /** + * 修改支付密码 + */ + String UPDATE_PAY_PWD = NOTICE_URL + "/updatePayPwdResult"; + + /** + * 重置支付密码 + */ + String RESET_PAY_PWD = NOTICE_URL + "/resetPayPwdResult"; + + /** + * 修改绑定手机(密码验证版) + */ + String UPDATE_PHONE_BY_PAY_PWD = NOTICE_URL + "/updatePhoneByPayPwdResult"; + + /** + * 提现申请 + */ + String WITHDRAW_APPLY = NOTICE_URL + "/withdrawApply"; + + /** + * 充值申请 + */ + String RECHARGE_APPLY = NOTICE_URL + "/rechargeApply"; +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/constant/AllinpayPlatformAccountSet.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/constant/AllinpayPlatformAccountSet.java new file mode 100644 index 0000000..c02d3b5 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/constant/AllinpayPlatformAccountSet.java @@ -0,0 +1,68 @@ +package com.tmerclub.cloud.payment.allinpay.constant; + +/** + * @author lanhai + */ +public enum AllinpayPlatformAccountSet { + + /** + * 标准余额账户集 + * 用于平台管理自有资金,一般为经营收入、手续费收入 + * 支持接口充值,接口提现,平台转账 + */ + STANDARD_BALANCE(100001), + /** + * 标准保证金账户集 + * 用于平台向平台用户收取、计提保证金 + * 支持接口充值,平台转账 + * 不支持接口提现 + */ + GUARANTEE(100002), + + /** + * 准备金额度账户集 + * 用于云商通向平台收取交易手续费、保证金等费用。 + * 注:平台预充值给云商通。 + * 支持接口充值 + */ + RESERVES(100003), + /** + * 中间账户集A + * 用于正向交易资金的中间账户 + * 不支持接口充值,接口提现,平台转账 + */ + INTERMEDIATE_A(100004), + + /** + * 中间账户集B + * 用于逆向交易资金的中间账户 + * 不支持接口充值,接口提现,平台转账 + */ + INTERMEDIATE_B(100005), + /** + * 标准营销账户集 + * 用于平台管理营销活动相关的资金 + * 支持接口充值,接口提现,平台转账 + */ + MARKETING(2000000); + + private final Integer num; + + public Integer value() { + return num; + } + + AllinpayPlatformAccountSet(Integer num) { + this.num = num; + } + + public static AllinpayPlatformAccountSet instance(Integer value) { + AllinpayPlatformAccountSet[] enums = values(); + for (AllinpayPlatformAccountSet allinpayPlatformAccountSet : enums) { + if (allinpayPlatformAccountSet.value().equals(value)) { + return allinpayPlatformAccountSet; + } + } + return null; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/IdentityType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/IdentityType.java new file mode 100644 index 0000000..5fbac5a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/IdentityType.java @@ -0,0 +1,71 @@ +package com.tmerclub.cloud.payment.allinpay.member.constant; + +/** + * @author LGH + */ + +public enum IdentityType { + + /** + * 身份证 + */ + ID_CARD(1), + /** + * 护照 + */ + PASSPORT(2), + /** + * 军官证 + */ + OFFICER_CERTIFICATE(3), + /** + * 回乡证 + */ + REENTRY_PERMIT(4), + /** + * 台胞证 + */ + MTP(5), + /** + * 警官证 + */ + POLICE_CERTIFICATE(6), + /** + * 士兵证 + */ + SOLDIER(7), + /** + * 户口簿 + */ + RESIDENCE_BOOKLET(8), + /** + * 港澳居民来往内地通行证 + */ + HOME_RETURN_PERMIT(9), + /** + * 临时身份证 + */ + INTERIM_IDENTITY_CARD(10), + /** + * 外国人居留证 + */ + RESIDENCE_PERMIT_FOR_FOREIGNERS(11), + /** + * 港澳台居民居住证 + */ + RESIDENCE_PERMIT(12), + /** + * 其他证件 + */ + OTHER(99); + + private final Integer num; + + public Integer value() { + return num; + } + + IdentityType(Integer num) { + this.num = num; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/MemberType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/MemberType.java new file mode 100644 index 0000000..01ef705 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/MemberType.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.payment.allinpay.member.constant; + +/** + * 会员类型 + * + * @author LGH + */ +public enum MemberType { + + /** + * 企业会员 + */ + ENTERPRISE(2), + + /** + * 个人会员 + */ + INDIVIDUAL(3); + + private final Integer num; + + public Integer value() { + return num; + } + + MemberType(Integer num) { + this.num = num; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/PageType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/PageType.java new file mode 100644 index 0000000..1da65f3 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/PageType.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.payment.allinpay.member.constant; +/** + * @author lanhai + */ +public enum PageType { + /** + * H5页面 + */ + H5(1L), + /** + * 小程序页面 + */ + MINI_PROGRAM(2L); + + private final Long value; + + PageType(Long value) { + this.value = value; + } + + public Long value() { + return value; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/PayAcctType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/PayAcctType.java new file mode 100644 index 0000000..baaeda8 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/PayAcctType.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.payment.allinpay.member.constant; + +import java.util.Objects; + +/** + * 支付账户类型 + * @author gaozijie + */ +public enum PayAcctType { + /** + * 微信公众号 + */ + WECHAT_PUBLIC("weChatPublic"), + /** + * 微信小程序 + */ + WECHAT_MINI_PROGRAM("weChatMiniProgram"), + /** + * 支付宝生活号 + */ + ALIPAY_SERVICE("aliPayService"), + /** + * 银联JS + */ + UNION_PAY_JS("unionPayjs"); + + private final String value; + + PayAcctType(String value) { + this.value = value; + } + + public String value() { + return value; + } + + public static PayAcctType instance(String value) { + for (PayAcctType payAcctType : values()) { + if (Objects.equals(payAcctType.value, value)) { + return payAcctType; + } + } + return null; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/VerificationCodeType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/VerificationCodeType.java new file mode 100644 index 0000000..79a9502 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/VerificationCodeType.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.payment.allinpay.member.constant; + +import java.util.Objects; + +/** + * @author LGH + */ + +public enum VerificationCodeType { + + /** + * 解绑手机号 + */ + UNBIND_PHONE(6), + /** + * 绑定手机号 + */ + BIND_PHONE(9); + + private final Integer num; + + public Integer value() { + return num; + } + + VerificationCodeType(Integer num) { + this.num = num; + } + + public static VerificationCodeType instance(Integer num) { + for (VerificationCodeType type : values()) { + if (Objects.equals(type.num, num)) { + return type; + } + } + return null; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/VisitSourceType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/VisitSourceType.java new file mode 100644 index 0000000..7bf7e3c --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/constant/VisitSourceType.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.payment.allinpay.member.constant; + +/** + * 访问终端类型 + * @author lanhai + */ +public enum VisitSourceType { + + /** + * 手机 + */ + MOBILE(1), + /** + * 电脑 + */ + PC(2); + + private final Integer num; + + public Integer value() { + return num; + } + + VisitSourceType(Integer num) { + this.num = num; + } +} \ No newline at end of file diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/AbstractMemberReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/AbstractMemberReq.java new file mode 100644 index 0000000..9f11002 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/AbstractMemberReq.java @@ -0,0 +1,20 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.AbstractReq; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author LGH + */ +public abstract class AbstractMemberReq extends AbstractReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String SERVICE_NAME = "memberService"; + + @Override + public String getService() { + return SERVICE_NAME; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ApplyBindBankCard.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ApplyBindBankCard.java new file mode 100644 index 0000000..c3f4ee6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ApplyBindBankCard.java @@ -0,0 +1,155 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.IdentityType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 请求绑定银行卡 + * + * @author LGH + */ +public class ApplyBindBankCard extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public static final String METHOD_NAME = "applyBindBankCard"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + /** + * 银行卡号 + */ + protected String cardNo; + + + /** + * 姓名 + */ + protected String name; + + /** + * 证件类型 + */ + protected Integer identityType = IdentityType.ID_CARD.value(); + + /** + * 证件号码 AES加密。 + */ + protected String identityNo; + + /** + * 支付行号 + */ + protected String unionBank; + + /** + * 手机号 + */ + private String phone; + + /** + * 绑卡方式 (不传则默认值7) + */ + private Integer cardCheck; + + /** + * 有效期 信用卡必填,格式为月年 + */ + private String validate; + + /** + * 信用卡必填。 + */ + private String cvv2; + + + public ApplyBindBankCard() { + } + + public ApplyBindBankCard(String bizUserId, String cardNo, String phone, String name, + String identityNo) { + this.bizUserId = bizUserId; + this.cardNo = cardNo; + this.phone = phone; + this.name = name; + this.identityNo = identityNo; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getCardCheck() { + return cardCheck; + } + + public void setCardCheck(Integer cardCheck) { + this.cardCheck = cardCheck; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getValidate() { + return validate; + } + + public void setValidate(String validate) { + this.validate = validate; + } + + public String getCvv2() { + return cvv2; + } + + public void setCvv2(String cvv2) { + this.cvv2 = cvv2; + } + + public String getUnionBank() { + return unionBank; + } + + public void setUnionBank(String unionBank) { + this.unionBank = unionBank; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindPhone.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindPhone.java new file mode 100644 index 0000000..bda8455 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/BindPhone.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * 绑定手机 + * + * @author LGH + */ +public class BindPhone extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public static final String METHOD_NAME = "bindPhone"; + + private String phone; + + /** + * 验证码 + */ + private String verificationCode; + + + public BindPhone() { + } + + public BindPhone(String bizUserId, String phone, String verificationCode) { + this.phone = phone; + this.bizUserId = bizUserId; + this.verificationCode = verificationCode; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/CreateMember.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/CreateMember.java new file mode 100644 index 0000000..70152f1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/CreateMember.java @@ -0,0 +1,66 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.MemberType; +import com.tmerclub.cloud.payment.allinpay.member.constant.VisitSourceType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 创建会员 + * + * @author LGH + */ +public class CreateMember extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户类型 + */ + private Integer memberType = MemberType.INDIVIDUAL.value(); + + /** + * 访问终端类型 + * + * @see VisitSourceType + */ + private Integer source; + + public static final String METHOD_NAME = "createMember"; + + /** + * 创建会员,默认个人用户 + * + * @param bizUserId 本地用户id + */ + public CreateMember(String bizUserId) { + this.bizUserId = bizUserId; + // 默认个人用户 + this.memberType = MemberType.INDIVIDUAL.value(); + } + + public CreateMember() { + } + + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public Integer getMemberType() { + return memberType; + } + + public void setMemberType(Integer memberType) { + this.memberType = memberType; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/GetBankCardBin.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/GetBankCardBin.java new file mode 100644 index 0000000..70bdb5f --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/GetBankCardBin.java @@ -0,0 +1,42 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 查询卡bin + * + * @author LGH + */ +public class GetBankCardBin extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "getBankCardBin"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + /** + * 银行卡号 + */ + private String cardNo; + + public GetBankCardBin() { + } + + public GetBankCardBin(String cardNo) { + this.cardNo = cardNo; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/QueryBankCard.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/QueryBankCard.java new file mode 100644 index 0000000..f9a0e99 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/QueryBankCard.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * 查询绑定银行卡 + * + * @author LGH + */ +public class QueryBankCard extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "queryBankCard"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public QueryBankCard(String bizUserId) { + this.bizUserId = bizUserId; + } + + public QueryBankCard() { + } + + /** + * 卡号 如果不传就查全部 + */ + private String cardNo; + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ResetPayPwd.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ResetPayPwd.java new file mode 100644 index 0000000..8733e31 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/ResetPayPwd.java @@ -0,0 +1,132 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.IdentityType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class ResetPayPwd extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "resetPayPwd"; + + /** + * 跳转页面类型 + */ + private Long jumpPageType; + /** + * 手机号码 + */ + private String phone; + /** + * 姓名 + */ + private String name; + /** + * 证件类型(目前只支持身份证) + */ + private Integer identityType = IdentityType.ID_CARD.value(); + /** + * 身份证号 + */ + private String identityNo; + /** + * 跳转返回地址 + */ + private String jumpUrl; + /** + * 后台通知地址 + */ + private String backUrl; + /** + * 失败跳转地址 + */ + private String errorJumpUrl; + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public String getErrorJumpUrl() { + return errorJumpUrl; + } + + public void setErrorJumpUrl(String errorJumpUrl) { + this.errorJumpUrl = errorJumpUrl; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "ResetPayPwd{" + + "jumpPageType='" + jumpPageType + '\'' + + ", phone='" + phone + '\'' + + ", name='" + name + '\'' + + ", identityType=" + identityType + + ", identityNo='" + identityNo + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", backUrl='" + backUrl + '\'' + + ", errorJumpUrl='" + errorJumpUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SendVerificationCode.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SendVerificationCode.java new file mode 100644 index 0000000..ded6a43 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SendVerificationCode.java @@ -0,0 +1,57 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.VerificationCodeType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 发送短信验证码 + * + * @author LGH + */ +public class SendVerificationCode extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public static final String METHOD_NAME = "sendVerificationCode"; + + private String phone; + + /** + * 验证码类型 9-绑定手机 + */ + private Integer verificationCodeType = VerificationCodeType.BIND_PHONE.value(); + + + public SendVerificationCode() { + } + + public SendVerificationCode(String bizUserId, String phone) { + this.phone = phone; + this.bizUserId = bizUserId; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getVerificationCodeType() { + return verificationCodeType; + } + + public void setVerificationCodeType(Integer verificationCodeType) { + this.verificationCodeType = verificationCodeType; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetPayPwd.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetPayPwd.java new file mode 100644 index 0000000..a31cc93 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SetPayPwd.java @@ -0,0 +1,119 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.IdentityType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class SetPayPwd extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "setPayPwd"; + + /** + * 跳转页面类型 + */ + private Long jumpPageType; + /** + * 手机号码 + */ + private String phone; + /** + * 姓名 + */ + private String name; + /** + * 证件类型(目前只支持身份证) + */ + private Integer identityType = IdentityType.ID_CARD.value(); + /** + * 身份证号 + */ + private String identityNo; + /** + * 跳转返回地址 + */ + private String jumpUrl; + /** + * 后台通知地址 + */ + private String backUrl; + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "SetPayPwd{" + + "jumpPageType='" + jumpPageType + '\'' + + ", phone='" + phone + '\'' + + ", name='" + name + '\'' + + ", identityType=" + identityType + + ", identityNo='" + identityNo + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", backUrl='" + backUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SignAcctProtocol.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SignAcctProtocol.java new file mode 100644 index 0000000..fa558e1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SignAcctProtocol.java @@ -0,0 +1,116 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.PageType; +import com.tmerclub.cloud.payment.allinpay.member.constant.VisitSourceType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class SignAcctProtocol extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "signAcctProtocol"; + + /** + * 签约户名(个人会员:名称)(企业会员:[法人提现]法人姓名、[对公户提现]企业名称) + */ + private String signAcctName; + + /** + * 跳转页面类型 + * + * @see PageType + */ + private Long jumpPageType; + + /** + * 成功后跳转地址 + */ + private String jumpUrl; + + /** + * 失败/取消后跳转地址 + */ + private String noContractUrl; + + /** + * 通知地址 + */ + private String backUrl; + + /** + * 访问终端类型 + * + * @see VisitSourceType + */ + private Integer source; + + public String getSignAcctName() { + return signAcctName; + } + + public void setSignAcctName(String signAcctName) { + this.signAcctName = signAcctName; + } + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getNoContractUrl() { + return noContractUrl; + } + + public void setNoContractUrl(String noContractUrl) { + this.noContractUrl = noContractUrl; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "SignAcctProtocol{" + + "signAcctName='" + signAcctName + '\'' + + ", jumpPageType=" + jumpPageType + + ", jumpUrl='" + jumpUrl + '\'' + + ", noContractUrl='" + noContractUrl + '\'' + + ", backUrl='" + backUrl + '\'' + + ", source=" + source + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SignContractQuery.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SignContractQuery.java new file mode 100644 index 0000000..ea9bd25 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/SignContractQuery.java @@ -0,0 +1,84 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import com.tmerclub.cloud.payment.allinpay.member.constant.PageType; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class SignContractQuery extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "signContractQuery"; + + /** + * 签约户名 + */ + private String signAcctName; + + /** + * 跳转页面类型 + * + * @see PageType + */ + private Long jumpPageType; + + /** + * 成功后跳转地址 + */ + private String jumpUrl; + + /** + * 访问终端类型 + */ + private Integer source; + + public String getSignAcctName() { + return signAcctName; + } + + public void setSignAcctName(String signAcctName) { + this.signAcctName = signAcctName; + } + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "SignContractQuery{" + + "signAcctName='" + signAcctName + '\'' + + ", jumpPageType=" + jumpPageType + + ", jumpUrl='" + jumpUrl + '\'' + + ", source='" + source + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnbindBankCard.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnbindBankCard.java new file mode 100644 index 0000000..1726272 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnbindBankCard.java @@ -0,0 +1,39 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * 解绑绑定银行卡 + * + * @author LGH + */ +public class UnbindBankCard extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + public static final String METHOD_NAME = "unbindBankCard"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public UnbindBankCard(String bizUserId, String cardNo) { + this.bizUserId = bizUserId; + this.cardNo = cardNo; + } + + public UnbindBankCard() { + } + + private String cardNo; + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnbindPhone.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnbindPhone.java new file mode 100644 index 0000000..f92b1b4 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UnbindPhone.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable;/** + * @author lanhai + */ +public class UnbindPhone extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "unbindPhone"; + + /** + * 手机号 + */ + private String phone; + + /** + * 验证码 + */ + private String verificationCode; + + public UnbindPhone() { + } + + public UnbindPhone(String bizUserId, String phone, String verificationCode) { + this.bizUserId = bizUserId; + this.phone = phone; + this.verificationCode = verificationCode; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdateCompanyInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdateCompanyInfo.java new file mode 100644 index 0000000..a9fef12 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/UpdateCompanyInfo.java @@ -0,0 +1,102 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + */ +public class UpdateCompanyInfo extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "updateCompanyInfo"; + + /** + * 请求流水号 全局唯一 + */ + private String reqsn; + /** + * 企业名称 + */ + private String companyName; + /** + * 法人姓名 + */ + private String legalName; + /** + * 法人证件类型 + */ + private Integer identityType; + /** + * 法人证件号码 + */ + private String legalIds; + /** + * 法人手机号 + */ + private String legalPhone; + /** + * 修改结果通知地址 + */ + private String backUrl; + + public String getReqsn() { + return reqsn; + } + + public void setReqsn(String reqsn) { + this.reqsn = reqsn; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getLegalName() { + return legalName; + } + + public void setLegalName(String legalName) { + this.legalName = legalName; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getLegalIds() { + return legalIds; + } + + public void setLegalIds(String legalIds) { + this.legalIds = legalIds; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/VerifyBankCardChangeBindPhone.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/VerifyBankCardChangeBindPhone.java new file mode 100644 index 0000000..3a5bcd1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/VerifyBankCardChangeBindPhone.java @@ -0,0 +1,91 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class VerifyBankCardChangeBindPhone extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "verifyBankCardChangeBindPhone"; + + /** + * 流水号 + */ + private String tranceNum; + /** + * 银行预留手机号 + */ + private String phone; + /** + * 短信验证码 + */ + private String verificationCode; + /** + * 有效期(信用卡必填) + */ + private String validate; + /** + * CVV2(信用卡必填) + */ + private String cvv2; + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + public String getValidate() { + return validate; + } + + public void setValidate(String validate) { + this.validate = validate; + } + + public String getCvv2() { + return cvv2; + } + + public void setCvv2(String cvv2) { + this.cvv2 = cvv2; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String toString() { + return "VerifyBankCardChangeBindPhone{" + + "tranceNum='" + tranceNum + '\'' + + ", phone='" + phone + '\'' + + ", verificationCode='" + verificationCode + '\'' + + ", validate='" + validate + '\'' + + ", cvv2='" + cvv2 + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/VerifyResult.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/VerifyResult.java new file mode 100644 index 0000000..948def6 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/req/VerifyResult.java @@ -0,0 +1,92 @@ +package com.tmerclub.cloud.payment.allinpay.member.req; + +import cn.hutool.core.date.DateUtil; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 企业信息审核结果通知 + * + * @author LGH + */ +public class VerifyResult extends AbstractMemberReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final String METHOD_NAME = "verifyResult"; + + + public static final String FORMAT = "yyyy-MM-dd HH:mm:ss"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + /** + * 2:审核成功。3:审核失败。 + */ + private Integer result; + + /** + * 审核时间 + */ + private String checkTime; + + /** + * 备注 + */ + private String remark; + + /** + * 失败原因 + */ + private String failReason; + + public VerifyResult(String bizUserId, Integer result, Date checkTime, String remark, + String failReason) { + this.result = result; + this.remark = remark; + this.checkTime = DateUtil.format(checkTime, FORMAT); + this.failReason = failReason; + this.bizUserId = bizUserId; + } + + public VerifyResult() { + } + + public Integer getResult() { + return result; + } + + public void setResult(Integer result) { + this.result = result; + } + + public String getCheckTime() { + return checkTime; + } + + public void setCheckTime(Date checkTime) { + this.checkTime = DateUtil.format(checkTime, FORMAT); + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getFailReason() { + return failReason; + } + + public void setFailReason(String failReason) { + this.failReason = failReason; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/ApplyBindBankCardResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/ApplyBindBankCardResp.java new file mode 100644 index 0000000..d7a756b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/ApplyBindBankCardResp.java @@ -0,0 +1,86 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 申请绑定银行卡返回值 + * + * @author LGH + */ +public class ApplyBindBankCardResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 本地用户id + */ + private String bizUserId; + /** + * 流水号 + */ + private String tranceNum; + /** + * 申请时间 + */ + private String transDate; + /** + * 银行名称 + */ + private String bankName; + /** + * 银行代码 + */ + private String bankCode; + /** + * 银行卡类型 1储蓄卡 2信用卡 + */ + private Integer cardType; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getTransDate() { + return transDate; + } + + public void setTransDate(String transDate) { + this.transDate = transDate; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + public Integer getCardType() { + return cardType; + } + + public void setCardType(Integer cardType) { + this.cardType = cardType; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BindAcctInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BindAcctInfo.java new file mode 100644 index 0000000..683387f --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BindAcctInfo.java @@ -0,0 +1,47 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import com.tmerclub.cloud.payment.allinpay.member.constant.PayAcctType; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-04-25 + */ +public class BindAcctInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付账户类型 + * @see PayAcctType + */ + private String acctType; + /** + * 支付账户用户标识 + */ + private String acct; + + public String getAcctType() { + return acctType; + } + + public void setAcctType(String acctType) { + this.acctType = acctType; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + @Override + public String toString() { + return "BindAcctInfo{" + + "acctType='" + acctType + '\'' + + ", acct='" + acct + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BizUserId.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BizUserId.java new file mode 100644 index 0000000..633b202 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/BizUserId.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 用户id + * + * @author LGH + */ +public class BizUserId implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + protected String bizUserId; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CardNoWithUid.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CardNoWithUid.java new file mode 100644 index 0000000..75bb517 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/CardNoWithUid.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author LGH + */ +public class CardNoWithUid implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String bizUserId; + + private String cardNo; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/FileUploadBeforeResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/FileUploadBeforeResp.java new file mode 100644 index 0000000..546965b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/FileUploadBeforeResp.java @@ -0,0 +1,72 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 文件上传返回参数 + * @author TRACK + */ +public class FileUploadBeforeResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String code; + + private String msg; + + private String subCode; + + private String subMsg; + + private String data; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getSubCode() { + return subCode; + } + + public void setSubCode(String subCode) { + this.subCode = subCode; + } + + public String getSubMsg() { + return subMsg; + } + + public void setSubMsg(String subMsg) { + this.subMsg = subMsg; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + @Override + public String toString() { + return "FileUploadResp{" + + "code='" + code + '\'' + + ", msg='" + msg + '\'' + + ", subCode='" + subCode + '\'' + + ", subMsg='" + subMsg + '\'' + + ", data=" + data + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/MemberInfo.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/MemberInfo.java new file mode 100644 index 0000000..5a4db4d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/MemberInfo.java @@ -0,0 +1,36 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author LGH + */ +public class MemberInfo extends BizUserId implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 会员类型 + */ + private Integer memberType; + + /** + * 会员信息 + */ + private String memberInfo; + + public Integer getMemberType() { + return memberType; + } + + public void setMemberType(Integer memberType) { + this.memberType = memberType; + } + + public String getMemberInfo() { + return memberInfo; + } + + public void setMemberInfo(String memberInfo) { + this.memberInfo = memberInfo; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/PhoneVerificationResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/PhoneVerificationResp.java new file mode 100644 index 0000000..c49bd33 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/PhoneVerificationResp.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 发送短信验证码 返回 + * + * @author LGH + */ +public class PhoneVerificationResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String phone; + + private String bizUserId; + + private String result; + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/QueryBankCardResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/QueryBankCardResp.java new file mode 100644 index 0000000..fb0e952 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/QueryBankCardResp.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +/** + * @author lanhai + */ +public class QueryBankCardResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private List bindCardList; + + public List getBindCardList() { + return bindCardList; + } + + public void setBindCardList(List bindCardList) { + this.bindCardList = bindCardList; + } + + @Override + public String toString() { + return "QueryBankCardResp{" + + "bindCardList=" + bindCardList + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/QueryBindAcctResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/QueryBindAcctResp.java new file mode 100644 index 0000000..e0db6f5 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/QueryBindAcctResp.java @@ -0,0 +1,61 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author gaozijie + * @date 2023-04-25 + */ +public class QueryBindAcctResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户用户id + */ + private String bizUserId; + + /** + * 绑定账户支付信息列表 + */ + private List acctInfoList; + + /** + * 结果 + */ + private String result; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public List getAcctInfoList() { + return acctInfoList; + } + + public void setAcctInfoList(List acctInfoList) { + this.acctInfoList = acctInfoList; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + @Override + public String toString() { + return "QueryBindAcctResp{" + + "bizUserId='" + bizUserId + '\'' + + ", acctInfoList=" + acctInfoList + + ", result='" + result + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SetPayPwdResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SetPayPwdResp.java new file mode 100644 index 0000000..3fae60b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SetPayPwdResp.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-05-23 + */ +public class SetPayPwdResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户userId + */ + private String bizUserId; + /** + * 状态( 成功:OK, 失败:error) + */ + private String status; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return "SetPayPwdResp{" + + "bizUserId='" + bizUserId + '\'' + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SetRealNameResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SetRealNameResp.java new file mode 100644 index 0000000..dd34fb8 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SetRealNameResp.java @@ -0,0 +1,74 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 个人实名认证 + * + * @author LGH + */ +public class SetRealNameResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private String name; + + /** + * 证件类型 目前只支持身份证 + */ + private Integer identityType = 1; + + /** + * 证件号码 + */ + private String identityNo; + + private String bizUserId; + + public SetRealNameResp() { + } + + + public SetRealNameResp(String name, + String identityNo, String bizUserId) { + this.identityType = null; + this.identityNo = identityNo; + this.bizUserId = bizUserId; + this.name = name; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getIdentityType() { + return identityType; + } + + public void setIdentityType(Integer identityType) { + this.identityType = identityType; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SignContractQueryResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SignContractQueryResp.java new file mode 100644 index 0000000..cbc6292 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/SignContractQueryResp.java @@ -0,0 +1,61 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * 查询签约信息响应 + * @author lanhai + */ +public class SignContractQueryResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String bizUserId; + + private String contractNo; + + private String accProtocolNo; + + private String status; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getContractNo() { + return contractNo; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public String getAccProtocolNo() { + return accProtocolNo; + } + + public void setAccProtocolNo(String accProtocolNo) { + this.accProtocolNo = accProtocolNo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return "SignContractQueryResp{" + + "bizUserId='" + bizUserId + '\'' + + ", contractNo='" + contractNo + '\'' + + ", accProtocolNo='" + accProtocolNo + '\'' + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/TokenResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/TokenResp.java new file mode 100644 index 0000000..7f29545 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/TokenResp.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author TRACK + */ +public class TokenResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private String token; + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + @Override + public String toString() { + return "TokenResp{" + + "token='" + token + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UpdatePhoneByPayPwdResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UpdatePhoneByPayPwdResp.java new file mode 100644 index 0000000..3ffc56e --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/member/resp/UpdatePhoneByPayPwdResp.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.payment.allinpay.member.resp; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class UpdatePhoneByPayPwdResp implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商户userId + */ + private String bizUserId; + + /** + * 状态(OK:成功, 失败:error) + */ + private String status; + + /** + * 新手机号 + */ + private String newPhone; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getNewPhone() { + return newPhone; + } + + public void setNewPhone(String newPhone) { + this.newPhone = newPhone; + } + + @Override + public String toString() { + return "UpdatePhoneByPayPwdResp{" + + "bizUserId='" + bizUserId + '\'' + + ", status='" + status + '\'' + + ", newPhone='" + newPhone + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/AbstractOrderReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/AbstractOrderReq.java new file mode 100644 index 0000000..132ed19 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/AbstractOrderReq.java @@ -0,0 +1,17 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + + +import com.tmerclub.cloud.payment.allinpay.AbstractReq; + +/** + * @author LGH + */ +public abstract class AbstractOrderReq extends AbstractReq { + + public static final String SERVICE_NAME = "orderService"; + + @Override + public String getService() { + return SERVICE_NAME; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/AgentPay.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/AgentPay.java new file mode 100644 index 0000000..8293599 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/AgentPay.java @@ -0,0 +1,218 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +import java.util.List; + +/** + * 单笔托管代付列表 + * + * @author lhd + */ +public class AgentPay extends AbstractOrderReq { + /** + * 商户订单号(支付订单) + * 全局唯一,不可重复 + * 不可包含“|”字符 + */ + private String bizOrderNo; + /** + * 源托管代收订单付款信息 + */ + private List collectPayList; + /** + * 收款方的账户集编号 + */ + private String accountSetNo; + /** + * 后台通知地址 + */ + private String backUrl; + /** + * 金额,单位:分 + */ + private Long amount; + /** + * 手续费,单位:分;内扣,如果不存在,则填0;如amount为100,fee为2,实际到账金额为98 + * 到账到平台余额 + */ + private Long fee; + /** + * 分账规则 + * 内扣. + * 支持分账到会员或者平台账户。 + * 分账规则:分账层级数<=3,分账总会员数<=10 + */ + private List splitRuleList; + /** + * 单个代付需填写 + * 业务码,代收消费金[3001] + 代付购买金[4001] + */ + private String tradeCode; + /** + * 单个代付需填写 + * 方法名称 + */ + public static final String METHOD_NAME = "signalAgentPay"; + + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public AgentPay() { + } + + public AgentPay(String bizOrderNo, List collectPay, String bizUserId, + String accountSetNo, String backUrl, Long amount, Long fee, String tradeCode) { + this.bizOrderNo = bizOrderNo; + this.collectPayList = collectPay; + this.bizUserId = bizUserId; + this.accountSetNo = accountSetNo; + this.backUrl = backUrl; + this.amount = amount; + this.fee = fee; + this.tradeCode = tradeCode; + } + + public List getSplitRuleList() { + return splitRuleList; + } + + public void setSplitRuleList(List splitRuleList) { + this.splitRuleList = splitRuleList; + } + + public String getTradeCode() { + return tradeCode; + } + + public void setTradeCode(String tradeCode) { + this.tradeCode = tradeCode; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public List getCollectPayList() { + return collectPayList; + } + + public void setCollectPayList(List collectPay) { + this.collectPayList = collectPay; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public String getBackUrl() { + return backUrl; + } + + public void setBackUrl(String backUrl) { + this.backUrl = backUrl; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + /** + * 源托管代收订单付款信息 + */ + public static class CollectPay { + /** + * 相关代收交易的“商户订单号” + */ + private String bizOrderNo; + /** + * 相关代收订单,云商通订单号 + */ + private String orderNo; + /** + * 非必填,一年前的代收订单必须上送,yyyy-MM-dd 精确到天 + */ + private String bizOrderCreateDate; + /** + * 金额,单位:分;部分代付时,可以少于或等于托管代收订单金额 + */ + private Long amount; + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderCreateDate() { + return bizOrderCreateDate; + } + + public void setBizOrderCreateDate(String bizOrderCreateDate) { + this.bizOrderCreateDate = bizOrderCreateDate; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "CollectPayList{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", orderNo='" + orderNo + '\'' + + ", bizOrderCreateDate='" + bizOrderCreateDate + '\'' + + ", amount='" + amount + '\'' + + '}'; + } + } + + @Override + public String toString() { + return "AgentPay{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", collectPay=" + collectPayList + + ", accountSetNo='" + accountSetNo + '\'' + + ", backUrl='" + backUrl + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", splitRuleList=" + splitRuleList + + ", tradeCode='" + tradeCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/BatchAgentPay.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/BatchAgentPay.java new file mode 100644 index 0000000..f514668 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/BatchAgentPay.java @@ -0,0 +1,76 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +import java.util.List; + +/** + * 批量托管代付 + * + * @author lhd + */ +public class BatchAgentPay extends AbstractOrderReq { + /** + * 商户批次号 + */ + private String bizBatchNo; + /** + * 批量代付列表 + */ + private List batchPayList; + /** + * 业务码,代收消费金[3001] + 代付购买金[4001] + */ + private String tradeCode; + + /** + * 方法名称 + */ + public static final String METHOD_NAME = "batchAgentPay"; + + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public BatchAgentPay() { + } + + public BatchAgentPay(String bizBatchNo, List agentPay, String tradeCode) { + this.bizBatchNo = bizBatchNo; + this.batchPayList = agentPay; + this.tradeCode = tradeCode; + } + + public String getBizBatchNo() { + return bizBatchNo; + } + + public void setBizBatchNo(String bizBatchNo) { + this.bizBatchNo = bizBatchNo; + } + + public List getBatchPayList() { + return batchPayList; + } + + public void setBatchPayList(List agentPay) { + this.batchPayList = agentPay; + } + + public String getTradeCode() { + return tradeCode; + } + + public void setTradeCode(String tradeCode) { + this.tradeCode = tradeCode; + } + + @Override + public String toString() { + return "BatchAgentPay{" + + ", bizBatchNo='" + bizBatchNo + '\'' + + ", batchPayList=" + batchPayList + + ", tradeCode='" + tradeCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/GetOrderStatusReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/GetOrderStatusReq.java new file mode 100644 index 0000000..0db84e1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/GetOrderStatusReq.java @@ -0,0 +1,53 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 获取订单信息 + * + * @author TRACK + */ +public class GetOrderStatusReq extends AbstractOrderReq { + + public static final String METHOD_NAME = "getOrderStatus"; + + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + + public GetOrderStatusReq() { + } + + public GetOrderStatusReq(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String getMethod() { + return METHOD_NAME; + } + + @Override + public String getBizUserId() { + return bizUserId; + } + + @Override + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + @Override + public String toString() { + return "GetOrderStatus{" + + "bizOrderNo='" + bizOrderNo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayByPwd.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayByPwd.java new file mode 100644 index 0000000..fd6cf9a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayByPwd.java @@ -0,0 +1,92 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 确认支付(前台+密码验证) + * + * @author lhd + */ +public class PayByPwd extends AbstractOrderReq { + /** + * 跳转页面类型,非必填 + */ + private Long jumpPageType; + /** + * 订单申请的商户订单号(支付订单) + */ + private String bizOrderNo; + /** + * 确认支付失败后,跳转商户页面 + * 若上送则失败页面显示“关闭”按钮可跳转至商户失败跳转地址,云商通不响应内容 + * 若正常域名或无特殊字符,以http/https开头明文请求,无需加密 + * 若含IP地址形式或“#”号,需要加密后再请求 + * RSA加密 + */ + private String errorJumpUrl; + /** + * 确认支付之后,跳转返回的页面地址 + * 若正常域名或无特殊字符,以http/https开头明文请求,无需加密 + * 若含IP地址形式或“#”号,需要加密后再请求 + * RSA加密 + */ + private String jumpUrl; + + private String consumerIp; + + private static final String METHOD_NAME = "payByPwd"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getErrorJumpUrl() { + return errorJumpUrl; + } + + public void setErrorJumpUrl(String errorJumpUrl) { + this.errorJumpUrl = errorJumpUrl; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getConsumerIp() { + return consumerIp; + } + + public void setConsumerIp(String consumerIp) { + this.consumerIp = consumerIp; + } + + @Override + public String toString() { + return "PayByPwd{" + + "jumpPageType=" + jumpPageType + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", errorJumpUrl='" + errorJumpUrl + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", consumerIp='" + consumerIp + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayBySms.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayBySms.java new file mode 100644 index 0000000..412ca61 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/PayBySms.java @@ -0,0 +1,62 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * @author gaozijie + * @date 2023-04-27 + */ +public class PayBySms extends AbstractOrderReq { + + @Override + public String getMethod() { + return "payBySMS"; + } + + /** + * 商户订单号(*) + */ + private String bizOrderNo; + + /** + * 短信验证码(收银宝H5收银台不填) + */ + private String verificationCode; + + /** + * ip地址(*) + */ + private String consumerIp; + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + public String getConsumerIp() { + return consumerIp; + } + + public void setConsumerIp(String consumerIp) { + this.consumerIp = consumerIp; + } + + @Override + public String toString() { + return "PayBySms{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + ", consumerIp='" + consumerIp + '\'' + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryBalance.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryBalance.java new file mode 100644 index 0000000..f5b4b89 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryBalance.java @@ -0,0 +1,54 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 查询余额 + * + * @author LGH + */ +public class QueryBalance extends AbstractOrderReq { + + /** + * 账户集编号 + */ + private String accountSetNo; + /** + * 是否为用户钱包 + */ + private Integer walletType; + + /** + * 方法名称 + */ + public static final String METHOD_NAME = "queryBalance"; + + @Override + public String getMethod() { + return METHOD_NAME; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public Integer getWalletType() { + return walletType; + } + + public void setWalletType(Integer walletType) { + this.walletType = walletType; + } + + public QueryBalance() { + } + + public QueryBalance(String bizUserId, String accountSetNo) { + this.bizUserId = bizUserId; + this.accountSetNo = accountSetNo; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryReserveFundBalanceReq.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryReserveFundBalanceReq.java new file mode 100644 index 0000000..730109a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/QueryReserveFundBalanceReq.java @@ -0,0 +1,18 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * @author gaozijie + * @date 2023-06-02 + */ +public class QueryReserveFundBalanceReq extends AbstractOrderReq{ + + /** + * 方法名称 + */ + public static final String METHOD_NAME = "queryReserveFundBalance"; + + @Override + public String getMethod() { + return METHOD_NAME; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/SplitRule.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/SplitRule.java new file mode 100644 index 0000000..e701cce --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/req/SplitRule.java @@ -0,0 +1,94 @@ +package com.tmerclub.cloud.payment.allinpay.order.req; + +/** + * 分账规则 + * + * @author lhd + */ +public class SplitRule { + /** + * 相关代收交易的“商户订单号” + */ + private String bizUserId; + /** + * 如果向会员分账,不上送,默认为唯一托管账户集。 + * 如果向平台分账,请填写平台的标准账户集编号(不支持100003-准备金额度账户集)。详细 + */ + private String accountSetNo; + /** + * 非必填,一年前的代收订单必须上送,yyyy-MM-dd 精确到天 + */ + private String bizOrderCreateDate; + /** + * 金额,单位:分;部分代付时,可以少于或等于托管代收订单金额 + */ + private Long amount; + /** + * 手续费 + */ + private Long fee; + /** + * 备注,非必填 + */ + private Long remark; + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public String getBizOrderCreateDate() { + return bizOrderCreateDate; + } + + public void setBizOrderCreateDate(String bizOrderCreateDate) { + this.bizOrderCreateDate = bizOrderCreateDate; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getFee() { + return fee; + } + + public void setFee(Long fee) { + this.fee = fee; + } + + public Long getRemark() { + return remark; + } + + public void setRemark(Long remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "SplitRule{" + + "bizUserId='" + bizUserId + '\'' + + ", accountSetNo='" + accountSetNo + '\'' + + ", bizOrderCreateDate='" + bizOrderCreateDate + '\'' + + ", amount=" + amount + + ", fee=" + fee + + ", remark=" + remark + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ApplicationCollectionResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ApplicationCollectionResp.java new file mode 100644 index 0000000..e65b503 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ApplicationCollectionResp.java @@ -0,0 +1,150 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 订单 返回 + * + * @author lhd + */ +public class ApplicationCollectionResp { + /** + * 支付状态 + * 仅交易验证方式为“0”时返回 + * 成功:success + * 进行中:pending + * 失败:fail + * 订单成功时会发订单结果通知商户。 + */ + private Integer payStatus; + private String payFailMessage; + private String bizUserId; + private String orderNo; + private String bizOrderNo; + private String reqPayInterfaceNo; + private String payInterfaceOutTradeNo; + private String payInterfacetrxcode; + private String acct; + /** + * 扩展参数 + */ + private String extendInfo; + /** + * 微信APP支付信息 + */ + private String weChatAPPInfo; + /** + * 扫码支付信息/ JS支付串信息(微信、支付宝、QQ钱包)/微信小程序/微信原生H5支付串信息/支付宝原生APP支付串信息 + * 1、扫码支付(正扫)必传; + * 微信、支付宝的支付串,供转化为二维码 + * 2. JS支付必传; + * 微信公众号JS支付:返回json字符串。 + * 支付宝JS支付:返回json字符串。 + * 支付宝JS支付:返回支付宝交易单号,将此参数上送至“支付宝服务窗文档的创建订单+JSAPI唤起收银台支付”方法中 tradeNO参数 + * QQ钱包的JS支付:返回支付的链接,消费者只需跳转到此链接即可完成支付。 + * 3、收银宝微信小程序支付参数/微信原生小程序支付参数必传 + * 注:有效时间60分钟 + * 4、微信原生H5支付参数 + * 微信返回mweb_url支付跳转链接,消费者只需跳转此链接完成支付,有效期5分钟 + * 5、支付宝原生APP支付参数必传,商户获取支付串调用支付宝APP端SDK直接呼起支付宝APP支付即可 + */ + private String payInfo; + /** + * 交易验证方式 + */ + private String validateType; + + public Integer getPayStatus() { + return payStatus; + } + + public void setPayStatus(Integer payStatus) { + this.payStatus = payStatus; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getReqPayInterfaceNo() { + return reqPayInterfaceNo; + } + + public void setReqPayInterfaceNo(String reqPayInterfaceNo) { + this.reqPayInterfaceNo = reqPayInterfaceNo; + } + + public String getPayInterfaceOutTradeNo() { + return payInterfaceOutTradeNo; + } + + public void setPayInterfaceOutTradeNo(String payInterfaceOutTradeNo) { + this.payInterfaceOutTradeNo = payInterfaceOutTradeNo; + } + + public String getPayInterfacetrxcode() { + return payInterfacetrxcode; + } + + public void setPayInterfacetrxcode(String payInterfacetrxcode) { + this.payInterfacetrxcode = payInterfacetrxcode; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + public String getWeChatAPPInfo() { + return weChatAPPInfo; + } + + public void setWeChatAPPInfo(String weChatAPPInfo) { + this.weChatAPPInfo = weChatAPPInfo; + } + + public String getPayInfo() { + return payInfo; + } + + public void setPayInfo(String payInfo) { + this.payInfo = payInfo; + } + + public String getValidateType() { + return validateType; + } + + public void setValidateType(String validateType) { + this.validateType = validateType; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/BatchAgentPayResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/BatchAgentPayResp.java new file mode 100644 index 0000000..477f645 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/BatchAgentPayResp.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 批量托管代付列表请求返回 + * + * @author lhd + */ +public class BatchAgentPayResp { + /** + * 商户批次号 + */ + private String bizBatchNo; + + public String getBizBatchNo() { + return bizBatchNo; + } + + public void setBizBatchNo(String bizBatchNo) { + this.bizBatchNo = bizBatchNo; + } + + @Override + public String toString() { + return "BatchAgentPayResp{" + + "bizBatchNo='" + bizBatchNo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ConsumeApplyResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ConsumeApplyResp.java new file mode 100644 index 0000000..be68f22 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/ConsumeApplyResp.java @@ -0,0 +1,155 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +import java.util.Map; + +/** + * @author gaozijie + * @date 2023-04-04 + */ +public class ConsumeApplyResp { + /** + * 支付状态 + */ + private String payStatus; + + /** + * 支付失败信息 + */ + private String payFailMessage; + + /** + * 商户userId(付款人) + */ + private String bizUserId; + + /** + * 云商通订单编号 + */ + private String orderNo; + + /** + * 商户订单编号 + */ + private String bizOrderNo; + + /** + * 交易编号 + */ + private String tradeNo; + + /** + * 拓展参数 + */ + private String extendInfo; + + /** + * 微信APP支付信息 + */ + private Map weChatAPPInfo; + + /** + * 支付信息 + */ + private String payInfo; + + /** + * 交易验证方式 + */ + private Integer validateType; + + public String getPayStatus() { + return payStatus; + } + + public void setPayStatus(String payStatus) { + this.payStatus = payStatus; + } + + public String getPayFailMessage() { + return payFailMessage; + } + + public void setPayFailMessage(String payFailMessage) { + this.payFailMessage = payFailMessage; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getTradeNo() { + return tradeNo; + } + + public void setTradeNo(String tradeNo) { + this.tradeNo = tradeNo; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + public Map getWeChatAPPInfo() { + return weChatAPPInfo; + } + + public void setWeChatAPPInfo(Map weChatAPPInfo) { + this.weChatAPPInfo = weChatAPPInfo; + } + + public String getPayInfo() { + return payInfo; + } + + public void setPayInfo(String payInfo) { + this.payInfo = payInfo; + } + + public Integer getValidateType() { + return validateType; + } + + public void setValidateType(Integer validateType) { + this.validateType = validateType; + } + + @Override + public String toString() { + return "ConsumeApplyResp{" + + "payStatus='" + payStatus + '\'' + + ", payFailMessage='" + payFailMessage + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", tradeNo='" + tradeNo + '\'' + + ", extendInfo='" + extendInfo + '\'' + + ", weChatAPPInfo=" + weChatAPPInfo + + ", payInfo='" + payInfo + '\'' + + ", validateType=" + validateType + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/FreezeMoneyResp.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/FreezeMoneyResp.java new file mode 100644 index 0000000..c12f391 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/FreezeMoneyResp.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 冻结/解冻金额 返回 + * + * @author LGH + */ +public class FreezeMoneyResp { + + /** + * 商户冻结金额订单号 + */ + private String bizFreezenNo; + + /** + * 冻结/解冻金额 + */ + private Integer amount; + + public String getBizFreezenNo() { + return bizFreezenNo; + } + + public void setBizFreezenNo(String bizFreezenNo) { + this.bizFreezenNo = bizFreezenNo; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/OrderResultNotice.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/OrderResultNotice.java new file mode 100644 index 0000000..5309dbe --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/order/resp/OrderResultNotice.java @@ -0,0 +1,326 @@ +package com.tmerclub.cloud.payment.allinpay.order.resp; + +/** + * 订单结果通知 + * 1.入金类交易(使用银行账户资金进行支付),只有订单支付成功情况下才会通知; + * 2.出金类交易(提现),不管失败或者成功都会通知。 + * @author gaozijie + * @date 2023-03-31 + */ +public class OrderResultNotice { + /** + * 通联订单号 + */ + private String orderNo; + + /** + * 商户订单号(支付订单) + */ + private String bizOrderNo; + + /** + * 原通联订单号 + */ + private String oriOrderNo; + + /** + * 原商户订单号 + */ + private String oriBizOrderNo; + + /** + * 付款人(商户userId) + */ + private String buyerBizUserId; + + /** + * 退款去向(1:到账户余额,2:到原支付账户银行卡/微信/支付宝) + */ + private Long refundWhereabouts; + + /** + * 代付去向(1:到账户余额) + */ + private Long payWhereabouts; + + /** + * 微信支付的openid + * 支付宝平台的user_id + * 刷卡交易的隐藏卡号 + */ + private String acct; + + /** + * 借贷标记(00:借记卡,01:存折,02:信用卡,03:准贷记卡,04:预付费卡,05:境外卡,99:其他) + */ + private String accttype; + + /** + * 终端号 + */ + private String termno; + + /** + * 终端授权码 + */ + private String termauthno; + + /** + * 渠道商户号(收银宝商户号) + */ + private String cusid; + + /** + * 通道交易流水号 + */ + private String payInterfaceOutTradeNo; + + /** + * 支付渠道交易单号 + */ + private String chnltrxid; + + /** + * 交易参考号 + */ + private String termrefnum; + + /** + * 渠道手续费 + */ + private String channelFee; + + /** + * 渠道交易完成时间 + */ + private String channelPayTime; + + /** + * 渠道交易类型 + */ + private String payInterfacetrxcode; + + /** + * 收银宝终端流水 + */ + private String traceno; + + /** + * 拓展参数(原样返回) + */ + private String extendInfo; + + /** + * 收银宝渠道信息 + */ + private String chnldata; + + /** + * 订单是否成功(OK:成功,error:失败,pending:进行中) + */ + private String status; + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getOriOrderNo() { + return oriOrderNo; + } + + public void setOriOrderNo(String oriOrderNo) { + this.oriOrderNo = oriOrderNo; + } + + public String getOriBizOrderNo() { + return oriBizOrderNo; + } + + public void setOriBizOrderNo(String oriBizOrderNo) { + this.oriBizOrderNo = oriBizOrderNo; + } + + public String getBuyerBizUserId() { + return buyerBizUserId; + } + + public void setBuyerBizUserId(String buyerBizUserId) { + this.buyerBizUserId = buyerBizUserId; + } + + public Long getRefundWhereabouts() { + return refundWhereabouts; + } + + public void setRefundWhereabouts(Long refundWhereabouts) { + this.refundWhereabouts = refundWhereabouts; + } + + public Long getPayWhereabouts() { + return payWhereabouts; + } + + public void setPayWhereabouts(Long payWhereabouts) { + this.payWhereabouts = payWhereabouts; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + public String getAccttype() { + return accttype; + } + + public void setAccttype(String accttype) { + this.accttype = accttype; + } + + public String getTermno() { + return termno; + } + + public void setTermno(String termno) { + this.termno = termno; + } + + public String getTermauthno() { + return termauthno; + } + + public void setTermauthno(String termauthno) { + this.termauthno = termauthno; + } + + public String getCusid() { + return cusid; + } + + public void setCusid(String cusid) { + this.cusid = cusid; + } + + public String getPayInterfaceOutTradeNo() { + return payInterfaceOutTradeNo; + } + + public void setPayInterfaceOutTradeNo(String payInterfaceOutTradeNo) { + this.payInterfaceOutTradeNo = payInterfaceOutTradeNo; + } + + public String getChnltrxid() { + return chnltrxid; + } + + public void setChnltrxid(String chnltrxid) { + this.chnltrxid = chnltrxid; + } + + public String getTermrefnum() { + return termrefnum; + } + + public void setTermrefnum(String termrefnum) { + this.termrefnum = termrefnum; + } + + public String getChannelFee() { + return channelFee; + } + + public void setChannelFee(String channelFee) { + this.channelFee = channelFee; + } + + public String getChannelPayTime() { + return channelPayTime; + } + + public void setChannelPayTime(String channelPayTime) { + this.channelPayTime = channelPayTime; + } + + public String getPayInterfacetrxcode() { + return payInterfacetrxcode; + } + + public void setPayInterfacetrxcode(String payInterfacetrxcode) { + this.payInterfacetrxcode = payInterfacetrxcode; + } + + public String getTraceno() { + return traceno; + } + + public void setTraceno(String traceno) { + this.traceno = traceno; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + public String getChnldata() { + return chnldata; + } + + public void setChnldata(String chnldata) { + this.chnldata = chnldata; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return "OrderResultNotice{" + + "orderNo='" + orderNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", oriOrderNo='" + oriOrderNo + '\'' + + ", oriBizOrderNo='" + oriBizOrderNo + '\'' + + ", buyerBizUserId='" + buyerBizUserId + '\'' + + ", refundWhereabouts=" + refundWhereabouts + + ", payWhereabouts=" + payWhereabouts + + ", acct='" + acct + '\'' + + ", accttype='" + accttype + '\'' + + ", termno='" + termno + '\'' + + ", termauthno='" + termauthno + '\'' + + ", cusid='" + cusid + '\'' + + ", payInterfaceOutTradeNo='" + payInterfaceOutTradeNo + '\'' + + ", chnltrxid='" + chnltrxid + '\'' + + ", termrefnum='" + termrefnum + '\'' + + ", channelFee='" + channelFee + '\'' + + ", channelPayTime='" + channelPayTime + '\'' + + ", payInterfacetrxcode='" + payInterfacetrxcode + '\'' + + ", traceno='" + traceno + '\'' + + ", extendInfo='" + extendInfo + '\'' + + ", chnldata='" + chnldata + '\'' + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/service/AllinpayOrderService.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/service/AllinpayOrderService.java new file mode 100644 index 0000000..bcbc1b0 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/service/AllinpayOrderService.java @@ -0,0 +1,212 @@ +package com.tmerclub.cloud.payment.allinpay.service; + +import com.tmerclub.cloud.api.payment.allinpay.order.resp.DepositApplyResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.payment.allinpay.order.req.*; +import com.tmerclub.cloud.payment.allinpay.order.resp.*; +import com.tmerclub.cloud.payment.allinpay.order.req.*; +import com.tmerclub.cloud.payment.allinpay.order.resp.*; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 订单服务 测试 + * + * @author LGH + */ +@Component +public class AllinpayOrderService { + + @Autowired + private AllinpayConfig allinpayConfig; + + /** + * 冻结金额 + * + * @param fm 冻结参数 + * @return FreezeMoneyRep 冻结金额返回参数 + */ + public FreezeMoneyResp freezeMoney(FreezeMoney fm) { + return allinpayConfig.sendData(fm, FreezeMoneyResp.class); + } + + /** + * 解冻金额 + * + * @param um 解冻参数 + * @return FreezeMoneyRep 解冻金额返回参数 + */ + public FreezeMoneyResp unfreezeMoney(UnfreezeMoney um) { + return allinpayConfig.sendData(um, FreezeMoneyResp.class); + } + + + /** + * 平台转账 + * + * @param at 平台转账参数 + * @return applicationTransferReq 平台转账返回参数 + */ + public ApplicationTransferResp applicationTransfer(ApplicationTransfer at) { + return allinpayConfig.sendData(at, ApplicationTransferResp.class); + } + + /** + * 查询余额 + * + * @param qb 余额参数 + * @return queryBalancereq 查询余额返回参数 + */ + public QueryBalanceResp queryBalance(QueryBalance qb) { + return allinpayConfig.sendData(qb, QueryBalanceResp.class); + } + + /** + * 查询订单状态 + */ + public OrderDetailResp orderDetail(GetOrderDetail od) { + return allinpayConfig.sendData(od, OrderDetailResp.class); + } + + /** + * 查询账户收支明细 + */ + public QueryInExpDetailResp queryInExpDetail(QueryInExpDetail qied) { + return allinpayConfig.sendData(qied, QueryInExpDetailResp.class); + } + + /** + * 单笔托管代付 + * + * @param agentPay 单笔托管代付 + * @return applicationTransferReq 平台转账返回参数 + */ + public AgentPayResp signalAgentPay(AgentPay agentPay) { + return allinpayConfig.sendData(agentPay, AgentPayResp.class); + } + + /** + * 批量托管代付 + * + * @param agentPay 批量托管代付 + * @return applicationTransferReq 平台转账返回参数 + */ + public BatchAgentPayResp batchAgentPay(BatchAgentPay agentPay) { + return allinpayConfig.sendData(agentPay, BatchAgentPayResp.class); + } + + /** + * 退款申请 + * + * @param refund 单笔托管代付 + * @return applicationTransferReq 平台转账返回参数 + */ + public RefundResp doRefund(Refund refund) { + return allinpayConfig.sendData(refund, RefundResp.class); + } + + /** + * 托管代收申请(标准版) + * + * @param ac 托管代收参数 + * @return applicationTransferReq 托管代收返回参数 + */ + public ApplicationCollectionResp agentCollectApply(ApplicationCollection ac) { + return allinpayConfig.sendData(ac, ApplicationCollectionResp.class); + } + + /** + * 确认支付(前台+支付密码) + * + * @param payByPwd 余额支付参数 + * @return applicationTransferReq 余额支付返回参数 + */ + public String payByPwd(PayByPwd payByPwd) { + return allinpayConfig.sendUrlData(payByPwd); + } + + /** + * 提现申请 + * + * @param withdrawApplyReq + * @return + */ + public WithdrawApplyResp withdrawApply(WithdrawApplyReq withdrawApplyReq) { + return allinpayConfig.sendData(withdrawApplyReq, WithdrawApplyResp.class); + } + + /** + * 确认支付(前台+短信验证码) + * + * @param payBySms + * @return + */ + public String payBySms(PayBySms payBySms) { + return allinpayConfig.sendUrlData(payBySms); + } + + /** + * 确认支付 后台+短信验证码 + * + * @param payByBackSmsReq + * @return + */ + public PayByBackSmsResp payByBackSms(PayByBackSmsReq payByBackSmsReq) { + return allinpayConfig.sendData(payByBackSmsReq, PayByBackSmsResp.class); + } + + /** + * 重发支付短信验证码 + * + * @param resendPaySmsReq + * @return + */ + public ResendPaySmsResp resendPaySms(ResendPaySmsReq resendPaySmsReq) { + //2. 验证码发送规则:验证码在有效期内,发原验证码,过有效期,发新的验证码; + //3. 验证码发送频次:10s内不允许重复调用该接口,避免暴力发送短信验证码,返回错误信息“调用重发短信接口太频繁,请稍后再试!”; + //4. 若订单状态为支付完成、进行中、支付失败、关闭;超过订单过期时间(上送取过期时间值判断、未上送取30分钟判断),返回错误信息“订单处理完成或处理中,不支持重发短信!”; + return allinpayConfig.sendData(resendPaySmsReq, ResendPaySmsResp.class); + } + + /** + * 充值申请 + * + * @param depositApply + * @return + */ + public DepositApplyResp depositApply(DepositApply depositApply) { + return allinpayConfig.sendData(depositApply, DepositApplyResp.class); + } + + /** + * 消费申请 + * + * @param consumeApply + * @return + */ + public ConsumeApplyResp consumeApply(ConsumeApply consumeApply) { + return allinpayConfig.sendData(consumeApply, ConsumeApplyResp.class); + } + + /** + * 获取订单信息 + * + * @param getOrderStatusReq + * @return + */ + public GetOrderStatusResp getOrderStatus(GetOrderStatusReq getOrderStatusReq) { + return allinpayConfig.sendData(getOrderStatusReq, GetOrderStatusResp.class); + } + + /** + * 平台头寸查询 + * @param queryReserveFundBalanceReq + * @return + */ + public QueryReserveFundBalanceResp queryReserveFundBalance(QueryReserveFundBalanceReq queryReserveFundBalanceReq) { + return allinpayConfig.sendData(queryReserveFundBalanceReq, QueryReserveFundBalanceResp.class); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Base64.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Base64.java new file mode 100644 index 0000000..4abf0c3 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Base64.java @@ -0,0 +1,117 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.util; + +import com.tmerclub.cloud.common.constant.Constant; + +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; + +/** + * @author lanhai + */ +public class Base64 { + private static final char[] BASE_64_ENCODE_CHARS = {'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[] BASE_64_DECODE_CHARS = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1}; + + public static String encode(byte[] data) { + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + int len = data.length; + int i = 0; + + while (i < len) { + int b1 = data[i++] & 255; + if (i == len) { + sb.append(BASE_64_ENCODE_CHARS[b1 >>> 2]); + sb.append(BASE_64_ENCODE_CHARS[(b1 & 3) << 4]); + sb.append("=="); + break; + } + + int b2 = data[i++] & 255; + int i1 = (b1 & 3) << 4 | (b2 & 240) >>> 4; + if (i == len) { + sb.append(BASE_64_ENCODE_CHARS[b1 >>> 2]); + sb.append(BASE_64_ENCODE_CHARS[i1]); + sb.append(BASE_64_ENCODE_CHARS[(b2 & 15) << 2]); + sb.append("="); + break; + } + + int b3 = data[i++] & 255; + sb.append(BASE_64_ENCODE_CHARS[b1 >>> 2]); + sb.append(BASE_64_ENCODE_CHARS[i1]); + sb.append(BASE_64_ENCODE_CHARS[(b2 & 15) << 2 | (b3 & 192) >>> 6]); + sb.append(BASE_64_ENCODE_CHARS[b3 & 63]); + } + + return sb.toString(); + } + + @SuppressWarnings("DuplicatedCode") + public static byte[] decode(String str) { + byte[] data = str.getBytes(StandardCharsets.UTF_8); + int len = data.length; + ByteArrayOutputStream buf = new ByteArrayOutputStream(len); + int i = 0; + + while (i < len) { + byte b1; + do { + b1 = BASE_64_DECODE_CHARS[data[i++]]; + } while (i < len && b1 == -1); + + if (b1 == -1) { + break; + } + + byte b2; + do { + b2 = BASE_64_DECODE_CHARS[data[i++]]; + } while (i < len && b2 == -1); + + if (b2 == -1) { + break; + } + + buf.write(b1 << 2 | (b2 & 48) >>> 4); + + byte b3; + do { + b3 = data[i++]; + if (b3 == 61) { + return buf.toByteArray(); + } + + b3 = BASE_64_DECODE_CHARS[b3]; + } while (i < len && b3 == -1); + + if (b3 == -1) { + break; + } + + buf.write((b2 & 15) << 4 | (b3 & 60) >>> 2); + + byte b4; + do { + b4 = data[i++]; + if (b4 == 61) { + return buf.toByteArray(); + } + + b4 = BASE_64_DECODE_CHARS[b4]; + } while (i < len && b4 == -1); + + if (b4 == -1) { + break; + } + + buf.write((b3 & 3) << 6 | b4); + } + + return buf.toByteArray(); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm4Context.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm4Context.java new file mode 100644 index 0000000..9e07eba --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/allinpay/util/Sm4Context.java @@ -0,0 +1,15 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.tmerclub.cloud.payment.allinpay.util; +/** + * @author lanhai + */ +public class Sm4Context { + public int mode = 1; + public final long[] sk = new long[32]; + public boolean isPadding = true; + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/AlipayServicePayBO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/AlipayServicePayBO.java new file mode 100644 index 0000000..566723c --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/AlipayServicePayBO.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.payment.bo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author gaozijie + * @date 2023-03-30 + */ +public class AlipayServicePayBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付宝JS支付userId + */ + private String acct; + + /** + * 支付金额(单位:分) + */ + private String amount; + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + @Override + public String toString() { + return "AlipayServicePayBO{" + + "acct='" + acct + '\'' + + ", amount='" + amount + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/PayInfoBO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/PayInfoBO.java new file mode 100644 index 0000000..9ce2cb1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/bo/PayInfoBO.java @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.bo; + +import com.tmerclub.cloud.api.order.vo.ShopAmountVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/25 + */ +public class PayInfoBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付信息,如商品名称 + */ + private String body; + + /** + * 支付单号 + */ + private Long payId; + + /** + * 付款金额 + */ + private Long payAmount; + + /** + * 支付方式 + */ + private Integer payType; + + /** + * api回调域名 + */ + private String apiNoticeUrl; + + /** + * 支付完成会跳地址 + */ + private String returnUrl; + + /** + * 第三方用户id + */ + private String bizUserId; + + /** + * 通联用户id + */ + private String allinpayUserId; + + /** + * 支付回调地址类型 + */ + private Integer backType; + + /** + * 订单ids + */ + private String orderIds; + + /** + * 是否是购买会员 + */ + private Boolean isVip; + + /** + * 是否进行充值 + */ + private Boolean isRecharge; + + /** + * 用户id + */ + private String userId; + /** + * 系统类型 1:移动端 2:pc + */ + private Integer systemType; + /** + * 交易验证方式 0.仅渠道验证,通商云不做交易验证 1.通商云发送并验证短信验证码,有效期3分钟。2.验证通商云支付密码 + */ + private Long validateType; + /** + * 扩展信息,通联独有 + */ + private String extendInfo; + + /** + * 支付系统类型 0默认 1通联 + */ + private Integer paySysType; + + /** + * 收款ids + */ + private List receiveList; + + public List getReceiveList() { + return receiveList; + } + + public void setReceiveList(List receiveList) { + this.receiveList = receiveList; + } + + public String getExtendInfo() { + return extendInfo; + } + + public void setExtendInfo(String extendInfo) { + this.extendInfo = extendInfo; + } + + public Long getValidateType() { + return validateType; + } + + public void setValidateType(Long validateType) { + this.validateType = validateType; + } + + public Integer getSystemType() { + return systemType; + } + + public void setSystemType(Integer systemType) { + this.systemType = systemType; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public String getApiNoticeUrl() { + return apiNoticeUrl; + } + + public void setApiNoticeUrl(String apiNoticeUrl) { + this.apiNoticeUrl = apiNoticeUrl; + } + + public String getReturnUrl() { + return returnUrl; + } + + public void setReturnUrl(String returnUrl) { + this.returnUrl = returnUrl; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + public Integer getBackType() { + return backType; + } + + public void setBackType(Integer backType) { + this.backType = backType; + } + + public Boolean getIsVip() { + return isVip; + } + + public void setIsVip(Boolean isVip) { + this.isVip = isVip; + } + + public Boolean getVip() { + return isVip; + } + + public void setVip(Boolean vip) { + isVip = vip; + } + + public Boolean getRecharge() { + return isRecharge; + } + + public void setRecharge(Boolean recharge) { + isRecharge = recharge; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + public String getAllinpayUserId() { + return allinpayUserId; + } + + public void setAllinpayUserId(String allinpayUserId) { + this.allinpayUserId = allinpayUserId; + } + + @Override + public String toString() { + return "PayInfoBO{" + + "body='" + body + '\'' + + ", payId=" + payId + + ", payAmount=" + payAmount + + ", payType=" + payType + + ", apiNoticeUrl='" + apiNoticeUrl + '\'' + + ", returnUrl='" + returnUrl + '\'' + + ", bizUserId='" + bizUserId + '\'' + + ", allinpayUserId='" + allinpayUserId + '\'' + + ", backType=" + backType + + ", orderIds='" + orderIds + '\'' + + ", isVip=" + isVip + + ", isRecharge=" + isRecharge + + ", userId='" + userId + '\'' + + ", systemType=" + systemType + + ", validateType=" + validateType + + ", extendInfo='" + extendInfo + '\'' + + ", paySysType=" + paySysType + + ", receiveList=" + receiveList + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/AliPayConfig.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/AliPayConfig.java new file mode 100644 index 0000000..9bb9836 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/AliPayConfig.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.config; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import com.alipay.api.*; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.Alipay; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 支付宝支付设置 + * + * @author FrozenWatermelon + */ +@Component +public class AliPayConfig { + + @Autowired + private FeignShopConfig feignShopConfig; + + public AlipayClient getAlipayClient() throws AlipayApiException { + + Alipay alipay = feignShopConfig.getAlipay(); + + //构造client + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + //设置网关地址 + certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); + //设置应用Id + certAlipayRequest.setAppId(alipay.getAppId()); + //设置应用私钥 + certAlipayRequest.setPrivateKey(alipay.getAppPrivateKey()); + //设置请求格式,固定值json + certAlipayRequest.setFormat("json"); + //设置字符集 + certAlipayRequest.setCharset(CharsetUtil.UTF_8); + //设置签名类型 + certAlipayRequest.setSignType(AlipayConstants.SIGN_TYPE_RSA2); + //设置应用公钥证书路径 + if (StrUtil.isBlank(alipay.getAppCertContent())) { + certAlipayRequest.setCertPath(FileUtil.getAbsolutePath(alipay.getAppCertPath())); + } else { + certAlipayRequest.setCertContent(alipay.getAppCertContent()); + } + //设置支付宝公钥证书路径 + if (StrUtil.isBlank(alipay.getAlipayCertContent())) { + certAlipayRequest.setAlipayPublicCertPath(FileUtil.getAbsolutePath(alipay.getAlipayCertPath())); + } else { + certAlipayRequest.setAlipayPublicCertContent(alipay.getAlipayCertContent()); + } + //设置支付宝根证书路径 + if (StrUtil.isBlank(alipay.getAlipayRootCertContent())) { + certAlipayRequest.setRootCertPath(FileUtil.getAbsolutePath(alipay.getAlipayRootCertPath())); + } else { + certAlipayRequest.setRootCertContent(alipay.getAlipayRootCertContent()); + } + //构造client + return new DefaultAlipayClient(certAlipayRequest); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/AllinpayConfig.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/AllinpayConfig.java new file mode 100644 index 0000000..b071e13 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/AllinpayConfig.java @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.config; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.Allinpay; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.payment.allinpay.AbstractReq; +import com.tmerclub.cloud.payment.allinpay.OpenClient; +import com.tmerclub.cloud.payment.allinpay.bean.BizParameter; +import com.tmerclub.cloud.payment.allinpay.bean.OpenConfig; +import com.tmerclub.cloud.payment.allinpay.bean.OpenRequest; +import com.tmerclub.cloud.payment.allinpay.bean.OpenResponse; +import com.tmerclub.cloud.payment.allinpay.member.resp.FileUploadBeforeResp; +import com.tmerclub.cloud.payment.allinpay.member.resp.TokenResp; +import com.tmerclub.cloud.payment.allinpay.util.SecretUtils; +import jakarta.servlet.http.HttpServletRequest; +import org.apache.commons.codec.binary.Base64; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.interfaces.RSAPrivateKey; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author TRACK + */ +@Component +public class AllinpayConfig { + + @Autowired + private FeignShopConfig feignShopConfig; + + private static final Logger LOG = LoggerFactory.getLogger(AllinpayConfig.class); + public static final String METHOD_PREFIX = "allinpay.yunst."; + public static final String SIGN_TYPE = "SHA256WithRSA"; + public static final String FILE_UPLOAD_CODE = "10000"; + public static final Integer NUM = 1024; + public static final String SUCCESS_MSG = "接口调用成功"; + public static final String SUCCESS_MSG_OK = "OK(接口调用成功)"; + + protected OpenClient client; + + public void configClient() { + Allinpay allinpay = feignShopConfig.getAllinpay(); + OpenConfig oc = new OpenConfig(allinpay.getRequestUrl(), allinpay.getAppId(), allinpay.getAppSecret(), allinpay.getAppPrivateCertPath(), allinpay.getAppPrivateKey(), allinpay.getAppCertPath()); + try { + client = new OpenClient(oc); + } catch (Exception e) { + LOG.error("异常:", e); + } + } + + + public T sendData(AbstractReq req, Class clazz) { + String responseData = getResponseData(req); + if (clazz == null) { + return null; + } + return JSON.parseObject(responseData, clazz); + } + + public void sendCreateData(AbstractReq req) { + getCreateResponseData(req); + } + + public String sendUrlData(AbstractReq req) { + return this.getUrlResponseData(req); + } + + public List sendDataGetArray(AbstractReq req, Class clazz) { + String responseData = getResponseData(req); + if (clazz == null) { + return null; + } + return JSON.parseArray(responseData, clazz); + } + + private String getResponseData(AbstractReq req) { + OpenResponse response = getOpenResponse(req); + LOG.info(JSON.toJSONString(response)); + if (ResponseEnum.OK.getMsg().toUpperCase(Locale.ROOT).equals(response.getSubCode())) { + return response.getData(); + } + throw new LuckException(response.getSubMsg()); + } + + private OpenResponse getOpenResponse(AbstractReq req) { + configClient(); + String method = METHOD_PREFIX + req.getService() + StrUtil.C_DOT + req.getMethod(); + BizParameter bizParameter = JSON.parseObject(JSON.toJSONString(req), BizParameter.class); + return client.execute(method, bizParameter); + } + + private void getCreateResponseData(AbstractReq req) { + OpenResponse response = getOpenResponse(req); + LOG.info(JSON.toJSONString(response)); + // 创建会员发生异常返回码也是ok,只有msg不同,所以校验一下msg + boolean msgIsSuccess = SUCCESS_MSG_OK.equals(response.getMsg()) || SUCCESS_MSG.equals(response.getMsg()) || ResponseEnum.OK.getMsg().toUpperCase(Locale.ROOT).equals(response.getMsg()); + if (ResponseEnum.OK.getMsg().toUpperCase(Locale.ROOT).equals(response.getSubCode()) && msgIsSuccess) { + return; + } + throw new LuckException(response.getSubMsg()); + } + + /** + * 获取通联url响应数据 + * + * @param req + * @return + */ + private String getUrlResponseData(AbstractReq req) { + OpenResponse response = getOpenResponse(req); + return JSON.parseObject(response.getData()).getString("url"); + } + + public Boolean signVerify(Map map) throws UnsupportedEncodingException { + configClient(); + String sign = map.remove("sign"); + map.remove("signType"); + String signedValue = map.entrySet().stream() + .map(e -> e.getKey() + "=" + e.getValue()).sorted() + .collect(Collectors.joining("&")); + return client.checkSign(URLDecoder.decode(signedValue, StandardCharsets.UTF_8), sign); + } + + public OpenClient getClient() { + configClient(); + return client; + } + + public String uploadFile(String imgUrl) { + try { + Allinpay allinpay = feignShopConfig.getAllinpay(); + File file = new File(imgUrl); + URL url = new URL(imgUrl); + URLConnection connection = url.openConnection(); + InputStream inputStream = connection.getInputStream(); + //创建HttpClient + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(allinpay.getRequestUrl().substring(0, allinpay.getRequestUrl().length() - 12) + "/file/open/uploadFile"); + MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + // 绑定文件参数,传入文件流和contentType,此处也可以继续添加其他formData参数 + String timeStamp = DateUtils.dateToString(new Date()); + builder.addBinaryBody("file", inputStream, ContentType.MULTIPART_FORM_DATA, file.getName()); + builder.addTextBody("appId", allinpay.getAppId()); + builder.addTextBody("timestamp", timeStamp); + //计算MD5开始 + URLConnection connectionMd5 = url.openConnection(); + InputStream inputStreamMd5 = connectionMd5.getInputStream(); + String md5 = getFileMd5(inputStreamMd5); + builder.addTextBody("md5", md5); + //计算MD5结束 + //加签开始 + Map resMap = new HashMap<>(3); + resMap.put("appId", allinpay.getAppId()); + resMap.put("timestamp", timeStamp); + resMap.put("md5", md5); + String source = getSignedValue(resMap); + RSAPrivateKey privateKey = (RSAPrivateKey) SecretUtils.loadPrivateKey(null, + allinpay.getAppPrivateCertPath(), allinpay.getAppPrivateKey()); + String sign = SecretUtils.sign(privateKey, source, "SHA256WithRSA"); + builder.addTextBody("sign", sign); + //加签结束 + HttpEntity entity = builder.build(); + httpPost.setEntity(entity); + //执行提交 + HttpResponse response = httpClient.execute(httpPost); + HttpEntity responseEntity = response.getEntity(); + if (responseEntity != null) { + //将响应的内容转换成字符串 + String result = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8); + //此处根据服务器返回的参数转换,这里返回的是JSON格式 + LOG.info("通联文件上传响应内容{}", result); + FileUploadBeforeResp fileUploadResp = JSON.parseObject(result, FileUploadBeforeResp.class); + if (Objects.equals(fileUploadResp.getCode(), FILE_UPLOAD_CODE)) { + return JSON.parseObject(fileUploadResp.getData(), TokenResp.class).getToken(); + } else { + throw new LuckException(fileUploadResp.getSubMsg()); + } + } + } catch (Exception ex) { + LOG.error("异常:", ex); + } + return null; + } + + private static String getSignedValue(Map params) { + Map copy = new TreeMap<>(); + params.forEach((k, v) -> { + if (v != null) { + copy.put(k, v); + } + }); + copy.remove("sign"); + StringBuilder sb = new StringBuilder(Constant.INITIAL_CAPACITY); + copy.forEach((k, v) -> sb.append(k).append("=").append(v).append("&")); + return sb.length() == 0 ? "" : sb.substring(0, sb.length() - 1); + } + + public static String getFileMd5(InputStream in) { + if (in == null) { + return null; + } + MessageDigest digest; + byte[] buffer = new byte[1024]; + int len; + try { + digest = MessageDigest.getInstance("MD5"); + while ((len = in.read(buffer, 0, NUM)) != -1) { + digest.update(buffer, 0, len); + } + in.close(); + } catch (Exception e) { + LOG.error("异常:", e); + return null; + } + byte[] bytes = Base64.encodeBase64(digest.digest()); + return new String(bytes, StandardCharsets.UTF_8); + } + + public OpenRequest validateAllinpayAndReturn(String data, HttpServletRequest request) throws UnsupportedEncodingException { + //乱码解决,这段代码在出现乱码时使用 + request.setCharacterEncoding("utf-8"); + Map params = getParams(request); + LOG.info("data:{}", data); + + // 验签 + Boolean flag = signVerify(params); + if (!flag) { + LOG.error("验签失败+data={}", params); + throw new LuckException("验签失败"); + } + String paramsStr = JSON.toJSONString(params); + return JSONObject.parseObject(paramsStr, OpenRequest.class); + } + + public Map getParams(HttpServletRequest request) { + //获取POST过来反馈信息 + Map params = new TreeMap<>(); + Map requestParams = request.getParameterMap(); + for (String name : requestParams.keySet()) { + String[] values = requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] + : valueStr + values[i] + ","; + } + params.put(name, valueStr); + } + return params; + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/RocketMqConfig.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/RocketMqConfig.java new file mode 100644 index 0000000..23ee0b2 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/config/RocketMqConfig.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderNotifyTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_NOTIFY_TOPIC); + } + + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderSettledShopTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_SETTLED_SHOP_TOPIC); + } + + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate userRechargeNotifyTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.USER_RECHARGE_NOTIFY_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate shopBalancePaySuccessTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SHOP_BALANCE_PAY_SUCCESS_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate shopRechargeNotifyTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SHOP_RECHARGE_NOTIFY_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate buyVipNotifyTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.BUY_VIP_NOTIFY_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderRefundSuccessTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ORDER_REFUND_SUCCESS_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate userScoreTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.SCORE_UNLOCK_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate platformTransferTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.PLATFORM_TRANSFER_TOPIC); + } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate allinPayBalanceOrderSuccessTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.ALLINPAY_BALANCE_ORDER_SUCCESS_TOPIC); + } + + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/BackType.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/BackType.java new file mode 100644 index 0000000..178726f --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/BackType.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.constant; + +/** + * 支付回调类型 + * + * @author FrozenWatermelon + */ +public enum BackType { + + /** + * api + */ + API(0), + /** + * 商家端 + */ + SHOP(1), + + /** + * 平台端 + */ + PLATFORM(2); + + private final Integer num; + + public Integer value() { + return num; + } + + BackType(Integer num) { + this.num = num; + } + + public static BackType instance(Integer value) { + BackType[] enums = values(); + for (BackType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/DistributedIdKey.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/DistributedIdKey.java new file mode 100644 index 0000000..968112d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/DistributedIdKey.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.constant; + +import com.tmerclub.cloud.common.leaf.constant.GlobalDistributedIdKey; + +/** + * 分布式id key + * + * @author FrozenWatermelon + * @date 2021/4/9 + */ +public interface DistributedIdKey { + + /** + * 支付单号 + */ + String MALL4CLOUD_PAY = "mall4cloud-pay"; + + /** + * 更新企业信息的商户唯一流水号 + */ + String MALL4CLOUD_ALLINPAY_UPDATE_COMPANY_SN = "mall4cloud-alllinpay-update-company-sn"; + + /** + * 通联提现单号 + */ + String MALL4CLOUD_WITHDRAW_CASH = "mall4cloud-withdraw-cash"; + + /** + * 通联文件上传单号 + */ + String MALL4CLOUD_FILE_UPLOAD = "mall4cloud-file-upload"; + + /** + * 订单退款id + */ + String MALL4CLOUD_REFUND = GlobalDistributedIdKey.MALL4CLOUD_REFUND.value(); +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/PayEntry.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/PayEntry.java new file mode 100644 index 0000000..e4120c4 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/PayEntry.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.constant; + +import java.util.Objects; + +/** + * 支付入口 0订单 1充值 2开通会员 + * @author FrozenWatermelon + */ +public enum PayEntry { + + /** + * 订单 + */ + ORDER(0, "订单"), + + /** + * 充值 + */ + RECHARGE(1, "充值"), + + /** + * 开通会员 + */ + VIP(2, "开通会员"), + + /** + * 商家余额支付采购费用(通联支付独有) + */ + SHOP_BALANCE_PAY_PURCHASE(3, "商家余额支付采购费用(通联支付独有)"), + + /** + * 商家余额支付退款自行处理费用(通联支付独有) + */ + SHOP_BALANCE_PAY_REFUND_SPREAD(4, "商家余额支付退款自行处理费用(通联支付独有)"), + /** + * 平台转账(通联支付独有) + */ + PLATFORM_TRANSFER(5, "平台转账(通联支付独有)"), + /** + * 订单结算(通联支付独有) + */ + ORDER_SETTLEMENT(6, "订单结算(通联支付独有)"); + + private final Integer num; + private final String payName; + + public Integer value() { + return num; + } + + PayEntry(Integer num, String payName) { + this.num = num; + this.payName = payName; + } + + public static PayEntry instance(Integer value) { + PayEntry[] enums = values(); + for (PayEntry statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getPayTypeName(Integer value) { + PayEntry payEntry = instance(value); + if (Objects.isNull(payEntry)) { + return null; + } + return payEntry.payName; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/PayStatus.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/PayStatus.java new file mode 100644 index 0000000..95faac1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/PayStatus.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.constant; + +import java.util.Objects; + +/** + * 支付状态 + * + * @author FrozenWatermelon + */ +public enum PayStatus { + + /** + * 直接进行退款 + */ + REFUND(-1, "退款"), + + /** + * 未支付 + */ + UNPAY(0, "未支付"), + + /** + * 已支付 + */ + PAYED(1, "已支付"); + + private final Integer num; + private final String name; + + public Integer value() { + return num; + } + + PayStatus(Integer num, String name) { + this.num = num; + this.name = name; + } + + public static PayStatus instance(Integer value) { + PayStatus[] enums = values(); + for (PayStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + + public static String getStatusName(Integer value) { + PayStatus payStatus = instance(value); + if (Objects.isNull(payStatus)) { + return null; + } + return payStatus.name; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/RefundStatus.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/RefundStatus.java new file mode 100644 index 0000000..a448550 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/constant/RefundStatus.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.constant; + +import java.util.Objects; + +/** + * 退款状态 + * + * @author FrozenWatermelon + */ +public enum RefundStatus { + + /** + * 未退款 + */ + UNREFUND(0, "未退款"), + + /** + * 已退款 + */ + REFUNDED(1, "已退款"); + + private final Integer num; + private final String name; + + public Integer value() { + return num; + } + + RefundStatus(Integer num, String name) { + this.num = num; + this.name = name; + } + + public static RefundStatus instance(Integer value) { + RefundStatus[] enums = values(); + for (RefundStatus statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + + public static String getName(Integer value) { + RefundStatus refundStatus = instance(value); + if (Objects.isNull(refundStatus)) { + return null; + } + return refundStatus.name; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/RefundNoticeController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/RefundNoticeController.java new file mode 100644 index 0000000..a92b45f --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/RefundNoticeController.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller; + +import cn.hutool.core.util.StrUtil; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.payment.bo.RefundInfoResultBO; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.model.RefundInfo; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.util.Objects; + +/** + * 退款成功通知,目前只有微信会有退款的回调 + * + * @author FrozenWatermelon + */ +@Hidden +@RestController +@RequestMapping("/ua/notice/refund") +public class RefundNoticeController { + + @Autowired + private PayManager payManager; + + @Autowired + private RefundInfoService refundInfoService; + + /** + * 退款结果通知 + */ + @RequestMapping("/order/{paySysType}/{payType}") + public ResponseEntity result(HttpServletRequest request, @RequestBody(required = false) String data, @PathVariable Integer payType, @PathVariable Integer paySysType) throws WxPayException, UnsupportedEncodingException { + RefundInfoResultBO refundInfoResultBO = payManager.validateAndGetRefundInfo(request, paySysType, PayType.instance(payType), data); + RefundInfo refundInfo; + if(Objects.equals(paySysType, PaySysType.DEFAULT.value())) { + // 如果普通支付是预售订单时,此处会有两个,此时会有两种情况 + // 情况1,都是微信支付此时只需要退款成功即可 + // 情况2,其中一个是余额支付,因为这是直接成功没有回调,所以同上 + refundInfo = refundInfoService.getByRefundIdAndWxPay(refundInfoResultBO.getRefundId()); + }else{ + refundInfo = refundInfoService.getByRefundId(refundInfoResultBO.getRefundId()); + } + if (!refundInfoResultBO.getRefundSuccess()) { + if (StrUtil.isNotBlank(refundInfoResultBO.getCallbackContent())) { + refundInfo.setCallbackContent(refundInfoResultBO.getCallbackContent()); + refundInfo.setCallbackTime(new Date()); + refundInfoService.updateByIdPayId(refundInfo); + } + return ResponseEntity.ok(refundInfoResultBO.getSuccessString()); + } + refundInfoService.refundSuccess(refundInfo); + return ResponseEntity.ok(refundInfoResultBO.getSuccessString()); + } + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/platform/AllinpayMemberController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/platform/AllinpayMemberController.java new file mode 100644 index 0000000..a74fc82 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/platform/AllinpayMemberController.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.payment.controller.platform; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.payment.dto.LockMemberDTO; +import com.tmerclub.cloud.payment.service.AllinpayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lanhai + */ +@Tag(name = "通联支付-会员接口(平台端)") +@RestController("platformAllinpayMemberController") +@RequestMapping("/p/allinpay/member") +public class AllinpayMemberController { + + @Autowired + private AllinpayService allinpayService; + + @Operation(summary = "锁定会员", description = "锁定会员") + @PutMapping("/lock_member") + public ServerResponseEntity lockMember(@RequestBody LockMemberDTO lockMemberDTO) { + allinpayService.lockMember(lockMemberDTO); + return ServerResponseEntity.success(); + } + + @Operation(summary = "解锁会员", description = "解锁会员") + @PutMapping("/unlock_member") + public ServerResponseEntity unlockMember(@RequestBody LockMemberDTO lockMemberDTO) { + allinpayService.unlockMember(lockMemberDTO); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/supplier/AllinpayCompanyController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/supplier/AllinpayCompanyController.java new file mode 100644 index 0000000..d243510 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/supplier/AllinpayCompanyController.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.supplier; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.CompanyInfo; +import com.tmerclub.cloud.api.payment.dto.BindCompanyAccountDTO; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.payment.allinpay.constant.AllinpayNoticeUrl; +import com.tmerclub.cloud.payment.allinpay.member.constant.AuditStatus; +import com.tmerclub.cloud.payment.allinpay.member.constant.VerificationCodeType; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.service.AllinpayCompanyService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lanhai + */ +@Tag(name = "通联支付-企业会员接口(供应商端)") +@RestController("supplier-allinpay-company") +@RequestMapping("/s/apply_supplier/allinpay/company") +public class AllinpayCompanyController { + + @Autowired + private AllinpayCompanyService allinpayCompanyService; + + @Value("${application.domainUrl}") + private String domainUrl; + + @GetMapping("/get_company_info") + @Operation(summary = "获取企业信息", description = "获取企业信息") + public ServerResponseEntity getCompanyInfo() { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + return ServerResponseEntity.success(companyInfo); + } + + @PostMapping("/send_verification_code") + @Operation(summary = "发送短信验证码", description = "发送短信验证码") + public ServerResponseEntity sendVerificationCode(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + if (Objects.equals(verificationCodeDTO.getVerificationCodeType(), VerificationCodeType.BIND_PHONE.value())) { + // 绑定手机号的前提是还没有绑定过 + if (Objects.nonNull(companyInfo.getPhone())) { + throw new LuckException("当前账户已经绑定过手机号码,请刷新页面"); + } + } else if (Objects.equals(verificationCodeDTO.getVerificationCodeType(), VerificationCodeType.UNBIND_PHONE.value())) { + // 解绑手机号的前提是有绑定过手机号 + if (Objects.isNull(companyInfo.getPhone())) { + throw new LuckException("当前账户还没绑定手机号码,请刷新页面"); + } + } + allinpayCompanyService.sendVerificationCode(bizUserId, verificationCodeDTO); + return ServerResponseEntity.success(); + } + + @PostMapping("/bind_phone") + @Operation(summary = "绑定手机", description = "绑定手机") + public ServerResponseEntity bindPhone(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = getBizUserId(); + if (StrUtil.isBlank(verificationCodeDTO.getVerificationCode())) { + throw new LuckException("验证码不能为空"); + } + // 绑定手机号的前提是还没有绑定过 + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + if (Objects.nonNull(companyInfo.getPhone())) { + throw new LuckException("当前账户已经绑定过手机号码,请刷新页面"); + } + allinpayCompanyService.bindPhone(bizUserId, verificationCodeDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/unbind_phone") + @Operation(summary = "解绑手机", description = "解绑手机") + public ServerResponseEntity unbindPhone(@RequestBody VerificationCodeDTO verificationCodeDTO) { + String bizUserId = getBizUserId(); + // 解绑手机后,用户无法创建订单 + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + // 解绑手机号的前提是有绑定过手机号 + if (Objects.isNull(companyInfo.getPhone())) { + throw new LuckException("当前账户还没绑定手机号码,请刷新页面"); + } + if (!Objects.equals(companyInfo.getPhone(), verificationCodeDTO.getPhone())) { + throw new LuckException("解绑手机与当前绑定手机不一致"); + } + allinpayCompanyService.unbindPhone(bizUserId, verificationCodeDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PostMapping("/set_company_info") + @Operation(summary = "设置企业信息--该接口前端不调用", description = "设置企业信息--该接口前端不调用") + public ServerResponseEntity setCompanyInfo(@RequestBody SetCompanyInfoDTO setCompanyInfoDTO) { + String bizUserId = getBizUserId(); + String backUrl = domainUrl + AllinpayNoticeUrl.SET_COMPANY_INFO; + allinpayCompanyService.setCompanyInfo(bizUserId, backUrl, setCompanyInfoDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_company_info") + @Operation(summary = "企业会员信息修改--该接口前端不调用", description = "企业会员信息修改--该接口前端不调用") + public ServerResponseEntity updateCompanyInfo(@RequestBody UpdateCompanyInfoDTO updateCompanyInfoDTO) { + String bizUserId = getBizUserId(); + // 会员要通过审核 + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + if (Objects.isNull(companyInfo) || !Objects.equals(companyInfo.getStatus(), AuditStatus.SUCCESS.getCode())) { + throw new LuckException("企业会员尚未通过审核,无法修改信息"); + } + String backUrl = domainUrl + AllinpayNoticeUrl.UPDATE_COMPANY_INFO; + allinpayCompanyService.updateCompanyInfo(bizUserId, backUrl, updateCompanyInfoDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PostMapping("/apply_bind_bank_card") + @Operation(summary = "请求绑定银行卡", description = "请求绑定银行卡-法人") + public ServerResponseEntity applyBindBankCard(@RequestBody ApplyBankCardDTO applyBankCardDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + allinpayCompanyService.applyBindBankCard(bizUserId, applyBankCardDTO, companyInfo.getLegalName()); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/bind_bank_card") + @Operation(summary = "确认绑定银行卡--当前绑卡方式为8,该接口不调用", description = "确认绑定银行卡-法人") + public ServerResponseEntity bindBankCard(@RequestBody BindBankCardDTO bindBankCardDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + allinpayCompanyService.bindBankCard(bizUserId, bindBankCardDTO, companyInfo.getLegalName()); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PutMapping("/unbind_bank_card") + @Operation(summary = "解绑银行卡", description = "解绑银行卡-法人") + public ServerResponseEntity unbindBankCard(@RequestBody UnbindBankCardDTO unbindBankCardDTO) { + String bizUserId = getBizUserId(); + allinpayCompanyService.unbindBankCard(bizUserId, unbindBankCardDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @GetMapping("query_bank_card") + @Operation(summary = "查询银行卡", description = "查询银行卡") + @Parameter(name = "cardNo", description = "银行卡号(不传则查询全部银行卡)") + public ServerResponseEntity> queryBankCard(@RequestParam(value = "cardNo", required = false) String cardNo) { + String bizUserId = getBizUserId(); + List bindCards = allinpayCompanyService.queryBankCard(bizUserId, cardNo) + .stream().filter(card -> Objects.equals(card.getBindState(), 1)).collect(Collectors.toList()); + return ServerResponseEntity.success(bindCards); + } + + @PostMapping("/bind_company_account") + @Operation(summary = "企业会员绑定对公户", description = "企业会员绑定对公户") + public ServerResponseEntity bindCompanyAccount(@RequestBody BindCompanyAccountDTO bindCompanyAccountDTO) { + String bizUserId = getBizUserId(); + CompanyInfo companyInfo = allinpayCompanyService.getCompanyInfo(bizUserId); + allinpayCompanyService.bindCompanyAccount(bizUserId, bindCompanyAccountDTO, companyInfo.getCompanyName()); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(); + } + + @PostMapping("/sign_acct_protocol") + @Operation(summary = "账户提现协议签约", description = "账户提现协议签约") + public ServerResponseEntity signAcctProtocol(@RequestBody SignAcctProtocolDTO signAcctProtocolDTO) { + String bizUserId = getBizUserId(); + String backUrl = domainUrl + AllinpayNoticeUrl.SIGN_ACCT_PROTOCOL; + String url = allinpayCompanyService.signAcctProtocol(bizUserId, backUrl, signAcctProtocolDTO); + allinpayCompanyService.deleteCache(bizUserId); + return ServerResponseEntity.success(url); + } + + @GetMapping("/sign_contract_query") + @Operation(summary = "账户协议签约查询", description = "账户协议签约查询") + public ServerResponseEntity signContractQuery(SignAcctProtocolDTO signAcctProtocolDTO) { + String bizUserId = getBizUserId(); + String url = allinpayCompanyService.signContractQuery(bizUserId, signAcctProtocolDTO); + return ServerResponseEntity.success(url); + } + + private static String getBizUserId() { + Long tenantId = AuthUserContext.get().getTenantId(); + return AllinpayConstant.SUPPLIER + tenantId; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/BuyVipPayController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/BuyVipPayController.java new file mode 100644 index 0000000..7dedb6d --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/controller/user/BuyVipPayController.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.controller.user; + + +import com.alipay.api.AlipayApiException; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.tmerclub.cloud.api.auth.bo.LoginInfoBO; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.auth.feign.TokenFeignClient; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.dto.BuyVipPayInfoDTO; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.vo.PaySettlementConfigVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + */ +@RestController +@RequestMapping("/pay") +@Tag(name = "购买vip") +@RefreshScope +public class BuyVipPayController { + + @Autowired + private PayInfoService payInfoService; + @Autowired + private PayManager payManager; + @DubboReference + private ConfigFeignClient configFeignClient; + @DubboReference + private TokenFeignClient tokenFeignClient; + @Value("${application.domainUrl}") + private String domainUrl; + + /** + * 支付接口 + */ + @PostMapping("/vip") + @Operation(summary = "购买vip", description = "购买vip,将普通会员变成付费会员") + public ServerResponseEntity vipBuy(@Valid @RequestBody BuyVipPayInfoDTO payParam) throws AlipayApiException, WxPayException { + if (Objects.equals(payParam.getPayType(), PayType.SCOREPAY.value())) { + throw new LuckException("不支持该充值方式"); + } + // 查询支付类型(默认支付/通联支付) + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + Integer paySysType = paySettlementConfigVO.getPaySettlementType(); + payParam.setPaySysType(paySysType); + LoginInfoBO loginInfoBO = tokenFeignClient.getLoginInfo(); + Long userId = AuthUserContext.getUserId(); + // 构建支付信息 + PayInfoBO payInfo = payInfoService.vipBuy(userId, payParam); + payInfo.setAllinpayUserId(String.valueOf(userId)); + payInfo.setBizUserId(loginInfoBO.getBizUserId()); + payInfo.setPayType(payParam.getPayType()); + payInfo.setApiNoticeUrl(domainUrl + "/ua/notice/pay/" + paySysType + "/" + PayEntry.VIP.value() + "/" + payParam.getPayType()); + payInfo.setReturnUrl(payParam.getReturnUrl()); + payInfo.setIsVip(true); + // 调用第三方接口进行支付 + return payManager.doPay(payInfo); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/AccountSearchDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/AccountSearchDTO.java new file mode 100644 index 0000000..93db720 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/AccountSearchDTO.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Pineapple + * @date 2021/6/9 17:00 + */ +public class AccountSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "开始时间") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "结束时间") + private Date endTime; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "请求类型 1.订单&退款 2.余额充值 3.会员购买") + private Integer financeType; + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getFinanceType() { + return financeType; + } + + public void setFinanceType(Integer financeType) { + this.financeType = financeType; + } + + @Override + public String toString() { + return "AccountSearchDTO{" + + "startTime=" + startTime + + ", endTime=" + endTime + + ", shopName='" + shopName + '\'' + + ", shopId=" + shopId + + ", financeType=" + financeType + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/ApplyBankCardDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/ApplyBankCardDTO.java new file mode 100644 index 0000000..4e39b75 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/ApplyBankCardDTO.java @@ -0,0 +1,91 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class ApplyBankCardDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行卡号") + private String cardNo; + + @Schema(description = "银行预留手机号") + private String phone; + + @Schema(description = "姓名") + private String name; + + @Schema(description = "绑卡方式(具体看:https://cloud.allinpay.com/ts-cloud-dev-web/#/apiCenter/index?params=y&key=300), 默认7") + private Integer cardCheck; + + @Schema(description = "身份证号") + private String identityNo; + + @Schema(description = "有效期 月年 例如0321") + private String validate; + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getCardCheck() { + return cardCheck; + } + + public void setCardCheck(Integer cardCheck) { + this.cardCheck = cardCheck; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getValidate() { + return validate; + } + + public void setValidate(String validate) { + this.validate = validate; + } + + @Override + public String toString() { + return "ApplyBankCardDTO{" + + "cardNo='" + cardNo + '\'' + + ", phone='" + phone + '\'' + + ", name='" + name + '\'' + + ", cardCheck=" + cardCheck + + ", identityNo='" + identityNo + '\'' + + ", validate='" + validate + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/ApplyBindAcctDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/ApplyBindAcctDTO.java new file mode 100644 index 0000000..8c1387b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/ApplyBindAcctDTO.java @@ -0,0 +1,59 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class ApplyBindAcctDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "支付账户类型(weChatPublic:微信公众号, weChatMiniProgram:微信小程序, aliPayService:支付宝生活号, unionPayjs:银联JS)") + private String acctType; + + @Schema(description = "支付账户用户标识(微信公众号支付openid——微信分配\n" + + "微信小程序支付openid——微信分配\n" + + "支付宝生活号支付user_id——支付宝分配\n" + + "银联JS支付user_id——银联分配,可根据【通过授权码(付款码)获取用户ID】接口获取\n" + + "附:openid示例oUpF8uMuAJO_M2pxb1Q9zNjWeS6o)") + private String acct; + + @Schema(description = "微信小程序/公众号登录code") + private String wxLoginCode; + + public String getAcctType() { + return acctType; + } + + public void setAcctType(String acctType) { + this.acctType = acctType; + } + + public String getAcct() { + return acct; + } + + public void setAcct(String acct) { + this.acct = acct; + } + + public String getWxLoginCode() { + return wxLoginCode; + } + + public void setWxLoginCode(String wxLoginCode) { + this.wxLoginCode = wxLoginCode; + } + + @Override + public String toString() { + return "ApplyBindAcctDTO{" + + "acctType='" + acctType + '\'' + + ", acct='" + acct + '\'' + + ", wxLoginCode='" + wxLoginCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BankCardChangeBindPhoneDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BankCardChangeBindPhoneDTO.java new file mode 100644 index 0000000..661b731 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BankCardChangeBindPhoneDTO.java @@ -0,0 +1,104 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class BankCardChangeBindPhoneDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行卡号") + private String cardNo; + + @Schema(description = "银行预留手机号") + private String phone; + + @Schema(description = "姓名") + private String name; + + @Schema(description = "绑卡方式(具体看:https://cloud.allinpay.com/ts-cloud-dev-web/#/apiCenter/index?params=y&key=300),暂只支持6,7") + private Long cardCheck; + + @Schema(description = "身份证号") + private String identityNo; + + @Schema(description = "有效期(信用卡必填)[格式:MMyy,例:0321(21年3月)]") + private String validate; + + @Schema(description = "CVV2(信用卡必填)") + private String cvv2; + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getCardCheck() { + return cardCheck; + } + + public void setCardCheck(Long cardCheck) { + this.cardCheck = cardCheck; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getValidate() { + return validate; + } + + public void setValidate(String validate) { + this.validate = validate; + } + + public String getCvv2() { + return cvv2; + } + + public void setCvv2(String cvv2) { + this.cvv2 = cvv2; + } + + @Override + public String toString() { + return "BankCardChangeBindPhoneDTO{" + + "cardNo='" + cardNo + '\'' + + ", phone='" + phone + '\'' + + ", name='" + name + '\'' + + ", cardCheck=" + cardCheck + + ", identityNo='" + identityNo + '\'' + + ", validate='" + validate + '\'' + + ", cvv2='" + cvv2 + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BindBankCardDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BindBankCardDTO.java new file mode 100644 index 0000000..44fca85 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BindBankCardDTO.java @@ -0,0 +1,55 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class BindBankCardDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "流水号(请求绑卡接口返回数据)") + private String tranceNum; + + @Schema(description = "银行预留手机") + private String phone; + + @Schema(description = "短信验证码(测试环境默认111111[6个1],其他验证码是5个1,注意区分)") + private String verificationCode; + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "BindBankCardDTO{" + + "tranceNum='" + tranceNum + '\'' + + ", phone='" + phone + '\'' + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BuyVipPayInfoDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BuyVipPayInfoDTO.java new file mode 100644 index 0000000..8140a8b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/BuyVipPayInfoDTO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 购买vip支付信息 + * + * @author FrozenWatermelon + */ +public class BuyVipPayInfoDTO extends BasePayInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @NotNull + @Schema(description = "用户等级id") + private Long userLevelLogId; + + @Hidden + @Schema(description = "支付系统类型(非填)") + private Integer paySysType; + + public Long getUserLevelLogId() { + return userLevelLogId; + } + + public void setUserLevelLogId(Long userLevelLogId) { + this.userLevelLogId = userLevelLogId; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "BuyVipPayInfoDTO{" + + "userLevelLogId=" + userLevelLogId + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/LockMemberDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/LockMemberDTO.java new file mode 100644 index 0000000..d179c28 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/LockMemberDTO.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class LockMemberDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + public LockMemberDTO() { + } + + public LockMemberDTO(Long userId) { + this.userId = userId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "LockMemberDTO{" + + "userId=" + userId + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayBySmsDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayBySmsDTO.java new file mode 100644 index 0000000..598b020 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/PayBySmsDTO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-04-27 + */ +public class PayBySmsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "本系统商户订单号") + private String bizOrderNo; + + @Schema(description = "短信验证码") + private String verificationCode; + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "PayBySmsDTO{" + + "bizOrderNo='" + bizOrderNo + '\'' + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/QueryInExpDetailDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/QueryInExpDetailDTO.java new file mode 100644 index 0000000..78cee26 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/QueryInExpDetailDTO.java @@ -0,0 +1,83 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-28 + */ +public class QueryInExpDetailDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "账户集编号") + private String accountSetNo; + + @Schema(description = "订单编号") + private String bizOrderNo; + + @NotNull(message = "dateStart不能为null或空") + @Schema(description = "开始日期(时间格式yyyy-MM-dd HH:mm:ss)") + private String dateStart; + + @NotNull(message = "dateEnd不能为null或空") + @Schema(description = "结束日期(与开始日期间隔不能超过31天)") + private String dateEnd; + + @Schema(description = "交易类型(1:充值, 2:转账, 3:提现, 4:退款, 5:应收账款确认, 9:收银宝退款资金调拨, 10:应收账款手续费确认, 12:退票)") + private Integer tradeType; + + public String getAccountSetNo() { + return accountSetNo; + } + + public void setAccountSetNo(String accountSetNo) { + this.accountSetNo = accountSetNo; + } + + public String getBizOrderNo() { + return bizOrderNo; + } + + public void setBizOrderNo(String bizOrderNo) { + this.bizOrderNo = bizOrderNo; + } + + public String getDateStart() { + return dateStart; + } + + public void setDateStart(String dateStart) { + this.dateStart = dateStart; + } + + public String getDateEnd() { + return dateEnd; + } + + public void setDateEnd(String dateEnd) { + this.dateEnd = dateEnd; + } + + public Integer getTradeType() { + return tradeType; + } + + public void setTradeType(Integer tradeType) { + this.tradeType = tradeType; + } + + @Override + public String toString() { + return "QueryInExpDetailDTO{" + + "accountSetNo='" + accountSetNo + '\'' + + ", bizOrderNo='" + bizOrderNo + '\'' + + ", dateStart='" + dateStart + '\'' + + ", dateEnd='" + dateEnd + '\'' + + ", tradeType=" + tradeType + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/RechargePayInfoDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/RechargePayInfoDTO.java new file mode 100644 index 0000000..976c511 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/RechargePayInfoDTO.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 充值金额id + * + * @author FrozenWatermelon + */ +public class RechargePayInfoDTO extends BasePayInfoDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "用户余额充值记录id") + private Long balanceLogId; + + @Schema(description = "商家余额充值记录id") + private Long shopWalletLogId; + + public Long getBalanceLogId() { + return balanceLogId; + } + + public void setBalanceLogId(Long balanceLogId) { + this.balanceLogId = balanceLogId; + } + + public Long getShopWalletLogId() { + return shopWalletLogId; + } + + public void setShopWalletLogId(Long shopWalletLogId) { + this.shopWalletLogId = shopWalletLogId; + } + + @Override + public String toString() { + return "RechargePayInfoDTO{" + + "balanceLogId=" + balanceLogId + + ", shopWalletLogId=" + shopWalletLogId + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetRealNameDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetRealNameDTO.java new file mode 100644 index 0000000..b88e07a --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SetRealNameDTO.java @@ -0,0 +1,43 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class SetRealNameDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "姓名") + private String name; + + @Schema(description = "身份证号码") + private String identityNo; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + @Override + public String toString() { + return "SetRealNameDTO{" + + "name='" + name + '\'' + + ", identityNo='" + identityNo + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SignAcctProtocolDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SignAcctProtocolDTO.java new file mode 100644 index 0000000..175769f --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/SignAcctProtocolDTO.java @@ -0,0 +1,79 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class SignAcctProtocolDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "签约户名(个人会员:名称)(企业会员:[法人提现]法人姓名、[对公户提现]企业名称)") + private String signAcctName; + + @Schema(description = "签约类型 1.个人 2.法人 3.企业") + private Integer signAcctType; + + @Schema(description = "跳转页面类型(1:H5页面, 2:小程序页面)(不传默认H5)") + private Long jumpPageType; + + @Schema(description = "成功后跳转地址") + private String jumpUrl; + + @Schema(description = "失败/取消后跳转地址") + private String noContractUrl; + + public String getSignAcctName() { + return signAcctName; + } + + public void setSignAcctName(String signAcctName) { + this.signAcctName = signAcctName; + } + + public Integer getSignAcctType() { + return signAcctType; + } + + public void setSignAcctType(Integer signAcctType) { + this.signAcctType = signAcctType; + } + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getNoContractUrl() { + return noContractUrl; + } + + public void setNoContractUrl(String noContractUrl) { + this.noContractUrl = noContractUrl; + } + + @Override + public String toString() { + return "SignAcctProtocolDTO{" + + "signAcctName='" + signAcctName + '\'' + + ", signAcctType=" + signAcctType + + ", jumpPageType=" + jumpPageType + + ", jumpUrl='" + jumpUrl + '\'' + + ", noContractUrl='" + noContractUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/UnbindBankCardDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/UnbindBankCardDTO.java new file mode 100644 index 0000000..28c5e43 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/UnbindBankCardDTO.java @@ -0,0 +1,42 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lanhai + */ +public class UnbindBankCardDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "银行卡号") + private String cardNo; + + private Long shopBankCardId; + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public Long getShopBankCardId() { + return shopBankCardId; + } + + public void setShopBankCardId(Long shopBankCardId) { + this.shopBankCardId = shopBankCardId; + } + + @Override + public String toString() { + return "UnbindBankCardDTO{" + + "cardNo='" + cardNo + '\'' + + ", shopBankCardId=" + shopBankCardId + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/UpdatePhoneByPayPwdDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/UpdatePhoneByPayPwdDTO.java new file mode 100644 index 0000000..594436c --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/UpdatePhoneByPayPwdDTO.java @@ -0,0 +1,92 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class UpdatePhoneByPayPwdDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "跳转页面类型(1:H5页面, 2:小程序页面),默认H5") + private Long jumpPageType; + + @Schema(description = "姓名") + private String name; + + @Schema(description = "身份证号") + private String identityNo; + + @Schema(description = "原手机号") + private String oldPhone; + + @Schema(description = "成功后跳转地址(非必填)") + private String jumpUrl; + + @Schema(description = "失败跳转地址(非必填)") + private String errorJumpUrl; + + public Long getJumpPageType() { + return jumpPageType; + } + + public void setJumpPageType(Long jumpPageType) { + this.jumpPageType = jumpPageType; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIdentityNo() { + return identityNo; + } + + public void setIdentityNo(String identityNo) { + this.identityNo = identityNo; + } + + public String getOldPhone() { + return oldPhone; + } + + public void setOldPhone(String oldPhone) { + this.oldPhone = oldPhone; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getErrorJumpUrl() { + return errorJumpUrl; + } + + public void setErrorJumpUrl(String errorJumpUrl) { + this.errorJumpUrl = errorJumpUrl; + } + + @Override + public String toString() { + return "UpdatePhoneByPayPwdDTO{" + + "jumpPageType=" + jumpPageType + + ", name='" + name + '\'' + + ", identityNo='" + identityNo + '\'' + + ", oldPhone='" + oldPhone + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", errorJumpUrl='" + errorJumpUrl + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/VerificationCodeDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/VerificationCodeDTO.java new file mode 100644 index 0000000..ec643e0 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/VerificationCodeDTO.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + */ +public class VerificationCodeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED) + private String phone; + + @Schema(description = "验证码类型(6:解绑手机, 9:绑定手机),默认9") + private Integer verificationCodeType; + + @Schema(description = "验证码(测试环境默认:11111)") + private String verificationCode; + + public VerificationCodeDTO() { + } + + public VerificationCodeDTO(String phone, Integer verificationCodeType) { + this.phone = phone; + this.verificationCodeType = verificationCodeType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getVerificationCodeType() { + return verificationCodeType; + } + + public void setVerificationCodeType(Integer verificationCodeType) { + this.verificationCodeType = verificationCodeType; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + @Override + public String toString() { + return "VerificationCodeDTO{" + + "phone='" + phone + '\'' + + ", verificationCodeType=" + verificationCodeType + + ", verificationCode='" + verificationCode + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/VerifyBankCardChangeBindPhoneDTO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/VerifyBankCardChangeBindPhoneDTO.java new file mode 100644 index 0000000..7427592 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/dto/VerifyBankCardChangeBindPhoneDTO.java @@ -0,0 +1,80 @@ +package com.tmerclub.cloud.payment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author gaozijie + * @date 2023-03-23 + */ +public class VerifyBankCardChangeBindPhoneDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "流水号") + private String tranceNum; + + @Schema(description = "银行预留手机号") + private String phone; + + @Schema(description = "短信验证码(测试环境默认:111111(6个1))") + private String verificationCode; + + @Schema(description = "有效期(信用卡必填)") + private String validate; + + @Schema(description = "CVV2(信用卡必填)") + private String cvv2; + + public String getTranceNum() { + return tranceNum; + } + + public void setTranceNum(String tranceNum) { + this.tranceNum = tranceNum; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerificationCode() { + return verificationCode; + } + + public void setVerificationCode(String verificationCode) { + this.verificationCode = verificationCode; + } + + public String getValidate() { + return validate; + } + + public void setValidate(String validate) { + this.validate = validate; + } + + public String getCvv2() { + return cvv2; + } + + public void setCvv2(String cvv2) { + this.cvv2 = cvv2; + } + + @Override + public String toString() { + return "VerifyBankCardChangeBindPhoneDTO{" + + "tranceNum='" + tranceNum + '\'' + + ", phone='" + phone + '\'' + + ", verificationCode='" + verificationCode + '\'' + + ", validate='" + validate + '\'' + + ", cvv2='" + cvv2 + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/feign/PaymentFeignController.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/feign/PaymentFeignController.java new file mode 100644 index 0000000..1da5b25 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/feign/PaymentFeignController.java @@ -0,0 +1,594 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.order.vo.ShopAmountVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.dto.AllinpaySettlementApiDto; +import com.tmerclub.cloud.api.payment.dto.OrderPayInfoDTO; +import com.tmerclub.cloud.api.payment.dto.PayInfoApiDto; +import com.tmerclub.cloud.api.payment.feign.PaymentFeignClient; +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.bean.Allinpay; +import com.tmerclub.cloud.common.constant.AllinpayConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.payment.allinpay.order.req.AgentPay; +import com.tmerclub.cloud.payment.allinpay.order.req.BatchAgentPay; +import com.tmerclub.cloud.payment.allinpay.order.req.SplitRule; +import com.tmerclub.cloud.payment.bo.PayInfoBO; +import com.tmerclub.cloud.payment.bo.PayInfoResultBO; +import com.tmerclub.cloud.payment.bo.RefundInfoResultBO; +import com.tmerclub.cloud.payment.constant.DistributedIdKey; +import com.tmerclub.cloud.payment.constant.PayEntry; +import com.tmerclub.cloud.payment.constant.PayStatus; +import com.tmerclub.cloud.payment.manager.AllinpayManager; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.manager.PayNoticeManager; +import com.tmerclub.cloud.payment.mapper.PayInfoMapper; +import com.tmerclub.cloud.payment.mapper.RefundInfoMapper; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.model.RefundInfo; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import com.tmerclub.cloud.payment.vo.RefundInfoVO; +import jakarta.validation.constraints.NotNull; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author YXF + * @Date 2022/08/10 9:21 + */ +@DubboService +public class PaymentFeignController implements PaymentFeignClient { + + private static final Logger log = LoggerFactory.getLogger(PaymentFeignController.class); + + @Autowired + private PayManager payManager; + @Autowired + private PayNoticeManager payNoticeManager; + @Autowired + private PayInfoMapper payInfoMapper; + @Autowired + private RefundInfoMapper refundInfoMapper; + @Autowired + private AllinpayManager allinpayManager; + @Autowired + private SegmentManager segmentManager; + @Autowired + private AllinpayManager allinpayPayManager; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private RefundInfoService refundInfoService; + + @Value("${application.domainUrl}") + private String domainUrl; + + @Autowired + private RocketMQTemplate platformTransferTemplate; + + + /** + * 情况一、 只支付了一次,且已支付: 调用订单支付成功处理,调用失败就打印日志,等待下一次调用 + * 情况二、 两条支付记录,一条已支付,一条未支付: 无论执行顺序怎样,未支付的记录不会处理,已支付的进行订单支付成功处理 + * 情况三、 三条支付记录,两条已支付,一次未支付: 未支付的记录不会处理,已支付的记录按创建时间进行订单支付成功处理,存在以下几种情况: + * 1.第一条已支付记录处理后,订单状态变更为待发货,第二条已支付记录就会进行退款 + * 2.第一条已支付记录处理异常(服务出问题了,应该等待服务恢复后再处理),打印错误日志不再进行后续处理 + * + * @param orderPayInfoDTO 订单id列表 + * @return + */ + @Override + public List queryAndHandleOrderPaySuccess(OrderPayInfoDTO orderPayInfoDTO) { + List orderIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isEmpty(orderPayInfoDTO.getOrderIds())) { + return orderIdList; + } + // 查询订单已经支付记录 + List payInfoList = payInfoMapper.listPayedInfoByOrderIds(orderPayInfoDTO.getOrderIds(), orderPayInfoDTO.getUserId(), PayStatus.PAYED.value()); + + if (CollUtil.isEmpty(payInfoList)) { + return orderIdList; + } + + for (PayInfo payInfo : payInfoList) { + // 第三方平台查询已支付成功的订单 + PayInfoResultBO payInfoResultBO = payManager.checkPaySuccess(payInfo); + + // 没有支付 + if (Objects.equals(payInfoResultBO.getPaySuccess(), Boolean.FALSE)) { + continue; + } + // 已支付成功或查询支付接口异常,订单id先添加到支付成功的id列表中,优先保证订单不会被取消 + String[] orderIdArray = payInfo.getOrderIds().split(Constant.COMMA); + for (String s : orderIdArray) { + orderIdList.add(Long.valueOf(s)); + } + // 查询支付接口异常就不能进行后续处理了 + if (Objects.isNull(payInfoResultBO.getPaySuccess())) { + continue; + } + // 处理已支付成功,但订单状态还是待支付的订单 + payInfoResultBO.setCallbackContent("取消订单时-支付成功"); + // 服务出问题了等待服务恢复后再处理,先打印错误日志不再进行后续处理,等待下一场处理 + ResponseEntity payNoticeResponseEntity = payNoticeManager.noticeOrder(payInfoResultBO, payInfo, payInfo.getPaySysType()); + if (Objects.equals(payNoticeResponseEntity.getBody(), ResponseEnum.EXCEPTION.value())) { + log.error("取消订单的订单成功回调处理失败,{}", payInfoResultBO); + break; + } + } + return orderIdList; + } + + + + @Override + public ServerResponseEntity doAllinPayShopBalance(PayInfoApiDto payInfoApiDto) { + long userId = Long.parseLong(payInfoApiDto.getUserId()); + // 支付单号 + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, userId); + // 保存预支付信息 + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payId); + payInfo.setUserId(userId); + payInfo.setPayAmount(payInfoApiDto.getPayAmount()); + payInfo.setPayScore(0L); + payInfo.setPayStatus(PayStatus.UNPAY.value()); + payInfo.setSysType(SysTypeEnum.MULTISHOP.value()); + payInfo.setPayType(payInfoApiDto.getPayType()); + payInfo.setVersion(0); + payInfo.setOrderIds(payInfoApiDto.getOrderIds()); + payInfo.setRefundId(Objects.isNull(payInfoApiDto.getRefundId()) ? 0L : payInfoApiDto.getRefundId()); + payInfo.setPayEntry(payInfoApiDto.getPayEntry()); + payInfoMapper.save(payInfo); + + // 进行支付 + PayInfoBO payInfoBO = BeanUtil.map(payInfoApiDto, PayInfoBO.class); + payInfoBO.setExtendInfo(payInfoApiDto.getExtendInfo()); + payInfoBO.setSystemType(2); + payInfoBO.setValidateType(1L); + payInfoBO.setApiNoticeUrl(domainUrl + "/ua/notice/pay/" + 1 + "/" + payInfoApiDto.getPayEntry() + "/" + payInfoApiDto.getPayType()); + // 付款人此时是为商家id + payInfoBO.setUserId(AllinpayConstant.SHOP + payInfoApiDto.getShopId()); + // 收款人为供应商 + List shopAmountVOList = new ArrayList<>(16); + ShopAmountVO shopAmountVO = new ShopAmountVO(); + shopAmountVO.setBizUserId(AllinpayConstant.SUPPLIER + payInfoApiDto.getBizUserId()); + shopAmountVO.setAmount(payInfoBO.getPayAmount()); + shopAmountVOList.add(shopAmountVO); + payInfoBO.setReceiveList(shopAmountVOList); + return allinpayPayManager.doAllinPay(payInfoBO); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity doAllinPaySettlement(AllinpaySettlementApiDto payInfoApiVO) { + PayInfo settlementPayInfo = payInfoMapper.getByOrderIdAndEntryAndToUserId(null, Long.valueOf(payInfoApiVO.getOrderId()), PayEntry.ORDER_SETTLEMENT.value()); + if (Objects.nonNull(settlementPayInfo)) { + log.info("订单已在结算中,orderId={}", payInfoApiVO.getOrderId()); + return ServerResponseEntity.showFailMsg("订单已在结算中,请勿重复提交"); + } + // 1.用户支付 + List payInfoDbList = payInfoMapper.listByPayIds(payInfoApiVO.getPayIds()); + if (CollectionUtil.isEmpty(payInfoDbList)) { + throw new LuckException("支付信息不存在"); + } + // 1.用户退款 + List refundInfoDbList = refundInfoMapper.listByPayIds(payInfoApiVO.getPayIds()); + Map> refundInfoMap = refundInfoDbList.stream().collect(Collectors.groupingBy(RefundInfoVO::getPayId)); + Long payAmount = payInfoDbList.stream().mapToLong(PayInfo::getPayAmount).sum(); + List payInfoList = new ArrayList<>(Constant.INITIAL_CAPACITY); + SplitRuleVO shopSplitRuleDto = payInfoApiVO.getShopSplitRuleDto(); + // 分销金额 + List distributionUserSplitRuleList = payInfoApiVO.getDistributionUserSplitRuleList(); + SplitRuleVO supplierSplitRuleDto = payInfoApiVO.getSupplierSplitRuleDto(); + SplitRuleVO platformSplitRuleDto = payInfoApiVO.getPlatformSplitRuleDto(); + setUserIdPrefix(shopSplitRuleDto, distributionUserSplitRuleList, supplierSplitRuleDto); + long platformAmount = Objects.isNull(platformSplitRuleDto) ? 0L : platformSplitRuleDto.getFee(); + // 如果平台收入金额为负数,则需要转账给商家or分销员,此处考虑到商家还有一笔分账,优先转账给分销 + // 如果比平台需要转账的还大,就多转一份给商家/分销员,此时多转的部分再从商家分账里面扣除手续费给到平台 + // 平台转账 + if (platformAmount < 0L) { + platformAmount = handlePlatformTransfer(shopSplitRuleDto, distributionUserSplitRuleList, supplierSplitRuleDto, platformAmount); + } + BatchAgentPay batchAgentPay = new BatchAgentPay(); + List agentPayList = new ArrayList<>(Constant.INITIAL_CAPACITY); + ServerResponseEntity configResp = configFeignClient.getConfig(Constant.ALLINPAY_CONFIG); + if (!configResp.isSuccess()) { + log.info("获取通联配置失败,msg={}", configResp.getMsg()); + throw new LuckException(configResp.getMsg()); + } + Allinpay allinpay = Json.parseObject(configResp.getData(), Allinpay.class); + // 判断下是否需要处理供应商、平台、分销员分账 + if (Objects.nonNull(supplierSplitRuleDto) && supplierSplitRuleDto.getAmount() > 0L) { + log.info("供应商分账,orderId={}", payInfoApiVO.getOrderId()); + // 供应商商品不能添加为预售所以只有一个支付信息 + PayInfo payInfoDb = payInfoDbList.get(0); + // 处理供应商分账 + handleAccountSharing(payInfoApiVO, allinpay, shopSplitRuleDto, supplierSplitRuleDto, platformAmount, + payInfoDb, agentPayList, payInfoList, refundInfoMap); + } else { + log.info("商家分账,orderId={}", payInfoApiVO.getOrderId()); + // 处理商家分账(平台分账,分销员分账) + accountSharing(payInfoDbList, shopSplitRuleDto, distributionUserSplitRuleList, platformAmount, agentPayList, allinpay, refundInfoMap); + } + for (AgentPay agentPay : agentPayList) { + setCollectPayList(agentPay,settlementPayInfo.getBizPayNo()); + } + batchAgentPay.setTradeCode("4001"); + batchAgentPay.setBatchPayList(agentPayList); + batchAgentPay.setBizBatchNo(payInfoApiVO.getOrderId()); + + // 保存预支付信息 + PayInfo payInfo = new PayInfo(); + // 支付单号 + Long payId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_PAY, payInfoDbList.get(0).getUserId()); + payInfo.setPayId(payId); + payInfo.setRefundId(0L); + payInfo.setUserId(payInfoDbList.get(0).getUserId()); + payInfo.setPayAmount(payAmount); + payInfo.setPayScore(0L); + payInfo.setPayStatus(PayStatus.UNPAY.value()); + payInfo.setSysType(payInfoDbList.get(0).getSysType()); + payInfo.setPayType(payInfoDbList.get(0).getPayType()); + payInfo.setVersion(0); + payInfo.setOrderIds(payInfoApiVO.getOrderId()); + payInfo.setPayEntry(PayEntry.ORDER_SETTLEMENT.value()); + // TODO 是否发送个定时任务 + payInfoMapper.save(payInfo); + allinpayManager.batchShareAccountToShop(batchAgentPay); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity cancelOrderQrCode(OrderPayInfoDTO orderPayInfoDTO) { + List payInfoList = payInfoMapper.listPayedInfoByOrderIds(orderPayInfoDTO.getOrderIds(), orderPayInfoDTO.getUserId(), PayStatus.UNPAY.value()); + for (PayInfo payInfo : payInfoList) { + // 失效未支付订单的二维码 + if (Objects.equals(payInfo.getPayType(), PayType.WECHATPAY_SWEEP_CODE.value()) || + Objects.equals(payInfo.getPayType(), PayType.ALIPAY.value())) { + // 如果有重复的payNo,不用失效掉二维码。 + try { + payManager.cancelOrderQrCode(payInfo.getPayId(), payInfo.getPayType()); + }catch (Exception e) { + log.error("失效支付二维码失败"); + } + } + } + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> getPayInfoByUserIdAndOrderId(Long userId, Long orderId) { + List payInfoList = payInfoMapper.getPayInfoByUserIdAndOrderId(userId, orderId); + List apiDto = BeanUtil.mapAsList(payInfoList, PayInfoApiDto.class); + return ServerResponseEntity.success(apiDto); + } + + @Override + public ServerResponseEntity getPayInfoByPayId(Long payId){ + PayInfo payInfo = payInfoMapper.getPayInfoByPayId(payId); + if (Objects.isNull(payInfo)) { + return ServerResponseEntity.success(null); + } + PayInfoApiDto apiDto = BeanUtil.map(payInfo, PayInfoApiDto.class); + return ServerResponseEntity.success(apiDto); + } + + @Override + public ServerResponseEntity checkRefundStatus(Long refundId) { + RefundInfoVO refundInfoVO = refundInfoMapper.getByRefundId(refundId); + if (Objects.isNull(refundInfoVO)) { + return ServerResponseEntity.success(Boolean.FALSE); + } + PayInfo payInfo = payInfoMapper.getByPayId(refundInfoVO.getPayId()); + RefundInfoResultBO refundInfoResultBO = payManager.getRefundInfo(refundInfoVO.getPayType(), refundInfoVO.getPayId(), payInfo.getPaySysType(), refundInfoVO.getRefundId()); + if (refundInfoResultBO.getRefundSuccess()) { + log.info("退款订单{}退款成功,进行回调....", refundId); + // 退款回调 + RefundInfo refundInfo; + if(Objects.equals(payInfo.getPaySysType(), PaySysType.DEFAULT.value())) { + // 如果普通支付是预售订单时,此处会有两个,此时会有两种情况 + // 情况1,都是微信支付此时只需要退款成功即可 + // 情况2,其中一个是余额支付,因为这是直接成功没有回调,所以同上 + refundInfo = refundInfoService.getByRefundIdAndWxPay(refundInfoResultBO.getRefundId()); + } else { + refundInfo = refundInfoService.getByRefundId(refundInfoResultBO.getRefundId()); + } + refundInfoService.refundSuccess(refundInfo); + return ServerResponseEntity.success(Boolean.TRUE); + } + return ServerResponseEntity.success(Boolean.FALSE); + } + + @Override + public ServerResponseEntity updatePayInfoBySplitGroup(String orderIds, Long oldOrderId) { + List payInfoList = payInfoMapper.getByOrderIdsAndEntry(oldOrderId.toString(), PayEntry.ORDER.value()); + PayInfo payInfo = new PayInfo(); + // 组合商品只有一条支付信息 + payInfo.setPayId(payInfoList.get(0).getPayId()); + payInfo.setOrderIds(orderIds); + payInfoMapper.update(payInfo); + return ServerResponseEntity.success(); + } + + + private void setCollectPayList(AgentPay agentPay, String bizPayNo) { + // 回调地址 + agentPay.setBackUrl(domainUrl + "/ua/notice/pay/" + 1 + "/" + PayEntry.ORDER_SETTLEMENT.value() + "/" + 0); + AgentPay.CollectPay collectPay = new AgentPay.CollectPay(); + collectPay.setAmount(agentPay.getAmount()); + collectPay.setBizOrderNo(bizPayNo); + collectPay.setOrderNo(agentPay.getBizOrderNo()); + agentPay.setCollectPayList(Collections.singletonList(collectPay)); + } + + /** + * 处理商家分账(平台分账,分销员分账) + * + * @param payInfoDbList + * @param shopSplitRuleDto + * @param distributionUserSplitRuleList + * @param platformAmount + * @param agentPayList + * @param allinpay + * @param refundInfoMap + */ + private void accountSharing(List payInfoDbList, SplitRuleVO shopSplitRuleDto, List distributionUserSplitRuleList, + long platformAmount, List agentPayList, Allinpay allinpay, Map> refundInfoMap) { + List splitRuleList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (PayInfo payInfo : payInfoDbList) { + AgentPay agentPay = new AgentPay(); + // 计算退款金额总和 + long refundAmount = refundInfoMap.containsKey(payInfo.getPayId()) ? refundInfoMap.get(payInfo.getPayId()).stream().mapToLong(RefundInfoVO::getRefundAmount).sum() : 0L; + // 可分账金额 + long payAmount = payInfo.getPayAmount() - refundAmount; + // 1.先处理平台分账 + if (platformAmount > 0L) { + // 如果平台分账金额大于当前可分账金额,则平台分账金额为当前可分账金额 + if (platformAmount > payAmount) { + agentPay.setFee(payInfo.getPayAmount()); + payAmount = 0L; + } else { + payAmount = payAmount - platformAmount; + agentPay.setFee(platformAmount); + } + } + + // 2.进行分销员分账 + if (CollectionUtil.isNotEmpty(distributionUserSplitRuleList) && payAmount > 0L) { + for (SplitRuleVO pendingSplitRuleVO : distributionUserSplitRuleList) { + if (pendingSplitRuleVO.getAmount() == 0L) { + continue; + } + // 如果分销员分账金额大于当前可分账金额,则分销员分账金额为当前可分账金额 + if (payAmount > pendingSplitRuleVO.getAmount()) { + splitRuleList.add(BeanUtil.map(pendingSplitRuleVO, SplitRule.class)); + payAmount -= pendingSplitRuleVO.getAmount(); + } else { + // 减去支付金额下一轮继续进行分账 + pendingSplitRuleVO.setAmount(pendingSplitRuleVO.getAmount() - payInfo.getPayAmount()); + // 如果大于支付金额,则这次分摊给分销员的金额就是支付金额而不是分销员的分账金额 + SplitRule partSplitRule = BeanUtil.map(pendingSplitRuleVO, SplitRule.class); + partSplitRule.setAmount(payAmount); + splitRuleList.add(partSplitRule); + break; + } + // 剩余可分账的金额如果为0,直接break + if (payAmount <= 0) { + break; + } + } + agentPay.setSplitRuleList(splitRuleList); + } + agentPay.setAccountSetNo(allinpay != null ? allinpay.getAccountSetNo() : null); + agentPay.setBizUserId(shopSplitRuleDto.getBizUserId()); + agentPay.setBizOrderNo(payInfo.getPayId().toString()); + agentPay.setAmount(payAmount); + agentPay.setFee(0L); + agentPay.setTradeCode("4001"); + agentPayList.add(agentPay); + } + } + + /** + * 处理供应商分账 + * + * @param payInfoApiVO + * @param allinpay + * @param shopSplitRuleDto + * @param supplierSplitRuleDto + * @param platformAmount + * @param payInfo + * @param agentPayList + * @param payInfoList + * @param refundInfoMap + */ + private void handleAccountSharing(AllinpaySettlementApiDto payInfoApiVO, Allinpay allinpay, SplitRuleVO shopSplitRuleDto, SplitRuleVO supplierSplitRuleDto, long platformAmount, PayInfo payInfo, List agentPayList, List payInfoList, Map> refundInfoMap) { + // 商家支付采购费用 + List purchasePayInfoList = payInfoMapper.getByOrderIdsAndEntry(payInfoApiVO.getOrderId(), PayEntry.SHOP_BALANCE_PAY_PURCHASE.value()); + // 商家支付自行处理退款费用 + List selfHandleRefundPayInfoList = payInfoMapper.getByOrderIdsAndEntry(payInfoApiVO.getOrderId(), PayEntry.SHOP_BALANCE_PAY_REFUND_SPREAD.value()); + // 1.商家采购金额分账,分摊钱给到供应商,其中商家支付的采购费用和自行处理的退款费用优先给到供应商 + if (CollectionUtil.isNotEmpty(purchasePayInfoList)) { + // 采购只有一笔 + PayInfo purchasePayInfo = purchasePayInfoList.get(0); + AgentPay agentPay = getAgentPay(allinpay, supplierSplitRuleDto, purchasePayInfo); + agentPayList.add(agentPay); + + // 设置下供应商还需要结算的钱以及需要支付的手续费 + long settlementAmount = agentPay.getAmount() - agentPay.getFee(); + long settlementFee = agentPay.getFee(); + supplierSplitRuleDto.setAmount(supplierSplitRuleDto.getAmount() - settlementAmount); + supplierSplitRuleDto.setFee(supplierSplitRuleDto.getFee() - settlementFee); + } + // 2.商家自行处理退款的费用分账给到供应商,如果这里有自行处理退款的费用,表示分销员的钱为0,不用考虑 + long settlementAmount = 0L; + long settlementFee = 0L; + if (CollectionUtil.isNotEmpty(selfHandleRefundPayInfoList)) { + for (PayInfo refundPayInfo : selfHandleRefundPayInfoList) { + AgentPay agentPay = getAgentPay(allinpay, supplierSplitRuleDto, refundPayInfo); + agentPayList.add(agentPay); + // 供应商已结算的钱以及手续费 + settlementAmount += agentPay.getAmount() - agentPay.getFee(); + settlementFee += agentPay.getFee(); + } + supplierSplitRuleDto.setAmount(supplierSplitRuleDto.getAmount() - settlementAmount); + supplierSplitRuleDto.setFee(supplierSplitRuleDto.getFee() - settlementFee); + } + // 3.处理下用户支付的那一笔分账 + // 计算退款金额总和 + long refundAmount = refundInfoMap.get(payInfo.getPayId()).stream().mapToLong(RefundInfoVO::getRefundAmount).sum(); + Long payAmount = payInfo.getPayAmount() - refundAmount; + List splitRuleList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (supplierSplitRuleDto.getAmount() > 0L) { + splitRuleList.add(BeanUtil.map(supplierSplitRuleDto, SplitRule.class)); + } + AgentPay agentPay = new AgentPay(); + agentPay.setAccountSetNo(allinpay.getAccountSetNo()); + agentPay.setBizUserId(shopSplitRuleDto.getBizUserId()); + agentPay.setBizOrderNo(payInfo.getPayId().toString()); + agentPay.setAmount(payAmount); + agentPay.setFee(platformAmount); + agentPay.setSplitRuleList(splitRuleList); + agentPay.setTradeCode("4001"); + agentPayList.add(agentPay); + } + + @NotNull + private static AgentPay getAgentPay(Allinpay allinpay, SplitRuleVO supplierSplitRuleDto, PayInfo purchasePayInfo) { + AgentPay agentPay = new AgentPay(); + agentPay.setAccountSetNo(allinpay.getAccountSetNo()); + agentPay.setBizUserId(supplierSplitRuleDto.getBizUserId()); + // 因为有用户支付最少一分钱的情况下,就算订单有进行退款,因为采购金额和供货金额都是同比例变小,所以这里支付的采购费用不可能可能大于供应商的收入金额 + agentPay.setBizOrderNo(purchasePayInfo.getPayId().toString()); + agentPay.setAmount(purchasePayInfo.getPayAmount()); + // 如果这笔采购金额大于供应商的平台佣金支出,则在这里全部给到供应商的平台佣金 + if (agentPay.getAmount() > supplierSplitRuleDto.getFee()) { + agentPay.setFee(supplierSplitRuleDto.getFee()); + } else { + agentPay.setFee(agentPay.getAmount()); + } + agentPay.setSplitRuleList(null); + agentPay.setTradeCode("4001"); + return agentPay; + } + + /** + * 处理下平台转账 + * + * @param shopSplitRuleDto + * @param distributionUserSplitRuleList + * @param supplierSplitRuleDto + * @param platformAmount + * @return + */ + private long handlePlatformTransfer(SplitRuleVO shopSplitRuleDto, List distributionUserSplitRuleList, SplitRuleVO supplierSplitRuleDto, long platformAmount) { + + platformAmount = Math.abs(platformAmount); + // 平台需要转账的钱 + List splitRuleList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 1.优先转账给分销员 + if (CollectionUtil.isNotEmpty(distributionUserSplitRuleList)) { + for (SplitRuleVO distributionSplitRuleVO : distributionUserSplitRuleList) { + if (platformAmount > distributionSplitRuleVO.getAmount()) { + platformAmount = platformAmount - distributionSplitRuleVO.getAmount(); + distributionSplitRuleVO.setAmount(0L); + splitRuleList.add(distributionSplitRuleVO); + } else { + // 分销金额大于剩余要分帐的金额时处理下金额 + SplitRuleVO subSplitRuleVO = BeanUtil.map(distributionSplitRuleVO, SplitRuleVO.class); + subSplitRuleVO.setAmount(platformAmount); + splitRuleList.add(subSplitRuleVO); + // 分销员这一步减少平台分账的金额,并进行下一步分账 + distributionSplitRuleVO.setAmount(distributionSplitRuleVO.getAmount() - platformAmount); + break; + } + if (platformAmount <= 0) { + break; + } + } + } + // 2.如果扣去分销员的钱后还有部分要转账的,转账给供应商 + if (platformAmount > 0 && Objects.nonNull(supplierSplitRuleDto)) { + if (platformAmount > supplierSplitRuleDto.getAmount()) { + platformAmount = platformAmount - supplierSplitRuleDto.getAmount(); + splitRuleList.add(supplierSplitRuleDto); + // 这一步减少平台分账的金额,分账的金额已经为0 + supplierSplitRuleDto.setAmount(0L); + } else { + // 供应商需要分账的金额大于剩余要分帐的金额时处理下金额 + SplitRuleVO subSplitRuleVO = BeanUtil.map(supplierSplitRuleDto, SplitRuleVO.class); + subSplitRuleVO.setAmount(platformAmount); + splitRuleList.add(subSplitRuleVO); + // 这一步减少平台分账的金额,并进行下一步分账 + supplierSplitRuleDto.setAmount(supplierSplitRuleDto.getAmount() - platformAmount); + } + } + // 如果小于0则表示平台多支出了一部分,因为这部分钱本来是由商家出的,将其设置为商家手续费转账给平台 + if (platformAmount < 0) { + shopSplitRuleDto.setFee(Math.abs(platformAmount)); + } + // 如果扣去分销员、供应商的钱后还有部分要转账的继续转账给商家 + if (platformAmount > 0) { + // 此处商家收入金额 肯定大于 平台转账金额,因为用户支付了一笔,还需要结算的 + SplitRuleVO splitRuleVO = BeanUtil.map(shopSplitRuleDto, SplitRuleVO.class); + splitRuleVO.setAmount(platformAmount); + splitRuleList.add(shopSplitRuleDto); + + // 最后要结算的金额减去平台转账的金额 + shopSplitRuleDto.setAmount(shopSplitRuleDto.getAmount() - platformAmount); + } + // 此时为了防止支付出错就不执行了,这里使用mq执行多次 + // 发送延迟消息 + // 发送消息执行平台转账 + SendStatus sendStatus = platformTransferTemplate.syncSend(RocketMqConstant.PLATFORM_TRANSFER_TOPIC, new GenericMessage<>(splitRuleList)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + return platformAmount; + } + + private void setUserIdPrefix(SplitRuleVO shopSplitRuleDto, List distributionUserSplitRuleList, SplitRuleVO supplierSplitRuleDto) { + if (Objects.nonNull(shopSplitRuleDto)) { + shopSplitRuleDto.setBizUserId(AllinpayConstant.SHOP + shopSplitRuleDto.getBizUserId()); + } + if (Objects.nonNull(supplierSplitRuleDto)) { + supplierSplitRuleDto.setBizUserId(AllinpayConstant.SUPPLIER + supplierSplitRuleDto.getBizUserId()); + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/GroupOrderUnSuccessRefundConsumer.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/GroupOrderUnSuccessRefundConsumer.java new file mode 100644 index 0000000..c136106 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/GroupOrderUnSuccessRefundConsumer.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.listener; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.order.bo.OrderIdWithRefundIdBO; +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.service.RefundInfoService; +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; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 拼团订单成团失败通知 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.GROUP_ORDER_UN_SUCCESS_REFUND_TOPIC, consumerGroup = RocketMqConstant.GROUP_ORDER_UN_SUCCESS_REFUND_TOPIC) +public class GroupOrderUnSuccessRefundConsumer implements RocketMQListener> { + + @Autowired + private RefundInfoService refundInfoService; + @Autowired + private PayInfoService payInfoService; + + /** + * 拼团订单成团失败通知 + */ + @Override + public void onMessage(List orderIdWithRefundIds) { + List orderIds = orderIdWithRefundIds.stream().map(OrderIdWithRefundIdBO::getOrderId).collect(Collectors.toList()); + + List payInfos = payInfoService.listByOrderIds(orderIds); + if (CollectionUtil.isEmpty(payInfos)) { + return; + } + Map orderIdWithRefundIdMap = orderIdWithRefundIds.stream().collect(Collectors.toMap(OrderIdWithRefundIdBO::getOrderId, OrderIdWithRefundIdBO::getRefundId)); + for (PayInfo payInfo : payInfos) { + PayRefundBO payRefundBO = new PayRefundBO(); + payRefundBO.setRefundId(orderIdWithRefundIdMap.get(Long.valueOf(payInfo.getOrderIds()))); + payRefundBO.setRefundAmount(payInfo.getPayAmount()); + payRefundBO.setOrderId(Long.valueOf(payInfo.getOrderIds())); + payRefundBO.setPayId(payInfo.getPayId()); + payRefundBO.setUnSuccessGroupOrder(1); + refundInfoService.doRefund(payRefundBO); + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OrderRefundUpdateRefundStatusConsumer.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OrderRefundUpdateRefundStatusConsumer.java new file mode 100644 index 0000000..24de7b1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/OrderRefundUpdateRefundStatusConsumer.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.payment.bo.RefundInfoResultBO; +import com.tmerclub.cloud.payment.constant.RefundStatus; +import com.tmerclub.cloud.payment.manager.PayManager; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.model.RefundInfo; +import com.tmerclub.cloud.payment.service.PayInfoService; +import com.tmerclub.cloud.payment.service.RefundInfoService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * 支付宝电脑支付回调 + * @author TRACK + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_UPDATE_REFUND_STATUS, consumerGroup = RocketMqConstant.ORDER_REFUND_UPDATE_REFUND_STATUS) +public class OrderRefundUpdateRefundStatusConsumer implements RocketMQListener> { + + @Autowired + private RefundInfoService refundInfoService; + @Autowired + private PayInfoService payInfoService; + @Autowired + private PayManager payManager; + @Autowired + private RedissonClient redissonClient; + + private static final Logger logger = LoggerFactory.getLogger(OrderRefundUpdateRefundStatusConsumer.class); + + @Override + public void onMessage(List refundIds) { + if (CollUtil.isEmpty(refundIds)) { + return; + } + for (Long refundId : refundIds) { + RLock lock = redissonClient.getLock(LockCacheNames.LOCK_REFUND_HANDLE_PREFIX + refundId); + lock.lock(); + try { + RefundInfo refundInfo = refundInfoService.getByRefundId(refundId); + if (Objects.isNull(refundInfo)) { + continue; + } + if (Objects.nonNull(refundInfo.getCallbackTime()) || Objects.equals(refundInfo.getRefundStatus(), RefundStatus.REFUNDED.value())) { + logger.error("退款单号为{}的订单已经回调过", refundId); + continue; + } + if (!Objects.equals(refundInfo.getPayType(), PayType.ALIPAY.value())) { + logger.error("退款单号为{}的订单不是由支付宝退款", refundId); + continue; + } + PayInfo payInfo = payInfoService.getByPayId(refundInfo.getPayId()); + RefundInfoResultBO refundInfoResultBO = payManager.getRefundInfo(refundInfo.getPayType(), refundInfo.getPayId(),payInfo.getPaySysType(), refundInfo.getRefundId()); + if (refundInfoResultBO.getRefundSuccess()) { + if(Objects.equals(payInfo.getPaySysType(), PaySysType.DEFAULT.value())) { + // 如果普通支付是预售订单时,此处会有两个,此时会有两种情况 + // 情况1,都是微信支付此时只需要退款成功即可 + // 情况2,其中一个是余额支付,因为这是直接成功没有回调,所以同上 + refundInfo = refundInfoService.getByRefundIdAndWxPay(refundInfoResultBO.getRefundId()); + } else { + refundInfo = refundInfoService.getByRefundId(refundInfoResultBO.getRefundId()); + } + logger.info("退款单号为{}的订单开始进行订单回调", refundId); + refundInfoService.refundSuccess(refundInfo); + } + } finally { + lock.unlock(); + } + } + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/PlatformTransferConsumer.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/PlatformTransferConsumer.java new file mode 100644 index 0000000..34d7bc3 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/listener/PlatformTransferConsumer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.listener; + +import com.tmerclub.cloud.api.payment.vo.SplitRuleVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.payment.service.PayInfoService; +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 lhd + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.PLATFORM_TRANSFER_TOPIC, consumerGroup = RocketMqConstant.PLATFORM_TRANSFER_TOPIC) +public class PlatformTransferConsumer implements RocketMQListener> { + + @Autowired + private PayInfoService payInfoService; + + /** + * 平台转账 + */ + @Override + public void onMessage(List splitRuleList) { + for (SplitRuleVO splitRuleVO : splitRuleList) { + payInfoService.platformTransfer(splitRuleVO); + } + + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/mapper/PayInfoMapper.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/mapper/PayInfoMapper.java new file mode 100644 index 0000000..4a0ff38 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/mapper/PayInfoMapper.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.mapper; + +import com.tmerclub.cloud.payment.model.PayInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单支付记录 + * + * @author FrozenWatermelon + * @date 2020-12-25 09:50:59 + */ +public interface PayInfoMapper { + + /** + * 根据订单支付记录id获取订单支付记录 + * + * @param payId 订单支付记录id + * @return 订单支付记录 + */ + PayInfo getByPayId(@Param("payId") Long payId); + + /** + * 保存订单支付记录 + * + * @param payInfo 订单支付记录 + */ + void save(@Param("payInfo") PayInfo payInfo); + + /** + * 更新订单支付记录 + * + * @param payInfo 订单支付记录 + */ + void update(@Param("payInfo") PayInfo payInfo); + + /** + * 更新支付成功 + * @param payInfo + * @return + */ + int updateToSuccess(@Param("payInfo") PayInfo payInfo); + + + /** + * 根据支付订单号获取订单支付状态 + * + * @param orderIds 订单号ids + * @return 支付状态 + */ + Integer getPayStatusByOrderIds(@Param("orderIds") String orderIds); + + /** + * 查询订单是否已经支付 + * + * @param orderIds 订单id + * @param userId 用户id + * @param payEntry 支付入口 + * @param sysType + * @return 是否已经支付 + */ + Integer isPay(@Param("orderIds") String orderIds, @Param("userId") Long userId, @Param("sysType") Integer sysType, @Param("payEntry") Integer payEntry); + + /** + * 根据订单id,获取订单支付的信息 + * + * @param orderIds 订单ids + * @return 支付信息 + */ + List listByOrderIds(@Param("orderIds") List orderIds); + + /** + * 根据支付状态获取订单支付信息 + * + * @param orderIds + * @param userId + * @param payStatus 支付状态 + * @return + */ + List listPayedInfoByOrderIds(@Param("orderIds") List orderIds, @Param("userId") Long userId, @Param("payStatus") Integer payStatus); + + /** + * 根据payIds获取支付信息集合 + * @param payIdList 支付单号 + * @return + */ + List listByPayIds(@Param("payIdList") List payIdList); + + /** + * 根据订单号和支付入口获取支付信息 + * @param orderIds + * @param payEntry + * @return 支付信息 + */ + List getByOrderIdsAndEntry(@Param("orderIds") String orderIds, @Param("payEntry") Integer payEntry); + + /** + * 根据订单号和支付入口和收款人获取支付信息 + * @param toUserId + * @param orderId + * @param payEntry + * @return 支付信息 + */ + PayInfo getByOrderIdAndEntryAndToUserId(@Param("toUserId") String toUserId, @Param("orderId") Long orderId, @Param("payEntry") Integer payEntry); + + /** + * 根据订单号获取最新支付成功信息的系统类型 + * @param orderId + * @param userId + * @return 系统类型 + */ + List getPayInfoByUserIdAndOrderId(@Param("userId") Long userId, @Param("orderId") Long orderId); + + + /** + * 根据支付单号获取支付信息 + * @param payId + * @return + */ + PayInfo getPayInfoByPayId(Long payId); + + /** + * 团购订单拆单后,修改订单支付信息 + * + * @param orderIds + * @param oldOrderId + * @return + */ + void updatePayInfoBySplitGroup(@Param("orderIds") String orderIds, @Param("oldOrderId") Long oldOrderId); +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/AllinpayCompanyService.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/AllinpayCompanyService.java new file mode 100644 index 0000000..6e2d9a7 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/AllinpayCompanyService.java @@ -0,0 +1,162 @@ +package com.tmerclub.cloud.payment.service; + +import com.tmerclub.cloud.api.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.api.payment.dto.BindCompanyAccountDTO; +import com.tmerclub.cloud.api.payment.dto.SetCompanyInfoDTO; +import com.tmerclub.cloud.api.payment.dto.UpdateCompanyInfoDTO; +import com.tmerclub.cloud.payment.allinpay.member.req.IdCardCollectByFileUpload; +import com.tmerclub.cloud.payment.allinpay.member.resp.CardBinInfo; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.dto.*; + +import java.util.List; + +/** + * @author TRACK + */ +public interface AllinpayCompanyService { + + /** + * 注册企业会员 + * @param bizUserId + */ + void createCompanyMember(String bizUserId); + + /** + * 获取企业信息 + * @param tenantId + * @return + */ + CompanyInfo getCompanyInfo(String tenantId); + + /** + * 发送短信验证码 + * @param bizUserId 用户id + * @param verificationCodeDTO 短信验证码类 + */ + void sendVerificationCode(String bizUserId, VerificationCodeDTO verificationCodeDTO); + + /** + * 绑定手机 + * @param bizUserId 用户id + * @param verificationCodeDTO 短信验证码类 + */ + void bindPhone(String bizUserId, VerificationCodeDTO verificationCodeDTO); + + /** + * 解绑手机(商户无法创建提现订单,给与提示) + * @param bizUserId 用户id + * @param verificationCodeDTO 短信验证码类 + */ + void unbindPhone(String bizUserId, VerificationCodeDTO verificationCodeDTO); + + /** + * 设置企业信息 + * @param tenantId 商户id + * @param backUrl 通知地址 + * @param setCompanyInfoDTO 设置企业信息类 + * @return + */ + SetCompanyInfoResp setCompanyInfo(String tenantId, String backUrl, SetCompanyInfoDTO setCompanyInfoDTO); + + /** + * 修改企业信息 + * @param tenantId 商户id + * @param backUrl 通知地址 + * @param updateCompanyInfoDTO 设置企业信息类 + * @return + */ + UpdateCompanyInfoResp updateCompanyInfo(String tenantId, String backUrl, UpdateCompanyInfoDTO updateCompanyInfoDTO); + + /** + * 影印件采集 + * @param idCardCollectDTO 影印件信息 + * @param backUrl 异步通知地址 + * @return 采集结果 + */ + IdCardCollectResp idCardCollect(IdCardCollectDTO idCardCollectDTO, String backUrl); + + /** + * 影印件采集(文件上传模式) + * @param idCardCollectByFileUpload + * @return + */ + IdCardCollectByFileUploadResp idcardCollectByFileUpload(IdCardCollectByFileUpload idCardCollectByFileUpload); + + /** + * 查询卡bin + * @param cardNo 卡号 + * @return + */ + CardBinInfo getBankCardBin(String cardNo); + + /** + * 请求绑定银行卡 + * @param tenantId + * @param applyBankCardDTO + * @param legalName + */ + void applyBindBankCard(String tenantId, ApplyBankCardDTO applyBankCardDTO, String legalName); + + /** + * 确认绑定银行卡 + * @param tenantId + * @param bindBankCardDTO' + * @param legalName + */ + void bindBankCard(String tenantId, BindBankCardDTO bindBankCardDTO, String legalName); + + /** + * 解绑银行卡 + * @param tenantId + * @param unbindBankCardDTO + */ + void unbindBankCard(String tenantId, UnbindBankCardDTO unbindBankCardDTO); + + /** + * 查询银行卡 + * @param tenantId + * @param cardNo + * @return + */ + List queryBankCard(String tenantId, String cardNo); + + /** + * 企业会员绑定对公户 + * @param bizUserId + * @param bindCompanyAccountDTO + * @param companyName + */ + void bindCompanyAccount(String bizUserId, BindCompanyAccountDTO bindCompanyAccountDTO, String companyName); + + /** + * 删除缓存 + * @param tenantId + */ + void deleteCache(String tenantId); + + /** + * 账户提现协议签约 + * @param bizUserId 商户系统用户id + * @param backUrl 通知地址 + * @param signAcctProtocolDTO 签约提现协议类 + * @return + */ + String signAcctProtocol(String bizUserId, String backUrl, SignAcctProtocolDTO signAcctProtocolDTO); + + /** + * 账户协议签约查询 + * @param bizUserId 商户系统用户id + * @param signAcctProtocolDTO 签约提现协议类 + * @return + */ + String signContractQuery(String bizUserId, SignAcctProtocolDTO signAcctProtocolDTO); + + /** + * 获取影印件状态 + * @param ocrRegnumComparisonResult + * @param ocrIdcardComparisonResult + * @return + */ + Integer getIdCardStatus(Integer ocrRegnumComparisonResult, Integer ocrIdcardComparisonResult); +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/RefundInfoService.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/RefundInfoService.java new file mode 100644 index 0000000..d738168 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/RefundInfoService.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.service; + +import com.tmerclub.cloud.api.payment.vo.AccountDetailVO; +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.bo.PayRefundBO; +import com.tmerclub.cloud.payment.dto.AccountSearchDTO; +import com.tmerclub.cloud.payment.model.PayInfo; +import com.tmerclub.cloud.payment.model.RefundInfo; +import com.tmerclub.cloud.payment.vo.RefundInfoVO; +import jakarta.servlet.http.HttpServletResponse; + +import java.util.Date; + +/** + * 退款信息 + * + * @author FrozenWatermelon + * @date 2021-03-11 14:45:01 + */ +public interface RefundInfoService { + + /** + * 分页获取退款信息列表 + * @param pageDTO 分页参数 + * @return 退款信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据退款信息id获取退款信息 + * + * @param refundId 退款信息id + * @return 退款信息 + */ + RefundInfo getByRefundIdAndWxPay(Long refundId); + /** + * 根据退款信息id获取退款信息 + * + * @param refundId 退款信息id + * @return 退款信息 + */ + RefundInfo getByRefundId(Long refundId); + + /** + * 保存退款信息 + * @param refundInfo 退款信息 + */ + void save(RefundInfo refundInfo); + + /** + * 更新退款信息 + * @param refundInfo 退款信息 + */ + void update(RefundInfo refundInfo); + + /** + * 根据退款信息id删除退款信息 + * @param refundId 退款信息id + */ + void deleteById(Long refundId); + + /** + * 执行退款 + * @param payRefundBO + */ + void doRefund(PayRefundBO payRefundBO); + + /** + * 退款成功,通知各个服务 + * @param refundInfo + */ + void refundSuccess(RefundInfo refundInfo); + + /** + * 根据时间参数获取退款账户详情 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param shopName + * @return 退款账户详情 + */ + AccountDetailVO getRefundAccountDetail(Date startTime, Date endTime, String shopName); + + /** + * 获取平台退款详情 + * @param startTime + * @param endTime + * @return + */ + AccountDetailVO getPlatformRefundAccountDetail(Date startTime, Date endTime); + + /** + * 根据参数获取退款详情 + * @param pageDTO 分页参数 + * @param accountSearchDTO + * @return 退款详情 + */ + PageVO getRefundInfoPage(PageDTO pageDTO, AccountSearchDTO accountSearchDTO); + + /** + * 获取退款对账列表 + * @param accountSearchDTO + * @param response + */ + void excelRefundInfo(HttpServletResponse response, AccountSearchDTO accountSearchDTO); + + /** + * 根据时间参数分页获取收入账户详情 + * @param pageDTO + * @param accountSearchDTO + * @return + */ + PageVO pageRefundAccountDetail(PageDTO pageDTO, AccountSearchDTO accountSearchDTO); + + /** + * 支付金额不对,进行退款 + * + * @param payInfo + * @param payRefundBO + */ + void doRefundByAmountError(PayInfo payInfo, PayRefundBO payRefundBO); + + /** + * 根据payId更新退款信息 + * @param refundInfo + */ + void updateByIdPayId(RefundInfo refundInfo); + +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/AllinpayServiceImpl.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/AllinpayServiceImpl.java new file mode 100644 index 0000000..78eaa27 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/service/impl/AllinpayServiceImpl.java @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp; +import com.tmerclub.cloud.api.platform.config.FeignShopConfig; +import com.tmerclub.cloud.common.bean.Allinpay; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.util.IpHelper; +import com.tmerclub.cloud.payment.allinpay.OpenClient; +import com.tmerclub.cloud.payment.allinpay.constant.AllinpayPlatformAccountSet; +import com.tmerclub.cloud.payment.allinpay.member.constant.*; +import com.tmerclub.cloud.payment.allinpay.member.req.*; +import com.tmerclub.cloud.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.allinpay.order.req.*; +import com.tmerclub.cloud.payment.allinpay.member.constant.*; +import com.tmerclub.cloud.payment.allinpay.member.req.*; +import com.tmerclub.cloud.payment.allinpay.member.resp.*; +import com.tmerclub.cloud.payment.allinpay.order.req.*; +import com.tmerclub.cloud.payment.allinpay.order.resp.GetOrderStatusResp; +import com.tmerclub.cloud.payment.allinpay.order.resp.InExpDetail; +import com.tmerclub.cloud.payment.allinpay.order.resp.QueryInExpDetailResp; +import com.tmerclub.cloud.payment.allinpay.order.resp.ResendPaySmsResp; +import com.tmerclub.cloud.payment.allinpay.service.AllinpayMemberService; +import com.tmerclub.cloud.payment.allinpay.service.AllinpayOrderService; +import com.tmerclub.cloud.payment.config.AllinpayConfig; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.dto.*; +import com.tmerclub.cloud.payment.service.AllinpayService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import java.util.List; +import java.util.Objects; + +/** + * @author lanhai + */ +@Service +public class AllinpayServiceImpl implements AllinpayService { + + @Autowired + private AllinpayMemberService allinpayMemberService; + @Autowired + private AllinpayConfig allinpayConfig; + @Autowired + private AllinpayOrderService allinpayOrderService; + + @Autowired + private FeignShopConfig feignShopConfig; + + @Override + public void createMember(String bizUserId, Integer sysType) { + CreateMember createMember = new CreateMember(bizUserId); + createMember.setSource(VisitSourceType.PC.value()); + allinpayMemberService.createMember(createMember); + } + + @Override + public UserInfo getUserInfo(String bizUserId) { + GetMemberInfo getMemberInfo = new GetMemberInfo(bizUserId); + UserInfo userInfo = allinpayMemberService.getMemberInfo(getMemberInfo); + // 个人会员(身份证号解密) + OpenClient client = allinpayConfig.getClient(); + String encryptStr = userInfo.getIdentityCardNo(); + userInfo.setIdentityCardNo(encryptStr == null ? null : client.decrypt(encryptStr)); + return userInfo; + } + + @Override + public void sendVerificationCode(String userId, VerificationCodeDTO verificationCodeDTO) { + if (StrUtil.isBlank(userId)) { + return; + } + SendVerificationCode svc = new SendVerificationCode(userId, verificationCodeDTO.getPhone()); + Integer type = verificationCodeDTO.getVerificationCodeType(); + if (type != null + && VerificationCodeType.instance(type) != null) { + svc.setVerificationCodeType(type); + } + allinpayMemberService.sendVerificationCode(svc); + } + + @Override + public void bindPhone(String userId, VerificationCodeDTO verificationCodeDTO) { + BindPhone bindPhone = new BindPhone( + userId, + verificationCodeDTO.getPhone(), + verificationCodeDTO.getVerificationCode() + ); + allinpayMemberService.bindPhone(bindPhone); + } + + @Override + public void unbindPhone(String userId, VerificationCodeDTO verificationCodeDTO) { + UnbindPhone unbindPhone = new UnbindPhone( + userId, + verificationCodeDTO.getPhone(), + verificationCodeDTO.getVerificationCode() + ); + PhoneVerificationResp phoneVerificationResp = allinpayMemberService.unbindPhone(unbindPhone); + if (Objects.equals(Constant.ERROR, phoneVerificationResp.getResult())) { + throw new LuckException("解绑手机失败"); + } + } + + @Override + public String updatePhoneByPayPwd(String bizUserId, String backUrl, UpdatePhoneByPayPwdDTO updatePhoneByPayPwdDTO) { + UpdatePhoneByPayPwd updatePhoneByPayPwd = new UpdatePhoneByPayPwd(); + BeanUtils.copyProperties(updatePhoneByPayPwdDTO, updatePhoneByPayPwd); + updatePhoneByPayPwd.setBizUserId(bizUserId); + updatePhoneByPayPwd.setBackUrl(backUrl); + OpenClient client = allinpayConfig.getClient(); + updatePhoneByPayPwd.setIdentityNo(client.encrypt(updatePhoneByPayPwd.getIdentityNo())); + if (updatePhoneByPayPwd.getJumpPageType() == null) { + updatePhoneByPayPwd.setJumpPageType(PageType.H5.value()); + } + return allinpayMemberService.updatePhoneByPayPwd(updatePhoneByPayPwd); + } + + @Override + public void setRealName(Long userId, SetRealNameDTO setRealNameDTO) { + OpenClient client = allinpayConfig.getClient(); + SetRealName setRealName = new SetRealName( + String.valueOf(userId), + setRealNameDTO.getName(), + client.encrypt(setRealNameDTO.getIdentityNo()) + ); + allinpayMemberService.setRealName(setRealName); + } + + @Override + public void lockMember(LockMemberDTO lockMemberDTO) { + LockMember lockMember = new LockMember(String.valueOf(lockMemberDTO.getUserId())); + allinpayMemberService.lockMember(lockMember); + } + + @Override + public void unlockMember(LockMemberDTO lockMemberDTO) { + UnlockMember unlockMember = new UnlockMember(String.valueOf(lockMemberDTO.getUserId())); + allinpayMemberService.unlockMember(unlockMember); + } + + @Override + public CardBinInfo getBankCardBin(String cardNo) { + GetBankCardBin getBankCardBin = new GetBankCardBin(); + OpenClient client = allinpayConfig.getClient(); + getBankCardBin.setCardNo(client.encrypt(cardNo)); + return allinpayMemberService.getBankCardBin(getBankCardBin); + } + + @Override + public ApplyBindBankCardResp applyBindBankCard(String userId, ApplyBankCardDTO applyBankCardDTO) { + OpenClient client = allinpayConfig.getClient(); + ApplyBindBankCard applyBindBankCard = new ApplyBindBankCard(); + BeanUtils.copyProperties(applyBankCardDTO, applyBindBankCard); + applyBindBankCard.setIdentityType(IdentityType.ID_CARD.value()); + applyBindBankCard.setBizUserId(userId); + applyBindBankCard.setIdentityNo(client.encrypt(applyBankCardDTO.getIdentityNo())); + applyBindBankCard.setCardNo(client.encrypt(applyBankCardDTO.getCardNo())); + return allinpayMemberService.applyBindBankCard(applyBindBankCard); + } + + @Override + public void bindBankCard(String userId, BindBankCardDTO bindBankCardDTO) { + BindBankCard bindBankCard = new BindBankCard(); + BeanUtils.copyProperties(bindBankCardDTO, bindBankCard); + bindBankCard.setBizUserId(userId); + allinpayMemberService.bindBankCard(bindBankCard); + } + + @Override + public void unbindBankCard(String userId, UnbindBankCardDTO unbindBankCardDTO) { + OpenClient client = allinpayConfig.getClient(); + UnbindBankCard unbindBankCard = new UnbindBankCard(); + unbindBankCard.setBizUserId(userId); + unbindBankCard.setCardNo(client.encrypt(unbindBankCardDTO.getCardNo())); + allinpayMemberService.unbindBankCard(unbindBankCard); + } + + @Override + public List queryBankCard(String userId, String cardNo) { + QueryBankCard queryBankCard = new QueryBankCard(userId); + if (!ObjectUtils.isEmpty(cardNo)) { + OpenClient client = allinpayConfig.getClient(); + queryBankCard.setCardNo(client.encrypt(cardNo)); + } + return allinpayMemberService.queryBankCard(queryBankCard); + } + + @Override + public void applyBindAcct(String bizUserId, ApplyBindAcctDTO applyBindAcctDTO) { + ApplyBindAcct applyBindAcct = new ApplyBindAcct(); + if (PayAcctType.instance(applyBindAcctDTO.getAcctType()) == null) { + throw new LuckException("accType参数错误"); + } + applyBindAcct.setBizUserId(bizUserId); + applyBindAcct.setAcctType(applyBindAcctDTO.getAcctType()); + applyBindAcct.setAcct(applyBindAcctDTO.getAcct()); + Result result = allinpayMemberService.applyBindAcct(applyBindAcct); + if (Objects.equals(result.getResult(), Constant.ERROR)) { + throw new LuckException("绑定失败"); + } + } + + @Override + public QueryBindAcctResp queryBindAcct(String bizUserId) { + ApplyBindAcct applyBindAcct = new ApplyBindAcct(); + applyBindAcct.setBizUserId(bizUserId); + applyBindAcct.setOperationType("query"); + return allinpayMemberService.queryBindAcct(applyBindAcct); + } + + @Override + public String setPayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO) { + OpenClient client = allinpayConfig.getClient(); + SetPayPwd setPayPwd = new SetPayPwd(); + BeanUtils.copyProperties(setPayPwdDTO, setPayPwd); + setPayPwd.setBizUserId(String.valueOf(userId)); + setPayPwd.setIdentityType(IdentityType.ID_CARD.value()); + setPayPwd.setIdentityNo(client.encrypt(setPayPwdDTO.getIdentityNo())); + setPayPwd.setBackUrl(backUrl); + return allinpayMemberService.setPayPwd(setPayPwd); + } + + @Override + public String updatePayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO) { + OpenClient client = allinpayConfig.getClient(); + UpdatePayPwd updatePayPwd = new UpdatePayPwd(); + BeanUtils.copyProperties(setPayPwdDTO, updatePayPwd); + updatePayPwd.setBizUserId(String.valueOf(userId)); + updatePayPwd.setIdentityType(IdentityType.ID_CARD.value()); + updatePayPwd.setIdentityNo(client.encrypt(setPayPwdDTO.getIdentityNo())); + updatePayPwd.setBackUrl(backUrl); + return allinpayMemberService.updatePayPwd(updatePayPwd); + } + + @Override + public String resetPayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO) { + OpenClient client = allinpayConfig.getClient(); + ResetPayPwd resetPayPwd = new ResetPayPwd(); + BeanUtils.copyProperties(setPayPwdDTO, resetPayPwd); + resetPayPwd.setBizUserId(String.valueOf(userId)); + resetPayPwd.setIdentityType(IdentityType.ID_CARD.value()); + resetPayPwd.setIdentityNo(client.encrypt(setPayPwdDTO.getIdentityNo())); + resetPayPwd.setBackUrl(backUrl); + return allinpayMemberService.resetPayPwd(resetPayPwd); + } + + @Override + public String signAcctProtocol(String bizUserId, String backUrl, SignAcctProtocolDTO signAcctProtocolDTO) { + SignAcctProtocol signAcctProtocol = new SignAcctProtocol(); + BeanUtils.copyProperties(signAcctProtocolDTO, signAcctProtocol); + signAcctProtocol.setBizUserId(bizUserId); + signAcctProtocol.setBackUrl(backUrl); + signAcctProtocol.setSource(VisitSourceType.PC.value()); + return allinpayMemberService.signAcctProtocol(signAcctProtocol); + } + + @Override + public String signContractQuery(String bizUserId, SignAcctProtocolDTO signAcctProtocolDTO) { + SignContractQuery signContractQuery = new SignContractQuery(); + BeanUtils.copyProperties(signAcctProtocolDTO, signContractQuery); + signContractQuery.setBizUserId(bizUserId); + signContractQuery.setSource(VisitSourceType.PC.value()); + return allinpayMemberService.signContractQuery(signContractQuery); + } + + @Override + public BankCardChangeBindPhoneResp bankCardChangeBindPhone(String bizUserId, BankCardChangeBindPhoneDTO bankCardChangeBindPhoneDTO) { + BankCardChangeBindPhone bankCardChangeBindPhone = new BankCardChangeBindPhone(); + BeanUtils.copyProperties(bankCardChangeBindPhoneDTO, bankCardChangeBindPhone); + bankCardChangeBindPhone.setBizUserId(bizUserId); + bankCardChangeBindPhone.setIdentityType(IdentityType.ID_CARD.value()); + // 数据加密 + OpenClient client = allinpayConfig.getClient(); + bankCardChangeBindPhone.setCardNo(client.encrypt(bankCardChangeBindPhoneDTO.getCardNo())); + bankCardChangeBindPhone.setIdentityNo(client.encrypt(bankCardChangeBindPhoneDTO.getIdentityNo())); + if (!ObjectUtils.isEmpty(bankCardChangeBindPhoneDTO.getValidate())) { + bankCardChangeBindPhone.setValidate(client.encrypt(bankCardChangeBindPhoneDTO.getValidate())); + } + if (!ObjectUtils.isEmpty(bankCardChangeBindPhoneDTO.getCvv2())) { + bankCardChangeBindPhone.setCvv2(client.encrypt(bankCardChangeBindPhoneDTO.getCvv2())); + } + return allinpayMemberService.bankCardChangeBindPhone(bankCardChangeBindPhone); + } + + @Override + public void verifyBankCardChangeBindPhone(String bizUserId, VerifyBankCardChangeBindPhoneDTO verifyBankCardChangeBindPhoneDTO) { + VerifyBankCardChangeBindPhone verifyBankCardChangeBindPhone = new VerifyBankCardChangeBindPhone(); + BeanUtils.copyProperties(verifyBankCardChangeBindPhoneDTO, verifyBankCardChangeBindPhone); + verifyBankCardChangeBindPhone.setBizUserId(bizUserId); + // 数据加密 + OpenClient client = allinpayConfig.getClient(); + if (!ObjectUtils.isEmpty(verifyBankCardChangeBindPhoneDTO.getValidate())) { + verifyBankCardChangeBindPhone.setValidate(client.encrypt(verifyBankCardChangeBindPhoneDTO.getValidate())); + } + if (!ObjectUtils.isEmpty(verifyBankCardChangeBindPhoneDTO.getCvv2())) { + verifyBankCardChangeBindPhone.setCvv2(client.encrypt(verifyBankCardChangeBindPhone.getCvv2())); + } + allinpayMemberService.verifyBankCardChangeBindPhone(verifyBankCardChangeBindPhone); + } + + @Override + public QueryBalanceResp queryBalance(String bizUserId, Integer sysType) { + // 平台使用标准账户集,其余使用托管账户集 + String accountSetNo; + if (Objects.equals(SysTypeEnum.PLATFORM.value(), sysType)) { + accountSetNo = AllinpayPlatformAccountSet.STANDARD_BALANCE.toString(); + } else { + Allinpay allinpay = feignShopConfig.getAllinpay(); + accountSetNo = allinpay.getAccountSetNo(); + } + QueryBalance queryBalance = new QueryBalance(bizUserId, accountSetNo); + return allinpayOrderService.queryBalance(queryBalance); + } + + @Override + public PageVO queryInExpDetail(String bizUserId, PageDTO pageDTO, QueryInExpDetailDTO queryInExpDetailDTO) { + QueryInExpDetail queryInExpDetail = new QueryInExpDetail(); + BeanUtils.copyProperties(queryInExpDetailDTO, queryInExpDetail); + queryInExpDetail.setBizUserId(bizUserId); + // 计算分页 + queryInExpDetail.setQueryNum(pageDTO.getPageSize()); + queryInExpDetail.setStartPosition(1 + (pageDTO.getPageNum() - 1) * pageDTO.getPageSize()); + // 发送请求,并封装为分页展示类 + QueryInExpDetailResp resp = allinpayOrderService.queryInExpDetail(queryInExpDetail); + PageVO pageVO = new PageVO<>(); + pageVO.setTotal(resp.getTotalNum()); + pageVO.setList(resp.getInExpDetail()); + int pages = Integer.parseInt(String.valueOf(pageVO.getTotal())) / pageDTO.getPageSize(); + pageVO.setPages(pageVO.getTotal() % pageDTO.getPageSize() == 0 ? pages : pages + 1); + return pageVO; + } + + @Override + public String payBySms(String bizUserId, PayBySmsDTO payBySmsDTO) { + PayBySms payBySms = new PayBySms(); + BeanUtils.copyProperties(payBySmsDTO, payBySms); + payBySms.setBizUserId(bizUserId); + String ipAddr = IpHelper.getIpAddr(); + payBySms.setConsumerIp(ipAddr); + return allinpayOrderService.payBySms(payBySms); + } + + @Override + public String payByPwd(String bizUserId, PayByPwdDTO payByPwdDTO) { + PayByPwd payByPwd = new PayByPwd(); + BeanUtils.copyProperties(payByPwdDTO, payByPwd); + payByPwd.setBizUserId(bizUserId); + String ipAddr = IpHelper.getIpAddr(); + payByPwd.setConsumerIp(ipAddr); + return allinpayOrderService.payByPwd(payByPwd); + } + + @Override + public PayByBackSmsResp payByBackSms(String bizUserId, PayByBackSmsDTO payByBackSmsDTO) { + PayByBackSmsReq payByBackSmsReq = new PayByBackSmsReq(); + BeanUtils.copyProperties(payByBackSmsDTO, payByBackSmsReq); + payByBackSmsReq.setBizUserId(bizUserId); + String ipAddr = IpHelper.getIpAddr(); + payByBackSmsReq.setConsumerIp(ipAddr); + return allinpayOrderService.payByBackSms(payByBackSmsReq); + } + + @Override + public ResendPaySmsResp resendPaySms(String bizOrderNo) { + ResendPaySmsReq resendPaySmsReq = new ResendPaySmsReq(); + resendPaySmsReq.setBizOrderNo(bizOrderNo); + return allinpayOrderService.resendPaySms(resendPaySmsReq); + } + + @Override + public GetOrderStatusResp getOrderStatus(String bizUserId, String bizOrderNo) { + GetOrderStatusReq getOrderStatusReq = new GetOrderStatusReq(); + getOrderStatusReq.setBizUserId(bizUserId); + getOrderStatusReq.setBizOrderNo(bizOrderNo); + return allinpayOrderService.getOrderStatus(getOrderStatusReq); + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/MemberInfoVO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/MemberInfoVO.java new file mode 100644 index 0000000..793f534 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/MemberInfoVO.java @@ -0,0 +1,46 @@ +package com.tmerclub.cloud.payment.vo; + +import com.tmerclub.cloud.api.payment.allinpay.member.resp.CompanyInfo; +import com.tmerclub.cloud.payment.allinpay.member.resp.UserInfo; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 通联支付会员信息 + * @author gaozijie + */ +public class MemberInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "个人信息") + private UserInfo userInfo; + + @Schema(description = "企业信息") + private CompanyInfo companyInfo; + + public UserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + public CompanyInfo getCompanyInfo() { + return companyInfo; + } + + public void setCompanyInfo(CompanyInfo companyInfo) { + this.companyInfo = companyInfo; + } + + @Override + public String toString() { + return "MemberInfoVO{" + + "userInfo=" + userInfo + + ", companyInfo=" + companyInfo + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PaySettlementConfigVO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PaySettlementConfigVO.java new file mode 100644 index 0000000..daeaca1 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/PaySettlementConfigVO.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author Pineapple + */ +public class PaySettlementConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 支付结算类型 0.原生结算 1.通联结算 + */ + private Integer paySettlementType; + + /** + * 通联商户系统用户标识,商户系统中唯一编号,也就是平台唯一的通联标识 + */ + private String bizUserId; + + public Integer getPaySettlementType() { + return paySettlementType; + } + + public void setPaySettlementType(Integer paySettlementType) { + this.paySettlementType = paySettlementType; + } + + public String getBizUserId() { + return bizUserId; + } + + public void setBizUserId(String bizUserId) { + this.bizUserId = bizUserId; + } + + @Override + public String toString() { + return "PaySettlementConfigVO{" + + "paySettlementType=" + paySettlementType + + ", bizUserId='" + bizUserId + '\'' + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/RefundInfoExcelVO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/RefundInfoExcelVO.java new file mode 100644 index 0000000..bdcfe6b --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/RefundInfoExcelVO.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * spu信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class RefundInfoExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "退款对账"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0}; + + @ExcelProperty(value = {"退款对账信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty({"退款对账信息", "店铺名称"}) + private String shopName; + + @ExcelProperty({"退款对账信息", "退款单号"}) + private String refundId; + + @ExcelProperty({"退款对账信息", "支付单号"}) + private String payId; + + @ExcelProperty({"退款对账信息", "关联订单号"}) + private String orderId; + + @ExcelProperty({"退款对账信息", "支付入口"}) + private String payEntry; + + @ExcelProperty({"退款对账信息", "支付方式"}) + private String payType; + + @ExcelProperty({"退款对账信息", "支付积分"}) + private String payScore; + + @ExcelProperty({"退款对账信息", "支付宝金额"}) + private String alipayAmount; + + @ExcelProperty({"退款对账信息", "微信金额"}) + private String wechatAmount; + + @ExcelProperty({"退款对账信息", "余额金额"}) + private String balanceAmount; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty({"退款对账信息", "退款时间"}) + private Date refundTime; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getRefundId() { + return refundId; + } + + public void setRefundId(String refundId) { + this.refundId = refundId; + } + + public String getPayId() { + return payId; + } + + public void setPayId(String payId) { + this.payId = payId; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public String getPayEntry() { + return payEntry; + } + + public void setPayEntry(String payEntry) { + this.payEntry = payEntry; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getPayScore() { + return payScore; + } + + public void setPayScore(String payScore) { + this.payScore = payScore; + } + + public String getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(String alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public String getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(String wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public String getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(String balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + @Override + public String toString() { + return "RefundInfoExcelVO{" + + "seq='" + seq + '\'' + + ", shopName='" + shopName + '\'' + + ", refundId=" + refundId + + ", payId=" + payId + + ", orderId=" + orderId + + ", payEntry='" + payEntry + '\'' + + ", payType='" + payType + '\'' + + ", payScore='" + payScore + '\'' + + ", alipayAmount='" + alipayAmount + '\'' + + ", wechatAmount='" + wechatAmount + '\'' + + ", balanceAmount='" + balanceAmount + '\'' + + ", refundTime=" + refundTime + + '}'; + } +} diff --git a/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/RefundInfoVO.java b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/RefundInfoVO.java new file mode 100644 index 0000000..c2dbc61 --- /dev/null +++ b/tmerclub-payment/src/main/java/com/tmerclub/cloud/payment/vo/RefundInfoVO.java @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.payment.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 退款信息VO + * + * @author FrozenWatermelon + * @date 2021-03-15 15:26:03 + */ +public class RefundInfoVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "关联的支付订单id") + private Long orderId; + + @Schema(description = "关联的支付单id") + private Long payId; + + @Schema(description = "回调时间") + private Date callbackTime; + + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "退款时间") + private Date refundTime; + + @Schema(description = "退款入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long refundAmount; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Date getCallbackTime() { + return callbackTime; + } + + public void setCallbackTime(Date callbackTime) { + this.callbackTime = callbackTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getRefundTime() { + return refundTime; + } + + public void setRefundTime(Date refundTime) { + this.refundTime = refundTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Long refundAmount) { + this.refundAmount = refundAmount; + } + + @Override + public String toString() { + return "RefundInfoVO{" + + "refundId=" + refundId + + ", orderId=" + orderId + + ", payId=" + payId + + ", callbackTime=" + callbackTime + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", refundTime=" + refundTime + + ", payEntry=" + payEntry + + ", payType=" + payType + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", refundAmount=" + refundAmount + + '}'; + } +} diff --git a/tmerclub-payment/src/main/resources/mapper/PayInfoMapper.xml b/tmerclub-payment/src/main/resources/mapper/PayInfoMapper.xml new file mode 100644 index 0000000..eb38da0 --- /dev/null +++ b/tmerclub-payment/src/main/resources/mapper/PayInfoMapper.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `pay_id`,`create_time`,`update_time`,`user_id`,`order_ids`,`refund_id`,`biz_pay_no`,`sys_type`,`pay_type`,`pay_entry`,`pay_status`, + `pay_score`,`pay_amount`,`version`,`callback_content`,`callback_time`,`confirm_time`,`pay_sys_type`,`system_model`,`biz_user_id` + + + + + + + + + + + insert into pay_info (`pay_id`, `user_id`,`order_ids`,`refund_id`,`biz_pay_no`,`sys_type`,`pay_type`,`pay_entry`,`pay_status`,`pay_score`,`pay_amount`,`version`,`callback_content`,`callback_time`,`confirm_time`, `pay_sys_type`,`system_model`,`biz_user_id`) + values (#{payInfo.payId},#{payInfo.userId},#{payInfo.orderIds},#{payInfo.refundId},#{payInfo.bizPayNo},#{payInfo.sysType},#{payInfo.payType},#{payInfo.payEntry},#{payInfo.payStatus},#{payInfo.payScore},#{payInfo.payAmount},#{payInfo.version},#{payInfo.callbackContent},#{payInfo.callbackTime},#{payInfo.confirmTime}, #{payInfo.paySysType}, #{payInfo.systemModel}, #{payInfo.bizUserId}); + + + update pay_info + + + `user_id` = #{payInfo.userId}, + + + `biz_pay_no` = #{payInfo.bizPayNo}, + + + `order_ids` = #{payInfo.orderIds}, + + + `sys_type` = #{payInfo.sysType}, + + + `pay_type` = #{payInfo.payType}, + + + `pay_status` = #{payInfo.payStatus}, + + + `refund_id` = #{payInfo.refundId}, + + + `pay_sys_type` = #{payInfo.paySysType}, + + + `pay_score` = #{payInfo.payScore}, + + + `pay_amount` = #{payInfo.payAmount}, + + + `version` = #{payInfo.version}, + + + `callback_content` = #{payInfo.callbackContent}, + + + `callback_time` = #{payInfo.callbackTime}, + + + `confirm_time` = #{payInfo.confirmTime}, + + + where pay_id = #{payInfo.payId} + + + update pay_info + set `biz_pay_no` = #{payInfo.bizPayNo},`pay_status` = #{payInfo.payStatus}, + `callback_content` = #{payInfo.callbackContent},`callback_time` = #{payInfo.callbackTime} + + ,`pay_sys_type` = #{payInfo.paySysType} + + where pay_id = #{payInfo.payId} and `pay_status` != 1 + + + + + + + + + + + + + + + update pay_info set order_ids = #{orderIds} + where order_ids = #{oldOrderId} + + + diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoSpuCommBO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoSpuCommBO.java new file mode 100644 index 0000000..3bf3237 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/bo/mongo/MongoSpuCommBO.java @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.bo.mongo; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.Indexed; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author YXF + * @date 2022/8/23 + */ +@Document("spu_comm") +public class MongoSpuCommBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 匿名 + */ + public static Integer anonymous = 1; + + /** + * ID + */ + @Id + private Long spuCommId; + + /** + * 商品ID + */ + @Indexed + private Long spuId; + + /** + * 店铺ID + */ + @Indexed + private Long shopId; + + /** + * 订单项ID + */ + private Long orderItemId; + + /** + * 评论用户ID + */ + @Indexed + private Long userId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 评论内容 + */ + private String content; + + /** + * 掌柜回复 + */ + private String replyContent; + + /** + * 回复时间 + */ + private Date replyTime; + + /** + * 是否回复 0:未回复 1:已回复 + */ + private Integer replySts; + + /** + * IP来源 + */ + private String postip; + + /** + * 商品得分,1-5分 + */ + private Integer score; + + /** + * 店铺评分 1-5分 + */ + private Integer storeScore; + + /** + * 物流评分 1-5分 + */ + private Integer logisticsScore; + + /** + * 有用的计数 + */ + private Integer usefulCounts; + + /** + * 晒图的json字符串 + */ + private String pics; + + /** + * 是否匿名(1:是 0:否) + */ + private Integer isAnonymous; + + /** + * 是否显示 -1:删除 0:不显示 1:显示 2 审核不通过 3.待审核 + */ + private Integer status; + + /** + * 评价(0好评 1中评 2差评) + */ + private Integer evaluate; + + public static Integer getAnonymous() { + return anonymous; + } + + public static void setAnonymous(Integer anonymous) { + MongoSpuCommBO.anonymous = anonymous; + } + + public Long getSpuCommId() { + return spuCommId; + } + + public void setSpuCommId(Long spuCommId) { + this.spuCommId = spuCommId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getReplyContent() { + return replyContent; + } + + public void setReplyContent(String replyContent) { + this.replyContent = replyContent; + } + + public Date getReplyTime() { + return replyTime; + } + + public void setReplyTime(Date replyTime) { + this.replyTime = replyTime; + } + + public Integer getReplySts() { + return replySts; + } + + public void setReplySts(Integer replySts) { + this.replySts = replySts; + } + + public String getPostip() { + return postip; + } + + public void setPostip(String postip) { + this.postip = postip; + } + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + public Integer getStoreScore() { + return storeScore; + } + + public void setStoreScore(Integer storeScore) { + this.storeScore = storeScore; + } + + public Integer getLogisticsScore() { + return logisticsScore; + } + + public void setLogisticsScore(Integer logisticsScore) { + this.logisticsScore = logisticsScore; + } + + public Integer getUsefulCounts() { + return usefulCounts; + } + + public void setUsefulCounts(Integer usefulCounts) { + this.usefulCounts = usefulCounts; + } + + public String getPics() { + return pics; + } + + public void setPics(String pics) { + this.pics = pics; + } + + public Integer getIsAnonymous() { + return isAnonymous; + } + + public void setIsAnonymous(Integer isAnonymous) { + this.isAnonymous = isAnonymous; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getEvaluate() { + return evaluate; + } + + public void setEvaluate(Integer evaluate) { + this.evaluate = evaluate; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "MongoSpuCommBO{" + + "spuCommId=" + spuCommId + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", orderItemId=" + orderItemId + + ", userId=" + userId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", content='" + content + '\'' + + ", replyContent='" + replyContent + '\'' + + ", replyTime=" + replyTime + + ", replySts=" + replySts + + ", postip='" + postip + '\'' + + ", score=" + score + + ", storeScore=" + storeScore + + ", logisticsScore=" + logisticsScore + + ", usefulCounts=" + usefulCounts + + ", pics='" + pics + '\'' + + ", isAnonymous=" + isAnonymous + + ", status=" + status + + ", evaluate=" + evaluate + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/ProdThreadConfig.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/ProdThreadConfig.java new file mode 100644 index 0000000..e2f4314 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/ProdThreadConfig.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.config; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author FrozenWatermelon + * @date 2020/12/15 + */ +@Configuration +@EnableConfigurationProperties(ThreadPoolConfigProperties.class) +public class ProdThreadConfig { + + /** + * 因为每台机器不同,所以线程数量应该是通过配置文件进行配置的 + * @param pool 线程池配置信息 + * @return 订单线程池 + */ + @Bean + public ThreadPoolExecutor prodThreadPoolExecutor(ThreadPoolConfigProperties pool) { + return new ThreadPoolExecutor( + pool.getCoreSize(), + pool.getMaxSize(), + pool.getKeepAliveTime(), + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(100000), + new ThreadFactoryBuilder() + .setNameFormat("Prod-Thread-Pool-%d").build() + ); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/RocketMqConfig.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/RocketMqConfig.java new file mode 100644 index 0000000..4e3072a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/RocketMqConfig.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.config; + +import com.tmerclub.cloud.common.rocketmq.config.RocketMqAdapter; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author FrozenWatermelon + * @date 2021/3/30 + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate stockBillLogTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.STOCK_BILL_LOG_TOPIC); + } + +// @Lazy +// @Bean(destroyMethod = "destroy") +// public RocketMQTemplate stockBillLogPurchaseStorageTemplate() { +// return rocketMqAdapter.getTransactionTemplateByTopicName(RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC); +// } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/ThreadPoolConfigProperties.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/ThreadPoolConfigProperties.java new file mode 100644 index 0000000..629761f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/ThreadPoolConfigProperties.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author lhd + * @date 2020/06/23 + */ +@ConfigurationProperties(prefix = "mall4cloud.prod.thread") +public class ThreadPoolConfigProperties { + + private Integer coreSize; + + private Integer maxSize; + + private Integer keepAliveTime; + + public Integer getCoreSize() { + return coreSize; + } + + public void setCoreSize(Integer coreSize) { + this.coreSize = coreSize; + } + + public Integer getMaxSize() { + return maxSize; + } + + public void setMaxSize(Integer maxSize) { + this.maxSize = maxSize; + } + + public Integer getKeepAliveTime() { + return keepAliveTime; + } + + public void setKeepAliveTime(Integer keepAliveTime) { + this.keepAliveTime = keepAliveTime; + } + + @Override + public String toString() { + return "ThreadPoolConfigProperties{" + + "coreSize=" + coreSize + + ", maxSize=" + maxSize + + ", keepAliveTime=" + keepAliveTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/XxlJobConfig.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/XxlJobConfig.java new file mode 100644 index 0000000..d75cc17 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/ProdKeyType.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/ProdKeyType.java new file mode 100644 index 0000000..150f34a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/ProdKeyType.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.constant; + +/** + * 搜索类型 + * + * @author track + */ +public enum ProdKeyType { + + /** + * 商品名称 + */ + SPU_NAME(1), + /** + * 商品编码 + */ + PARTY_CODE(2); + + private final Integer num; + + public Integer value() { + return num; + } + + ProdKeyType(Integer num) { + this.num = num; + } + + public static ProdKeyType instance(Integer value) { + ProdKeyType[] enums = values(); + for (ProdKeyType statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/SpuExportError.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/SpuExportError.java new file mode 100644 index 0000000..2b3b101 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/constant/SpuExportError.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.constant; + +/** + * 属性类型 + * + * @author yxf + * @date 2020/11/20 + */ +public enum SpuExportError { + + /** + * 商品名称 + */ + SPU_NAME(1, "商品名称错误的序号为:"), + + /** + * sku名称 + */ + SKU_NAME(2, "sku名称错误的序号为:"), + + /** + * 平台分类 + */ + PLATFORM_CATEGORY(3, "平台分类错误的序号为:"), + + /** + * 店铺分类 + */ + SHOP_CATEGORY(4, "店铺分类错误的序号为:"), + + /** + * 店铺分类 + */ + DELIVERY_TYPE(5, "配送方式错误为:"), + + /** + * 运费模板 + */ + DELIVER(6, "运费模板错误的序号为:"), + + /** + * 属性 + */ + PROPERTIES(7, "销售属性错误的序号为:"), + + /** + * 商品保存异常 + */ + PRODUCT_DATA(8, "商品数据不正确的序号为:"), + + /** + * 商品保存异常 + */ + VIRTUAL_DATA(9, "虚拟商品数据不正确的序号为:"), + + /** + * 其他异常 + */ + OTHER(100, "销售属性错误的序号为:"); + + private final Integer value; + + private final String errorInfo; + + public Integer value() { + return value; + } + + public String errorInfo() { + return errorInfo; + } + + SpuExportError(Integer value, String errorInfo) { + this.value = value; + this.errorInfo = errorInfo; + } + + public static SpuExportError instance(Integer value) { + SpuExportError[] enums = values(); + for (SpuExportError spuExportError : enums) { + if (spuExportError.value().equals(value)) { + return spuExportError; + } + } + return null; + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/AttrController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/AttrController.java new file mode 100644 index 0000000..954d9e2 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/AttrController.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.AttrType; +import com.tmerclub.cloud.common.product.constant.SearchType; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.AttrDTO; +import com.tmerclub.cloud.product.model.Attr; +import com.tmerclub.cloud.product.model.AttrValue; +import com.tmerclub.cloud.product.service.AttrService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 属性信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +@RestController("platformAttrController") +@RequestMapping("/mp/attr") +@Tag(name = "admin-属性信息") +public class AttrController { + + @Autowired + private AttrService attrService; + + + @GetMapping("/page") + @Operation(summary = "获取属性信息列表", description = "分页获取属性信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, AttrDTO attrDTO) { + attrDTO.setSysType(AuthUserContext.get().getSysType()); + PageVO attrPage = attrService.page(pageDTO, attrDTO); + return ServerResponseEntity.success(attrPage); + } + + @GetMapping + @Operation(summary = "获取属性信息", description = "根据attrId获取属性信息") + public ServerResponseEntity getByAttrId(@RequestParam Long attrId) { + return ServerResponseEntity.success(attrService.getByAttrId(attrId)); + } + + @PostMapping + @Operation(summary = "保存属性信息", description = "保存属性信息") + public ServerResponseEntity save(@Valid @RequestBody AttrDTO attrDTO) { + if (Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId()) && Objects.isNull(attrDTO.getAttrType())) { + throw new LuckException("属性类型不能为空"); + } + Integer sysType = AuthUserContext.get().getSysType(); + attrDTO.setSysType(sysType); + checkAttrInfo(attrDTO); + attrService.save(attrDTO); + removeCacheAttrUnionCategory(attrDTO.getCategoryIds()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新属性信息", description = "更新属性信息") + public ServerResponseEntity update(@Valid @RequestBody AttrDTO attrDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + attrDTO.setSysType(sysType); + checkAttrInfo(attrDTO); + Attr attr = BeanUtil.map(attrDTO, Attr.class); + List categoryIds = null; + if (CollUtil.isNotEmpty(attrDTO.getAttrValues())) { + List attrValues = BeanUtil.mapAsList(attrDTO.getAttrValues(), AttrValue.class); + attr.setAttrValues(attrValues); + } + if (Objects.equals(AttrType.BASIC.value(), attr.getAttrType())) { + categoryIds = attrService.getAttrOfCategoryIdByAttrId(attrDTO.getAttrId()); + categoryIds = new ArrayList<>(categoryIds); + categoryIds.addAll(attrDTO.getCategoryIds()); + } + attrDTO.setShopId(AuthUserContext.get().getTenantId()); + attrService.update(attrDTO); + removeCacheAttrUnionCategory(categoryIds); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除属性信息", description = "根据属性信息id删除属性信息") + public ServerResponseEntity delete(@RequestParam Long attrId) { + List categoryIds = attrService.getAttrOfCategoryIdByAttrId(attrId); + if (CollUtil.isNotEmpty(categoryIds)) { + removeCacheAttrUnionCategory(categoryIds); + } + attrService.deleteById(attrId); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_attrs_by_category_id") + @Operation(summary = "根据分类及属性类别获取属性列表", description = "根据分类及属性类别获取属性列表") + @Parameter(name = "categoryId", description = "分类id", required = true) + public ServerResponseEntity> getAttrsByCategoryId(@RequestParam("categoryId") Long categoryId) { + // 分类下绑定的属性 + return ServerResponseEntity.success(attrService.getAttrsByCategoryIdAndAttrType(categoryId)); + } + + @GetMapping("/get_shop_attrs") + @Operation(summary = "获取店铺中的销售属性", description = "获取店铺中的销售属性") + public ServerResponseEntity> getShopAttrs() { + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(attrService.getShopAttrs(AuthUserContext.get().getTenantId(), sysType)); + } + + /** + * 校验属性数据 + * + * @param attrDTO + */ + private void checkAttrInfo(AttrDTO attrDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + attrDTO.setAttrType(AttrType.SALES.value()); + } + if (Objects.equals(AttrType.SALES.value(), attrDTO.getAttrType())) { + attrDTO.setSearchType(SearchType.NOT_SEARCH.value()); + return; + } + if (Objects.isNull(attrDTO.getSearchType())) { + throw new LuckException("搜索属性不能为空"); + } + if (CollUtil.isEmpty(attrDTO.getCategoryIds())) { + throw new LuckException("关联分类不能为空"); + } + } + + /** + * 删除属性关联的分类缓存 + */ + private void removeCacheAttrUnionCategory(List categoryIds) { + // 清除分类缓存 + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId()) || CollUtil.isEmpty(categoryIds)) { + return; + } + attrService.removeAttrByCategoryId(categoryIds); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/BrandController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/BrandController.java new file mode 100644 index 0000000..9b2d99c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/BrandController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.admin; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.service.BrandService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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; + +/** + * 品牌信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("adminBrandController") +@RequestMapping("/mp/brand") +@Tag(name = "admin-品牌信息") +public class BrandController { + + @Autowired + private BrandService brandService; + + @GetMapping("/list_by_params") + @Operation(summary = "根据参数获取平台品牌列表", description = "根据参数获取平台品牌列表") + public ServerResponseEntity> listByParams(BrandDTO brandDTO) { + brandDTO.setShopId(Constant.PLATFORM_SHOP_ID); + List brandVOList = brandService.listByParams(brandDTO); + return ServerResponseEntity.success(brandVOList); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/CategoryController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/CategoryController.java new file mode 100644 index 0000000..bb92403 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/CategoryController.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.constant.CategoryLevel; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.tmerclub.cloud.product.service.CategoryService; +import com.tmerclub.cloud.product.vo.CategoryExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 分类信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("adminCategoryController") +@RequestMapping("/mp/category") +@Tag(name = "admin-分类信息") +public class CategoryController { + + @Autowired + private CategoryService categoryService; + + + @GetMapping + @Operation(summary = "获取分类信息", description = "根据categoryId获取分类信息") + public ServerResponseEntity getByCategoryId(@RequestParam Long categoryId) { + return ServerResponseEntity.success(categoryService.getInfo(categoryId)); + } + + @PostMapping + @Operation(summary = "保存分类信息", description = "保存分类信息") + public ServerResponseEntity save(@Valid @RequestBody CategoryDTO categoryDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId()) && categoryDTO.getLevel() > CategoryLevel.SECOND.value()) { + throw new LuckException("分类等级最高只能为二级分类"); + } + Long shopId = AuthUserContext.get().getTenantId(); + Integer getSysType = AuthUserContext.get().getSysType(); + categoryDTO.setShopId(shopId); + Long categoryId = categoryService.save(categoryDTO); + categoryService.removeCategoryCache(shopId, null, getSysType); + return ServerResponseEntity.success(categoryId); + } + + @PutMapping + @Operation(summary = "更新分类信息", description = "更新分类信息") + public ServerResponseEntity update(@Valid @RequestBody CategoryDTO categoryDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer getSysType = AuthUserContext.get().getSysType(); + categoryDTO.setShopId(shopId); + categoryService.update(categoryDTO); + categoryService.removeCategoryCache(AuthUserContext.get().getTenantId(), categoryDTO.getCategoryId(), getSysType); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除分类信息", description = "根据分类信息id删除分类信息") + public ServerResponseEntity delete(@RequestParam Long categoryId) { + Integer sysType = AuthUserContext.get().getSysType(); + CategoryVO category = categoryService.getById(categoryId); + if (Objects.isNull(category)) { + throw new LuckException("当前分类不存在,请刷新后重试"); + } + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(category.getShopId(), shopId)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + categoryService.deleteById(categoryId, shopId); + if (Objects.equals(sysType, SysTypeEnum.PLATFORM.value())) { + categoryService.removeCategoryCache(category.getShopId(), categoryId, SysTypeEnum.MULTISHOP.value()); + categoryService.removeCategoryCache(category.getShopId(), categoryId, SysTypeEnum.PLATFORM.value()); + categoryService.removeCategoryCache(category.getShopId(), categoryId, SysTypeEnum.SUPPLIER.value()); + } else if (Objects.equals(sysType, SysTypeEnum.MULTISHOP.value())) { + categoryService.removeCategoryCache(category.getShopId(), categoryId, SysTypeEnum.MULTISHOP.value()); + } else if (Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + categoryService.removeCategoryCache(category.getShopId(), categoryId, SysTypeEnum.SUPPLIER.value()); + } + return ServerResponseEntity.success(); + } + + @GetMapping("/platform_categories") + @Operation(summary = "获取平台所有的分类信息", description = "获取所有的分类列表信息") + public ServerResponseEntity> platformCategories() { + return ServerResponseEntity.success(categoryService.platformCategories()); + } + + @GetMapping("/shop_categories") + @Operation(summary = "获取店铺所有的分类信息", description = "获取店铺所有的分类信息") + public ServerResponseEntity> shopCategories() { + return ServerResponseEntity.success(categoryService.list(AuthUserContext.get().getTenantId())); + } + + @GetMapping("/enable_categories") + @Operation(summary = "获取平台/店铺启用的分类信息", description = "仅获取启用的分类,以及包含三级分类的分类信息") + public ServerResponseEntity> enableCategories(Long shopId) { + if (Objects.isNull(shopId) || !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + shopId = AuthUserContext.get().getTenantId(); + } + List categories = categoryService.shopCategoryList(shopId, I18nMessage.getLang()); + List categoryList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (CategoryAppVO primaryCategoryVO : categories) { + categoryList.add(primaryCategoryVO); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + categoryList.addAll(primaryCategoryVO.getCategories()); + continue; + } + for (CategoryAppVO secondaryCategory : primaryCategoryVO.getCategories()) { + categoryList.add(secondaryCategory); + categoryList.addAll(secondaryCategory.getCategories()); + } + } + return ServerResponseEntity.success(categoryList); + } + + @PutMapping("/category_enable_or_disable") + @Operation(summary = "分类的启用或禁用", description = "分类的启用或禁用") + public ServerResponseEntity categoryEnableOrDisable(@RequestBody CategoryDTO categoryDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + List categoryIds = categoryService.categoryEnableOrDisable(categoryDTO, sysType); + // 批量更新 + Long tenantId = AuthUserContext.get().getTenantId(); + if (CollUtil.isNotEmpty(categoryIds)) { + categoryIds.forEach(id -> categoryService.removeCategoryCache(tenantId, id, sysType)); + } + return ServerResponseEntity.success(); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出分类excel") + public ServerResponseEntity spuSoldExcel(HttpServletResponse response) { + Long shopId = AuthUserContext.get().getTenantId(); + List list = categoryService.listExcel(shopId); + ExcelUtil.soleExcel(response, list, CategoryExcelVO.EXCEL_NAME, CategoryExcelVO.MERGE_ROW_INDEX, CategoryExcelVO.MERGE_COLUMN_INDEX, CategoryExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/SpuConsignmentChangeController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/SpuConsignmentChangeController.java new file mode 100644 index 0000000..3762c7e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/admin/SpuConsignmentChangeController.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.admin; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.SpuConsignmentChangeDTO; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; +import com.tmerclub.cloud.product.service.SpuConsignmentChangeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 商家代销商品基本信息相对于供应商品是否改变 + * + * @author FrozenWatermelon + * @date 2022-08-11 22:21:10 + */ +@RestController("multishopSpuConsignmentChangeController") +@RequestMapping("/m/spu_consignment_change") +@Tag(name = "商家代销商品基本信息相对于供应商品是否改变") +public class SpuConsignmentChangeController { + + @Autowired + private SpuConsignmentChangeService spuConsignmentChangeService; + + + @GetMapping("/page") + @Operation(summary = "获取商家代销商品基本信息相对于供应商品是否改变列表", description = "分页获取商家代销商品基本信息相对于供应商品是否改变列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO spuConsignmentChangePage = spuConsignmentChangeService.page(pageDTO); + return ServerResponseEntity.success(spuConsignmentChangePage); + } + + @GetMapping + @Operation(summary = "获取商家代销商品基本信息相对于供应商品是否改变", description = "根据consignmentChangeId获取商家代销商品基本信息相对于供应商品是否改变") + public ServerResponseEntity getByConsignmentChangeId(@RequestParam Long consignmentChangeId) { + return ServerResponseEntity.success(spuConsignmentChangeService.getByConsignmentChangeId(consignmentChangeId)); + } + + @PostMapping + @Operation(summary = "保存商家代销商品基本信息相对于供应商品是否改变", description = "保存商家代销商品基本信息相对于供应商品是否改变") + public ServerResponseEntity save(@Valid @RequestBody SpuConsignmentChangeDTO spuConsignmentChangeDTO) { + SpuConsignmentChange spuConsignmentChange = BeanUtil.map(spuConsignmentChangeDTO, SpuConsignmentChange.class); + spuConsignmentChange.setConsignmentChangeId(null); + spuConsignmentChangeService.save(spuConsignmentChange); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新商家代销商品基本信息相对于供应商品是否改变", description = "更新商家代销商品基本信息相对于供应商品是否改变") + public ServerResponseEntity update(@Valid @RequestBody SpuConsignmentChangeDTO spuConsignmentChangeDTO) { + SpuConsignmentChange spuConsignmentChange = BeanUtil.map(spuConsignmentChangeDTO, SpuConsignmentChange.class); + spuConsignmentChangeService.update(spuConsignmentChange); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除商家代销商品基本信息相对于供应商品是否改变", description = "根据商家代销商品基本信息相对于供应商品是否改变id删除商家代销商品基本信息相对于供应商品是否改变") + public ServerResponseEntity delete(@RequestParam Long consignmentChangeId) { + spuConsignmentChangeService.deleteById(consignmentChangeId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/BrandController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/BrandController.java new file mode 100644 index 0000000..2b38fc6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/BrandController.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.app.BrandAppVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.service.BrandService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +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.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 品牌信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("appBrandController") +@RequestMapping("/ua/brand") +@Tag(name = "app-品牌信息") +public class BrandController { + + @Autowired + private BrandService brandService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取品牌信息列表", description = "分页获取品牌信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, BrandDTO brandDTO) { + brandDTO.setStatus(StatusEnum.ENABLE.value()); + PageVO brandPage = brandService.appPage(pageDTO, brandDTO); + loadSpuList(brandPage.getList(), brandDTO.getSpuCount()); + return ServerResponseEntity.success(brandPage); + } + + + @GetMapping("/top_brand_list") + @Operation(summary = "置顶品牌列表", description = "置顶品牌列表") + public ServerResponseEntity> topBrandList() { + List brandList = brandService.topBrandList(I18nMessage.getLang()); + return ServerResponseEntity.success(brandList); + } + + @GetMapping("/list_by_category") + @Operation(summary = "分类-推荐品牌信息列表", description = "分类-推荐品牌信息列表") + public ServerResponseEntity> getTopBrandList(Long categoryId) { + List brandPage = brandService.listByCategory(categoryId, I18nMessage.getLang()); + return ServerResponseEntity.success(brandPage); + } + + /** + * 添加品牌下的商品数据 + * + * @param brandList + * @param size + */ + private void loadSpuList(List brandList, Integer size) { + if (Objects.isNull(size) || size == 0) { + return; + } + List brandIds = brandList.stream().map(BrandAppVO::getBrandId).collect(Collectors.toList()); + ProductSearchLimitDTO productSearchLimitDTO = new ProductSearchLimitDTO(size); + productSearchLimitDTO.setBrandIds(brandIds); + ServerResponseEntity> response = searchSpuFeignClient.limitSpuList(productSearchLimitDTO); + if (!Objects.equals(response.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(response.getMsg()); + } + Map> spuMap = response.getData().stream().collect(Collectors.groupingBy(SpuSearchVO::getBrandId)); + for (BrandAppVO brandVO : brandList) { + brandVO.setSpuList(spuMap.get(brandVO.getBrandId())); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/CategoryController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/CategoryController.java new file mode 100644 index 0000000..644a482 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/CategoryController.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.common.product.vo.app.CategorySearchAppVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.service.CategoryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.List; +import java.util.Objects; + +/** + * 分类信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("appCategoryController") +@RequestMapping("/ua/category") +@Tag(name = "app-分类信息") +public class CategoryController { + + @Autowired + private CategoryService categoryService; + + + @GetMapping("/category_list") + @Operation(summary = "获取指定分类下的分类列表(顶级分类的parentId为0,默认为一级分类)", description = "获取指定分类下的分类列表") + @Parameters({ + @Parameter(name = "parentId", description = "分类ID"), + @Parameter(name = "shopId", description = "店铺id") + }) + public ServerResponseEntity> categoryList(@RequestParam(value = "parentId", defaultValue = "0") Long parentId, @RequestParam(value = "shopId", defaultValue = "0") Long shopId) { + List categories; + if (Objects.equals(parentId, 0L) && Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + categories = categoryService.listPlatformCategoryByShopIdAndParenId(shopId, parentId, I18nMessage.getLang()); + } else { + categories = categoryService.listByShopIdAndParenId(shopId, parentId, I18nMessage.getLang()); + } + return ServerResponseEntity.success(BeanUtil.mapAsList(categories, CategoryAppVO.class)); + } + + @GetMapping("/shop_category_list") + @Operation(summary = "店铺/平台的全部分类列表接口", description = "店铺/平台分类列表接口") + @Parameter(name = "shopId", description = "店铺id") + public ServerResponseEntity> shopCategoryList(@RequestParam(value = "shopId", defaultValue = "0") Long shopId) { + List categories = categoryService.shopCategoryList(shopId, I18nMessage.getLang()); + return ServerResponseEntity.success(categories); + } + + + @GetMapping("/category_search_item") + @Operation(summary = "分类-搜索参数", description = "分类-搜索参数") + @Parameter(name = "categoryId", description = "分类id", required = true) + public ServerResponseEntity categorySearchItem(@RequestParam("categoryId") Long categoryId) { + CategorySearchAppVO categorySearch = categoryService.categorySearchItem(categoryId); + return ServerResponseEntity.success(categorySearch); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/GiveawayController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/GiveawayController.java new file mode 100644 index 0000000..19a25fa --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/GiveawayController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.GiveawayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +@RestController("appGiveawayController") +@RequestMapping("/giveaway") +@Tag(name = "app-赠品表") +public class GiveawayController { + + @Autowired + private GiveawayService giveawayService; + + + @GetMapping("/info/{spuId}") + @Operation(summary = "通过商品id查询赠品信息", description = "通过商品id查询赠品") + public ServerResponseEntity getById(@PathVariable("spuId") Long spuId) { + GiveawayVO giveawayVO = giveawayService.getGiveawaySpuBySpuId(spuId); + return ServerResponseEntity.success(giveawayVO); + } + +} + + diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/ShopCartController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/ShopCartController.java new file mode 100644 index 0000000..b09f591 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/ShopCartController.java @@ -0,0 +1,464 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.discount.feign.DiscountFeignClient; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.product.manager.ShopCartAdapter; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.ShopCartVO; +import com.tmerclub.cloud.common.order.vo.ShopCartWithAmountVO; +import com.tmerclub.cloud.common.order.vo.UserDeliveryInfoVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.vo.SkuLangVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.LangUtil; +import com.tmerclub.cloud.product.dto.shopcart.AddShopCartItemsDTO; +import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO; +import com.tmerclub.cloud.product.dto.shopcart.CheckShopCartItemDTO; +import com.tmerclub.cloud.product.model.ShopCartItem; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.ShopCartAmountVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.stream.Collectors; + +/** + * 购物车 + * + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +@RestController +@RequestMapping("/shop_cart") +@Tag(name = "app-购物车") +public class ShopCartController { + + @Autowired + private ShopCartService shopCartService; + + + @Autowired + private SpuService spuService; + + @Autowired + private SkuService skuService; + + @Autowired + private SkuStockService skuStockService; + + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + @Autowired + private ThreadPoolExecutor prodThreadPoolExecutor; + @DubboReference + private DiscountFeignClient discountFeignClient; + + @Autowired + private ShopCartAdapter shopCartAdapter; + + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private ComboShopCartService comboShopCartService; + + /** + * 获取用户购物车信息 + * + * @return + */ + @GetMapping("/info") + @Operation(summary = "获取用户购物车信息", description = "获取用户购物车信息") + public ServerResponseEntity info() throws ExecutionException, InterruptedException { + // 拿到购物车的所有item + List shopCartItems = shopCartService.getShopCartItems(); + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + // 筛选下选中的商品用于计算运费 + List filterShopCartItems = shopCartItems.stream().filter(shopCartItemVO -> shopCartItemVO.getIsChecked() == 1).collect(Collectors.toList()); + // 异步计算运费,运费暂时和优惠券没啥关联,可以与优惠券异步计算,获取用户地址,自提信息 + CompletableFuture> deliveryFuture = CompletableFuture.supplyAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + // TODO 这边目前只有快递配送一种方式,所以先写死快递配送 + List dvyTypes = new ArrayList<>(Constant.INITIAL_CAPACITY); + dvyTypes.add(new DvyTypeDTO(null, DeliveryType.DELIVERY.value())); + UserDeliveryInfoVO userDeliveryInfoVO = new UserDeliveryInfoVO(); + userDeliveryInfoVO.setAddrId(0L); + userDeliveryInfoVO.setDvyTypes(dvyTypes); + return deliveryFeignClient.calculateAndGetDeliverInfo(new CalculateAndGetDeliverInfoDTO(filterShopCartItems, userDeliveryInfoVO)); + }, prodThreadPoolExecutor); + // 运费用异步计算,最后要等运费出结果 + ServerResponseEntity userDeliveryInfoResponseEntity = deliveryFuture.get(); + if (!userDeliveryInfoResponseEntity.isSuccess()) { + return ServerResponseEntity.transform(userDeliveryInfoResponseEntity); + } + List shopCarts = shopCartAdapter.conversionShopCart(shopCartItems); + ShopCartWithAmountVO shopCartWithAmountVO = new ShopCartWithAmountVO(); + shopCartWithAmountVO.setShopCarts(shopCarts); + shopCartWithAmountVO.setUserDeliveryInfo(userDeliveryInfoResponseEntity.getData()); + return discountFeignClient.calculateDiscountAndMakeUpShopCartAndAmount(shopCartWithAmountVO); + } + + /** + * 获取用户购物车信息 + * + * @return + */ + @GetMapping("/amount_info") + @Operation(summary = "获取用户购物车金额信息", description = "获取用户购物车金额信息") + public ServerResponseEntity amountInfo() { + // 拿到购物车的所有item + List shopCartItems = shopCartService.getShopCartItems(); + List shopCarts = shopCartAdapter.conversionShopCart(shopCartItems); + ShopCartWithAmountVO shopCartWithAmountVO = new ShopCartWithAmountVO(); + shopCartWithAmountVO.setShopCarts(shopCarts); + ServerResponseEntity shopCartWithAmountResponse = discountFeignClient.calculateDiscountAndMakeUpShopCartAndAmount(shopCartWithAmountVO); + + if (!shopCartWithAmountResponse.isSuccess()) { + return ServerResponseEntity.transform(shopCartWithAmountResponse); + } + + return ServerResponseEntity.success(BeanUtil.map(shopCartWithAmountResponse.getData(), ShopCartAmountVO.class)); + } + + + @PutMapping("/delete_item") + @Operation(summary = "删除用户购物车物品", description = "通过购物车id删除用户购物车物品") + public ServerResponseEntity deleteItem(@RequestBody List shopCartItemIds) { + Long userId = AuthUserContext.get().getUserId(); + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, shopCartItemIds); + return ServerResponseEntity.success(); + } + + @DeleteMapping("/delete_all") + @Operation(summary = "清空用户购物车所有物品", description = "清空用户购物车所有物品") + public ServerResponseEntity deleteAll() { + Long userId = AuthUserContext.get().getUserId(); + shopCartService.deleteAllShopCartItems(userId); + // 删除成功 + return ServerResponseEntity.success(); + } + + @PostMapping("/check_items") + @Operation(summary = "勾选购物车") + public ServerResponseEntity checkItems(@Valid @RequestBody List params) { + if (CollectionUtil.isEmpty(params)) { + return ServerResponseEntity.success(); + } + Long userId = AuthUserContext.get().getUserId(); + shopCartService.checkShopCartItems(userId, params); + return ServerResponseEntity.success(); + } + + + @PostMapping("/change_item") + @Operation(summary = "添加、修改用户购物车物品", description = "通过商品id(prodId)、skuId、店铺Id(shopId),添加/修改用户购物车商品,并传入改变的商品个数(count)," + + "当count为正值时,增加商品数量,当count为负值时,将减去商品的数量,当最终count值小于0时,会将商品从购物车里面删除") + public ServerResponseEntity addItem(@Valid @RequestBody ChangeShopCartItemDTO param) { + // 不用校验库存是否充足!!! + Long userId = AuthUserContext.get().getUserId(); + List shopCartItems = shopCartService.getShopCartItems(); + SpuVO spu = spuService.getBySpuId(param.getSpuId()); + Long skuId = param.getSkuId(); + SkuVO sku = skuService.getSkuBySkuId(skuId); + //新增/修改套餐商品 + if (Objects.nonNull(param.getComboId()) && !Objects.equals(param.getComboId(), 0L)) { + comboSpuChange(param, shopCartItems); + return ServerResponseEntity.success(); + } + // 当商品状态不正常时,不能添加到购物车 + if (Objects.isNull(spu) || Objects.isNull(sku) || !Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value()) || !Objects.equals(sku.getStatus(), StatusEnum.ENABLE.value()) || !Objects.equals(sku.getSpuId(), spu.getSpuId())) { + // 当返回商品不存在时,前端应该将商品从购物车界面移除 + return ServerResponseEntity.fail(ResponseEnum.SPU_NOT_EXIST); + } + // 定金预售商品不可加入购物车 + if (Objects.equals(spu.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + throw new LuckException("定金预售商品不可加入购物车"); + } + // 保存shopId,不要让前端传过来 + param.setShopId(spu.getShopId()); + // 获取加购的sku库存 + Integer skuStock = getSkuStock(param, spu, skuId, sku); + Long oldShopCartItemId = null; + Integer oldCount = 0; + for (ShopCartItemVO shopCartItemVo : shopCartItems) { + if (Objects.equals(skuId, shopCartItemVo.getSkuId()) && Objects.equals(param.getComboId(), shopCartItemVo.getComboId())) { + // 旧数量 + oldCount = shopCartItemVo.getCount(); + oldShopCartItemId = shopCartItemVo.getCartItemId(); + ShopCartItem shopCartItem = new ShopCartItem(); + shopCartItem.setUserId(userId); + shopCartItem.setDistributionUserId(param.getDistributionUserId()); + shopCartItem.setCount(param.getCount() + shopCartItemVo.getCount()); + if (param.getCount() > 0 && shopCartItem.getCount() > skuStock) { + throw new LuckException("商品规格库存不足,无法进行此操作"); + } + shopCartItem.setCartItemId(shopCartItemVo.getCartItemId()); + shopCartItem.setIsChecked(shopCartItemVo.getIsChecked()); + shopCartItem.setDiscountId(param.getDiscountId()); + // 如果有个旧的sku,就说明是在切换sku + if (Objects.nonNull(param.getOldSkuId())) { + continue; + } + // 防止购物车变成负数,从购物车删除 + if (shopCartItem.getCount() <= 0) { + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, Collections.singletonList(shopCartItem.getCartItemId())); + return ServerResponseEntity.success(); + } + shopCartService.updateShopCartItem(userId, shopCartItem); + return ServerResponseEntity.success(); + } + } + + if (Objects.nonNull(param.getOldSkuId())) { + for (ShopCartItemVO oldShopCartItem : shopCartItems) { + // 旧sku + if (Objects.equals(param.getOldSkuId(), oldShopCartItem.getSkuId())) { + ShopCartItem shopCartItem = getShopCartItem(param, userId, skuId, skuStock, oldCount, oldShopCartItem); + if (oldShopCartItemId != null) { + // 删除旧的购物项 + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, Collections.singletonList(oldShopCartItemId)); + } + // 更新购物车 + shopCartService.updateShopCartItem(userId, shopCartItem); + return ServerResponseEntity.success(); + } + } + } + + // 所有都正常时 + if (Objects.nonNull(skuStock) && skuStock > 0) { + shopCartService.addShopCartItem(userId, param, sku.getPriceFee(), spu.getCategoryId()); + } + // 添加成功 + return ServerResponseEntity.success(); + } + + private static ShopCartItem getShopCartItem(ChangeShopCartItemDTO param, Long userId, Long skuId, Integer skuStock, Integer oldCount, ShopCartItemVO oldShopCartItem) { + ShopCartItem shopCartItem = new ShopCartItem(); + shopCartItem.setUserId(userId); + shopCartItem.setCartItemId(oldShopCartItem.getCartItemId()); + // 如果以前就存在这个商品,还要把以前的商品数量累加 + shopCartItem.setCount(param.getCount() + oldCount); + if (param.getCount() > 0 && shopCartItem.getCount() > skuStock) { + throw new LuckException("变更的商品规格库存不足,无法进行此操作"); + } + shopCartItem.setSkuId(skuId); + return shopCartItem; + } + + private Integer getSkuStock(ChangeShopCartItemDTO param, SpuVO spu, Long skuId, SkuVO sku) { + Integer skuStock = null; + if (param.getCount() > 0) { + // 判断下是否为供应商商品,如果是商家代销供应商商品且为供应商发货设置供应商信息 + if (!Objects.equals(spu.getSupplierId(), 0L) && Objects.equals(spu.getSupplierDeliveryType(), 1)) { + skuStock = skuStockService.getBySkuId(sku.getSupplierSkuId(),spu.getSpuMold()).getStock(); + } else { + skuStock = skuStockService.getBySkuId(skuId, spu.getSpuMold()).getStock(); + } + } + return skuStock; + } + + private void comboSpuChange(ChangeShopCartItemDTO param, List shopCartItems) { + if (Objects.nonNull(param.getOldSkuId())) { + comboShopCartService.comboUpdateCart(param, shopCartItems); + } else { + comboShopCartService.comboAddCart(param, shopCartItems); + } + } + + + @PostMapping("/add_items") + @Operation(summary = "批量添加用户购物车物品", description = "通过一个对象集合,对象包含商品id(prodId)、skuId、店铺Id(shopId),添加用户购物车商品") + public ServerResponseEntity addItems(@Valid @RequestBody AddShopCartItemsDTO shopCartItemsDTO) { + StringBuilder errorMsg = new StringBuilder(Constant.INITIAL_CAPACITY); + Long userId = AuthUserContext.get().getUserId(); + HashMap shopDetailMap = new HashMap<>(16); + for (ChangeShopCartItemDTO param : shopCartItemsDTO.getShopCartItemList()) { + // 不用校验库存是否充足!!! + List shopCartItems = shopCartService.getShopCartItems(); + + SpuVO spu = spuService.getBySpuId(param.getSpuId()); + SkuVO sku = skuService.getSkuBySkuId(param.getSkuId()); + if (Objects.isNull(shopDetailMap.get(param.getShopId()))) { + ServerResponseEntity shopDetailRes = shopDetailFeignClient.getShopByShopId(param.getShopId()); + if (!shopDetailRes.isSuccess()) { + throw new LuckException(shopDetailRes.getMsg()); + } + shopDetailMap.put(param.getShopId(), shopDetailRes.getData()); + } + EsShopDetailBO esShopDetailBO = shopDetailMap.get(param.getShopId()); + // 当商品状态不存在或店铺不存在时不能添加到购物车 + if (Objects.isNull(spu) || Objects.isNull(sku) || !Objects.equals(sku.getSpuId(), spu.getSpuId()) || Objects.isNull(esShopDetailBO)) { + continue; + } + // 活动商品不加入购物车 + if (SpuType.ACTIVE.value().equals(spu.getSpuType())) { + continue; + } + Map spuMap = spu.getSpuLangList().stream().filter(spuLangVO -> StrUtil.isNotBlank(spuLangVO.getSpuName())).collect(Collectors.toMap(SpuLangVO::getLang, SpuLangVO::getSpuName)); + spu.setName(LangUtil.getLangValue(spuMap)); + Map skuMap = sku.getSkuLangList().stream().filter(skuLangVO -> StrUtil.isNotBlank(skuLangVO.getSkuName())).collect(Collectors.toMap(SkuLangVO::getLang, SkuLangVO::getSkuName)); + sku.setSkuName(LangUtil.getLangValue(skuMap)); + + // 当商品状态不正常或店铺已停业时,不能添加到购物车 + if (!Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value()) || !Objects.equals(sku.getStatus(), StatusEnum.ENABLE.value()) || Objects.equals(esShopDetailBO.getShopStatus(), ShopStatus.STOP.value())) { + // 当返回商品不存在时,记录哪些不能加入购物车 + errorMsg.append(spu.getName()); + if (StrUtil.isNotBlank(sku.getSkuName())) { + errorMsg.append(sku.getSkuName()); + } + errorMsg.append(StrUtil.COMMA); + continue; + } + loadAddItemsData(userId, param, shopCartItems, spu, sku); + } + + if (StrUtil.isNotBlank(errorMsg)) { + errorMsg.deleteCharAt(errorMsg.length() - 1); + errorMsg.append("等商品已失效无法加入购物车,其余已加入购物车"); + return ServerResponseEntity.success(errorMsg.toString()); + } + // 添加成功 + return ServerResponseEntity.success("操作成功"); + } + + /** + * 加载加购项数据 + * + * @param userId 用户id + * @param param 加购数据 + * @param shopCartItems 购物车列表 + * @param spu 商品信息 + * @param sku 商品规格信息 + */ + private void loadAddItemsData(Long userId, ChangeShopCartItemDTO param, List shopCartItems, SpuVO spu, SkuVO sku) { + boolean isContinue = false; + + // 保存shopId,不要让前端传过来 + param.setShopId(spu.getShopId()); + + Integer oldCount = 0; + Long oldShopCartItemId = null; + for (ShopCartItemVO shopCartItemVo : shopCartItems) { + if (Objects.equals(param.getSkuId(), shopCartItemVo.getSkuId())) { + // 旧数量 + oldCount = shopCartItemVo.getCount(); + oldShopCartItemId = shopCartItemVo.getCartItemId(); + ShopCartItem shopCartItem = new ShopCartItem(); + shopCartItem.setUserId(userId); + shopCartItem.setCount(param.getCount() + shopCartItemVo.getCount()); + shopCartItem.setCartItemId(shopCartItemVo.getCartItemId()); + shopCartItem.setIsChecked(shopCartItemVo.getIsChecked()); + shopCartItem.setDiscountId(param.getDiscountId()); + // 如果有个旧的sku,就说明是在切换sku + if (Objects.nonNull(param.getOldSkuId())) { + continue; + } + //套餐商品订单再次购买,不加入套餐中,变成普通商品加入 + if (Objects.nonNull(shopCartItemVo.getComboId())) { + continue; + } + // 防止购物车变成负数,从购物车删除 + if (shopCartItem.getCount() <= 0) { + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, Collections.singletonList(shopCartItem.getCartItemId())); + isContinue = true; + break; + } + shopCartService.updateShopCartItem(userId, shopCartItem); + isContinue = true; + break; + } + } + + if (isContinue) { + return; + } + + if (Objects.nonNull(param.getOldSkuId())) { + for (ShopCartItemVO oldShopCartItem : shopCartItems) { + // 旧sku + if (Objects.equals(param.getOldSkuId(), oldShopCartItem.getSkuId())) { + + ShopCartItem shopCartItem = new ShopCartItem(); + shopCartItem.setUserId(userId); + shopCartItem.setCartItemId(oldShopCartItem.getCartItemId()); + // 如果以前就存在这个商品,还要把以前的商品数量累加 + shopCartItem.setCount(param.getCount() + oldCount); + shopCartItem.setSkuId(param.getSkuId()); + + if (oldShopCartItemId != null) { + // 删除旧的购物项 + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, Collections.singletonList(oldShopCartItemId)); + } + // 更新购物车 + shopCartService.updateShopCartItem(userId, shopCartItem); + isContinue = true; + break; + } + } + } + + if (isContinue) { + return; + } + + // 所有都正常时 + shopCartService.addShopCartItem(userId, param, sku.getPriceFee(), spu.getCategoryId()); + } + + @GetMapping("/ma/prod_count") + @Operation(summary = "获取购物车商品数量", description = "获取购物车商品数量") + public ServerResponseEntity prodCount() { + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (uidInfoBO == null) { + return ServerResponseEntity.fail(ResponseEnum.CLEAN_TOKEN); + } + return ServerResponseEntity.success(shopCartService.getShopCartItemCount(uidInfoBO.getUserId())); + } + + @GetMapping("/expiry_prod_list") + @Operation(summary = "获取购物车失效商品信息", description = "获取购物车失效商品列表") + public ServerResponseEntity> expiryProdList() { + return ServerResponseEntity.success(shopCartService.getShopCartExpiryItems()); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuCollectionController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuCollectionController.java new file mode 100644 index 0000000..bb6775a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuCollectionController.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.model.SpuCollection; +import com.tmerclub.cloud.product.service.SpuCollectionService; +import com.tmerclub.cloud.product.service.SpuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; + +/** + * 商品收藏信息 + * + * @author FrozenWatermelon + * @date 2020-11-21 14:43:16 + */ +@RestController("appSpuCollectionController") +@RequestMapping("/spu_collection") +@Tag(name = "app-商品收藏信息") +public class SpuCollectionController { + + @Autowired + private SpuCollectionService spuCollectionService; + + @Autowired + private SpuService spuService; + + @GetMapping("/page") + @Operation(summary = "分页返回收藏数据", description = "根据用户id获取") + public ServerResponseEntity> getUserCollectionDtoPageByUserId(PageDTO page, String prodName, Integer prodType) { + return ServerResponseEntity.success(spuCollectionService.getUserCollectionDtoPageByUserId(page, AuthUserContext.get().getUserId(), prodName, prodType)); + } + + @GetMapping("/ma/is_collection") + @Operation(summary = "根据商品id获取该商品是否在收藏夹中", description = "传入收藏商品id") + @Parameter(name = "spuId", description = "商品id") + public ServerResponseEntity isCollection(@RequestParam Long spuId) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + if (uidInfoBO == null) { + return ServerResponseEntity.fail(ResponseEnum.CLEAN_TOKEN); + } + int count = spuCollectionService.userCollectionCount(spuId, uidInfoBO.getUserId()); + return ServerResponseEntity.success(count > 0); + + } + + @PostMapping("/add_or_cancel") + @Operation(summary = "添加/取消收藏(返回false:取消收藏 true:添加收藏)", description = "传入收藏商品id,如果商品未收藏则收藏商品,已收藏则取消收藏") + public ServerResponseEntity addOrCancel(@RequestBody Long spuId) { + if (Objects.isNull(spuService.getBySpuId(spuId))) { + throw new LuckException("该商品不存在"); + } + boolean isAdd = false; + Long userId = AuthUserContext.get().getUserId(); + if (spuCollectionService.userCollectionCount(spuId, userId) > 0) { + spuCollectionService.deleteBySpuIdAndUserId(spuId, userId); + } else { + SpuVO spuVo = spuService.getBySpuId(spuId); + if (Objects.equals(spuVo.getSpuType(), SpuType.ACTIVE.value())) { + // 活动商品不能添加收藏 + throw new LuckException("活动商品不能添加收藏"); + } + SpuCollection userCollection = new SpuCollection(); + userCollection.setUserId(userId); + userCollection.setSpuId(spuId); + spuCollectionService.save(userCollection); + isAdd = true; + } + return ServerResponseEntity.success(isAdd); + } + + @PostMapping("/batch_cancel") + @Operation(summary = "批量取消收藏", description = "传入收藏商品id") + public ServerResponseEntity batachCancel(@RequestBody List spuIds) { + Long userId = AuthUserContext.get().getUserId(); + if (CollUtil.isEmpty(spuIds)) { + return ServerResponseEntity.fail(ResponseEnum.DATA_ERROR); + } + spuCollectionService.deleteBatchBySpuIdsAndUserId(spuIds, userId); + return ServerResponseEntity.success(); + } + + + /** + * 查询用户收藏商品数量 + */ + @GetMapping("count") + @Operation(summary = "查询用户收藏商品数量", description = "查询用户收藏商品数量") + public int findUserCollectionCount() { + return spuCollectionService.userCollectionCount(null, AuthUserContext.get().getUserId()); + } + + @PostMapping("/order_prod_collection_all") + @Operation(summary = "订单商品收藏", description = "传入商品id拼接字符串") + @Parameter(name = "spuIdList", description = "spuId集合") + public ServerResponseEntity orderProdCollectionAll(@RequestBody List spuIdList) { + if (CollectionUtil.isEmpty(spuIdList)) { + throw new LuckException("spuId列表不能为空"); + } + // 去重 + HashSet spuIdSet = new HashSet<>(spuIdList); + spuCollectionService.spuBatchCollection(new ArrayList<>(spuIdSet)); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuController.java new file mode 100644 index 0000000..3b6e21f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuController.java @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.combo.feign.ComboFeignClient; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.SkuComboDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; +import com.tmerclub.cloud.product.model.SpuExtension; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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 java.util.*; +import java.util.stream.Collectors; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@RestController("appSpuController") +@RequestMapping("/ma/spu") +@Tag(name = "app-spu信息") +public class SpuController { + private static final Logger logger = LoggerFactory.getLogger(SpuController.class); + @Autowired + private SpuService spuService; + @Autowired + private SkuComboService skuComboService; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + @Autowired + private SkuService skuService; + @Autowired + private CategoryService categoryService; + @Autowired + private SpuBrowseLogService spuBrowseLogService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @Autowired + private SpuConsignmentChangeService spuConsignmentChangeService; + @DubboReference + private ComboFeignClient comboFeignClient; + @Autowired + private GiveawayService giveawayService; + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + @Autowired + private SkuStockService skuStockService; + @Autowired + private StockPointSkuService stockPointSkuService; + + @GetMapping("/prod_info") + @Operation(summary = "商品详情信息", description = "根据商品ID(prodId)获取商品信息") + @Parameters({ + @Parameter(name = "spuId", description = "商品ID", required = true), + @Parameter(name = "addrId", description = "用户地址id") + }) + public ServerResponseEntity prodInfo(@RequestParam("spuId") Long spuId, + @RequestParam(value = "addrId", required = false) Long addrId) { + SpuAppVO spu = spuService.prodInfo(spuId); + if (Objects.equals(spu.getSpuType(), SpuType.SCORE.value())) { + throw new LuckException(ResponseEnum.SPU_NOT_EXIST); + } + // 插入商品和sku库存信息 + this.setSpuAndSkuStock(spu); + // spu活动列表 + spu.setSpuActivity(spuService.spuActivityBySpuId(spu.getShopId(), spuId)); + //获取赠品信息 + GiveawayVO giveawayVO = giveawayService.getGiveawaySpuBySpuId(spuId); + spu.setGiveaway(giveawayVO); + // 供应商商品信息处理 + disposeSpuMsg(spu); + + //获取商品套餐信息 + List comboVOList = comboFeignClient.comboVoListBySpuId(spuId).getData(); + if (Objects.nonNull(comboVOList)) { + spu.setComboList(comboVOList); + } + // 处理下商品和sku的预售,计算定金按比例收取的预售商品实际定金数额 + handlePreSaleInfo(spu); + // 判断是否在配送范围内 + UidInfoBO uidInfoBO = AuthUserContext.get(); + Long userId = uidInfoBO == null ? null : uidInfoBO.getUserId(); + boolean deliverable = Objects.equals(spu.getSpuType(), SpuType.ACTIVE.value()) + || Objects.equals(spu.getSpuMold(), 1) + || Objects.isNull(userId) + || spu.getDeliveryTemplateId() == 0 + || spu.getDeliveryTemplateId() == -1; + if (deliverable) { + spu.setIsDelivery(true); + } else { + ServerResponseEntity booleanServerResponseEntity; + // TO用户i地址id为空,则检查用户默认地址的配送范围 + if (addrId == null || addrId == 0) { + logger.info("prodInfo-用户地址id为空, spuId:{}, deliveryTemplateId:{}", spuId, spu.getDeliveryTemplateId()); + booleanServerResponseEntity = deliveryFeignClient.checkAddr(spu.getDeliveryTemplateId(), userId, 0L); + } else { + logger.info("prodInfo-有用户地址, spuId:{}, deliveryTemplateId:{}", spuId, spu.getDeliveryTemplateId()); + booleanServerResponseEntity = deliveryFeignClient.checkDeliveryRange(spu.getDeliveryTemplateId(), addrId); + } + + if (!booleanServerResponseEntity.isSuccess()) { + throw new LuckException(booleanServerResponseEntity.getMsg()); + } + spu.setIsDelivery(booleanServerResponseEntity.getData()); + } + + return ServerResponseEntity.success(spu); + } + + @GetMapping("/score_prod_info") + @Operation(summary = "积分商品详情信息", description = "根据商品ID(prodId)获取积分商品信息") + @Parameter(name = "spuId", description = "商品ID", required = true) + public ServerResponseEntity scoreProdInfo(@RequestParam("spuId") Long spuId) { + SpuAppVO spuAppVO = spuService.prodInfo(spuId); + if (!Objects.equals(spuAppVO.getSpuType(), SpuType.SCORE.value())) { + throw new LuckException(ResponseEnum.SPU_NOT_EXIST); + } + SpuVO spuVO = BeanUtil.map(spuAppVO, SpuVO.class); + List skuAppVO = skuService.getSpuDetailSkuInfo(spuVO); + spuAppVO.setSkus(skuAppVO); + int totalStock = 0; + int saleNum = 0; + for (SkuAppVO appVO : skuAppVO) { + totalStock += appVO.getStock(); + saleNum += appVO.getSaleNum(); + } + spuAppVO.setTotalStock(totalStock); + spuAppVO.setSaleNum(saleNum); + return ServerResponseEntity.success(spuAppVO); + } + + @GetMapping("/sku_list") + @Operation(summary = "sku信息", description = "根据商品ID(prodId)单独获取sku信息") + @Parameter(name = "spuId", description = "商品ID", required = true) + public ServerResponseEntity> skuList(@RequestParam("spuId") Long spuId) { + SpuVO spuVO = spuService.getBySpuId(spuId); + List skuList = skuService.getSpuDetailSkuInfo(spuVO); + + return ServerResponseEntity.success(skuList); + } + + @GetMapping("/get_combo_spus") + @Operation(summary = "根据spuid和skuid获取所有的组合商品信息", description = "根据spuid和skuid获取所有的组合商品信息") + public ServerResponseEntity> getCombSpus(SkuComboDTO skuComboDTO) { + SpuVO spuVO = spuService.getBySpuId(skuComboDTO.getSpuId()); + if(Objects.isNull(spuVO) || !Objects.equals(spuVO.getSpuMold(), SpuMold.COMBO.value())){ + throw new LuckException("当前商品不是组合商品"); + } + List skuComboList = skuComboService.getCombSpusBySkuIds(Collections.singletonList(skuComboDTO.getSkuId())); + if (CollUtil.isEmpty(skuComboList)) { + return ServerResponseEntity.success(skuComboList); + } + return ServerResponseEntity.success(skuComboList); + } + + @GetMapping("/recommend_list") + @Operation(summary = "推荐商品列表", description = "根据商品ID(prodId)获取商品信息") + public ServerResponseEntity> recommendList(PageDTO pageDTO, SpuDTO spuDTO) { + logger.info("推荐商品列表"); + UidInfoBO uidInfoBO = AuthUserContext.get(); + ProductSearchDTO productSearch = new ProductSearchDTO(); + Long primaryCategoryId = null; + if (Objects.isNull(spuDTO.getSpuType())) { + spuDTO.setSpuType(SpuType.NORMAL.value()); + } + primaryCategoryId = getPrimaryCategoryId(spuDTO, uidInfoBO, primaryCategoryId); + //如果有商品id则过滤掉 + if (Objects.nonNull(spuDTO.getSpuId())) { + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + spuIds.add(spuDTO.getSpuId()); + productSearch.setSpuIdsExclude(spuIds); + } + ServerResponseEntity> shopEntity = shopDetailFeignClient.getShopIdsByShopStatus(ShopStatus.OPEN.value()); + if (!shopEntity.isSuccess()) { + throw new LuckException(shopEntity.getMsg()); + } + List shopIds = shopEntity.getData(); + // 营业中的商家id + if (CollUtil.isNotEmpty(shopIds)) { + productSearch.setShopIds(shopIds); + } + productSearch.setPrimaryCategoryId(primaryCategoryId); + productSearch.setPageNum(pageDTO.getPageNum()); + productSearch.setPageSize(pageDTO.getPageSize()); + productSearch.setSpuType(spuDTO.getSpuType()); + productSearch.setSort(1); + ServerResponseEntity> spuResponseEntity = searchSpuFeignClient.search(productSearch); + if (!spuResponseEntity.isSuccess()) { + throw new LuckException(spuResponseEntity.getMsg()); + } + EsPageVO data = spuResponseEntity.getData(); + Integer size = pageDTO.getPageSize(); + int spuNum = data.getList().get(0).getSpus().size(); + // 推荐商品的数量不足时,查询额外的商品进行填充 + if (size > spuNum) { + productSearch.setPageSize(Math.toIntExact(size - spuNum)); + productSearch.setPageNum(1); + // 查询该分类以外的商品 + productSearch.setPrimaryCategoryId(null); + productSearch.setNotPrimaryCategoryId(primaryCategoryId); + ServerResponseEntity> addSpuResponseEntity = searchSpuFeignClient.search(productSearch); + if (!addSpuResponseEntity.isSuccess()) { + throw new LuckException(addSpuResponseEntity.getMsg()); + } + for (ProductSearchVO productSearchVO : addSpuResponseEntity.getData().getList()) { + if (CollUtil.isNotEmpty(productSearchVO.getSpus())) { + Map spuMap = data.getList().get(0).getSpus().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + Map spusMap = productSearchVO.getSpus().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + List addSpus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Map.Entry entry : spusMap.entrySet()) { + if (!spuMap.containsKey(entry.getKey())) { + addSpus.add(entry.getValue()); + } + } + // 取并集 + data.getList().get(0).getSpus().addAll(addSpus); + } + } + data.setTotal((long) data.getList().get(0).getSpus().size()); + data.setPages(data.getTotal() > 0 ? pageDTO.getPageNum() : 0); + } + setSupplierSpuName(data); + return spuResponseEntity; + } + + private Long getPrimaryCategoryId(SpuDTO spuDTO, UidInfoBO uidInfoBO, Long primaryCategoryId) { + // 已登陆 + if (Objects.nonNull(uidInfoBO)) { + primaryCategoryId = spuBrowseLogService.recommendCategoryId(spuDTO.getSpuType()); + } + // 已登陆但还没有数据,或未登陆 + boolean serCategoryId = (!Objects.equals(spuDTO.getSpuType(), SpuType.SCORE.value()) && Objects.isNull(primaryCategoryId)) && Objects.nonNull(spuDTO.getCategoryId()); + if (serCategoryId) { + try { + CategoryVO category = categoryService.getByCategoryId(spuDTO.getCategoryId()); + if (Objects.nonNull(category)) { + primaryCategoryId = category.getPrimaryCategoryId(); + } + } catch (Exception e) { + logger.error("推荐商品列表错误", e); + } + } + return primaryCategoryId; + } + + private void setSupplierSpuName(EsPageVO data) { + List list = data.getList().get(0).getSpus().stream().filter(productSearchVO -> Objects.equals(productSearchVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())).collect(Collectors.toList()); + List supplierSpuIds = list.stream().map(SpuSearchVO::getSupplierSpuId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(supplierSpuIds)) { + List supplierSpus = spuService.getBySpuIds(supplierSpuIds); + Map supplierSpuMap = supplierSpus.stream().collect(Collectors.toMap(SpuVO::getSpuId, spu -> spu)); + if (CollUtil.isEmpty(supplierSpuMap)) { + return; + } + for (SpuSearchVO spuSearchVO : data.getList().get(0).getSpus()) { + if (Objects.equals(spuSearchVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuSearchVO.setSpuName(supplierSpuMap.get(spuSearchVO.getSupplierSpuId()).getName()); + } + } + } + } + private void setSpuAndSkuStock(SpuAppVO spu) { + // 因为库存的缓存是经常变的,而规格信息的缓存是几乎不变的,所以库存的缓存要独立拿出来 + SpuExtension spuExtension = spuService.getSpuExtension(spu.getSpuId()); + spu.setCommentNum(spuExtension.getCommentNum()); + + + // 获取商品的sku库存 + List skuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuAppVO skus : spu.getSkus()) { + skuIds.add(skus.getSkuId()); + if (Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + skuIds.add(skus.getSupplierSkuId()); + } + } + Map stockMap = skuStockService.mapSkuTotalStockBySkuIds(skuIds); + + // 插入sku库存 + int totalStock = 0; + int saleNum = 0; + boolean supplierDelivery = Objects.nonNull(spu.getSupplierSpuType()) && Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + for (SkuAppVO sku : spu.getSkus()) { + Integer supplierStock = sku.getSupplierStock(); + // 从map中插入sku库存 + SkuStockVO skuStockVO; + if (supplierDelivery) { + skuStockVO = stockMap.get(sku.getSupplierSkuId()); + sku.setSupplierStock(skuStockVO.getStock()); + } else { + skuStockVO = stockMap.get(sku.getSkuId()); + } + if(Objects.isNull(skuStockVO)){ + skuStockVO = new SkuStockVO(sku.getSkuId()); + } + sku.setSaleNum(skuStockVO.getSale()); + if(Objects.equals(spu.getSpuMold(),SpuMold.COMBO.value())) { + totalStock += sku.getStock(); + sku.setSupplierStock(supplierStock); + }else{ + sku.setStock(skuStockVO.getStock()); + totalStock += skuStockVO.getStock(); + } + + saleNum += skuStockVO.getSale(); + } + spu.setSaleNum(saleNum); + // 设置商品库存 + spu.setTotalStock(totalStock); + } + + private void handlePreSaleInfo(SpuAppVO spuAppVO) { + if (!Objects.equals(spuAppVO.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + return; + } + for (SkuAppVO sku : spuAppVO.getSkus()) { + sku.setDepositAmount(spuAppVO.getDepositAmount()); + sku.setDepositExpansionAmount(spuAppVO.getDepositExpansionAmount()); + } + // 定金价格最小0.01元,不能为0 + if (Objects.equals(spuAppVO.getDepositType(), 0)) { + Long depositAmount = PriceUtil.divideByBankerRounding(spuAppVO.getPriceFee() * spuAppVO.getDepositAmount(), 10000); + Long depositExpansionAmount = PriceUtil.divideByBankerRounding(spuAppVO.getPriceFee() * spuAppVO.getDepositExpansionAmount(), 10000); + for (SkuAppVO sku : spuAppVO.getSkus()) { + Long skuDepositAmount = PriceUtil.divideByBankerRounding(sku.getPriceFee() * spuAppVO.getDepositAmount(), 10000); + Long skuDepositExpansionAmount = PriceUtil.divideByBankerRounding(sku.getPriceFee() * spuAppVO.getDepositExpansionAmount(), 10000); + sku.setDepositAmount(skuDepositAmount < Constant.MIN_ORDER_AMOUNT ? Constant.MIN_ORDER_AMOUNT : skuDepositAmount); + sku.setDepositExpansionAmount(skuDepositExpansionAmount); + } + spuAppVO.setDepositAmount(depositAmount < Constant.MIN_ORDER_AMOUNT ? Constant.MIN_ORDER_AMOUNT : depositAmount); + spuAppVO.setDepositExpansionAmount(depositExpansionAmount); + } + } + + /** + * 处理套配商品 + * + * @param comboVOList + */ + private void disposeMatchSpu(List comboVOList) { + Map> comboVoByComboId = comboVOList.stream().collect(Collectors.groupingBy(ComboVO::getComboId)); + for (ComboVO comboVO : comboVOList) { + List matchingSpuS = comboVO.getMatchingSpus(); + List spuIdList = matchingSpuS.stream().map(ComboSpuVO::getSpuId).collect(Collectors.toList()); + //获取商品基本信息 + List spuVOList = spuService.listSpuBySpuIds(spuIdList); + //根据商品id分组 + Map> spuVoBySpuId = spuVOList.stream().collect(Collectors.groupingBy(SpuVO::getSpuId)); + for (ComboSpuVO spuVO : matchingSpuS) { + SpuVO vo = spuVoBySpuId.get(spuVO.getSpuId()).get(0); + spuVO.setSpuName(vo.getName()); + spuVO.setPic(vo.getMainImgUrl()); + spuVO.setSpuStatus(vo.getStatus()); + } + } + + } + + private List isFiltrationDisableAndDeleted(SpuAppVO spuAppVO, List skuAppVOList) { + if (Objects.equals(spuAppVO.getSupplierDeliveryType(), SupplierDeliveryType.SHOP_DELIVERY.value())) { + //商家自行发货不用过滤 + return skuAppVOList; + } + //获取供应商商品spu + SpuVO spupplierSpu = spuService.getBySpuId(spuAppVO.getSupplierSpuId()); + spuAppVO.setDeliveryTemplateId(spupplierSpu.getDeliveryTemplateId()); + //获取供应商品sku + List skuVOList = skuService.listSkuWithAttrBySpuId(spuAppVO.getSupplierSpuId()); + Map skuStatus = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, SkuVO::getStatus)); + Iterator skuAppIterator = skuAppVOList.iterator(); + while (skuAppIterator.hasNext()) { + Integer status = skuStatus.get(skuAppIterator.next().getSupplierSkuId()); + if (Objects.equals(status, 0) || Objects.equals(status, -1) || Objects.equals(status, null)) { + skuAppIterator.remove(); + } + } + return skuAppVOList; + + } + + /** + * 处理代销商品信息 + * + * @param spuVO + * @return + */ + private void disposeSpuMsg(SpuAppVO spuVO) { + Long spuId = spuVO.getSpuId(); + //获取代销商品基本信息是否改变 + SpuConsignmentChange spuConsignmentChange = spuConsignmentChangeService.getBySpuId(spuId); + if (Objects.isNull(spuConsignmentChange)) { + return; + } + //获取供应商信息 + SpuVO supplierSpu = spuService.getBySpuId(spuVO.getSupplierSpuId()); + ProductLangUtil.spu(supplierSpu); + //名称 + if (Objects.equals(spuConsignmentChange.getNameChange(), 0)) { + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setSpuName(supplierSpu.getName()); + } + } + //图片 + if (Objects.equals(spuConsignmentChange.getImageChange(), 0)) { + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setImgUrls(supplierSpu.getImgUrls()); + spuVO.setMainImgUrl(supplierSpu.getMainImgUrl()); + } + } + //视频 + if (Objects.equals(spuConsignmentChange.getVideoChange(), 0)) { + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setVideo(supplierSpu.getVideo()); + } + } + //卖点 + if (Objects.equals(spuConsignmentChange.getSellingPointChange(), 0)) { + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setSellingPoint(supplierSpu.getSellingPoint()); + } + } + //计量单位 + if (Objects.equals(spuConsignmentChange.getMeasureUnitChange(), 0)) { + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setMeasureUnit(supplierSpu.getMeasureUnit()); + } + } + //spuCod + if (Objects.equals(spuConsignmentChange.getSpuCodeChange(), 0)) { + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setSpuCode(supplierSpu.getSpuCode()); + } + } + //详情描述 + if (Objects.equals(spuConsignmentChange.getDetailChange(), 0) && Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setDetail(CollUtil.isEmpty(supplierSpu.getDetailList()) ? null : supplierSpu.getDetailList().get(0).getDetail()); + } + // 运费模板 + if (Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuVO.setDeliveryTemplateId(supplierSpu.getDeliveryTemplateId()); + spuVO.setDepositAmount(supplierSpu.getDepositAmount()); + } + } + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuTagController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuTagController.java new file mode 100644 index 0000000..fd26491 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/app/SpuTagController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.app; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.SpuTagService; +import com.tmerclub.cloud.product.vo.SpuTagVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.List; + + +/** + * 商品分组表 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +@RestController("appSpuTagController") +@RequestMapping("/ua/spu_tag") +@Tag(name = "app-商品分组") +public class SpuTagController { + + @Autowired + private SpuTagService spuTagService; + + @GetMapping("/list") + @Operation(summary = "获取商品分组列表", description = "获取商品分组列表") + @Parameters(@Parameter(name = "shopId", description = "店铺id")) + public ServerResponseEntity> list(@RequestParam(value = "shopId", defaultValue = "0") Long shopId) { + List spuTagList = spuTagService.listByShopId(shopId); + return ServerResponseEntity.success(spuTagList); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/BrandController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/BrandController.java new file mode 100644 index 0000000..4ae812f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/BrandController.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.constant.IsPassShopEnum; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.dto.BrandSigningDTO; +import com.tmerclub.cloud.product.service.BrandService; +import com.tmerclub.cloud.product.service.BrandShopService; +import com.tmerclub.cloud.product.vo.BrandSigningVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/30 13:26 + */ +@RestController("multishopBrandController") +@RequestMapping("/m/apply_shop/brand") +@Tag(name = "multishop-品牌信息") +public class BrandController { + + @Autowired + private BrandShopService brandShopService; + + @Autowired + private BrandService brandService; + + @PostMapping("/signing") + @Operation(summary = "签约品牌", description = "签约品牌") + public ServerResponseEntity signingBrands(@Valid @RequestBody BrandSigningDTO brandSigningDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + if (Objects.equals(AuthUserContext.get().getIsPassShop(), IsPassShopEnum.YES.value())) { + brandSigningDTO.setCustomizeBrandList(new ArrayList<>(0)); + } + brandShopService.signingBrands(brandSigningDTO, AuthUserContext.get().getTenantId(), sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_signing") + @Operation(summary = "获取店铺下已签约的品牌列表", description = "获取店铺下已签约的品牌列表") + public ServerResponseEntity listSigning() { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + BrandSigningVO brandSigningVO = brandShopService.listSigningByShopId(shopId, sysType); + return ServerResponseEntity.success(brandSigningVO); + } + + @GetMapping("/list_available_by_category_and_name") + @Parameters({ + @Parameter(name = "categoryId", description = "分类id"), + @Parameter(name = "brandName", description = "品牌名称") + }) + @Operation(summary = "根据分类id与品牌名称获取分类下的品牌与店铺签约的品牌", description = "根据分类id与品牌名称获取分类下的品牌与店铺签约的品牌") + public ServerResponseEntity> listAvailableBrandByCategoryIdAndBrandName(@RequestParam Long categoryId, @RequestParam(defaultValue = "") String brandName) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(brandService.listAvailableBrandByCategoryIdAndBrandNameAndShopId(categoryId, brandName, shopId, sysType)); + } + + @DeleteMapping("/delete_signing_brand") + @Operation(summary = "根据签约信息Id删除签约品牌", description = "根据签约信息Id删除签约品牌") + public ServerResponseEntity deleteSigningCategory(@RequestParam("brandShopId") Long brandShopId) { + brandShopService.deleteSigningBrand(brandShopId); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_apply_signing_brand") + @Operation(summary = "获取可以签约的品牌列表(已经签约的品牌不会返回)", description = "获取可以签约的品牌列表(已经签约的品牌不会返回)") + public ServerResponseEntity> listApplySigningBrand(BrandDTO brandDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(brandService.listApplySigningBrand(brandDTO, shopId, sysType)); + } + + @PostMapping("/add_signing_brand") + @Operation(summary = "新增签约品牌", description = "新增签约品牌") + public ServerResponseEntity addSigningBrand(@Valid @RequestBody BrandSigningDTO brandSigningDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + brandShopService.addSigningBrand(brandSigningDTO, shopId, sysType); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SkuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SkuController.java new file mode 100644 index 0000000..95b70dc --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SkuController.java @@ -0,0 +1,98 @@ +package com.tmerclub.cloud.product.controller.multishop; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.model.SkuStock; +import com.tmerclub.cloud.product.service.SkuComboService; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SkuStockService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.vo.SkuExcelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +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.Map; +/** + * @author lanhai + */ +@RestController("multishopSkuController") +@RequestMapping("/m/sku") +@Tag(name = "multishop-sku信息") +public class SkuController { + + @Autowired + private SkuService skuService; + @Autowired + private SpuService spuService; + @Autowired + private SkuStockService skuStockService; + @Autowired + private SkuComboService skuComboService; + + @GetMapping("/get_all_skuList") + @Operation(summary = "通过prodId获取全部的规格列表", description = "通过prodId获取全部的规格列表") + @Parameter(name = "prodId", description = "商品id") + public ServerResponseEntity> getSkuListByProdId(Long prodId) { + List skus = skuService.listSkuWithAttrBySpuId(prodId); + List skuIds = skus.stream().map(SkuVO::getSkuId).toList(); + Map stockMap = skuStockService.mapSkuTotalStockBySkuIds(skuIds); + for (SkuVO skuVO : skus) { + if (stockMap.containsKey(skuVO.getSkuId())) { + skuVO.setStock(stockMap.get(skuVO.getSkuId()).getStock()); + } + } + return ServerResponseEntity.success(skus); + } + + @GetMapping("/get_stock_warning_num") + @Operation(summary = "查询sku库存预警数量", description = "查询sku库存预警数量") + public ServerResponseEntity getStockWarningNum(ProductSearchDTO product) { + product.setShopId(AuthUserContext.get().getTenantId()); + Integer count = skuService.getStockWarningNum(product); + return ServerResponseEntity.success(count); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出sku信息", description = "导出sku信息") + public ServerResponseEntity skuSoldExcel(HttpServletResponse response, ProductSearchDTO product) { + product.setShopId(AuthUserContext.get().getTenantId()); + List skuList = skuService.exportSkuList(product); + ExcelUtil.soleExcel(response, skuList, SkuExcelVO.EXCEL_NAME, SkuExcelVO.MERGE_ROW_INDEX, SkuExcelVO.MERGE_COLUMN_INDEX, SkuExcelVO.class); + return ServerResponseEntity.success(); + } + + @GetMapping("/page_sku") + @Operation(summary = "分页查询sku信息", description = "分页查询sku信息") + public ServerResponseEntity> pageSku(PageDTO pageDTO, ProductSearchDTO product) { + product.setShopId(AuthUserContext.get().getTenantId()); + PageVO skuPage = skuService.pageSku(pageDTO, product); + List skuList = skuPage.getList(); + if (CollUtil.isEmpty(skuList)) { + return ServerResponseEntity.success(skuPage); + } + for (SkuVO skuVO : skuList) { + Integer spuMold = spuService.getBySpuId(skuVO.getSpuId()).getSpuMold(); + SkuStock skuStock = skuStockService.getBySkuId(skuVO.getSkuId(), spuMold); + skuVO.setStock(skuStock.getStock()); + } + return ServerResponseEntity.success(skuPage); + } + + + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuCommController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuCommController.java new file mode 100644 index 0000000..364c188 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuCommController.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.SpuCommDTO; +import com.tmerclub.cloud.product.service.SpuCommService; +import com.tmerclub.cloud.product.vo.SpuCommVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 商品评论 + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +@RestController("multishopSpuCommController") +@RequestMapping("/m/spu_comm") +@Tag(name = "multishop-商品评论") +public class SpuCommController { + + @Autowired + private SpuCommService spuCommService; + + + @GetMapping("/page") + @Operation(summary = "获取商品评论列表", description = "分页获取商品评论列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SpuCommDTO spuCommDTO) { + spuCommDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO spuCommPage = spuCommService.page(pageDTO, spuCommDTO); + return ServerResponseEntity.success(spuCommPage); + } + + @GetMapping + @Operation(summary = "获取商品评论", description = "根据spuCommId获取商品评论") + public ServerResponseEntity getBySpuCommId(@RequestParam Long spuCommId) { + return ServerResponseEntity.success(spuCommService.getBySpuCommId(spuCommId)); + } + + @PutMapping + @Operation(summary = "更新商品评论", description = "更新商品评论") + public ServerResponseEntity update(@Valid @RequestBody SpuCommDTO spuComm) { + spuCommService.update(spuComm); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除商品评论", description = "删除商品评论") + public ServerResponseEntity deledte(@RequestParam Long spuCommId) { + spuCommService.deleteById(spuCommId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuController.java new file mode 100644 index 0000000..d12a15f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuController.java @@ -0,0 +1,86 @@ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuAttrValueVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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 java.util.List; +import java.util.Objects; + +/** + * @author lanhai + */ +@RestController("multishopSpuController") +@RequestMapping("/m/spu") +@Tag(name = "商品接口") +public class SpuController { + + @Autowired + private SpuService spuService; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private BrandService brandService; + @Autowired + private SkuService skuService; + @Autowired + private CategoryService categoryService; + + @GetMapping("/pageSpuSku") + @Operation(summary = "分页查询当前商家的spu及其sku信息", description = "分页查询当前商家spu及其sku信息") + public ServerResponseEntity> pageSpuSku(PageDTO pageDTO, SpuDTO spuDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + spuDTO.setShopId(shopId); + PageVO page = spuService.pageSpuSku(pageDTO, spuDTO); + return ServerResponseEntity.success(page); + } + + @GetMapping("/getSupplierSpu") + @Operation(summary = "获取供应商spu信息", description = "根据spuId获取spu信息") + public ServerResponseEntity getBySpuId(@RequestParam Long spuId) { + // 获取spu信息 + SpuVO spuVO = spuService.getBySpuId(spuId); + ProductLangUtil.spu(spuVO); + ProductLangUtil.spuDetail(spuVO); + List spuAttrsBySpuId = spuAttrValueService.getSpuAttrsBySpuId(spuId); + spuVO.setSpuAttrValues(spuAttrsBySpuId); + // 品牌信息 + spuVO.setBrand(brandService.getByBrandId(spuVO.getBrandId())); + // sku信息 + spuVO.setSkus(skuService.listSkuAllInfoBySpuId(spuId, spuVO, false)); + spuService.loadSpuAttrs(spuVO); + // 插入商品库存和销量 + int totalStock = 0; + int saleNum = 0; + for (SkuVO skus : spuVO.getSkus()) { + totalStock += skus.getStock(); + saleNum += Objects.isNull(skus.getSaleNum()) ? 0 : skus.getSaleNum(); + } + spuVO.setTotalStock(totalStock); + spuVO.setSaleNum(saleNum); + // 平台分类、供应商分类信息 + spuVO.setCategory(categoryService.getInfo(spuVO.getCategoryId())); + ProductLangUtil.category(spuVO.getCategory()); + if (Objects.nonNull(spuVO.getSupplierCategoryId()) && !Objects.equals(spuVO.getSupplierCategoryId(), Constant.DEFAULT_ID)) { + spuVO.setSupplierCategory(categoryService.getInfo(spuVO.getSupplierCategoryId())); + ProductLangUtil.category(spuVO.getSupplierCategory()); + } + return ServerResponseEntity.success(spuVO); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuPriceLogController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuPriceLogController.java new file mode 100644 index 0000000..ebe639a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuPriceLogController.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.SpuPriceLogDTO; +import com.tmerclub.cloud.product.model.SpuPriceLog; +import com.tmerclub.cloud.product.service.SpuPriceLogService; +import com.tmerclub.cloud.product.vo.SpuPriceLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 商品调价记录 + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +@RestController("multishopSpuPriceLogController") +@RequestMapping("/m/spu_price_log") +@Tag(name = "multishop商品调价记录") +public class SpuPriceLogController { + + @Autowired + private SpuPriceLogService spuPriceLogService; + + + @GetMapping("/page") + @Operation(summary = "获取商品调价记录列表", description = "分页获取商品调价记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, SpuPriceLogDTO spuPriceLogDTO) { + PageVO spuPriceLogPage = spuPriceLogService.page(pageDTO, spuPriceLogDTO); + return ServerResponseEntity.success(spuPriceLogPage); + } + + @GetMapping + @Operation(summary = "获取商品调价记录", description = "根据id获取商品调价记录") + public ServerResponseEntity getById(@RequestParam Long id) { + return ServerResponseEntity.success(spuPriceLogService.getById(id)); + } + + @PostMapping + @Operation(summary = "保存商品调价记录", description = "保存商品调价记录") + public ServerResponseEntity save(@Valid @RequestBody SpuPriceLogDTO spuPriceLogDTO) { + SpuPriceLog spuPriceLog = BeanUtil.map(spuPriceLogDTO, SpuPriceLog.class); + spuPriceLog.setId(null); + spuPriceLogService.save(spuPriceLog); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新商品调价记录", description = "更新商品调价记录") + public ServerResponseEntity update(@Valid @RequestBody SpuPriceLogDTO spuPriceLogDTO) { + SpuPriceLog spuPriceLog = BeanUtil.map(spuPriceLogDTO, SpuPriceLog.class); + spuPriceLogService.update(spuPriceLog); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除商品调价记录", description = "根据商品调价记录id删除商品调价记录") + public ServerResponseEntity delete(@RequestParam Long id) { + spuPriceLogService.deleteById(id); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuSupplierChangeLogController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuSupplierChangeLogController.java new file mode 100644 index 0000000..b9a9fbb --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/SpuSupplierChangeLogController.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.SpuSupplierChangeLogDTO; +import com.tmerclub.cloud.product.model.SpuSupplierChangeLog; +import com.tmerclub.cloud.product.service.SpuSupplierChangeLogService; +import com.tmerclub.cloud.product.vo.SpuSupplierChangeLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 商品供应商变更记录 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("multishopSpuSupplierChangeLogController") +@RequestMapping("/m/spu_supplier_change_log") +@Tag(name = "商品供应商变更记录") +public class SpuSupplierChangeLogController { + + @Autowired + private SpuSupplierChangeLogService spuSupplierChangeLogService; + + + @GetMapping("/page") + @Operation(summary = "获取商品供应商变更记录列表", description = "分页获取商品供应商变更记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO spuSupplierChangeLogPage = spuSupplierChangeLogService.page(pageDTO); + return ServerResponseEntity.success(spuSupplierChangeLogPage); + } + + @GetMapping + @Operation(summary = "获取商品供应商变更记录", description = "根据spuChangeId获取商品供应商变更记录") + public ServerResponseEntity getBySpuChangeId(@RequestParam Long spuChangeId) { + return ServerResponseEntity.success(spuSupplierChangeLogService.getBySpuChangeId(spuChangeId)); + } + + @PostMapping + @Operation(summary = "保存商品供应商变更记录", description = "保存商品供应商变更记录") + public ServerResponseEntity save(@Valid @RequestBody SpuSupplierChangeLogDTO spuSupplierChangeLogDTO) { + SpuSupplierChangeLog spuSupplierChangeLog = BeanUtil.map(spuSupplierChangeLogDTO, SpuSupplierChangeLog.class); + spuSupplierChangeLog.setSpuChangeId(null); + spuSupplierChangeLogService.save(spuSupplierChangeLog); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新商品供应商变更记录", description = "更新商品供应商变更记录") + public ServerResponseEntity update(@Valid @RequestBody SpuSupplierChangeLogDTO spuSupplierChangeLogDTO) { + SpuSupplierChangeLog spuSupplierChangeLog = BeanUtil.map(spuSupplierChangeLogDTO, SpuSupplierChangeLog.class); + spuSupplierChangeLogService.update(spuSupplierChangeLog); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除商品供应商变更记录", description = "根据商品供应商变更记录id删除商品供应商变更记录") + public ServerResponseEntity delete(@RequestParam Long spuChangeId) { + spuSupplierChangeLogService.deleteById(spuChangeId); + return ServerResponseEntity.success(); + } + + @PostMapping("/batchSync") + @Operation(summary = "变更信息批量同步", description = "变更信息批量同步") + public ServerResponseEntity batchSync(@RequestBody List spuSupplierChangeLog) { + Long shopId = AuthUserContext.get().getTenantId(); + spuSupplierChangeLogService.syncSpu(shopId, spuSupplierChangeLog); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockBillLogController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockBillLogController.java new file mode 100644 index 0000000..5a20110 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockBillLogController.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.StockBillType; +import com.tmerclub.cloud.common.product.constant.StockType; +import com.tmerclub.cloud.common.product.vo.StockBillLogItemVO; +import com.tmerclub.cloud.common.product.vo.StockBillLogVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogBO; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.service.StockBillLogService; +import com.tmerclub.cloud.product.vo.StockBillInLogExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogExcelVO; +import com.tmerclub.cloud.product.vo.StockBillOutLogExcelVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 出入库明细 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("multishopStockBillLogController") +@RequestMapping("/m/stock_bill_log") +@Tag(name = "出入库明细") +public class StockBillLogController { + + @Autowired + private StockBillLogService stockBillLogService; + + @DubboReference + private ShopUserFeignClient shopUserFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取出入库明细列表", description = "分页获取出入库明细列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, StockBillLogDTO stockBillLogDTO) { + stockBillLogDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO stockBillLogPage = stockBillLogService.page(pageDTO, stockBillLogDTO); + return ServerResponseEntity.success(stockBillLogPage); + } + + @GetMapping("/info/{stockBillLogId}") + @Operation(summary = "获取出入库明细", description = "根据stockBillLogId获取出入库明细") + public ServerResponseEntity getByStockBillLogId(@PathVariable("stockBillLogId") Long stockBillLogId) { + return ServerResponseEntity.success(stockBillLogService.getByStockBillLogId(stockBillLogId)); + } + + @PostMapping + @Operation(summary = "保存出入库明细", description = "保存出入库明细") + public ServerResponseEntity save(@Valid @RequestBody StockBillLogVO stockBillLogVO) { + //出库操作下判断出库数是否超出库存数?执行出库 : 返回错误消息 + if (stockBillLogVO.getType() == 1) { + List stockBillLogItems = stockBillLogVO.getStockBillLogItems(); + for (StockBillLogItemVO stockBillLogItem : stockBillLogItems) { + if (stockBillLogItem.getStockCount() > stockBillLogItem.getStock()) { + throw new LuckException("出库数超出库存数"); + } + } + } + stockBillLogVO.setShopId(AuthUserContext.get().getTenantId()); + stockBillLogVO.setEmployeeId(AuthUserContext.get().getUserId()); + Long userId = AuthUserContext.get().getUserId(); + ServerResponseEntity userResponse = shopUserFeignClient.getByUserId(userId); + if (!userResponse.isSuccess() || userResponse.getData() == null) { + throw new LuckException("无法获取制单人手机号"); + } + stockBillLogVO.setMakerMobile(userResponse.getData().getPhoneNum()); + if (!Objects.equals(stockBillLogVO.getStockBillType(), StockBillType.PURCHASE_STORAGE.value())) { + stockBillLogVO.setStockBillType(Objects.equals(stockBillLogVO.getType(), StockType.OUT_OF_STOCK.value()) ? StockBillType.OTHER_OUTBOUND.value() : StockBillType.OTHER_STORAGE.value()); + } + stockBillLogService.saveInfo(stockBillLogVO); + return ServerResponseEntity.success(); + } + + + @PutMapping + @Operation(summary = "更新出入库明细", description = "更新出入库明细") + public ServerResponseEntity update(@Valid @RequestBody StockBillLogDTO stockBillLogDTO) { + if (Objects.isNull(stockBillLogDTO.getStockBillLogId())) { + throw new LuckException("id不能为空"); + } + stockBillLogService.updateInfo(stockBillLogDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/export_stock_bill_log") + @Operation(summary = "导出出入库明细列表", description = "导出出入库明细列表") + public void exportStockBillLog(StockBillLogDTO stockBillLogDTO, HttpServletResponse response) { + stockBillLogDTO.setShopId(AuthUserContext.get().getTenantId()); + List stockBillLogList = stockBillLogService.exportStockBillLogList(stockBillLogDTO); + // 出/入库分开导出 + if (stockBillLogDTO.getType() == 1) { + List excelData = JSON.parseObject( + JSON.toJSONString(stockBillLogList), + new TypeReference>() {} + ); + ExcelUtil.soleExcel(response, excelData, + StockBillOutLogExcelVO.EXCEL_NAME, + StockBillOutLogExcelVO.MERGE_ROW_INDEX, + StockBillOutLogExcelVO.MERGE_COLUMN_INDEX, + StockBillOutLogExcelVO.class + ); + } else { + List excelData = JSON.parseObject( + JSON.toJSONString(stockBillLogList), + new TypeReference>() { + } + ); + ExcelUtil.soleExcel(response, excelData, + StockBillInLogExcelVO.EXCEL_NAME, + StockBillInLogExcelVO.MERGE_ROW_INDEX, + StockBillInLogExcelVO.MERGE_COLUMN_INDEX, + StockBillInLogExcelVO.class + ); + } + } + + @PutMapping("/voided") + @Operation(summary = "作废出入库明细单", description = "作废出入库明细单") + public ServerResponseEntity voided(@RequestParam("stockBillLogId") Long stockBillLogId) { + Long shopId = AuthUserContext.get().getTenantId(); + stockBillLogService.voided(shopId, stockBillLogId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockBillLogItemController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockBillLogItemController.java new file mode 100644 index 0000000..3ce4e00 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockBillLogItemController.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.alibaba.excel.EasyExcel; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.listener.StockBillLogItemExcelListener; +import com.tmerclub.cloud.product.service.StockBillLogItemService; +import com.tmerclub.cloud.product.vo.StockBillLogItemExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogItemVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 出入库商品项 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("multishopStockBillLogItemController") +@RequestMapping("/m/stock_bill_log_item") +@Tag(name = "商家出入库商品项") +public class StockBillLogItemController { + + @Autowired + private StockBillLogItemService stockBillLogItemService; + + @GetMapping("/page") + @Operation(summary = "库存流水", description = "库存流水") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, StockBillLogDTO stockBillLogDTO) { + stockBillLogDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO stockBillLogItemPage = stockBillLogItemService.page(pageDTO, stockBillLogDTO); + return ServerResponseEntity.success(stockBillLogItemPage); + } + + @GetMapping("/download_model") + @Operation(summary = "下载导入出入库商品项模板", description = "下载导入出入库商品项模板") + public ServerResponseEntity downloadModel(HttpServletResponse response, Integer type) { + stockBillLogItemService.downloadModel(response, type); + return ServerResponseEntity.success(); + } + + @GetMapping("/export_flow") + @Operation(summary = "导出库存流水", description = "导出库存流水") + public void exportFlow(StockBillLogDTO stockBillLogDTO, HttpServletResponse response) { + stockBillLogDTO.setShopId(AuthUserContext.get().getTenantId()); + List stockBillLogItemVOList = stockBillLogItemService.exportFlow(stockBillLogDTO, response); + for (StockBillLogItemExcelVO stockBillLogItemExcelVO : stockBillLogItemVOList) { + // 价格单位转换 + stockBillLogItemExcelVO.setUnitPrice(PriceUtil.divideByBankerRounding(stockBillLogItemExcelVO.getUnitPrice(), 100)); + } + ExcelUtil.soleExcel(response, stockBillLogItemVOList, StockBillLogItemExcelVO.EXCEL_NAME, StockBillLogItemExcelVO.MERGE_ROW_INDEX, StockBillLogItemExcelVO.MERGE_COLUMN_INDEX, StockBillLogItemExcelVO.class); + } + + @Operation(summary = "批量导入商品项", description = "批量导入商品项") + @PostMapping("/import_excel") + public ServerResponseEntity importExcel(@RequestParam("excelFile") MultipartFile file, @RequestParam("type") Integer type) { + if (file == null) { + throw new LuckException("网络繁忙,请稍后重试"); + } + StockBillLogItemImportVO stockBillLogItemImportVO = new StockBillLogItemImportVO(); + try { + // 错误信息集合 + List errorList = new ArrayList<>(Constant.INITIAL_CAPACITY); + EasyExcel.read(file.getInputStream(), StockBillLogItemImportExcelVO.class, new StockBillLogItemExcelListener(stockBillLogItemService, errorList, type, stockBillLogItemImportVO)).sheet().doRead(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(stockBillLogItemImportVO); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockChangeReasonStatusController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockChangeReasonStatusController.java new file mode 100644 index 0000000..126f53e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/StockChangeReasonStatusController.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.StockChangeReasonStatusDTO; +import com.tmerclub.cloud.product.model.StockChangeReasonStatus; +import com.tmerclub.cloud.product.service.StockChangeReasonStatusService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 出入库原因状态 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("multishopStockChangeReasonStatusController") +@RequestMapping("/m/stock_change_reason_status") +@Tag(name = "出入库原因状态") +public class StockChangeReasonStatusController { + + @Autowired + private StockChangeReasonStatusService stockChangeReasonStatusService; + + + @GetMapping("/page") + @Operation(summary = "获取出入库原因状态列表", description = "分页获取出入库原因状态列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO stockChangeReasonStatusPage = stockChangeReasonStatusService.page(pageDTO); + return ServerResponseEntity.success(stockChangeReasonStatusPage); + } + + @GetMapping + @Operation(summary = "获取出入库原因状态", description = "根据stockChangeReasonStatusId获取出入库原因状态") + public ServerResponseEntity getByStockChangeReasonStatusId(@RequestParam Long stockChangeReasonStatusId) { + return ServerResponseEntity.success(stockChangeReasonStatusService.getByStockChangeReasonStatusId(stockChangeReasonStatusId)); + } + + @PostMapping + @Operation(summary = "保存出入库原因状态", description = "保存出入库原因状态") + public ServerResponseEntity save(@Valid @RequestBody StockChangeReasonStatusDTO stockChangeReasonStatusDTO) { + StockChangeReasonStatus stockChangeReasonStatus = BeanUtil.map(stockChangeReasonStatusDTO, StockChangeReasonStatus.class); + stockChangeReasonStatus.setStockChangeReasonStatusId(null); + stockChangeReasonStatusService.save(stockChangeReasonStatus); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新出入库原因状态", description = "更新出入库原因状态") + public ServerResponseEntity update(@Valid @RequestBody StockChangeReasonStatusDTO stockChangeReasonStatusDTO) { + StockChangeReasonStatus stockChangeReasonStatus = BeanUtil.map(stockChangeReasonStatusDTO, StockChangeReasonStatus.class); + stockChangeReasonStatusService.update(stockChangeReasonStatus); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除出入库原因状态", description = "根据出入库原因状态id删除出入库原因状态") + public ServerResponseEntity delete(@RequestParam Long stockChangeReasonStatusId) { + stockChangeReasonStatusService.deleteById(stockChangeReasonStatusId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/WarehouseController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/WarehouseController.java new file mode 100644 index 0000000..3987f7a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/multishop/WarehouseController.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.multishop; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.product.service.WarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +@RestController("multishopWarehouseController") +@RequestMapping("/m/warehouse") +@Tag(name = "商家仓库管理") +public class WarehouseController { + + @Autowired + private WarehouseService warehouseService; + + + @GetMapping("/page") + @Operation(summary = "获取仓库列表", description = "分页获取列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, WarehouseDTO warehouseDTO) { + warehouseDTO.setShopId(AuthUserContext.get().getTenantId()); + warehouseDTO.setSysType(AuthUserContext.get().getSysType()); + PageVO warehousePage = warehouseService.page(pageDTO, warehouseDTO); + return ServerResponseEntity.success(warehousePage); + } + + @GetMapping + @Operation(summary = "获取仓库", description = "根据warehouseId获取") + public ServerResponseEntity getByWarehouseId(@RequestParam Long warehouseId) { + WarehouseVO warehouseVO = warehouseService.getByWarehouseId(warehouseId); + if (StrUtil.isNotBlank(warehouseVO.getPhone()) && PrincipalUtil.isMobile(warehouseVO.getPhone())) { + warehouseVO.setPhone(PhoneUtil.hideBetween(warehouseVO.getPhone()).toString()); + } + return ServerResponseEntity.success(warehouseVO); + } + + @PostMapping + @Operation(summary = "保存仓库", description = "保存仓库") + public ServerResponseEntity save(@Valid @RequestBody WarehouseDTO warehouseDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + warehouseDTO.setShopId(shopId); + warehouseDTO.setSysType(sysType); + warehouseDTO.setType(1); + warehouseService.insertWarehouseAndArea(warehouseDTO); + // 清除缓存 + warehouseService.removeWarehouseCache(warehouseDTO.getWarehouseId(), warehouseDTO.getShopId(), warehouseDTO.getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新仓库", description = "更新仓库") + public ServerResponseEntity update(@Valid @RequestBody WarehouseDTO warehouseDTO) { + if (Objects.isNull(warehouseDTO.getCityList()) && warehouseDTO.getType() == 1) { + throw new LuckException("请选择供应区域"); + } + UidInfoBO token = AuthUserContext.get(); + warehouseDTO.setShopId(token.getTenantId()); + warehouseDTO.setSysType(token.getSysType()); + warehouseService.updateWarehouseAndArea(warehouseDTO); + // 清除缓存 + warehouseService.removeWarehouseCache(warehouseDTO.getWarehouseId(), warehouseDTO.getShopId(), warehouseDTO.getSysType()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除仓库", description = "根据id删除") + public ServerResponseEntity delete(@RequestParam Long warehouseId) { + WarehouseVO warehouseVO = warehouseService.deleteWarehouseAndArea(warehouseId); + // 删除仓库的缓存 + warehouseService.removeWarehouseCache(warehouseVO.getWarehouseId(), warehouseVO.getShopId(), warehouseVO.getSysType()); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_warehouse_city") + @Operation(summary = "获取店铺所有的供货城市", description = "获取店铺所有的供货城市") + public ServerResponseEntity> getListWarehouseCity(@RequestParam(value = "warehouseId", required = false) Long warehouseId) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(warehouseService.listWarehouseAreaByShopId(shopId, sysType, warehouseId)); + } + + @GetMapping("/list_warehouse") + @Operation(summary = "获取店铺所有的仓库", description = "获取店铺所有的仓库") + public ServerResponseEntity> getListWarehouse() { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setShopId(AuthUserContext.get().getTenantId()); + warehouseDTO.setSysType(AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(warehouseService.listWarehouse(warehouseDTO)); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/CategoryController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/CategoryController.java new file mode 100644 index 0000000..8723620 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/CategoryController.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.platform; + +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.api.product.dto.HandleCategoryShopDTO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.service.CategoryService; +import com.tmerclub.cloud.product.service.CategoryShopService; +import com.tmerclub.cloud.product.vo.CategoryPlatformExcelVO; +import com.tmerclub.cloud.product.vo.CategoryShopVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * @Author lth + * @Date 2021/4/26 9:22 + */ +@RestController("platformCategoryController") +@RequestMapping("/p/category") +@Tag(name = "platform-分类信息") +public class CategoryController { + + @Autowired + private CategoryShopService categoryShopService; + @Autowired + private CategoryService categoryService; + + @GetMapping("/signing_info_by_shopId") + @Operation(summary = "根据店铺id获取分类签约信息", description = "根据店铺id获取分类签约信息") + @Parameter(name = "sysType", description = "系统类型 0.普通用户系统 1.商家端 2.平台端 3.供应商端") + public ServerResponseEntity> listByShopId(@RequestParam("shopId") Long shopId, @RequestParam(value = "sysType", required = false) Integer sysType) { + sysType = Objects.isNull(sysType) ? AuthUserContext.get().getSysType() : sysType; + List categoryShopVOList = categoryShopService.listByShopId(shopId, sysType, I18nMessage.getLang()); + return ServerResponseEntity.success(categoryShopVOList); + } + + + @PutMapping("/signing") + @Operation(summary = "更新店铺签约分类", description = "更新店铺签约分类") + public ServerResponseEntity signing(@Valid @RequestBody HandleCategoryShopDTO handleCategoryShopDTO) { + List categoryShopDTOList = handleCategoryShopDTO.getCategoryShopDTOList(); + Integer sysType = handleCategoryShopDTO.getSysType(); + Long shopId = handleCategoryShopDTO.getShopId(); + sysType = Objects.isNull(sysType) ? AuthUserContext.get().getSysType() : sysType; + categoryShopService.signingCategory(categoryShopDTOList, shopId, sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出分类excel") + public ServerResponseEntity spuSoldExcel(HttpServletResponse response) { + List list = categoryService.listExcelPlatform(); + ExcelUtil.soleExcel(response, list, CategoryPlatformExcelVO.EXCEL_NAME, CategoryPlatformExcelVO.MERGE_ROW_INDEX, CategoryPlatformExcelVO.MERGE_COLUMN_INDEX, CategoryPlatformExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuExtensionController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuExtensionController.java new file mode 100644 index 0000000..a4a06aa --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuExtensionController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.platform; + +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.SpuExtensionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PutMapping; +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 lth + * @Date 2021/7/19 15:32 + */ +@RestController("platformSpuExtensionController") +@RequestMapping("/p/spuExtension") +@Tag(name = "platform-spuExtension信息") +public class SpuExtensionController { + + @Autowired + private SpuExtensionService spuExtensionService; + + @PutMapping("/water_sold_num") + @Operation(summary = "更新商品注水销量", description = "更新商品注水销量") + public ServerResponseEntity updateWaterSoldNum(@RequestParam("waterSoldNum") Integer waterSoldNum, @RequestParam("spuId") Long spuId) { + if (Objects.isNull(waterSoldNum)) { + waterSoldNum = 0; + } + spuExtensionService.updateWaterSoldNumBySpuId(spuId, waterSoldNum); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuTagReferenceController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuTagReferenceController.java new file mode 100644 index 0000000..922fc13 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/SpuTagReferenceController.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.platform; + + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.SpuTagDTO; +import com.tmerclub.cloud.product.dto.SpuTagReferenceDTO; +import com.tmerclub.cloud.product.model.SpuTag; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.service.SpuTagReferenceService; +import com.tmerclub.cloud.product.service.SpuTagService; +import com.tmerclub.cloud.product.vo.SpuTagVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 商品分组标签关联信息 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +@RestController("platformSpuTagReferenceController") +@RequestMapping("/p/spu_tag_reference") +@Tag(name = "platform-商品分组关联") +public class SpuTagReferenceController { + + @Autowired + private SpuTagReferenceService spuTagReferenceService; + + @Autowired + private SpuService spuService; + + @Autowired + private SpuTagService spuTagService; + + + @GetMapping("/page_spu_by_tag") + @Operation(summary = "获取当前分组的所有商品", description = "获取当前分组的所有商品") + public ServerResponseEntity> pageProdByTag(@Valid PageDTO pageDTO, SpuTagReferenceDTO spuTagReferenceDTO) { + return ServerResponseEntity.success(spuTagReferenceService.pageSpuListByTagId(pageDTO, spuTagReferenceDTO)); + } + + @PostMapping("/add_prod_for_tag") + @Operation(summary = "向分组添加商品", description = "向分组添加商品") + public ServerResponseEntity addProdForTag(@RequestBody @Valid SpuTagDTO spuTagDTO) { + SpuTagVO spuTagVO = spuTagService.getById(spuTagDTO.getId()); + if (Objects.isNull(spuTagVO)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + if (!Objects.equals(spuTagVO.getShopId(), Constant.PLATFORM_SHOP_ID)) { + // 您无权进行操作 + throw new LuckException("您无权进行操作"); + } + List spuList = spuTagDTO.getSpuList(); + if (CollectionUtil.isEmpty(spuList)) { + // 请选择需要加入分组的商品 + throw new LuckException("请选择需要加入分组的商品"); + } + List ids = spuTagReferenceService.spuIdsByTagId(spuTagDTO.getId()); + List curIds = spuList.stream().map(SpuDTO::getSpuId).collect(Collectors.toList()); + for (Long curId : curIds) { + if (ids.contains(curId)) { + spuList.removeIf(spu -> spu.getSpuId().equals(curId)); + } + } + spuTagDTO.setShopId(spuTagVO.getShopId()); + SpuTag spuTag = BeanUtil.map(spuTagDTO, SpuTag.class); + spuTagReferenceService.addProdForTag(spuTag, spuList); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_prod_seq") + @Operation(summary = "修改分组中的商品排序号", description = "修改分组中的商品排序号") + public ServerResponseEntity updateProdSeq(@RequestBody @Valid List spuTagList) { + + if (CollectionUtil.isEmpty(spuTagList)) { + // 请选择需要修改排序的分组商品 + throw new LuckException("请选择需要修改排序的分组商品"); + } + spuTagReferenceService.updateProdSeq(spuTagList); + return ServerResponseEntity.success(); + } + + @DeleteMapping("/delete_prod") + @Operation(summary = "删除分组中的商品", description = "删除分组中的商品") + public ServerResponseEntity delete(@RequestBody SpuTagDTO spuTagDTO) { + SpuTagVO spuTagVO = spuTagService.getById(spuTagDTO.getId()); + List spuIds = spuTagDTO.getSpuIds(); + if (CollectionUtil.isEmpty(spuIds)) { + // 请选择需要删除分组中的商品 + throw new LuckException("请选择需要删除分组中的商品"); + } + if (Objects.isNull(spuTagDTO.getId())) { + // 缺少分组id + throw new LuckException("缺少分组id"); + } + spuTagReferenceService.removeByProdId(spuTagDTO.getId(), spuIds); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/WarehouseController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/WarehouseController.java new file mode 100644 index 0000000..4972f8d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/platform/WarehouseController.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.platform; + +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.service.WarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +@RestController("platformWarehouseController") +@RequestMapping("/p/warehouse") +@Tag(name = "平台仓库管理") +public class WarehouseController { + + @Autowired + private WarehouseService warehouseService; + + + @GetMapping + @Operation(summary = "获取仓库", description = "根据warehouseId获取") + public ServerResponseEntity getByWarehouseId() { + return ServerResponseEntity.success(warehouseService.getDefaultWarehouseByShopId(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType())); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/AttrController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/AttrController.java new file mode 100644 index 0000000..5ae0352 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/AttrController.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.AttrType; +import com.tmerclub.cloud.common.product.constant.SearchType; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.AttrDTO; +import com.tmerclub.cloud.product.model.Attr; +import com.tmerclub.cloud.product.model.AttrValue; +import com.tmerclub.cloud.product.service.AttrService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 属性信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +@RestController("supplierAttrController") +@RequestMapping("/s/attr") +@Tag(name = "supplier-属性信息") +public class AttrController { + + @Autowired + private AttrService attrService; + + + @GetMapping("/page") + @Operation(summary = "获取属性信息列表", description = "分页获取属性信息列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, AttrDTO attrDTO) { + attrDTO.setSysType(AuthUserContext.get().getSysType()); + PageVO attrPage = attrService.page(pageDTO, attrDTO); + return ServerResponseEntity.success(attrPage); + } + + @GetMapping + @Operation(summary = "获取属性信息", description = "根据attrId获取属性信息") + public ServerResponseEntity getByAttrId(@RequestParam Long attrId) { + return ServerResponseEntity.success(attrService.getByAttrId(attrId)); + } + + @PostMapping + @Operation(summary = "保存属性信息", description = "保存属性信息") + public ServerResponseEntity save(@Valid @RequestBody AttrDTO attrDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + attrDTO.setSysType(sysType); + if (Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId()) && Objects.isNull(attrDTO.getAttrType())) { + throw new LuckException("属性类型不能为空"); + } + checkAttrInfo(attrDTO); + attrService.save(attrDTO); + removeCacheAttrUnionCategory(attrDTO.getCategoryIds()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新属性信息", description = "更新属性信息") + public ServerResponseEntity update(@Valid @RequestBody AttrDTO attrDTO) { + checkAttrInfo(attrDTO); + Attr attr = BeanUtil.map(attrDTO, Attr.class); + if (CollUtil.isNotEmpty(attrDTO.getAttrValues())) { + attr.setAttrValues(BeanUtil.mapAsList(attrDTO.getAttrValues(), AttrValue.class)); + } + List categoryIds = null; + if (Objects.equals(AttrType.BASIC.value(), attr.getAttrType())) { + categoryIds = attrService.getAttrOfCategoryIdByAttrId(attrDTO.getAttrId()); + categoryIds.addAll(attrDTO.getCategoryIds()); + } + attrDTO.setShopId(AuthUserContext.get().getTenantId()); + attrService.update(attrDTO); + removeCacheAttrUnionCategory(categoryIds); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除属性信息", description = "根据属性信息id删除属性信息") + public ServerResponseEntity delete(@RequestParam Long attrId) { + Integer sysType = AuthUserContext.get().getSysType(); + List categoryIds = attrService.getAttrOfCategoryIdByAttrId(attrId); + if (CollUtil.isNotEmpty(categoryIds)) { + removeCacheAttrUnionCategory(categoryIds); + } + attrService.deleteById(attrId); + return ServerResponseEntity.success(); + } + + @GetMapping("/get_attrs_by_category_id") + @Operation(summary = "根据分类及属性类别获取属性列表", description = "根据分类及属性类别获取属性列表") + @Parameter(name = "categoryId", description = "分类id", required = true) + public ServerResponseEntity> getAttrsByCategoryId(@RequestParam("categoryId") Long categoryId) { + return ServerResponseEntity.success(attrService.getAttrsByCategoryIdAndAttrType(categoryId)); + } + + @GetMapping("/get_shop_attrs") + @Operation(summary = "获取店铺中的销售属性", description = "获取店铺中的销售属性") + public ServerResponseEntity> getShopAttrs() { + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(attrService.getShopAttrs(AuthUserContext.get().getTenantId(), sysType)); + } + + /** + * 校验属性数据 + * + * @param attrDTO + */ + private void checkAttrInfo(AttrDTO attrDTO) { + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId())) { + attrDTO.setAttrType(AttrType.SALES.value()); + } + if (Objects.equals(AttrType.SALES.value(), attrDTO.getAttrType())) { + attrDTO.setSearchType(SearchType.NOT_SEARCH.value()); + return; + } + if (CollUtil.isEmpty(attrDTO.getCategoryIds())) { + throw new LuckException("关联分类不能为空"); + } + if (Objects.isNull(attrDTO.getSearchType())) { + throw new LuckException("搜索属性不能为空"); + } + } + + /** + * 删除属性关联的分类缓存 + */ + private void removeCacheAttrUnionCategory(List categoryIds) { + // 清除分类缓存 + if (!Objects.equals(Constant.PLATFORM_SHOP_ID, AuthUserContext.get().getTenantId()) || CollUtil.isEmpty(categoryIds)) { + return; + } + attrService.removeAttrByCategoryId(categoryIds); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/CategoryController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/CategoryController.java new file mode 100644 index 0000000..1474896 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/CategoryController.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.model.CategoryShop; +import com.tmerclub.cloud.product.service.CategoryService; +import com.tmerclub.cloud.product.service.CategoryShopService; +import com.tmerclub.cloud.product.vo.CategoryShopVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lth + */ +@RestController("supplierCategoryController") +@RequestMapping("/s/apply_supplier/category") +@Tag(name = "supplier-分类信息") +public class CategoryController { + + @Autowired + private CategoryShopService categoryShopService; + + @Autowired + private CategoryService categoryService; + + @PostMapping("/signing") + @Operation(summary = "签约分类", description = "签约分类") + public ServerResponseEntity signingCategory(@Valid @RequestBody List categoryShopDTOList) { + Long supplierId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + categoryShopService.signingCategory(categoryShopDTOList, supplierId, sysType); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_by_supplier") + @Operation(summary = "获取签约的分类列表(返回所有)", description = "获取签约的分类列表(返回所有)") + public ServerResponseEntity> listByShopId() { + Long supplierId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + List categoryShopVOList = categoryShopService.listByShopId(supplierId, sysType, I18nMessage.getLang()); + return ServerResponseEntity.success(categoryShopVOList); + } + + @GetMapping("/platform_categories") + @Operation(summary = "获取平台所有的分类信息", description = "获取所有的分类列表信息") + public ServerResponseEntity> platformCategories() { + return ServerResponseEntity.success(categoryService.platformCategories()); + } + + @GetMapping("/list_signing_category") + @Operation(summary = "获取签约的可用分类列表(发布商品时使用,包含对应的上级分类)", description = "获取签约的可用分类列表(发布商品时使用,包含对应的上级分类)") + public ServerResponseEntity> listSigningCategory(@RequestParam(value = "status", required = false) Integer status) { + List categoryList = categoryService.listSigningCategory(AuthUserContext.get().getTenantId(), AuthUserContext.get().getSysType(), I18nMessage.getLang()); + if (Objects.nonNull(status)) { + categoryList = categoryList.stream().filter(categoryAppVO -> Objects.equals(categoryAppVO.getStatus(), status)).collect(Collectors.toList()); + } + return ServerResponseEntity.success(categoryList); + } + + @DeleteMapping("/delete_signing_category") + @Operation(summary = "根据签约分类id删除签约信息", description = "根据签约分类id删除签约信息") + public ServerResponseEntity deleteSigningCategory(@RequestParam("categoryShopId") Long categoryShopId) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + CategoryShop categoryShop = categoryShopService.getById(categoryShopId); + if (Objects.isNull(categoryShop)) { + throw new LuckException("找不到当前签约分类,请刷新后重试"); + } + if (!Objects.equals(shopId, categoryShop.getShopId()) && !Objects.equals(sysType, SysTypeEnum.SUPPLIER.value())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + categoryShopService.deleteSigningCategory(categoryShop); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_apply_signing_category") + @Operation(summary = "获取可以签约的平台分类列表(已经签约的平台分类不会返回)", description = "获取可以签约的平台分类列表(已经签约的平台分类不会返回)") + public ServerResponseEntity> listApplySigningCategory() { + Long supplierId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(categoryService.listApplySigningCategory(supplierId, sysType)); + } + + @PostMapping("/add_signing_category") + @Operation(summary = "新增签约分类", description = "新增签约分类") + public ServerResponseEntity applyCategory(@Valid @RequestBody List categoryShopDTOList) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + categoryShopService.addSigningCategory(categoryShopDTOList, shopId, sysType); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockBillLogController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockBillLogController.java new file mode 100644 index 0000000..9b25156 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockBillLogController.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.tmerclub.cloud.api.multishop.feign.ShopUserFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopUserVO; +import com.tmerclub.cloud.api.supplier.feign.SupplierUserFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiUserVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.StockBillType; +import com.tmerclub.cloud.common.product.constant.StockPointType; +import com.tmerclub.cloud.common.product.constant.StockType; +import com.tmerclub.cloud.common.product.vo.StockBillLogItemVO; +import com.tmerclub.cloud.common.product.vo.StockBillLogVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogBO; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.service.StockBillLogService; +import com.tmerclub.cloud.product.vo.StockBillInLogExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogExcelVO; +import com.tmerclub.cloud.product.vo.StockBillOutLogExcelVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 出入库明细 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("supplierStockBillLogController") +@RequestMapping("/s/stock_bill_log") +@Tag(name = "出入库明细") +public class StockBillLogController { + + @Autowired + private StockBillLogService stockBillLogService; + + @DubboReference + private SupplierUserFeignClient supplierUserFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取出入库明细列表", description = "分页获取出入库明细列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, StockBillLogDTO stockBillLogDTO) { + stockBillLogDTO.setSupplierId(AuthUserContext.get().getTenantId()); + PageVO stockBillLogPage = stockBillLogService.page(pageDTO, stockBillLogDTO); + return ServerResponseEntity.success(stockBillLogPage); + } + + @GetMapping("/info/{stockBillLogId}") + @Operation(summary = "获取出入库明细", description = "根据stockBillLogId获取出入库明细") + public ServerResponseEntity getByStockBillLogId(@PathVariable("stockBillLogId") Long stockBillLogId) { + return ServerResponseEntity.success(stockBillLogService.getByStockBillLogId(stockBillLogId)); + } + + @PostMapping + @Operation(summary = "保存出入库明细", description = "保存出入库明细") + public ServerResponseEntity save(@Valid @RequestBody StockBillLogVO stockBillLogVO) { + //出库操作下判断出库数是否超出库存数?执行出库 : 返回错误消息 + if (stockBillLogVO.getType() == 1) { + List stockBillLogItems = stockBillLogVO.getStockBillLogItems(); + for (StockBillLogItemVO stockBillLogItem : stockBillLogItems) { + if (stockBillLogItem.getStockCount() > stockBillLogItem.getStock()) { + throw new LuckException("出库数超出库存数"); + } + } + } + stockBillLogVO.setSupplierId(AuthUserContext.get().getTenantId()); + stockBillLogVO.setEmployeeId(AuthUserContext.get().getUserId()); + stockBillLogVO.setStockPointType(StockPointType.WAREHOUSE.getValue()); + Long userId = AuthUserContext.get().getUserId(); + ServerResponseEntity userResponse = supplierUserFeignClient.getByUserId(userId); + if (!userResponse.isSuccess() || userResponse.getData() == null) { + throw new LuckException("无法获取制单人手机号"); + } + stockBillLogVO.setMakerMobile(userResponse.getData().getPhoneNum()); + if (!Objects.equals(stockBillLogVO.getStockBillType(), StockBillType.PURCHASE_STORAGE.value())) { + stockBillLogVO.setStockBillType(Objects.equals(stockBillLogVO.getType(), StockType.OUT_OF_STOCK.value()) ? StockBillType.OTHER_OUTBOUND.value() : StockBillType.OTHER_STORAGE.value()); + } + stockBillLogService.saveInfo(stockBillLogVO); + return ServerResponseEntity.success(); + } + + + @PutMapping + @Operation(summary = "更新出入库明细", description = "更新出入库明细") + public ServerResponseEntity update(@Valid @RequestBody StockBillLogDTO stockBillLogDTO) { + if (Objects.isNull(stockBillLogDTO.getStockBillLogId())) { + throw new LuckException("id不能为空"); + } + stockBillLogService.updateInfo(stockBillLogDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/export_stock_bill_log") + @Operation(summary = "导出出入库明细列表", description = "导出出入库明细列表") + public void exportStockBillLog(StockBillLogDTO stockBillLogDTO, HttpServletResponse response) { + stockBillLogDTO.setSupplierId(AuthUserContext.get().getTenantId()); + List stockBillLogList = stockBillLogService.exportStockBillLogList(stockBillLogDTO); + // 出/入库分开导出 + if (stockBillLogDTO.getType() == 1) { + List excelData = JSON.parseObject( + JSON.toJSONString(stockBillLogList), + new TypeReference>() {} + ); + ExcelUtil.soleExcel(response, excelData, + StockBillOutLogExcelVO.EXCEL_NAME, + StockBillOutLogExcelVO.MERGE_ROW_INDEX, + StockBillOutLogExcelVO.MERGE_COLUMN_INDEX, + StockBillOutLogExcelVO.class + ); + } else { + List excelData = JSON.parseObject( + JSON.toJSONString(stockBillLogList), + new TypeReference>() { + } + ); + ExcelUtil.soleExcel(response, excelData, + StockBillInLogExcelVO.EXCEL_NAME, + StockBillInLogExcelVO.MERGE_ROW_INDEX, + StockBillInLogExcelVO.MERGE_COLUMN_INDEX, + StockBillInLogExcelVO.class + ); + } + } + + @PutMapping("/voided") + @Operation(summary = "作废出入库明细单", description = "作废出入库明细单") + public ServerResponseEntity voided(@RequestParam("stockBillLogId") Long stockBillLogId) { + Long shopId = AuthUserContext.get().getTenantId(); + stockBillLogService.voided(shopId, stockBillLogId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockBillLogItemController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockBillLogItemController.java new file mode 100644 index 0000000..e8f9ba8 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockBillLogItemController.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import com.alibaba.excel.EasyExcel; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.listener.StockBillLogItemExcelListener; +import com.tmerclub.cloud.product.service.StockBillLogItemService; +import com.tmerclub.cloud.product.vo.StockBillLogItemExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogItemVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 出入库商品项 + * + * @author lhd + * @date 2022-06-22 17:14:22 + */ +@RestController("supplierStockBillLogItemController") +@RequestMapping("/s/stock_bill_log_item") +@Tag(name = "供应商出入库商品项") +public class StockBillLogItemController { + + @Autowired + private StockBillLogItemService stockBillLogItemService; + + @GetMapping("/download_model") + @Operation(summary = "下载导入出入库商品项模板", description = "下载导入出入库商品项模板") + public ServerResponseEntity downloadModel(HttpServletResponse response, Integer type) { + stockBillLogItemService.downloadModel(response, type); + return ServerResponseEntity.success(); + } + + @Operation(summary = "批量导入商品项", description = "批量导入商品项") + @PostMapping("/import_excel") + public ServerResponseEntity importExcel(@RequestParam("excelFile") MultipartFile file, @RequestParam("type") Integer type) { + if (file == null) { + throw new LuckException("网络繁忙,请稍后重试"); + } + StockBillLogItemImportVO stockBillLogItemImportVO = new StockBillLogItemImportVO(); + try { + // 错误信息集合 + List errorList = new ArrayList<>(Constant.INITIAL_CAPACITY); + EasyExcel.read(file.getInputStream(), StockBillLogItemImportExcelVO.class, new StockBillLogItemExcelListener(stockBillLogItemService, errorList, type, stockBillLogItemImportVO)).sheet().doRead(); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + return ServerResponseEntity.success(stockBillLogItemImportVO); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockPointSkuController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockPointSkuController.java new file mode 100644 index 0000000..fe2334d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/StockPointSkuController.java @@ -0,0 +1,75 @@ +package com.tmerclub.cloud.product.controller.supplier; + + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.StockPointVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.service.StockPointSkuService; +import com.tmerclub.cloud.product.service.WarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lanhai + */ +@RestController("supplierStockPointController") +@RequestMapping("/s/stock_point_sku") +@Tag(name = "供应商库存点关联商品") +public class StockPointSkuController { + @Autowired + private WarehouseService warehouseService; + @Autowired + private StockPointSkuService stockPointSkuService; + @Autowired + private SpuService spuService; + @Autowired + private SkuService skuService; + + @GetMapping("/page") + @Operation(summary = "分页查询库存点商品信息", description = "分页查询库存点商品信息") + public ServerResponseEntity> pageStockPointSpuSku(PageDTO pageDTO, StockPointSkuDTO spuDTO) { + Long supplierId = AuthUserContext.get().getTenantId(); + spuDTO.setSupplierId(supplierId); + // 判断是否默认仓库,是就获取全部商品 + if (Objects.equals(spuDTO.getType(), 0)) { + Long warehouseId = warehouseService.getDefaultWarehouseByShopId(supplierId, AuthUserContext.get().getSysType()).getWarehouseId(); + spuDTO.setStockPointId(warehouseId); + } + PageVO pageVO = spuService.pageStockPointSpu(pageDTO, spuDTO); + if (CollectionUtil.isEmpty(pageVO.getList())) { + return ServerResponseEntity.success(pageVO); + } + List skuVOList = skuService.listSkuAndStockByStockPointId(spuDTO.getStockPointId(), spuDTO.getInStockPointId()); + Map> skuMap = skuVOList.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + for (SpuVO spuVO : pageVO.getList()) { + spuVO.setSkus(skuMap.get(spuVO.getSpuId())); + } + return ServerResponseEntity.success(pageVO); + } + + @GetMapping("/stock_point") + @Operation(summary = "获取店铺库存点数据") + public ServerResponseEntity pointList() { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + StockPointVO stockPointVO = warehouseService.getWarehousePoint(shopId, sysType); + return ServerResponseEntity.success(stockPointVO); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/WarehouseController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/WarehouseController.java new file mode 100644 index 0000000..de071c3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/controller/supplier/WarehouseController.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.controller.supplier; + +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.product.service.WarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +@RestController("supplierWarehouseController") +@RequestMapping("/s/warehouse") +@Tag(name = "供应商仓库管理") +public class WarehouseController { + + @Autowired + private WarehouseService warehouseService; + + + @GetMapping("/page") + @Operation(summary = "获取仓库列表", description = "分页获取列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, WarehouseDTO warehouseDTO) { + warehouseDTO.setShopId(AuthUserContext.get().getTenantId()); + warehouseDTO.setSysType(AuthUserContext.get().getSysType()); + PageVO warehousePage = warehouseService.page(pageDTO, warehouseDTO); + return ServerResponseEntity.success(warehousePage); + } + + @GetMapping + @Operation(summary = "获取仓库", description = "根据warehouseId获取") + public ServerResponseEntity getByWarehouseId(@RequestParam Long warehouseId) { + WarehouseVO warehouseVO = warehouseService.getByWarehouseId(warehouseId); + if (StrUtil.isNotBlank(warehouseVO.getPhone()) && PrincipalUtil.isMobile(warehouseVO.getPhone())) { + warehouseVO.setPhone(PhoneUtil.hideBetween(warehouseVO.getPhone()).toString()); + } + return ServerResponseEntity.success(warehouseVO); + } + + @PostMapping + @Operation(summary = "保存仓库", description = "保存仓库") + public ServerResponseEntity save(@Valid @RequestBody WarehouseDTO warehouseDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + warehouseDTO.setShopId(shopId); + warehouseDTO.setSysType(sysType); + warehouseDTO.setType(1); + warehouseService.insertWarehouseAndArea(warehouseDTO); + // 清除缓存 + warehouseService.removeWarehouseCache(warehouseDTO.getWarehouseId(), warehouseDTO.getShopId(), warehouseDTO.getSysType()); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新仓库", description = "更新仓库") + public ServerResponseEntity update(@Valid @RequestBody WarehouseDTO warehouseDTO) { + if (Objects.isNull(warehouseDTO.getCityList()) && warehouseDTO.getType() == 1) { + throw new LuckException("请选择供应区域"); + } + UidInfoBO token = AuthUserContext.get(); + warehouseDTO.setShopId(token.getTenantId()); + warehouseDTO.setSysType(token.getSysType()); + warehouseService.updateWarehouseAndArea(warehouseDTO); + // 清除缓存 + warehouseService.removeWarehouseCache(warehouseDTO.getWarehouseId(), warehouseDTO.getShopId(), warehouseDTO.getSysType()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除仓库", description = "根据id删除") + public ServerResponseEntity delete(@RequestParam Long warehouseId) { + WarehouseVO warehouseVO = warehouseService.deleteWarehouseAndArea(warehouseId); + // 删除仓库的缓存 + warehouseService.removeWarehouseCache(warehouseVO.getWarehouseId(), warehouseVO.getShopId(), warehouseVO.getSysType()); + return ServerResponseEntity.success(); + } + + @GetMapping("/list_warehouse_city") + @Operation(summary = "获取店铺所有的供货城市", description = "获取店铺所有的供货城市") + public ServerResponseEntity> getListWarehouseCity(@RequestParam(value = "warehouseId", required = false) Long warehouseId) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + return ServerResponseEntity.success(warehouseService.listWarehouseAreaByShopId(shopId, sysType, warehouseId)); + } + + @GetMapping("/list_warehouse") + @Operation(summary = "获取店铺所有的仓库", description = "获取店铺所有的仓库") + public ServerResponseEntity> getListWarehouse() { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setShopId(AuthUserContext.get().getTenantId()); + warehouseDTO.setSysType(AuthUserContext.get().getSysType()); + return ServerResponseEntity.success(warehouseService.listWarehouse(warehouseDTO)); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrDTO.java new file mode 100644 index 0000000..dd54b17 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrDTO.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import com.tmerclub.cloud.common.product.dto.AttrLangDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 属性信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +public class AttrDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "attr id") + private Long attrId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "多语言列表") + private List attrLangList; + + @Schema(description = "属性描述") + private String desc; + + @Schema(description = "作为搜索参数 0:不需要,1:需要") + private Integer searchType; + + @Schema(description = "属性类型 0:销售属性,1:基本属性") + private Integer attrType; + + @Schema(description = "分类id列表") + private List categoryIds; + + @Schema(description = "属性值列表") + private List attrValues; + + @Schema(description = "属性名称") + private String name; + + @Schema(description = "关联系统类型 1.店铺 2.平台端 3.供应商") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public List getAttrLangList() { + return attrLangList; + } + + public void setAttrLangList(List attrLangList) { + this.attrLangList = attrLangList; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public Integer getAttrType() { + return attrType; + } + + public void setAttrType(Integer attrType) { + this.attrType = attrType; + } + + public Integer getSearchType() { + return searchType; + } + + public void setSearchType(Integer searchType) { + this.searchType = searchType; + } + + public List getAttrValues() { + return attrValues; + } + + public void setAttrValues(List attrValues) { + this.attrValues = attrValues; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "AttrDTO{" + + "attrId=" + attrId + + ", shopId='" + shopId + '\'' + + ", attrLangList='" + attrLangList + '\'' + + ", desc='" + desc + '\'' + + ", attrType=" + attrType + + ", searchType=" + searchType + + ", categoryIds=" + categoryIds + + ", attrValues=" + attrValues + + ", name=" + name + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrValueDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrValueDTO.java new file mode 100644 index 0000000..6995de9 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/AttrValueDTO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import com.tmerclub.cloud.common.product.dto.AttrValueLangDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 属性值信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class AttrValueDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "属性id") + private Long attrValueId; + + @Schema(description = "属性ID") + private Long attrId; + + @Schema(description = "属性值国际化信息") + private List values; + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + + @Override + public String toString() { + return "AttrValueDTO{" + + "attrValueId=" + attrValueId + + ",attrId=" + attrId + + ",values=" + values + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandDTO.java new file mode 100644 index 0000000..7daafec --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandDTO.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 品牌信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class BrandDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "brand_id") + private Long brandId; + + @Schema(description = "品牌多语言列表") + private List brandLangList; + + @Schema(description = "品牌名称") + private String name; + + @Schema(description = "品牌描述") + private String desc; + + @NotNull(message = "logo图片不能为空") + @Schema(description = "品牌logo图片") + private String imgUrl; + + @NotNull(message = "首字母不能为空") + @Schema(description = "检索首字母") + private String firstLetter; + + @NotNull(message = "序号不能为空") + @Schema(description = "排序") + private Integer seq; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "分类") + private List categoryIds; + + @Schema(description = "是否置顶 0:不置顶 1:置顶") + private Integer isTop; + + @Schema(description = "品牌下的商品数量") + private Integer spuCount; + + @Schema(description = "店铺id") + private Long shopId; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public List getBrandLangList() { + return brandLangList; + } + + public void setBrandLangList(List brandLangList) { + this.brandLangList = brandLangList; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getFirstLetter() { + return firstLetter; + } + + public void setFirstLetter(String firstLetter) { + this.firstLetter = firstLetter; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Integer getSpuCount() { + return spuCount; + } + + public void setSpuCount(Integer spuCount) { + this.spuCount = spuCount; + } + + @Override + public String toString() { + return "BrandDTO{" + + "brandId=" + brandId + + ", brandLangList=" + brandLangList + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", firstLetter='" + firstLetter + '\'' + + ", seq=" + seq + + ", status=" + status + + ", categoryIds=" + categoryIds + + ", isTop=" + isTop + + ", spuCount=" + spuCount + + ", shopId=" + shopId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandSigningDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandSigningDTO.java new file mode 100644 index 0000000..896d5ef --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/BrandSigningDTO.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import jakarta.validation.Valid; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/5/13 17:29 + */ +public class BrandSigningDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 签约的平台品牌列表 + */ + @Valid + private List platformBrandList; + + /** + * 签约的自定义品牌列表 + */ + @Valid + private List customizeBrandList; + + public List getPlatformBrandList() { + return platformBrandList; + } + + public void setPlatformBrandList(List platformBrandList) { + this.platformBrandList = platformBrandList; + } + + public List getCustomizeBrandList() { + return customizeBrandList; + } + + public void setCustomizeBrandList(List customizeBrandList) { + this.customizeBrandList = customizeBrandList; + } + + @Override + public String toString() { + return "BrandSigningDTO{" + + "platformBrandList=" + platformBrandList + + ", customizeBrandList=" + customizeBrandList + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryBrandDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryBrandDTO.java new file mode 100644 index 0000000..23e7398 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryBrandDTO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 品牌分类关联信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class CategoryBrandDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long id; + + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "分类id") + private Long categoryId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + @Override + public String toString() { + return "CategoryBrandDTO{" + + "id=" + id + + ",brandId=" + brandId + + ",categoryId=" + categoryId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryDTO.java new file mode 100644 index 0000000..f22fa7b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/CategoryDTO.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 分类信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class CategoryDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "店铺id") + private Long shopId; + + @NotNull(message = "请选择上级分类") + @Schema(description = "父ID") + private Long parentId; + + @Schema(description = "分类多语言列表") + private List categoryLangList; + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "分类描述") + private String desc; + + @Schema(description = "分类地址{parent_id}-{child_id},...") + private String path; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "分类图标") + private String icon; + + @Schema(description = "分类的显示图片") + private String imgUrl; + + @Schema(description = "分类层级 从0开始") + private Integer level; + + @Schema(description = "分类扣率") + private Double deductionRate; + + @Schema(description = "排序") + private Integer seq; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public List getCategoryLangList() { + return categoryLangList; + } + + public void setCategoryLangList(List categoryLangList) { + this.categoryLangList = categoryLangList; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Double getDeductionRate() { + return deductionRate; + } + + public void setDeductionRate(Double deductionRate) { + this.deductionRate = deductionRate; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "CategoryDTO{" + + "categoryId=" + categoryId + + ", shopId=" + shopId + + ", parentId=" + parentId + + ", categoryLangList=" + categoryLangList + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", path='" + path + '\'' + + ", status=" + status + + ", icon='" + icon + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", level=" + level + + ", deductionRate=" + deductionRate + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockDTO.java new file mode 100644 index 0000000..2a307a7 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 库存信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SkuStockDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "库存id") + private Long stockId; + + @Schema(description = "SKU ID") + private Long skuId; + + @Schema(description = "库存") + private Integer stock; + + public Long getStockId() { + return stockId; + } + + public void setStockId(Long stockId) { + this.stockId = stockId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + @Override + public String toString() { + return "StockDTO{" + + "stockId=" + stockId + + ",skuId=" + skuId + + ",stock=" + stock + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockLockDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockLockDTO.java new file mode 100644 index 0000000..7e5c4b3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockLockDTO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 库存锁定信息DTO + * + * @author FrozenWatermelon + * @date 2020-12-22 16:12:10 + */ +public class SkuStockLockDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long id; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "sku id") + private Long skuId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "锁定库存数量") + private Integer count; + + @Schema(description = "状态-1已解锁 0待确定 1已锁定") + private Integer status; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SkuStockLockDTO{" + + "id=" + id + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",orderId=" + orderId + + ",count=" + count + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockZoneDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockZoneDTO.java new file mode 100644 index 0000000..1ae8ed7 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SkuStockZoneDTO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2022-08-17 09:12:37 + */ +public class SkuStockZoneDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分片id") + private Long zoneId; + + @Schema(description = "SKU ID") + private Long skuId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "分片序号") + private Integer zoneNo; + + @Schema(description = "库存") + private Integer stock; + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(Long zoneId) { + this.zoneId = zoneId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getZoneNo() { + return zoneNo; + } + + public void setZoneNo(Integer zoneNo) { + this.zoneNo = zoneNo; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + @Override + public String toString() { + return "SkuStockZoneDTO{" + + "zoneId=" + zoneId + + ", skuId=" + skuId + + ", spuId=" + spuId + + ", zoneNo=" + zoneNo + + ", stock=" + stock + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuCollectionDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuCollectionDTO.java new file mode 100644 index 0000000..39de4c2 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuCollectionDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品收藏信息DTO + * + * @author FrozenWatermelon + * @date 2020-11-21 14:43:16 + */ +public class SpuCollectionDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "收藏表") + private Long id; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "用户id") + private Long userId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "SpuCollectionDTO{" + + "id=" + id + + ",spuId=" + spuId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuCommDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuCommDTO.java new file mode 100644 index 0000000..7272a79 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuCommDTO.java @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品评论DTO + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +public class SpuCommDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long spuCommId; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "商品ID") + private Long spuId; + + @Schema(description = "订单项ID") + private Long orderItemId; + + @Schema(description = "评论用户ID") + private Long userId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "评论内容") + private String content; + + @Schema(description = "掌柜回复") + private String replyContent; + + @Schema(description = "是否回复 0:未回复 1:已回复") + private Integer replySts; + + @Schema(description = "回复时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date replyTime; + + @Schema(description = "回复开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date replyStartTime; + + @Schema(description = "回复结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date replyEndTime; + + @Schema(description = "记录时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @Schema(description = "记录开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createStartTime; + + @Schema(description = "记录结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createEndTime; + + @Schema(description = "IP来源") + private String postip; + + @Schema(description = "商品得分,1-5分") + private Integer score; + + @Schema(description = "店铺评分 1-5分") + private Integer storeScore; + + @Schema(description = "物流评分 1-5分") + private Integer logisticsScore; + + @Schema(description = "有用的计数") + private Integer usefulCounts; + + @Schema(description = "晒图的json字符串") + private String pics; + + @Schema(description = "是否匿名(1:是 0:否)") + private Integer isAnonymous; + + @Schema(description = "是否显示 -1:删除 0:不显示 1:显示 2 审核不通过 3.待审核") + private Integer status; + + @Schema(description = "评价(0好评 1中评 2差评)") + private Integer evaluate; + + public Long getSpuCommId() { + return spuCommId; + } + + public void setSpuCommId(Long spuCommId) { + this.spuCommId = spuCommId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getReplyContent() { + return replyContent; + } + + public void setReplyContent(String replyContent) { + this.replyContent = replyContent; + } + + public Integer getReplySts() { + return replySts; + } + + public void setReplySts(Integer replySts) { + this.replySts = replySts; + } + + public String getPostip() { + return postip; + } + + public void setPostip(String postip) { + this.postip = postip; + } + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + public Integer getStoreScore() { + return storeScore; + } + + public void setStoreScore(Integer storeScore) { + this.storeScore = storeScore; + } + + public Integer getLogisticsScore() { + return logisticsScore; + } + + public void setLogisticsScore(Integer logisticsScore) { + this.logisticsScore = logisticsScore; + } + + public Integer getUsefulCounts() { + return usefulCounts; + } + + public void setUsefulCounts(Integer usefulCounts) { + this.usefulCounts = usefulCounts; + } + + public String getPics() { + return pics; + } + + public void setPics(String pics) { + this.pics = pics; + } + + public Integer getIsAnonymous() { + return isAnonymous; + } + + public void setIsAnonymous(Integer isAnonymous) { + this.isAnonymous = isAnonymous; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getEvaluate() { + return evaluate; + } + + public void setEvaluate(Integer evaluate) { + this.evaluate = evaluate; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Date getReplyStartTime() { + return replyStartTime; + } + + public void setReplyStartTime(Date replyStartTime) { + this.replyStartTime = replyStartTime; + } + + public Date getReplyEndTime() { + return replyEndTime; + } + + public void setReplyEndTime(Date replyEndTime) { + this.replyEndTime = replyEndTime; + } + + public Date getCreateStartTime() { + return createStartTime; + } + + public void setCreateStartTime(Date createStartTime) { + this.createStartTime = createStartTime; + } + + public Date getCreateEndTime() { + return createEndTime; + } + + public void setCreateEndTime(Date createEndTime) { + this.createEndTime = createEndTime; + } + + public Date getReplyTime() { + return replyTime; + } + + public void setReplyTime(Date replyTime) { + this.replyTime = replyTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "SpuCommDTO{" + + "spuCommId=" + spuCommId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", orderItemId=" + orderItemId + + ", userId=" + userId + + ", spuName='" + spuName + '\'' + + ", nickName='" + nickName + '\'' + + ", content='" + content + '\'' + + ", replyContent='" + replyContent + '\'' + + ", replySts=" + replySts + + ", replyTime=" + replyTime + + ", replyStartTime=" + replyStartTime + + ", replyEndTime=" + replyEndTime + + ", createTime=" + createTime + + ", createStartTime=" + createStartTime + + ", createEndTime=" + createEndTime + + ", postip='" + postip + '\'' + + ", score=" + score + + ", storeScore=" + storeScore + + ", logisticsScore=" + logisticsScore + + ", usefulCounts=" + usefulCounts + + ", pics='" + pics + '\'' + + ", isAnonymous=" + isAnonymous + + ", status=" + status + + ", evaluate=" + evaluate + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuConsignmentChangeDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuConsignmentChangeDTO.java new file mode 100644 index 0000000..91f816d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuConsignmentChangeDTO.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家代销商品基本信息相对于供应商品是否改变DTO + * + * @author FrozenWatermelon + * @date 2022-08-11 22:21:10 + */ +public class SpuConsignmentChangeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "代销商品基本信息是否已更新表id") + private Integer consignmentChangeId; + + @Schema(description = "代销商品id") + private Integer spuId; + + @Schema(description = "代销商品名称是否已更改 0未更改,1已更改") + private Integer nameChange; + + @Schema(description = "代销图片是否已更改 0未更改,1已更改") + private Integer imageChange; + + @Schema(description = "代销商品卖点是否已更改, 0未更改,1已更改") + private Integer sellingPointChange; + + @Schema(description = "代销商品视频是否已更改, 0未更改,1已更改") + private Integer videoChange; + + @Schema(description = "代销商品计量单位是否已更改,0未更改,1已更改") + private Integer measureUnitChange; + + @Schema(description = "代销商品品牌是否已更改,0未更改,1已更改") + private Integer brandChange; + + @Schema(description = "代销商品详情是否已更改,0未更改,1已更改") + private Integer detailChange; + + public Integer getConsignmentChangeId() { + return consignmentChangeId; + } + + public void setConsignmentChangeId(Integer consignmentChangeId) { + this.consignmentChangeId = consignmentChangeId; + } + + public Integer getSpuId() { + return spuId; + } + + public void setSpuId(Integer spuId) { + this.spuId = spuId; + } + + public Integer getNameChange() { + return nameChange; + } + + public void setNameChange(Integer nameChange) { + this.nameChange = nameChange; + } + + public Integer getImageChange() { + return imageChange; + } + + public void setImageChange(Integer imageChange) { + this.imageChange = imageChange; + } + + public Integer getSellingPointChange() { + return sellingPointChange; + } + + public void setSellingPointChange(Integer sellingPointChange) { + this.sellingPointChange = sellingPointChange; + } + + public Integer getVideoChange() { + return videoChange; + } + + public void setVideoChange(Integer videoChange) { + this.videoChange = videoChange; + } + + public Integer getMeasureUnitChange() { + return measureUnitChange; + } + + public void setMeasureUnitChange(Integer measureUnitChange) { + this.measureUnitChange = measureUnitChange; + } + + public Integer getBrandChange() { + return brandChange; + } + + public void setBrandChange(Integer brandChange) { + this.brandChange = brandChange; + } + + public Integer getDetailChange() { + return detailChange; + } + + public void setDetailChange(Integer detailChange) { + this.detailChange = detailChange; + } + + @Override + public String toString() { + return "SpuConsignmentChangeDTO{" + + "consignmentChangeId=" + consignmentChangeId + + ",spuId=" + spuId + + ",nameChange=" + nameChange + + ",imageChange=" + imageChange + + ",sellingPointChange=" + sellingPointChange + + ",videoChange=" + videoChange + + ",measureUnitChange=" + measureUnitChange + + ",brandChange=" + brandChange + + ",detailChange=" + detailChange + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuPageSearchDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuPageSearchDTO.java new file mode 100644 index 0000000..86ac909 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuPageSearchDTO.java @@ -0,0 +1,406 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * spu信息DTO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuPageSearchDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "spuId") + private Long spuId; + + @Schema(description = "店铺id") + private Long shopId; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "品牌ID") + private Long brandId; + + @Schema(description = "商家一级分类id") + private Long shopPrimaryCategoryId; + + @Schema(description = "商家二级分类id") + private Long shopSecondaryCategoryId; + + @Schema(description = "平台一级分类id") + private Long primaryCategoryId; + + @Schema(description = "平台二级分类id") + private Long secondaryCategoryId; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "spu名称") + private String name; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "商品类型(0普通商品 1拼团 2秒杀 3积分)") + private Integer spuType; + + @Schema(description = "spuId列表(商品上下架:批量操作时,用此参数)(批量处理参数)") + private List spuIds; + + @Schema(description = "商品状态: 0.全部 1.销售中 2.已售罄 3.已下架 ") + private Integer spuStatus; + @Schema(description = "商品类别 0.实物商品 1. 虚拟商品 2.组合商品") + private Integer spuMold; + + @Schema(description = "最低价") + private Long minPrice; + + @Schema(description = "最高价") + private Long maxPrice; + + @Schema(description = "最低销量") + private Long minSaleNum; + + @Schema(description = "最高销量") + private Long maxSaleNum; + + @Schema(description = "商品编码") + private String partyCode; + + @Schema(description = "当前价排序 0:倒序 1:顺序") + private Integer priceFeeSort; + + @Schema(description = "市场价排序 0:倒序 1:顺序") + private Integer marketPriceFeeSort; + + @Schema(description = "销量排序 0:倒序 1:顺序") + private Integer saleNumSort; + + @Schema(description = "库存排序 0:倒序 1:顺序") + private Integer stockSort; + + @Schema(description = "序号排序 0:倒序 1:顺序") + private Integer seqSort; + + @Schema(description = "创建时间排序 0:倒序 1:顺序") + private Integer createTimeSort; + /** + * 搜索类型-DataType枚举类 + */ + @Schema(description = "搜索类型") + private Integer dataType; + + @Schema(description = "供应商商品类型 0.否 1.是 2.商家代销") + private Integer supplierSpuType; + + @Schema(description = "是否已导入供应商商品 0 未导入 1 已导入") + private Integer isCommission; + + @Schema(description = "供应商商品发货方式 1.供应商发货 2.仓库发货") + private Integer supplierDeliveryType; + + @Schema(description = "商品来源 0商家 1供应商 为空则不筛选") + private Integer spuOrigin; + + public Integer getSpuOrigin() { + return spuOrigin; + } + + public void setSpuOrigin(Integer spuOrigin) { + this.spuOrigin = spuOrigin; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsCommission() { + return isCommission; + } + + public void setIsCommission(Integer isCommission) { + this.isCommission = isCommission; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public Long getMinPrice() { + return minPrice; + } + + public void setMinPrice(Long minPrice) { + this.minPrice = minPrice; + } + + public Long getMaxPrice() { + return maxPrice; + } + + public void setMaxPrice(Long maxPrice) { + this.maxPrice = maxPrice; + } + + public Long getMinSaleNum() { + return minSaleNum; + } + + public void setMinSaleNum(Long minSaleNum) { + this.minSaleNum = minSaleNum; + } + + public Long getMaxSaleNum() { + return maxSaleNum; + } + + public void setMaxSaleNum(Long maxSaleNum) { + this.maxSaleNum = maxSaleNum; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getPriceFeeSort() { + return priceFeeSort; + } + + public void setPriceFeeSort(Integer priceFeeSort) { + this.priceFeeSort = priceFeeSort; + } + + public Integer getMarketPriceFeeSort() { + return marketPriceFeeSort; + } + + public void setMarketPriceFeeSort(Integer marketPriceFeeSort) { + this.marketPriceFeeSort = marketPriceFeeSort; + } + + public Integer getSaleNumSort() { + return saleNumSort; + } + + public void setSaleNumSort(Integer saleNumSort) { + this.saleNumSort = saleNumSort; + } + + public Integer getStockSort() { + return stockSort; + } + + public void setStockSort(Integer stockSort) { + this.stockSort = stockSort; + } + + public Integer getSeqSort() { + return seqSort; + } + + public void setSeqSort(Integer seqSort) { + this.seqSort = seqSort; + } + + public Integer getCreateTimeSort() { + return createTimeSort; + } + + public void setCreateTimeSort(Integer createTimeSort) { + this.createTimeSort = createTimeSort; + } + + public Long getShopPrimaryCategoryId() { + return shopPrimaryCategoryId; + } + + public void setShopPrimaryCategoryId(Long shopPrimaryCategoryId) { + this.shopPrimaryCategoryId = shopPrimaryCategoryId; + } + + public Long getShopSecondaryCategoryId() { + return shopSecondaryCategoryId; + } + + public void setShopSecondaryCategoryId(Long shopSecondaryCategoryId) { + this.shopSecondaryCategoryId = shopSecondaryCategoryId; + } + + public Long getPrimaryCategoryId() { + return primaryCategoryId; + } + + public void setPrimaryCategoryId(Long primaryCategoryId) { + this.primaryCategoryId = primaryCategoryId; + } + + public Long getSecondaryCategoryId() { + return secondaryCategoryId; + } + + public void setSecondaryCategoryId(Long secondaryCategoryId) { + this.secondaryCategoryId = secondaryCategoryId; + } + + public Integer getDataType() { + return dataType; + } + + public void setDataType(Integer dataType) { + this.dataType = dataType; + } + + @Override + public String toString() { + return "SpuPageSearchDTO{" + + "spuId=" + spuId + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", brandId=" + brandId + + ", shopPrimaryCategoryId=" + shopPrimaryCategoryId + + ", shopSecondaryCategoryId=" + shopSecondaryCategoryId + + ", primaryCategoryId=" + primaryCategoryId + + ", secondaryCategoryId=" + secondaryCategoryId + + ", categoryId=" + categoryId + + ", name='" + name + '\'' + + ", status=" + status + + ", spuType=" + spuType + + ", spuIds=" + spuIds + + ", spuStatus=" + spuStatus + + ", spuMold=" + spuMold + + ", minPrice=" + minPrice + + ", maxPrice=" + maxPrice + + ", minSaleNum=" + minSaleNum + + ", maxSaleNum=" + maxSaleNum + + ", partyCode='" + partyCode + '\'' + + ", priceFeeSort=" + priceFeeSort + + ", marketPriceFeeSort=" + marketPriceFeeSort + + ", saleNumSort=" + saleNumSort + + ", stockSort=" + stockSort + + ", seqSort=" + seqSort + + ", createTimeSort=" + createTimeSort + + ", dataType=" + dataType + + ", supplierSpuType=" + supplierSpuType + + ", isCommission=" + isCommission + + ", supplierDeliveryType=" + supplierDeliveryType + + ", spuOrigin=" + spuOrigin + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuPriceLogDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuPriceLogDTO.java new file mode 100644 index 0000000..08fb9c0 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuPriceLogDTO.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品调价记录DTO + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +public class SpuPriceLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品调价记录id") + private Long id; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "规格id") + private Long skuId; + + @Schema(description = "原供货价") + private Long beforePrice; + + @Schema(description = "现供货价") + private Long afterPrice; + + @Schema(description = "差价") + private Long price; + + + @Schema(description = "搜索商品关键词(商品名称或商品编码)") + private String prodKey; + + @Schema(description = "调价开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createStartTime; + + @Schema(description = "调价结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createEndTime; + + @Schema(description = "排序:1.SKU编码正序,2.SKU编码倒序,3原供货价正序,4原供货价倒序,5调整后供货价正序,6调整后供货价倒序 7差价正序 8差价倒序") + private Integer sort; + + + @Schema(description = "供应商id") + private Long supplierId; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public String getProdKey() { + return prodKey; + } + + public void setProdKey(String prodKey) { + this.prodKey = prodKey; + } + + public Date getCreateStartTime() { + return createStartTime; + } + + public void setCreateStartTime(Date createStartTime) { + this.createStartTime = createStartTime; + } + + public Date getCreateEndTime() { + return createEndTime; + } + + public void setCreateEndTime(Date createEndTime) { + this.createEndTime = createEndTime; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getBeforePrice() { + return beforePrice; + } + + public void setBeforePrice(Long beforePrice) { + this.beforePrice = beforePrice; + } + + public Long getAfterPrice() { + return afterPrice; + } + + public void setAfterPrice(Long afterPrice) { + this.afterPrice = afterPrice; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "SpuPriceLogDTO{" + + "id=" + id + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", beforePrice=" + beforePrice + + ", afterPrice=" + afterPrice + + ", price=" + price + + ", prodKey='" + prodKey + '\'' + + ", createStartTime=" + createStartTime + + ", createEndTime=" + createEndTime + + ", sort=" + sort + + ", supplierId=" + supplierId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuSupplierChangeLogDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuSupplierChangeLogDTO.java new file mode 100644 index 0000000..d033450 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuSupplierChangeLogDTO.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品供应商变更记录DTO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class SpuSupplierChangeLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品供应商变更记录id") + private Long spuChangeId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "变更类型 1.商品上架 2.商品下架 3.代销sku信息变更 4.新增sku") + private Integer changeType; + + @Schema(description = "备注") + private String remarks; + + public Long getSpuChangeId() { + return spuChangeId; + } + + public void setSpuChangeId(Long spuChangeId) { + this.spuChangeId = spuChangeId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getChangeType() { + return changeType; + } + + public void setChangeType(Integer changeType) { + this.changeType = changeType; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SpuSupplierChangeLogDTO{" + + "spuChangeId=" + spuChangeId + + ",spuId=" + spuId + + ",changeType=" + changeType + + ",remarks=" + remarks + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuTagReferenceDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuTagReferenceDTO.java new file mode 100644 index 0000000..07cdd1c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/SpuTagReferenceDTO.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品分组标签关联信息DTO + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public class SpuTagReferenceDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "分组引用id") + private Long referenceId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "标签id") + private Long tagId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "状态(1:正常,0:删除)") + private Integer status; + + @Schema(description = "商品名称") + private String spuName; + + /** + * 排序 + */ + private Integer seq; + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getReferenceId() { + return referenceId; + } + + public void setReferenceId(Long referenceId) { + this.referenceId = referenceId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + @Override + public String toString() { + return "SpuTagReferenceDTO{" + + "referenceId=" + referenceId + + ", shopId=" + shopId + + ", tagId=" + tagId + + ", spuId=" + spuId + + ", status=" + status + + ", spuName='" + spuName + '\'' + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonDTO.java new file mode 100644 index 0000000..bcc3b15 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonDTO.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库原因DTO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long stockChangeReasonId; + + @Schema(description = "出入库类别,1:出库 2:入库") + private Integer type; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "状态,1:启用 0:禁用 -1:删除") + private Integer status; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "是否系统内置") + private Integer sysSet; + + @Schema(description = "原因") + private String reason; + + @Schema(description = "系统类型") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getSysSet() { + return sysSet; + } + + public void setSysSet(Integer sysSet) { + this.sysSet = sysSet; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "StockChangeReasonDTO{" + + "stockChangeReasonId=" + stockChangeReasonId + + ", type=" + type + + ", shopId=" + shopId + + ", status=" + status + + ", remark='" + remark + '\'' + + ", sysSet=" + sysSet + + ", reason='" + reason + '\'' + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonLangDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonLangDTO.java new file mode 100644 index 0000000..8f56328 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/StockChangeReasonLangDTO.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库原因-国际化DTO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonLangDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long stockChangeReasonId; + + @Schema(description = "语言 0.中文 1.英文") + private Integer lang; + + @Schema(description = "原因") + private String reason; + + @Schema(description = "备注") + private String remark; + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "StockChangeReasonLangDTO{" + + "stockChangeReasonId=" + stockChangeReasonId + + ",lang=" + lang + + ",reason=" + reason + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/TakeStockSpuDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/TakeStockSpuDTO.java new file mode 100644 index 0000000..69d365e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/TakeStockSpuDTO.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 盘点商品列表DTO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class TakeStockSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "盘点商品id") + private Long takeStockSpuId; + + @Schema(description = "盘点id") + private Long takeStockId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "sku_id") + private Long skuId; + + @Schema(description = "账面库存") + private Integer stocks; + + @Schema(description = "实盘库存") + private Integer totalStock; + + @Schema(description = "盈亏类型 0盘平 1盘盈 2盘亏 -1异常") + private Integer ioType; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "异常原因 1.删除商品 2.盘点期间有库存变动 3.其他") + private Integer exceptionReason; + + public Long getTakeStockSpuId() { + return takeStockSpuId; + } + + public void setTakeStockSpuId(Long takeStockSpuId) { + this.takeStockSpuId = takeStockSpuId; + } + + public Long getTakeStockId() { + return takeStockId; + } + + public void setTakeStockId(Long takeStockId) { + this.takeStockId = takeStockId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getExceptionReason() { + return exceptionReason; + } + + public void setExceptionReason(Integer exceptionReason) { + this.exceptionReason = exceptionReason; + } + + @Override + public String toString() { + return "TakeStockSpuDTO{" + + "takeStockSpuId=" + takeStockSpuId + + ",takeStockId=" + takeStockId + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",stocks=" + stocks + + ",totalStock=" + totalStock + + ",ioType=" + ioType + + ",remark=" + remark + + ",exceptionReason=" + exceptionReason + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/WarehouseAreaDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/WarehouseAreaDTO.java new file mode 100644 index 0000000..b7108e1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/WarehouseAreaDTO.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 仓库项和供货城市关联信息DTO + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public class WarehouseAreaDTO { + private static final long serialVersionUID = 1L; + + @Schema(description = "") + private Long warehouseAreaId; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "城市id") + private Long areaId; + + public Long getWarehouseAreaId() { + return warehouseAreaId; + } + + public void setWarehouseAreaId(Long warehouseAreaId) { + this.warehouseAreaId = warehouseAreaId; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + @Override + public String toString() { + return "WarehouseAreaDTO{" + + "warehouseAreaId=" + warehouseAreaId + + ", warehouseId=" + warehouseId + + ", areaId=" + areaId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/CartComboMatchSpuDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/CartComboMatchSpuDTO.java new file mode 100644 index 0000000..d70179d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/CartComboMatchSpuDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto.shopcart; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xxw + * @date 2022/8/26 10:04 + */ +public class CartComboMatchSpuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "套餐搭配商品id") + private Long spuId; + + @Schema(description = "套餐搭配商品skuId") + private Long skuId; + + @Schema(description = "套餐搭配商品旧skuId") + private Long oldSkuId; + + @Schema(description = "数量") + private Integer count; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getOldSkuId() { + return oldSkuId; + } + + public void setOldSkuId(Long oldSkuId) { + this.oldSkuId = oldSkuId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "CartComboMatchSpuDTO{" + + "spuId=" + spuId + + ", skuId=" + skuId + + ", oldSkuId=" + oldSkuId + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/ChangeShopCartItemDTO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/ChangeShopCartItemDTO.java new file mode 100644 index 0000000..c15a916 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/dto/shopcart/ChangeShopCartItemDTO.java @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.dto.shopcart; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +public class ChangeShopCartItemDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "购物车ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long shopCartItemId; + + @NotNull(message = "商品ID不能为空") + @Schema(description = "商品ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long spuId; + + @Schema(description = "旧的skuid 如果传过来说明在变更sku", requiredMode = Schema.RequiredMode.REQUIRED) + private Long oldSkuId; + + @NotNull(message = "skuId不能为空") + @Schema(description = "skuId", requiredMode = Schema.RequiredMode.REQUIRED) + private Long skuId; + + @Schema(description = "店铺ID,前端不用传该字段") + private Long shopId; + + @NotNull(message = "商品个数不能为空") + @Schema(description = "商品个数", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer count; + + @Schema(description = "分销推广人id") + private Long distributionUserId; + + @Schema(description = "商品是否勾选 true:勾选 ") + private Boolean isCheck; + + @Schema(description = "满减活动id") + private Long discountId; + + @Schema(description = "套餐id") + private Long comboId; + + @Schema(description = "搭配商品列表") + @Valid + private List cartComboMatchSpuDTOS; + + @Schema(description = "主购物车id(套餐)") + private Long parentCartItemId; + + @Schema(description = "搭配商品skuId") + private List matchSkuIdList; + + @Schema(description = "主商品起搭数量") + private Integer comboMainLeastNum; + + @Schema(description = "是否为主商品(套餐)1 是 -1 搭配商品") + private Integer isMainProd; + + @Schema(description = "套餐数量") + private Integer comboCount; + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public Integer getIsMainProd() { + return isMainProd; + } + + public void setIsMainProd(Integer isMainProd) { + this.isMainProd = isMainProd; + } + + public Integer getComboMainLeastNum() { + return comboMainLeastNum; + } + + public void setComboMainLeastNum(Integer comboMainLeastNum) { + this.comboMainLeastNum = comboMainLeastNum; + } + + public List getMatchSkuIdList() { + return matchSkuIdList; + } + + public void setMatchSkuIdList(List matchSkuIdList) { + this.matchSkuIdList = matchSkuIdList; + } + + public Long getParentCartItemId() { + return parentCartItemId; + } + + public void setParentCartItemId(Long parentCartItemId) { + this.parentCartItemId = parentCartItemId; + } + + public List getCartComboMatchSpuDTOS() { + return cartComboMatchSpuDTOS; + } + + public void setCartComboMatchSpuDTOS(List cartComboMatchSpuDTOS) { + this.cartComboMatchSpuDTOS = cartComboMatchSpuDTOS; + } + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Long getShopCartItemId() { + return shopCartItemId; + } + + public void setShopCartItemId(Long shopCartItemId) { + this.shopCartItemId = shopCartItemId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + public Boolean getCheck() { + return isCheck; + } + + public void setCheck(Boolean check) { + isCheck = check; + } + + public Long getOldSkuId() { + return oldSkuId; + } + + public void setOldSkuId(Long oldSkuId) { + this.oldSkuId = oldSkuId; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + @Override + public String toString() { + return "ChangeShopCartItemDTO{" + + "shopCartItemId=" + shopCartItemId + + ", spuId=" + spuId + + ", oldSkuId=" + oldSkuId + + ", skuId=" + skuId + + ", shopId=" + shopId + + ", count=" + count + + ", distributionUserId=" + distributionUserId + + ", isCheck=" + isCheck + + ", discountId=" + discountId + + ", comboId=" + comboId + + ", cartComboMatchSpuDTOS=" + cartComboMatchSpuDTOS + + ", parentCartItemId=" + parentCartItemId + + ", matchSkuIdList=" + matchSkuIdList + + ", comboMainLeastNum=" + comboMainLeastNum + + ", isMainProd=" + isMainProd + + ", comboCount=" + comboCount + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/CategoryFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/CategoryFeignController.java new file mode 100644 index 0000000..e37a319 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/CategoryFeignController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.CategoryFeignClient; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.CategoryService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Set; + +/** + * @author lhd + * @date 2020/12/23 + */ +@DubboService +public class CategoryFeignController implements CategoryFeignClient { + + @Autowired + private CategoryService categoryService; + + @Override + public ServerResponseEntity getByCategoryId(Long categoryId) { + try { + return ServerResponseEntity.success(categoryService.getById(categoryId)); + } catch (Exception e) { + return ServerResponseEntity.showFailMsg(e.getMessage()); + } + } + + @Override + public ServerResponseEntity> getByCategoryIds(Set categoryIds) { + return ServerResponseEntity.success(categoryService.listByCategoryIds(categoryIds)); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/ProductFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/ProductFeignController.java new file mode 100644 index 0000000..e10de98 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/ProductFeignController.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.constant.ShopStatus; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.product.feign.ProductFeignClient; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SpuEsSearchService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.service.SpuTagReferenceService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/27 + */ +@DubboService +public class ProductFeignController implements ProductFeignClient { + + @Autowired + private SpuService spuService; + @Autowired + private SkuService skuService; + @Autowired + private SpuEsSearchService spuEsSearchService; + @Autowired + private SpuTagReferenceService spuTagReferenceService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + + @Override + public ServerResponseEntity loadEsProductBO(Long spuId) { + EsProductBO esProductBO = spuEsSearchService.loadEsProductBO(spuId); + List spuTagIds = spuTagReferenceService.tagListBySpuId(spuId); + if (CollUtil.isNotEmpty(spuTagIds)) { + esProductBO.setTagIds(spuTagIds); + } + //如果是供应商品 获取供应商名称 + if (Objects.equals(esProductBO.getSupplierSpuType(), SupplierSpuType.YES.value())) { + ServerResponseEntity supplierEntity = supplierDetailFeignClient.getSupplierBySupplierId(esProductBO.getSupplierId()); + if (!supplierEntity.isSuccess()) { + throw new LuckException(supplierEntity.getMsg()); + } + SupplierDetailBO supplier = supplierEntity.getData(); + esProductBO.setSupplierName(supplier.getSupplierName()); + } else { + // 获取店铺信息 + if (!Objects.equals(esProductBO.getShopId(), Constant.ZERO_LONG)) { + ServerResponseEntity shopDetailResponse = shopDetailFeignClient.getShopByShopId(esProductBO.getShopId()); + if (!shopDetailResponse.isSuccess()) { + throw new LuckException(shopDetailResponse.getMsg()); + } + EsShopDetailBO shopDetail = shopDetailResponse.getData(); + if (esProductBO.getAppDisplay() && !Objects.equals(shopDetail.getShopStatus(), ShopStatus.OPEN.value())) { + esProductBO.setAppDisplay(Boolean.FALSE); + } + esProductBO.setShopName(shopDetail.getShopName()); + esProductBO.setShopImg(shopDetail.getShopLogo()); + esProductBO.setShopType(shopDetail.getType()); + } + } + if (Objects.isNull(esProductBO.getCommentNum())) { + esProductBO.setCommentNum(0); + } + if (Objects.isNull(esProductBO.getSaleNum())) { + esProductBO.setSaleNum(0); + } + if (CollUtil.isEmpty(esProductBO.getPartyCodes())) { + esProductBO.setPartyCodes(null); + } + if (CollUtil.isEmpty(esProductBO.getModelIds())) { + esProductBO.setModelIds(null); + } + return ServerResponseEntity.success(esProductBO); + } + + @Override + public ServerResponseEntity> getSpuIdsByShopCategoryIds(List shopCategoryIds) { + return getSpuIdsBySpuUpdateDTO(shopCategoryIds, null, null, null); + } + + @Override + public ServerResponseEntity> getSpuIdsByCategoryIds(List categoryIds) { + return getSpuIdsBySpuUpdateDTO(null, categoryIds, null, null); + } + + @Override + public ServerResponseEntity> getSpuIdsByBrandId(Long brandId) { + return getSpuIdsBySpuUpdateDTO(null, null, brandId, null); + } + + + @Override + public ServerResponseEntity> listSpuIdsBySupplierIdAndSupplierSpuType(Long supplierId, String createTime, Integer supplierSpuType) { + Date spuCreateTime = Objects.nonNull(createTime) ? DateUtil.parse(createTime, "yyyy-MM-dd") : null; + return ServerResponseEntity.success(spuService.getSpuIdsBySupplierIdAndSupplierSpuType(supplierId, spuCreateTime, supplierSpuType)); + } + + @Override + public List listMerchantSpuIdsBySupplierId(Long supplierId) { + return spuService.listMerchantSpuIdsBySupplierId(supplierId); + } + + @Override + public ServerResponseEntity> listSpuBySpuIds(List spuIds) { + return ServerResponseEntity.success(spuService.listSpuDetailBySpuIds(spuIds)); + } + + @Override + public ServerResponseEntity> getSpuTagBySpuId(Long spuId) { + return ServerResponseEntity.success(spuTagReferenceService.tagListBySpuId(spuId)); + } + + @Override + public void handleStatusChange(Long spuId) { + SpuVO spuVO = spuService.getBySpuId(spuId); + if (!StatusEnum.offlineStatus(spuVO.getStatus())) { + spuService.handleStatusChange(Collections.singletonList(spuId)); + } + skuService.changeSkuStockStatusBySpuId(spuId, spuVO.getStatus()); + } + + /** + * 获取spuId列表 + * + * @param shopCategoryIds 店铺分类id列表 + * @param categoryIds 平台分类Id列表 + * @param brandId 品牌id + * @param shopId 店铺id + * @return + */ + public ServerResponseEntity> getSpuIdsBySpuUpdateDTO(List shopCategoryIds, List categoryIds, Long brandId, Long shopId) { + List spuIds = spuService.getSpuIdsBySpuUpdateDTO(shopCategoryIds, categoryIds, brandId, shopId); + return ServerResponseEntity.success(spuIds); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/ShopCartFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/ShopCartFeignController.java new file mode 100644 index 0000000..97978fa --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/ShopCartFeignController.java @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.product.feign.ShopCartFeignClient; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.dto.DvyTypeDTO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.service.ShopCartItemService; +import com.tmerclub.cloud.product.service.ShopCartService; +import com.tmerclub.cloud.product.service.SkuComboService; +import com.tmerclub.cloud.product.service.WarehouseService; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class ShopCartFeignController implements ShopCartFeignClient { + + private static final Logger log = LoggerFactory.getLogger(ShopCartFeignController.class); + + @Autowired + private ShopCartService shopCartService; + @Autowired + private ShopCartItemService shopCartItemService; + @Autowired + private SkuComboService skuComboService; + @Autowired + private WarehouseService warehouseService; + + + + @Override + public List handleShopCartItem(List shopCartItems, List dvyTypes, Boolean isShopCartOrder) { + + // 组装购物车项数据 + shopCartItemService.assembleShopCartItem(shopCartItems, null, isShopCartOrder); + shopCartItems.forEach(shopCartItemVO -> shopCartItemVO.setIsChecked(1)); + // 处理组合商品信息 + handleComboShopCart(shopCartItems); + + // 组装赠品信息 - 判断库存及插入赠品数据 + shopCartItemService.buildItemGiveawayInfo(shopCartItems); + + // 插入店铺仓库列表 + this.setWarehouseList(shopCartItems, dvyTypes); + + return shopCartItems; + } + + + @Override + public List getCheckedShopCartItems(Long addrId, List dvyTypes) { + List shopCartItems = shopCartService.getUserShopCartItems(); + handleShopCartItem(shopCartItems, dvyTypes, Boolean.TRUE); + return shopCartItems; + } + + private void handleComboShopCart(List shopCartItems) { + List comboShopCartItemList = shopCartItems.stream().filter(shopCartItemVO -> Objects.equals(shopCartItemVO.getMold(), SpuMold.COMBO.value())).toList(); + if(CollectionUtil.isEmpty(comboShopCartItemList)){ + return; + } + List skuIds = new ArrayList<>(); + for (ShopCartItemVO shopCartItemVO : comboShopCartItemList) { + if (Objects.nonNull(shopCartItemVO.getSupplierDeliveryType()) && Objects.equals(shopCartItemVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + skuIds.add(shopCartItemVO.getSupplierSkuId()); + } else { + skuIds.add(shopCartItemVO.getSkuId()); + } + } + List comboShopItems = skuComboService.getCombShopItemsAndBySkuIds(skuIds); + // 放入组合的所有商品信息 + Map> skuComboMap = comboShopItems.stream().collect(Collectors.groupingBy(ShopCartItemVO::getMainComboSkuId)); + for (ShopCartItemVO mainShopCartItem : shopCartItems) { + long skuId = mainShopCartItem.getSkuId(); + // 供应商商品,商家代销的组合商品,找到对应的供应商的skuId进行处理 + if (Objects.nonNull(mainShopCartItem.getSupplierDeliveryType()) && Objects.equals(mainShopCartItem.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + skuId = mainShopCartItem.getSupplierSkuId(); + } + if(!skuComboMap.containsKey(skuId)) { + continue; + } + List shopCartItemList = skuComboMap.get(skuId); + + for (ShopCartItemVO shopCartItemVO : shopCartItemList) { + shopCartItemVO.setMainComboSpuId(mainShopCartItem.getSpuId()); + shopCartItemVO.setCartItemId(mainShopCartItem.getCartItemId()); + shopCartItemVO.setComboCount(mainShopCartItem.getCount()); + shopCartItemVO.setShopId(mainShopCartItem.getShopId()); + shopCartItemVO.setIsChecked(1); + } + shopCartItemService.assembleShopCartItem(shopCartItemList,mainShopCartItem, null); + mainShopCartItem.setComboShopCartItems(shopCartItemList); + } + } + + + @Override + public void deleteItem(List shopCartItemIds) { + Long userId = AuthUserContext.get().getUserId(); + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, shopCartItemIds); + } + + @Override + public ServerResponseEntity updateIsClosedByShopIds(List shopIds, Integer isClose) { + shopCartService.updateIsClosedByShopIds(shopIds, isClose); + return ServerResponseEntity.success(); + } + + @Override + public void deleteCartByComboUpdate(List comboIdList, Long spuId, Long skuId) { + shopCartService.deleteCartByComboUpdate(comboIdList, spuId, skuId); + } + + @Override + public ServerResponseEntity deleteCartByComboIdAndSpuIdS(Long comboId, List spuIdList) { + shopCartService.deleteCartByComboIdAndSpuIdS(comboId, spuIdList); + return ServerResponseEntity.success(); + } + + @Override + public void deleteCartByComboIdAndSkuIdS(Long comboId, List spuIdList) { + shopCartService.deleteCartByComboIdAndSkuIdS(comboId, spuIdList); + } + + @Override + public ServerResponseEntity updateCartSpuPriceByComboIdAndSkuId(Long comboId, Long skuId, Long price) { + shopCartService.updateCartSpuPriceByComboIdAndSkuId(comboId, skuId, price); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> skuIdListByComboMainSkuId(List skuId) { + List skuIdList = shopCartService.skuIdListByComboMainSkuId(skuId); + return ServerResponseEntity.success(skuIdList); + } + + @Override + public void updateCartComboCount(Long comboId, Long spuId, Integer count) { + shopCartService.updateCartComboCount(comboId, spuId, count); + } + + @Override + public void deleteShopCartItemsByShopCartItemIds(Long userId, List shopCartItemIds) { + log.info("提交订单,删除购物车商品.....用户id:{}, 购物车项id:{}", userId, shopCartItemIds); + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, shopCartItemIds); + } + + + + + private void setWarehouseList(List shopCartItems, List dvyTypes) { + if (CollUtil.isEmpty(dvyTypes)) { + return; + } + // 获取快递配送的店铺Id列表 + List dvyShopIds = dvyTypes.stream() + .filter(dvyTypeDTO -> Objects.equals(dvyTypeDTO.getDvyType(), DeliveryType.DELIVERY.value())).map(DvyTypeDTO::getShopId).toList(); + // Map + Map> warehouseMap = new HashMap<>(dvyShopIds.size() * 2); + for (ShopCartItemVO shopCartItem : shopCartItems) { + // 实物商品,且只有一个默认仓库,也不需要获取店铺仓库列表 + if (notWarehouse(shopCartItem, dvyShopIds)) { + continue; + } + shopCartItem.setWarehouseList(this.listWarehouse(warehouseMap, shopCartItem)); + // 赠品列表 + if (CollUtil.isNotEmpty(shopCartItem.getGiveawayShopCartItemList())) { + for (ShopCartItemVO giveawayShopCartItem : shopCartItem.getGiveawayShopCartItemList()) { + if (realOnlyOnePoint(giveawayShopCartItem)) { + continue; + } + giveawayShopCartItem.setWarehouseList(this.listWarehouse(warehouseMap, giveawayShopCartItem)); + } + } + // 组合sku列表 + if (CollUtil.isNotEmpty(shopCartItem.getComboShopCartItems())) { + for (ShopCartItemVO comboShopCartItem : shopCartItem.getComboShopCartItems()) { + if (realOnlyOnePoint(comboShopCartItem)) { + continue; + } + comboShopCartItem.setWarehouseList(this.listWarehouse(warehouseMap, comboShopCartItem)); + } + } + } + } + + private List listWarehouse(Map> shopMap, ShopCartItemVO shopCartItem) { + Long id; + SysTypeEnum sysTypeEnum; + // 供应商配送,就填供应商id + if (Objects.equals(shopCartItem.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + id = shopCartItem.getSupplierId(); + sysTypeEnum = SysTypeEnum.SUPPLIER; + } else { + id = shopCartItem.getShopId(); + sysTypeEnum = SysTypeEnum.MULTISHOP; + } + String key = id + Constant.UNDERLINE + sysTypeEnum.value(); + if (shopMap.containsKey(key)) { + return shopMap.get(key); + } + List warehouseList = warehouseService.listWarehouseByShopId(id, sysTypeEnum.value()); + shopMap.put(id + Constant.UNDERLINE + sysTypeEnum.value(), warehouseList); + return warehouseList; + } + + private static boolean notWarehouse(ShopCartItemVO shopCartItem, List dvyShopIds) { + // 虚拟商品、积分商品、用户自提、同城配送都不需要获取店铺仓库列表 + boolean notWarehouse = Objects.equals(shopCartItem.getMold(), SpuMold.VIRTUAL.value()) || + Objects.equals(shopCartItem.getSpuType(), SpuType.SCORE.value()) || + !dvyShopIds.contains(shopCartItem.getShopId()); + if (notWarehouse) { + return true; + } + + if (realOnlyOnePoint(shopCartItem)) { + return true; + } + return false; + } + + private static boolean realOnlyOnePoint(ShopCartItemVO shopCartItem) { + // 实物商品,没有赠品,且只有一个默认仓库,也不需要获取店铺仓库列表 + boolean realOnlyOnePoint = Objects.equals(shopCartItem.getMold(), SpuMold.REAL.value()) && + shopCartItem.getStockPointList().size() <= 1 && + CollUtil.isEmpty(shopCartItem.getGiveawayShopCartItemList()); + if (realOnlyOnePoint) { + return true; + } + return false; + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuComboFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuComboFeignController.java new file mode 100644 index 0000000..d595762 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuComboFeignController.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.SkuComboFeignClient; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.service.SkuComboService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collections; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class SkuComboFeignController implements SkuComboFeignClient { + + @Autowired + private SkuComboService skuComboService; + + @Override + public ServerResponseEntity> getCombSpusBySkuId(Long skuId) { + return ServerResponseEntity.success(skuComboService.getCombShopItemsAndBySkuIds(Collections.singletonList(skuId))); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuStockChangeFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuStockChangeFeignController.java new file mode 100644 index 0000000..11a9fe7 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuStockChangeFeignController.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.dto.SkuStockLockDTO; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.feign.SkuStockChangeFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.service.SkuStockLockService; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class SkuStockChangeFeignController implements SkuStockChangeFeignClient { + + private static final Logger logger = LoggerFactory.getLogger(SkuStockChangeFeignController.class); + @Autowired + private SkuStockLockService skuStockLockService; + + @Override + public ServerResponseEntity lock(List skuStockLocksParam) { + logger.info("锁定库存, 账号信息:{}", AuthUserContext.get()); + return skuStockLockService.lock(skuStockLocksParam); + } + + @Override + public String lockPurchaseOrder(List skuStockLocks) { + logger.info("锁定库存, 账号信息:{}", AuthUserContext.get()); + return skuStockLockService.lockPurchaseOrder(skuStockLocks); + } + + @Override + public String purchaseOrderReduceLockStock(List skuStockLocks) { + logger.info("减少锁定库存, 账号信息:{}", AuthUserContext.get()); + return skuStockLockService.purchaseOrderReduceLockStock(skuStockLocks); + } + + @Override + public String lockAllotOrder(List skuStockLocks) { + logger.info("锁定库存, 账号信息:{}", AuthUserContext.get()); + return skuStockLockService.lockAllotOrder(skuStockLocks); + } + + @Override + public String reduceLockAllotOrder(List skuStockLocks) { + logger.info("减少锁定库存, 账号信息:{}", AuthUserContext.get()); + return skuStockLockService.reduceLockAllotOrder(skuStockLocks); + } + + @Override + public String changeStock(List skuStockLocks) { + logger.info("改变库存, 账号信息:{}", AuthUserContext.get()); + return skuStockLockService.changeStock(skuStockLocks); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuStockFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuStockFeignController.java new file mode 100644 index 0000000..d95c3a1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SkuStockFeignController.java @@ -0,0 +1,286 @@ +package com.tmerclub.cloud.product.feign; +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.vo.SkuComboVO; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author xxw + * @date 2022/11/17 15:29 + */ +@DubboService +public class SkuStockFeignController implements SkuStockFeignClient { + @Autowired + private SkuStockService skuStockService; + @Autowired + private StockPointSkuService stockPointSkuService; + @Autowired + private SkuComboService skuComboService; + @Autowired + private SpuService spuService; + @Autowired + private StockManager stockManager; + @Autowired + private SkuService skuService; + + @Override + public ServerResponseEntity> getStockMapBySkuIdAndStockPointIds(Long skuId, List stockPointIds){ + List stockPointSkuList = new ArrayList<>(stockPointIds.size()); + for (Long stockPointId : stockPointIds) { + StockPointSkuVO stockPointSkuVO = new StockPointSkuVO(); + stockPointSkuVO.setStockPointId(stockPointId); + stockPointSkuVO.setSkuId(skuId); + stockPointSkuList.add(stockPointSkuVO); + } + List skuStockVOList = skuStockService.listSkuStockBySkuIds(stockPointSkuList); + Map stockMap = skuStockVOList.stream().collect(Collectors.toMap(SkuStockVO::getStockPointId, SkuStockVO::getStock)); + return ServerResponseEntity.success(stockMap); + } + + @Override + public Map listSkuStock(List skuStocks) { + // 转成Map形式方便获取(key: skuId_stockPontId) + Map stockVOMap = stockManager.mapSkuStockBySkuStocks(skuStocks); + return stockVOMap; + } + + @Override + public void changeSkuStock(List stockVOList) { + skuStockService.changeSkuStock(stockVOList); + } + + @Override + public List checkStockPointContainSku(List stockPointIds, List skuIds) { + return stockPointSkuService.checkStockPointContainSku(stockPointIds, skuIds); + } + + @Override + public ServerResponseEntity addAndUpdateStockPoint(Long spuId, List stockPointSkuVOList) { + if (CollectionUtils.isEmpty(stockPointSkuVOList)) { + return ServerResponseEntity.success(); + } + // 过滤一下已经被删除的仓库和门店或改为共享模式的门店 + List filtePointList = stockPointSkuService.filtePoint(stockPointSkuVOList); + // 处理关联数据 + stockPointSkuService.changeStockPoint(filtePointList, false); + // 修改redis缓存 + List skuStockList = new ArrayList<>(filtePointList.size()); + for (StockPointSkuDTO stockPointSku : filtePointList) { + skuStockList.add(new SkuStockVO(stockPointSku.getSkuId(), stockPointSku.getStock(), null, null, stockPointSku.getStockPointId())); + } + skuStockService.handSkuStock(spuId, skuStockList, LuaOperateEnum.SKU_ADD, true); + // 生成入库记录 + skuService.loadSeckillStockBillLogItems(spuId, filtePointList); + // 清理一下缓存 + spuService.removeSpuCacheBySpuId(spuId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> calculateStockByComboSpuList(List spuIds) { + List skuComboList = skuComboService.getCombSpusBySpuIds(spuIds); + if(CollectionUtil.isEmpty(skuComboList)){ + HashMap spuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (Long spuId : spuIds) { + spuMap.put(spuId,0); + } + return ServerResponseEntity.success(spuMap); + } + Map> spuMap = skuComboList.stream().collect(Collectors.groupingBy(SkuComboVO::getSpuId)); + // 获取所有组合的商品库存 + List comboSkuIds = skuComboList.stream().map(SkuComboVO::getComboSkuId).toList(); + List stockPointList = stockPointSkuService.listPointIdsBySkuIds(comboSkuIds); + // 获取库存 + List skuStockList = skuStockService.listSkuStockBySkuIds(stockPointList); + Map> skuStockMap = skuStockList.stream().collect(Collectors.groupingBy(SkuStockVO::getSkuId)); + Map> skuComboMap = skuComboList.stream().collect(Collectors.groupingBy(SkuComboVO::getSkuId)); + Long shopId = AuthUserContext.get().getTenantId(); + Map spuStockMap = new HashMap<>(spuIds.size()); + for (Long spuId : spuIds) { + List skuComboVOList = spuMap.get(spuId); + if(CollectionUtil.isEmpty(skuComboVOList)){ + spuStockMap.put(spuId,0); + continue; + } + // 累加上sku的所有组合商品的所有仓库的库存最小值,就是当前sku可用的最小库存 + int totalStock = 0; + Set skuIds = skuComboVOList.stream().map(SkuComboVO::getSkuId).collect(Collectors.toSet()); + // 当前商品的所有sku + for (Long skuId : skuIds) { +// Map pointStockMap = new HashMap<>(stockPointList.size()); + List comboSpuList = skuComboMap.get(skuId); + // 判断是否有相同供货区域 + List skuList = comboSpuList.stream().map(SkuComboVO::getComboSkuId).collect(Collectors.toList()); + if (!skuService.hasStockBySkuIds(skuList, shopId)) { + continue; + } + List comboStockList = new ArrayList<>(comboSpuList.size()); + // 当前sku的组合商品列表 + for (SkuComboVO skuComboDb : comboSpuList) { + int comboStock = 0; + if (!skuStockMap.containsKey(skuComboDb.getComboSkuId())) { + continue; + } + // 当前组合商品的所有仓库库存列表 + List stockList = skuStockMap.get(skuComboDb.getComboSkuId()); + for (SkuStockVO skuStockVO : stockList) { + // 如果是0就是总库存 + if (Objects.equals(skuStockVO.getStockPointId(), StockManager.WAREHOUSE_ID)) { + continue; + } + // 除以组合数量向下取整得出 当前的组合商品-当前仓库 可用库存 + int pointStock = Math.floorDiv(skuStockVO.getStock(), skuComboDb.getComboCount()); + // 组合商品的库存取最小值,比如都是默认仓库的情况下,取最小值 +// if (!pointStockMap.containsKey(skuStockVO.getStockPointId()) || pointStockMap.get(skuStockVO.getStockPointId()) > pointStock) { +// pointStockMap.put(skuStockVO.getStockPointId(), pointStock); +// } + comboStock += pointStock; + } + comboStockList.add(comboStock); + } +// for (Long pointId : pointStockMap.keySet()) { +// totalStock += pointStockMap.get(pointId); +// } + totalStock = totalStock + Collections.min(comboStockList); + } + spuStockMap.put(spuId,totalStock); + } + return ServerResponseEntity.success(spuStockMap); + } + + @Override + public ServerResponseEntity updateStockMode(Long stockPointId, Integer stockMode, Integer type) { + skuService.updateStockMode(stockPointId, stockMode, type); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> loadProdStock(List spuAdminList) { + // 商品id列表 + List spuIds = spuAdminList.stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + Map spuMap = spuService.mapSpuByCache(spuIds); + Set skuIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Map> supplierSkuComboMap = new HashMap<>(Constant.INITIAL_CAPACITY); + // 获取 + for (SpuVO spuVO : spuMap.values()) { + Boolean isSupplierSpu = Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + // 组合商品的sku处理 + if (Objects.equals(spuVO.getSpuMold(), SpuMold.COMBO.value())) { + if (isSupplierSpu) { + // 供应商的组合商品处理 + SpuVO supplierSpu = spuService.getBySpuId(spuVO.getSupplierSpuId()); + for (SkuVO sku : supplierSpu.getSkus()) { + supplierSkuComboMap.put(sku.getSkuId(),sku.getSkuComboList()); + } + } + for (SkuVO skuVO : spuVO.getSkus()) { + List skuComboList = skuVO.getSkuComboList(); + // 如果是供应商的组合商品直接获取供应商的 + if(isSupplierSpu && supplierSkuComboMap.containsKey(skuVO.getSupplierSkuId())){ + skuComboList = supplierSkuComboMap.get(skuVO.getSupplierSkuId()); + } + // 添加组合的skuId + skuIds.addAll(skuComboList.stream().map(SkuComboVO::getComboSkuId).collect(Collectors.toSet())); + } + continue; + } + for (SkuVO sku : spuVO.getSkus()) { + skuIds.add(sku.getSkuId()); + if (Objects.nonNull(sku.getSupplierSkuId())) { + skuIds.add(sku.getSupplierSkuId()); + } + } + } + Map skuStockMap = skuStockService.mapSkuTotalStockBySkuIds(new ArrayList<>(skuIds)); + for (SpuAdminVO spuAdminVO : spuAdminList) { + SpuVO spuVO = spuMap.get(spuAdminVO.getSpuId()); + Boolean isSupplierSpu = Objects.equals(spuVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + Map skuVOMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (CollectionUtil.isNotEmpty(spuAdminVO.getSkuList())) { + skuVOMap = spuAdminVO.getSkuList().stream().collect(Collectors.toMap(SkuVO::getSkuId, s -> s)); + } + int stock = 0; + // 组合商品的sku处理 + if (Objects.equals(spuVO.getSpuMold(), SpuMold.COMBO.value())) { + for (SkuVO sku : spuVO.getSkus()) { + List skuComboList = sku.getSkuComboList(); + if(isSupplierSpu && supplierSkuComboMap.containsKey(sku.getSupplierSkuId())){ + skuComboList = supplierSkuComboMap.get(sku.getSupplierSkuId()); + } + int minComboStock = 0; + for (int i = 0; i < skuComboList.size(); i++) { + SkuComboVO skuComboVO = skuComboList.get(i); + SkuStockVO skuStockVO = skuStockMap.get(skuComboVO.getComboSkuId()); + if (skuVOMap.containsKey(sku.getSkuId())) { + skuVOMap.get(sku.getSkuId()).setStock(skuStockVO.getStock()); + } + int comboStock = Objects.isNull(skuComboVO.getComboCount()) ? 0 : skuStockVO.getStock() / skuComboVO.getComboCount(); + if (i == 0 || minComboStock > comboStock) { + minComboStock = comboStock; + } + } + stock += minComboStock; + } + continue; + } else { + if (Objects.equals(spuAdminVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + if (CollectionUtil.isNotEmpty(spuAdminVO.getSkuList())) { + for (SkuVO skuVO : spuAdminVO.getSkuList()) { + skuVO.setStock(skuStockMap.get(skuVO.getSupplierSkuId()).getStock()); + } + } + continue; + } + for (SkuVO sku : spuVO.getSkus()) { + SkuStockVO skuStockVO = skuStockMap.get(sku.getSkuId()); + if (skuVOMap.containsKey(sku.getSkuId())) { + skuVOMap.get(sku.getSkuId()).setStock(skuStockVO.getStock()); + } + stock += skuStockVO.getStock(); + } + } + spuAdminVO.setStock(stock); + } + return ServerResponseEntity.success(spuAdminList); + } + + @Override + public ServerResponseEntity> mapSkuPointStockByStockPoints(List productSearchList) { + if (CollUtil.isEmpty(productSearchList)) { + return ServerResponseEntity.success(Collections.emptyMap()); + } + return ServerResponseEntity.success(skuStockService.mapSkuPointStockByStockPoints(productSearchList)); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuFeignController.java new file mode 100644 index 0000000..790b138 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/SpuFeignController.java @@ -0,0 +1,589 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.feign; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.model.SkuStock; +import com.tmerclub.cloud.product.model.Spu; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/12/8 + */ +@DubboService +public class SpuFeignController implements SpuFeignClient { + private static final Logger logger = LoggerFactory.getLogger(SpuFeignController.class); + + @Autowired + private SpuService spuService; + @Autowired + private SkuService skuService; + @Autowired + private CategoryShopService categoryShopService; + + @Autowired + private SpuExtensionService spuExtensionService; + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + @Autowired + private SupplierSpuUpdateLaterOperateService supplierSpuUpdateLaterOperateService; + @Autowired + private SpuConsignmentChangeService spuConsignmentChangeService; + @Autowired + private SkuStockService skuStockService; + + + @Override + public ServerResponseEntity getById(Long spuId) { + SpuVO spuVO = spuService.getBySpuId(spuId); + ProductLangUtil.spu(spuVO); + SpuVO spu = new SpuVO(); + spu.setSpuId(spuVO.getSpuId()); + spu.setName(spuVO.getName()); + spu.setSellingPoint(spuVO.getSellingPoint()); + spu.setMainImgUrl(spuVO.getMainImgUrl()); + spu.setStatus(spuVO.getStatus()); + spu.setSupplierDeliveryType(spuVO.getSupplierDeliveryType()); + spu.setSupplierSpuType(spuVO.getSupplierSpuType()); + spu.setSupplierSpuId(spuVO.getSupplierSpuId()); + spu.setSpuType(spuVO.getSpuType()); + spu.setSpuMold(spuVO.getSpuMold()); + spu.setIsRefund(spuVO.getIsRefund()); + spu.setWriteOffNum(spuVO.getWriteOffNum()); + spu.setWriteOffMultipleCount(spuVO.getWriteOffMultipleCount()); + spu.setWriteOffTime(spuVO.getWriteOffTime()); + spu.setWriteOffStart(spuVO.getWriteOffStart()); + spu.setWriteOffEnd(spuVO.getWriteOffEnd()); + return ServerResponseEntity.success(spu); + } + + @Override + public ServerResponseEntity getDetailById(Long spuId) { + SpuVO spuVO = spuService.getBySpuId(spuId); + ProductLangUtil.spu(spuVO); + return ServerResponseEntity.success(spuVO); + } + + @Override + public ServerResponseEntity getSpuAndSkuAndRateById(Long spuId, Long skuId, Boolean supplierSpuType) { + SpuVO spu = spuService.getBySpuId(spuId); + SkuVO sku = skuService.getSkuBySkuId(skuId); + // 当商品状态不正常时,不能添加到购物车 + boolean spuIsNotExist = isSpuIsNotExist(spu, sku); + if (spuIsNotExist) { + // 当返回商品不存在时,前端应该将商品从购物车界面移除 + return ServerResponseEntity.fail(ResponseEnum.SPU_NOT_EXIST); + } + List shopCategoryRates = categoryShopService.listRateByShopId(spu.getShopId(), SysTypeEnum.MULTISHOP.value()); + spu.setRate(0.0); + for (CategoryRateBO shopCategoryRate : shopCategoryRates) { + if (Objects.equals(shopCategoryRate.getCategoryId(), spu.getCategoryId())) { + spu.setRate(shopCategoryRate.getRate()); + } + } + //获取代销商品基本信息是否改变 + SpuConsignmentChange spuConsignmentChange = spuConsignmentChangeService.getBySpuId(spuId); + // 判断下是否为供应商商品,如果是商家代销供应商商品且为供应商发货设置供应商信息 + if (!Objects.equals(spu.getSupplierId(), 0L) && Objects.equals(spu.getSupplierDeliveryType(), 1)) { + SpuVO supplierSpu = spuService.getBySpuId(spu.getSupplierSpuId()); + SkuVO supplierSku = skuService.getSkuBySkuId(sku.getSupplierSkuId()); + //名称 + if (Objects.nonNull(spuConsignmentChange) && Objects.equals(spuConsignmentChange.getNameChange(), 0)) { + if (Objects.equals(spu.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spu.setName(supplierSpu.getName()); + } + } + spu.setDeliveryTemplateId(supplierSpu.getDeliveryTemplateId()); + spu.setDeliveryAmount(supplierSpu.getDeliveryAmount()); + sku.setSupplyPriceFee(supplierSku.getPriceFee()); + List supplierCategoryRates = categoryShopService.listRateByShopId(spu.getSupplierId(), SysTypeEnum.SUPPLIER.value()); + spu.setSupplierRate(0.0); + for (CategoryRateBO supplierCategoryRate : supplierCategoryRates) { + if (Objects.equals(supplierCategoryRate.getCategoryId(), spu.getCategoryId())) { + spu.setSupplierRate(supplierCategoryRate.getRate()); + } + } + } + SpuAndSkuVO spuAndSku = new SpuAndSkuVO(); + spuAndSku.setSku(sku); + spuAndSku.setSpu(spu); + return ServerResponseEntity.success(spuAndSku); + } + + private static boolean isSpuIsNotExist(SpuVO spu, SkuVO sku) { + return Objects.isNull(spu) || Objects.isNull(sku) || !Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value()) || !Objects.equals(sku.getStatus(), StatusEnum.ENABLE.value()) || !Objects.equals(sku.getSpuId(), spu.getSpuId()); + } + + @Override + public ServerResponseEntity> listCanSeckillProd(Long spuId, Long shopId) { + return ServerResponseEntity.success(spuService.listCanSeckillProd(spuId, shopId)); + } + + @Override + public ServerResponseEntity> listPurchaseSpuByPartyCodeList(List partyCodeList, Long shopId) { + List skuList = skuService.listByPartyCodeList(partyCodeList); + // 查询商家对应供应商商品的库存信息 + List shopSkuStockVO = skuStockService.listShopStockByPartyCodesAndShopId(partyCodeList, shopId); + Map shopSkuStockMap = shopSkuStockVO.stream().collect(Collectors.toMap(SkuVO::getPartyCode, SkuVO::getStock)); + List purchaseSpuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuList) { + PurchaseSpuVO purchaseSpuVO = new PurchaseSpuVO(); + SpuVO spuVO = spuService.getBySpuId(skuVO.getSpuId()); + ProductLangUtil.spu(spuVO); + ProductLangUtil.sku(skuVO); + SkuStock skuStock = skuStockService.getBySkuId(skuVO.getSkuId(), spuVO.getSpuMold()); + purchaseSpuVO.setSkuId(skuVO.getSkuId()); + purchaseSpuVO.setPartyCode(skuVO.getPartyCode()); + purchaseSpuVO.setPriceFee(skuVO.getPriceFee()); + purchaseSpuVO.setImgUrl(skuVO.getImgUrl()); + purchaseSpuVO.setSpuId(skuVO.getSpuId()); + purchaseSpuVO.setName(spuVO.getName()); + purchaseSpuVO.setSkuName(skuVO.getSkuName()); + purchaseSpuVO.setMainImgUrl(spuVO.getMainImgUrl()); + purchaseSpuVO.setStock(shopSkuStockMap.getOrDefault(skuVO.getPartyCode(), 0)); + purchaseSpuVO.setSupplierStock(skuStock.getStock()); + purchaseSpuVO.setSupplierId(spuVO.getSupplierId()); + purchaseSpuList.add(purchaseSpuVO); + } + return ServerResponseEntity.success(purchaseSpuList); + } + + @Override + public ServerResponseEntity spuActivityBySpuId(Long shopId, Long spuId) { + return ServerResponseEntity.success(spuService.spuActivityBySpuId(shopId, spuId)); + } + + @Override + public ServerResponseEntity offlineSpuBySupplierId(Long supplierId) { + spuService.offlineSpuBySupplierId(supplierId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity offlineSpuByShopId(Long shopId) { + spuService.offlineSpuByShopId(shopId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity offlineSpuByShopIds(List shopIds) { + spuService.offlineSpuByShopIds(3, shopIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity getSpuAndSkuBySpuId(Long spuId) { + SpuVO spuVO = spuService.getBySpuId(spuId); + ProductLangUtil.spu(spuVO); + // sku信息 + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + //代销商品 + spuVO.setSkus(skuService.listConsignmentSku(spuVO, false)); + } else { + //其他商品(商家商品,供应商商品) + spuVO.setSkus(skuService.listSkuAllInfoBySpuId(spuId, spuVO, false)); + } + // 计算商品的库存和销量 + int totalStock = 0; + int saleNum = 0; + for (SkuVO skuVO : spuVO.getSkus()) { + skuVO.setStock(Objects.isNull(skuVO.getStock()) ? 0 : skuVO.getStock()); + totalStock += skuVO.getStock(); + saleNum += Objects.isNull(skuVO.getSaleNum()) ? 0 : skuVO.getSaleNum(); + } + spuVO.setTotalStock(totalStock); + spuVO.setSaleNum(saleNum); + spuVO.setDeliveryModeVO(Json.parseObject(spuVO.getDeliveryMode(), SpuVO.DeliveryModeVO.class)); + return ServerResponseEntity.success(spuVO); + } + + @Override + public ServerResponseEntity changeSpuType(SpuDTO spuDTO) { + Spu spu = BeanUtil.map(spuDTO, Spu.class); + spuService.updateSpu(spu); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity countByTransportId(Long transportId) { + + return ServerResponseEntity.success(spuService.countByTransportId(transportId)); + } + + @Override + public void removeSpuActivityCache(Long shopId, List spuIds) { + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + shopId = null; + } + if (CollUtil.isEmpty(spuIds) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + spuIds = spuService.listSpuIdsByShopId(shopId); + } + spuService.batchRemoveSpuActivityCache(spuIds); + } + + @Override + public void changeToNormalSpu(List spuIds) { + spuService.changeToNormalSpu(spuIds); + } + + @Override + public ServerResponseEntity countByUserId(Long userId) { + return ServerResponseEntity.success(spuService.countByUserId(userId)); + } + + @Override + public ServerResponseEntity> listSpuNameBySpuIds(List spuIds) { + return ServerResponseEntity.success(spuService.listSpuNameBySpuIds(spuIds)); + } + + @Override + public ServerResponseEntity> listSpuBySpuIds(List spuIds) { + return ServerResponseEntity.success(spuService.listSpuBySpuIds(spuIds)); + } + + @Override + public ServerResponseEntity updateSpuUpdateTimeByShopIds(List shopIds, Integer sysType) { + spuService.updateSpuUpdateTime(null, null, shopIds, sysType); + return ServerResponseEntity.success(); + } + + @Override + public void updateSpuUpdateTimeBySpuIds(List spuIds) { + spuService.updateSpuUpdateTime(spuIds, null, null, null); + } + + @Override + public ServerResponseEntity offlineSpuActivityByShopIds(List shopIds) { + spuService.offlineSpuByShopIds(1, shopIds); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> listSimple(SpuSimpleBO spuSimpleBO) { + List spus = spuService.listSimple(spuSimpleBO); + return ServerResponseEntity.success(spus); + } + + @Override + public ServerResponseEntity> listSimples(SpuSimpleBO spuSimpleBO) { + List spus = spuService.listSimples(spuSimpleBO); + return ServerResponseEntity.success(spus); + } + + @Override + public ServerResponseEntity> listSkuPriceByIds(List skuIds) { + return ServerResponseEntity.success(skuService.listSkuPriceByIds(skuIds)); + } + + @Override + public ServerResponseEntity> listSpuIdsByShopId(Long shopId) { + return ServerResponseEntity.success(spuService.listSpuIdsByShopIds(Collections.singletonList(shopId))); + } + + + @Override + public ServerResponseEntity checkSpuStatus(List spuIds) { + return spuService.checkSpuStatus(spuIds); + } + + @Override + public ServerResponseEntity> listSpuAndSkuById(List skuList, Long supplierId) { + List spuAndSkuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuList) { + SpuVO spu = spuService.getBySpuId(skuVO.getSpuId()); + SkuVO sku = skuService.getSkuBySkuId(skuVO.getSkuId()); + // 当商品状态不正常时,不能添加到购物车 + boolean spuIsNotExist = isSpuIsNotExist(spu, sku); + if (spuIsNotExist) { + // 当返回商品不存在时,前端应该将商品从购物车界面移除 + return ServerResponseEntity.fail(ResponseEnum.SPU_NOT_EXIST); + } + SpuAndSkuVO spuAndSku = new SpuAndSkuVO(); + spuAndSku.setSkuId(sku.getSkuId()); + spuAndSku.setSpuId(sku.getSpuId()); + spuAndSku.setSku(sku); + spuAndSku.setSpu(spu); + spuAndSkuList.add(spuAndSku); + } + return ServerResponseEntity.success(spuAndSkuList); + } + + @Override + public ServerResponseEntity> isCommissionByShopIdAndSpuId(List spuAdminVOList, Long shopId) { + //获取代销商品状态 + List supplierIds = spuAdminVOList.stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + //获取代销商品信息 + if (CollUtil.isEmpty(supplierIds) || supplierIds.size() == 0) { + return ServerResponseEntity.success(spuAdminVOList); + } + List spuVOList = spuService.listSpuByShopIdAndSupplierSpuId(shopId, supplierIds); + Map> listMap = spuVOList.stream().collect(Collectors.groupingBy(SpuVO::getSupplierSpuId)); + Map commissionSpuIds = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSupplierSpuId, SpuVO::getSpuId)); + for (SpuAdminVO spuAdminVO : spuAdminVOList) { + //根据供应商品id和商家id获取代销商品信息 + SpuVO commissionSpu = spuService.getSpuByShopIdAndSupplierSpuId(shopId, spuAdminVO.getSpuId()); + if (Objects.nonNull(commissionSpu)) { + //判断代销商品是否选择了店铺分类 + if (Objects.nonNull(commissionSpu.getShopCategoryId()) && commissionSpu.getShopCategoryId() == -1) { + spuAdminVO.setIsSynUpdate(IsSynUpdate.NO_CHANGE.value()); + } + } + List spuList = listMap.get(spuAdminVO.getSpuId()); + Long commissionSpuId = commissionSpuIds.get(spuAdminVO.getSpuId()); + if (!Objects.isNull(spuList)) { + if (spuList.get(0).getStatus().equals(SpuStatus.PUT_SHELF.value())) { + spuAdminVO.setIsPut(SpuStatus.PUT_SHELF.value()); + } + if (spuList.get(0).getStatus().equals(SpuStatus.OFF_SHELF.value())) { + spuAdminVO.setIsPut(SpuStatus.OFF_SHELF.value()); + } + } + if (!Objects.isNull(commissionSpuId)) { + spuAdminVO.setCommissionSpuId(commissionSpuId); + } + spuAdminVO.setIsCommission(IsCommission.NO.value()); + Integer result = spuService.isCommissionByShopIdAndSpuId(shopId, spuAdminVO.getSpuId()); + if (!result.equals(0)) { + //代销了 + spuAdminVO.setIsCommission(IsCommission.YES.value()); + } + } + return ServerResponseEntity.success(spuAdminVOList); + } + + @Override + public void soldOutSpuBySpu(Long spuId, Long price, Long marketPriceFee) { + spuService.soldOutSpuBySpu(spuId, price, marketPriceFee); + } + + + @Override + public void supplierUpdateSpuStatus(Long supplierSpuId, Integer status) { + //根据供应商品id获取代销商品 + List commissionSpuList = spuService.listSpuBySupplierSpuId(supplierSpuId); + List commissionSpuIdList = commissionSpuList.stream().map(SpuVO::getSpuId).collect(Collectors.toList()); + // 只有非组合的商品需要改变发货方式为商家发货 + List noComboSpuIds = commissionSpuList.stream().filter(spuVO -> !Objects.equals(spuVO.getSpuMold(), SpuMold.COMBO.value())).map(SpuVO::getSpuId).toList(); + logger.info("筛选出非组合的商家供应商发货的代销商品:{}", noComboSpuIds); + //供应商下架 + if (Objects.equals(status, SpuStatus.OFF_SHELF.value()) || Objects.equals(status, SpuStatus.PUBLISH_WAIT_AUDIT.value())) { + //下架 商家供应商发货的代销商品 + logger.info("下架 商家供应商发货的代销商品:{}", commissionSpuIdList); + supplierSpuUpdateLaterOperateService.batchChangeSpuStatus(commissionSpuIdList, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + boolean checkSpu = Objects.equals(status, SpuStatus.OFF_SHELF.value()) || Objects.equals(status, SpuStatus.PUBLISH_WAIT_AUDIT.value()); + //供应商品为下架状态修改代销商品发货方式 + if (CollUtil.isNotEmpty(noComboSpuIds) && checkSpu) { + //修改发货方式 + spuService.batchUpdateCommissionSpuDeliverType(noComboSpuIds, SupplierDeliveryType.SHOP_DELIVERY.value()); + } + } + //供应商品平台下架 + if (Objects.equals(status, SpuStatus.PLATFORM_OFF_SHELF.value())) { + logger.info("供应商品平台下架:{}", commissionSpuIdList); + //下架 + spuService.batchChangeCommissionSpuStatus(commissionSpuIdList, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + if(CollectionUtil.isNotEmpty(noComboSpuIds)) { + //修改发货方式 + spuService.batchUpdateCommissionSpuDeliverType(noComboSpuIds, SupplierDeliveryType.SHOP_DELIVERY.value()); + } + } + + //供应商品为删除状态 + if (Objects.equals(status, SpuStatus.DELETE.value())) { + logger.info("供应商品为删除状态:{}", commissionSpuIdList); + //下架 + spuService.batchChangeCommissionSpuStatus(commissionSpuIdList, SpuStatus.OFF_SHELF.value(), SysTypeEnum.MULTISHOP.value()); + if(CollectionUtil.isNotEmpty(noComboSpuIds)) { + //修改发货方式 + spuService.batchUpdateCommissionSpuDeliverType(noComboSpuIds, SupplierDeliveryType.SHOP_DELIVERY.value()); + } + } + } + + @Override + public ServerResponseEntity> getSpuIsSynUpdate(List spuIds) { + return ServerResponseEntity.success(spuService.getSpuIsSynUpdate(spuIds)); + } + + @Override + public ServerResponseEntity supplierSpuUpdateLaterOffSpu(Long supplierSpuId, Integer commissionSpuOffType) { + + spuService.supplierSpuUpdateLaterOffSpu(supplierSpuId, commissionSpuOffType); + return ServerResponseEntity.success(); + } + + @Override + public void skuUpdateLaterOperate(Long supplierSpuId) { + supplierSpuUpdateLaterOperateService.skuUpdateLaterOperate(supplierSpuId); + } + + @Override + public ServerResponseEntity feePriceUnderSupplyPrice(EsProductBO esProductBO) { + supplierSpuUpdateLaterOperateService.feePriceUnderSupplyPrice(esProductBO); + return ServerResponseEntity.success(); + } + + @Override + public void soldOutManualPriceCommissionSpu(Long supplierSpuId, Integer type, Integer isFiltration) { + supplierSpuUpdateLaterOperateService.soldOutManualPriceCommissionSpu(supplierSpuId, type, isFiltration); + } + + @Override + public void supplierSkuAddOrDeleteLaterOperate(Long supplierSpuId, Long skuId) { + supplierSpuUpdateLaterOperateService.supplierSkuAddOrDeleteLaterOperate(supplierSpuId, skuId); + } + + @Override + public void changeSynUpdate(Long supplierSpuId) { + supplierSpuUpdateLaterOperateService.changeSynUpdate(supplierSpuId); + } + + @Override + public void updateManualPriceCommissionSpuPrice(Long shopId) { + spuService.updateManualPriceCommissionSpuPrice(shopId); + } + + @Override + public ServerResponseEntity> checkCommissionSpuIsUpdateMsg(List spuAdminVOList) { + List supplierSpuIdList = spuAdminVOList.stream().map(SpuAdminVO::getSupplierSpuId).collect(Collectors.toList()); + if (CollUtil.isEmpty(supplierSpuIdList)) { + return ServerResponseEntity.success(spuAdminVOList); + } + List supplierSpuVOList = spuService.listSpuBySpuIds(supplierSpuIdList); + if (Objects.isNull(supplierSpuVOList)) { + return ServerResponseEntity.success(spuAdminVOList); + } + Map> supplierSpuMap = supplierSpuVOList.stream().collect(Collectors.groupingBy(SpuVO::getSpuId)); + List spuAdminList = supplierSpuUpdateLaterOperateService.disposeSpuMsg(spuAdminVOList, supplierSpuMap); + return ServerResponseEntity.success(spuAdminList); + } + + @Override + public ServerResponseEntity> usCheckCommissionSpuIsUpdateMsg(List productSearchVOList) { + List spuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List supplierSpuIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ProductSearchVO productSearchVO : productSearchVOList) { + List spuIds = productSearchVO.getSpus().stream().map(SpuSearchVO::getSpuId).collect(Collectors.toList()); + List supplierSpuIds = productSearchVO.getSpus().stream().map(SpuSearchVO::getSupplierSpuId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(spuIds)) { + spuIdList.addAll(spuIds); + } + if (CollUtil.isNotEmpty(supplierSpuIds)) { + supplierSpuIdList.addAll(supplierSpuIds); + } + } + + if (CollUtil.isEmpty(spuIdList) && CollUtil.isEmpty(supplierSpuIdList)) { + return ServerResponseEntity.success(productSearchVOList); + } + + //批量获取代销商品基本信息是否改变 + List spuConsignmentChanges = spuConsignmentChangeService.batchGetBySpuIdList(spuIdList); + Map> spuConsignmentChangeMap = spuConsignmentChanges.stream().collect(Collectors.groupingBy(SpuConsignmentChange::getSpuId)); + //批量获取供应商商品信息 + List supplierSpuVOList = spuService.listSpuBySpuIds(supplierSpuIdList); + Map> supplierSpuMap = supplierSpuVOList.stream().collect(Collectors.groupingBy(SpuVO::getSpuId)); + for (ProductSearchVO productSearchVO : productSearchVOList) { + List spuSearchVOList = supplierSpuUpdateLaterOperateService.usDisposeSpuMsg(productSearchVO.getSpus(), spuConsignmentChangeMap, supplierSpuMap); + productSearchVO.setSpus(spuSearchVOList); + } + return ServerResponseEntity.success(productSearchVOList); + } + + @Override + public void updateSaleNumBySeckillOrder(Long spuId, Integer prodCount) { + spuExtensionService.updateSaleNumBySeckillOrder(spuId, prodCount); + } + + @Override + public ServerResponseEntity> listSpuBySpuIdsNo(List spuIds) { + return ServerResponseEntity.success(spuService.listSpuBySpuIds(spuIds)); + } + + @Override + public ServerResponseEntity> getDetailBySpuIds(List spuIdS) { + List spuVOList = spuService.getBySpuIds(spuIdS); + ProductLangUtil.spuList(spuVOList); + return ServerResponseEntity.success(spuVOList); + } + + @Override + public ServerResponseEntity batchChangeSpuStatusToDisableBySupplierIds(List supplierIdsToStop) { + spuService.batchChangeSpuStatusToDisableBySupplierIds(supplierIdsToStop); + return ServerResponseEntity.success(); + } + + @Override + public void syncUpdateCommissionSpuBrandOrSeq(Long brandId, Integer seq, Long supplierSpuId) { + spuService.syncUpdateCommissionSpuBrandOrSeq(brandId, seq, supplierSpuId); + } + + @Override + public ServerResponseEntity voluntarilyImportSupplierSpu(List spuVOList, Integer sysType, Long userId) { + spuService.voluntarilyImportSupplierSpu(spuVOList, sysType, userId); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity updateSpuByShopId(Long shopId, Integer sysType) { + spuService.updateSpuByShopId(shopId, sysType); + return ServerResponseEntity.success(); + } + + @Override + public void processSupplierSkuInsert(Long spuId, Long skuId) { + Object o = RedisUtil.get(ProductCacheNames.SKU_STATUS_DELETE + spuId); + if (Objects.isNull(o)) { + //sku种类增加,商家是手动设价,下架商家的商品 + this.skuUpdateLaterOperate(spuId); + } + //供应商品sku增加或者删除处理代销商品sku + this.supplierSkuAddOrDeleteLaterOperate(spuId, skuId); + this.changeSynUpdate(spuId); + } + + @Override + public List listShopSpuBySupplierSpuIds(Long shopId, List supplierSpuIds) { + return spuService.listShopSpuBySupplierSpuIds(shopId, supplierSpuIds); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/StockPointFeignController.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/StockPointFeignController.java new file mode 100644 index 0000000..065bd2a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/feign/StockPointFeignController.java @@ -0,0 +1,76 @@ +package com.tmerclub.cloud.product.feign; + +import com.tmerclub.cloud.api.product.feign.StockPointFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.service.StockPointSkuService; +import com.tmerclub.cloud.product.util.StockUtil; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author zp + */ +@DubboService +public class StockPointFeignController implements StockPointFeignClient { + + @Autowired + private StockPointSkuService stockPointSkuService; + + @Autowired + private StockManager stockManager; + + @Override + public ServerResponseEntity countStockList(Long stockPointId) { + return ServerResponseEntity.success(stockPointSkuService.listByPointId(stockPointId).size()); + } + + @Override + public List listStockPointSku(StockPointSkuDTO stockPointSkuDTO) { + return stockPointSkuService.listStockPointSku(stockPointSkuDTO); + } + + @Override + public void updateStockPointSkuRelate(List stockPointIds, List skuIds) { + // 查询关联数据 + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + stockPointSkuDTO.setStockPointIds(stockPointIds); + stockPointSkuDTO.setSkuIds(skuIds); + List stockPointSkus = stockPointSkuService.listStockPointSku(stockPointSkuDTO); + if (CollectionUtils.isEmpty(stockPointSkus)) { + return; + } + // 查询库存 + List skuStocks = new ArrayList<>(stockPointSkus.size()); + for (StockPointSkuVO stockPointSkuVO : stockPointSkus) { + skuStocks.add(new SkuStockVO(stockPointSkuVO.getSkuId(), stockPointSkuVO.getStockPointId())); + } + Map stockMap = stockManager.mapSkuStockBySkuStocks(skuStocks); + // 非默认仓库,且库存不存在 or 库存为0,删除关联数据 + List deleteData = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (StockPointSkuVO stockPointSkuVO : stockPointSkus) { + if (Objects.equals(stockPointSkuVO.getType(), 0)) { + continue; + } + SkuStockVO skuStockVO = stockMap.get(StockUtil.skuPointKey(stockPointSkuVO.getSkuId(), stockPointSkuVO.getStockPointId())); + if (Objects.isNull(skuStockVO) + || Objects.equals(skuStockVO.getStock(), 0)) { + deleteData.add(stockPointSkuVO.getStockPointSkuId()); + } + } + if (!CollectionUtils.isEmpty(deleteData)) { + stockPointSkuService.deleteByIds(deleteData); + } + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/handler/ProductCommentWriteHandler.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/handler/ProductCommentWriteHandler.java new file mode 100644 index 0000000..19320eb --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/handler/ProductCommentWriteHandler.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.product.handler; + +import com.alibaba.excel.util.BooleanUtils; +import com.alibaba.excel.write.handler.RowWriteHandler; +import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierProdExcelVO; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; + +import java.util.Objects; + +/** + * 商品excel批注处理 + * + * @author gaozijie + * @date 2023-04-06 + */ +public class ProductCommentWriteHandler implements RowWriteHandler { + + /** + * @see SysTypeEnum + */ + private final Integer sysType; + + private boolean isSetComment; + + public ProductCommentWriteHandler(Integer sysType) { + this.sysType = sysType; + } + + @Override + public void afterRowDispose(RowWriteHandlerContext context) { + // 表头存在两行(会导致执行两次,加多一个字段进行区分判断) + if (BooleanUtils.isTrue(context.getHead()) && !isSetComment) { + Sheet sheet = context.getWriteSheetHolder().getSheet(); + Drawing drawingPatriarch = sheet.createDrawingPatriarch(); + // 准备批注信息(区分商家or供应商) + int[] commentIndex = {}; + String[] comments = {}; + if (Objects.equals(SysTypeEnum.MULTISHOP.value(), sysType)) { + commentIndex = SpuExcelVO.COMMENT_INDEX; + comments = SpuExcelVO.COMMENTS; + } else if (Objects.equals(SysTypeEnum.SUPPLIER.value(), sysType)) { + commentIndex = SupplierProdExcelVO.COMMENT_INDEX; + comments = SupplierProdExcelVO.COMMENTS; + } + // 插入批注 + Comment comment; + for (int i = 0; i < commentIndex.length; i++) { + comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, commentIndex[i], 1, commentIndex[i] + 1, 2)); + comment.setString(new XSSFRichTextString(comments[i])); + sheet.getRow(0).getCell(commentIndex[i]).setCellComment(comment); + } + isSetComment = true; + } + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderRefundSuccessStockConsumer.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderRefundSuccessStockConsumer.java new file mode 100644 index 0000000..62661ca --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderRefundSuccessStockConsumer.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.order.bo.RefundReductionStockBO; +import com.tmerclub.cloud.common.order.bo.RefundStockOperateBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.service.StockBillLogService; +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.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 解锁库存的监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SUCCESS_STOCK_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SUCCESS_STOCK_TOPIC) +public class OrderRefundSuccessStockConsumer implements RocketMQListener { + + @Autowired + private StockManager stockManager; + @Autowired + private SpuMapper spuMapper; + @Autowired + private StockBillLogService stockBillLogService; + + /** + * 订单退款导致待发货订单取消,需要还原优惠券和库存 + */ + @Override + public void onMessage(RefundStockOperateBO refundStockOperateBO) { + // 保存退款还原库存的日志 + stockBillLogService.generateStockLogOfRefundOrderList(refundStockOperateBO); + + List skuStockLocks = new ArrayList<>(refundStockOperateBO.getRefundReductionStockList().size()); + refundStockOperateBO.getRefundReductionStockList().forEach(refundStockOperateDTO -> { + // 解锁库存 + SkuStockVO skuStockVO = new SkuStockVO(refundStockOperateDTO.getSkuId(), refundStockOperateDTO.getCount()); + skuStockVO.setStockPointId(refundStockOperateDTO.getStockPointId()); + skuStockLocks.add(skuStockVO); + }); + + if (CollUtil.isNotEmpty(skuStockLocks)) { + // 减少销量,增加sku库存数量 - 这里报错没有关系,mq会重试 + stockManager.increaseStock(skuStockLocks); + } + List stockBillLogItems = refundStockOperateBO.getRefundReductionStockList(); + // 如果供应商商品不用添加记录,只需要扣库存 + if (!Objects.equals(stockBillLogItems.get(0).getSupplierProd(), 1)) { + return; + } + List supplierSpuIds = stockBillLogItems.stream().map(RefundReductionStockBO::getSpuId).toList(); + List spuIds = spuMapper.batchSupIdListBySupplierId(supplierSpuIds); + spuIds.addAll(supplierSpuIds); + spuMapper.updateSpuUpdateTime(spuIds, null, null, null); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderSubmitShopCartListener.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderSubmitShopCartListener.java new file mode 100644 index 0000000..895312e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OrderSubmitShopCartListener.java @@ -0,0 +1,41 @@ +package com.tmerclub.cloud.product.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.order.dto.OrderSubmitShopCartItemDTO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.product.service.ShopCartService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author lanhai + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_SUBMIT_SHOP_CART, consumerGroup = RocketMqConstant.ORDER_SUBMIT_SHOP_CART) +public class OrderSubmitShopCartListener implements RocketMQListener { + private static final Logger logger = LoggerFactory.getLogger(OrderSubmitShopCartListener.class); + + @Autowired + private ShopCartService shopCartService; + + /** + * 订单提交-清除购物车 + * + * @param orderSubmitShopCartItemDTO 购物车项id列表 + */ + @Override + public void onMessage(OrderSubmitShopCartItemDTO orderSubmitShopCartItemDTO) { + logger.info("订单提交-删除购物车商品, 购物车项id列表:{}", orderSubmitShopCartItemDTO); + if (Objects.isNull(orderSubmitShopCartItemDTO) || CollUtil.isEmpty(orderSubmitShopCartItemDTO.getShopCartItemIds())) { + return; + } + shopCartService.deleteShopCartItemsByShopCartItemIds(orderSubmitShopCartItemDTO.getUserId(), + orderSubmitShopCartItemDTO.getShopCartItemIds()); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OutStockLogConsumer.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OutStockLogConsumer.java new file mode 100644 index 0000000..282532d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/OutStockLogConsumer.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.listener; + +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.common.product.constant.StockBillType; +import com.tmerclub.cloud.common.product.constant.StockType; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.product.service.StockBillLogService; +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 FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.OUT_STOCK_LOG_TOPIC, consumerGroup = RocketMqConstant.OUT_STOCK_LOG_TOPIC) +public class OutStockLogConsumer implements RocketMQListener> { + + @Autowired + private StockBillLogService stockBillLogService; + + /** + * 1、添加出库明细 + */ + @Override + public void onMessage(List stockBillLogItems) { +// long count = stockBillLogService.countByOrderId(stockBillLogItems.get(0).getOrderId(), StockType.OUT_OF_STOCK.value()); +// if (count > 0) { +// return; +// } + stockBillLogItems.forEach(s -> { + s.setStockBillType(StockBillType.PURCHASE_OUTBOUND.value()); + s.setStocktype(StockType.OUT_OF_STOCK.value()); + }); + // 锁定库存的时候已经生成了id,所以这里不需要做幂等 + stockBillLogService.generateStockLogOfOrderList(stockBillLogItems); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogItemExcelListener.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogItemExcelListener.java new file mode 100644 index 0000000..2b43088 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogItemExcelListener.java @@ -0,0 +1,84 @@ +package com.tmerclub.cloud.product.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.product.service.StockBillLogItemService; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportExcelVO; +import com.tmerclub.cloud.product.vo.StockBillLogItemImportVO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author lanhai + */ +public class StockBillLogItemExcelListener extends AnalysisEventListener { + private StockBillLogItemService stockBillLogItemService; + /** + * 错误信息集合 + */ + private List errorList; + private List list; + private Integer type; + private StockBillLogItemImportVO stockBillLogItemImportVO; + + /** + * 每隔1000条数据存储数据库,然后清理map ,方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + + public StockBillLogItemExcelListener() { + } + + public StockBillLogItemExcelListener(StockBillLogItemService stockBillLogItemService, List errorList, Integer type, StockBillLogItemImportVO stockBillLogItemImportVO) { + this.stockBillLogItemService = stockBillLogItemService; + this.errorList = new ArrayList<>(Constant.INITIAL_CAPACITY); + this.list = new ArrayList<>(Constant.INITIAL_CAPACITY); + this.type = type; + this.stockBillLogItemImportVO = stockBillLogItemImportVO; + } + + /** + * 这个每一条数据解析都会来调用 + */ + @Override + public void invoke(StockBillLogItemImportExcelVO stockBillLogItemImportExcelVO, AnalysisContext analysisContext) { + if (Objects.isNull(stockBillLogItemImportExcelVO)) { + return; + } + boolean isSave = list.size() > BATCH_COUNT; + if (isSave) { + saveData(); + } + list.add(stockBillLogItemImportExcelVO); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + stockBillLogItemService.importExcel(list, errorList, type, stockBillLogItemImportVO); + list.clear(); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + //确保所有数据都能入库 + saveData(); + } + + @Override + public void onException(Exception exception, AnalysisContext context) { + + int row, column; + if (exception instanceof ExcelDataConvertException) { + ExcelDataConvertException convertException = (ExcelDataConvertException) exception; + row = convertException.getRowIndex() + 1; + column = convertException.getColumnIndex() + 1; + errorList.add(" 第" + row + "行,第 " + column + "列数据不符合要求,请检验后重新导入!"); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogStockBillLogConsumerConsumer.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogStockBillLogConsumerConsumer.java new file mode 100644 index 0000000..8dc4bb5 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/StockBillLogStockBillLogConsumerConsumer.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.listener; + +import com.tmerclub.cloud.common.product.vo.StockBillLogVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.product.service.StockBillLogService; +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; + +/** + * 入库操作监听 + * + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC, consumerGroup = RocketMqConstant.STOCK_BILL_LOG_PURCHASE_STORAGE_TOPIC) +public class StockBillLogStockBillLogConsumerConsumer implements RocketMQListener { + + @Autowired + private StockBillLogService stockBillLogService; + + /** + * 入库操作 + */ + @Override + public void onMessage(StockBillLogVO message) { + // 仅保存库存记录 + message.setChangeStock(false); + stockBillLogService.saveInfo(message); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SupplierProdExcelListener.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SupplierProdExcelListener.java new file mode 100644 index 0000000..64fef8c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/listener/SupplierProdExcelListener.java @@ -0,0 +1,106 @@ +package com.tmerclub.cloud.product.listener; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.product.constant.SpuExportError; +import com.tmerclub.cloud.product.service.SpuExcelService; +import com.tmerclub.cloud.product.vo.SpuExcelVO; +import com.tmerclub.cloud.product.vo.SupplierProdExcelVO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lanhai + */ +public class SupplierProdExcelListener extends AnalysisEventListener { + private SpuExcelService spuExcelService; + private Map> errorMap; + private List list; + + + /** + * 每隔1000条数据存储数据库,然后清理map ,方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + + public SupplierProdExcelListener() { + } + + public SupplierProdExcelListener(SpuExcelService spuExcelService, Map> errorMap) { + this.spuExcelService = spuExcelService; + this.errorMap = errorMap; + this.list = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + /** + * 这个每一条数据解析都会来调用 + */ + @Override + public void invoke(SupplierProdExcelVO supplierProdExcelVO, AnalysisContext analysisContext) { + + boolean isSave = list.size() > BATCH_COUNT; + if (isSave) { + saveData(); + } + list.add(supplierProdExcelVO); + } + + private void saveData() { + List listSpuExcelVO = new ArrayList<>(Constant.INITIAL_CAPACITY); + try { + if (CollUtil.isNotEmpty(list)) { + listSpuExcelVO = list.stream().map(supplierProdExcelVO -> { + SpuExcelVO spuExcelVO = new SpuExcelVO(); + spuExcelVO.setSeq(supplierProdExcelVO.getSeq()); + spuExcelVO.setNameZh(supplierProdExcelVO.getNameZh()); + spuExcelVO.setImgs(supplierProdExcelVO.getImgs()); + spuExcelVO.setVideo(supplierProdExcelVO.getVideo()); + spuExcelVO.setSellingPointZh(supplierProdExcelVO.getSellingPointZh()); + spuExcelVO.setDetailZh(supplierProdExcelVO.getDetailZh()); + spuExcelVO.setBrandName(supplierProdExcelVO.getBrandName()); + spuExcelVO.setCategoryName(supplierProdExcelVO.getCategoryName()); + spuExcelVO.setShopCategoryName(supplierProdExcelVO.getShopCategoryName()); + spuExcelVO.setDeliveryMode(supplierProdExcelVO.getDeliveryMode()); + spuExcelVO.setDeliveryTemplate(supplierProdExcelVO.getDeliveryTemplate()); + spuExcelVO.setDeliveryAmount(supplierProdExcelVO.getDeliveryAmount()); + spuExcelVO.setStatus(supplierProdExcelVO.getStatus()); + spuExcelVO.setWeight(Objects.isNull(supplierProdExcelVO.getWeight()) ? 0.0 : supplierProdExcelVO.getWeight()); + spuExcelVO.setVolume(Objects.isNull(supplierProdExcelVO.getVolume()) ? 0.0 : supplierProdExcelVO.getVolume()); + spuExcelVO.setPriceFee(supplierProdExcelVO.getPriceFee()); + spuExcelVO.setMarketPriceFee(supplierProdExcelVO.getMarketPriceFee()); + spuExcelVO.setStock(supplierProdExcelVO.getStock()); + spuExcelVO.setSpuCode(Objects.nonNull(supplierProdExcelVO.getSpuCode()) ? supplierProdExcelVO.getSpuCode() : null); + spuExcelVO.setPropertiesZh(Objects.nonNull(supplierProdExcelVO.getPropertiesZh()) ? supplierProdExcelVO.getPropertiesZh() : null); + spuExcelVO.setSkuNameZh(Objects.nonNull(supplierProdExcelVO.getSkuNameZh()) ? supplierProdExcelVO.getSkuNameZh() : null); + spuExcelVO.setStockWarning(supplierProdExcelVO.getStockWarning()); + return spuExcelVO; + }).collect(Collectors.toList()); + } + + spuExcelService.exportExcel(listSpuExcelVO, errorMap); + } catch (Exception e) { + List list = errorMap.get(SpuExportError.OTHER.value()); + if (CollUtil.isEmpty(list)) { + list = new ArrayList<>(0); + errorMap.put(SpuExportError.OTHER.value(), list); + } + list.add(e.getMessage()); + } + list.clear(); + } + + /** + * 所有数据解析完成了 都会来调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + //确保所有数据都能入库 + saveData(); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/manager/StockManager.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/manager/StockManager.java new file mode 100644 index 0000000..571b7e3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/manager/StockManager.java @@ -0,0 +1,571 @@ +package com.tmerclub.cloud.product.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.bo.SkuStockLockBO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.config.AofRedisConfig; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisLuaUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.product.util.StockUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.ConvertingCursor; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * 库存中心向外提供的业务功能的 真正实现 + * + * @author lanhai + */ +@Component +public class StockManager { + + private static final Logger LOG = LoggerFactory.getLogger(StockManager.class); + /** + * 这里的redis用到AofRedis这个类的配置 + * + * @see com.tmerclub.cloud.common.cache.config.AofRedisConfig + */ + private final StringRedisTemplate stringRedisTemplate; + + /** + * 默认的仓库id + */ + public static final Long WAREHOUSE_ID = 0L; + + /** + * 库存锁定转销量Lua + */ + public static final byte[] ORDER_MAKER_USE_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/order/OrderMakerUseStock.lua"); + + /** + * 库存的扣减Lua + */ + public static final byte[] ORDER_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/order/OrderStock.lua"); + + /** + * 库存锁定还原lua + */ + public static final byte[] ORDER_UNLOCK_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/order/OrderUnlockStock.lua"); + + /** + * 批量减少锁定库存,增加可售库存数量lua + */ + public static final byte[] ORDER_BATCH_UNLOCK_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/OrderBatchUnlockStock.lua"); + + /** + * 批量减少锁定库存,增加销量lua + */ + public static final byte[] ORDER_BATCH_MAKER_USE_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/OrderBatchMakerUseStock.lua"); + + /** + * 库存锁定还原lua + */ + public static final byte[] REFUND_INCREASE_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/RefundIncreaseStock.lua"); + + /** + * 采购订单锁定sku库存 + */ + public static final byte[] PURCHASE_LOCK_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/purchase/PurchaseLockStock.lua"); + + /** + * 采购订单减少锁定sku库存 + */ + public static final byte[] PURCHASE_REDUCE_LOCK_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/purchase/PurchaseReduceLuckStock.lua"); + + /** + * 调拨订单锁定sku库存 + */ + public static final byte[] ALLOT_LOCK_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/allot/AllotLockStock.lua"); + + /** + * 调拨订单减少锁定sku库存 + */ + public static final byte[] ALLOT_REDUCE_LOCK_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/allot/AllotReduceLockStock.lua"); + + /** + * sku库存操作 + */ + public static final byte[] SKU_STOCK_BYTES = RedisLuaUtil.initByte("lua/product/SkuStock.lua"); + + public StockManager(AofRedisConfig aofRedisConfig) { + stringRedisTemplate = aofRedisConfig.getStringRedisTemplate(); + } + + + /** + * 销售订单下单的时候,锁定相应的sku的库存 + *

+ * 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 返回值为空,代表已经执行一次了,不需要重复执行 + * + * @return 返回解锁成功的库存信息 数据格式: orderId + skuId + */ + public String makerUseStock(List skuStockLocksParam) { + // 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存... + // 返回值为空,代表已经执行一次了,不需要重复执行 + return executeBySkuStockLocks(skuStockLocksParam, ORDER_MAKER_USE_STOCK_BYTES); + } + + + /** + * 销售订单下单的时候,锁定相应的sku的库存 + *

+ * 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 异常返回 skuId + */ + public String lockStock(List skuStockLocksParam) { + // 正常返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + // 异常返回 skuId + return executeBySkuStockLocks(skuStockLocksParam, ORDER_STOCK_BYTES); + } + + + public Map unLockStock(List skuStockLocks) { + + // 返回 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + String result = executeBySkuStockLocks(skuStockLocks, ORDER_UNLOCK_STOCK_BYTES); + + if (StrUtil.isBlank(result)) { + return Collections.emptyMap(); + } + + + // key: skuId value: 剩余库存 + Map stockMap = new HashMap<>(); + String[] unlockResults = result.split(StrUtil.COMMA); + for (String unlockResult : unlockResults) { + if (StrUtil.isBlank(unlockResult)) { + continue; + } + + // 订单id_仓库id_skuId_剩余库存 + String[] unlockResultInfo = unlockResult.split(String.valueOf(StrUtil.C_UNDERLINE)); + // 设置剩余库存,订单号 + stockMap.put(Long.valueOf(unlockResultInfo[2]), Integer.valueOf(unlockResultInfo[3])); + } + return stockMap; + } + + + public void increaseStock(List skuStockLockList) { + // skuId_退货数量,skuId_退货数量... + List list = new ArrayList<>(); + for (SkuStockVO skuStockLock : skuStockLockList) { + String[] strArray = StockUtil.loadQueryArray(skuStockLock.getSkuId(), skuStockLock.getStock(), skuStockLock.getStockPointId()); + list.add(strArray); + } + // 返回 skuId_剩余库存_当前销量,skuId_剩余库存_当前销量... + RedisLuaUtil.execute(stringRedisTemplate, REFUND_INCREASE_STOCK_BYTES, list); + } + + /** + * 改变sku库存 + * + * @param dataList + * @param checkStock 扣除库存时,是否需要检验sku的状态 - 下单时,检验sku是否为上架状态 + * @return + */ + public String changeStock(List dataList, Boolean checkStock) { + List stockDateList = new ArrayList<>(dataList.size()); + for (String[] strings : dataList) { + String[] stockArray = Arrays.copyOf(strings, strings.length + 1); + stockArray[strings.length] = BooleanUtil.isTrue(checkStock) ? "1" : "0"; + stockDateList.add(stockArray); + } + + if (CollUtil.isEmpty(stockDateList)) { + LOG.info("changeStock dataList is empty"); + return null; + } + // 传参 skuId_仓库id_stockNum, skuId_仓库id_stockNum + // 返回 skuId_剩余库存_当前销量,skuId_剩余库存_当前销量... + return RedisLuaUtil.execute(stringRedisTemplate, SKU_STOCK_BYTES, stockDateList); + } + + /** + * 改变sku库存信息 + * + * @param skuStocks sku库存列表 + * @param luaOperateEnum 操作枚举 - 不是必传,如果skuStock.getOperateType()中有值就不用传此参数 + * @return + */ + public String skuStock(List skuStocks, LuaOperateEnum luaOperateEnum) { + if (CollUtil.isEmpty(skuStocks)) { + LOG.info("skuStock skuStocks is empty"); + return null; + } + + List dataList = new ArrayList<>(skuStocks.size()); + for (SkuStockVO skuStock : skuStocks) { + // 插入操作类型 + if (Objects.nonNull(luaOperateEnum)) { + skuStock.setOperateType(luaOperateEnum.value()); + } + + if (Objects.isNull(skuStock.getSkuId()) || Objects.isNull(skuStock.getOperateType())) { + // 代码问题,skuId和操作类型必传,不能为null + LOG.info("sku库存信息异常, SkuStock:{}", skuStock); + throw new LuckException("sku库存信息异常"); + } + // skuId_仓库id_库存变动数量_库存状态_库存操作 + dataList.add(StockUtil.loadQueryArray(skuStock.getSkuId(), skuStock.getStockPointId(), + skuStock.getStock(), skuStock.getStatus(), skuStock.getOperateType())); + } + + // 传参 skuId_仓库id_库存变动数量_库存状态_库存操作, skuId_仓库id_库存变动数量_库存状态_库存操作 + // 返回 skuId_剩余库存_当前销量,skuId_剩余库存_当前销量... + return executeLuk(dataList, SKU_STOCK_BYTES); + + } + + + public String executeLuk(List dataList, byte[] script) { + if (CollUtil.isEmpty(dataList)) { + LOG.info("executeLuk dataList is empty"); + return null; + } + try { + return RedisLuaUtil.execute(stringRedisTemplate, script, dataList); + } catch (Exception e) { + LOG.error("executeLuk error, data: {}, message:{}", dataList, e.getMessage()); + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + + /** + * 正常返回一个连接的字符串如下: + * 订单id_仓库id_skuId_剩余库存,订单id_仓库id_skuId_剩余库存,... + * 异常根据脚本内容进行返回 + */ + public String executeBySkuStockLocks(List skuStockLocks, byte[] script) { + // 订单id_仓库id_skuId_lockNum, 订单id_仓库id_skuId_lockNum... + List list = new ArrayList<>(); + for (SkuStockLockBO skuStockLock : skuStockLocks) { + String[] strArray = StockUtil.loadQueryArray(skuStockLock.getOrderId(), + skuStockLock.getStockPointId(), + skuStockLock.getSkuId(), + skuStockLock.getStockCount(), + skuStockLock.getDefaultStockPointId()); + list.add(strArray); + } + return RedisLuaUtil.execute(stringRedisTemplate, script, list); + } + + + /* + ===========================sku=================================== + */ + + + /** + * 转换sku库存信息为对象 + * + * @param skuId skuId列表 + */ + public SkuStockVO getSkuTotalStock(Long skuId) { + Map stockVOMap = mapSkuTotalStock(Collections.singletonList(skuId)); + return stockVOMap.get(skuId); + } + + + /** + * 转换sku库存信息为对象 + * + * @param stockPointIdList skuId列表 + */ + public Map skuStockMap(List stockPointIdList) { + return listCache(stockPointIdList); + } + + /** + * 获取sku总库存 + * + * @param skuIds + * @return + */ + public Map mapSkuTotalStock(List skuIds) { + List keys = new ArrayList<>(skuIds.size()); + for (Long skuId : skuIds) { + keys.add(CacheNames.SKU_SOCK + skuId); + } + Map stockMap = new HashMap<>(skuIds.size()); + List results = this.mGet(keys); + for (int i = 0; i < skuIds.size(); i++) { + Long skuId = skuIds.get(i); + SkuStockVO skuStockVO = StockUtil.getSkuStockVO(skuId, results.get(i)); + stockMap.put(skuId, skuStockVO); + } + return stockMap; + } + + + /** + * 获取sku总库存 + * + * @param skuStockList + * @return + */ + public Map mapSkuStockBySkuStocks(List skuStockList) { + List keys = new ArrayList<>(skuStockList.size()); + List cacheNames = new ArrayList<>(skuStockList.size()); + for (SkuStockVO stockPointSkuVO : skuStockList) { + String key = StockUtil.skuPointKey(stockPointSkuVO.getSkuId(), stockPointSkuVO.getStockPointId()); + if (keys.contains(key)) { + continue; + } + keys.add(key); + cacheNames.add(CacheNames.SKU_SOCK + key); + } + List values = mGet(cacheNames); + Map stockVOMap = new HashMap<>(keys.size()); + + for (int i = 0; i convertSkuStock(List stockPointIdList) { + Map map = listCache(stockPointIdList); + if (MapUtil.isEmpty(map)) { + return Collections.emptyList(); + } + return map.values().stream().toList(); + } + + public String changeSkuStatus(List skuStockList) { + List dataList = new ArrayList<>(); + for (SkuStockVO skuStockVO : skuStockList) { + dataList.add(StockUtil.loadQueryArray(skuStockVO.getSkuId(), StockManager.WAREHOUSE_ID, skuStockVO.getStock(), skuStockVO.getStatus(), LuaOperateEnum.SKU_STATUS.value())); + } + return this.executeLuk(dataList, SKU_STOCK_BYTES); + } + + /* + * ============================ sku库存记录 =========================== + */ + + public Map listCache(List stockPointList) { + if (CollUtil.isEmpty(stockPointList)) { + return new HashMap<>(0); + } + List keys = new ArrayList<>(stockPointList.size()); + List cacheNames = new ArrayList<>(stockPointList.size()); + for (StockPointSkuVO stockPointSkuVO : stockPointList) { + String key = StockUtil.skuPointKey(stockPointSkuVO.getSkuId(), stockPointSkuVO.getStockPointId()); + keys.add(key); + cacheNames.add(CacheNames.SKU_SOCK + key); + } + List values = mGet(cacheNames); + Map stockVOMap = new HashMap<>(keys.size()); + + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + stockVOMap.put(key, StockUtil.getSkuStockVO(key, values.get(i))); + } + return stockVOMap; + } + + /** + * 仅用于初始化库存 + * @param skuIds + * @param autofill + * @return + */ + public Map listInitCache(List skuIds, Boolean autofill) { + Set skuIdSet = new HashSet<>(skuIds); + List keys = new ArrayList<>(skuIdSet.size()); + List ids = new ArrayList<>(skuIdSet.size()); + for (Long skuId : skuIdSet) { + // 目前的仓库id都是0 + keys.add(ProductCacheNames.SKU_SOCK + StockManager.WAREHOUSE_ID + StrUtil.C_UNDERLINE + skuId); + ids.add(skuId); + } + List cacheList = mGet(keys); + Map stockMap = new HashMap<>(); + int index = 0; + for (Long id : ids) { + String value = cacheList.get(index++); + if (!autofill && StrUtil.isBlank(value)) { + continue; + } + stockMap.put(id, value); + } + return stockMap; + } + + // ================ mset ================ + + + public List mGet(Collection keys) { + for (String key : keys) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + return stringRedisTemplate.opsForValue().multiGet(keys); + } + + + /** + * list缓存放入并设置时间 + * + * @param cacheMap 缓存的数据集合 + */ + public void mSet(Map cacheMap) { + if (MapUtil.isEmpty(cacheMap)) { + return; + } + for (String key : cacheMap.keySet()) { + if (key.contains(StrUtil.SPACE)) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + // 没有设置失效时间 + stringRedisTemplate.opsForValue().multiSet(cacheMap); + } + + + /** + * list缓存放入并设置时间 + * + * @param keys 缓存的数据集合 + */ + public void mDel(List keys) { + if (CollUtil.isEmpty(keys)) { + return; + } + stringRedisTemplate.delete(keys); + } + + public List scanLockStockOrderLog() { + List list = RedisUtil.hScan(stringRedisTemplate, CacheNames.ORDER_SKU_LOCK); + List valueList = this.mGet(list); + List skuStockList = new ArrayList<>(list.size()); + for (String key : list) { + String orderInfo = key.replace(CacheNames.ORDER_SKU_LOCK, ""); + String[] split = orderInfo.split(Constant.UNDERLINE); + SkuStockVO skuStockVO = new SkuStockVO(Long.parseLong(split[2])); + skuStockVO.setOrderId(Long.parseLong(split[0])); + String stock = valueList.remove(0); + skuStockVO.setStock(Integer.parseInt(stock)); + skuStockVO.setZoneNo(Integer.parseInt(split[1])); + if (split.length > 3) { + skuStockVO.setStatus(Integer.parseInt(split[3])); + } + skuStockList.add(skuStockVO); + } + return skuStockList; + } + + /** + * 根据库存点id获取对应商品库存 + * @param stockPointIds 库存点id + * @return 库存映射map + */ + public Map mapSkuStockByStockPointIds(List stockPointIds) { + if (CollectionUtils.isEmpty(stockPointIds)) { + return new HashMap<>(0); + } + Map stockMap = new HashMap<>(Constant.INITIAL_CAPACITY); + Set keys; + SkuStockVO skuStockVO; + for (Long stockPointId : stockPointIds) { + // 找出匹配库存点的keys以及对应value + keys = this.scanWithPatten(CacheNames.SKU_SOCK + "*" + Constant.UNDERLINE + stockPointId); + if (CollectionUtils.isEmpty(keys)) { + continue; + } + List values = this.mGet(keys); + // 将value转成skuStockVO,并存入Map + int i=0; + for (String key : keys) { + key = key.substring(CacheNames.SKU_SOCK.length()); + skuStockVO = StockUtil.getSkuStockVO(key, values.get(i)); + stockMap.put(key, skuStockVO); + i++; + } + } + return stockMap; + } + + + public Map scan(String key) { + Map stockMap = Collections.emptyMap(); + Cursor cursor = null; + try { + ScanOptions options = ScanOptions.scanOptions().count(1000).match(key + "*").build(); + RedisSerializer redisSerializer = (RedisSerializer) stringRedisTemplate.getKeySerializer(); + cursor = stringRedisTemplate.executeWithStickyConnection(redisConnection -> + new ConvertingCursor<>(redisConnection.keyCommands().scan(options), redisSerializer::deserialize)); + if(Objects.isNull(cursor)){ + return stockMap; + } + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + while (cursor.hasNext()) { + keys.add(cursor.next()); + } + if (keys.isEmpty()) { + return stockMap; + } + stockMap = new HashMap<>(keys.size()); + List values = stringRedisTemplate.opsForValue().multiGet(keys); + for (int j = 0; j < keys.size(); j++) { + String stock = values.get(j); + if (StrUtil.isBlank(stock)) { + continue; + } + stockMap.put(keys.get(j), stock); + } + } finally { + if(Objects.nonNull(cursor)) { + cursor.close(); + } + } + return stockMap; + } + + /** + * 获取符合匹配条件的关键词(非阻塞) + * @param patten 匹配条件 + * @return 关键词集合 + */ + public Set scanWithPatten(String patten) { + Set keys = new HashSet<>(16); + ScanOptions options = ScanOptions.scanOptions() + .match(patten) + .count(1000) + .build(); + try (Cursor cursor = stringRedisTemplate.scan(options)) { + while (cursor.hasNext()) { + keys.add(cursor.next()); + } + } + return keys; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrLangMapper.java new file mode 100644 index 0000000..233e27f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrLangMapper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.AttrLang; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 属性-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface AttrLangMapper { + + /** + * 获取属性-国际化表列表 + * + * @return 属性-国际化表列表 + */ + List list(); + + /** + * 根据属性-国际化表id获取属性-国际化表 + * + * @param attrId 属性-国际化表id + * @return 属性-国际化表 + */ + AttrLang getByAttrId(@Param("attrId") Long attrId); + + /** + * 根据属性-国际化表id删除属性-国际化表 + * + * @param attrId + */ + void deleteById(@Param("attrId") Long attrId); + + /** + * 批量保存属性语言信息 + * + * @param attrLangList + */ + void batchSave(@Param("attrLangList") List attrLangList); + + /** + * 批量更新属性语言信息 + * + * @param attrLangList + */ + void batchUpdate(@Param("attrLangList") List attrLangList); + + /** + * 批量删除属性语言信息 + * @param langList + * @param attrId + */ + void batchDelete(@Param("langList") Collection langList, @Param("attrId") Long attrId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrMapper.java new file mode 100644 index 0000000..1cd88ef --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrMapper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.product.dto.AttrLangDTO; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.product.dto.AttrDTO; +import com.tmerclub.cloud.product.model.Attr; +import com.tmerclub.cloud.product.model.AttrLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 属性信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +public interface AttrMapper { + + /** + * 获取属性信息列表 + * + * @param pageAdapter 分页参数 + * @param attrDTO 属性数据 + * @return 属性信息列表 + */ + List list(@Param("page") PageAdapter pageAdapter, @Param("attr") AttrDTO attrDTO); + + /** + * 获取属性总数 + * + * @param attrDTO + * @return + */ + Long countAttr(@Param("attr") AttrDTO attrDTO); + + /** + * 根据属性信息id获取属性信息 + * + * @param attrId 属性信息id + * @return 属性信息 + */ + AttrVO getByAttrId(@Param("attrId") Long attrId); + + /** + * 保存属性信息 + * + * @param attr 属性信息 + */ + void save(@Param("attr") Attr attr); + + /** + * 更新属性信息 + * + * @param attr 属性信息 + */ + void update(@Param("attr") Attr attr); + + /** + * 根据属性信息id删除属性信息 + * + * @param attrId + */ + void deleteById(@Param("attrId") Long attrId); + + /** + * 根据分类和属性类型,获取对应的属性列表 + * + * @param attrType + * @param categoryId + * @param shopId + * @param sysType + * @return + */ + List getAttrsByCategoryIdAndAttrType(@Param("attrType") Integer attrType, @Param("categoryId") Long categoryId, @Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + + /** + * 统计属性名的数量 + * + * @param attrLangList + * @param shopId + * @param attrType + * @param attrId + * @return + */ + List countAttrName(@Param("attrLangList") List attrLangList, @Param("shopId") Long shopId, @Param("attrType") Integer attrType, @Param("attrId") Long attrId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrValueLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrValueLangMapper.java new file mode 100644 index 0000000..0727760 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrValueLangMapper.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.AttrValueLang; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface AttrValueLangMapper { + + /** + * 获取属性值-国际化表列表 + * + * @return 属性值-国际化表列表 + */ + List list(); + + /** + * 根据属性值-国际化表id获取属性值-国际化表 + * + * @param attrValueId 属性值-国际化表id + * @return 属性值-国际化表 + */ + AttrValueLang getByAttrValueId(@Param("attrValueId") Long attrValueId); + + /** + * 根据属性值-国际化表id删除属性值-国际化表 + * + * @param attrValueId + */ + void deleteById(@Param("attrValueId") Long attrValueId); + + /** + * 批量保存属性值语言信息 + * + * @param attrValueLangList + */ + void batchSave(@Param("attrValueLangList") List attrValueLangList); + + /** + * 批量更新 + * + * @param attrValueLangList + */ + void batchUpdate(@Param("attrValueLangList") List attrValueLangList); + + /** + * 批量删除 + * + * @param attrValueIds + */ + void deleteBatch(@Param("attrValueIds") List attrValueIds); + + /** + * 根据属性值id列表,删除属性值语言信息 + * + * @param attrValueIds + */ + void deleteByAttrValueIds(@Param("attrValueIds") List attrValueIds); + + /** + * 根据属性id及语言id列表,删除属性值语言信息 + * @param attrId + * @param langList + */ + void deleteByAttrIdAndLangs(@Param("attrId") Long attrId, @Param("langList") Collection langList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrValueMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrValueMapper.java new file mode 100644 index 0000000..eaeb0f7 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/AttrValueMapper.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.AttrValue; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 属性值信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface AttrValueMapper { + + /** + * 批量删除 + * + * @param attrValueIds + */ + void deleteBatch(@Param("attrValueIds") List attrValueIds); + + /** + * 保存属性值 + * + * @param attrValue + */ + void save(@Param("attrValue") AttrValue attrValue); + + /** + * 根据属性id, 删除属性值信息 + * + * @param attrId + */ + void deleteByAttrId(@Param("attrId") Long attrId); + + /** + * 根据属性id,获取属性值id列表 + * + * @param attrId 属性id + * @return 属性值id列表 + */ + List getAttrValueIdsByAttrId(@Param("attrId") Long attrId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandLangMapper.java new file mode 100644 index 0000000..b9506ac --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandLangMapper.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.product.model.BrandLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * 品牌-国际化表 + * + * @author YXF + * @date 2021-04-26 15:17:37 + */ +public interface BrandLangMapper { + + /** + * 获取品牌-国际化表列表 + * + * @return 品牌-国际化表列表 + */ + List list(); + + /** + * 根据品牌-国际化表id获取品牌-国际化表 + * + * @param brandId 品牌-国际化表id + * @return 品牌-国际化表 + */ + BrandLang getByBrandId(@Param("brandId") Long brandId); + + /** + * 根据品牌-国际化表id删除品牌-国际化表 + * + * @param brandId + */ + void deleteById(@Param("brandId") Long brandId); + + /** + * 批量保存 + * + * @param brandLangList + */ + void batchSave(@Param("brandLangList") List brandLangList); + + /** + * 批量更新 + * + * @param brandLangList + */ + void batchUpdate(@Param("brandLangList") List brandLangList); + + /** + * 批量插入品牌信息 + * + * @param brandList + * @param lang + */ + void insertBatch(@Param("brandList") List brandList, @Param("lang") Integer lang); + + /** + * 根据品牌id列表删除品牌名称信息 + * + * @param brandIdList + */ + void deleteBatchByBrandIds(@Param("brandIdList") List brandIdList); + + /** + * 根据品牌id,获取品牌国际化信息列表 + * + * @param brandId 品牌id + * @return 品牌国际化信息列表 + */ + List langIdsByBrandId(@Param("brandId") Long brandId); + + /** + * 批量删除品牌信息 + * + * @param langIds 语言id列表 + * @param brandId 品牌id + */ + void batchDelete(@Param("langIds") List langIds, @Param("brandId") Long brandId); + + /** + * 根据品牌名,获取品牌列表 + * + * @param brandNames 品牌名 + * @param shopId 店铺id + * @return 品牌列表 + */ + List listByBrandNames(@Param("brandNames") Set brandNames, @Param("shopId") Long shopId); + + /** + * 根据品牌的中英名,获取品牌列表 + * + * @param cn + * @param en + * @return + */ + List selectByBrandNamesCnOrEn(@Param("cn") String cn, @Param("en") String en); + + /** + * 根据品牌的中英名和品牌id,获取品牌列表 + * + * @param cn + * @param en + * @param brandId 品牌id + * @return + */ + List selectByBrandNamesCnOrEnAndBrandId(@Param("cn") String cn, @Param("en") String en, @Param("brandId") Long brandId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandMapper.java new file mode 100644 index 0000000..da53d58 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/BrandMapper.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.product.vo.app.BrandAppVO; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.model.Brand; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 品牌信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface BrandMapper { + + /** + * 获取品牌信息列表 + * + * @param pageAdapter 分页信息 + * @param brandDTO 品牌信息 + * @return 品牌信息列表 + */ + List list(@Param("page") PageAdapter pageAdapter, @Param("brandDTO") BrandDTO brandDTO); + + /** + * 获取品牌数量 + * + * @param brandDTO 品牌信息 + * @return 品牌信息列表 + */ + Long listTotal(@Param("brandDTO") BrandDTO brandDTO); + + /** + * 根据品牌信息id获取品牌信息 + * + * @param brandId 品牌信息id + * @return 品牌信息 + */ + BrandVO getByBrandId(@Param("brandId") Long brandId); + + /** + * 保存品牌信息 + * + * @param brand 品牌信息 + */ + void save(@Param("brand") Brand brand); + + /** + * 更新品牌信息 + * + * @param brand 品牌信息 + */ + void update(@Param("brand") Brand brand); + + /** + * 根据品牌信息id删除品牌信息 + * + * @param brandId + */ + void deleteById(@Param("brandId") Long brandId); + + /** + * 获取品牌在商品中使用的数量 + * + * @param brandId + * @return 使用该品牌的商品数量 + */ + int getUseNum(@Param("brandId") Long brandId); + + /** + * 更新品牌状态(启用或禁用) + * + * @param brandDTO + */ + void updateBrandStatus(@Param("brand") BrandDTO brandDTO); + + /** + * 根据分类id,获取品牌列表(分类中的推荐品牌) + * + * @param categoryId + * @return + */ + List listByCategory(@Param("categoryId") Long categoryId); + + /** + * 批量更新品牌的商品数量 + * + * @param brandIds + */ + void batchUpdateSpuCount(@Param("brandIds") Collection brandIds); + + /** + * 获取前端品牌分页信息 + * + * @param pageAdapter 分页信息 + * @param brandDTO 品牌列表筛选条件 + * @return 品牌列表 + */ + List brandAppPage(@Param("page") PageAdapter pageAdapter, @Param("brand") BrandDTO brandDTO); + + /** + * 获取前端品牌总数 + * + * @param brandDTO 品牌总数筛选条件 + * @return 品牌总数 + */ + Long brandAppTotal(@Param("brand") BrandDTO brandDTO); + + /** + * 获取前端品牌列表 + * + * @param brandDTO 品牌列表筛选条件 + * @param limit 品牌列表数量 + * @return 品牌列表 + */ + List appList(@Param("brand") BrandDTO brandDTO, @Param("limit") Integer limit); + + + /** + * 根据品牌名称获取品牌列表 + * + * @param name 品牌名称 + * @param lang 语言 + * @return 品牌列表 + */ + List listByName(@Param("name") String name, @Param("lang") Integer lang); + + /** + * 根据品牌id列表获取品牌列表 + * + * @param brandIdList + * @return + */ + List listByIds(@Param("brandIdList") List brandIdList); + + /** + * 根据店铺id删除该店铺下的品牌信息 + * + * @param shopId + * @param sysType + */ + void deleteBatchByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 批量插入品牌自定义品牌 + * + * @param brandList + */ + void insertBatchByBrandShopList(@Param("brandList") List brandList); + + /** + * 根据店铺id获取店铺下的品牌列表 + * + * @param shopId + * @param sysType + * @return + */ + List listByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType); + + /** + * 根据店铺id更新该店铺下的品牌的店铺id和品牌状态 + * + * @param oldShopId + * @param status + * @param newShopId + * @param sysType + */ + void updateShopIdAndStatusByShopId(@Param("oldShopId") Long oldShopId, @Param("status") Integer status, @Param("newShopId") long newShopId, @Param("sysType") Integer sysType); + + /** + * 根据店铺id与品牌名称,分类id获取已经签约的品牌列表 + * @param shopId + * @param brandName + * @param categoryId + * @param sysType + * @return + */ + List listSigningByShopIdAndBrandNameAndCategoryId(@Param("shopId") Long shopId, @Param("brandName") String brandName, @Param("categoryId") Long categoryId, @Param("sysType") Integer sysType); + + /** + * 根据商品id列表,获取品牌id列表 + * + * @param spuIds 商品id列表 + * @return 品牌id列表 + */ + List listBrandIdBySpuIds(@Param("spuIds") List spuIds); + + /** + * 根据参数获取品牌列表 + * + * @param brandDTO + * @return + */ + List listByParams(@Param("brandDTO") BrandDTO brandDTO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryBrandMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryBrandMapper.java new file mode 100644 index 0000000..e64d072 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryBrandMapper.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.product.model.CategoryBrand; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 品牌分类关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface CategoryBrandMapper { + + /** + * 根据品牌分类关联信息id删除品牌分类关联信息 + * + * @param brandIdList + */ + void deleteByBrandId(@Param("brandIdList") List brandIdList); + + /** + * 批量保存 + * + * @param categoryBrandList + */ + void saveBatch(@Param("categoryBrandList") List categoryBrandList); + + /** + * 根据品牌id获取关联的分类id + * + * @param brandId 品牌id + * @return 分类id列表 + */ + List getCategoryIdsByBrandId(@Param("brandId") Long brandId); + + /** + * 根据品牌id和分类id列表删除关联信息 + * + * @param brandId + * @param categoryIds + */ + void deleteByBrandIdAndCategoryIds(@Param("brandId") Long brandId, @Param("categoryIds") List categoryIds); + + /** + * 获取品牌分类信息 + * + * @param brandId 品牌id + * @param lang 语言 + * @return 分类信息 + */ + List getCategoryByBrandId(@Param("brandId") Long brandId, @Param("lang") Integer lang); + + /** + * 根据品牌id与分类id统计数量 + * + * @param brandId + * @param categoryId + * @return + */ + int countByBrandIdAndCategoryId(@Param("brandId") Long brandId, @Param("categoryId") Long categoryId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryLangMapper.java new file mode 100644 index 0000000..11f3fa1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryLangMapper.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.tmerclub.cloud.product.model.CategoryLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 分类-国际化表 + * + * @author YXF + * @date 2021-04-22 17:48:16 + */ +public interface CategoryLangMapper { + + /** + * 获取分类-国际化表列表 + * + * @return 分类-国际化表列表 + */ + List list(); + + /** + * 根据分类-国际化表id获取分类-国际化表 + * + * @param categoryId 分类-国际化表id + * @return 分类-国际化表 + */ + CategoryLang getByCategoryId(@Param("categoryId") Long categoryId); + + /** + * 根据分类-国际化表id删除分类-国际化表 + * + * @param categoryId + */ + void deleteById(@Param("categoryId") Long categoryId); + + /** + * 批量保存多语言信息 + * + * @param categoryLangList + */ + void batchSave(@Param("categoryLangList") List categoryLangList); + + /** + * 批量更新多语言信息 + * + * @param categoryLangList + */ + void batchUpdate(@Param("categoryLangList") List categoryLangList); + + /** + * 批量删除 + * + * @param langIds + * @param categoryId + */ + void batchDelete(@Param("langIds") List langIds, @Param("categoryId") Long categoryId); + + /** + * 查询分类名是否存在 + * + * @param categoryDTO + * @return 已存在的名称列表 + */ + List existCategoryName(@Param("category") CategoryDTO categoryDTO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryMapper.java new file mode 100644 index 0000000..e8e79fd --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/CategoryMapper.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.api.product.bo.PlatformCommissionOrderItemBO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.model.Category; +import com.tmerclub.cloud.product.vo.CategoryExcelVO; +import com.tmerclub.cloud.product.vo.CategoryPlatformExcelVO; +import com.tmerclub.cloud.product.vo.CategoryUseNumVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * 分类信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface CategoryMapper { + + /** + * 根据分类信息id获取分类信息 + * + * @param categoryId 分类信息id + * @return 分类信息 + */ + CategoryVO getById(@Param("categoryId") Long categoryId); + + /** + * 保存分类信息 + * + * @param category 分类信息 + */ + void save(@Param("category") Category category); + + /** + * 更新分类信息 + * + * @param category 分类信息 + * @return 更新的数量 + */ + int update(@Param("category") Category category); + + /** + * 根据分类信息id删除分类信息 + * + * @param categoryId + */ + void deleteById(@Param("categoryId") Long categoryId); + + /** + * 获取分类被关联的数量 + * + * @param categoryId + * @param shopId + * @return + */ + List getCategoryUseNum(@Param("categoryId") Long categoryId, @Param("shopId") Long shopId); + + /** + * 获取分类列表(未删除的分类--启用、未启用状态, 用于分类管理) + * + * @param shopId 店铺id 必填 + * @param level 分类等级-后面参数多了再换成类 + * @return + */ + List list(@Param("shopId") Long shopId, @Param("level") Integer level); + + + /** + * 获取分类列表(仅启用状态的分类) + * + * @param shopId 店铺id 必填 + * @param parentId 不填默认 + * @return + */ + List listByShopIdAndParenId(@Param("shopId") Long shopId, @Param("parentId") Long parentId); + + /** + * 根据分类id 获取分类下的子分类 + * + * @param categoryId + * @return + */ + List getChildCategory(@Param("categoryId") Long categoryId); + + /** + * 批量更新分类状态(启用、禁用) + * + * @param categoryIds + * @param status + * @return + */ + int updateBatchOfStatus(@Param("categoryIds") List categoryIds, @Param("status") Integer status); + + /** + * 根据分类id列表,获取分类列表 + * + * @param categoryIds 分类id + * @return 分类列表 + */ + List getListByCategoryIds(@Param("categoryIds") Set categoryIds); + + /** + * 获取店铺签约成功的分类信息列表(仅关联的三级分类) + * + * @param shopId + * @param sysType + * @param status + * @return + */ + List listSigningCategoryByShopIdAndStatus(@Param("shopId") Long shopId, @Param("sysType") Integer sysType, @Param("status") Integer status); + + + /** + * 获取整个平台的佣金比例 + * + * @return 整个平台的佣金比例 + */ + List listRate(); + + /** + * 根据分类id列表,获取分类列表 + * + * @param categoryIds 分类id列表 + * @return 分类列表 + */ + List listByCategoryIds(@Param("categoryIds") Set categoryIds); + + /** + * 获取当前节点所有父节点的分类ids,以及当前分类节点的父级节点的父级几点的分类ids + * + * @param categoryIds 当前分类节点ids + * @return 所有父级节点ids + */ + List getParentIdsByCategoryId(@Param("categoryIds") List categoryIds); + + + /** + * 根据skuId获取skuId分类列表 + * + * @param platformCommissionOrderItems skuId分类列表 + * @return skuId分类列表 + */ + List listBySkuIds(@Param("platformCommissionOrderItems") List platformCommissionOrderItems); + + /** + * 根据店铺id与父分类id获取分类id列表 + * + * @param shopId + * @param parentId + * @return + */ + List listCategoryIdByShopIdAndParentId(@Param("shopId") Long shopId, @Param("parentId") Long parentId); + + /** + * 获取指定分类及其上级分类 + * + * @param categoryIds + * @return + */ + List listCategoryAndParentInfo(@Param("categoryIds") Set categoryIds); + + /** + * 获取分类列表(已经启用的) + * + * @param shopId 店铺id 必填 + * @param level 分类等级-后面参数多了再换成类 + * @return + */ + List listEnable(@Param("shopId") Long shopId, @Param("level") Integer level); + + /** + * 获取分类及分类国际化列表 + * + * @return + */ + List listPlatformCategoryAndLangList(); + + /** + * 获取商家/供应商分类列表 + * + * @param shopId + * @return + */ + List listShopCategoryAndLangList(@Param("shopId") Long shopId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/GiveawaySpuMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/GiveawaySpuMapper.java new file mode 100644 index 0000000..d8a3b54 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/GiveawaySpuMapper.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.vo.GiveawaySpuVO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.product.dto.GiveawaySpuDTO; +import com.tmerclub.cloud.product.model.GiveawaySpu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 赠品套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:59 + */ +public interface GiveawaySpuMapper { + + /** + * 获取赠品套装商品项列表 + * + * @return 赠品套装商品项列表 + */ + List list(); + + /** + * 根据商品id获取赠品套装商品项 + * + * @param spuId 商品id + * @return 赠品套装商品项 + */ + List getBySpuId(@Param("spuId") Long spuId); + + /** + * 根据赠品id获取赠品套装商品项 + * @param giveawayId + * @param lang + * @param status + * @return + */ + List getByGiveawayId(@Param("giveawayId") Long giveawayId, @Param("lang") Integer lang, @Param("status") Integer status); + + + /** + * 根据商品id获取赠品套装商品项 + * + * @param spuId + * @return + */ + GiveawayVO getGiveawayBySpuId(@Param("spuId") Long spuId); + + + /** + * 保存赠品套装商品项 + * + * @param giveawaySpu 赠品套装商品项 + */ + void save(@Param("giveawaySpu") GiveawaySpu giveawaySpu); + + /** + * 批量更新赠品套装商品项 + * @param giveawayId + * @param status + * @return + */ + boolean updateStatus(@Param("giveawayId") Long giveawayId, @Param("status") Integer status); + + /** + * 根据赠品套装商品项id删除赠品套装商品项 + * + * @param giveawaySpuId + */ + void deleteById(@Param("giveawaySpuId") Long giveawaySpuId); + + /** + * 批量保存赠品套装商品项 + * + * @param giveawaySpuList + */ + void insertBatch(@Param("giveawaySpuList") List giveawaySpuList); + + /** + * 批量删除赠品套餐商品项 + * + * @param giveawaySpuIds + */ + void batchDeleteByIds(@Param("giveawaySpuIds") List giveawaySpuIds); + + + /** + * 获取主赠送商品 + * + * @param giveawaySpuDTO + * @param lang + * @return + */ + List getMainSpuPage(@Param("giveawaySpuDTO") GiveawaySpuDTO giveawaySpuDTO, @Param("lang") Integer lang); + + /** + * 失效赠送商品项状态 + * + * @param giveawayIdList + */ + void changeGiveawayActivityStatusByGiveawayIdList(@Param("giveawayIdList") List giveawayIdList); + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuAttrValueMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuAttrValueMapper.java new file mode 100644 index 0000000..284d52c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuAttrValueMapper.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.vo.SpuAttrValueVO; +import com.tmerclub.cloud.product.model.SpuAttrValue; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 商品规格属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuAttrValueMapper { + + /** + * 批量保存 + * + * @param spuAttrValues 规格list + */ + void batchSave(@Param("spuAttrValues") List spuAttrValues); + + /** + * 根据spuId删除对应规格属性 + * + * @param spuId id + */ + void deleteBySpuId(Long spuId); + + /** + * 根据属性和属性值id列表删除商品属性关联信息 + * + * @param attrId 属性id + * @param attrValueIds 属性值id + */ + void deleteByAttId(@Param("attrId") Long attrId, @Param("attrValueIds") List attrValueIds); + + /** + * 根据属性和分类id列表删除商品属性关联信息 + * + * @param attrId 属性id + * @param categoryIds 属性值id + */ + void deleteByCategoryIds(@Param("attrId") Long attrId, @Param("categoryIds") List categoryIds); + + /** + * 根据spuId获取商品属性列表 + * + * @param spuId + * @return + */ + List getSpuAttrsBySpuId(@Param("spuId") Long spuId); + + /** + * 批量更新商品属性列表 + * + * @param spuAttrValues + */ + void batchUpdate(@Param("spuAttrValues") List spuAttrValues); + + /** + * 根据属性值id,获取spuId列表 + * + * @param attrValueIds + * @return + */ + List spuIdListByAttrValueIds(@Param("attrValueIds") Collection attrValueIds); + + /** + * 批量更新商品基本属性 + * + * @param spuAttrValues + */ + void batchUpdateSpuAttrValue(@Param("spuAttrValues") List spuAttrValues); + + /** + * 根据商品id及属性id列表, 批量删除商品属性信息 + * + * @param spuId + * @param attrIds + */ + void deleteBatchBySpuIdAndAttrIds(@Param("spuId") Long spuId, @Param("attrIds") List attrIds); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuCollectionMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuCollectionMapper.java new file mode 100644 index 0000000..724c320 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuCollectionMapper.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.product.model.SpuCollection; +import com.tmerclub.cloud.product.vo.SpuCollectionVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品收藏信息 + * + * @author FrozenWatermelon + * @date 2020-11-21 14:43:16 + */ +public interface SpuCollectionMapper { + + /** + * 获取商品收藏信息列表 + * + * @return 商品收藏信息列表 + */ + List list(); + + /** + * 根据商品收藏信息id获取商品收藏信息 + * + * @param id 商品收藏信息id + * @return 商品收藏信息 + */ + SpuCollectionVO getById(@Param("id") Long id); + + /** + * 保存商品收藏信息 + * + * @param spuCollection 商品收藏信息 + */ + void save(@Param("spuCollection") SpuCollection spuCollection); + + /** + * 更新商品收藏信息 + * + * @param spuCollection 商品收藏信息 + */ + void update(@Param("spuCollection") SpuCollection spuCollection); + + /** + * 根据商品收藏信息id删除商品收藏信息 + * + * @param id + */ + void deleteById(@Param("id") Long id); + + /** + * 获取用户的商品收藏数量 + * + * @param spuId + * @param userId + * @return + */ + Integer userCollectionCount(@Param("spuId") Long spuId, @Param("userId") Long userId); + + /** + * 分页返回收藏数据 + * + * @param userId 用户id + * @param spuName 筛选名称 + * @param lang 语言 + * @param prodType 收藏失效状态,2为失效,0为正常 + * @return 收藏数据 + */ + List getUserCollectionDtoPageByUserId(@Param("userId") Long userId, @Param("spuName") String spuName, + @Param("lang") Integer lang, @Param("prodType") Integer prodType); + + + /** + * 删除商品收藏 + * + * @param spuId + * @param spuIds + * @param userId + */ + void deleteUserCollection(@Param("spuId") Long spuId, @Param("spuIds") List spuIds, @Param("userId") Long userId); + + /** + * 获取商品列表中已收藏的spuId + * + * @param spuIdList + * @param userId + * @return + */ + List hasCollection(@Param("spuIdList") List spuIdList, @Param("userId") Long userId); + + /** + * 批量删除商品收藏 + * @param spuIdList + * @param userId + */ + void saveBatch(@Param("spuIdList") List spuIdList, @Param("userId") Long userId); + + /** + * 根据商品id删除关联收藏信息 + * @param spuId 商品id + */ + void deleteBySpuId(@Param("spuId") Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuDetailMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuDetailMapper.java new file mode 100644 index 0000000..506f64f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuDetailMapper.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.SpuDetail; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品详情信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuDetailMapper { + + /** + * 批量更新商品详情信息 + * + * @param spuDetailList 商品详情信息 + */ + void batchUpdate(@Param("spuDetailList") List spuDetailList); + + /** + * 根据商品详情信息id删除商品详情信息 + * + * @param spuId + */ + void deleteById(@Param("spuId") Long spuId); + + /** + * 批量保存 + * + * @param spuDetailList + */ + void batchSave(@Param("spuDetailList") List spuDetailList); + + /** + * 批量删除 + * + * @param spuId + * @param langList + */ + void deleteBatchBySpuIdAndLang(@Param("spuId") Long spuId, @Param("langList") List langList); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuExtensionMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuExtensionMapper.java new file mode 100644 index 0000000..a7b8d33 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuExtensionMapper.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.SpuExtension; +import com.tmerclub.cloud.product.vo.SpuExtensionVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +/** + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +public interface SpuExtensionMapper { + + /** + * 获取列表 + * + * @return 列表 + */ + List list(); + + /** + * 根据id获取 + * + * @param spuExtendId id + * @return + */ + SpuExtensionVO getBySpuExtendId(@Param("spuExtendId") Long spuExtendId); + + /** + * 保存 + * + * @param spuExtension + */ + void save(@Param("spuExtension") SpuExtension spuExtension); + + /** + * 根据id删除 + * + * @param spuId id + */ + void deleteById(@Param("spuId") Long spuId); + + /** + * 获取spu扩展信息 + * + * @param spuId + * @return + */ + SpuExtension getBySpuId(Long spuId); + + /** + * 更新商品扩展信息 + * + * @param spuExtension + */ + void update(@Param("spuExtension") SpuExtension spuExtension); + + /** + * 根据商品id更新商品注水销量 + * + * @param spuId + * @param waterSoldNum + */ + void updateWaterSoldNumBySpuId(@Param("spuId") Long spuId, @Param("waterSoldNum") Integer waterSoldNum); + + /** + * 根据商品id修改商品评价数量 + * + * @param spuId + * @param changeCount + */ + void changeCommentNum(@Param("spuId") Long spuId, @Param("changeCount") Integer changeCount); + + /** + * 根据秒杀订单支付成功,更新商品销量 + * + * @param spuId + * @param prodCount + * @return + */ + void updateSaleNumBySeckillOrder(@Param("spuId") Long spuId, @Param("prodCount") Integer prodCount); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuLangMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuLangMapper.java new file mode 100644 index 0000000..bdef1d4 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuLangMapper.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.SpuLang; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface SpuLangMapper { + + /** + * 获取商品-国际化表列表 + * + * @return 商品-国际化表列表 + */ + List list(); + + /** + * 根据商品-国际化表id获取商品-国际化表 + * + * @param spuId 商品-国际化表id + * @return 商品-国际化表 + */ + SpuLang getBySpuId(@Param("spuId") Long spuId); + + /** + * 批量更新商品-国际化表 + * + * @param spuLangList 商品-国际化表 + */ + void batchUpdate(@Param("spuLangList") List spuLangList); + + /** + * 根据商品-国际化表id删除商品-国际化表 + * + * @param spuId + */ + void deleteById(@Param("spuId") Long spuId); + + /** + * 批量保存 + * @param spuLangList 商品国际化信息 + */ + void batchSave(@Param("spuLangList") List spuLangList); + + /** + * 批量删除 + * @param spuId 商品id + * @param langList 语言列表 + */ + void deleteBatchBySpuIdAndLang(@Param("spuId") Long spuId, @Param("langList") List langList); + + /** + * 获取商品的语言id列表 + * + * @param spuId 商品id + * @return 语言id列表 + */ + List listLangId(@Param("spuId") Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSkuAttrValueMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSkuAttrValueMapper.java new file mode 100644 index 0000000..1339c67 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuSkuAttrValueMapper.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.common.product.dto.SpuSkuAttrValueDTO; +import com.tmerclub.cloud.product.model.SpuSkuAttrValue; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品sku销售属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuSkuAttrValueMapper { + + /** + * 批量更新商品sku销售属性关联信息 + * + * @param spuSkuAttrValues 商品sku销售属性关联信息 + */ + void updateBatch(@Param("spuSkuAttrValues") List spuSkuAttrValues); + + /** + * 根据商品sku销售属性关联信息id删除商品sku销售属性关联信息 + * + * @param spuSkuAttrId + */ + void deleteById(@Param("spuSkuAttrId") Long spuSkuAttrId); + + /** + * 批量保存sku规格信息 + * + * @param spuSkuAttrValues attrList + */ + void batchSave(@Param("spuSkuAttrValues") List spuSkuAttrValues); + + /** + * 修改商品规格信息 + * + * @param spuId + */ + void updateBySpuId(@Param("spuId") Long spuId); + + /** + * 根据skuId列表,改变销售属性状态 + * @param skuIds + * @param status + */ + void changeStatusBySkuId(@Param("skuIds") List skuIds, @Param("status") Integer status); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuTagReferenceMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuTagReferenceMapper.java new file mode 100644 index 0000000..976c0ea --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/SpuTagReferenceMapper.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.SpuTagReferenceDTO; +import com.tmerclub.cloud.product.model.SpuTagReference; +import com.tmerclub.cloud.product.vo.SpuTagReferenceVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 商品分组标签关联信息 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public interface SpuTagReferenceMapper { + + /** + * 获取商品分组标签关联信息列表 + * + * @return 商品分组标签关联信息列表 + */ + List list(); + + /** + * 根据商品分组标签关联信息id获取商品分组标签关联信息 + * + * @param referenceId 商品分组标签关联信息id + * @return 商品分组标签关联信息 + */ + SpuTagReferenceVO getByReferenceId(@Param("referenceId") Long referenceId); + + /** + * 保存商品分组标签关联信息 + * + * @param spuTagReference 商品分组标签关联信息 + */ + void save(@Param("spuTagReference") SpuTagReference spuTagReference); + + /** + * 更新商品分组标签关联信息 + * + * @param spuTagReference 商品分组标签关联信息 + */ + void update(@Param("spuTagReference") SpuTagReference spuTagReference); + + /** + * 根据商品分组标签关联信息id删除商品分组标签关联信息 + * + * @param referenceId + */ + void deleteById(@Param("referenceId") Long referenceId); + + /** + * 根据状态和分组id返回分组下的商品数量 + * + * @param status 状态 + * @param id 分组id + * @return 返回商品数量 + */ + int countByStatusAndTagId(@Param("status") Integer status, @Param("id") Long id); + + /** + * 批量保存关联信息 + * + * @param spuTagReferences 商品标签关联列表 + */ + void saveBatch(@Param("spuTagReferences") List spuTagReferences); + + /** + * 根据ids获取商品标签关联信息列表 + * + * @param ids 商品id + * @return 返回标签关联信息 + */ + List listByIds(@Param("ids") List ids); + + /** + * 修改标签内商品排序 + * + * @param spuTagReferences 商品排序信息 + */ + void updateSpuSeq(@Param("spuTagReferences") List spuTagReferences); + + /** + * 根据ids删除对应的关联信息 + * + * @param prodTagId 商品分组id + * @param ids 关联ids + */ + void removeByIds(@Param("prodTagId") Long prodTagId, @Param("ids") List ids); + + /** + * 获取商品所属的分组列表 + * + * @param spuId + * @return + */ + List tagListBySpuId(@Param("spuId") Long spuId); + + /** + * 删除spu关联分组的数据 + * + * @param spuIds + */ + void deleteSpuData(@Param("spuIds") List spuIds); + + /** + * 根据分类,删除spu关联分组的数据 + * + * @param shopId + * @param categoryIds + */ + void deleteSpuTagByShopIdAndCategoryIds(@Param("shopId") Long shopId, @Param("categoryIds") List categoryIds); + + /** + * 根据spuId获取分组id列表 + * + * @param spuIds 商品id列表 + * @return 分组id列表 + */ + List listSpuTagIdBySpuIds(@Param("spuIds") List spuIds); + + /** + * 根据店铺id及分类id列表,获取分组id列表 + * + * @param shopId + * @param categoryIds + * @return + */ + List getTagIdsByShopIdAndCategoryIds(@Param("shopId") Long shopId, @Param("categoryIds") List categoryIds); + + /** + * 根据分组id,获取分组下的商品id列表 + * + * @param tagId 分组id + * @return 商品id列表 + */ + List spuIdsByTagId(@Param("tagId") Long tagId); + + /** + * 获取spuId列表 + * + * @param spuTagReferenceDTO + * @return + */ + List getSpuIds(@Param("spuTagReference") SpuTagReferenceDTO spuTagReferenceDTO); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonMapper.java new file mode 100644 index 0000000..7a2474d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonMapper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.product.model.StockChangeReason; +import com.tmerclub.cloud.product.vo.StockChangeReasonVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 出入库原因 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface StockChangeReasonMapper { + + /** + * 根据出入库原因id获取出入库原因 + * + * @param stockChangeReasonId 出入库原因id + * @return 出入库原因 + */ + StockChangeReason getByStockChangeReasonId(@Param("stockChangeReasonId") Long stockChangeReasonId); + + /** + * 保存出入库原因 + * @param stockChangeReason 出入库原因 + */ + void save(@Param("stockChangeReason") StockChangeReason stockChangeReason); + + /** + * 更新出入库原因 + * @param stockChangeReason 出入库原因 + */ + void update(@Param("stockChangeReason") StockChangeReason stockChangeReason); + + /** + * 根据出入库原因id删除出入库原因 + * @param stockChangeReasonId + */ + void deleteById(@Param("stockChangeReasonId") Long stockChangeReasonId); + + /** + * 分页获取出入库原因列表 + * @return 出入库原因列表 + * @param stockChangeReasonDTO + */ + List pageByParams(@Param("stockChangeReason") StockChangeReasonDTO stockChangeReasonDTO); + + /** + * 根据店铺id获取 + * @param stockChangeReasonDTO + * @return + */ + List getByShopId(@Param("stockChangeReasonDTO") StockChangeReasonDTO stockChangeReasonDTO); + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonStatusMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonStatusMapper.java new file mode 100644 index 0000000..45e40c5 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/StockChangeReasonStatusMapper.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.StockChangeReasonStatus; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 出入库原因状态 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface StockChangeReasonStatusMapper { + + /** + * 获取出入库原因状态列表 + * @return 出入库原因状态列表 + */ + List list(); + + /** + * 根据出入库原因状态id获取出入库原因状态 + * + * @param stockChangeReasonStatusId 出入库原因状态id + * @return 出入库原因状态 + */ + StockChangeReasonStatus getByStockChangeReasonStatusId(@Param("stockChangeReasonStatusId") Long stockChangeReasonStatusId); + + /** + * 保存出入库原因状态 + * @param stockChangeReasonStatus 出入库原因状态 + */ + void save(@Param("stockChangeReasonStatus") StockChangeReasonStatus stockChangeReasonStatus); + + /** + * 更新出入库原因状态 + * @param stockChangeReasonStatus 出入库原因状态 + */ + void update(@Param("stockChangeReasonStatus") StockChangeReasonStatus stockChangeReasonStatus); + + /** + * 根据出入库原因状态id删除出入库原因状态 + * @param stockChangeReasonStatusId + */ + void deleteById(@Param("stockChangeReasonStatusId") Long stockChangeReasonStatusId); + + /** + * 根据shopId 和 reasonId 获取(系统)出入库原因状态 + * @param shopId 店铺id + * @param reasonId 出入库原因id + */ + StockChangeReasonStatus getStatusByShopIdAndReasonId(@Param("shopId") Long shopId, + @Param("reasonId") Long reasonId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/TakeStockSpuMapper.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/TakeStockSpuMapper.java new file mode 100644 index 0000000..871acac --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/mapper/TakeStockSpuMapper.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.mapper; + +import com.tmerclub.cloud.product.model.TakeStockSpu; +import com.tmerclub.cloud.product.vo.TakeStockSpuVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 盘点商品列表 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface TakeStockSpuMapper { + + /** + * 获取盘点商品列表列表 + * @return 盘点商品列表列表 + */ + List list(); + + /** + * 根据盘点商品列表id获取盘点商品列表 + * + * @param takeStockSpuId 盘点商品列表id + * @return 盘点商品列表 + */ + TakeStockSpu getByTakeStockSpuId(@Param("takeStockSpuId") Long takeStockSpuId); + + /** + * 保存盘点商品列表 + * @param takeStockSpu 盘点商品列表 + */ + void save(@Param("takeStockSpu") TakeStockSpu takeStockSpu); + + /** + * 批量保存盘点商品列表 + * @param takeStockSpuList + */ + void saveBatch(@Param("takeStockSpuList") List takeStockSpuList); + + /** + * 更新盘点商品列表 + * @param takeStockSpu 盘点商品列表 + */ + void update(@Param("takeStockSpu") TakeStockSpu takeStockSpu); + + /** + * 根据盘点商品列表id删除盘点商品列表 + * @param takeStockSpuId + */ + void deleteById(@Param("takeStockSpuId") Long takeStockSpuId); + + /** + * 根据实物盘点id删除实物盘点 + * @param takeStockId + */ + void deleteByTackStockId(@Param("takeStockId") Long takeStockId); + + /** + * 通过takeStockId获取实物盘点商品列表 + * @param takeStockId + * @param lang + * @return + */ + List listByTakeStockId(@Param("takeStockId") Long takeStockId, @Param("lang") Integer lang); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Attr.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Attr.java new file mode 100644 index 0000000..9ed43e0 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Attr.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 属性信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +public class Attr extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * attr id + */ + private Long attrId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 属性名称 + */ + private String name; + + /** + * 属性描述 + */ + private String desc; + + /** + * 作为搜索参数 0:不需要,1:需要 + */ + private Integer searchType; + + /** + * 属性类型 0:销售属性,1:基本属性 + */ + private Integer attrType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + /** + * 关联系统类型 1.店铺 2.平台端 3.供应商 + */ + private Integer sysType; + /** + * 属性值列表 + */ + private List attrValues; + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public Integer getSearchType() { + return searchType; + } + + public void setSearchType(Integer searchType) { + this.searchType = searchType; + } + + public Integer getAttrType() { + return attrType; + } + + public void setAttrType(Integer attrType) { + this.attrType = attrType; + } + + public List getAttrValues() { + return attrValues; + } + + public void setAttrValues(List attrValues) { + this.attrValues = attrValues; + } + + @Override + public String toString() { + return "Attr{" + + "attrId=" + attrId + + ", shopId=" + shopId + + ", name='" + name + '\'' + + ", desc='" + desc + '\'' + + ", searchType=" + searchType + + ", attrType=" + attrType + + ", sysType=" + sysType + + ", attrValues=" + attrValues + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrCategory.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrCategory.java new file mode 100644 index 0000000..ce02700 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrCategory.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 属性与属性分组关联信息 + * + * @author YXF + * @date 2020-11-23 16:20:01 + */ +public class AttrCategory extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 属性与分类关联id + */ + private Long attrCategoryId; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 属性id + */ + private Long attrId; + + public Long getAttrCategoryId() { + return attrCategoryId; + } + + public void setAttrCategoryId(Long attrCategoryId) { + this.attrCategoryId = attrCategoryId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + @Override + public String toString() { + return "AttrCategory{" + + "attrCategoryId=" + attrCategoryId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",categoryId=" + categoryId + + ",attrId=" + attrId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrLang.java new file mode 100644 index 0000000..74acc14 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrLang.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 属性-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class AttrLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 属性id + */ + private Long attrId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 属性名称 + */ + private String name; + + /** + * 属性名称 + */ + private String desc; + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "AttrLang{" + + "attrId=" + attrId + + ",lang=" + lang + + ",name=" + name + + ",desc=" + desc + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrValue.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrValue.java new file mode 100644 index 0000000..f9dfb1a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/AttrValue.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 属性值信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class AttrValue extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 属性id + */ + private Long attrValueId; + + /** + * 属性ID + */ + private Long attrId; + + /** + * 属性值 + */ + private String value; + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "AttrValue{" + + "attrValueId=" + attrValueId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",attrId=" + attrId + + ",value=" + value + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/BrandLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/BrandLang.java new file mode 100644 index 0000000..dc165ca --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/BrandLang.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 品牌-国际化表 + * + * @author YXF + * @date 2021-04-26 15:17:37 + */ +public class BrandLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 品牌id + */ + private Long brandId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 品牌名称 + */ + private String name; + + /** + * 品牌描述 + */ + private String desc; + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "BrandLang{" + + "brandId=" + brandId + + ",lang=" + lang + + ",name=" + name + + ",desc=" + desc + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/BrandShop.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/BrandShop.java new file mode 100644 index 0000000..7894f27 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/BrandShop.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 品牌店铺关联信息 + * + * @author FrozenWatermelon + * @date 2021-05-08 13:31:45 + */ +public class BrandShop extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long brandShopId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 品牌id + */ + private Long brandId; + + /** + * 授权资质图片,以,分割 + */ + private String qualifications; + + /** + * 类型 0:平台品牌,1:店铺自定义品牌 + */ + private Integer type; + + /** + * 关联系统类型 1.店铺 2.平台端 3.供应商 + */ + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getBrandShopId() { + return brandShopId; + } + + public void setBrandShopId(Long brandShopId) { + this.brandShopId = brandShopId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "BrandShop{" + + "brandShopId=" + brandShopId + + ", shopId=" + shopId + + ", brandId=" + brandId + + ", qualifications='" + qualifications + '\'' + + ", type=" + type + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryLang.java new file mode 100644 index 0000000..d870ba0 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/CategoryLang.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分类-国际化表 + * + * @author YXF + * @date 2021-04-22 17:48:16 + */ +public class CategoryLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 分类名称 + */ + private String name; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "CategoryLang{" + + "categoryId=" + categoryId + + ",lang=" + lang + + ",name=" + name + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/ShopCartItem.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/ShopCartItem.java new file mode 100644 index 0000000..11d2a46 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/ShopCartItem.java @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 购物车 + * + * @author FrozenWatermelon + * @date 2020-11-21 10:01:23 + */ +public class ShopCartItem extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long cartItemId; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 产品ID + */ + private Long spuId; + + /** + * SkuID + */ + private Long skuId; + + /** + * 分类ID + */ + private Long categoryId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 购物车产品个数 + */ + private Integer count; + + /** + * 满减活动ID + */ + private Long discountId; + + /** + * 售价,加入购物车时的商品价格 + */ + private Long priceFee; + + /** + * 分销员用户id + */ + private Long distributionUserId; + + /** + * 是否已经勾选 + */ + private Integer isChecked; + + /** + * 店铺是否停业 1:否 0:是 + */ + private Integer isClosed; + + /** + * 套餐id + */ + private Long comboId; + + /** + * 套餐数量 + */ + private Integer comboCount; + + /** + * 主购物车id(套餐) + */ + private Long parentCartItemId; + + public Long getComboId() { + return comboId; + } + + public void setComboId(Long comboId) { + this.comboId = comboId; + } + + public Integer getComboCount() { + return comboCount; + } + + public void setComboCount(Integer comboCount) { + this.comboCount = comboCount; + } + + public Long getParentCartItemId() { + return parentCartItemId; + } + + public void setParentCartItemId(Long parentCartItemId) { + this.parentCartItemId = parentCartItemId; + } + + public Integer getIsClosed() { + return isClosed; + } + + public void setIsClosed(Integer isClosed) { + this.isClosed = isClosed; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getDiscountId() { + return discountId; + } + + public void setDiscountId(Long discountId) { + this.discountId = discountId; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getDistributionUserId() { + return distributionUserId; + } + + public void setDistributionUserId(Long distributionUserId) { + this.distributionUserId = distributionUserId; + } + + + public Integer getIsChecked() { + return isChecked; + } + + public void setIsChecked(Integer isChecked) { + this.isChecked = isChecked; + } + + public Long getCartItemId() { + return cartItemId; + } + + public void setCartItemId(Long cartItemId) { + this.cartItemId = cartItemId; + } + + @Override + public String toString() { + return "ShopCartItem{" + + "cartItemId=" + cartItemId + + ", shopId=" + shopId + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", categoryId=" + categoryId + + ", userId=" + userId + + ", count=" + count + + ", discountId=" + discountId + + ", priceFee=" + priceFee + + ", distributionUserId=" + distributionUserId + + ", isChecked=" + isChecked + + ", isClosed=" + isClosed + + ", comboId=" + comboId + + ", comboCount=" + comboCount + + ", parentCartItemId=" + parentCartItemId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Sku.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Sku.java new file mode 100644 index 0000000..ec7d1b4 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Sku.java @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * sku信息 + * + * @author FrozenWatermelon + * @date 2020-12-08 15:54:22 + */ +public class Sku extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 属性id + */ + private Long skuId; + + /** + * SPU id + */ + private Long spuId; + + /** + * 多个销售属性值id逗号分隔 + */ + private String attrs; + + /** + * sku名称 + */ + private String skuName; + + /** + * sku图片 + */ + private String imgUrl; + + /** + * 售价,整数方式保存 + */ + private Long priceFee; + + /** + * 市场价,整数方式保存 + */ + private Long marketPriceFee; + + /** + * 积分价格 + */ + private Long scoreFee; + + /** + * 商品编码 + */ + private String partyCode; + + /** + * 商品条形码 + */ + private String modelId; + + /** + * 商品重量 + */ + private BigDecimal weight; + + /** + * 商品体积 + */ + private BigDecimal volume; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 当商品为代销商品时,供应商商品skuId + */ + private Long supplierSkuId; + + /** + * 库存预警 + */ + private Integer stockWarning; + + /** + * 组合id(组合商品独有) + */ + private Long skuComboId; + + public Long getSkuComboId() { + return skuComboId; + } + + public void setSkuComboId(Long skuComboId) { + this.skuComboId = skuComboId; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Integer getStockWarning() { + return stockWarning; + } + + public void setStockWarning(Integer stockWarning) { + this.stockWarning = stockWarning; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getAttrs() { + return attrs; + } + + public void setAttrs(String attrs) { + this.attrs = attrs; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getModelId() { + return modelId; + } + + public void setModelId(String modelId) { + this.modelId = modelId; + } + + public BigDecimal getWeight() { + return weight; + } + + public void setWeight(BigDecimal weight) { + this.weight = weight; + } + + public BigDecimal getVolume() { + return volume; + } + + public void setVolume(BigDecimal volume) { + this.volume = volume; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "Sku{" + + "skuId=" + skuId + + ", spuId=" + spuId + + ", attrs='" + attrs + '\'' + + ", skuName='" + skuName + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", scoreFee=" + scoreFee + + ", partyCode='" + partyCode + '\'' + + ", modelId='" + modelId + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", status=" + status + + ", supplierSkuId=" + supplierSkuId + + ", stockWarning=" + stockWarning + + ", skuComboId=" + skuComboId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuLang.java new file mode 100644 index 0000000..68840a7 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuLang.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * sku-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class SkuLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * sku id + */ + private Long skuId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + + /** + * sku名称 + */ + private String skuName; + + /** + * 多个销售属性值id逗号分隔 + */ + private String attrs; + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getAttrs() { + return attrs; + } + + public void setAttrs(String attrs) { + this.attrs = attrs; + } + + @Override + public String toString() { + return "SkuLang{" + + "skuId=" + skuId + + ", lang=" + lang + + ", skuName='" + skuName + '\'' + + ", attrs='" + attrs + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStock.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStock.java new file mode 100644 index 0000000..e535b23 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SkuStock.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 库存信息 + * + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +public class SkuStock extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + private Long spuId; + + /** + * SKU ID + */ + private Long skuId; + + /** + * 可售卖库存 + */ + private Integer stock; + + /** + * 锁定库存 + */ + private Integer lockStock; + + public SkuStock() { + } + + public SkuStock(Long skuId, Integer stock, Integer lockStock) { + this.skuId = skuId; + this.stock = stock; + this.lockStock = lockStock; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getLockStock() { + return lockStock; + } + + public void setLockStock(Integer lockStock) { + this.lockStock = lockStock; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + @Override + public String toString() { + return "SkuStock{" + + "spuId=" + spuId + + ", skuId=" + skuId + + ", lockStock=" + lockStock + + ", stock=" + stock + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Spu.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Spu.java new file mode 100644 index 0000000..7d3bddb --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Spu.java @@ -0,0 +1,729 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-12-08 15:54:23 + */ +public class Spu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * spu id + */ + private Long spuId; + + /** + * 品牌ID + */ + private Long brandId; + + /** + * 分类ID + */ + private Long categoryId; + + /** + * 店铺分类ID + */ + private Long shopCategoryId; + + /** + * 店铺id 0:平台端id, id > 0:店铺的id, -1:供应商商品 + */ + private Long shopId; + + /** + * spu名称 + */ + private String name; + + /** + * 卖点 + */ + private String sellingPoint; + + /** + * 主图 + */ + private String mainImgUrl; + + /** + * 商品图片 多个图片逗号分隔 + */ + private String imgUrls; + + /** + * 商品视频 + */ + private String video; + + /** + * 售价,整数方式保存 + */ + private Long priceFee; + + /** + * 市场价,整数方式保存 + */ + private Long marketPriceFee; + + /** + * 积分价格 + */ + private Long scoreFee; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 配送方式json见TransportModeVO + */ + private String deliveryMode; + + /** + * 运费模板id -1固定运费 0包邮 + */ + private Long deliveryTemplateId; + + /** + * 固定运费金额 + */ + private Long deliveryAmount; + + /** + * + */ + private Integer hasSkuImg; + /** + * 商品类型(0普通商品 1拼团 2秒杀 3积分) + */ + private Integer spuType; + + /** + * 活动id(关联prod_type) + */ + private Long activityId; + + /** + * 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 + */ + private Integer spuMold; + + /** + * 是否可以退款 1.可以 0不可以 + */ + private Integer isRefund; + + /** + * 虚拟商品的留言备注 + */ + private String virtualRemark; + + /** + * 序号 + */ + private Integer seq; + + /** + * 是否置顶,1.置顶 0.不置顶 + */ + private Integer isTop; + + /** + * spu编码 + */ + private String spuCode; + + /** + * 供应商商品类型 0.否 1.是 2.商家代销 + */ + private Integer supplierSpuType; + + /** + * 关联商品商品id,只有供应商商品为2才有 + */ + private Long supplierSpuId; + + /** + * 发货方式 1.供应商发货 2.仓库发货 + */ + private Integer supplierDeliveryType; + + /** + * 供应商id -1、0:普通商品, id > 0: 供应商商品 + */ + private Long supplierId; + + /** + * 计量单位 + */ + private String measureUnit; + + /** + * 代销商品规格选择状态,1: 全选 2:部分选择 + */ + private Integer skuChoiceStatus; + + /** + * 供应商商品更新后代销商品是否已同步更新 1:已更新 -1:未更新 + */ + private Integer isSynUpdate; + /** + * 预售类型 -1:未开启 0.全款预售 1.定金预售 + */ + private Integer preSaleType; + + /** + * 定金收取类型 0.按比例 1.按金额 + */ + private Integer depositType; + + /** + * 定金数额(定金收取类型比例为0时,代表百分比*100,为1时代表实际金额*100) + */ + private Long depositAmount; + + /** + * 定金膨胀数额(定金收取类型比例为0时,代表百分比*100,为1时代表实际金额*100) + */ + private Long depositExpansionAmount; + + /** + * 定金支付开始时间 + */ + private Date depositStartTime; + /** + * 定金支付结束时间 + */ + private Date depositEndTime; + + /** + * 尾款支付开始时间 + */ + private Date balanceStartTime; + + /** + * 尾款支付结束时间 + */ + private Date balanceEndTime; + + /** + * 预售发货类型 -1.固定时间 x.尾款支付后x天发货 + */ + private Integer preSaleDeliveryType; + + /** + * 预售发货时间 + */ + private Date preSaleDeliveryTime; + + @Schema(description = "定金数值") + private BigDecimal depositValue; + + /** + * 核销次数 -1.多次核销 0.无需核销 1.单次核销 + */ + private Integer writeOffNum; + + /** + * 多次核销次数 -1.无限次 + */ + private Integer writeOffMultipleCount; + + /** + * 核销有效期 -1.长期有效 0.自定义 x.x天内有效 + */ + private Integer writeOffTime; + + /** + * 核销开始时间 + */ + private Date writeOffStart; + + /** + * 核销结束时间 + */ + private Date writeOffEnd; + + /** + * 是否为全部实物商品的组合商品 1.是 0.否 + */ + private Integer isAllEntity; + + public Integer getIsAllEntity() { + return isAllEntity; + } + + public void setIsAllEntity(Integer isAllEntity) { + this.isAllEntity = isAllEntity; + } + + public Long getDeliveryAmount() { + return deliveryAmount; + } + + public void setDeliveryAmount(Long deliveryAmount) { + this.deliveryAmount = deliveryAmount; + } + + public Integer getWriteOffNum() { + return writeOffNum; + } + + public void setWriteOffNum(Integer writeOffNum) { + this.writeOffNum = writeOffNum; + } + + public Integer getWriteOffMultipleCount() { + return writeOffMultipleCount; + } + + public void setWriteOffMultipleCount(Integer writeOffMultipleCount) { + this.writeOffMultipleCount = writeOffMultipleCount; + } + + public Integer getWriteOffTime() { + return writeOffTime; + } + + public void setWriteOffTime(Integer writeOffTime) { + this.writeOffTime = writeOffTime; + } + + public Date getWriteOffStart() { + return writeOffStart; + } + + public void setWriteOffStart(Date writeOffStart) { + this.writeOffStart = writeOffStart; + } + + public Date getWriteOffEnd() { + return writeOffEnd; + } + + public void setWriteOffEnd(Date writeOffEnd) { + this.writeOffEnd = writeOffEnd; + } + + public BigDecimal getDepositValue() { + return depositValue; + } + + public void setDepositValue(BigDecimal depositValue) { + this.depositValue = depositValue; + } + + public Integer getIsSynUpdate() { + return isSynUpdate; + } + + public void setIsSynUpdate(Integer isSynUpdate) { + this.isSynUpdate = isSynUpdate; + } + + public Integer getSkuChoiceStatus() { + return skuChoiceStatus; + } + + public void setSkuChoiceStatus(Integer skuChoiceStatus) { + this.skuChoiceStatus = skuChoiceStatus; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + public Integer getSpuMold() { + return spuMold; + } + + public void setSpuMold(Integer spuMold) { + this.spuMold = spuMold; + } + + public Integer getIsRefund() { + return isRefund; + } + + public void setIsRefund(Integer isRefund) { + this.isRefund = isRefund; + } + + public String getVirtualRemark() { + return virtualRemark; + } + + public void setVirtualRemark(String virtualRemark) { + this.virtualRemark = virtualRemark; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Integer getHasSkuImg() { + return hasSkuImg; + } + + public void setHasSkuImg(Integer hasSkuImg) { + this.hasSkuImg = hasSkuImg; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getPreSaleType() { + return preSaleType; + } + + public void setPreSaleType(Integer preSaleType) { + this.preSaleType = preSaleType; + } + + public Integer getDepositType() { + return depositType; + } + + public void setDepositType(Integer depositType) { + this.depositType = depositType; + } + + public Long getDepositAmount() { + return depositAmount; + } + + public void setDepositAmount(Long depositAmount) { + this.depositAmount = depositAmount; + } + + public Long getDepositExpansionAmount() { + return depositExpansionAmount; + } + + public void setDepositExpansionAmount(Long depositExpansionAmount) { + this.depositExpansionAmount = depositExpansionAmount; + } + + public Date getDepositStartTime() { + return depositStartTime; + } + + public void setDepositStartTime(Date depositStartTime) { + this.depositStartTime = depositStartTime; + } + + public Date getDepositEndTime() { + return depositEndTime; + } + + public void setDepositEndTime(Date depositEndTime) { + this.depositEndTime = depositEndTime; + } + + public Date getBalanceStartTime() { + return balanceStartTime; + } + + public void setBalanceStartTime(Date balanceStartTime) { + this.balanceStartTime = balanceStartTime; + } + + public Date getBalanceEndTime() { + return balanceEndTime; + } + + public void setBalanceEndTime(Date balanceEndTime) { + this.balanceEndTime = balanceEndTime; + } + + public Integer getPreSaleDeliveryType() { + return preSaleDeliveryType; + } + + public void setPreSaleDeliveryType(Integer preSaleDeliveryType) { + this.preSaleDeliveryType = preSaleDeliveryType; + } + + public Date getPreSaleDeliveryTime() { + return preSaleDeliveryTime; + } + + public void setPreSaleDeliveryTime(Date preSaleDeliveryTime) { + this.preSaleDeliveryTime = preSaleDeliveryTime; + } + + @Override + public String toString() { + return "Spu{" + + "spuId=" + spuId + + ", brandId=" + brandId + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", shopId=" + shopId + + ", name='" + name + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", video='" + video + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", scoreFee=" + scoreFee + + ", status=" + status + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplateId=" + deliveryTemplateId + + ", deliveryAmount=" + deliveryAmount + + ", hasSkuImg=" + hasSkuImg + + ", spuType=" + spuType + + ", activityId=" + activityId + + ", spuMold=" + spuMold + + ", isRefund=" + isRefund + + ", virtualRemark='" + virtualRemark + '\'' + + ", seq=" + seq + + ", isTop=" + isTop + + ", spuCode='" + spuCode + '\'' + + ", supplierSpuType=" + supplierSpuType + + ", supplierSpuId=" + supplierSpuId + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierId=" + supplierId + + ", measureUnit='" + measureUnit + '\'' + + ", skuChoiceStatus=" + skuChoiceStatus + + ", isSynUpdate=" + isSynUpdate + + ", preSaleType=" + preSaleType + + ", depositType=" + depositType + + ", depositAmount=" + depositAmount + + ", depositExpansionAmount=" + depositExpansionAmount + + ", depositStartTime=" + depositStartTime + + ", depositEndTime=" + depositEndTime + + ", balanceStartTime=" + balanceStartTime + + ", balanceEndTime=" + balanceEndTime + + ", preSaleDeliveryType=" + preSaleDeliveryType + + ", preSaleDeliveryTime=" + preSaleDeliveryTime + + ", depositValue=" + depositValue + + ", writeOffNum=" + writeOffNum + + ", writeOffMultipleCount=" + writeOffMultipleCount + + ", writeOffTime=" + writeOffTime + + ", writeOffStart=" + writeOffStart + + ", writeOffEnd=" + writeOffEnd + + ", isAllEntity=" + isAllEntity + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuAttrValue.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuAttrValue.java new file mode 100644 index 0000000..51df607 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuAttrValue.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品规格属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class SpuAttrValue extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品属性值关联信息id + */ + private Long spuAttrValueId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 规格属性id + */ + private Long attrId; + + /** + * 规格属性名称 + */ + private String attrName; + + /** + * 规格属性值id + */ + private Long attrValueId; + + /** + * 规格属性值名称 + */ + private String attrValueName; + + /** + * 规格属性描述 + */ + private String attrDesc; + + public Long getSpuAttrValueId() { + return spuAttrValueId; + } + + public void setSpuAttrValueId(Long spuAttrValueId) { + this.spuAttrValueId = spuAttrValueId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public Long getAttrId() { + return attrId; + } + + public void setAttrId(Long attrId) { + this.attrId = attrId; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public Long getAttrValueId() { + return attrValueId; + } + + public void setAttrValueId(Long attrValueId) { + this.attrValueId = attrValueId; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + public String getAttrDesc() { + return attrDesc; + } + + public void setAttrDesc(String attrDesc) { + this.attrDesc = attrDesc; + } + + @Override + public String toString() { + return "SpuAttrValue{" + + "spuAttrValueId=" + spuAttrValueId + + ", spuId=" + spuId + + ", lang=" + lang + + ", attrId=" + attrId + + ", attrName='" + attrName + '\'' + + ", attrValueId=" + attrValueId + + ", attrValueName='" + attrValueName + '\'' + + ", attrDesc='" + attrDesc + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuConsignmentChange.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuConsignmentChange.java new file mode 100644 index 0000000..da27344 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuConsignmentChange.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商家代销商品基本信息相对于供应商品是否改变 + * + * @author FrozenWatermelon + * @date 2022-08-11 22:21:10 + */ +public class SpuConsignmentChange extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 代销商品基本信息是否已更新表id + */ + private Long consignmentChangeId; + + /** + * 代销商品id + */ + private Long spuId; + + /** + * 代销商品名称是否已更改 0未更改,1已更改 + */ + private Integer nameChange; + + /** + * 代销图片是否已更改 0未更改,1已更改 + */ + private Integer imageChange; + + /** + * 代销商品卖点是否已更改, 0未更改,1已更改 + */ + private Integer sellingPointChange; + + /** + * 代销商品视频是否已更改, 0未更改,1已更改 + */ + private Integer videoChange; + + /** + * 代销商品计量单位是否已更改,0未更改,1已更改 + */ + private Integer measureUnitChange; + + /** + * 代销商品品牌是否已更改,0未更改,1已更改 + */ + private Integer brandChange; + + /** + * 代销商品详情是否已更改,0未更改,1已更改 + */ + private Integer detailChange; + + /** + * 代销商品SPU编码是否更改,0未更改,1已更改 + */ + private Integer spuCodeChange; + + public Integer getSpuCodeChange() { + return spuCodeChange; + } + + public void setSpuCodeChange(Integer spuCodeChange) { + this.spuCodeChange = spuCodeChange; + } + + public Long getConsignmentChangeId() { + return consignmentChangeId; + } + + public void setConsignmentChangeId(Long consignmentChangeId) { + this.consignmentChangeId = consignmentChangeId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getNameChange() { + return nameChange; + } + + public void setNameChange(Integer nameChange) { + this.nameChange = nameChange; + } + + public Integer getImageChange() { + return imageChange; + } + + public void setImageChange(Integer imageChange) { + this.imageChange = imageChange; + } + + public Integer getSellingPointChange() { + return sellingPointChange; + } + + public void setSellingPointChange(Integer sellingPointChange) { + this.sellingPointChange = sellingPointChange; + } + + public Integer getVideoChange() { + return videoChange; + } + + public void setVideoChange(Integer videoChange) { + this.videoChange = videoChange; + } + + public Integer getMeasureUnitChange() { + return measureUnitChange; + } + + public void setMeasureUnitChange(Integer measureUnitChange) { + this.measureUnitChange = measureUnitChange; + } + + public Integer getBrandChange() { + return brandChange; + } + + public void setBrandChange(Integer brandChange) { + this.brandChange = brandChange; + } + + public Integer getDetailChange() { + return detailChange; + } + + public void setDetailChange(Integer detailChange) { + this.detailChange = detailChange; + } + + @Override + public String toString() { + return "SpuConsignmentChange{" + + "consignmentChangeId=" + consignmentChangeId + + ", spuId=" + spuId + + ", nameChange=" + nameChange + + ", imageChange=" + imageChange + + ", sellingPointChange=" + sellingPointChange + + ", videoChange=" + videoChange + + ", measureUnitChange=" + measureUnitChange + + ", brandChange=" + brandChange + + ", detailChange=" + detailChange + + ", spuCodeChange=" + spuCodeChange + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuExtension.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuExtension.java new file mode 100644 index 0000000..bb62111 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuExtension.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +public class SpuExtension extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品扩展信息表id + */ + private Long spuExtendId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 评论数量 + */ + private Integer commentNum; + + /** + * 注水销量 + */ + private Integer waterSoldNum; + + + public Integer getWaterSoldNum() { + return waterSoldNum; + } + + public void setWaterSoldNum(Integer waterSoldNum) { + this.waterSoldNum = waterSoldNum; + } + + public Long getSpuExtendId() { + return spuExtendId; + } + + public void setSpuExtendId(Long spuExtendId) { + this.spuExtendId = spuExtendId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + @Override + public String toString() { + return "SpuExtension{" + + "spuExtendId=" + spuExtendId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", spuId=" + spuId + + ", commentNum=" + commentNum + + ", waterSoldNum=" + waterSoldNum + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuLang.java new file mode 100644 index 0000000..c06e352 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuLang.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public class SpuLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品id + */ + private Long spuId; + + /** + * 语言 1.中文 2.英文 + */ + private Integer lang; + + /** + * 商品名称 + */ + private String spuName; + + /** + * 简要描述,卖点等 + */ + private String sellingPoint; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + @Override + public String toString() { + return "SpuLang{" + + "spuId=" + spuId + + ",lang=" + lang + + ",spuName=" + spuName + + ",sellingPoint=" + sellingPoint + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuPriceLog.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuPriceLog.java new file mode 100644 index 0000000..f6ee86e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuPriceLog.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品调价记录 + * + * @author lhd + * @date 2022-06-29 17:48:25 + */ +public class SpuPriceLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 商品调价记录id + */ + private Long id; + + /** + * 商品id + */ + private Long spuId; + + /** + * 规格id + */ + private Long skuId; + + /** + * 原供货价 + */ + private Long beforePrice; + + /** + * 现供货价 + */ + private Long afterPrice; + + /** + * 差价 + */ + private Long price; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getBeforePrice() { + return beforePrice; + } + + public void setBeforePrice(Long beforePrice) { + this.beforePrice = beforePrice; + } + + public Long getAfterPrice() { + return afterPrice; + } + + public void setAfterPrice(Long afterPrice) { + this.afterPrice = afterPrice; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "SpuPriceLog{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",beforePrice=" + beforePrice + + ",afterPrice=" + afterPrice + + ",price=" + price + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSkuAttrValueLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSkuAttrValueLang.java new file mode 100644 index 0000000..60603da --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuSkuAttrValueLang.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品sku属性值-国际化表 + * + * @author YXF + * @date 2021-04-09 17:30:44 + */ +public class SpuSkuAttrValueLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long spuSkuAttrId; + + /** + * 语言 0.通用 1.中文 2.英文 + */ + private Integer lang; + + /** + * 销售属性名称 + */ + private String attrName; + + /** + * 销售属性值 + */ + private String attrValueName; + + public Long getSpuSkuAttrId() { + return spuSkuAttrId; + } + + public void setSpuSkuAttrId(Long spuSkuAttrId) { + this.spuSkuAttrId = spuSkuAttrId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrValueName() { + return attrValueName; + } + + public void setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + } + + @Override + public String toString() { + return "SpuSkuAttrValueLang{" + + "spuSkuAttrId=" + spuSkuAttrId + + ", lang=" + lang + + ", attrName='" + attrName + '\'' + + ", attrValueName='" + attrValueName + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuTag.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuTag.java new file mode 100644 index 0000000..11e9775 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuTag.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品分组表 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public class SpuTag extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分组标签id + */ + private Long id; + + /** + * 分组标题 + */ + private String title; + + /** + * 店铺Id + */ + private Long shopId; + + /** + * 状态(1为正常,-1 为删除) + */ + private Integer status; + + /** + * 默认类型(0:商家自定义,1:系统默认) + */ + private Integer isDefault; + + /** + * 商品数量 + */ + private Long prodCount; + + /** + * 列表样式(0:一列一个,1:一列两个,2:一列三个) + */ + private Integer style; + + /** + * 排序 + */ + private Integer seq; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 删除时间 + */ + private Date deleteTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public Long getProdCount() { + return prodCount; + } + + public void setProdCount(Long prodCount) { + this.prodCount = prodCount; + } + + public Integer getStyle() { + return style; + } + + public void setStyle(Integer style) { + this.style = style; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Date getDeleteTime() { + return deleteTime; + } + + public void setDeleteTime(Date deleteTime) { + this.deleteTime = deleteTime; + } + + @Override + public String toString() { + return "SpuTagVO{" + + "id=" + id + + ",title=" + title + + ",shopId=" + shopId + + ",status=" + status + + ",isDefault=" + isDefault + + ",prodCount=" + prodCount + + ",style=" + style + + ",seq=" + seq + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",deleteTime=" + deleteTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuTagReference.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuTagReference.java new file mode 100644 index 0000000..59fa677 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/SpuTagReference.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 商品分组标签关联信息 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public class SpuTagReference extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分组引用id + */ + private Long referenceId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 标签id + */ + private Long tagId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 状态(1:正常,0:删除) + */ + private Integer status; + + /** + * 排序 + */ + private Integer seq; + + public Long getReferenceId() { + return referenceId; + } + + public void setReferenceId(Long referenceId) { + this.referenceId = referenceId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "SpuTagReference{" + + "referenceId=" + referenceId + + ", shopId=" + shopId + + ", tagId=" + tagId + + ", spuId=" + spuId + + ", status=" + status + + ", seq=" + seq + + '}'; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Integer getSeq() { + return seq; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockBillLog.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockBillLog.java new file mode 100644 index 0000000..95f2543 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockBillLog.java @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 出入库明细 + * + * @author lhd + * @date 2022-06-22 16:57:26 + */ +public class StockBillLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 出入库明细id + */ + private Long stockBillLogId; + + /** + * 出入库单号 + */ + private String stockBillNo; + + /** + * 关联订单号 + */ + private String sourceOrderNo; + + /** + * 单据类型 + */ + private Integer stockBillType; + + /** + * 出入库原因id + */ + private Long stockChangeReasonId; + + /** + * 操作员工id + */ + private Long employeeId; + + /** + * 状态,0:已作废,1:已出/入库,2:待提交 + */ + private Integer status; + + /** + * 出入库时间 + */ + private Date businessTime; + + /** + * 总出入库数量 + */ + private Integer totalCount; + + /** + * 总出入库金额 + */ + private Long totalAmount; + + /** + * 出入库凭证 + */ + private String qualifications; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 备注 + */ + private String remark; + + /** + * 类型,1:出库 2:入库 + */ + private Integer type; + + /** + * 制单人手机号 + */ + private String makerMobile; + + /** + * 库存点id + */ + private Long stockPointId; + + /** + * 库存点类型(1:门店, 2:仓库) + */ + private Integer stockPointType; + + public StockBillLog() { + } + + public StockBillLog(Long shopId, Date businessTime, Integer stockBillLogType, Integer stockType, String stockBillNo, Integer status, String sourceOrderNo) { + Date now = new Date(); + this.setShopId(shopId); + this.setEmployeeId(null); + this.setCreateTime(now); + this.setUpdateTime(now); + this.setBusinessTime(businessTime); + this.setStockBillType(stockBillLogType); + this.setType(stockType); + this.setStockBillNo(stockBillNo); + this.setStatus(status); + this.setSourceOrderNo(sourceOrderNo); + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "StockBillLog{" + + "stockBillLogId=" + stockBillLogId + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockBillType=" + stockBillType + + ", stockChangeReasonId=" + stockChangeReasonId + + ", employeeId=" + employeeId + + ", status=" + status + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount=" + totalAmount + + ", qualifications='" + qualifications + '\'' + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", remark='" + remark + '\'' + + ", type=" + type + + ", makerMobile='" + makerMobile + '\'' + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockBillLogItem.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockBillLogItem.java new file mode 100644 index 0000000..005629f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockBillLogItem.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 出入库商品项 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockBillLogItem extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 出入库商品项id + */ + private Long stockBillLogItemId; + + /** + * 出入库明细id + */ + private Long stockBillLogId; + + /** + * 实际出入库数量 + */ + private Integer stockCount; + + /** + * 商品库存剩余量 + */ + private Integer afterStock; + + /** + * 成本单价 + */ + private Long unitPrice; + + /** + * 商品id + */ + private Long spuId; + + /** + * skuId + */ + private Long skuId; + + /** + * 备注 + */ + private String remark; + + public Long getStockBillLogItemId() { + return stockBillLogItemId; + } + + public void setStockBillLogItemId(Long stockBillLogItemId) { + this.stockBillLogItemId = stockBillLogItemId; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public Integer getAfterStock() { + return afterStock; + } + + public void setAfterStock(Integer afterStock) { + this.afterStock = afterStock; + } + + public Long getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(Long unitPrice) { + this.unitPrice = unitPrice; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "StockBillLogItem{" + + "stockBillLogItemId=" + stockBillLogItemId + + ",stockBillLogId=" + stockBillLogId + + ",stockCount=" + stockCount + + ",afterStock=" + afterStock + + ",unitPrice=" + unitPrice + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReason.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReason.java new file mode 100644 index 0000000..1e0cbc6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReason.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 出入库原因 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReason extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long stockChangeReasonId; + + /** + * 出入库类别,1:出库 2:入库 + */ + private Integer type; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 状态,1:启用 0:禁用 -1:删除 + */ + private Integer status; + + @Schema(description = "原因") + private String reason; + + @Schema(description = "备注") + private String remark; + + /** + * 系统类型 + */ + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "StockChangeReason{" + + "stockChangeReasonId=" + stockChangeReasonId + + ", type=" + type + + ", shopId=" + shopId + + ", status=" + status + + ", reason='" + reason + '\'' + + ", remark='" + remark + '\'' + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReasonLang.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReasonLang.java new file mode 100644 index 0000000..7326768 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockChangeReasonLang.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 出入库原因-国际化 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonLang extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long stockChangeReasonId; + + /** + * 语言 0.中文 1.英文 + */ + private Integer lang; + + /** + * 原因 + */ + private String reason; + + /** + * 备注 + */ + private String remark; + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getLang() { + return lang; + } + + public void setLang(Integer lang) { + this.lang = lang; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "StockChangeReasonLang{" + + "stockChangeReasonId=" + stockChangeReasonId + + ",lang=" + lang + + ",reason=" + reason + + ",remark=" + remark + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockPointSku.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockPointSku.java new file mode 100644 index 0000000..026c6a1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/StockPointSku.java @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-09 18:00:43 + */ +public class StockPointSku extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 库存商品关联skuid + */ + private Long stockPointSkuId; + + /** + * 库存点id + */ + private Long stockPointId; + + /** + * 库存点类型 1仓库 2门店 + */ + private Integer stockPointType; + + /** + * spuId + */ + private Long spuId; + + /** + * skuid + */ + private Long skuId; + + /** + * 当商品为代销商品时,供应商商品skuid + */ + private Long supplierSkuId; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 库存 + */ + private Long stock; + + /** + * 仓库类型(仓库才有 0默认仓库,1区域仓库) + */ + private Integer type; + + /** + * 库存模式 (门店才有 参考StockModeEnum) + */ + private Integer stockMode; + + public Integer getStockMode() { + return stockMode; + } + + public void setStockMode(Integer stockMode) { + this.stockMode = stockMode; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getStock() { + return stock; + } + + public void setStock(Long stock) { + this.stock = stock; + } + + public Long getStockPointSkuId() { + return stockPointSkuId; + } + + public void setStockPointSkuId(Long stockPointSkuId) { + this.stockPointSkuId = stockPointSkuId; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSupplierSkuId() { + return supplierSkuId; + } + + public void setSupplierSkuId(Long supplierSkuId) { + this.supplierSkuId = supplierSkuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "StockPointSku{" + + "stockPointSkuId=" + stockPointSkuId + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + ", spuId=" + spuId + + ", skuId=" + skuId + + ", supplierSkuId=" + supplierSkuId + + ", status=" + status + + ", stock=" + stock + + ", type=" + type + + ", stockMode=" + stockMode + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/TakeStockSpu.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/TakeStockSpu.java new file mode 100644 index 0000000..fddea48 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/TakeStockSpu.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 盘点商品列表 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class TakeStockSpu extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 盘点商品id + */ + private Long takeStockSpuId; + + /** + * 盘点id + */ + private Long takeStockId; + + /** + * 商品id + */ + private Long spuId; + + /** + * sku_id + */ + private Long skuId; + + /** + * 账面库存 + */ + private Integer stocks; + + /** + * 实盘库存 + */ + private Integer totalStock; + + /** + * 盈亏类型 0盘平 1盘盈 2盘亏 -1异常 + */ + private Integer ioType; + + /** + * 备注 + */ + private String remark; + + /** + * 异常原因 1.删除商品 2.盘点期间有库存变动 3.其他 + */ + private Integer exceptionReason; + + public Long getTakeStockSpuId() { + return takeStockSpuId; + } + + public void setTakeStockSpuId(Long takeStockSpuId) { + this.takeStockSpuId = takeStockSpuId; + } + + public Long getTakeStockId() { + return takeStockId; + } + + public void setTakeStockId(Long takeStockId) { + this.takeStockId = takeStockId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getExceptionReason() { + return exceptionReason; + } + + public void setExceptionReason(Integer exceptionReason) { + this.exceptionReason = exceptionReason; + } + + @Override + public String toString() { + return "TakeStockSpu{" + + "takeStockSpuId=" + takeStockSpuId + + ",takeStockId=" + takeStockId + + ",spuId=" + spuId + + ",skuId=" + skuId + + ",stocks=" + stocks + + ",totalStock=" + totalStock + + ",ioType=" + ioType + + ",remark=" + remark + + ",exceptionReason=" + exceptionReason + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Warehouse.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Warehouse.java new file mode 100644 index 0000000..dd7aa3a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/Warehouse.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public class Warehouse extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 仓库名称 + */ + private String warehouseName; + + /** + * 仓库类型(0默认仓库,1区域仓库) + */ + private Integer type; + + /** + * 仓库地址 + */ + private String address; + + /** + * 管理人 + */ + private String manage; + + /** + * 管理电话 + */ + private String phone; + + /** + * 系统类型 + */ + private Integer sysType; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getManage() { + return manage; + } + + public void setManage(String manage) { + this.manage = manage; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Override + public String toString() { + return "Warehouse{" + + "warehouseId=" + warehouseId + + ", shopId=" + shopId + + ", warehouseName='" + warehouseName + '\'' + + ", type=" + type + + ", address='" + address + '\'' + + ", manage='" + manage + '\'' + + ", phone='" + phone + '\'' + + ", sysType=" + sysType + + ", provinceId=" + provinceId + + ", province='" + province + '\'' + + ", cityId=" + cityId + + ", city='" + city + '\'' + + ", areaId=" + areaId + + ", area='" + area + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/WarehouseArea.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/WarehouseArea.java new file mode 100644 index 0000000..a464088 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/model/WarehouseArea.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; +/** + * 仓库项和供货城市关联信息 + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public class WarehouseArea extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * + */ + private Long warehouseAreaId; + + /** + * 仓库id + */ + private Long warehouseId; + + /** + * 城市id + */ + private Long areaId; + + public Long getWarehouseAreaId() { + return warehouseAreaId; + } + + public void setWarehouseAreaId(Long warehouseAreaId) { + this.warehouseAreaId = warehouseAreaId; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + @Override + public String toString() { + return "WarehouseArea{" + + "warehouseAreaId=" + warehouseAreaId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",warehouseId=" + warehouseId + + ",areaId=" + areaId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrLangService.java new file mode 100644 index 0000000..5798e94 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrLangService.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.product.model.AttrLang; + +import java.util.List; + +/** + * 属性-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +public interface AttrLangService { + + /** + * 分页获取属性-国际化表列表 + * @param pageDTO 分页参数 + * @return 属性-国际化表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据属性-国际化表id获取属性-国际化表 + * + * @param attrId 属性-国际化表id + * @return 属性-国际化表 + */ + AttrLang getByAttrId(Long attrId); + + /** + * 保存属性-国际化表 + * @param attrLangList 属性-国际化表 + * @param attrId 属性id + */ + void save(List attrLangList, Long attrId); + + /** + * 更新属性-国际化表 + * @param attrLangList 属性-国际化表 + * @param attrVO 属性 + * @return 新增语言id数组 + */ + void update(List attrLangList, AttrVO attrVO); + + /** + * 根据属性-国际化表id删除属性-国际化表 + * @param attrId 属性-国际化表id + */ + void deleteById(Long attrId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrValueService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrValueService.java new file mode 100644 index 0000000..30128c5 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/AttrValueService.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.product.dto.AttrDTO; +import com.tmerclub.cloud.product.dto.AttrValueDTO; + +import java.util.List; + +/** + * 属性值信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface AttrValueService { + /** + * 根据属性值信息和属性id,保存属性值信息 + * @param attrValueList + * @param attrId + */ + void save(List attrValueList, Long attrId); + + /** + * 根据属性值信息和属性id,更新属性值信息 + * @param attrDTO + * @param dbAttr + */ + void update(AttrDTO attrDTO, AttrVO dbAttr); + + /** + * 根据属性id, 删除属性值信息 + * @param attrId + */ + void deleteByAttrId(Long attrId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandService.java new file mode 100644 index 0000000..78993f9 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandService.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.bo.EsBrandBO; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.product.vo.app.BrandAppVO; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.model.BrandLang; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 品牌信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface BrandService { + + /** + * 分页获取品牌信息列表 + * @param pageDTO 分页参数 + * @param brandDTO + * @return 品牌信息列表分页数据 + */ + PageVO page(PageDTO pageDTO, BrandDTO brandDTO); + + /** + * 根据品牌信息id获取品牌信息 + * + * @param brandId 品牌信息id + * @return 品牌信息 + */ + BrandVO getByBrandId(Long brandId); + + /** + * 根据品牌信息id获取品牌信息 + * + * @param brandId 品牌信息id + * @return 品牌信息 + */ + BrandVO getInfo(Long brandId); + + /** + * 保存品牌信息 + * @param brandDTO 品牌信息 + */ + void save(BrandDTO brandDTO); + + /** + * 更新品牌信息 + * @param brandDTO 品牌信息 + */ + void update(BrandDTO brandDTO); + + /** + * 根据品牌id,删除品牌 + * @param brandId + */ + void deleteById(Long brandId); + + /** + * 更新品牌状态(启用或禁用) + * @param brandDTO + * @return + */ + void updateBrandStatus(BrandDTO brandDTO); + + /** + * 根据分类id,获取品牌列表 + * @param categoryId 分类id + * @param lang 语言 + * @return 品牌id + */ + List listByCategory(Long categoryId, Integer lang); + + /** + * 获取置顶品牌列表 + * @param lang 语言 + * @return 品牌列表 + */ + List topBrandList(Integer lang); + + /** + * 清楚分类缓存 + * @param categoryIds + */ + void removeCache(List categoryIds); + + /** + * 更新品牌的商品数量 + * @param brandId + */ + void updateSpuCount(Long brandId); + + /** + * 批量更新品牌的商品数量 + * @param brandIds + */ + void updateSpuCountByBrandIds(Collection brandIds); + + /** + * 根据品牌名,获取品牌列表 + * @param brandNames 品牌名称列表 + * @param shopId 店铺id + * @return 品牌列表 + */ + List listBrandLangByBrandNames(Set brandNames, Long shopId); + + /** + * 获取前端品牌分页列表 + * @param pageDTO + * @param brandDTO + * @return + */ + PageVO appPage(PageDTO pageDTO, BrandDTO brandDTO); + + + /** + * 根据品牌名称获取品牌列表 + * @param name + * @return + */ + List listByName(String name); + + /** + * 根据店铺id把自定义品牌更新为平台品牌 + * @param shopId + * @param sysType + */ + void updateCustomBrandToPlatformBrandByShopId(Long shopId, Integer sysType); + + /** + * 根据分类id与品牌名称获取分类下的品牌与店铺签约的品牌 + * @param categoryId + * @param brandName + * @param shopId + * @param sysType + * @return + */ + List listAvailableBrandByCategoryIdAndBrandNameAndShopId(Long categoryId, String brandName, Long shopId, Integer sysType); + + /** + * 获取品牌信息 + * + * @param esProductBO 商品信息 + * @return 品牌信息 + */ + EsBrandBO getEsBrandBO(EsProductBO esProductBO); + + /** + * 根据商品id列表,获取品牌id列表 + * @param spuIds 商品id列表 + * @return 品牌id列表 + */ + List listBrandIdBySpuIds(List spuIds); + + /** + * 批量获取品牌信息 + * @param brandDTO + * @return + */ + List listByParams(BrandDTO brandDTO); + + /** + * 获取可以签约的品牌列表(已经签约品牌不会返回) + * @param brandDTO 搜索参数 + * @param shopId + * @param sysType + * @return + */ + List listApplySigningBrand(BrandDTO brandDTO, Long shopId, Integer sysType); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandShopService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandShopService.java new file mode 100644 index 0000000..5da8957 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/BrandShopService.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.product.dto.BrandShopDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.BrandSigningDTO; +import com.tmerclub.cloud.product.model.BrandShop; +import com.tmerclub.cloud.product.vo.BrandSigningVO; + +import java.util.List; + +/** + * 品牌店铺关联信息 + * + * @author FrozenWatermelon + * @date 2021-04-30 13:21:10 + */ +public interface BrandShopService { + + /** + * 分页获取品牌店铺关联信息列表 + * + * @param pageDTO 分页参数 + * @return 品牌店铺关联信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据品牌店铺关联信息id获取品牌店铺关联信息 + * + * @param brandShopId 品牌店铺关联信息id + * @return 品牌店铺关联信息 + */ + BrandShop getByBrandShopId(Long brandShopId); + + /** + * 保存品牌店铺关联信息 + * + * @param brandShop 品牌店铺关联信息 + */ + void save(BrandShop brandShop); + + /** + * 更新品牌店铺关联信息 + * + * @param brandShop 品牌店铺关联信息 + */ + void update(BrandShop brandShop); + + /** + * 根据品牌店铺关联信息id删除品牌店铺关联信息 + * + * @param brandShopId 品牌店铺关联信息id + */ + void deleteById(Long brandShopId); + + /** + * 根据店铺id获取品牌签约信息 + * + * @param shopId 店铺ID + * @param sysType + * @return 品牌签约信息列表 + */ + BrandSigningVO listSigningByShopId(Long shopId, Integer sysType); + + /** + * 根据店铺id签约品牌信息 + * + * @param brandSigningDTO + * @param shopId + * @param sysType + */ + void signingBrands(BrandSigningDTO brandSigningDTO, Long shopId, Integer sysType); + + /** + * 根据店铺id更新店铺品牌签约类型 + * + * @param shopId + * @param type + * @param sysType + */ + void updateTypeByShopId(Long shopId, Integer type, Integer sysType); + + /** + * 根据品牌id删除店铺品牌关联关系 + * + * @param brandId + */ + void deleteByBrandId(Long brandId); + + /** + * 根据店铺id批量保存品牌签约信息 + * + * @param brandShopDTOList + * @param shopId + * @param sysType + */ + void insertBatchByShopId(List brandShopDTOList, Long shopId, Integer sysType); + + /** + * 根据店铺id与品牌id查询签约数量 + * + * @param shopId + * @param brandId + * @param sysType + * @return + */ + int countByShopIdAndBrandId(Long shopId, Long brandId, Integer sysType); + + /** + * 新增签约品牌 + * + * @param brandSigningDTO 签约品牌列表 + * @param shopId 店铺id + * @param sysType 系统类型 + */ + void addSigningBrand(BrandSigningDTO brandSigningDTO, Long shopId, Integer sysType); + + /** + * 店铺删除签约品牌 + * + * @param brandShopId + */ + void deleteSigningBrand(Long brandShopId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryService.java new file mode 100644 index 0000000..474708b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryService.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.product.bo.PlatformCommissionOrderItemBO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.common.product.vo.app.CategorySearchAppVO; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.tmerclub.cloud.product.vo.CategoryExcelVO; +import com.tmerclub.cloud.product.vo.CategoryPlatformExcelVO; + +import java.util.List; +import java.util.Set; + +/** + * 分类信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface CategoryService { + + /** + * 根据分类信息(分类、上级分类名称列表) + * + * @param categoryId 分类信息id + * @return 分类信息 + */ + CategoryVO getInfo(Long categoryId); + + /** + * 根据分类信息(缓存) + * + * @param categoryId 分类信息id + * @return 分类信息 + */ + CategoryVO getById(Long categoryId); + + + /** + * 根据分类信息(缓存) + * 防止出现未登录情况下访问的商品分类被删除而出现找不到分类错误 + * + * @param categoryId 分类信息id + * @return 分类信息 + */ + CategoryVO getByCategoryId(Long categoryId); + + /** + * 保存分类信息 + * + * @param categoryDTO 分类信息 + * @return 分类id + */ + Long save(CategoryDTO categoryDTO); + + /** + * 更新分类信息 + * + * @param categoryDTO 分类信息 + */ + void update(CategoryDTO categoryDTO); + + /** + * 根据分类信息id删除分类信息 + * + * @param categoryId 分类id + * @param shopId 店铺id + */ + void deleteById(Long categoryId, Long shopId); + + /** + * 获取分类列表(未删除的分类--启用、未启用状态的分类) + * + * @param shopId 店铺id 必填 + * @return + */ + List list(Long shopId); + + /** + * 根据shopId 和 categoruId 清除分类缓存 + * + * @param shopId + * @param categoryId + * @param getSysType + */ + void removeCategoryCache(Long shopId, Long categoryId, Integer getSysType); + + /** + * 分类的启用和禁用 + * + * @param categoryDTO + * @param sysType + * @return + */ + List categoryEnableOrDisable(CategoryDTO categoryDTO, Integer sysType); + + /** + * 获取分类的pathName集合 + * + * @param categories 分类集合 + */ + void getPathNames(List categories); + + /** + * 根据店铺id和上级id,获取分类列表 + * + * @param shopId 店铺id + * @param parentId 上级分类id + * @param lang 语言 + * @return 分类列表 + */ + List listByShopIdAndParenId(Long shopId, Long parentId, Integer lang); + + /** + * 获取可用的一级平台分类(即含有启用状态下三级分类的一级分类列表) + * + * @param shopId 店铺id + * @param parentId 上级分类id + * @param lang 语言 + * @return 分类列表 + */ + List listPlatformCategoryByShopIdAndParenId(Long shopId, Long parentId, Integer lang); + + /** + * 获取分类列表 (仅获取启用状态以及包含三级分类的分类信息) + * + * @param shopId 店铺id + * @param lang 语言 + * @return 分类列表 + */ + List shopCategoryList(Long shopId, Integer lang); + + /** + * 获取整个平台的佣金比例 + * + * @return 整个平台的佣金比例 + */ + List listRate(); + + + /** + * 根据店铺id获取店铺签约的分类列表 + * + * @param shopId + * @param sysType + * @param lang + * @return + */ + List listSigningCategory(Long shopId, Integer sysType, Integer lang); + + /** + * 根据分类id列表,获取分类列表 + * + * @param categoryIds 分类id列表 + * @return 分类列表 + */ + List listByCategoryIds(Set categoryIds); + + /** + * 获取店铺二级分类 + * + * @param shopId + * @return + */ + List listAndLangInfoByShopId(Long shopId); + + /** + * 获取店铺签约分类及国际化信息 + * + * @param shopId + * @return + */ + List getShopSigningCategoryAndLangInfo(Long shopId); + + /** + * 平台分类 + * + * @return + */ + List platformCategories(); + + /** + * 获取当前节点所有父节点的分类ids,以及当前分类节点的父级节点的父级几点的分类ids + * + * @param categoryIds 当前分类节点ids + * @return 所有父级节点ids + */ + List getParentIdsByCategoryId(List categoryIds); + + /** + * 根据skuId获取skuId分类列表 + * + * @param platformCommissionOrderItems skuId分类列表 + * @return skuId分类列表 + */ + List listBySkuIds(List platformCommissionOrderItems); + + /** + * 获取店铺二级分类(已经启用的分类) + * + * @param shopId + * @return + */ + List listEnable(Long shopId); + + /** + * 分类-搜索参数 + * + * @param categoryId + * @return + */ + CategorySearchAppVO categorySearchItem(Long categoryId); + + /** + * 获取可以签约的平台分类列表(已经签约平台分类不会返回) + * + * @param shopId + * @param sysType + * @return + */ + List listApplySigningCategory(Long shopId, Integer sysType); + + /** + * 获取导出平台分类列表 + * + * @return + */ + List listExcelPlatform(); + + /** + * 获取导出商家/供应商分类列表 + * + * @param shopId + * @return + */ + List listExcel(Long shopId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryShopService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryShopService.java new file mode 100644 index 0000000..2d0c366 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/CategoryShopService.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.model.CategoryShop; +import com.tmerclub.cloud.product.vo.CategoryShopVO; + +import java.util.List; + +/** + * 店铺签约分类关联信息 + * + * @Author lth + * @Date 2021/4/25 14:33 + */ +public interface CategoryShopService { + + /** + * 根据店铺分类关联信息id获取店铺分类关联信息 + * + * @param categoryShopId 店铺分类关联信息id + * @return 店铺分类关联信息 + */ + CategoryShop getById(Long categoryShopId); + + /** + * 签约平台分类 + * @param categoryShopDTOList + * @param shopId + * @param sysType + */ + void signingCategory(List categoryShopDTOList, Long shopId, Integer sysType); + + /** + * 根据店铺id获取签约分类列表 + * @param shopId + * @param sysType + * @param lang + * @return + */ + List listByShopId(Long shopId, Integer sysType, Integer lang); + + /** + * 获取店铺签约的平台三级分类佣金 + * @param shopId 店铺id + * @param sysType + * @return 平台佣金 + */ + List listRateByShopId(Long shopId, Integer sysType); + + /** + * 根据分类id删除店铺分类关联关系 + * @param categoryId + */ + void deleteByCategoryId(Long categoryId); + + /** + * 根据存在变化的分类的id清除缓存 + * @param categoryId + */ + void removeCacheByChangeCategoryId(Long categoryId); + + /** + * 根据店铺id批量保存分类签约信息 + * @param categoryShopDTOList + * @param shopId + * @param sysType + */ + void insertBatchByShopId(List categoryShopDTOList, Long shopId, Integer sysType); + + /** + * 根据存在变化的分类的id列表清除缓存 + * @param categoryIds + * @param sysType + */ + void removeCacheByChangeCategoryIds(List categoryIds, Integer sysType); + + /** + * 根据店铺id获取有相同分类的供应商 + * + * @param shopId 店铺id + * @param categoryId + * @param sysType + * @return 供应商ids + */ + CategoryShopVO getByShopIdAndCategoryId(Long shopId, Long categoryId, Integer sysType); + + /** + * 根据店铺id获取有相同分类的供应商 + * @param shopId 店铺id + * @return 供应商ids + */ + List getSupplierIdsByShopId(Long shopId); + + /** + * 根据店铺id与分类id统计签约数量 + * @param shopId + * @param categoryId + * @param sysType + * @return + */ + int countByShopIdAndCategoryId(Long shopId, Long categoryId, Integer sysType); + + /** + * 删除店铺签约分类关系 + * @param categoryShop + + */ + void deleteSigningCategory(CategoryShop categoryShop); + + /** + * 根据店铺id获取所有分类ids + * @param shopId 店铺id + * @param sysType + * @return 所有分类ids + */ + List getCategoryIdsByShopId(Long shopId, Integer sysType); + + /** + * 根据分类id获取绑定的供应商id + * @param categoryIds + * @return + */ + List getSupplyIdByCategoryIds(List categoryIds); + + /** + * 新增签约分类 + * @param categoryShopDTOList 分类签约列表 + * @param shopId 店铺id + * @param sysType 系统类型 + */ + void addSigningCategory(List categoryShopDTOList, Long shopId, Integer sysType); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ComboShopCartService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ComboShopCartService.java new file mode 100644 index 0000000..d7161e1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ComboShopCartService.java @@ -0,0 +1,36 @@ +package com.tmerclub.cloud.product.service;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO; + +import java.util.List; + +/** + * @author xxw + * @date 2022/8/19 11:34 + */ +public interface ComboShopCartService { + /** + * 加购时处理组装购物车套餐商品 + * + * @param param + * @param shopCartItems + */ + void comboAddCart(ChangeShopCartItemDTO param, List shopCartItems); + + /** + * 修改时处理组装购物车套餐商品 + * + * @param param + * @param shopCartItems + */ + void comboUpdateCart(ChangeShopCartItemDTO param, List shopCartItems); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ImportSupplierSpuService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ImportSupplierSpuService.java new file mode 100644 index 0000000..549a219 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ImportSupplierSpuService.java @@ -0,0 +1,26 @@ +package com.tmerclub.cloud.product.service;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +/** + * @author xxw + * @date 2022/8/2 14:10 + */ +public interface ImportSupplierSpuService { + /** + * 商家导入供应商品 + * @param supplierSpuId + * @param shopId + * @param sysType + * @param userId + * @param isPurchaseOrder 是否为采购订单时导入 + * @return 导入后添加的商品id + */ + Long importSpu(Long supplierSpuId, Long shopId, Integer sysType, Long userId, Boolean isPurchaseOrder); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ShopCartItemService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ShopCartItemService.java new file mode 100644 index 0000000..e84214a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ShopCartItemService.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; + +import java.util.List; + +/** + * 购物车 + * + * @author YXF + * @date 2023-11-24 15:47:32 + */ +public interface ShopCartItemService { + + /** + * 组装商品购物项的数据 + * + * @param shopCartItems 订单项\购物车项数据 + * @param mainShopCartItem + * @param isShopCartOrder 是否从购物车提交的订单(注:不是购物车,是购物车提交的订单) + */ + void assembleShopCartItem(List shopCartItems, ShopCartItemVO mainShopCartItem, Boolean isShopCartOrder); + + /** + * 组装赠品 + * + * @param shopCartItems + * @return + */ + void buildItemGiveawayInfo(List shopCartItems); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ShopCartService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ShopCartService.java new file mode 100644 index 0000000..9342058 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/ShopCartService.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO; +import com.tmerclub.cloud.product.dto.shopcart.CheckShopCartItemDTO; +import com.tmerclub.cloud.product.model.ShopCartItem; + +import java.util.List; + +/** + * 购物车 + * + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +public interface ShopCartService { + + /** + * 根据购物车项id删除购物车 + * + * @param shopCartItemIds 购物车项id + * @param userId 用户id + */ + void deleteShopCartItemsByShopCartItemIds(Long userId, List shopCartItemIds); + + /** + * 添加购物项 + * + * @param userId 用户id + * @param param 购物项 + * @param priceFee 加入购物车时候的价格 + * @param categoryId 分类id + */ + void addShopCartItem(Long userId, ChangeShopCartItemDTO param, Long priceFee, Long categoryId); + + /** + * 更新购物项 + * + * @param shopCartItem 购物项 + * @param userId 用户id + */ + void updateShopCartItem(Long userId, ShopCartItem shopCartItem); + + /** + * 清空用户购物车 + * + * @param userId 用户id + */ + void deleteAllShopCartItems(Long userId); + + /** + * 获取用户所有未过期的购物项 + * + * @return 未过期的购物项 + */ + List getShopCartItems(); + + /** + * 获取已过期的购物项 + * + * @return 已过期的购物项 + */ + List getShopCartExpiryItems(); + + /** + * 购物项数量,有缓存 + * + * @param userId 用户id + * @return 购物项数量 + */ + Integer getShopCartItemCount(Long userId); + + /** + * 获取被选中的购物车项 + * + * @return 被选中的购物车项 + */ + List getCheckedShopCartItems(); + + /** + * 获取被选中的购物车项 + * + * @return 被选中的购物车项 + */ + List getUserShopCartItems(); + + + /** + * 商品下架 or 变成预售的时候 移除购物车商品数量缓存 + * + * @param spuIds + */ + void removeShopCartItemCache(List spuIds); + + /** + * 移除供应商商品购物车数量缓存 + * + * @param supplierSpuIds + */ + void removeShopCartItemCacheBySupplierSpuIds(List supplierSpuIds); + + /** + * 勾选购物车状态 + * + * @param userId 用户id + * @param params 参数 + */ + void checkShopCartItems(Long userId, List params); + + /** + * 根据店铺id列表更新店铺是否停业状态 + * + * @param shopIds + * @param isClosed + */ + void updateIsClosedByShopIds(List shopIds, Integer isClosed); + + /** + * 批量更新购物项 + * + * @param shopCartItem 购物项 + * @param userId 用户id + */ + void updateShopCartItemBatch(Long userId, List shopCartItem); + + /** + * 根据商品id、套餐id、用户id获取购物车id + * + * @param spuId + * @param comboId + * @param userId + * @param skuId + * @return + */ + Long getCartItemBySpuIdAndComboId(Long spuId, Long comboId, Long userId, Long skuId); + + /** + * 套餐发生变化时移除用户购物车项 + * + * @param comboIdList + * @param spuId + * @param skuId + * @return + */ + void deleteCartByComboUpdate(List comboIdList, Long spuId, Long skuId); + + /** + * 根据套餐id和套餐商品id集合移除用户购物车项 + * + * @param comboId + * @param spuIdList + */ + void deleteCartByComboIdAndSpuIdS(Long comboId, List spuIdList); + + /** + * 根据套餐id和套餐商品skuid集合移除用户购物车项 + * + * @param comboId + * @param skuIdList + */ + void deleteCartByComboIdAndSkuIdS(Long comboId, List skuIdList); + + /** + * 修改用户购物车中的套餐商品价格 + * + * @param comboId + * @param skuId + * @param price + */ + void updateCartSpuPriceByComboIdAndSkuId(Long comboId, Long skuId, Long price); + + /** + * 根据套餐主商品skuId获取搭配商品id + * + * @param skuId + * @return + */ + List skuIdListByComboMainSkuId(List skuId); + + /** + * 套餐修改商品起搭数时异步修改以后购物车商品数量 + * + * @param comboId + * @param spuId + * @param count + */ + void updateCartComboCount(Long comboId, Long spuId, Integer count); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuAttrValueLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuAttrValueLangService.java new file mode 100644 index 0000000..0823b8c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuAttrValueLangService.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.SpuAttrValueLang; + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-15 16:47:33 + */ +public interface SpuAttrValueLangService { + + /** + * 分页获取属性值-国际化表列表 + * @param pageDTO 分页参数 + * @return 属性值-国际化表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据属性值-国际化表id获取属性值-国际化表 + * + * @param spuAttrValueId 属性值-国际化表id + * @return 属性值-国际化表 + */ + SpuAttrValueLang getBySpuAttrValueId(Long spuAttrValueId); + + /** + * 保存属性值-国际化表 + * @param spuAttrValueLang 属性值-国际化表 + */ + void save(SpuAttrValueLang spuAttrValueLang); + + /** + * 更新属性值-国际化表 + * @param spuAttrValueLang 属性值-国际化表 + */ + void update(SpuAttrValueLang spuAttrValueLang); + + /** + * 根据属性值-国际化表id删除属性值-国际化表 + * @param spuAttrValueId 属性值-国际化表id + */ + void deleteById(Long spuAttrValueId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuAttrValueService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuAttrValueService.java new file mode 100644 index 0000000..707552f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuAttrValueService.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.dto.SpuAttrValueDTO; +import com.tmerclub.cloud.common.product.vo.SpuAttrValueVO; +import com.tmerclub.cloud.product.model.SpuAttrValue; + +import java.util.List; +import java.util.Set; + +/** + * 商品规格属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuAttrValueService { + + /** + * 更新商品规格属性关联信息 + * + * @param spuId id + * @param categoryId 分类id + * @param spuAttrValues 商品属性信息 + * @param supplierSpuType + */ + void update(Long spuId, Long categoryId, Integer supplierSpuType, List spuAttrValues); + + + /** + * 根据商品id删除spuId + * + * @param spuId id + */ + void deleteBySpuId(Long spuId); + + /** + * 根据属性和属性值id列表删除商品属性关联信息, 并发送消息到队列(更新对应的spu信息) + * @param attrId + * @param attrValueId + */ + void deleteUnionDataByAttId(Long attrId, List attrValueId); + + /** + * 根据属性和分类id列表删除商品属性关联信息, 并发送消息到队列(更新对应的spu信息) + * @param attrId + * @param categoryIds + */ + void deleteByCategoryIds(Long attrId, List categoryIds); + + /** + * 根据spuId获取商品属性列表 + * @param spuId + * @return + */ + List getSpuAttrsBySpuId(Long spuId); + + /** + * 保存商品属性信息 + * @param spuId + * @param categoryId + * @param spuAttrValues + * @param sysType + */ + void save(Long spuId, Long categoryId, List spuAttrValues, Integer sysType); + + + /** + * 更新es、redis中的商品属性信息 + * @param attrValueList + * @param attrValueIds + */ + void updateSpuByAttrValueIds(List attrValueList, Set attrValueIds); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuConsignmentChangeService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuConsignmentChangeService.java new file mode 100644 index 0000000..89ead28 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuConsignmentChangeService.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.SpuConsignmentChange; + +import java.util.List; + +/** + * 商家代销商品基本信息相对于供应商品是否改变 + * + * @author FrozenWatermelon + * @date 2022-08-11 22:21:10 + */ +public interface SpuConsignmentChangeService { + + /** + * 分页获取商家代销商品基本信息相对于供应商品是否改变列表 + * @param pageDTO 分页参数 + * @return 商家代销商品基本信息相对于供应商品是否改变列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商家代销商品基本信息相对于供应商品是否改变id获取商家代销商品基本信息相对于供应商品是否改变 + * + * @param consignmentChangeId 商家代销商品基本信息相对于供应商品是否改变id + * @return 商家代销商品基本信息相对于供应商品是否改变 + */ + SpuConsignmentChange getByConsignmentChangeId(Long consignmentChangeId); + + /** + * 保存商家代销商品基本信息相对于供应商品是否改变 + * @param spuConsignmentChange 商家代销商品基本信息相对于供应商品是否改变 + */ + void save(SpuConsignmentChange spuConsignmentChange); + + /** + * 更新商家代销商品基本信息相对于供应商品是否改变 + * @param spuConsignmentChange 商家代销商品基本信息相对于供应商品是否改变 + */ + void update(SpuConsignmentChange spuConsignmentChange); + + /** + * 根据商家代销商品基本信息相对于供应商品是否改变id删除商家代销商品基本信息相对于供应商品是否改变 + * @param consignmentChangeId 商家代销商品基本信息相对于供应商品是否改变id + */ + void deleteById(Long consignmentChangeId); + + /** + * 根据商品Id获取信息 + * @param spuId + * @return + */ + SpuConsignmentChange getBySpuId(Long spuId); + + /** + * 根据商品Id批量获取信息 + * @param spuIdList + * @return + */ + List batchGetBySpuIdList(List spuIdList); + + /** + * 根据商品Id获取信息 + * @param spuId + * @return + */ + SpuConsignmentChange consignmentChange(Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuDetailService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuDetailService.java new file mode 100644 index 0000000..f490afd --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuDetailService.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.vo.SpuDetailVO; +import com.tmerclub.cloud.product.model.SpuDetail; + +import java.util.List; + +/** + * 商品详情信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuDetailService { + + /** + * 批量保存商品详情信息 + * @param spuDetailList 商品详情信息 + */ + void batchSave(List spuDetailList); + + /** + * 批量更新商品详情信息 + * @param spuDetailList 商品详情信息 + */ + void batchUpdate(List spuDetailList); + + /** + * 根据商品详情信息id删除商品详情信息 + * @param spuId + */ + void deleteById(Long spuId); + + /** + * 更新商品详情 + * @param spuDetailList + * @param detailList + * @param spuId + */ + void update(List spuDetailList, List detailList, Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuEsSearchService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuEsSearchService.java new file mode 100644 index 0000000..1541a15 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuEsSearchService.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.bo.EsProductBO; + +/** + * 商品es信息处理 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuEsSearchService { + /** + * 根据spuId获取商品信息 + * @param spuId + * @return 商品信息 + */ + EsProductBO loadEsProductBO(Long spuId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuExtensionService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuExtensionService.java new file mode 100644 index 0000000..63b5590 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuExtensionService.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.SpuExtension; +import com.tmerclub.cloud.product.vo.SpuExtensionVO; + +/** + * + * + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +public interface SpuExtensionService { + + /** + * 分页获取列表 + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param spuExtendId id + * @return + */ + SpuExtensionVO getBySpuExtendId(Long spuExtendId); + + /** + * 保存 + * @param spuExtension 商品扩展信息 + */ + void save(SpuExtension spuExtension); + + /** + * 根据id删除 + * @param spuId + */ + void deleteById(Long spuId); + + /** + * 获取spu扩展信息 + * @param spuId + * @return + */ + SpuExtension getBySpuId(Long spuId); + + /** + * 更新商品扩展信息 + * @param spuExtension + */ + void update(SpuExtension spuExtension); + + /** + * 根据商品id更新商品注水销量 + * @param spuId + * @param waterSoldNum + */ + void updateWaterSoldNumBySpuId(Long spuId, Integer waterSoldNum); + + /** + * 根据商品id修改商品评价数量 + * @param spuId + * @param changeCount + */ + void changeCommentNum(Long spuId, Integer changeCount); + + /** + * 根据秒杀订单支付成功,更新商品销量 + * @param spuId + * @param prodCount + * @return + */ + void updateSaleNumBySeckillOrder(Long spuId, Integer prodCount); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuService.java new file mode 100644 index 0000000..7253b11 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuService.java @@ -0,0 +1,677 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.platform.dto.OfflineHandleEventDTO; +import com.tmerclub.cloud.api.platform.vo.OfflineHandleEventVO; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.SkuStockPointSearchDTO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuActivityAppVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.dto.SpuPageSearchDTO; +import com.tmerclub.cloud.product.model.Spu; +import com.tmerclub.cloud.product.model.SpuExtension; +import com.tmerclub.cloud.product.vo.SpuCountVO; +import com.tmerclub.cloud.product.vo.SupplierSpuVo; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * spu信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuService { + + /** + * 分页获取spu信息列表 + * + * @param pageDTO 分页参数 + * @param spuDTO + * @return spu信息列表分页数据 + */ + PageVO page(PageDTO pageDTO, SpuPageSearchDTO spuDTO); + + /** + * spu基本信息(国际化信息还没处理,如需用到商品名等国际化的信息,调用接口后需要处理) + * 获取数据列表:spu、spu国际化、spu详情、skuIds、赠品活动信息 + * + * @param spuId spu信息id + * @return spu信息 + */ + SpuVO getBySpuId(Long spuId); + + /** + * spu基本信息Map, 从Redis中获取,数据来源:getBySpuId()缓存的商品数据 + * + * @param spuIds spu信息id + * @return spu信息 + */ + Map mapSpuByCache(List spuIds); + + /** + * spu扩展信息 + * + * @param spuId spu信息id + * @return spu信息 + */ + SpuExtension getSpuExtension(Long spuId); + + /** + * 保存spu信息 + * + * @param spuDTO spu信息 + */ + void save(SpuDTO spuDTO); + + /** + * 更新spu信息 + * + * @param spuDTO spu信息 + */ + void update(SpuDTO spuDTO); + + /** + * 根据spu信息id删除spu信息 + * + * @param spuId + */ + void deleteById(Long spuId); + + /** + * 根据spuId列表, 批量清除缓存 + * + * @param spuIds id + */ + void batchRemoveSpuActivityCache(List spuIds); + + /** + * 改变商品状态(上下架) + * + * @param spuId + * @param status + */ + void changeSpuStatus(Long spuId, Integer status); + + /** + * 批量改变商品状态(上下架) + * + * @param spuIds + * @param status + */ + void batchChangeSpuStatus(List spuIds, Integer status); + + /** + * 平台下架商品 + * + * @param spuIds + * @param status + * @param sysType + */ + void batchChangeCommissionSpuStatus(List spuIds, Integer status, Integer sysType); + + /** + * 更新商品的信息 + * + * @param spuDTO + */ + void updateSpuOrSku(SpuDTO spuDTO); + + /** + * 更新spu表(canal监听后,会发送更新的消息,更新es中的数据) + * + * @param spuIds + * @param categoryIds + * @param shopIds + * @param sysType + */ + void updateSpuUpdateTime(List spuIds, List categoryIds, List shopIds, Integer sysType); + + /** + * 获取 spuId列表 + * + * @param shopCategoryIds 店铺分类id列表 + * @param categoryIds 平台分类Id列表 + * @param brandId 品牌id + * @param shopId 店铺id + * @return spuId列表 + */ + List getSpuIdsBySpuUpdateDTO(List shopCategoryIds, List categoryIds, Long brandId, Long shopId); + + /** + * 商品活动信息 + * + * @param shopId + * @param spuId + * @return + */ + SpuActivityAppVO spuActivityBySpuId(Long shopId, Long spuId); + + /** + * 根据店铺id,获取店铺spu列表 + * + * @param shopId + * @return + */ + List listSpuIdsByShopId(Long shopId); + + /** + * 根据id获取 + * @param supplierId + * @return + */ + SpuCountVO getSpuCountBySupplierId(Long supplierId); + + /** + * 下线店铺中的商品 + * + * @param shopId + */ + void offlineSpuByShopId(Long shopId); + + /** + * 获取spu列表 + * + * @param spu + * @return + */ + List list(SpuPageSearchDTO spu); + + /** + * 更新商品信息 + * + * @param spu + */ + void updateSpu(Spu spu); + + /** + * 平台下架优惠券 + * + * @param offlineHandleEventDto + */ + void offline(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 获取下线的事件记录 + * + * @param spuId + * @return + */ + OfflineHandleEventVO getOfflineHandleEvent(Long spuId); + + /** + * 平台审核商家提交的申请 + * + * @param offlineHandleEventDto + */ + void audit(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 违规活动提交审核 + * + * @param offlineHandleEventDto + */ + void auditApply(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 根据spuId或者为空直接获取可以参与秒杀活动的商品列表 + * + * @param spuId spuId + * @param shopId 店铺id + * @return 商品信息 + */ + List listCanSeckillProd(Long spuId, Long shopId); + + /** + * 根据运费id获取商品数量 + * + * @param transportId + * @return + */ + Integer countByTransportId(Long transportId); + + /** + * 变为普通商品 + * + * @param spuIds + */ + void changeToNormalSpu(List spuIds); + + /** + * 根据分类id与店铺id查询使用该分类的商品数量 + * + * @param categoryId + * @param shopId + * @param sysType + * @return + */ + int countByCategoryAndShopId(Long categoryId, Long shopId, Integer sysType); + + /** + * 商品状态发生改变时,需要处理的事件 + * + * @param spuIds 商品id + */ + void handleStatusChange(List spuIds); + + /** + * 根据用户id查询商品收藏数量 + * + * @param userId 用户id + * @return 商品收藏数量 + */ + Integer countByUserId(Long userId); + + /** + * 根据商品id列表获取商品名称列表 + * + * @param spuIds + * @return + */ + List listSpuNameBySpuIds(List spuIds); + + + /** + * 批量改变商品状态(上下架) + * + * @param cidList + * @param status + * @param shopId + * @param sysType + */ + void batchChangeSpuStatusByCidListAndShopId(List cidList, Integer status, Long shopId, Integer sysType); + + /** + * 根据商品id列表获取商品列表 + * + * @param spuIds + * @return + */ + List listSpuBySpuIds(List spuIds); + + /** + * 根据商品id列表获取商品列表 + * + * @param spuIds + * @return + */ + List listSpuDetailBySpuIds(List spuIds); + + /** + * 更新商品数据 + */ + void verifySpuData(); + + /** + * 获取商品信息 + * + * @param spuId + * @return + */ + SpuAppVO prodInfo(Long spuId); + + /** + * 根据店铺id列表下架商品 + * + * @param type + * @param shopIds + */ + void offlineSpuByShopIds(Integer type, List shopIds); + + /** + * 根据商品id设置商品是否置顶 + * + * @param spuId + */ + void toTopBySpuId(Long spuId); + + /** + * 根据基本信息获取商品列表 + * + * @param spuSimpleBO + * @return + */ + List listSimple(SpuSimpleBO spuSimpleBO); + + /** + * 根据基本信息获取商品列表(包括删除商品) + * + * @param spuSimpleBO + * @return + */ + List listSimples(SpuSimpleBO spuSimpleBO); + + /** + * 移除商品缓存通过商品id + * + * @param spuId 商品id + */ + void removeSpuCacheBySpuId(Long spuId); + + /** + * 根据店铺id列表获取商品id列表 + * + * @param shopIds + * @return + */ + List listSpuIdsByShopIds(List shopIds); + + /** + * 移除商品中指定的品牌信息 + * + * @param brandId + */ + void removeBrandOfSpu(Long brandId); + + /** + * 校验spu状态 + * + * @param spuIds + * @return + */ + ServerResponseEntity checkSpuStatus(List spuIds); + + /** + * 批量下线商品 + * + * @param offlineHandleEventDto + */ + void batchOffile(OfflineHandleEventDTO offlineHandleEventDto); + + /** + * 根据店铺id和供应商商品id判断店铺是否代销了 + * + * @param shopId + * @param supplierSpuId + * @return + */ + Integer isCommissionByShopIdAndSpuId(Long shopId, Long supplierSpuId); + + /** + * 商家代销供应商的商品时获取供应商商品信息 + * + * @param spuId + * @param shopId + * @return + */ + SupplierSpuVo getSupplierInfoBySpuId(Long spuId, Long shopId); + + /** + * 当供货价高于代销价时下架商品(sku供货价) + * + * @param skuId + * @param price + */ + void soldOutSpu(Long skuId, Long price); + + /** + * 商家单个/批量导入供应商商品 + * + * @param supplierSpuId + * @return + */ + List importSupplierSpu(List supplierSpuId); + + /** + * 根据代销设置设置代销商品的售价 + * + * @param skuVO + * @return + */ + Long setPriceFee(SkuVO skuVO); + + /** + * 根据店铺id和供应商商品id获取代销商品信息 + * + * @param shopId + * @param supplierSpuId + * @return + */ + SpuVO getSpuByShopIdAndSupplierSpuId(Long shopId, Long supplierSpuId); + + /** + * 获取代销商品spu信息列表 + * + * @param spu + * @return spu信息列表 + */ + List supplierSpuList(SpuPageSearchDTO spu); + + /** + * 根据供应商id批量获取商家代销商品信息 + * + * @param supplierId + * @return + */ + List listMerchantSpuIdsBySupplierId(Long supplierId); + + /** + * 根据店铺id和供应商商品id列表批量获取代销商品信息 + * + * @param shopId + * @param supplierSpuIds + * @return + */ + List listSpuByShopIdAndSupplierSpuId(Long shopId, List supplierSpuIds); + + /** + * 根据供应商id、发布时间和商品类型(是否已被代销)批量获取商品信息 + * + * @param supplierId + * @param createTime + * @param supplierSpuType + * @return + */ + List getSpuIdsBySupplierIdAndSupplierSpuType(Long supplierId, Date createTime, Integer supplierSpuType); + + /** + * 供应商修改供货价时修改代销商品价格 + * + * @param spuId + * @param price + * @param marketPriceFee + */ + void soldOutSpuBySpu(Long spuId, Long price, Long marketPriceFee); + + /** + * 根据供应商Id下线供应商店铺的商品 + * + * @param supplierId + * @return + */ + void offlineSpuBySupplierId(Long supplierId); + + /** + * 根据供应商商品id获取供应商发货代销商品信息 + * + * @param supplierSpuId + * @return + */ + List listSpuBySupplierSpuId(Long supplierSpuId); + + /** + * 获取代销商品 供应商商品更新后代销商品是否已同步更新 值 + * + * @param spuIds + * @return + */ + List getSpuIsSynUpdate(List spuIds); + + /** + * 根据供应商商品id获取代销商品id集合 + * + * @param supplierId + * @return + */ + List getSupIdListBySupplierId(Long supplierId); + + /** + * 批量设置供应商商品更新后代销商品是否已同步更新值 + * + * @param spuIds + * @param isSynUpdate + */ + void batchChangeSynUpdate(List spuIds, Integer isSynUpdate); + + /** + * 批量修改代销商品发货方式 + * + * @param spuIds + * @param deliverType + */ + void batchUpdateCommissionSpuDeliverType(List spuIds, Integer deliverType); + + /** + * 供应商商品变更后对应下架不同类型的代销商品 + * + * @param supplierSpuId + * @param commissionSpuOffType + */ + void supplierSpuUpdateLaterOffSpu(Long supplierSpuId, Integer commissionSpuOffType); + + /** + * 商家更新代销设置时,更新代销商品的价格 + * + * @param shopId + */ + void updateManualPriceCommissionSpuPrice(Long shopId); + /** + * spu基本信息(国际化信息还没处理,如需用到商品名等国际化的信息,调用接口后需要处理) + * + * @param spuIds + * @return spu信息 + */ + List getBySpuIds(List spuIds); + + /** + * 据供应商id列表下架商品 + * + * @param supplierIdsToStop + */ + void batchChangeSpuStatusToDisableBySupplierIds(List supplierIdsToStop); + + /** + * 根据供应商品id获取发货方式为供应商发货代销商品Id集合 + * + * @param supplierSpuId + * @return + */ + List getCommissionSpuList(Long supplierSpuId); + + /** + * 供应商品更新品牌或者排序时,同步更新代销商品的品牌或排序upadte + * + * @param brandId + * @param seq + * @param supplierSpuId + */ + void syncUpdateCommissionSpuBrandOrSeq(Long brandId, Integer seq, Long supplierSpuId); + + /** + * 分页查询spu及其sku信息 + * + * @param pageDTO + * @param spuDTO + * @return + */ + PageVO pageSpuSku(PageDTO pageDTO, SpuDTO spuDTO); + + /** + * 添加采购订单时未导入的供应商品自动导入 + * + * @param spuVOList + * @param sysType + * @param userId + */ + void voluntarilyImportSupplierSpu(List spuVOList, Integer sysType, Long userId); + + /** + * 初次审核发布的商品 + * + * @param eventDTO + */ + void auditSpu(OfflineHandleEventDTO eventDTO); + + /** + * 获取供应商库存预警数量 + * + * @param supplierId + * @return + */ + Long stockWarningCount(Long supplierId); + + /** + * 获取核销时间过期的虚拟商品并进行下架操作 + * + * @return 过期的虚拟商品 + */ + List handleExpireVirtualProd(); + + /** + * 设置属性 + * @param spuVO + */ + void loadSpuAttrs(SpuVO spuVO); + + /** + * 根据店铺id更新商品(canal监听后,会发送更新的消息,更新es中的数据) + * @param shopId 店铺id + * @param sysType 系统类型 + */ + void updateSpuByShopId(Long shopId, Integer sysType); + + /** + * 获取店铺中指定供应商商品的代销商品列表 + * @param shopId + * @param supplierSpuIds + * @return + */ + List listShopSpuBySupplierSpuIds(Long shopId, List supplierSpuIds); + + /** + * 分页获取库存点关联的商品数据 + * @param pageDTO + * @param spuDTO + * @return + */ + PageVO pageStockPointSpu(PageDTO pageDTO, StockPointSkuDTO spuDTO); + + /** + * 分页获取供应商库存点商品 + * @param pageDTO 分页参数 + * @param searchDTO 查询参数 + * @return + */ + PageVO pageSupplierStockPointSpu(PageDTO pageDTO, SkuStockPointSearchDTO searchDTO); + + /** + * 初始化商品关联数据 + */ + void intiStockPointSKu(); + + /** + * 获取状态正常的商品数量 + * @param spuIds + * @param skuIds + * @return + */ + int countNormalSpuBySpuIds(Set spuIds); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSkuAttrValueService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSkuAttrValueService.java new file mode 100644 index 0000000..3b16441 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSkuAttrValueService.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.product.dto.SpuSkuAttrValueDTO; +import com.tmerclub.cloud.product.model.SpuSkuAttrValue; + +import java.util.List; + +/** + * 商品sku销售属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public interface SpuSkuAttrValueService { + + /** + * 保存商品sku销售属性关联信息 + * + * @param spuSkuAttrValueList 商品sku销售属性关联信息 + * @param sysType + */ + void save(List spuSkuAttrValueList, Integer sysType); + + /** + * 批量更新商品sku销售属性关联信息 + * + * @param spuSkuAttrValues 商品sku销售属性关联信息 + */ + void updateBatch(List spuSkuAttrValues); + + /** + * 根据商品sku销售属性关联信息id删除商品sku销售属性关联信息 + * + * @param spuSkuAttrId + */ + void deleteById(Long spuSkuAttrId); + + /** + * 根据spuId删除sku信息 + * + * @param spuId spuId + */ + void updateBySpuId(Long spuId); + + /** + * 根据skuId列表,改变销售属性状态 + * + * @param skuIds + * @param status + */ + void changeStatusBySkuId(List skuIds, Integer status); + + /** + * 异步保存代销商品sku销售属性关联信息 + * + * @param spuSkuAttrValueList 商品sku销售属性关联信息 + * @param sysType + */ + void commissionSave(List spuSkuAttrValueList, Integer sysType); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSupplierChangeLogService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSupplierChangeLogService.java new file mode 100644 index 0000000..0df5129 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuSupplierChangeLogService.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.SpuSupplierChangeLogDTO; +import com.tmerclub.cloud.product.model.SpuSupplierChangeLog; +import com.tmerclub.cloud.product.vo.SpuSupplierChangeLogVO; + +import java.util.List; + +/** + * 商品供应商变更记录 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface SpuSupplierChangeLogService { + + /** + * 分页获取商品供应商变更记录列表 + * @param pageDTO 分页参数 + * @return 商品供应商变更记录列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商品供应商变更记录id获取商品供应商变更记录 + * + * @param spuChangeId 商品供应商变更记录id + * @return 商品供应商变更记录 + */ + SpuSupplierChangeLog getBySpuChangeId(Long spuChangeId); + + /** + * 保存商品供应商变更记录 + * @param spuSupplierChangeLog 商品供应商变更记录 + */ + void save(SpuSupplierChangeLog spuSupplierChangeLog); + + /** + * 更新商品供应商变更记录 + * @param spuSupplierChangeLog 商品供应商变更记录 + */ + void update(SpuSupplierChangeLog spuSupplierChangeLog); + + /** + * 根据商品供应商变更记录id删除商品供应商变更记录 + * @param spuChangeId 商品供应商变更记录id + */ + void deleteById(Long spuChangeId); + + /** + * 批量同步 + * @param shopId + * @param spuSupplierChangeLog + */ + void syncSpu(Long shopId, List spuSupplierChangeLog); + + /** + * 批量上下架的变更记录 + * @param spuIds + * @param status + */ + void insertBatchChangeStatus(List spuIds, Integer status); + + /** + * 批量插入变更记录 + * @param spuSupplierChangeLogs + */ + void saveBatch(List spuSupplierChangeLogs); + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuTagReferenceService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuTagReferenceService.java new file mode 100644 index 0000000..979d167 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuTagReferenceService.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.product.dto.SpuTagReferenceDTO; +import com.tmerclub.cloud.product.model.SpuTag; +import com.tmerclub.cloud.product.model.SpuTagReference; +import com.tmerclub.cloud.product.vo.SpuTagReferenceVO; + +import java.util.List; + +/** + * 商品分组标签关联信息 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public interface SpuTagReferenceService { + + /** + * 分页获取商品分组标签关联信息列表 + * + * @param pageDTO 分页参数 + * @return 商品分组标签关联信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据商品分组标签关联信息id获取商品分组标签关联信息 + * + * @param referenceId 商品分组标签关联信息id + * @return 商品分组标签关联信息 + */ + SpuTagReferenceVO getByReferenceId(Long referenceId); + + /** + * 保存商品分组标签关联信息 + * + * @param spuTagReference 商品分组标签关联信息 + */ + void save(SpuTagReference spuTagReference); + + /** + * 更新商品分组标签关联信息 + * + * @param spuTagReference 商品分组标签关联信息 + */ + void update(SpuTagReference spuTagReference); + + /** + * 根据商品分组标签关联信息id删除商品分组标签关联信息 + * + * @param referenceId + */ + void deleteById(Long referenceId); + + /** + * 根据状态和分组id返回分组下的商品数量 + * + * @param status 状态 + * @param id 分组id + * @return 返回商品数量 + */ + int countByStatusAndTagId(Integer status, Long id); + + /** + * 保存商品标签关联信息,修改标签信息 + * + * @param spuTag 标签信息 + * @param spuList 标签商品关联信息 + */ + void addProdForTag(SpuTag spuTag, List spuList); + + /** + * 根据ids获取商品标签关联信息列表 + * + * @param ids 商品id + * @return 返回标签关联信息 + */ + List listByIds(List ids); + + /** + * 修改标签内商品排序 + * + * @param spuTagReferences 商品排序信息 + */ + void updateProdSeq(List spuTagReferences); + + /** + * 移除商品和商品标签的关联 + * + * @param prodTagId 商品标签id + * @param spuIds 商品ids + */ + void removeByProdId(Long prodTagId, List spuIds); + + /** + * 获取商品所属的分组列表 + * + * @param spuId + * @return + */ + List tagListBySpuId(Long spuId); + + /** + * 删除spu关联分组的数据 + * + * @param spuIds + */ + void deleteSpuData(List spuIds); + + /** + * 根据分类,删除spu关联分组的数据 + * @param shopId + * @param categoryIds + */ + void deleteSpuTagByShopIdAndCategoryIds(Long shopId, List categoryIds); + + /** + * 根据分组id,获取分组下的商品id列表 + * + * @param tagId 分组id + * @return 商品id列表 + */ + List spuIdsByTagId(Long tagId); + + /** + * 根据分组id获取商品列表 + * @param pageDTO 分页信息 + * @param spuTagReferenceDTO 筛选条件 + * @return 商品分页信息 + */ + PageVO pageSpuListByTagId(PageDTO pageDTO, SpuTagReferenceDTO spuTagReferenceDTO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuTagService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuTagService.java new file mode 100644 index 0000000..4322d83 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/SpuTagService.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.SpuTagDTO; +import com.tmerclub.cloud.product.model.SpuTag; +import com.tmerclub.cloud.product.vo.SpuTagVO; + +import java.util.List; + +/** + * 商品分组表 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +public interface SpuTagService { + + + /** + * 根据商品分组表id获取商品分组表 + * + * @param id 商品分组表id + * @return 商品分组表 + */ + SpuTagVO getById(Long id); + + /** + * 保存商品分组表 + * + * @param spuTag 商品分组表 + */ + void save(SpuTag spuTag); + + /** + * 更新商品分组表 + * + * @param spuTag 商品分组表 + */ + void update(SpuTag spuTag); + + /** + * 根据商品分组表id删除商品分组表 + * + * @param id + */ + void deleteById(Long id); + + /** + * 根据标签名称分页获取商品分组表列表 + * + * @param pageDTO 分页参数 + * @param spuTagDTO 筛选参数 + * @return 商品分组表列表分页数据 + */ + PageVO pageByTitle(PageDTO pageDTO, SpuTagDTO spuTagDTO); + + /** + * 根据标签名称获取商品分组表列表 + * + * @param spuTagDTO 筛选参数 + * @return 商品分组列表数据 + */ + List listByTitle(SpuTagDTO spuTagDTO); + + /** + * 修改标签商品数量 + * + * @param id 标签信息 + */ + void updateProdCountById(Long id); + + /** + * 批量修改标签商品数量 + * + * @param ids 标签信息 + */ + void batchUpdateProdCountById(List ids); + + /** + * 根据店铺id获取分组信息 + * + * @param shopId 店铺id + * @return 分组信息 + */ + List listByShopId(Long shopId); + + /** + * 移除分组换成 + * + * @param shopId 店铺id + */ + void removeCacheByShopId(Long shopId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockBillLogService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockBillLogService.java new file mode 100644 index 0000000..a844bca --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockBillLogService.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.order.bo.RefundStockOperateBO; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.vo.StockBillLogVO; +import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogBO; +import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogItemBO; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.model.StockBillLog; +import com.tmerclub.cloud.product.vo.StockBillLogExcelVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogVO; + +import java.util.Date; +import java.util.List; + +/** + * 出入库明细 + * + * @author lhd + * @date 2022-06-22 16:57:26 + */ +public interface StockBillLogService { + + /** + * 分页获取出入库明细列表 + * @param pageDTO 分页参数 + * @param stockBillLogDtO + * @return 出入库明细列表分页数据 + */ + PageVO page(PageDTO pageDTO, StockBillLogDTO stockBillLogDtO); + + /** + * 根据出入库明细id获取出入库明细 + * + * @param stockBillLogId 出入库明细id + * @return 出入库明细 + */ + MongoStockBillLogVO getByStockBillLogId(Long stockBillLogId); + + /** + * 获取导出的出入库明细列表 + * @param stockBillLogDTO + * @return + */ + List exportStockBillLogList(StockBillLogDTO stockBillLogDTO); + + /** + * 保存出入库明细信息 + * @param stockBillLog + */ + void saveInfo(StockBillLogVO stockBillLog); + + + /** + * 根据订单生成出入库明细 + * @param refundStockOperateBO + * @return 需要修改的sku库存列表 + */ + void generateStockLogOfRefundOrderList(RefundStockOperateBO refundStockOperateBO); + + /** + * 根据订单生成出入库明细 + * @param stockBillLogItems + * @param stockBillType + * @param stockType + * @return 是否成功 失败代表是空列表或者已经添加成功了,不需要重复操作 + */ + void generateStockLogOfOrderList(List stockBillLogItems); + + /** + * 更新出入库明细信息 + * @param stockBillLogDTO + */ + void updateInfo(StockBillLogDTO stockBillLogDTO); + + /** + * 获取出入库订单号关联数量 + * @param orderId + * @param value + * @return + */ + long countByOrderId(Long orderId, Integer value); + + /** + * 作废出入库明细单 + * @param shopId + * @param stockBillLogId + */ + void voided(Long shopId, Long stockBillLogId); + + /** + * 通过实物盘点创建库存变更日志 + * @param stockBillLog + * @param skuDTOList + */ + void generateStockLogOfTakeStock(StockBillLog stockBillLog, List skuDTOList); + + /** + * 根据订单id列表和库存类型,删除sku库存记录 + * @param orderIds + * @param stockBillType + */ + void removeByOrderIds(List orderIds, Integer stockBillType); + + /** + * 获取库存发生改变的商品id列表 + * @param beginTime + * @param endTime + * @return 商品id列表 + */ + List listSpuIdOfStockChange(Date beginTime, Date endTime); + + /** + * 版本升级后,初始化出入库明细记录 + */ + void initStockBillLog(); + + List listLastSkuStock(); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonLangService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonLangService.java new file mode 100644 index 0000000..f74e266 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonLangService.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.product.model.StockChangeReasonLang; + +/** + * 出入库原因-国际化 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface StockChangeReasonLangService { + + /** + * 分页获取出入库原因-国际化列表 + * @param pageDTO 分页参数 + * @return 出入库原因-国际化列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据出入库原因-国际化id获取出入库原因-国际化 + * + * @param stockChangeReasonId 出入库原因-国际化id + * @return 出入库原因-国际化 + */ + StockChangeReasonLang getByStockChangeReasonId(Long stockChangeReasonId); + + /** + * 保存出入库原因-国际化 + * @param stockChangeReasonLang 出入库原因-国际化 + */ + void save(StockChangeReasonLang stockChangeReasonLang); + + /** + * 更新出入库原因-国际化 + * @param stockChangeReasonLang 出入库原因-国际化 + */ + void update(StockChangeReasonLang stockChangeReasonLang); + + /** + * 根据出入库原因-国际化id删除出入库原因-国际化 + * @param stockChangeReasonId 出入库原因-国际化id + */ + void deleteById(Long stockChangeReasonId); + + /** + * 获取出入库原因相同的个数 + * @param stockChangeReasonDTO + * @return + */ + Integer countReason(StockChangeReasonDTO stockChangeReasonDTO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonService.java new file mode 100644 index 0000000..bcf48dc --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonService.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.product.model.StockChangeReason; +import com.tmerclub.cloud.product.vo.StockChangeReasonVO; + +import java.util.List; + +/** + * 出入库原因 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface StockChangeReasonService { + + /** + * 分页获取出入库原因列表 + * @param pageDTO 分页参数 + * @param stockChangeReasonDTO + * @return 出入库原因列表分页数据 + */ + PageVO page(PageDTO pageDTO, StockChangeReasonDTO stockChangeReasonDTO); + + /** + * 根据出入库原因id获取出入库原因 + * + * @param stockChangeReasonId 出入库原因id + * @return 出入库原因 + */ + StockChangeReasonVO getByStockChangeReasonId(Long stockChangeReasonId); + + /** + * 保存出入库原因 + * @param stockChangeReasonDTO 出入库原因 + */ + void save(StockChangeReasonDTO stockChangeReasonDTO); + + /** + * 更新出入库原因 + * @param stockChangeReason 出入库原因 + */ + void update(StockChangeReason stockChangeReason); + + /** + * 根据出入库原因id删除出入库原因 + * @param stockChangeReasonId 出入库原因id + */ + void deleteById(Long stockChangeReasonId); + + /** + * 改变出入库原因状态 + * @param shopId + * @param stockChangeReasonId + * @param status + */ + void changeStatus(Long shopId, Long stockChangeReasonId, Integer status); + + /** + * 获取店铺所有的出入库原因 + * @param stockChangeReasonDTO + * @return + */ + List list(StockChangeReasonDTO stockChangeReasonDTO); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonStatusService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonStatusService.java new file mode 100644 index 0000000..7065634 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/StockChangeReasonStatusService.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.model.StockChangeReasonStatus; + +/** + * 出入库原因状态 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public interface StockChangeReasonStatusService { + + /** + * 分页获取出入库原因状态列表 + * @param pageDTO 分页参数 + * @return 出入库原因状态列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据出入库原因状态id获取出入库原因状态 + * + * @param stockChangeReasonStatusId 出入库原因状态id + * @return 出入库原因状态 + */ + StockChangeReasonStatus getByStockChangeReasonStatusId(Long stockChangeReasonStatusId); + + /** + * 保存出入库原因状态 + * @param stockChangeReasonStatus 出入库原因状态 + */ + void save(StockChangeReasonStatus stockChangeReasonStatus); + + /** + * 更新出入库原因状态 + * @param stockChangeReasonStatus 出入库原因状态 + */ + void update(StockChangeReasonStatus stockChangeReasonStatus); + + /** + * 根据出入库原因状态id删除出入库原因状态 + * @param stockChangeReasonStatusId 出入库原因状态id + */ + void deleteById(Long stockChangeReasonStatusId); + + /** + * 根据shopId 和 reasonId 获取(系统)出入库原因状态 + * + * @param shopId 店铺id + * @param reasonId 出入库原因id + * @return + */ + StockChangeReasonStatus getStatusByShopIdAndReasonId(Long shopId, Long reasonId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/WarehouseAreaService.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/WarehouseAreaService.java new file mode 100644 index 0000000..3833384 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/WarehouseAreaService.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.dto.WarehouseAreaDTO; +import com.tmerclub.cloud.product.model.WarehouseArea; + +import java.util.List; + +/** + * 仓库项和供货城市关联信息 + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +public interface WarehouseAreaService { + + /** + * 分页获取仓库项和供货城市关联信息列表 + * @param pageDTO 分页参数 + * @return 仓库项和供货城市关联信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据仓库项和供货城市关联信息id获取仓库项和供货城市关联信息 + * + * @param warehouseAreaId 仓库项和供货城市关联信息id + * @return 仓库项和供货城市关联信息 + */ + WarehouseArea getByWarehouseAreaId(Long warehouseAreaId); + + /** + * 保存仓库项和供货城市关联信息 + * @param warehouseArea 仓库项和供货城市关联信息 + */ + void save(WarehouseArea warehouseArea); + + /** + * 更新仓库项和供货城市关联信息 + * @param warehouseArea 仓库项和供货城市关联信息 + */ + void update(WarehouseArea warehouseArea); + + /** + * 根据仓库项和供货城市关联信息id删除仓库项和供货城市关联信息 + * @param warehouseAreaId 仓库项和供货城市关联信息id + */ + void deleteById(Long warehouseAreaId); + + /** + * 批量保存仓库和供货城市关联信息 + * @param warehouseAreaDTOList + */ + void batchSave(List warehouseAreaDTOList); + + /** + * 批量删除关联信息 + * @param warehouseId + */ + void deleteByWarehouseId(Long warehouseId); +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrCategoryServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrCategoryServiceImpl.java new file mode 100644 index 0000000..73222bf --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrCategoryServiceImpl.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.product.mapper.AttrCategoryMapper; +import com.tmerclub.cloud.product.service.AttrCategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 属性与属性分组关联信息 + * + * @author YXF + * @date 2020-11-23 16:20:01 + */ +@Service +public class AttrCategoryServiceImpl implements AttrCategoryService { + + @Autowired + private AttrCategoryMapper attrCategoryMapper; + + @Override + public void save(Long attrId, List categoryIds) { + attrCategoryMapper.saveBatch(attrId, categoryIds); + } + + @Override + public List update(Long attrId, List categoryIds) { + if (CollUtil.isEmpty(categoryIds)) { + return new ArrayList<>(0); + } + List dbCategoryIds = attrCategoryMapper.getCategoryIdsByAttrId(attrId); + List addList = new ArrayList<>(categoryIds.size()); + addList.addAll(categoryIds); + addList.removeAll(dbCategoryIds); + if (CollUtil.isNotEmpty(addList)) { + attrCategoryMapper.saveBatch(attrId, addList); + } + dbCategoryIds.removeAll(categoryIds); + if (CollUtil.isNotEmpty(dbCategoryIds)) { + attrCategoryMapper.deleteBatch(attrId, dbCategoryIds); + } + return dbCategoryIds; + } + + @Override + public List listByAttrId(Long attrId) { + return attrCategoryMapper.listByAttrId(attrId, I18nMessage.getLang()); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrServiceImpl.java new file mode 100644 index 0000000..f27c616 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrServiceImpl.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.AttrType; +import com.tmerclub.cloud.common.product.dto.AttrLangDTO; +import com.tmerclub.cloud.common.product.vo.AttrVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.AttrDTO; +import com.tmerclub.cloud.product.mapper.AttrMapper; +import com.tmerclub.cloud.product.model.Attr; +import com.tmerclub.cloud.product.model.AttrLang; +import com.tmerclub.cloud.product.model.AttrValue; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 属性信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:23 + */ +@Service +public class AttrServiceImpl implements AttrService { + + @Autowired + private AttrMapper attrMapper; + @Autowired + private AttrLangService attrLangService; + @Autowired + private AttrValueLangService attrValueLangService; + @Autowired + private AttrCategoryService attrCategoryService; + @Autowired + private AttrValueService attrValueService; + @Autowired + private CategoryService categoryService; + @Autowired + private SpuAttrValueService spuAttrValueService; + + @Override + public PageVO page(PageDTO pageDTO, AttrDTO attrDTO) { + PageVO pageVO = new PageVO<>(); + attrDTO.setShopId(AuthUserContext.get().getTenantId()); + pageVO.setList(attrMapper.list(new PageAdapter(pageDTO), attrDTO)); + ProductLangUtil.attrList(pageVO.getList()); + pageVO.setTotal(attrMapper.countAttr(attrDTO)); + pageVO.setPages(PageUtil.getPages(pageVO.getTotal(), pageDTO.getPageSize())); + return pageVO; + } + + @Override + public AttrVO getByAttrId(Long attrId) { + AttrVO attrVO = attrMapper.getByAttrId(attrId); + attrVO.setSysType(AuthUserContext.get().getSysType()); + if (Objects.equals(attrVO.getAttrType(), AttrType.BASIC.value())) { + attrVO.setCategories(attrCategoryService.listByAttrId(attrId)); + categoryService.getPathNames(attrVO.getCategories()); + } + return attrVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(AttrDTO attrDTO) { + Attr attr = BeanUtil.map(attrDTO, Attr.class); + attr.setAttrValues(BeanUtil.mapAsList(attrDTO.getAttrValues(), AttrValue.class)); + attr.setShopId(AuthUserContext.get().getTenantId()); + // 重名校验 + hasNameRepeated(attrDTO.getAttrLangList(), attr.getShopId(), attr.getAttrType(),null); + attrMapper.save(attr); + // 属性语言 + checkAttrLangData(attrDTO.getAttrLangList()); + attrLangService.save(BeanUtil.mapAsList(attrDTO.getAttrLangList(), AttrLang.class), attr.getAttrId()); + // 保存属性值 + attrValueService.save(attrDTO.getAttrValues(), attr.getAttrId()); + // 基本属性关联分类 + if (Objects.equals(AttrType.BASIC.value(), attr.getAttrType())) { + // 保存属性分类关联信息 + attrCategoryService.save(attr.getAttrId(), attrDTO.getCategoryIds()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(AttrDTO attrDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + attrDTO.setSysType(sysType); + Attr attr = BeanUtil.map(attrDTO, Attr.class); + AttrVO dbAttr = attrMapper.getByAttrId(attr.getAttrId()); + // 重名校验 + hasNameRepeated(attrDTO.getAttrLangList(), attr.getShopId(), attr.getAttrType(), attr.getAttrId()); + checkAttrLangData(attrDTO.getAttrLangList()); + + // 更新属性信息 + attrMapper.update(attr); + // 更新属性语言表 + for (AttrLangDTO name : attrDTO.getAttrLangList()) { + name.setAttrId(attr.getAttrId()); + } + attrLangService.update(BeanUtil.mapAsList(attrDTO.getAttrLangList(), AttrLang.class), dbAttr); + // 更新属性值 + attrValueService.update(attrDTO, dbAttr); + // 更新属性分类关联信息 + if (Objects.equals(dbAttr.getAttrType(), AttrType.BASIC.value())) { + List ids = attrCategoryService.update(attr.getAttrId(), attrDTO.getCategoryIds()); + // 清除取消关联的分类的数据 + spuAttrValueService.deleteByCategoryIds(attr.getAttrId(), ids); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long attrId) { + attrValueService.deleteByAttrId(attrId); + attrLangService.deleteById(attrId); + attrMapper.deleteById(attrId); + } + + @Override + @Cacheable(cacheNames = CacheNames.ATTRS_BY_CATEGORY_KEY, key = "#categoryId") + public List getAttrsByCategoryIdAndAttrType(Long categoryId) { + return attrMapper.getAttrsByCategoryIdAndAttrType(AttrType.BASIC.value(), categoryId, null, SysTypeEnum.PLATFORM.value()); + } + + @Override + public List getAttrOfCategoryIdByAttrId(Long attrId) { + AttrVO attr = attrMapper.getByAttrId(attrId); + if (Objects.isNull(attr)) { + throw new LuckException("属性不存在"); + } + if (CollUtil.isEmpty(attr.getCategories())) { + return new ArrayList<>(0); + } + return attr.getCategories().stream().map(CategoryVO::getCategoryId).collect(Collectors.toList()); + } + + @Override + public void removeAttrByCategoryId(List categoryIds) { + if (CollUtil.isEmpty(categoryIds)) { + return; + } + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long categoryId : categoryIds) { + keys.add(CacheNames.ATTRS_BY_CATEGORY_KEY + CacheNames.UNION + categoryId); + } + RedisUtil.deleteBatch(keys); + } + + @Override + public List getShopAttrs(Long shopId, Integer sysType) { + return attrMapper.getAttrsByCategoryIdAndAttrType(AttrType.SALES.value(), null, shopId, sysType); + } + + /** + * 判断属性名是否已存在 + * + * @param attrLangList + * @param shopId + * @param attrType + * @param attrId + */ + private void hasNameRepeated(List attrLangList, Long shopId, Integer attrType, Long attrId) { + List dbAttrLangList = attrMapper.countAttrName(attrLangList, shopId, attrType,attrId); + if (CollUtil.isEmpty(dbAttrLangList)) { + return; + } + Set nameSet = dbAttrLangList.stream().map(AttrLang::getName).collect(Collectors.toSet()); + throw new LuckException("规格" + nameSet + "已存在"); + } + + /** + * 检验属性国际化信息是否正确 + * + * @param attrLangList 属性国际化信息 + */ + private void checkAttrLangData(List attrLangList) { + if (CollUtil.isEmpty(attrLangList)) { + throw new LuckException("规格名不能为空"); + } + boolean correct = false; + Iterator iterator = attrLangList.iterator(); + while (iterator.hasNext()) { + AttrLangDTO attrLangDTO = iterator.next(); + if (StrUtil.isBlank(attrLangDTO.getName())) { + iterator.remove(); + continue; + } + if (Objects.equals(attrLangDTO.getLang(), Constant.DEFAULT_LANG)) { + correct = true; + } + } + if (CollUtil.isEmpty(attrLangList) || !correct) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrValueLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrValueLangServiceImpl.java new file mode 100644 index 0000000..8a79951 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/AttrValueLangServiceImpl.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.product.mapper.AttrValueLangMapper; +import com.tmerclub.cloud.product.model.AttrValueLang; +import com.tmerclub.cloud.product.service.AttrValueLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +@Service +public class AttrValueLangServiceImpl implements AttrValueLangService { + + @Autowired + private AttrValueLangMapper attrValueLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> attrValueLangMapper.list()); + } + + @Override + public AttrValueLang getByAttrValueId(Long attrValueId) { + return attrValueLangMapper.getByAttrValueId(attrValueId); + } + + @Override + public void save(List attrValueLangList, Long attrValueId) { + for (AttrValueLang attrValueLang : attrValueLangList) { + attrValueLang.setAttrValueId(attrValueId); + } + saveBatch(attrValueLangList); + } + + @Override + public void update(List attrValueLangList) { + if (CollUtil.isEmpty(attrValueLangList)) { + return; + } + attrValueLangMapper.batchUpdate(attrValueLangList); + } + + @Override + public void deleteById(Long attrValueId) { + attrValueLangMapper.deleteById(attrValueId); + } + + @Override + public void deleteBatch(List attrValueIds) { + attrValueLangMapper.deleteBatch(attrValueIds); + } + + @Override + public void deleteByAttrValueIds(List attrValueIds) { + if (CollUtil.isEmpty(attrValueIds)) { + return; + } + attrValueLangMapper.deleteByAttrValueIds(attrValueIds); + } + + @Override + public void saveBatch(List attrValueLangList) { + if (CollUtil.isEmpty(attrValueLangList)) { + return; + } + Iterator iterator = attrValueLangList.iterator(); + while (iterator.hasNext()) { + AttrValueLang attrValueLang = iterator.next(); + if (StrUtil.isNotBlank(attrValueLang.getValue())) { + continue; + } + if (Objects.equals(attrValueLang.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + throw new LuckException("中文属性值不能为空"); + } else { + iterator.remove(); + } + } + attrValueLangMapper.batchSave(attrValueLangList); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandServiceImpl.java new file mode 100644 index 0000000..8f3322a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/BrandServiceImpl.java @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageAdapter; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.bo.EsBrandBO; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.constant.BrandType; +import com.tmerclub.cloud.common.product.vo.BrandLangVO; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.app.BrandAppVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.BrandDTO; +import com.tmerclub.cloud.product.mapper.BrandMapper; +import com.tmerclub.cloud.product.model.Brand; +import com.tmerclub.cloud.product.model.BrandLang; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.BrandSigningVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 品牌信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class BrandServiceImpl implements BrandService { + + @Autowired + private BrandMapper brandMapper; + @Autowired + private BrandLangService brandLangService; + @Autowired + private CategoryBrandService categoryBrandService; + @Autowired + private BrandShopService brandShopService; + @Autowired + private SpuService spuService; + @Autowired + private SpuOfflineService spuOfflineService; + + @Override + public PageVO page(PageDTO pageDTO, BrandDTO brandDTO) { + PageAdapter pageAdapter = new PageAdapter(pageDTO); + List list = brandMapper.list(pageAdapter, brandDTO); + ProductLangUtil.brandList(list); + PageVO pageVO = new PageVO<>(); + pageVO.setList(list); + pageVO.setTotal(brandMapper.listTotal(brandDTO)); + pageVO.setPages(PageUtil.getPages(pageVO.getTotal(), pageDTO.getPageSize())); + return pageVO; + } + + @Override + public BrandVO getByBrandId(Long brandId) { + if (Objects.isNull(brandId) || Objects.equals(brandId, Constant.ZERO_LONG)) { + return null; + } + BrandVO brand = brandMapper.getByBrandId(brandId); + ProductLangUtil.brand(brand); + return brand; + } + + @Override + public BrandVO getInfo(Long brandId) { + BrandVO brand = brandMapper.getByBrandId(brandId); + if (Objects.isNull(brand)) { + return new BrandVO(); + } + List categoryVO = categoryBrandService.getCategoryByBrandId(brandId); + if (CollUtil.isNotEmpty(categoryVO)) { + brand.setCategories(categoryVO); + } + return brand; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(BrandDTO brandDTO) { + Brand brand = BeanUtil.map(brandDTO, Brand.class); + brand.setFirstLetter(brand.getFirstLetter().toUpperCase(Locale.ROOT)); + brand.setStatus(StatusEnum.ENABLE.value()); + + // 查询国际化表品牌名是否重复 + List brandLangs = BeanUtil.mapAsList(brandDTO.getBrandLangList(), BrandLang.class); + List brandLangs1 = brandLangService.listByBrandNamesCnOrEn(brandLangs.get(0).getName(), brandLangs.get(1).getName()); + //判断品牌名称是否重复 + if (!brandLangs1.isEmpty()) { + throw new LuckException("品牌名不能重复"); + } + + brandMapper.save(brand); + brandLangService.save(brandLangs, brand.getBrandId()); + if (CollUtil.isNotEmpty(brandDTO.getCategoryIds())) { + categoryBrandService.saveByCategoryIds(brand.getBrandId(), brandDTO.getCategoryIds()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(BrandDTO brandDTO) { + checkBrandName(brandDTO); + Brand brand = BeanUtil.map(brandDTO, Brand.class); + brand.setSpuCount(brandMapper.getUseNum(brandDTO.getBrandId())); + brandMapper.update(brand); + brandLangService.update(BeanUtil.mapAsList(brandDTO.getBrandLangList(), BrandLang.class), brand.getBrandId()); + categoryBrandService.updateByCategoryIds(brand.getBrandId(), brandDTO.getCategoryIds()); + } + + /** + * 校验品牌名称 + * + * @param brandDTO + */ + private void checkBrandName(BrandDTO brandDTO) { + List brandLangList = brandLangService.listByBrandNamesCnOrEnAndBrandId(brandDTO.getBrandLangList().get(0).getName(), brandDTO.getBrandLangList().get(1).getName(), brandDTO.getBrandId()); + //判断品牌名称是否重复 + if (!brandLangList.isEmpty()) { + throw new LuckException("品牌名不能重复"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long brandId) { + if (getUseNum(brandId) > 0) { + throw new LuckException("有部分商品在使用该品牌,不能进行删除操作"); + } + brandMapper.deleteById(brandId); + brandLangService.deleteById(brandId); + categoryBrandService.deleteByBrandIdList(Collections.singletonList(brandId)); + spuService.removeBrandOfSpu(brandId); + brandShopService.deleteByBrandId(brandId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBrandStatus(BrandDTO brandDTO) { + BrandVO dbBrand = getByBrandId(brandDTO.getBrandId()); + if (Objects.isNull(dbBrand) || dbBrand.getStatus().equals(brandDTO.getStatus())) { + return; + } + brandMapper.updateBrandStatus(brandDTO); + // 如果品牌下架,对应的商品下架 + if (!Objects.equals(StatusEnum.DISABLE.value(), brandDTO.getStatus())) { + return; + } + // 获取品牌相关的商品 + List spuIds = spuService.getSpuIdsBySpuUpdateDTO(null, null, brandDTO.getBrandId(), null); + if (CollUtil.isEmpty(spuIds)) { + return; + } + // 查询出秒杀or团购的商品进行下线 + spuOfflineService.offlineSpuStatusAndActivityByBrandId(spuIds, brandDTO.getBrandId()); + // 清除商品缓存 + spuService.batchRemoveSpuActivityCache(spuIds); + } + + @Override + @Cacheable(cacheNames = CacheNames.BRAND_LIST_BY_CATEGORY, key = "#categoryId + ':' + #lang") + public List listByCategory(Long categoryId, Integer lang) { + List brandList = brandMapper.listByCategory(categoryId); + ProductLangUtil.brandAppList(brandList); + return brandList; + } + + @Override + @Cacheable(cacheNames = CacheNames.BRAND_TOP, key = "#lang") + public List topBrandList(Integer lang) { + BrandDTO brandDTO = new BrandDTO(); + brandDTO.setIsTop(1); + List brandList = brandMapper.appList(brandDTO, Constant.BRAND_TOP_NUM); + ProductLangUtil.brandAppList(brandList); + return brandList; + } + + @Override + public void removeCache(List categoryIds) { + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(categoryIds)) { + Set categoryIdSet = new HashSet<>(categoryIds); + for (Long categoryId : categoryIdSet) { + keys.add(CacheNames.BRAND_LIST_BY_CATEGORY + CacheNames.UNION + categoryId + Constant.COLON + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + keys.add(CacheNames.BRAND_LIST_BY_CATEGORY + CacheNames.UNION + categoryId + Constant.COLON + LanguageEnum.LANGUAGE_EN.getLang()); + } + } + keys.add(CacheNames.BRAND_TOP + CacheNames.UNION + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + keys.add(CacheNames.BRAND_TOP + CacheNames.UNION + LanguageEnum.LANGUAGE_EN.getLang()); + RedisUtil.deleteBatch(keys); + } + + @Override + public void updateSpuCount(Long brandId) { + if (Objects.isNull(brandId) || Objects.equals(brandId, Constant.ZERO_LONG)) { + return; + } + brandMapper.batchUpdateSpuCount(Collections.singleton(brandId)); + } + + + @Override + public void updateSpuCountByBrandIds(Collection brandIds) { + if (CollUtil.isEmpty(brandIds)) { + return; + } + brandMapper.batchUpdateSpuCount(brandIds); + } + + @Override + public List listBrandLangByBrandNames(Set brandNames, Long shopId) { + if (CollUtil.isEmpty(brandNames)) { + return new ArrayList<>(0); + } + return brandLangService.listByBrandNames(brandNames, shopId); + } + + @Override + public PageVO appPage(PageDTO pageDTO, BrandDTO brandDTO) { + PageAdapter pageAdapter = new PageAdapter(pageDTO); + List brandAppVOList = brandMapper.brandAppPage(pageAdapter, brandDTO); + ProductLangUtil.brandAppList(brandAppVOList); + PageVO pageVO = new PageVO<>(); + pageVO.setList(brandAppVOList); + pageVO.setTotal(brandMapper.brandAppTotal(brandDTO)); + pageVO.setPages(PageUtil.getPages(pageVO.getTotal(), pageDTO.getPageSize())); + return pageVO; + } + + @Override + public List listByName(String name) { + return brandMapper.listByName(name, I18nMessage.getLang()); + } + + private int getUseNum(Long brandId) { + return brandMapper.getUseNum(brandId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCustomBrandToPlatformBrandByShopId(Long shopId, Integer sysType) { + brandMapper.updateShopIdAndStatusByShopId(shopId, StatusEnum.ENABLE.value(), Constant.PLATFORM_SHOP_ID, sysType); + brandShopService.updateTypeByShopId(shopId, BrandType.PLATFORM.value(), sysType); + } + + @Override + public List listAvailableBrandByCategoryIdAndBrandNameAndShopId(Long categoryId, String brandName, Long shopId, Integer sysType) { + List brandByShopIdAndBrandName = brandMapper.listSigningByShopIdAndBrandNameAndCategoryId(shopId, brandName, categoryId, sysType); + ProductLangUtil.brandList(brandByShopIdAndBrandName); + return brandByShopIdAndBrandName; + } + + @Override + public EsBrandBO getEsBrandBO(EsProductBO esProductBO) { + Long brandId = esProductBO.getBrandId(); + if (Objects.isNull(brandId)) { + return null; + } + BrandVO brand = brandMapper.getByBrandId(brandId); + if (Objects.isNull(brand)) { + return null; + } + if (esProductBO.getAppDisplay() && !Objects.equals(brand.getStatus(), StatusEnum.ENABLE.value())) { + esProductBO.setAppDisplay(Boolean.FALSE); + } + EsBrandBO esBrandBO = new EsBrandBO(); + esBrandBO.setBrandId(brand.getBrandId()); + esBrandBO.setBrandImg(brand.getImgUrl()); + Map brandMap = brand.getBrandLangList().stream() + .filter(brandLangVO -> StrUtil.isNotBlank(brandLangVO.getName())) + .collect(Collectors.toMap(BrandLangVO::getLang, BrandLangVO::getName)); + esBrandBO.setBrandNameZh(brandMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + esBrandBO.setBrandNameEn(brandMap.get(LanguageEnum.LANGUAGE_EN.getLang())); + return esBrandBO; + } + + @Override + public List listBrandIdBySpuIds(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return new ArrayList<>(0); + } + return brandMapper.listBrandIdBySpuIds(spuIds); + } + + @Override + public List listByParams(BrandDTO brandDTO) { + List brandList = brandMapper.listByParams(brandDTO); + ProductLangUtil.brandList(brandList); + // 获取品牌分类信息 + categoryBrandService.loadCategoryToBrandVO(brandList); + return brandList; + } + + @Override + public List listApplySigningBrand(BrandDTO brandDTO, Long shopId, Integer sysType) { + List brandList = brandMapper.listByParams(brandDTO); + Map brandMap = brandList.stream().collect(Collectors.toMap(BrandVO::getBrandId, brandVO -> brandVO)); + BrandSigningVO brandSigningVO = brandShopService.listSigningByShopId(shopId, sysType); + + brandSigningVO.getPlatformBrandList().forEach(brandShopVO -> brandMap.remove(brandShopVO.getBrandId())); + brandSigningVO.getCustomizeBrandList().forEach(brandShopVO -> brandMap.remove(brandShopVO.getBrandId())); + List applySigningBrandList = new ArrayList<>(brandMap.values()); + ProductLangUtil.brandList(applySigningBrandList); + // 获取品牌分类信息 + categoryBrandService.loadCategoryToBrandVO(applySigningBrandList); + return applySigningBrandList; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryLangServiceImpl.java new file mode 100644 index 0000000..7ade3fc --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryLangServiceImpl.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.CategoryLangVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.tmerclub.cloud.product.dto.CategoryLangDTO; +import com.tmerclub.cloud.product.mapper.CategoryLangMapper; +import com.tmerclub.cloud.product.model.CategoryLang; +import com.tmerclub.cloud.product.service.CategoryLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 分类-国际化表 + * + * @author YXF + * @date 2021-04-22 17:48:16 + */ +@Service +public class CategoryLangServiceImpl implements CategoryLangService { + + @Autowired + private CategoryLangMapper categoryLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> categoryLangMapper.list()); + } + + @Override + public CategoryLang getByCategoryId(Long categoryId) { + return categoryLangMapper.getByCategoryId(categoryId); + } + + @Override + public void save(List categoryLangList, Long categoryId) { + if (CollUtil.isEmpty(categoryLangList)) { + return; + } + boolean hasDefaultLang = false; + Iterator iterator = categoryLangList.iterator(); + while (iterator.hasNext()) { + CategoryLangDTO categoryLangDTO = iterator.next(); + if (StrUtil.isBlank(categoryLangDTO.getName())) { + iterator.remove(); + continue; + } + if (Objects.equals(categoryLangDTO.getLang(), Constant.DEFAULT_LANG)) { + hasDefaultLang = true; + } + categoryLangDTO.setCategoryId(categoryId); + } + if (CollUtil.isEmpty(categoryLangList) || !hasDefaultLang) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + categoryLangMapper.batchSave(BeanUtil.mapAsList(categoryLangList, CategoryLang.class)); + } + + @Override + public void update(List categoryLangList, CategoryVO categoryDb) { + List langIds = categoryDb.getCategoryLangList().stream().map(CategoryLangVO::getLang).collect(Collectors.toList()); + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + boolean hasDefaultLang = false; + for (CategoryLangDTO categoryLang : categoryLangList) { + categoryLang.setCategoryId(categoryDb.getCategoryId()); + // 更新-已有语言信息,且分类名不为空 + if (langIds.contains(categoryLang.getLang()) && StrUtil.isNotBlank(categoryLang.getName())) { + updateList.add(BeanUtil.map(categoryLang, CategoryLang.class)); + langIds.remove(categoryLang.getLang()); + if (Objects.equals(categoryLang.getLang(), Constant.DEFAULT_LANG)) { + hasDefaultLang = true; + } + continue; + } + // 删除-已有语言信息,但分类名为空 + else if (langIds.contains(categoryLang.getLang())) { + continue; + } + // 新增-不存在且分类名不为空的语言信息 + if (StrUtil.isNotBlank(categoryLang.getName())) { + saveList.add(BeanUtil.map(categoryLang, CategoryLang.class)); + } + } + // 没有默认语言-数据异常 + if (!hasDefaultLang) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + if (CollUtil.isNotEmpty(saveList)) { + categoryLangMapper.batchSave(saveList); + } + if (CollUtil.isNotEmpty(updateList)) { + categoryLangMapper.batchUpdate(updateList); + } + if (CollUtil.isNotEmpty(langIds)) { + categoryLangMapper.batchDelete(langIds, categoryDb.getCategoryId()); + } + } + + @Override + public void deleteById(Long categoryId) { + categoryLangMapper.deleteById(categoryId); + } + + @Override + public void batchSave(List list) { + categoryLangMapper.batchSave(list); + } + + @Override + public void existCategoryName(CategoryDTO categoryDTO) { + List names = categoryLangMapper.existCategoryName(categoryDTO); + if (CollUtil.isNotEmpty(names)) { + throw new LuckException("分类名" + names + "已存在,请重新输入"); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..df39f0e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryServiceImpl.java @@ -0,0 +1,734 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.bo.PlatformCommissionOrderItemBO; +import com.tmerclub.cloud.api.product.constant.CategoryLevel; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.api.user.feign.PopupFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.JumpType; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.vo.CategoryLangVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.product.vo.ParentCategoryVO; +import com.tmerclub.cloud.common.product.vo.app.CategoryAppVO; +import com.tmerclub.cloud.common.product.vo.app.CategorySearchAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.dto.CategoryDTO; +import com.tmerclub.cloud.product.mapper.CategoryMapper; +import com.tmerclub.cloud.product.model.Category; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.vo.CategoryExcelVO; +import com.tmerclub.cloud.product.vo.CategoryPlatformExcelVO; +import com.tmerclub.cloud.product.vo.CategoryUseNumVO; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 分类信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class CategoryServiceImpl implements CategoryService { + + @Autowired + private CategoryMapper categoryMapper; + @Autowired + private CategoryLangService categoryLangService; + @Autowired + private SpuTagReferenceService spuTagReferenceService; + @Autowired + private SpuOfflineService spuOfflineService; + @Autowired + private CategoryShopService categoryShopService; + @DubboReference + private PopupFeignClient popupFeignClient; + + private static final String PRIMARY_CATEGORY = "一级分类"; + private static final String SECONDARY_CATEGORY = "二级分类"; + private static final String TERTIARY_CATEGORY = "三级分类"; + + @Override + public CategoryVO getInfo(Long categoryId) { + CategoryVO category = categoryMapper.getById(categoryId); + if (Objects.isNull(category)) { + return null; + } + List paths = new ArrayList<>(Constant.INITIAL_CAPACITY); + paths.add(category); + getPathNames(paths); + if (CollUtil.isEmpty(category.getCategories())) { + category.setCategories(new ArrayList<>(0)); + } + return category; + } + + + @Override + @Cacheable(cacheNames = CacheNames.CATEGORY_INFO, key = "#categoryId") + public CategoryVO getById(Long categoryId) { + CategoryVO category = categoryMapper.getById(categoryId); + if (Objects.isNull(category)) { + throw new LuckException("分类不存在"); + } + // 如果是三级分类,添加一级分类id + if (Objects.equals(category.getLevel(), CategoryLevel.THIRD.value())) { + CategoryVO categoryVO = categoryMapper.getById(category.getParentId()); + category.setPrimaryCategoryId(categoryVO.getParentId()); + } + return category; + } + + @Override + @Cacheable(cacheNames = CacheNames.CATEGORY_INFO, key = "#categoryId") + public CategoryVO getByCategoryId(Long categoryId) { + CategoryVO category = categoryMapper.getById(categoryId); + if (Objects.isNull(category)) { + return null; + } + // 如果是三级分类,添加一级分类id + if (Objects.equals(category.getLevel(), CategoryLevel.THIRD.value())) { + CategoryVO categoryVO = categoryMapper.getById(category.getParentId()); + category.setPrimaryCategoryId(categoryVO.getParentId()); + } + return category; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public Long save(CategoryDTO categoryDTO) { + categoryDTO.setCategoryId(null); + Category category = BeanUtil.map(categoryDTO, Category.class); + categoryLangService.existCategoryName(categoryDTO); + String path = ""; + if (!Objects.equals(CategoryLevel.First.value(), category.getLevel())) { + String parentId = String.valueOf(category.getParentId()); + CategoryVO categoryDb = categoryMapper.getById(category.getParentId()); + category.setStatus(categoryDb.getStatus()); + if (StrUtil.isBlank(categoryDb.getPath())) { + path = parentId; + } else { + path = categoryDb.getPath() + Constant.CATEGORY_INTERVAL + parentId; + } + } + category.setPath(path); + categoryMapper.save(category); + categoryLangService.save(categoryDTO.getCategoryLangList(), category.getCategoryId()); + return category.getCategoryId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(CategoryDTO categoryDTO) { + Integer sysType = AuthUserContext.get().getSysType(); + Category category = BeanUtil.map(categoryDTO, Category.class); + CategoryVO categoryDb = categoryMapper.getById(category.getCategoryId()); + if (Objects.equals(categoryDb.getCategoryId(), category.getParentId())) { + throw new LuckException("分类不能成为本身的上级分类"); + } + categoryLangService.existCategoryName(categoryDTO); + categoryMapper.update(category); + categoryLangService.update(categoryDTO.getCategoryLangList(), categoryDb); + if (Objects.equals(categoryDb.getShopId(), Constant.PLATFORM_SHOP_ID)) { + if (Objects.equals(categoryDTO.getLevel(), CategoryLevel.SECOND.value())) { + List categoryIds = categoryMapper.listCategoryIdByShopIdAndParentId(Constant.PLATFORM_SHOP_ID, category.getCategoryId()); + categoryShopService.removeCacheByChangeCategoryIds(categoryIds, sysType); + } else if (Objects.equals(categoryDTO.getLevel(), CategoryLevel.THIRD.value())) { + // 如果更新的分类为三级分类,需要更新店铺签约分类缓存 + categoryShopService.removeCacheByChangeCategoryId(categoryDTO.getCategoryId()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void deleteById(Long categoryId, Long shopId) { + CategoryVO categoryVO = getById(categoryId); + if (Objects.isNull(categoryVO)) { + throw new LuckException("当前分类不存在,请刷新后重试"); + } + List numList = categoryMapper.getCategoryUseNum(categoryId, shopId); + verifyCategoryUseNum(numList); + categoryMapper.deleteById(categoryId); + if (Objects.equals(categoryVO.getLevel(), CategoryLevel.THIRD.value())) { + // 如果删除的分类是三级分类需要删除店铺分类关联关系表中该分类的数据 + categoryShopService.deleteByCategoryId(categoryId); + } + if (categoryVO.getLevel() > CategoryLevel.First.value()) { + // 失效弹窗 + ServerResponseEntity response = popupFeignClient.deleteLink(null, categoryVO.getShopId(), JumpType.CATEGORY.value(), Collections.singletonList(categoryId)); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + } + + /** + * 检查分类的使用数量 + * + * @param numList + */ + private void verifyCategoryUseNum(List numList) { + StringBuilder stringBuilder = new StringBuilder("还有"); + int count = 0; + for (CategoryUseNumVO categoryUseNumVO : numList) { + if (categoryUseNumVO.getNum() > 0) { + switch (categoryUseNumVO.getType()) { + case 1: + stringBuilder.append(categoryUseNumVO.getNum()).append("个分类,"); + break; + case 2: + stringBuilder.append(categoryUseNumVO.getNum()).append("个属性,"); + break; + case 3: + stringBuilder.append(categoryUseNumVO.getNum()).append("个品牌,"); + break; + case 4: + stringBuilder.append(categoryUseNumVO.getNum()).append("件商品,"); + break; + default: + } + } + count = count + categoryUseNumVO.getNum(); + } + if (count > 0) { + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + stringBuilder.append("在使用该分类,不能进行删除操作"); + throw new LuckException(stringBuilder.toString()); + } + } + + @Override + public List list(Long shopId) { + List list = categoryMapper.list(shopId, null); + ProductLangUtil.categoryList(list); + return BeanUtil.mapAsList(list, CategoryAppVO.class); + } + + @Override + public void removeCategoryCache(Long shopId, Long categoryId, Integer sysType) { + List key = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(categoryId)) { + key.add(CacheNames.CATEGORY_INFO + CacheNames.UNION + categoryId); + } + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + key.add(CacheNames.CATEGORY_RATE + CacheNames.UNION + "0"); + } + key.add(CacheNames.CATEGORY_LIST_OF_SHOP + CacheNames.UNION + shopId + Constant.COLON + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + key.add(CacheNames.CATEGORY_LIST_OF_SHOP + CacheNames.UNION + shopId + Constant.COLON + LanguageEnum.LANGUAGE_EN.getLang()); + if (CollUtil.isNotEmpty(key)) { + RedisUtil.deleteBatch(key); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public List categoryEnableOrDisable(CategoryDTO categoryDTO, Integer sysType) { + CategoryVO categoryDb = getById(categoryDTO.getCategoryId()); + if (!Objects.equals(categoryDb.getShopId(), Constant.PLATFORM_SHOP_ID) && + !Objects.equals(categoryDb.getShopId(), AuthUserContext.get().getTenantId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + // 如果是重复提交,则直接返回 + if (Objects.equals(categoryDb.getStatus(), categoryDTO.getStatus())) { + return Collections.singletonList(categoryDTO.getCategoryId()); + } + // 如果该分类不是一级分类,并且是上架操作,需要校验该分类的上级分类是否为上架状态 + if (!Objects.equals(categoryDb.getLevel(), CategoryLevel.First.value()) && Objects.equals(categoryDTO.getStatus(), StatusEnum.ENABLE.value())) { + CategoryVO parentCategoryVO = getById(categoryDb.getParentId()); + if (!Objects.equals(parentCategoryVO.getStatus(), StatusEnum.ENABLE.value())) { + throw new LuckException("上架该分类前,需要把该分类的上级分类上架"); + } + } + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List thirdIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List platformThirdIdList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (!categoryDb.getLevel().equals(CategoryLevel.THIRD.value())) { + // 如果是店铺的二级还需要将分类id放进去 + if (!Objects.equals(categoryDb.getShopId(), Constant.PLATFORM_SHOP_ID)) { + thirdIdList.add(categoryDb.getCategoryId()); + } + if (Objects.equals(categoryDTO.getStatus(), StatusEnum.DISABLE.value()) || Objects.equals(categoryDTO.getStatus(), StatusEnum.OFFLINE.value())) { + List categoryList = categoryMapper.getChildCategory(categoryDb.getCategoryId()); + categoryList.forEach(category -> { + updateList.add(category.getCategoryId()); + if (Objects.equals(categoryDb.getShopId(), Constant.PLATFORM_SHOP_ID) && Objects.equals(category.getLevel(), CategoryLevel.THIRD.value())) { + thirdIdList.add(category.getCategoryId()); + platformThirdIdList.add(category.getCategoryId()); + } else if (!Objects.equals(categoryDb.getShopId(), Constant.PLATFORM_SHOP_ID) && Objects.equals(category.getLevel(), CategoryLevel.SECOND.value())) { + thirdIdList.add(category.getCategoryId()); + } + }); + } + } else { + updateList.add(categoryDb.getCategoryId()); + thirdIdList.add(categoryDb.getCategoryId()); + platformThirdIdList.add(categoryDb.getCategoryId()); + } + // 更新该分类的下级分类状态 + updateList.add(categoryDb.getCategoryId()); + categoryMapper.updateBatchOfStatus(updateList, categoryDTO.getStatus()); + + // 更新店铺签约分类缓存 + categoryShopService.removeCacheByChangeCategoryIds(platformThirdIdList, sysType); + + // 分类下架后, 下架分类中的商品 + if (Objects.equals(categoryDTO.getStatus(), StatusEnum.DISABLE.value()) || Objects.equals(categoryDTO.getStatus(), StatusEnum.OFFLINE.value())) { + if (CollUtil.isEmpty(thirdIdList)) { + return updateList; + } + // 查询出秒杀or团购的商品进行下线 + // 下线掉关联商品的活动 + spuOfflineService.offlineSpuStatusAndActivity(2, null, categoryDb.getShopId(), thirdIdList, null, null); + spuTagReferenceService.deleteSpuTagByShopIdAndCategoryIds(categoryDb.getShopId(), thirdIdList); + // 失效弹窗 + ServerResponseEntity response = popupFeignClient.deleteLink(null, categoryDb.getShopId(), JumpType.CATEGORY.value(), thirdIdList); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + } + return updateList; + } + + @Override + public void getPathNames(List categories) { + if (CollUtil.isEmpty(categories)) { + return; + } + // 获取分类的所有上级分类id集合 + Set paths = new HashSet<>(Constant.INITIAL_CAPACITY); + for (CategoryVO category : categories) { + if (Objects.isNull(category) || StrUtil.isBlank(category.getPath())) { + continue; + } + String[] parentIds = category.getPath().split(Constant.CATEGORY_INTERVAL); + for (String parentId : parentIds) { + paths.add(Long.valueOf(parentId)); + } + } + if (CollUtil.isEmpty(paths)) { + return; + } + + // 获取所有上级分类id列表 + List categoryList = categoryMapper.getListByCategoryIds(paths); + ProductLangUtil.categoryList(categoryList); + List parentCategoryList = BeanUtil.mapAsList(categoryList, ParentCategoryVO.class); + Map categoryMap = parentCategoryList.stream().collect(Collectors.toMap(ParentCategoryVO::getCategoryId, c -> c)); + // 获取每个分类的上级分类名称集合 + for (CategoryVO category : categories) { + if (StrUtil.isBlank(category.getPath())) { + continue; + } + String[] parentIdArray = category.getPath().split(Constant.CATEGORY_INTERVAL); + category.setCategories(new ArrayList<>(0)); + for (String s : parentIdArray) { + ParentCategoryVO categoryVO = categoryMap.get(Long.valueOf(s)); + category.getCategories().add(categoryVO); + } + } + } + + @Override + public List listByShopIdAndParenId(Long shopId, Long parentId, Integer lang) { + CategoryServiceImpl categoryService = (CategoryServiceImpl) AopContext.currentProxy(); + List allList = categoryService.shopCategoryList(shopId, lang); + List categoryList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (CategoryAppVO categoryVO : allList) { + // 一级分类 + if (Objects.equals(parentId, Constant.DEFAULT_ID)) { + categoryVO.setCategories(null); + categoryList.add(categoryVO); + continue; + } + // 二级分类 + if (Objects.equals(parentId, categoryVO.getCategoryId())) { + for (CategoryAppVO category : categoryVO.getCategories()) { + category.setCategories(null); + categoryList.add(category); + } + return categoryList; + } + // 三级分类 + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + for (CategoryAppVO category : categoryVO.getCategories()) { + if (Objects.equals(parentId, category.getCategoryId())) { + categoryList.addAll(category.getCategories()); + return categoryList; + } + } + } + } + return categoryList; + } + + @Override + @Cacheable(cacheNames = CacheNames.CATEGORY_LIST_OF_SHOP, key = "#shopId + ':' + #lang") + public List shopCategoryList(Long shopId, Integer lang) { + List list = categoryMapper.listByShopIdAndParenId(shopId, null); + ProductLangUtil.categoryList(list); + + Map> categoryMap = BeanUtil.mapAsList(list, CategoryAppVO.class).stream().collect(Collectors.groupingBy(CategoryAppVO::getLevel)); + + List secondCategories = categoryMap.get(CategoryLevel.SECOND.value()); + if (Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + // 三级分类 + List thirdCategories = categoryMap.get(CategoryLevel.THIRD.value()); + //二级分类 + setChildCategory(secondCategories, thirdCategories); + } + //一级分类 + List firstCategories = categoryMap.get(CategoryLevel.First.value()); + setChildCategory(firstCategories, secondCategories); + if (Objects.isNull(firstCategories)) { + firstCategories = new ArrayList<>(0); + } + firstCategories.sort(Comparator.comparing(CategoryAppVO::getSeq).reversed().thenComparing(CategoryAppVO::getCategoryId)); + return firstCategories; + } + + @Override + @Cacheable(cacheNames = CacheNames.LIST_SIGNING_CATEGORY, key = "#shopId + ':' + #sysType + ':' + #lang") + public List listSigningCategory(Long shopId, Integer sysType, Integer lang) { + List threeCategoryList = categoryMapper.listSigningCategoryByShopIdAndStatus(shopId, sysType, null); + if (Objects.isNull(threeCategoryList) || threeCategoryList.size() == 0) { + // 签约分类为空时 + return new ArrayList<>(0); + } + ProductLangUtil.categoryList(threeCategoryList); + List twoCategoryList = categoryMapper.getListByCategoryIds(threeCategoryList.stream().map(CategoryVO::getParentId).collect(Collectors.toSet())); + ProductLangUtil.categoryList(twoCategoryList); + List oneCategoryList = categoryMapper.getListByCategoryIds(twoCategoryList.stream().map(CategoryVO::getParentId).collect(Collectors.toSet())); + ProductLangUtil.categoryList(oneCategoryList); + threeCategoryList.addAll(twoCategoryList); + threeCategoryList.addAll(oneCategoryList); + return BeanUtil.mapAsList(threeCategoryList, CategoryAppVO.class); + } + + @Override + public List listByCategoryIds(Set categoryIds) { + if (CollUtil.isEmpty(categoryIds)) { + return new ArrayList<>(0); + } + return categoryMapper.listByCategoryIds(categoryIds); + } + + @Override + public List listAndLangInfoByShopId(Long shopId) { + return categoryMapper.list(shopId, CategoryLevel.SECOND.value()); + } + + @Override + public List getShopSigningCategoryAndLangInfo(Long shopId) { + return categoryMapper.listSigningCategoryByShopIdAndStatus(shopId, null, null); + } + + @Override + public List platformCategories() { + List list = list(Constant.PLATFORM_SHOP_ID); + // 排序规则:分类等级正序-> 分类序号倒序-> 分类id正序 + list.sort(Comparator.comparingInt(CategoryAppVO::getLevel) + .thenComparingInt(CategoryAppVO::getSeq).reversed() + .thenComparingLong(CategoryAppVO::getCategoryId) + ); + return list; + } + + @Override + public List getParentIdsByCategoryId(List categoryIds) { + if (CollUtil.isEmpty(categoryIds)) { + return null; + } + return categoryMapper.getParentIdsByCategoryId(categoryIds); + } + + @Override + public List listBySkuIds(List platformCommissionOrderItems) { + return categoryMapper.listBySkuIds(platformCommissionOrderItems); + } + + @Override + @Cacheable(cacheNames = CacheNames.CATEGORY_RATE, key = "'0'") + public List listRate() { + return categoryMapper.listRate(); + } + + private void setChildCategory(List categories, List childCategories) { + if (CollUtil.isEmpty(categories)) { + return; + } + if (CollUtil.isEmpty(childCategories)) { + categories.clear(); + return; + } + Map> secondCategoryMap = childCategories.stream().collect(Collectors.groupingBy(CategoryAppVO::getParentId)); + Iterator iterator = categories.iterator(); + while (iterator.hasNext()) { + CategoryAppVO categoryVO = iterator.next(); + List categoryList = secondCategoryMap.get(categoryVO.getCategoryId()); + if (CollUtil.isEmpty(categoryList)) { + iterator.remove(); + continue; + } + categoryList.forEach(item -> item.setParentName(categoryVO.getName())); + categoryList.sort(Comparator.comparingInt(CategoryAppVO::getSeq).reversed().thenComparing(CategoryAppVO::getCategoryId)); + categoryVO.setCategories(categoryList); + } + } + + /** + * 处理分类名称 + * + * @param categoryLangList 分类国际化信息 + * @param lang 语言 + * @return 分类名称 + */ + private String handleCategoryName(List categoryLangList, Integer lang) { + if (CollUtil.isEmpty(categoryLangList)) { + return null; + } + String categoryName = null; + for (CategoryLangVO categoryLangVO : categoryLangList) { + if (Objects.equals(categoryLangVO.getLang(), lang)) { + categoryName = categoryLangVO.getName(); + break; + } + } + return categoryName; + } + + @Override + public List listPlatformCategoryByShopIdAndParenId(Long shopId, Long parentId, Integer lang) { + CategoryServiceImpl categoryService = (CategoryServiceImpl) AopContext.currentProxy(); + List allList = categoryService.shopCategoryList(shopId, lang); + List categoryList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (CategoryAppVO categoryVO : allList) { + boolean flag = false; + // 只返回 包含并且处于启用状态的三级分类 的一级分类 + outerLoop: + for (CategoryAppVO secondCategory : categoryVO.getCategories()) { + for (CategoryAppVO thirdCategory : secondCategory.getCategories()) { + if (Objects.equals(thirdCategory.getStatus(), 1)) { + flag = true; + break outerLoop; + } + } + } + categoryVO.setCategories(null); + if (flag) { + categoryList.add(categoryVO); + } + } + return categoryList; + } + + @Override + public List listEnable(Long shopId) { + return categoryMapper.listEnable(shopId, CategoryLevel.SECOND.value()); + } + + @Override + public CategorySearchAppVO categorySearchItem(Long categoryId) { + CategorySearchAppVO categorySearch = new CategorySearchAppVO(); + CategoryServiceImpl categoryService = (CategoryServiceImpl) AopContext.currentProxy(); + CategoryVO category = categoryService.getById(categoryId); + if (Objects.isNull(category)) { + return categorySearch; + } + Integer lang = I18nMessage.getLang(); + categorySearch.setCategoryVO(new ArrayList<>(0)); + List allList = categoryService.shopCategoryList(category.getShopId(), lang); + for (CategoryAppVO categoryVO : allList) { + boolean notThisFirst = Objects.equals(category.getLevel(), CategoryLevel.First.value()) && !Objects.equals(category.getCategoryId(), categoryVO.getCategoryId()); + boolean notThisSecond = Objects.equals(category.getLevel(), CategoryLevel.SECOND.value()) && !Objects.equals(category.getParentId(), categoryVO.getCategoryId()); + // 不包含该一、二级分类 + if (notThisFirst || notThisSecond || CollUtil.isEmpty(categoryVO.getCategories())) { + continue; + } + + List secondaryCategories = categoryVO.getCategories(); + + List secondaryCategoryIds = secondaryCategories.stream().map(CategoryAppVO::getCategoryId).collect(Collectors.toList()); + + // 不包含该三级分类 + if (Objects.equals(category.getLevel(), CategoryLevel.THIRD.value()) && !secondaryCategoryIds.contains(category.getParentId())) { + continue; + } + + // 查询一、二级分类 + categorySearch.setPrimaryCategory(categoryVO); + categorySearch.setSecondaryCategory(categoryVO.getCategories()); + + if (Objects.equals(category.getLevel(), CategoryLevel.First.value())) { + return categorySearch; + } + + Map secondaryCategoryMap = categoryVO.getCategories().stream().collect(Collectors.toMap(CategoryAppVO::getCategoryId, c -> c)); + CategoryAppVO secondaryCategory; + // 查询二级分类 + if (Objects.equals(category.getLevel(), CategoryLevel.SECOND.value())) { + secondaryCategory = secondaryCategoryMap.get(category.getCategoryId()); + } + // 查询三级分类 + else { + secondaryCategory = secondaryCategoryMap.get(category.getParentId()); + } + if (Objects.isNull(secondaryCategory)) { + return categorySearch; + } + categorySearch.setCategoryVO(secondaryCategory.getCategories()); + break; + } + return categorySearch; + } + + @Override + public List listApplySigningCategory(Long shopId, Integer sysType) { + List thirdLevelplatformCategoryIdList = categoryMapper.listEnable(Constant.PLATFORM_SHOP_ID, CategoryLevel.THIRD.value()); + List shopSigningCategoryIdList = categoryShopService.getCategoryIdsByShopId(shopId, sysType); + Set applyCategoryIdSet = new HashSet<>(shopSigningCategoryIdList); + // 过滤已经签约的分类 + List resultCategoryList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (CategoryVO categoryVO : thirdLevelplatformCategoryIdList) { + if (!applyCategoryIdSet.contains(categoryVO.getCategoryId())) { + resultCategoryList.add(categoryVO); + } + } + if (resultCategoryList.size() == 0) { + return resultCategoryList; + } + ProductLangUtil.categoryList(resultCategoryList); + // 二级分类 + List secondLevelCategoryList = categoryMapper.getListByCategoryIds(resultCategoryList.stream().map(CategoryVO::getParentId).collect(Collectors.toSet())); + ProductLangUtil.categoryList(secondLevelCategoryList); + resultCategoryList.addAll(secondLevelCategoryList); + // 一级分类 + List firstLevelCategoryList = categoryMapper.getListByCategoryIds(secondLevelCategoryList.stream().map(CategoryVO::getParentId).collect(Collectors.toSet())); + ProductLangUtil.categoryList(firstLevelCategoryList); + resultCategoryList.addAll(firstLevelCategoryList); + + return resultCategoryList; + } + + @Override + public List listExcelPlatform() { + List categoryAndLangList = categoryMapper.listPlatformCategoryAndLangList(); + if (CollUtil.isEmpty(categoryAndLangList)) { + return new ArrayList<>(0); + } + for (CategoryPlatformExcelVO categoryPlatformExcelVO : categoryAndLangList) { + Map map = categoryPlatformExcelVO.getCategoryLangList().stream().collect(Collectors.toMap(CategoryLangVO::getLang, CategoryLangVO::getName)); + categoryPlatformExcelVO.setNameZh(map.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + } + Map> categoryMap = categoryAndLangList.stream().filter(category -> Objects.nonNull(category.getParentId())).collect(Collectors.groupingBy(CategoryPlatformExcelVO::getParentId)); + if (CollUtil.isEmpty(categoryMap.get(0L))) { + return new ArrayList<>(0); + } + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + getCategoryToExcel(categoryMap.get(0L), "", categoryMap, result); + return result; + } + + @Override + public List listExcel(Long shopId) { + List categoryAndLangList = categoryMapper.listShopCategoryAndLangList(shopId); + if (CollUtil.isEmpty(categoryAndLangList)) { + return new ArrayList<>(0); + } + for (CategoryExcelVO categoryExcelVO : categoryAndLangList) { + Map map = categoryExcelVO.getCategoryLangList().stream().collect(Collectors.toMap(CategoryLangVO::getLang, CategoryLangVO::getName)); + categoryExcelVO.setNameZh(map.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + } + Map> categoryMap = categoryAndLangList.stream().filter(category -> Objects.nonNull(category.getParentId())).collect(Collectors.groupingBy(CategoryExcelVO::getParentId)); + if (CollUtil.isEmpty(categoryMap.get(0L))) { + return new ArrayList<>(0); + } + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + getShopCategoryToExcel(categoryMap.get(0L), "", categoryMap, result); + return result; + } + + private void getShopCategoryToExcel(List categories, String parentCategoryNames, Map> categoryMap, List result) { + if (CollUtil.isEmpty(categories)) { + return; + } + for (CategoryExcelVO category : categories) { + CategoryExcelVO shopExcelVO = new CategoryExcelVO(); + shopExcelVO.setNameZh(category.getNameZh()); + String categoryGrade = PRIMARY_CATEGORY; + if (Objects.equals(category.getLevel(), CategoryLevel.SECOND.value())) { + categoryGrade = SECONDARY_CATEGORY; + } + shopExcelVO.setGrade(categoryGrade); + shopExcelVO.setParentName(parentCategoryNames); + shopExcelVO.setCategoryStatus(Objects.equals(category.getStatus(), 1) ? "启用" : "禁用"); + shopExcelVO.setSeq(category.getSeq()); + result.add(shopExcelVO); + if (categoryMap.containsKey(category.getCategoryId())) { + // 写入该分类的下级分类 + String parentNames = parentCategoryNames.length() == 0 ? category.getNameZh() : parentCategoryNames + "/" + category.getNameZh(); + getShopCategoryToExcel(categoryMap.get(category.getCategoryId()), parentNames, categoryMap, result); + } + } + } + + private void getCategoryToExcel(List categories, String parentCategoryNames, Map> categoryMap, List result) { + if (CollUtil.isEmpty(categories)) { + return; + } + for (CategoryPlatformExcelVO category : categories) { + CategoryPlatformExcelVO platformExcelVO = new CategoryPlatformExcelVO(); + platformExcelVO.setNameZh(category.getNameZh()); + platformExcelVO.setPlatformRate(Objects.equals(category.getLevel(), CategoryLevel.THIRD.value()) ? category.getPlatformRate() : null); + String categoryGrade = PRIMARY_CATEGORY; + if (Objects.equals(category.getLevel(), CategoryLevel.SECOND.value())) { + categoryGrade = SECONDARY_CATEGORY; + } else if (Objects.equals(category.getLevel(), CategoryLevel.THIRD.value())) { + categoryGrade = TERTIARY_CATEGORY; + } + platformExcelVO.setGrade(categoryGrade); + platformExcelVO.setParentName(parentCategoryNames); + platformExcelVO.setCategoryStatus(Objects.equals(category.getStatus(), 1) ? "启用" : "禁用"); + platformExcelVO.setSeq(category.getSeq()); + result.add(platformExcelVO); + if (categoryMap.containsKey(category.getCategoryId())) { + // 写入该分类的下级分类 + String parentNames = parentCategoryNames.length() == 0 ? category.getNameZh() : parentCategoryNames + "/" + category.getNameZh(); + getCategoryToExcel(categoryMap.get(category.getCategoryId()), parentNames, categoryMap, result); + } + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryShopServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryShopServiceImpl.java new file mode 100644 index 0000000..2e4adb4 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/CategoryShopServiceImpl.java @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.dto.CategoryShopDTO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.mapper.CategoryShopMapper; +import com.tmerclub.cloud.product.model.CategoryShop; +import com.tmerclub.cloud.product.service.CategoryShopService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.vo.CategoryShopVO; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lth + * @date 2021/4/25 14:34 + */ +@Service +public class CategoryShopServiceImpl implements CategoryShopService { + + @Autowired + private CategoryShopMapper categoryShopMapper; + + @Autowired + private SpuService spuService; + + + @Override + public CategoryShop getById(Long categoryShopId) { + return categoryShopMapper.getByCategoryShopId(categoryShopId); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void signingCategory(List categoryShopDTOList, Long shopId, Integer sysType) { + if (categoryShopDTOList.size() > Constant.SIGNING_CATEGORY_LIMIT_NUM) { + throw new LuckException("签约的分类信息不能超过" + Constant.SIGNING_CATEGORY_LIMIT_NUM); + } + // 处理分类扣率问题 + this.dealWithRate(categoryShopDTOList, shopId, sysType); + // 删除已签约的平台分类信息 + categoryShopMapper.deleteByShopId(shopId, sysType); + // 重新插入 + if (CollUtil.isNotEmpty(categoryShopDTOList)) { + categoryShopMapper.saveBatch(categoryShopDTOList, shopId, sysType); + } + // 更新缓存 + this.removeCacheByShopIds(Collections.singletonList(shopId), sysType); + } + + + @Override + @Cacheable(cacheNames = CacheNames.SIGNING_CATEGORY_BY_SHOP_KEY, key = "#shopId + ':' + #sysType + ':' + #lang") + public List listByShopId(Long shopId, Integer sysType, Integer lang) { + return categoryShopMapper.listByShopId(shopId, lang, sysType); + } + + @Override + @Cacheable(cacheNames = CacheNames.CATEGORY_RATE, key = "#shopId + ':' + #sysType") + public List listRateByShopId(Long shopId, Integer sysType) { + List categoryRateList = categoryShopMapper.listRateByShopId(shopId, sysType); + if (Objects.isNull(categoryRateList)) { + categoryRateList = new ArrayList<>(0); + } + return categoryRateList; + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByCategoryId(Long categoryId) { + List shopIdList = categoryShopMapper.listShopIdByCategoryId(categoryId); + categoryShopMapper.deleteByCategoryId(categoryId); + // 清除缓存 + removeCacheByShopIds(shopIdList, AuthUserContext.get().getSysType()); + } + + @Override + public void removeCacheByChangeCategoryId(Long categoryId) { + if (Objects.isNull(categoryId)) { + return; + } + List shopIdList = categoryShopMapper.listShopIdByCategoryId(categoryId); + this.removeCacheByShopIds(shopIdList, AuthUserContext.get().getSysType()); + } + + @Override + public void removeCacheByChangeCategoryIds(List categoryIds, Integer sysType) { + if (CollUtil.isEmpty(categoryIds)) { + return; + } + List shopIdList = categoryShopMapper.listShopIdByCategoryIds(categoryIds); + this.removeCacheByShopIds(shopIdList, sysType); + } + + @Override + public CategoryShopVO getByShopIdAndCategoryId(Long shopId, Long categoryId, Integer sysType) { + return categoryShopMapper.getByShopIdAndCategoryId(shopId, categoryId, sysType); + } + + @Override + public List getSupplierIdsByShopId(Long shopId) { + return categoryShopMapper.getSupplierIdsByShopId(shopId); + } + + @Override + public int countByShopIdAndCategoryId(Long shopId, Long categoryId, Integer sysType) { + return categoryShopMapper.countByShopIdAndCategoryId(shopId, categoryId, sysType); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSigningCategory(CategoryShop categoryShop) { + if (Objects.isNull(categoryShop)) { + return; + } + Long categoryId = categoryShop.getCategoryId(); + int spuCount = spuService.countByCategoryAndShopId(categoryId, categoryShop.getShopId(), categoryShop.getSysType()); + if (spuCount > 0) { + throw new LuckException("该分类下还有商品正在出售,请先删除此分类下的商品"); + } + spuService.batchChangeSpuStatusByCidListAndShopId(Collections.singletonList(categoryId), SpuStatus.OFF_SHELF.value(), categoryShop.getShopId(), categoryShop.getSysType()); + categoryShopMapper.deleteById(categoryShop.getCategoryShopId()); + this.removeCacheByShopIds(Collections.singletonList(categoryShop.getShopId()), categoryShop.getSysType()); + } + + @Override + public List getCategoryIdsByShopId(Long shopId, Integer sysType) { + return categoryShopMapper.getCategoryIdsByShopId(shopId, sysType); + } + + /** + * 根据店铺id列表清除缓存 + * + * @param shopIdList + */ + private void removeCacheByShopIds(List shopIdList, Integer sysType) { + if (CollUtil.isEmpty(shopIdList)) { + return; + } + List keyList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 此前传递的sysType参数在某些情况下实际上无法起作用,因为大部分对分类信息的操作都在平台端进行,此时传递的sysType为平台端,而我们的目的是删除商家端和供应商端的缓存记录 + shopIdList.forEach(shopId -> { + keyList.add(CacheNames.CATEGORY_RATE + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.SUPPLIER.value()); + keyList.add(CacheNames.CATEGORY_RATE + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.PLATFORM.value()); + keyList.add(CacheNames.CATEGORY_RATE + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.MULTISHOP.value()); + keyList.add(CacheNames.CATEGORY_LIST_OF_SHOP + CacheNames.UNION + shopId + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + keyList.add(CacheNames.CATEGORY_LIST_OF_SHOP + CacheNames.UNION + shopId + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_EN.getLang()); + // 商家端 + keyList.add(CacheNames.SIGNING_CATEGORY_BY_SHOP_KEY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.MULTISHOP.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + keyList.add(CacheNames.SIGNING_CATEGORY_BY_SHOP_KEY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.MULTISHOP.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_EN.getLang()); + keyList.add(CacheNames.LIST_SIGNING_CATEGORY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.MULTISHOP.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + keyList.add(CacheNames.LIST_SIGNING_CATEGORY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.MULTISHOP.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_EN.getLang()); + // 供应商端 + keyList.add(CacheNames.SIGNING_CATEGORY_BY_SHOP_KEY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.SUPPLIER.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + keyList.add(CacheNames.SIGNING_CATEGORY_BY_SHOP_KEY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.SUPPLIER.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_EN.getLang()); + keyList.add(CacheNames.LIST_SIGNING_CATEGORY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.SUPPLIER.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_ZH_CN.getLang()); + keyList.add(CacheNames.LIST_SIGNING_CATEGORY + CacheNames.UNION + shopId + CacheNames.UNION_KEY + SysTypeEnum.SUPPLIER.value() + CacheNames.UNION_KEY + LanguageEnum.LANGUAGE_EN.getLang()); + + }); + if (CollUtil.isNotEmpty(keyList)) { + RedisUtil.deleteBatch(keyList); + } + } + + @Override + public void insertBatchByShopId(List categoryShopDTOList, Long shopId, Integer sysType) { + if (CollUtil.isEmpty(categoryShopDTOList)) { + return; + } + int signedCount = categoryShopMapper.countByShopIdAndCategoryId(shopId, null, sysType); + if (signedCount + categoryShopDTOList.size() > Constant.SIGNING_CATEGORY_LIMIT_NUM) { + throw new LuckException("签约的分类信息不能超过" + Constant.SIGNING_CATEGORY_LIMIT_NUM); + } + categoryShopMapper.saveBatch(categoryShopDTOList, shopId, sysType); + } + + private void dealWithRate(List categoryShopDTOList, Long shopId, Integer sysType) { + //查找以前签约的分类信息列表 + List oldCategoryShopList = categoryShopMapper.listByShopId(shopId, I18nMessage.getLang(), sysType); + Map oldCategoryShopMap = oldCategoryShopList.stream().collect(Collectors.toMap(CategoryShopVO::getCategoryId, categoryShopVO -> categoryShopVO)); + + categoryShopDTOList.forEach(categoryShopDTO -> { + // 平台端管理员操作 + if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.PLATFORM.value())) { + if (oldCategoryShopMap.containsKey(categoryShopDTO.getCategoryId())) { + categoryShopDTO.setCategoryShopId(oldCategoryShopMap.get(categoryShopDTO.getCategoryId()).getCategoryShopId()); + oldCategoryShopMap.remove(categoryShopDTO.getCategoryId()); + } + // 店铺或供应商的请求操作 + } else if (Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.MULTISHOP.value()) || Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.SUPPLIER.value())) { + if (oldCategoryShopMap.containsKey(categoryShopDTO.getCategoryId())) { + categoryShopDTO.setCategoryShopId(oldCategoryShopMap.get(categoryShopDTO.getCategoryId()).getCategoryShopId()); + // 非平台端操作需要把用户非法添加的自定义扣率清除 + categoryShopDTO.setRate(oldCategoryShopMap.get(categoryShopDTO.getCategoryId()).getCustomizeRate()); + oldCategoryShopMap.remove(categoryShopDTO.getCategoryId()); + } else { + // 非平台端操作需要把用户非法添加的自定义扣率清除 + categoryShopDTO.setRate(null); + } + } else { + throw new LuckException("您无权进行此操作"); + } + }); + this.dealWithDeleteCategoryList(new ArrayList<>(oldCategoryShopMap.keySet()), shopId, sysType); + } + + /** + * 处理删除的分类 + * + * @param categoryIdList + * @param shopId + */ + private void dealWithDeleteCategoryList(List categoryIdList, Long shopId, Integer sysType) { + spuService.batchChangeSpuStatusByCidListAndShopId(categoryIdList, SpuStatus.OFF_SHELF.value(), shopId, sysType); + } + + + @Override + public List getSupplyIdByCategoryIds(List categoryIds) { + return categoryShopMapper.getSupplyIdByCategoryIds(categoryIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addSigningCategory(List categoryShopDTOList, Long shopId, Integer sysType) { + if (CollUtil.isEmpty(categoryShopDTOList)) { + return; + } + CategoryShopServiceImpl categoryShopService = (CategoryShopServiceImpl) AopContext.currentProxy(); + List signingCategoryIdList = categoryShopService.getCategoryIdsByShopId(shopId, sysType); + Set signingCategoryIdSet = new HashSet<>(signingCategoryIdList); + Iterator categoryShopIterator = categoryShopDTOList.iterator(); + while (categoryShopIterator.hasNext()) { + CategoryShopDTO categoryShopDTO = categoryShopIterator.next(); + // 若新增分类列表中存在已签约成功的分类,则将其剔除 + categoryShopDTO.setRate(null); + if (signingCategoryIdSet.contains(categoryShopDTO.getCategoryId())) { + categoryShopIterator.remove(); + } + } + if (signingCategoryIdList.size() + categoryShopDTOList.size() > Constant.SIGNING_CATEGORY_LIMIT_NUM) { + throw new LuckException("签约分类的总数不能超过200"); + } + if (CollUtil.isEmpty(categoryShopDTOList)) { + return; + } + categoryShopMapper.saveBatch(categoryShopDTOList, shopId, sysType); + this.removeCacheByShopIds(Collections.singletonList(shopId), sysType); + + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ComboShopCartServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ComboShopCartServiceImpl.java new file mode 100644 index 0000000..9574e06 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ComboShopCartServiceImpl.java @@ -0,0 +1,338 @@ +package com.tmerclub.cloud.product.service.impl;/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +import com.tmerclub.cloud.api.combo.feign.ComboSpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.product.vo.ComboSpuVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.shopcart.CartComboMatchSpuDTO; +import com.tmerclub.cloud.product.dto.shopcart.ChangeShopCartItemDTO; +import com.tmerclub.cloud.product.mapper.ShopCartItemMapper; +import com.tmerclub.cloud.product.model.ShopCartItem; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author xxw + * @date 2022/8/19 11:36 + */ +@Service +public class ComboShopCartServiceImpl implements ComboShopCartService { + @Autowired + private ShopCartItemMapper shopCartItemMapper; + @Autowired + private ShopCartService shopCartService; + @Autowired + private SkuService skuService; + @Autowired + private SpuService spuService; + @Autowired + private SkuStockService skuStockService; + @DubboReference + private ComboSpuFeignClient comboSpuFeignClient; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void comboAddCart(ChangeShopCartItemDTO param, List shopCartItems) { + Long userId = AuthUserContext.get().getUserId(); + //套餐skuId + //根据主商品查找购物车中的搭配商品skuId + List shopCartItemVOList = shopCartItemMapper.getMatchSkuIdList(param.getComboId(), param.getSkuId(), userId); + List matchSkuIdList = shopCartItemVOList.stream().map(ShopCartItemVO::getSkuId).collect(Collectors.toList()); + //前端传来的搭配商品skuId + List matchSkuIdS = param.getCartComboMatchSpuDTOS().stream().map(CartComboMatchSpuDTO::getSkuId).collect(Collectors.toList()); + //获取主套餐商品购物车id + Long cartItemId = shopCartService.getCartItemBySpuIdAndComboId(param.getSpuId(), param.getComboId(), AuthUserContext.get().getUserId(), param.getSkuId()); + param.setParentCartItemId(cartItemId); + //排下序 + Collections.sort(matchSkuIdList); + Collections.sort(matchSkuIdS); + boolean equals = matchSkuIdList.equals(matchSkuIdS); + //==== 判断是否能够加购 ======= + if (Objects.nonNull(cartItemId) && !equals) { + throw new LuckException("购物车中已存在该规格不同搭配的套餐, 请勿重复加购"); + } + boolean retainAll = matchSkuIdList.equals(matchSkuIdS); + //根据主商品和搭配商品查询购物车是否已存在一样的套餐,如果存在直接加数量返回。 + if (retainAll && matchSkuIdS.size() != 0) { + addComboCount(param, userId); + return; + } + // 购物车套餐没有搭配商品时 + if (matchSkuIdList.size() == 0 && matchSkuIdS.size() == 0) { + if (Objects.nonNull(cartItemId)) { + addComboCount(param, userId); + return; + } + } + //处理套餐主商品加购 + SkuVO skuVo = skuService.getSkuBySkuId(param.getSkuId()); + SpuVO spuVo = spuService.getBySpuId(param.getSpuId()); + //主商品数量 + Integer mainCount = param.getCount() * param.getComboMainLeastNum(); + param.setCount(mainCount); + disposeCart(param, shopCartItems, true, spuVo, skuVo); + //获取主套餐商品购物车id + cartItemId = shopCartService.getCartItemBySpuIdAndComboId(param.getSpuId(), param.getComboId(), AuthUserContext.get().getUserId(), param.getSkuId()); + //处理搭配商品 + List changeShopCartItemDtoS = new ArrayList<>(Constant.INITIAL_CAPACITY); + List cartComboMatchSpuList = param.getCartComboMatchSpuDTOS(); + for (CartComboMatchSpuDTO cartItemDTO : cartComboMatchSpuList) { + ChangeShopCartItemDTO changeShopCartItemDTO = new ChangeShopCartItemDTO(); + changeShopCartItemDTO.setComboId(param.getComboId()); + changeShopCartItemDTO.setSpuId(cartItemDTO.getSpuId()); + changeShopCartItemDTO.setSkuId(cartItemDTO.getSkuId()); + changeShopCartItemDTO.setCount(cartItemDTO.getCount()); + changeShopCartItemDTO.setParentCartItemId(cartItemId); + changeShopCartItemDtoS.add(changeShopCartItemDTO); + } + //获取商品SPU和SKU信息 + Map> spuMap = new HashMap<>(16); + Map> skuMap = new HashMap<>(16); + if (changeShopCartItemDtoS.size() != 0) { + List skuIdList = changeShopCartItemDtoS.stream().map(ChangeShopCartItemDTO::getSkuId).collect(Collectors.toList()); + List spuIdList = changeShopCartItemDtoS.stream().map(ChangeShopCartItemDTO::getSpuId).collect(Collectors.toList()); + List spuVOList = spuService.listSpuBySpuIds(spuIdList); + spuMap = spuVOList.stream().collect(Collectors.groupingBy(SpuVO::getSpuId)); + List skuVOList = skuService.getByIds(skuIdList); + skuMap = skuVOList.stream().collect(Collectors.groupingBy(SkuVO::getSkuId)); + } + for (ChangeShopCartItemDTO changeShopCartItemDTO : changeShopCartItemDtoS) { + disposeCart(changeShopCartItemDTO, shopCartItems, false, + spuMap.get(changeShopCartItemDTO.getSpuId()).get(0), skuMap.get(changeShopCartItemDTO.getSkuId()).get(0)); + } + } + + + /** + * 加购商品 + * + * @param param + * @param shopCartItems + * @param isMainSpu + * @param spu + * @param sku + */ + private void disposeCart(ChangeShopCartItemDTO param, List shopCartItems, Boolean isMainSpu, SpuVO spu, SkuVO sku) { + //主商品判断 + Long userId = AuthUserContext.get().getUserId(); + //判断购物车中是否存在相同sku的主商品 + boolean isAddShopCart = true; + if (isMainSpu) { + //前端传来的搭配商品skuId + List matchSkuIdS = param.getCartComboMatchSpuDTOS().stream().map(CartComboMatchSpuDTO::getSkuId).collect(Collectors.toList()); + //判断主商品是否存在 + if (Objects.nonNull(param.getParentCartItemId()) && matchSkuIdS.size() == 0) { + isAddShopCart = false; + } + } + // 当商品状态不正常时,不能添加到购物车 + if (Objects.isNull(spu) || Objects.isNull(sku) || !Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value()) || !Objects.equals(sku.getStatus(), StatusEnum.ENABLE.value()) || !Objects.equals(sku.getSpuId(), spu.getSpuId())) { + // 当返回商品不存在时,前端应该将商品从购物车界面移除 + throw new LuckException("商品不存在"); + } + // 保存shopId,不要让前端传过来 + param.setShopId(spu.getShopId()); + + // 获取加购的sku库存 + Integer skuStock = getSkuStock(param, sku, spu); + //判断商品库存是否足够 + if (param.getCount() > 0 && param.getCount() > skuStock) { + boolean notHasSkuName = CollectionUtils.isEmpty(sku.getSkuLangList()) || ObjectUtils.isEmpty(sku.getSkuLangList().get(0).getSkuName()); + String skuName = notHasSkuName ? "" : " " + sku.getSkuLangList().get(0).getSkuName() + " "; + throw new LuckException(spu.getName() + skuName + "库存不足"); + } + + //加入的套餐只有主商品没有搭配商品直接增加套餐数量即可 + if (!isAddShopCart) { + addComboCount(param, userId); + return; + } + + // 所有都正常时 + if (Objects.nonNull(skuStock) && skuStock > 0) { + List data = comboSpuFeignClient.comboSpuByComboId(param.getComboId()).getData(); + Map> listMap = data.stream().collect(Collectors.groupingBy(ComboSpuVO::getSpuId)); + Integer leastNum = listMap.get(param.getSpuId()).get(0).getLeastNum(); + param.setComboCount(param.getCount() / leastNum); + shopCartService.addShopCartItem(userId, param, sku.getPriceFee(), spu.getCategoryId()); + } + } + + + /** + * 购物车套餐数量增加 + * + * @param param + * @param userId + */ + private void addComboCount(ChangeShopCartItemDTO param, Long userId) { + // 获取加购的sku库存 + SkuVO sku = skuService.getSkuBySkuId(param.getSkuId()); + SpuVO spu = spuService.getBySpuId(param.getSpuId()); + Integer skuStock = getSkuStock(param, sku, spu); + List shopCartItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + //根据套餐id和主商品sku获取购物车商品信息 + ShopCartItemVO comboMainSpu = shopCartItemMapper.getComboMainSpu(param.getComboId(), param.getSkuId(), userId); + List matchSpuList = shopCartItemMapper.getMatchSpuList(comboMainSpu.getCartItemId()); + //获取套餐搭配商品信息 + shopCartItems.add(comboMainSpu); + shopCartItems.addAll(matchSpuList); + //获取套餐商品项信息 + List comboMatchSpuList = comboSpuFeignClient.comboSpuByComboId(param.getComboId()).getData(); + Map> comboMatchSpuMap = new HashMap<>(16); + if (Objects.nonNull(comboMatchSpuList) && comboMatchSpuList.size() != 0) { + comboMatchSpuMap = comboMatchSpuList.stream().collect(Collectors.groupingBy(ComboSpuVO::getSpuId)); + } + for (ShopCartItemVO shopCartItemVo : shopCartItems) { + ShopCartItem shopCartItem = new ShopCartItem(); + List comboSpuList = comboMatchSpuMap.get(shopCartItemVo.getSpuId()); + //套餐商品起搭数 + int leastNum = 0; + if (Objects.nonNull(comboSpuList) && comboSpuList.size() != 0) { + leastNum = comboSpuList.get(0).getLeastNum(); + } + shopCartItem.setUserId(userId); + shopCartItem.setCount(param.getCount() * leastNum + shopCartItemVo.getCount()); + if (param.getCount() > 0 && param.getCount() > skuStock) { + boolean notHasSkuName = CollectionUtils.isEmpty(sku.getSkuLangList()) || ObjectUtils.isEmpty(sku.getSkuLangList().get(0).getSkuName()); + String skuName = notHasSkuName ? "" : " " + sku.getSkuLangList().get(0).getSkuName() + " "; + throw new LuckException(spu.getName() + skuName + "库存不足"); + } + shopCartItem.setCartItemId(shopCartItemVo.getCartItemId()); + shopCartItem.setIsChecked(shopCartItemVo.getIsChecked()); + shopCartItem.setDiscountId(param.getDiscountId()); + shopCartItem.setComboId(param.getComboId()); + shopCartItem.setComboCount(shopCartItemVo.getComboCount() + param.getCount()); + // 如果有个旧的sku,就说明是在切换sku + if (Objects.nonNull(param.getOldSkuId())) { + continue; + } + // 防止购物车变成负数,从购物车删除 + if (shopCartItem.getCount() <= 0) { + shopCartService.deleteShopCartItemsByShopCartItemIds(userId, Collections.singletonList(shopCartItem.getCartItemId())); + continue; + } + shopCartService.updateShopCartItem(userId, shopCartItem); + } + } + + private Integer getSkuStock(ChangeShopCartItemDTO param, SkuVO sku, SpuVO spu) { + Integer skuStock = null; + if (param.getCount() > 0) { + // 判断下是否为供应商商品,如果是商家代销供应商商品且为供应商发货设置供应商信息 + if (!Objects.equals(spu.getSupplierId(), 0L) && Objects.equals(spu.getSupplierDeliveryType(), 1)) { + skuStock = skuStockService.getBySkuId(sku.getSupplierSkuId(), spu.getSpuMold()).getStock(); + } else { + skuStock = skuStockService.getBySkuId(param.getSkuId(), spu.getSpuMold()).getStock(); + } + } + return skuStock; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void comboUpdateCart(ChangeShopCartItemDTO param, List shopCartItems) { + Long userId = AuthUserContext.get().getUserId(); + Integer isMainProd = param.getIsMainProd(); + // 主商品sku切换 + if (Objects.equals(isMainProd, 1)) { + // 根据新的主商品sku获取购物车已有搭配商品信息 + List newShopCartItemVOList = shopCartItemMapper.getMatchSkuIdList(param.getComboId(), param.getSkuId(), userId); + List newSkuIdList = newShopCartItemVOList.stream().map(ShopCartItemVO::getSkuId).collect(Collectors.toList()); + // 根据旧的主商品sku获取购物车搭配商品信息 + List oldShopCartItemVOList = shopCartItemMapper.getMatchSkuIdList(param.getComboId(), param.getOldSkuId(), userId); + List oldSkuIdList = oldShopCartItemVOList.stream().map(ShopCartItemVO::getSkuId).collect(Collectors.toList()); + boolean retainAll = newSkuIdList.equals(oldSkuIdList); + if (!retainAll && newSkuIdList.size() != 0) { + throw new LuckException("购物车中已存在该规格不同搭配的套餐, 请勿重复加购"); + } + // 旧的搭配商品购物车数量 + Map oldShopCartSpuCountMap = oldShopCartItemVOList.stream().collect(Collectors.toMap(ShopCartItemVO::getSkuId, ShopCartItemVO::getCount)); + // 旧搭配商品购物车id + List oldMachShopCartId = oldShopCartItemVOList.stream().map(ShopCartItemVO::getCartItemId).collect(Collectors.toList()); + oldMachShopCartId.add(param.getShopCartItemId()); + // 旧主商品信息 + ShopCartItemVO oldMainShopCartItemVo = shopCartItemMapper.getByCartId(param.getShopCartItemId()); + // 旧主商品购物车商品数量 + int oldMainSpuCount = oldMainShopCartItemVo.getCount(); + + // 把移除的购物车商品数量合并到新的购物车上 + List shopCartItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + ShopCartItem shopCartItem; + ShopCartItemVO cartItemBySpuIdAndComboId = shopCartItemMapper.getCartItemBySpuIdAndComboId(param.getSpuId(), param.getComboId(), userId, param.getSkuId()); + if (Objects.isNull(cartItemBySpuIdAndComboId)) { + updateShopCart(param, userId); + return; + } + shopCartItem = new ShopCartItem(); + shopCartItem.setCartItemId(cartItemBySpuIdAndComboId.getCartItemId()); + shopCartItem.setCount(cartItemBySpuIdAndComboId.getCount() + oldMainSpuCount); + shopCartItem.setUserId(userId); + shopCartItemList.add(shopCartItem); + // 搭配商品 + for (ShopCartItemVO shopCartItemVO : newShopCartItemVOList) { + shopCartItem = new ShopCartItem(); + shopCartItem.setCartItemId(shopCartItemVO.getCartItemId()); + shopCartItem.setCount(shopCartItemVO.getCount() + oldShopCartSpuCountMap.get(shopCartItemVO.getSkuId())); + shopCartItem.setUserId(userId); + shopCartItemList.add(shopCartItem); + } + shopCartItemMapper.updateShopCartItemBatch(shopCartItemList); + // 移除掉旧的购物车 + shopCartItemMapper.deleteShopCartItemsByShopCartItemIds(userId, oldMachShopCartId); + return; + } + // 搭配商品sku切换 + updateShopCart(param, userId); + } + + + /** + * 购物车套餐商品sku更换 + * + * @param param + * @param userId + */ + private void updateShopCart(ChangeShopCartItemDTO param, Long userId) { + SpuVO spu = spuService.getBySpuId(param.getSpuId()); + SkuVO sku = skuService.getSkuBySkuId(param.getSkuId()); + + // 获取加购的sku库存 + Integer skuStock = getSkuStock(param, sku, spu); + ShopCartItem shopCartItem = new ShopCartItem(); + shopCartItem.setUserId(userId); + shopCartItem.setCartItemId(param.getShopCartItemId()); + // 如果以前就存在这个商品,还要把以前的商品数量累加 + shopCartItem.setCount(param.getCount()); + if (param.getCount() > 0 && shopCartItem.getCount() > skuStock) { + throw new LuckException("变更的商品规格库存不足"); + } + shopCartItem.setSkuId(param.getSkuId()); + // 更新购物车 + shopCartService.updateShopCartItem(userId, shopCartItem); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/GiveawayServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/GiveawayServiceImpl.java new file mode 100644 index 0000000..b2abb01 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/GiveawayServiceImpl.java @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.GiveawayDTO; +import com.tmerclub.cloud.product.dto.GiveawaySpuDTO; +import com.tmerclub.cloud.product.mapper.GiveawayMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.Giveaway; +import com.tmerclub.cloud.product.service.GiveawayService; +import com.tmerclub.cloud.product.service.GiveawaySpuService; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SkuStockService; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 赠品表 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:58 + */ +@Service +public class GiveawayServiceImpl implements GiveawayService { + + @Autowired + private GiveawayMapper giveawayMapper; + @Autowired + private GiveawaySpuService giveawaySpuService; + @Autowired + private SpuMapper spuMapper; + @Autowired + private SkuService skuService; + @Autowired + private SkuStockService skuStockService; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> giveawayMapper.list()); + } + + @Override + public GiveawayVO getBySpuId(Long spuId) { + return giveawayMapper.getBySpuId(spuId); + } + + @Override + public PageVO listByShopId(PageDTO pageDTO, GiveawayDTO giveawayDTO) { + return PageUtil.doPage(pageDTO, () -> giveawayMapper.listByShopId(giveawayDTO, I18nMessage.getLang())); + } + + @Override + public GiveawayVO getGiveawayBySpuId(Long spuId) { + return giveawaySpuService.getGiveawayBySpuId(spuId); + } + + @Override + public GiveawayVO getGiveawaySpuBySpuId(Long spuId) { + GiveawayVO giveawayVO = giveawaySpuService.getGiveawayBySpuId(spuId); + if (Objects.isNull(giveawayVO)) { + return null; + } + long currentTimeMillis = System.currentTimeMillis(); + // 未到开始时间或已超过结束时间 + if (giveawayVO.getStartTime().getTime() > currentTimeMillis || giveawayVO.getEndTime().getTime() <= currentTimeMillis) { + return null; + } + List giveawaySpuList = giveawayVO.getGiveawaySpus(); + List resGiveawaySpus = new ArrayList<>(Constant.INITIAL_CAPACITY); + + // ================== 插入赠品的spu和sku信息,且获取库存进行判断 ================== + // 批量查询赠品的spu和sku、库存信息 + List spuIds = new ArrayList<>(giveawaySpuList.size()); + List skuIds = new ArrayList<>(giveawaySpuList.size()); + for (GiveawaySpuVO giveawaySpuVO : giveawaySpuList) { + spuIds.add(giveawaySpuVO.getSpuId()); + skuIds.add(giveawaySpuVO.getSkuId()); + } + List spuList = spuMapper.listSpuBySpuIds(spuIds); + ProductLangUtil.spuList(spuList); + List skuList = skuService.listSkuAndStockBySkuIds(skuIds); + ProductLangUtil.skuList(skuList); + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, s -> s)); + Map skuMap = skuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, s -> s)); + Integer lang = I18nMessage.getLang(); + + // 遍历赠品spu,插入spu和sku信息 + if (CollUtil.isNotEmpty(giveawaySpuList)) { + giveawaySpuList.forEach(giveawaySpuVO -> { + boolean flag = addSpuAndSkuInfoHandler( + giveawaySpuVO, + spuMap.get(giveawaySpuVO.getSpuId()), + skuMap.get(giveawaySpuVO.getSkuId()), + lang); + if (flag) { + resGiveawaySpus.add(giveawaySpuVO); + } + }); + } + giveawayVO.setGiveawaySpus(resGiveawaySpus); + return giveawayVO; + } + + @Override + public GiveawayVO getByGiveawayId(Long giveawayId) { + GiveawayVO giveawayVO = giveawayMapper.getByGiveawayId(giveawayId, I18nMessage.getLang()); + List giveawaySpuList = giveawaySpuService.getByGiveawayId(giveawayVO.getGiveawayId()); + giveawaySpuList.forEach(this::addSpuAndSkuInfo); + giveawayVO.setGiveawaySpus(giveawaySpuList); + return giveawayVO; + } + + private void addSpuAndSkuInfo(GiveawaySpuVO giveawaySpuVO) { + Integer lang = I18nMessage.getLang(); + SpuVO spuVO = spuMapper.getBySpuId(giveawaySpuVO.getSpuId()); + if (Objects.nonNull(spuVO)) { + Map spuNameMap = spuVO.getSpuLangList().stream().collect(Collectors.toMap(SpuLangVO::getLang, SpuLangVO::getSpuName)); + giveawaySpuVO.setSpuName(spuNameMap.get(lang)); + giveawaySpuVO.setPriceFee(spuVO.getPriceFee()); + SkuVO skuVO = skuService.getSkuBySkuId(giveawaySpuVO.getSkuId()); + if (Objects.nonNull(skuVO)) { + Map skuNameMap = skuVO.getSkuLangList().stream().collect(Collectors.toMap(SkuLangVO::getLang, SkuLangVO::getSkuName)); + giveawaySpuVO.setSkuName(skuNameMap.get(lang)); + giveawaySpuVO.setPriceFee(skuVO.getPriceFee()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(GiveawayDTO giveawayDTO) { + this.checkGiveawayInfo(giveawayDTO); + Giveaway giveaway = BeanUtil.map(giveawayDTO, Giveaway.class); + giveaway.setStatus(1); + giveaway.setCreateTime(new Date()); + giveaway.setUpdateTime(new Date()); + if (giveaway.getStartTime().getTime() > System.currentTimeMillis()) { + giveaway.setStatus(2); + } + // 保存赠品信息 + giveawayMapper.save(giveaway); + // 保存赠品赠送商品信息 + List giveawaySpuList = giveawayDTO.getGiveawaySpus(); + giveawaySpuList.forEach(s -> s.setGiveawayId(giveaway.getGiveawayId())); + giveawaySpuService.insertBatch(giveawaySpuList); + //清除缓存 + giveawaySpuService.removeGiveawayCacheBySupId(giveaway.getSpuId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(GiveawayDTO giveawayDTO) { + Date now = new Date(); + this.checkGiveawayInfo(giveawayDTO); + GiveawayVO dbGiveaway = giveawayMapper.getByGiveawayId(giveawayDTO.getGiveawayId(), I18nMessage.getLang()); + dbGiveaway.setUpdateTime(new Date()); + if (Objects.equals(dbGiveaway.getStatus(), StatusEnum.DELETE.value())) { + // 找不到赠品或赠品已被删除 + throw new LuckException("找不到赠品或赠品已被删除"); + } + if (Objects.equals(dbGiveaway.getStatus(), StatusEnum.DISABLE.value())) { + // 当前赠品已失效 + throw new LuckException("当前赠品已失效"); + } + if (!Objects.equals(dbGiveaway.getShopId(), giveawayDTO.getShopId())) { + // 店铺id不相等 + throw new LuckException("店铺id不相等"); + } + giveawayDTO.setStatus(StatusEnum.ENABLE.value()); + giveawayDTO.setUpdateTime(now); + List deleteGiveawaySpuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 获取旧的赠送商品数据 + List giveawaySpuList = giveawaySpuService.getByGiveawayId(giveawayDTO.getGiveawayId()); + giveawaySpuList.forEach(s -> deleteGiveawaySpuIds.add(s.getGiveawaySpuId())); + Giveaway giveaway = BeanUtil.map(giveawayDTO, Giveaway.class); + if (giveaway.getStartTime().getTime() > System.currentTimeMillis()) { + giveaway.setStatus(2); + } else { + giveaway.setStatus(1); + } + boolean giveawayUpdateCount = giveawayMapper.update(giveaway, StatusEnum.ENABLE.value(), 0); +// if (giveawayUpdateCount < 1) { +// throw new LuckException("赠品信息更新失败,请刷新后重试"); +// } + + // 删除旧的赠送商品数据 + giveawaySpuService.batchDeleteByIds(deleteGiveawaySpuIds); + // 新增赠送商品数据 + giveawayDTO.getGiveawaySpus().forEach(s -> s.setGiveawayId(giveawayDTO.getGiveawayId())); + giveawaySpuService.insertBatch(giveawayDTO.getGiveawaySpus()); + //清除赠品缓存 + giveawaySpuService.removeGiveawayCacheBySupId(giveaway.getSpuId()); + giveawaySpuService.removeGiveawayCacheBySupId(dbGiveaway.getSpuId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeStatus(Long giveawayId, Integer status) { + StatusEnum statusEnum = StatusEnum.instance(status); + if (Objects.isNull(statusEnum)) { + return; + } + boolean giveawayUpdateRes = false; + switch (statusEnum) { + case DISABLE: + case DELETE: + GiveawayVO giveawayVO = giveawayMapper.getByGiveawayId(giveawayId, I18nMessage.getLang()); + if (Objects.isNull(giveawayVO) || Objects.equals(giveawayVO.getStatus(), StatusEnum.DELETE.value())) { + // 当前赠品已被删除 + throw new LuckException("当前赠品已被删除"); + } + giveawayVO.setStatus(status); + Giveaway giveaway = BeanUtil.map(giveawayVO, Giveaway.class); + giveawayUpdateRes = giveawayMapper.update(giveaway, StatusEnum.DELETE.value(), 1); + //清除缓存 + giveawaySpuService.removeGiveawayCacheBySupId(giveaway.getSpuId()); + break; + default: + break; + } + if (giveawayUpdateRes) { + boolean giveawaySpuUpdateRes = giveawaySpuService.updateStatus(giveawayId, status); + if (!giveawaySpuUpdateRes) { + throw new LuckException("删除失败,请刷新后重试"); + } + } + } + + private boolean addSpuAndSkuInfoHandler(GiveawaySpuVO giveawaySpuVO, SpuVO spuVO, SkuVO skuVO, Integer lang) { + if (Objects.isNull(spuVO)) { + return false; + } else { + giveawaySpuVO.setSpuName(spuVO.getName()); + giveawaySpuVO.setPriceFee(spuVO.getPriceFee()); + giveawaySpuVO.setSkuImgUrl(skuVO.getImgUrl()); + if (Objects.isNull(skuVO.getStock()) || skuVO.getStock() <= 0) { + return false; + } else { + giveawaySpuVO.setSkuName(skuVO.getSkuName()); + giveawaySpuVO.setPriceFee(skuVO.getPriceFee()); + if (Objects.nonNull(skuVO.getImgUrl())) { + giveawaySpuVO.setMainImgUrl(skuVO.getImgUrl()); + } + giveawaySpuVO.setPartyCode(skuVO.getPartyCode()); + } + } + return true; + } + + + /** + * 检查赠品信息 + * + * @param giveaway + */ + private void checkGiveawayInfo(GiveawayDTO giveaway) { + if (DateUtil.compare(giveaway.getStartTime(), giveaway.getEndTime()) > 0) { + // 活动开始时间不能大于结束时间 + throw new LuckException("活动开始时间不能大于结束时间"); + } + if (Objects.isNull(giveaway.getGiveawayId()) && DateUtil.compare(giveaway.getEndTime(), new Date()) < 0) { + // 新增时活动结束时间不能小于当前时间 + throw new LuckException("新增时活动结束时间不能小于当前时间"); + } + // 主商品 + SpuVO mainSpu = spuMapper.getBySpuId(giveaway.getSpuId()); + if (Objects.isNull(mainSpu) || !Objects.equals(mainSpu.getShopId(), giveaway.getShopId())) { + // 商品找不到,或店铺id不相等 + throw new LuckException("商品找不到,或店铺id不相等"); + } + if (Objects.equals(mainSpu.getStatus(), StatusEnum.DELETE.value())) { + throw new LuckException(mainSpu.getName() + I18nMessage.getMessage("已被删除,请重新选择")); + } + int count; + if (Objects.isNull(giveaway.getGiveawayId())) { + count = giveawayMapper.count(giveaway.getSpuId(), null); + } else { + count = giveawayMapper.count(giveaway.getSpuId(), giveaway.getGiveawayId()); + } + if (count > 0) { + // 一个主商品不能设置多个赠品活动 + throw new LuckException("一个主商品不能设置多个赠品活动"); + } + // 检查时间段是否冲突 + this.checkTimeIsRepeat(giveaway.getSpuId(), giveaway.getStartTime(), giveaway.getEndTime(), giveaway.getGiveawayId()); + Map spuMap = new HashMap<>(16); + spuMap.put(mainSpu.getSpuId(), mainSpu); + List giveawaySpuList = giveaway.getGiveawaySpus(); + double totalRefundPrice = 0.0; + // 赠送商品 + for (GiveawaySpuDTO giveawaySpuDTO : giveawaySpuList) { + SpuVO spuVO = spuMap.getOrDefault(giveawaySpuDTO.getSpuId(), spuMapper.getBySpuId(giveawaySpuDTO.getSpuId())); + if (Objects.isNull(spuVO) || !Objects.equals(spuVO.getShopId(), giveaway.getShopId())) { + // 商品找不到,或店铺id不相等 + throw new LuckException("商品找不到,或店铺id不相等"); + } + if (Objects.equals(spuVO.getStatus(), StatusEnum.DELETE.value())) { + // 商品已被删除 + throw new LuckException(spuVO.getName() + I18nMessage.getMessage("商品已被删除")); + } + SkuVO skuVO = skuService.getSkuBySkuId(giveawaySpuDTO.getSkuId()); + if (Objects.isNull(skuVO) || !Objects.equals(skuVO.getSpuId(), spuVO.getSpuId())) { + // sku找不到,或商品id不相等 + throw new LuckException("sku找不到,或商品id不相等"); + } + if (Objects.equals(skuVO.getStatus(), -1)) { + // 规格已被删除 + throw new LuckException(spuVO.getName() + I18nMessage.getMessage("规格已被删除") + skuVO.getSkuName() + I18nMessage.getMessage("已被删除,请重新选择")); + } + if (Objects.equals(skuVO.getStatus(), StatusEnum.DISABLE.value())) { + // 规格已被禁用 + throw new LuckException(spuVO.getName() + I18nMessage.getMessage("规格已被禁用") + skuVO.getSkuName() + I18nMessage.getMessage("已被禁用,请重新选择")); + } + if (Objects.isNull(giveawaySpuDTO.getGiveawayNum()) || giveawaySpuDTO.getGiveawayNum() <= 0) { + giveawaySpuDTO.setGiveawayNum(1); + } + if (Objects.isNull(giveawaySpuDTO.getRefundPrice()) || giveawaySpuDTO.getRefundPrice() < 0) { + giveawaySpuDTO.setRefundPrice(0L); + } + totalRefundPrice = Arith.add(totalRefundPrice, Arith.mul(giveawaySpuDTO.getRefundPrice(), giveawaySpuDTO.getGiveawayNum())); + spuMap.put(spuVO.getSpuId(), spuVO); + } + double totalmainSpuPrice = Arith.mul(mainSpu.getPriceFee(), giveaway.getBuyNum()); + if (totalmainSpuPrice < totalRefundPrice) { + // 赠品的总售后价不能超过主商品价格 + throw new LuckException("赠品的总售后价不能超过主商品价格"); + } + } + + /** + * 检查时间段是否重复 + * + * @param spuId + * @param startTime + * @param endTime + */ + private void checkTimeIsRepeat(Long spuId, Date startTime, Date endTime, Long giveawayId) { + List dbGiveawayList = giveawayMapper.countList(spuId, giveawayId, StatusEnum.ENABLE.value()); + for (GiveawayVO giveawayVO : dbGiveawayList) { + if (DateUtil.compare(startTime, giveawayVO.getEndTime()) > 0 || DateUtil.compare(endTime, giveawayVO.getStartTime()) < 0) { + continue; + } + // 时间冲突,一个主商品同一时间不能设置多个赠品活动 + throw new LuckException(I18nMessage.getMessage("活动时间与赠品【") + giveawayVO.getName() + + I18nMessage.getMessage("】的时间发生冲突,一个主商品同一时间不能设置多个赠品活动,【") + + giveawayVO.getName() + I18nMessage.getMessage("】的活动时间为") + + DateUtil.formatDateTime(giveawayVO.getStartTime()) + + I18nMessage.getMessage("至") + + DateUtil.formatDateTime(giveawayVO.getEndTime())); + } + } + + @Override + public List listUnEndButNeedEndActivity() { + return giveawayMapper.listUnEndButNeedEndActivity(); + } + + @Override + public void startGiveawayActivity() { + List idList = giveawayMapper.listUnStartButNeedStartActivity(); + giveawayMapper.startGiveawayActivity(); + giveawaySpuService.removeGiveawayCacheBatch(idList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void changeSpuTypeByGiveawayActivityIdList(List giveawayList) { + // 失效赠品活动 + giveawayMapper.changeGiveawayActivityStatusByGiveawayIdList(giveawayList); + List giveawayIdList = giveawayList.stream().map(Giveaway::getGiveawayId).collect(Collectors.toList()); + giveawaySpuService.changeGiveawayActivityStatusByGiveawayIdList(giveawayIdList); + List spuIds = giveawayList.stream().map(Giveaway::getSpuId).collect(Collectors.toList()); + spuMapper.changeToNormalSpu(spuIds); + } + + @Override + public void checkGiveawaySpuPrice(SpuDTO spuDTO) { + GiveawayVO giveawayVO = giveawaySpuService.getGiveawayBySpuId(spuDTO.getSpuId()); + List giveawaySpuVOList; + HashSet giveawayIds = new HashSet<>(Constant.INITIAL_CAPACITY); + //供应商发货的赠品也要失效掉 + if (Objects.equals(spuDTO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + giveawaySpuVOList = giveawaySpuService.getBySpuId(spuDTO.getSpuId()); + if (CollectionUtils.isNotEmpty(giveawaySpuVOList)) { + giveawaySpuVOList.forEach(s -> giveawayIds.add(s.getGiveawayId())); + } + } + if (Objects.nonNull(giveawayVO)) { + //修改后的赠品金额 + long updatePrice = giveawayVO.getBuyNum() * spuDTO.getPriceFee(); + //赠品的累加金额 + List giveawaySpus = giveawayVO.getGiveawaySpus(); + long giveawaySpuPrice = 0L; + for (GiveawaySpuVO giveawaySpuVO : giveawaySpus) { + giveawaySpuPrice += giveawaySpuVO.getRefundPrice() * giveawaySpuVO.getGiveawayNum(); + } + if (updatePrice < giveawaySpuPrice || Objects.equals(spuDTO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + giveawayIds.add(giveawayVO.getGiveawayId()); + } + } + for (Long giveawayId : giveawayIds) { + //失效该活动 + changeStatus(giveawayId, 0); + } + } + + @Override + public List listMainSpuIdByGiveawaySpuId(Long spuId) { + return giveawayMapper.listMainSpuIdByGiveawaySpuId(spuId); + } + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/GiveawaySpuServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/GiveawaySpuServiceImpl.java new file mode 100644 index 0000000..103f18f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/GiveawaySpuServiceImpl.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.vo.GiveawaySpuVO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.product.dto.GiveawaySpuDTO; +import com.tmerclub.cloud.product.mapper.GiveawaySpuMapper; +import com.tmerclub.cloud.product.model.GiveawaySpu; +import com.tmerclub.cloud.product.service.GiveawaySpuService; +import com.tmerclub.cloud.product.service.SpuStockService; +import org.apache.commons.compress.utils.Lists; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 赠品套装商品项 + * + * @author FrozenWatermelon + * @date 2022-08-16 11:11:59 + */ +@Service +public class GiveawaySpuServiceImpl implements GiveawaySpuService { + + @Autowired + private GiveawaySpuMapper giveawaySpuMapper; + + @Autowired + private SpuStockService spuStockService; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> giveawaySpuMapper.list()); + } + + @Override + public List getBySpuId(Long spuId) { + return giveawaySpuMapper.getBySpuId(spuId); + } + + @Override + public PageVO getMainSpuPage(PageDTO pageDTO, GiveawaySpuDTO giveawaySpuDTO) { + PageVO spuPage = PageUtil.doPage(pageDTO, () -> giveawaySpuMapper.getMainSpuPage(giveawaySpuDTO, I18nMessage.getLang())); + spuStockService.setSpuStock(spuPage.getList()); + List comboSpuList = Lists.newArrayList(); + if (CollUtil.isNotEmpty(spuPage.getList())) { + for (SpuVO spuVO : spuPage.getList()) { + if(Objects.equals(spuVO.getSpuMold(), SpuMold.COMBO.value())) { + comboSpuList.add(spuVO.getSpuId()); + } + } + } + // 如果是组合商品,需要重新计算一下库存 + if (CollUtil.isNotEmpty(comboSpuList)) { + ServerResponseEntity> spuIdStockMapResp = skuStockFeignClient.calculateStockByComboSpuList(comboSpuList); + Map spuStockMap = spuIdStockMapResp.getData(); + for (SpuVO spuVO : spuPage.getList()) { + if(!spuStockMap.containsKey(spuVO.getSpuId()) && !spuStockMap.containsKey(spuVO.getSupplierSpuId())){ + continue; + } + spuVO.setTotalStock(spuStockMap.get(spuVO.getSpuId())); + if (Objects.equals(spuVO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value()) && Objects.nonNull(spuVO.getSupplierSpuId())) { + spuVO.setTotalStock(spuStockMap.get(spuVO.getSupplierSpuId())); + } + } + } + return spuPage; + } + + @Override + public List getByGiveawayId(Long giveawayId) { + return giveawaySpuMapper.getByGiveawayId(giveawayId, I18nMessage.getLang(), StatusEnum.DELETE.value()); + } + + @Override + @Cacheable(cacheNames = ProductCacheNames.GIVEAWAY_BY_SPU_ID, key = "#spuId") + public GiveawayVO getGiveawayBySpuId(Long spuId) { + return giveawaySpuMapper.getGiveawayBySpuId(spuId); + } + + @Override + public void save(GiveawaySpu giveawaySpu) { + giveawaySpuMapper.save(giveawaySpu); + } + + @Override + public boolean updateStatus(Long giveawayId, Integer status) { + return giveawaySpuMapper.updateStatus(giveawayId, status); + } + + @Override + public void deleteById(Long giveawaySpuId) { + giveawaySpuMapper.deleteById(giveawaySpuId); + } + + @Override + public void insertBatch(List giveawaySpuList) { + if (CollUtil.isEmpty(giveawaySpuList)) { + return; + } + giveawaySpuList.forEach(s -> s.setStatus(1)); + giveawaySpuMapper.insertBatch(giveawaySpuList); + } + + @Override + public void batchDeleteByIds(List giveawaySpuIds) { + if (CollUtil.isEmpty(giveawaySpuIds)) { + return; + } + giveawaySpuMapper.batchDeleteByIds(giveawaySpuIds); + } + + @Override + public void changeGiveawayActivityStatusByGiveawayIdList(List giveawayIdList) { + giveawaySpuMapper.changeGiveawayActivityStatusByGiveawayIdList(giveawayIdList); + } + + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = ProductCacheNames.GIVEAWAY_BY_SPU_ID, key = "#spuId"), + // spu中有赠品信息,要一起清除缓存 + @CacheEvict(cacheNames = ProductCacheNames.SPU_KEY, key = "#spuId") + }) + public void removeGiveawayCacheBySupId(Long spuId) { + } + + @Override + public void removeGiveawayCacheBatch(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + List key = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long spuId : spuIds) { + //removeGiveawayCacheBySupId(spuId); + key.add(ProductCacheNames.GIVEAWAY_BY_SPU_ID + CacheNames.UNION + spuId); + // spu中有赠品信息,要一起清除缓存 + key.add(ProductCacheNames.SPU_KEY + CacheNames.UNION + spuId); + } + RedisUtil.del(key); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ShopCartItemServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ShopCartItemServiceImpl.java new file mode 100644 index 0000000..ba553f3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/ShopCartItemServiceImpl.java @@ -0,0 +1,469 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.product.manager.ShopCartItemAdapter; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.DeliveryModeBO; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.OrderSkuLangVO; +import com.tmerclub.cloud.common.order.vo.OrderSpuLangVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.VirtualRemarkVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.vo.GiveawaySpuVO; +import com.tmerclub.cloud.common.product.vo.GiveawayVO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.product.bo.CategoryRateBO; +import com.tmerclub.cloud.product.service.CategoryShopService; +import com.tmerclub.cloud.product.service.ShopCartItemService; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SpuService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 购物车项数据组装 + * + * @author FrozenWatermelon + * @date 2020-11-20 15:47:32 + */ +@Service +public class ShopCartItemServiceImpl implements ShopCartItemService { + private final Logger LOGGER = LoggerFactory.getLogger(ShopCartItemAdapter.class); + + @Autowired + private SpuService spuService; + @Autowired + private SkuService skuService; + @Autowired + private CategoryShopService categoryShopService; + + @Override + public void assembleShopCartItem(List shopCartItems, ShopCartItemVO mainShopCartItem, Boolean isShopCartOrder) { + List spuIds = new ArrayList<>(shopCartItems.size()); + List skuIds = new ArrayList<>(shopCartItems.size()); + for (ShopCartItemVO shopCartItem : shopCartItems) { + spuIds.add(shopCartItem.getSpuId()); + skuIds.add(shopCartItem.getSkuId()); + } + Map spuMap = this.mapSpuByCache(spuIds); + Map skuMap = this.mapSkuByCache(skuIds); + spuIds.clear(); + skuIds.clear(); + Long totalAmount = Objects.nonNull(mainShopCartItem) ? mainShopCartItem.getTotalAmount() : 0L; + Iterator iterator = shopCartItems.iterator(); + while (iterator.hasNext()) { + ShopCartItemVO shopCartItem = iterator.next(); + boolean isLastItem = !iterator.hasNext(); + SpuVO spu = spuMap.get(shopCartItem.getSpuId()); + SkuVO sku = skuMap.get(shopCartItem.getSkuId()); + + // 从购物车提交的订单,需要去除失效商品 + if (BooleanUtil.isTrue(isShopCartOrder)) { + boolean invalidProduct = !Objects.equals(spu.getStatus(), StatusEnum.ENABLE.value()) || + !Objects.equals(sku.getStatus(), StatusEnum.ENABLE.value()) || + Objects.equals(spu.getPreSaleType(), StatusEnum.ENABLE.value()); + if (invalidProduct) { + iterator.remove(); + continue; + } + } + + // 填充购物车项基本数据 + handShopCartItemBaseInfo(shopCartItem, spu, sku,mainShopCartItem); + + // 区域库存列表 + shopCartItem.setStockPointList(sku.getStockPointList()); + + // 赠品信息 + shopCartItem.setGiveaway(spu.getGiveawayVO()); + + // 预售信息 -- 处理下发货时间,定金相关优惠金额和实付金额 + handlePreSaleInfo(shopCartItem, spu); + + // 虚拟商品信息 + handleVirtual(spu, shopCartItem); + + // 供应商代销商品数据 + totalAmount = handleSupplier(spuIds, skuIds, shopCartItem, spu, sku,mainShopCartItem,totalAmount,isLastItem); + + } + // 订单项金额从小到大排序 + shopCartItems = shopCartItems.stream().sorted(Comparator.comparingDouble(ShopCartItemVO::getActualTotal)).collect(Collectors.toList()); + // 没有供应商发货的代销商品数据需要查询 + if (CollUtil.isEmpty(spuIds)) { + return; + } + LOGGER.info("查询代销商品对应的供应商商品数据"); + // 获取供应商商品的数据 + spuMap.putAll(this.mapSpuByCache(spuIds)); + skuMap.putAll(this.mapSkuByCache(skuIds)); + + Iterator supplilerIterator = shopCartItems.iterator(); + while (supplilerIterator.hasNext()) { + ShopCartItemVO shopCartItem = supplilerIterator.next(); + // 非供应商代销商品, 或者不是供应商发货、或者是秒杀商品(独立库存,不使用供应商库存数据) + if (!Objects.equals(shopCartItem.getSupplierDeliveryType(), 1) || shopCartItem.getSpuType().equals(SpuType.SECKILL.value())) { + continue; + } + SpuVO supplierSpu = spuMap.get(shopCartItem.getSupplierSpuId()); + SkuVO supplierSku = skuMap.get(shopCartItem.getSupplierSkuId()); + + // 从购物车提交的订单,需要去除失效商品 + if (BooleanUtil.isTrue(isShopCartOrder)) { + if (!Objects.equals(supplierSku.getStatus(), StatusEnum.ENABLE.value())) { + supplilerIterator.remove(); + continue; + } + } + // 处理下供应商发货的代销商品信息 + shopCartItem.setStockPointList(supplierSku.getStockPointList()); + shopCartItem.setSupplierSpuLangList(BeanUtil.mapAsList(supplierSpu.getSpuLangList(), OrderSpuLangVO.class)); + shopCartItem.setSupplierSkuLangList(BeanUtil.mapAsList(supplierSku.getSkuLangList(), OrderSkuLangVO.class)); + shopCartItem.setSupplierUrl((StrUtil.isNotBlank(supplierSku.getImgUrl())) ? supplierSku.getImgUrl() : supplierSpu.getMainImgUrl()); + shopCartItem.setDeliveryTemplateId(supplierSpu.getDeliveryTemplateId()); + shopCartItem.setDeliveryAmount(supplierSpu.getDeliveryAmount()); + shopCartItem.setSupplierPriceFee(supplierSpu.getPriceFee()); + shopCartItem.setTotalPurchaseAmount(shopCartItem.getCount() * supplierSku.getPriceFee()); + shopCartItem.setSupplierRate(supplierSpu.getRate()); + } + } + + @Override + public void buildItemGiveawayInfo(List shopCartItems) { + if (CollUtil.isEmpty(shopCartItems)) { + return; + } + Long userId = shopCartItems.get(0).getUserId(); + List skuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List shopCartItemList = new ArrayList<>(shopCartItems.size()); + for (ShopCartItemVO shopCartItem : shopCartItems) { + // 没有赠品要处理 + if (Objects.isNull(shopCartItem.getGiveaway())) { + continue; + } + GiveawayVO giveaway = shopCartItem.getGiveaway(); + // 主商品购买数量是否满足赠送的最低要求 + if (shopCartItem.getCount() < giveaway.getBuyNum()) { + continue; + } + for (GiveawaySpuVO giveawaySpu : giveaway.getGiveawaySpus()) { + if (skuIds.contains(giveawaySpu.getSkuId())) { + continue; + } + Long skuId = giveawaySpu.getSkuId(); + skuIds.add(skuId); + shopCartItemList.add(new ShopCartItemVO(userId, giveawaySpu.getSpuId(), giveawaySpu.getSkuId(), giveawaySpu.getGiveawayNum())); + } + } + + // 没有赠品,直接返回 + if (CollUtil.isEmpty(shopCartItemList)) { + return; + } + // 组装赠品的spu和sku信息 + this.assembleShopCartItem(shopCartItemList, null, null); + + Map shopCartItemMap = shopCartItemList.stream().collect(Collectors.toMap(ShopCartItemVO::getSkuId, Function.identity())); + + // 将组装好的赠品数据,放入购物车项 + for (ShopCartItemVO shopCartItem : shopCartItems) { + // 没有赠品要处理,或者主商品购买数量不满足赠送的最低要求 + if (Objects.isNull(shopCartItem.getGiveaway()) || shopCartItem.getCount() < shopCartItem.getGiveaway().getBuyNum()) { + continue; + } + + GiveawayVO giveaway = shopCartItem.getGiveaway(); + // 组装赠品订单项的赠品活动数据 + List giveawayShopCartItemList = new ArrayList<>(giveaway.getGiveawaySpus().size()); + // 赠品数量 = 主商品数 / 最少购买赠送数量 + int giveawayNum = shopCartItem.getCount() / giveaway.getBuyNum(); + for (GiveawaySpuVO giveawaySpu : giveaway.getGiveawaySpus()) { + ShopCartItemVO giveawayShopCartItemVO = shopCartItemMap.get(giveawaySpu.getSkuId()); + giveawayShopCartItemVO = BeanUtil.map(giveawayShopCartItemVO, ShopCartItemVO.class); + giveawayShopCartItemVO.setCount(giveawaySpu.getGiveawayNum() * giveawayNum); + giveawaySpu.setGiveawayNum(giveawayShopCartItemVO.getCount()); + giveawayShopCartItemVO.setGiveawayRefundPrice(giveawaySpu.getRefundPrice()); + // 根据数量,重新计算赠品金额 + giveawayShopCartItemVO.setTotalAmount(giveawayShopCartItemVO.getCount() * giveawayShopCartItemVO.getSkuPriceFee()); + giveawayShopCartItemVO.setActualTotal(giveawayShopCartItemVO.getTotalAmount()); + giveawayShopCartItemList.add(giveawayShopCartItemVO); + } + shopCartItem.setGiveawayShopCartItemList(giveawayShopCartItemList); + } + } + + private static void handShopCartItemBaseInfo(ShopCartItemVO shopCartItem, SpuVO spu, SkuVO sku, ShopCartItemVO mainShopCartItem) { + shopCartItem.setShopId(Objects.isNull(shopCartItem.getShopId()) ? spu.getShopId() : shopCartItem.getShopId()); + if (Objects.isNull(shopCartItem.getCartItemId())) { + shopCartItem.setCartItemId(0L); + } + shopCartItem.setSpuCode(spu.getSpuCode()); + shopCartItem.setCategoryId(spu.getCategoryId()); + shopCartItem.setSpuType(spu.getSpuType()); + shopCartItem.setTotalPurchaseAmount(0L); + // 没有指定满减活动时,初始化满减id + if (Objects.isNull(shopCartItem.getDiscountId())) { + shopCartItem.setDiscountId(0L); + } + // 初始化商品实际金额 + shopCartItem.setImgUrl((Objects.nonNull(sku.getImgUrl()) && StrUtil.isNotBlank(sku.getImgUrl())) ? sku.getImgUrl() : spu.getMainImgUrl()); + if(Objects.nonNull(shopCartItem.getMainComboSpuId())) { +// // 组合商品信息 -- 设置一下组合主商品信息 +// shopCartItem.setComboAmount(shopCartItem.getSkuPriceFee() * shopCartItem.getCount() * shopCartItem.getComboCount()); +// shopCartItem.setTotalAmount(shopCartItem.getCount() * shopCartItem.getSkuPriceFee() * shopCartItem.getComboCount()); + shopCartItem.setComboCount(shopCartItem.getCount() * mainShopCartItem.getCount()); + shopCartItem.setCount(shopCartItem.getComboCount()); + } + shopCartItem.setSkuPriceFee(sku.getPriceFee()); + shopCartItem.setTotalAmount(shopCartItem.getCount() * shopCartItem.getSkuPriceFee()); + // sku数据 + shopCartItem.setActualTotal(shopCartItem.getTotalAmount()); + shopCartItem.setScoreFee(sku.getScoreFee()); + shopCartItem.setPartyCode(sku.getPartyCode()); + shopCartItem.setWeight(sku.getWeight()); + shopCartItem.setVolume(sku.getVolume()); + shopCartItem.setShareReduce(0L); + shopCartItem.setPlatformShareReduce(0L); + // 商品分类扣率 + shopCartItem.setRate(spu.getRate()); + shopCartItem.setSupplierRate(0.0); + // 如果主组合商品不为空使用组合商品的扣率 + if(Objects.nonNull(mainShopCartItem)){ + shopCartItem.setRate(mainShopCartItem.getRate()); + } + // 商品物流配送信息 + shopCartItem.setDeliveryMode(spu.getDeliveryMode()); + shopCartItem.setDeliveryTemplateId(spu.getDeliveryTemplateId()); + shopCartItem.setDeliveryAmount(spu.getDeliveryAmount()); + shopCartItem.setDeliveryModeBO(Json.parseObject(shopCartItem.getDeliveryMode(), DeliveryModeBO.class)); + // 国际化 + shopCartItem.setSpuLangList(BeanUtil.mapAsList(spu.getSpuLangList(), OrderSpuLangVO.class)); + shopCartItem.setSkuLangList(BeanUtil.mapAsList(sku.getSkuLangList(), OrderSkuLangVO.class)); + OrderLangUtil.shopCartItemLang(shopCartItem); + // 积分商品加入积分价格 + if (Objects.equals(spu.getSpuType(), SpuType.SCORE.value())) { + shopCartItem.setScorePrice(sku.getScoreFee() * shopCartItem.getCount()); + } else { + shopCartItem.setScorePrice(Constant.ZERO_LONG); + } + } + + private static void handleVirtual(SpuVO spu, ShopCartItemVO shopCartItem) { + shopCartItem.setMold(spu.getSpuMold()); + if (!Objects.equals(shopCartItem.getMold(), SpuMold.VIRTUAL.value())) { + return; + } + shopCartItem.setMold(spu.getSpuMold()); + shopCartItem.setIsRefund(spu.getIsRefund()); + shopCartItem.setVirtualRemark(spu.getVirtualRemark()); + shopCartItem.setWriteOffNum(spu.getWriteOffNum()); + shopCartItem.setWriteOffMultipleCount(spu.getWriteOffMultipleCount()); + shopCartItem.setWriteOffStart(spu.getWriteOffStart()); + shopCartItem.setWriteOffEnd(spu.getWriteOffEnd()); + shopCartItem.setWriteOffTime(spu.getWriteOffTime()); + // 确保字符串为数组格式类型后,再进行JSON转换,否则会报错 + String virtualRemark = spu.getVirtualRemark(); + boolean isHandleVirtualRemark = StrUtil.isNotBlank(virtualRemark) + && virtualRemark.startsWith("[") + && virtualRemark.endsWith("]"); + if (isHandleVirtualRemark) { + List virtualRemarkList = JSON.parseArray(spu.getVirtualRemark()).toJavaList(VirtualRemarkVO.class); + for (VirtualRemarkVO virtualRemarkVO : virtualRemarkList) { + if (virtualRemarkVO.getIsRequired() == null) { + virtualRemarkVO.setIsRequired(false); + } + virtualRemarkVO.setSpuId(shopCartItem.getSpuId()); + } + shopCartItem.setVirtualRemarkList(virtualRemarkList); + } + } + + private void handlePreSaleInfo(ShopCartItemVO shopCartItem, SpuVO spu) { + LOGGER.info("预售商品,处理下发货时间,定金相关优惠金额和实付金额"); + shopCartItem.setPreSaleType(spu.getPreSaleType()); + shopCartItem.setPreSaleDeliveryType(spu.getPreSaleDeliveryType()); + shopCartItem.setPreSaleDeliveryTime(spu.getPreSaleDeliveryTime()); + if (!Objects.equals(shopCartItem.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + return; + } + long depositAmount = spu.getDepositAmount() * shopCartItem.getCount(); + long depositExpansionAmount = spu.getDepositExpansionAmount() * shopCartItem.getCount(); + LOGGER.info("预售定金金额:{},预售尾款金额:{}", depositAmount, depositExpansionAmount); + if (Objects.equals(spu.getDepositType(), 0)) { + depositAmount = PriceUtil.divideByBankerRounding(shopCartItem.getTotalAmount() * spu.getDepositAmount(), 10000); + depositExpansionAmount = PriceUtil.divideByBankerRounding(shopCartItem.getTotalAmount() * spu.getDepositExpansionAmount(), 10000); + LOGGER.info("定金收取类型为按比例收取,预售定金金额:{},预售尾款金额:{}", depositAmount, depositExpansionAmount); + } + // 定金最小是1分钱 + depositAmount = Math.max(depositAmount, 1); + shopCartItem.setDepositAmount(depositAmount); + shopCartItem.setActualDepositAmount(depositAmount); + shopCartItem.setDepositExpansionAmount(depositExpansionAmount); + shopCartItem.setDepositReduceAmount(depositExpansionAmount - depositAmount); + shopCartItem.setBalanceAmount(shopCartItem.getTotalAmount() - depositAmount); + shopCartItem.setActualBalanceAmount(shopCartItem.getTotalAmount() - depositExpansionAmount); + shopCartItem.setBalanceStartTime(spu.getBalanceStartTime()); + shopCartItem.setBalanceEndTime(spu.getBalanceEndTime()); + shopCartItem.setShareReduce(shopCartItem.getDepositReduceAmount()); + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - shopCartItem.getDepositReduceAmount()); + } + + private Long handleSupplier(List spuIds, List skuIds, ShopCartItemVO shopCartItem, SpuVO spu, SkuVO sku, ShopCartItemVO mainShopCartItem, Long totalAmount, boolean isLastItem) { + shopCartItem.setSupplierDeliveryType(spu.getSupplierDeliveryType()); + // 供应商发货的代销商品 + if (Objects.equals(shopCartItem.getSupplierDeliveryType(), 1)) { + LOGGER.info("商家代销供应商商品且为供应商发货,设置供应商信息"); + // 处理下供应商信息, 这里只要加商品中有的供应商信息即可,如果是供应商发货的代销商品, + shopCartItem.setSupplierId(spu.getSupplierId()); + shopCartItem.setSupplierSpuId(spu.getSupplierSpuId()); + shopCartItem.setSupplierSkuId(sku.getSupplierSkuId()); + spuIds.add(spu.getSupplierSpuId()); + skuIds.add(sku.getSupplierSkuId()); + + } else if(Objects.nonNull(mainShopCartItem) && !Objects.equals(mainShopCartItem.getSupplierId(), 0L) && Objects.equals(mainShopCartItem.getSupplierDeliveryType(), 1)){ + LOGGER.info("商家代销的供应商发布的组合商品"); + // 如果主商品不为空且主商品为供应商商品,表示为代销供应商的组合商品 + // 处理下供应商信息 + shopCartItem.setSupplierId(mainShopCartItem.getSupplierId()); + shopCartItem.setSupplierDeliveryType(mainShopCartItem.getSupplierDeliveryType()); + // 因为这里是商家代销组合商品,单个没有代销的情况下还是自身的相关信息 + shopCartItem.setSupplierSpuId(shopCartItem.getSpuId()); + shopCartItem.setSupplierSkuId(shopCartItem.getSkuId()); + shopCartItem.setDeliveryAmount(spu.getDeliveryAmount()); + // 组合单价就是采购价,总采购价就是组合总价 + shopCartItem.setSupplierPriceFee(shopCartItem.getSkuPriceFee()); + shopCartItem.setTotalPurchaseAmount(shopCartItem.getTotalAmount()); +// // 计算一下,当前供应商的组合商品关联子商品金额 = 当前子商品总组合金额 * 商家总代销金额 / 供应商总采购价 +// long itemTotalAmount = PriceUtil.divideByBankerRounding(shopCartItem.getTotalPurchaseAmount() * mainShopCartItem.getTotalAmount(),mainShopCartItem.getTotalPurchaseAmount()); +// long itemComboAmount = PriceUtil.divideByBankerRounding(shopCartItem.getComboAmount() * mainShopCartItem.getTotalAmount(),mainShopCartItem.getTotalPurchaseAmount()); +// long itemSkuPriceFee = PriceUtil.divideByBankerRounding(shopCartItem.getSkuPriceFee() * mainShopCartItem.getTotalAmount(),mainShopCartItem.getTotalPurchaseAmount()); +// if(isLastItem){ +// itemTotalAmount = totalAmount; +// } +// shopCartItem.setTotalAmount(itemTotalAmount); +// shopCartItem.setComboAmount(itemComboAmount); +// shopCartItem.setSkuPriceFee(itemSkuPriceFee); + shopCartItem.setActualTotal(shopCartItem.getTotalAmount()); + shopCartItem.setSupplierRate(mainShopCartItem.getSupplierRate()); + shopCartItem.setRate(mainShopCartItem.getRate()); + spuIds.add(shopCartItem.getSupplierSpuId()); + skuIds.add(shopCartItem.getSupplierSkuId()); +// totalAmount -= itemTotalAmount; + }else{ + LOGGER.info("非商家代销供应商商品或者不为供应商发货,设置供应商信息为空"); + shopCartItem.setSupplierId(0L); + shopCartItem.setTotalPurchaseAmount(0L); + shopCartItem.setSupplierRate(0.0); + shopCartItem.setSupplierPriceFee(0L); + } + return totalAmount; + } + + private Map mapSpuByCache(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return Collections.emptyMap(); + } + Map spuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (spuIds.size() == 1) { + SpuVO spuVO = spuService.getBySpuId(spuIds.get(0)); + spuMap.put(spuIds.get(0),spuVO); + }else { + spuMap.putAll(RedisUtil.mapByIds(CacheNames.SPU_KEY, spuIds, SpuVO.class)); + spuIds.removeAll(spuMap.keySet()); + if (CollUtil.isNotEmpty(spuIds)) { + for (Long spuId : spuIds) { + SpuVO spuVO = spuService.getBySpuId(spuId); + if (Objects.isNull(spuVO)) { + throw new LuckException("商品不存在或者已删除"); + } + spuMap.put(spuId, spuVO); + } + } + } + // 添加分类扣率 + this.loadSpuCategory(spuMap); + return spuMap; + } + + private Map mapSkuByCache(List skuIds) { + if (CollUtil.isEmpty(skuIds)) { + return Collections.emptyMap(); + } + if (skuIds.size() == 1) { + SkuVO skuVO = skuService.getSkuBySkuId(skuIds.get(0)); + Map skuMap = new HashMap<>(Constant.INITIAL_CAPACITY); + skuMap.put(skuIds.get(0), skuVO); + return skuMap; + } + + Map skuMap = RedisUtil.mapByIds(CacheNames.SKU_KEY, skuIds , SkuVO.class); + skuIds.removeAll(skuMap.keySet()); + if (CollUtil.isEmpty(skuIds)) { + return skuMap; + } + for (Long skuId : skuIds) { + SkuVO skuVO = skuService.getSkuBySkuId(skuIds.get(0)); + skuMap.put(skuId, skuVO); + } + return skuMap; + } + + private void loadSpuCategory(Map spuMap) { + if (spuMap.isEmpty()) { + return; + } + // 处理一下,获取平台佣金比例 + for (Long spuId : spuMap.keySet()) { + SpuVO spuVO = spuMap.get(spuId); + boolean isSupplierSpu = !Objects.equals(spuVO.getSupplierId(), 0L) && Objects.equals(spuVO.getSupplierDeliveryType(), 1); + List shopCategoryRates = categoryShopService.listRateByShopId(spuVO.getShopId(), SysTypeEnum.MULTISHOP.value()); + spuVO.setRate(0.0); + for (CategoryRateBO shopCategoryRate : shopCategoryRates) { + if (Objects.equals(shopCategoryRate.getCategoryId(), spuVO.getCategoryId())) { + spuVO.setRate(shopCategoryRate.getRate()); + } + } + // 判断下是否为供应商商品,如果是商家代销供应商商品且为供应商发货设置供应商信息 + if (isSupplierSpu) { + List supplierCategoryRates = categoryShopService.listRateByShopId(spuVO.getSupplierId(), SysTypeEnum.SUPPLIER.value()); + spuVO.setSupplierRate(0.0); + for (CategoryRateBO supplierCategoryRate : supplierCategoryRates) { + if (Objects.equals(supplierCategoryRate.getCategoryId(), spuVO.getCategoryId())) { + spuVO.setSupplierRate(supplierCategoryRate.getRate()); + } + } + } + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuLangServiceImpl.java new file mode 100644 index 0000000..1021099 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuLangServiceImpl.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.vo.SkuLangVO; +import com.tmerclub.cloud.product.mapper.SkuLangMapper; +import com.tmerclub.cloud.product.model.SkuLang; +import com.tmerclub.cloud.product.service.SkuLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * sku-国际化表 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +@Service +public class SkuLangServiceImpl implements SkuLangService { + + @Autowired + private SkuLangMapper skuLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> skuLangMapper.list()); + } + + @Override + public List getBySkuId(Long skuId) { + return skuLangMapper.getBySkuId(skuId); + } + + @Override + public void save(SkuLang skuLang) { + skuLangMapper.save(skuLang); + } + + @Override + public void update(SkuLang skuLang) { + skuLangMapper.update(skuLang); + } + + @Override + public void deleteById(Long skuId) { + skuLangMapper.deleteById(skuId); + } + + @Override + public void batchSave(List skuLangList) { + if (CollUtil.isEmpty(skuLangList)) { + return; + } + skuLangMapper.batchSave(skuLangList); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuStockLockServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuStockLockServiceImpl.java new file mode 100644 index 0000000..99725ab --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SkuStockLockServiceImpl.java @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.product.bo.SkuStockLockBO; +import com.tmerclub.cloud.api.product.dto.SkuStockLockDTO; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.OrderVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.StockBillType; +import com.tmerclub.cloud.common.product.constant.StockType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.service.SkuStockLockService; +import com.tmerclub.cloud.product.service.StockBillLogService; +import com.tmerclub.cloud.product.service.StockPointSkuService; +import com.tmerclub.cloud.product.service.WarehouseService; +import com.tmerclub.cloud.product.util.StockUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 库存锁定信息 + * + * @author FrozenWatermelon + * @date 2020-12-22 16:12:10 + */ +@Service +public class SkuStockLockServiceImpl implements SkuStockLockService { + private static final Logger LOG = LoggerFactory.getLogger(SkuStockLockServiceImpl.class); + + @Autowired + private RocketMQTemplate outStockLogTemplate; + @Autowired + private StockBillLogService stockBillLogService; + @Autowired + private StockManager stockManager; + @Autowired + private SegmentManager segmentManager; + @Autowired + private WarehouseService warehouseService; + @Autowired + private StockPointSkuService stockPointSkuService; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + + /** + * 锁定库存 + * 纯redis的操作,不需要事务 + * + * 具体步骤: + * 1.发送库存解锁mq + * 2.扣除库存,同时添加锁定记录 + * 3.填充扣除后的库存数量 + * 4.添加出库记录 + * + * 存在问题及处理方案(解锁库存时处理): + * 1.发送mq后,扣除库存失败 - 无需处理 + * 2.发送mq后,成功扣除库存,出库记录添加失败 - 在定时任务unLockOrderSkuStock中还原库存和删除redis中的库存锁定明细记录 + * 3.发送mq后,成功扣除库存,成功添加出库记录,订单创建失败 - 在定时任务unLockOrderSkuStock中删除出库记录,还原库存和删除redis中的库存锁定明细记录 + * 4.发送mq后,成功扣除库存,成功添加出库记录,订单创建后取消 - 添加入库记录,还原库存删除redis中的库存锁定明细记录 + * + * @Transactional(rollbackFor = Exception.class) + * @param stockBillLogItems 参数 + * @return + */ + @Override + public ServerResponseEntity lock(List stockBillLogItems) { + List skuStockLocks = BeanUtil.mapAsList(stockBillLogItems, SkuStockLockBO.class); + + // 扣除库存,同时添加锁定记录 + String luaResult = stockManager.lockStock(skuStockLocks); + // 如果没有下划线,就是库存不足的商品skuId + if (!luaResult.contains(StrUtil.COMMA)) { + LOG.info("lock sku stock data: {}", luaResult); + Long id = Long.valueOf(luaResult); + if (id < 0) { + return ServerResponseEntity.fail(ResponseEnum.SHOP_CART_NOT_EXIST); + } + return ServerResponseEntity.fail(ResponseEnum.NOT_STOCK, Long.valueOf(luaResult)); + } + + // 扣除库存成功,填充库存数量到出入库商品项中 + Map> itemMap = stockBillLogItems.stream().collect(Collectors.groupingBy(s -> s.getOrderId().toString() + s.getSkuId())); + String[] skuList = luaResult.split(Constant.COMMA); + for (int i = 0; i < skuList.length; i++) { + String[] arrayStr = skuList[i].split(Constant.UNDERLINE); + if(Objects.equals(arrayStr[1], "0")) { + continue; + } + List stockBillLogItemList = itemMap.get(arrayStr[0] + arrayStr[2]); + for (StockBillLogItemDTO stockBillLogItemDTO : stockBillLogItemList) { + stockBillLogItemDTO.setAfterStock(Integer.valueOf(arrayStr[3])); + Long stockBillLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_BILL_LOG); + stockBillLogItemDTO.setStockBillLogId(stockBillLogId); + } + } + + // 生成出库明细 + SendStatus sendStockStatus = outStockLogTemplate.syncSend(RocketMqConstant.OUT_STOCK_LOG_TOPIC, new GenericMessage<>(stockBillLogItems)).getSendStatus(); + if (!Objects.equals(sendStockStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + + LOG.info("lock sku stock end...."); + return ServerResponseEntity.success(); + } + + @Override + public String lockPurchaseOrder(List skuStockLocks) { + List stockList = this.listStringArrayBySkuStockLocks(skuStockLocks); + // 扣除库存,同时添加锁定记录 + return stockManager.executeLuk(stockList, StockManager.PURCHASE_LOCK_STOCK_BYTES); + } + + + @Override + public String purchaseOrderReduceLockStock(List skuStockLocks) { + List stockList = this.listStringArrayBySkuStockLocks(skuStockLocks); + // 扣除库存,同时添加锁定记录 + return stockManager.executeLuk(stockList, StockManager.PURCHASE_REDUCE_LOCK_STOCK_BYTES); + } + + @Override + public String lockAllotOrder(List skuStockLocks) { + List stockList = this.listStringArrayBySkuStockLocks(skuStockLocks); + // 扣除库存,同时添加锁定记录 + return stockManager.executeLuk(stockList, StockManager.ALLOT_LOCK_STOCK_BYTES); + } + + @Override + public String reduceLockAllotOrder(List skuStockLocks) { + List stockList = this.listStringArrayBySkuStockLocks(skuStockLocks); + // 减少锁定库存,同时删除锁定记录 + return stockManager.executeLuk(stockList, StockManager.ALLOT_REDUCE_LOCK_STOCK_BYTES); + } + + + @Override + public String changeStock(List skuStocks) { + List stockList = new ArrayList<>(skuStocks.size()); + for (SkuStockVO skuStockLock : skuStocks) { + stockList.add(StockUtil.loadQueryArray( + skuStockLock.getSkuId(), + StockManager.WAREHOUSE_ID, + skuStockLock.getStock(), + LuaOperateEnum.SKU_REPLACE)); + } + // 扣除库存,同时添加锁定记录 + return stockManager.changeStock(stockList, Boolean.TRUE); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void unlockStockByCancel(List orderIds) { + ServerResponseEntity> ordersResponse = orderFeignClient.listOrderAndOrderItemByOrderIds(orderIds); + if (!ordersResponse.isSuccess()) { + throw new LuckException(ordersResponse.getMsg()); + } + List orderList = ordersResponse.getData(); + List skuStocks = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 获取所有的非组合商品订单项的仓库和门店情况,如果门店是共享库存或者仓库已经被删除则库存回退到默认仓库 + List skuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map shopDefaultStockIdMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (OrderVO orderVO : orderList) { + skuIds.addAll(orderVO.getOrderItems().stream().filter(orderItemVO -> !Objects.equals(orderItemVO.getSpuMold(), SpuMold.COMBO.value())) + .map(OrderItemVO::getSkuId).toList()); + // 判断下是否为供应商商品,如果是商家代销供应商商品 + int sysType = SysTypeEnum.MULTISHOP.value(); + if (!Objects.equals(orderVO.getSupplierId(), 0L)) { + sysType = SysTypeEnum.SUPPLIER.value(); + + } + // 此处直接用orderId作为key方便后续操作 + WarehouseVO warehouseVO = warehouseService.getDefaultWarehouseByShopId(orderVO.getShopId(), sysType); + if(Objects.nonNull(warehouseVO)){ + shopDefaultStockIdMap.put(orderVO.getOrderId(),warehouseVO.getWarehouseId()); + } + } + List stockPointSkus = stockPointSkuService.listBySkuIds(skuIds); + Map> skuStockPointMap = stockPointSkus.stream().collect(Collectors.groupingBy(StockPointSkuVO::getSkuId)); + for (OrderVO orderVO : orderList) { + boolean supplierDelivery = Objects.equals(orderVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + // 手动取消订单,解锁库存 + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + // 如果是组合商品主商品,不需要回退库存直接跳过 + if(Objects.equals(orderItem.getSpuMold(), SpuMold.COMBO.value())){ + continue; + } + SkuStockLockBO skuStockLockBO = new SkuStockLockBO(); + if (supplierDelivery) { + skuStockLockBO.setSkuId(orderItem.getSupplierSkuId()); + } else { + skuStockLockBO.setSkuId(orderItem.getSkuId()); + } + List stockPointSku = skuStockPointMap.get(orderItem.getSkuId()); + List stockPointIds = stockPointSku.stream().map(StockPointSkuVO::getStockPointId).toList(); + skuStockLockBO.setStockPointId(orderItem.getStockPointId()); + // 如果不存在这个库存id,则使用默认库存id进行扣减 + if(!stockPointIds.contains(orderItem.getStockPointId())){ + skuStockLockBO.setDefaultStockPointId(shopDefaultStockIdMap.get(orderVO.getOrderId())); + } + skuStockLockBO.setOrderId(orderVO.getOrderId()); + skuStockLockBO.setStockCount(orderItem.getCount()); + skuStocks.add(skuStockLockBO); + } + } + if (CollUtil.isEmpty(skuStocks)) { + return; + } + List stockBillLogItems = new ArrayList<>(Constant.INITIAL_CAPACITY); + Date now = new Date(); + // 解锁库存,并且将更新后的库存set到stockBillLogItems + Map stockMap = stockManager.unLockStock(skuStocks); + if (CollUtil.isEmpty(stockMap)) { + LOG.info("没有可解锁的库存,订单ids:{}", orderIds); + return; + } + + for (OrderVO orderVO : orderList) { + boolean supplierDelivery = Objects.equals(orderVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + // 手动取消订单,解锁库存 + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + long skuId = supplierDelivery ? orderItem.getSupplierSkuId() : orderItem.getSkuId(); + if (!stockMap.containsKey(skuId)) { + continue; + } + Integer stock = stockMap.get(skuId); + StockBillLogItemDTO stockBillLogItem = new StockBillLogItemDTO( + orderItem.getSpuId(), + orderItem.getSkuId(), + orderItem.getShopId(), + orderItem.getOrderId(), + orderItem.getSpuName(), + orderItem.getSkuName(), + orderItem.getCount(), + orderItem.getPrice(), + orderItem.getPartyCode(), + orderItem.getPic() + ); + stockBillLogItem.setAfterStock(stock); + List stockPointSku = skuStockPointMap.get(orderItem.getSkuId()); + List stockPointIds = stockPointSku.stream().map(StockPointSkuVO::getStockPointId).toList(); + // 如果不存在这个库存id,则使用默认库存id进行后续操作 + if(!stockPointIds.contains(orderItem.getStockPointId())){ + stockBillLogItem.setStockPointId(shopDefaultStockIdMap.get(orderVO.getOrderId())); + } + stockBillLogItem.setSupplierDeliveryType(orderVO.getSupplierDeliveryType()); + stockBillLogItem.setSupplierId(orderVO.getSupplierId()); + stockBillLogItem.setCreateTime(now); + stockBillLogItem.setUpdateTime(now); + stockBillLogItem.setSpuName(orderItem.getOrderItemLangList().get(0).getSpuName()); + stockBillLogItem.setSkuName(orderItem.getOrderItemLangList().get(0).getSkuName()); + stockBillLogItem.setStockBillType(StockBillType.ORDER_CANCEL.value()); + stockBillLogItem.setStocktype(StockType.WAREHOUSING.value()); + stockBillLogItems.add(stockBillLogItem); + } + } + + // 生成出入库明细信息 + stockBillLogService.generateStockLogOfOrderList(stockBillLogItems); + } + + /** + * 因为异常解锁,所以要删除库存记录 + * + * 库存锁定流程分析: + * 1.库存解锁发送mq后,扣除库存失败 - 无需处理 + * 2.库存解锁发送mq后,成功扣除库存,出库记录添加失败 - 还原库存和删除redis中的库存锁定明细记录 + * 3.库存解锁发送mq后,成功扣除库存,成功添加出库记录,订单创建失败 - 删除出库记录,还原库存和删除redis中的库存锁定明细记录 + * 4.库存解锁发送mq后,成功扣除库存,成功添加出库记录,订单创建后取消 - 添加入库记录,还原库存删除redis中的库存锁定明细记录 + * 5.库存解锁发送mq后,成功扣除库存,成功添加出库记录,订单支付成功 - 解锁库存、增加商品销量并删除redis中的库存锁定明细记录 + * + * 数据对应关系: + * 1.redis中查询锁定记录, 如果没有锁定记录就代表是上面的步骤1,无需处理 + * 2.mongodb中查询出库记录,如果没有出库记录,就是上面的步骤2,还原库存和删除redis中的库存锁定明细记录 + * 3.mongodb中查询出库记录,有出库记录但没有生成订单,就是上面的步骤3,删除出库记录、还原库存和删除redis中的库存锁定明细记录 + * 4.查询订单状态,如果订单已支付,就是上面的步骤5,还原库存、增加销量并删除redis中的库存锁定明细记录 + * 5.如果订单状态不是已取消且为待支付,就先不处理 + * + * 订单取消和订单退款时,会解锁库存,所以不在该方法处理 + * + * + */ + @Override + public void unlockStockByException(List skuStockList) { + if (CollUtil.isEmpty(skuStockList)) { + return; + } + // 先查询订单信息,判断订单状态 - 如果能查询到订单,代表库存扣除和出库记录都已成功 + Set orderSet = skuStockList.stream().map(SkuStockVO::getOrderId).collect(Collectors.toSet()); + // 从订单服务中查询订单信息 + List orderIds = new ArrayList<>(orderSet); + Map orderMap = orderFeignClient.listOrderByOrderIds(orderIds) + .stream().collect(Collectors.toMap(OrderVO::getOrderId, Function.identity())); + // 根据订单id对sku库存列表进行分组 + Map> orderStockMap = skuStockList.stream().collect(Collectors.groupingBy(SkuStockVO::getOrderId)); + // 订单支付成功的数据列表 + List paySuccessList = new ArrayList<>(); + // 创建失败的数据列表 + List createFailList = new ArrayList<>(); + // 未支付订单列表 + List unPayOrderIds = new ArrayList<>(); + // 处理的结束时间为前一天23点之前的订单 + long endTime = DateUtil.offsetHour(DateUtil.beginOfDay(new Date()), -1).getTime(); + orderIds.clear(); + // 获取sku库存记录 + // 提交订单时有事务,如果失败就是全部创建失败了,不存在一部分创建成功一部分创建失败的情况 + // 所以只要订单列表的数据不为空,就代表订单提交成功,以下是订单提交成功的处理 + for (Long orderId : orderStockMap.keySet()) { + List skuStocks = orderStockMap.get(orderId); + // 没有查到订单数据,代表订单创建失败,需要解锁库存和删除sku出入库记录 + if (!orderMap.containsKey(orderId)) { + orderIds.add(orderId); + this.addSkuStock(createFailList, skuStocks); + continue; + } + // 1.创建时间为23点之后的订单,先不用处理 + // 2.订单未支付,不处理-- 订单存在但未支付,此时距离订单提交已过去一个小时以上,而订单状态不取消也不支付,基本就是程序执行出问题了,所以等 + OrderVO orderVO = orderMap.get(orderId); + boolean unPay = !Objects.equals(orderVO.getIsPayed(), 1); + if (orderVO.getCreateTime().getTime() > endTime || unPay) { + if (unPay) { + unPayOrderIds.add(orderId); + } else { + LOG.info("订单创建时间不足一个小时,不处理,下单时间:{}", DateUtil.format(orderVO.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN)); + } + continue; + } + this.addSkuStock(paySuccessList, skuStocks); + } + System.out.println(); + + if (CollUtil.isNotEmpty(unPayOrderIds)) { + LOG.info("订单未支付,不处理,订单id:{}", unPayOrderIds); + } + + + if (CollUtil.isNotEmpty(paySuccessList)) { + // 解除锁定库存并添加销量 + String stock = stockManager.executeLuk(paySuccessList, StockManager.ORDER_BATCH_MAKER_USE_STOCK_BYTES); + if (!stock.contains(Constant.UNDERLINE)) { + throw new LuckException("解锁库存, 增加销量失败,数据异常:{}", stock); + } else { + LOG.info("解锁库存, 增加销量成功,数据:{}", stock); + } + } + + // ===================== 如果生成订单失败,为了库存记录和订单数据的一致性,需要解锁库存并删除相关的记录。 ===================== + if (CollUtil.isNotEmpty(createFailList)) { + // 删除sku入库记录 + stockBillLogService.removeByOrderIds(orderIds, StockBillType.PURCHASE_OUTBOUND.value()); + + // 解锁库存,并且将更新后的库存set到stockBillLogItems + // 解锁库存要放在最后执行,出入库记录又事务可以回滚, 但库存解锁是redis操作,无法回滚 + // 秒杀订单也会进入这里,但是因为没有生成对应的key,所以不用担心秒杀订单的库存解锁 + String stock = stockManager.executeLuk(createFailList, StockManager.ORDER_BATCH_UNLOCK_STOCK_BYTES); + if (!stock.contains(Constant.UNDERLINE)) { + throw new LuckException("解锁库存,增加可售库存失败,数据异常:{}", stock); + } else { + LOG.info("解锁库存,增加可售库存成功,sku数据:{}", stock); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void markerStockUse(List orderIds) { + // 获取订单数据 + List orderList = orderFeignClient.listOrderAndOrderItemByOrderIds(orderIds).getData(); + + // 区分sku和供应商sku,进行库存处理 + Map stockLockMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (OrderVO orderVO : orderList) { + for (OrderItemVO orderItem : orderVO.getOrderItems()) { + if (Objects.equals(orderItem.getSpuMold(), SpuMold.COMBO.value())) { + // 组合商品的主商品,不需要更改库存 + continue; + } + long skuId; + if (Objects.equals(orderVO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + // 供应发货的商品,库存操作使用供应商的skuId + skuId = orderItem.getSupplierSkuId(); + } else { + // 非供应商商品或者供应商商品的商家自行发货,skuId + skuId = orderItem.getSkuId(); + } + SkuStockLockBO skuStockLockBO = stockLockMap.get(skuId); + if (skuStockLockBO == null) { + skuStockLockBO = new SkuStockLockBO(); + skuStockLockBO.setSkuId(skuId); + skuStockLockBO.setOrderId(orderVO.getOrderId()); + skuStockLockBO.setStockCount(orderItem.getCount()); + skuStockLockBO.setStockPointId(orderItem.getStockPointId()); + stockLockMap.put(skuId, skuStockLockBO); + continue; + } + skuStockLockBO.setStockCount(orderItem.getCount() + skuStockLockBO.getStockCount()); + } + } + + // ==============库存扣除============= + if (MapUtil.isNotEmpty(stockLockMap)) { + String s = stockManager.makerUseStock(new ArrayList<>(stockLockMap.values())); + } + } + + private List listStringArrayBySkuStockLocks(List skuStockLocks) { + List stockList = new ArrayList<>(skuStockLocks.size()); + for (SkuStockLockDTO skuStockLock : skuStockLocks) { + stockList.add(StockUtil.loadQueryArray( + skuStockLock.getOrderId(), + Objects.isNull(skuStockLock.getWarehouseId()) ? StockManager.WAREHOUSE_ID : skuStockLock.getWarehouseId(), + skuStockLock.getSkuId(), + skuStockLock.getCount() + )); + } + return stockList; + } + private void addSkuStock(List list, List skuStocks) { + for (SkuStockVO skuStock : skuStocks) { + list.add(StockUtil.loadQueryArray(skuStock.getOrderId(), StockManager.WAREHOUSE_ID, skuStock.getSkuId(), skuStock.getStock())); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuAttrValueLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuAttrValueLangServiceImpl.java new file mode 100644 index 0000000..1ee1b22 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuAttrValueLangServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.mapper.SpuAttrValueLangMapper; +import com.tmerclub.cloud.product.model.SpuAttrValueLang; +import com.tmerclub.cloud.product.service.SpuAttrValueLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 属性值-国际化表 + * + * @author YXF + * @date 2021-04-15 16:47:33 + */ +@Service +public class SpuAttrValueLangServiceImpl implements SpuAttrValueLangService { + + @Autowired + private SpuAttrValueLangMapper spuAttrValueLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> spuAttrValueLangMapper.list()); + } + + @Override + public SpuAttrValueLang getBySpuAttrValueId(Long spuAttrValueId) { + return spuAttrValueLangMapper.getBySpuAttrValueId(spuAttrValueId); + } + + @Override + public void save(SpuAttrValueLang spuAttrValueLang) { + spuAttrValueLangMapper.save(spuAttrValueLang); + } + + @Override + public void update(SpuAttrValueLang spuAttrValueLang) { + spuAttrValueLangMapper.update(spuAttrValueLang); + } + + @Override + public void deleteById(Long spuAttrValueId) { + spuAttrValueLangMapper.deleteById(spuAttrValueId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuAttrValueServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuAttrValueServiceImpl.java new file mode 100644 index 0000000..cc5eb84 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuAttrValueServiceImpl.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.SerializeUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.constant.AttrType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.SpuAttrValueDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.mapper.AttrMapper; +import com.tmerclub.cloud.product.mapper.SpuAttrValueMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.SpuAttrValue; +import com.tmerclub.cloud.product.service.SpuAttrValueService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品规格属性关联信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SpuAttrValueServiceImpl implements SpuAttrValueService { + + @Autowired + private SpuAttrValueMapper spuAttrValueMapper; + @Autowired + private SpuMapper spuMapper; + @Autowired + private AttrMapper attrMapper; + + @Override + public void save(Long spuId, Long categoryId, List spuAttrValueDTOList, Integer sysType) { + List spuAttrValueList = setSpuAttrValueInfo(spuId, categoryId, spuAttrValueDTOList, sysType); + if (CollUtil.isEmpty(spuAttrValueList)) { + return; + } + spuAttrValueMapper.batchSave(spuAttrValueList); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateSpuByAttrValueIds(List attrValueList, Set attrValueIds) { + if (CollUtil.isEmpty(attrValueIds)) { + return; + } + List spuIds = spuAttrValueMapper.spuIdListByAttrValueIds(attrValueIds); + // 更新商品基本属性 + if (CollUtil.isNotEmpty(attrValueList)) { + spuAttrValueMapper.batchUpdateSpuAttrValue(attrValueList); + } + if (CollUtil.isNotEmpty(spuIds)) { + spuMapper.updateSpuUpdateTime(spuIds, null, null, null); + } + } + + + @Override + public void update(Long spuId, Long categoryId, Integer supplierSpuType, List spuAttrValues) { + List dbSpuAttrValues = getSpuAttrsBySpuId(spuId); + if (CollUtil.isEmpty(dbSpuAttrValues) && CollUtil.isEmpty(spuAttrValues)) { + return; + } + // 预防空指针 + if (Objects.isNull(spuAttrValues)) { + spuAttrValues = new ArrayList<>(Constant.INITIAL_CAPACITY); + } else if (Objects.isNull(dbSpuAttrValues)) { + dbSpuAttrValues = new ArrayList<>(0); + } + // 根据key(attrId:attrValueId) 来筛选数据 + Map dbSpuAttrValueMap = dbSpuAttrValues.stream() + .collect(Collectors.toMap(spuAttrValueVO -> spuAttrValueVO.getAttrId() + Constant.COLON + spuAttrValueVO.getAttrValueId(), attr -> attr)); + Map spuAttrValueMap = spuAttrValues.stream() + .collect(Collectors.toMap(spuAttrValueDTO -> spuAttrValueDTO.getAttrId() + Constant.COLON + spuAttrValueDTO.getAttrValueId(), attr -> attr)); + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 分别筛选出新增、更新的数据 + for (String key : spuAttrValueMap.keySet()) { + SpuAttrValueDTO spuAttrValueDTO = spuAttrValueMap.get(key); + // 新数据-保存 + if (!dbSpuAttrValueMap.containsKey(key)) { + saveList.add(spuAttrValueMap.get(key)); + continue; + } + // 已有数据且属性值不为空-更新 + if (dbSpuAttrValueMap.containsKey(key) && StrUtil.isNotBlank(spuAttrValueDTO.getAttrValueName())) { + updateList.add(spuAttrValueMap.get(key)); + dbSpuAttrValueMap.remove(key); + } + } + // 删除商品属性 + List deleteAttrIds; + if (MapUtil.isNotEmpty(dbSpuAttrValueMap)) { + deleteAttrIds = dbSpuAttrValueMap.values().stream().map(SpuAttrValueVO::getAttrId).collect(Collectors.toList()); + spuAttrValueMapper.deleteBatchBySpuIdAndAttrIds(spuId, deleteAttrIds); + } + // 保存商品属性 + List spuAttrValueList = setSpuAttrValueInfo(spuId, categoryId, saveList, null); + if (CollUtil.isNotEmpty(spuAttrValueList)) { + spuAttrValueMapper.batchSave(spuAttrValueList); + } + // 更新商品属性 + List updateSpuAttrValueLis = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (CollUtil.isNotEmpty(updateList)) { + updateSpuAttrValueLis = setSpuAttrValueInfo(spuId, categoryId, updateList, null); + spuAttrValueMapper.batchUpdate(updateSpuAttrValueLis); + } + if (Objects.equals(supplierSpuType, SupplierSpuType.YES.value())) { + // 同步更新代销商品的商品属性 + List attrValueList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List supIdListBySupplierId = spuMapper.getSupIdListBySupplierId(spuId); + for (Long aLong : supIdListBySupplierId) { + spuAttrValueMapper.deleteBySpuId(aLong); + for (SpuAttrValue spuAttrValue : spuAttrValueList) { + spuAttrValue.setSpuId(aLong); + attrValueList.add(SerializeUtil.clone(spuAttrValue)); + spuAttrValue.setSpuId(aLong); + } + for (SpuAttrValue spuAttrValue : updateSpuAttrValueLis) { + spuAttrValue.setSpuId(aLong); + attrValueList.add(SerializeUtil.clone(spuAttrValue)); + } + + } + // 保存属性 + if (CollUtil.isNotEmpty(attrValueList)) { + spuAttrValueMapper.batchSave(attrValueList); + } + } + } + + + @Override + public void deleteBySpuId(Long spuId) { + spuAttrValueMapper.deleteBySpuId(spuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteUnionDataByAttId(Long attrId, List attrValueIds) { + if (CollUtil.isEmpty(attrValueIds)) { + return; + } + List spuIds = spuAttrValueMapper.spuIdListByAttrValueIds(attrValueIds); + spuAttrValueMapper.deleteByAttId(attrId, attrValueIds); + if (CollUtil.isNotEmpty(spuIds)) { + spuMapper.updateSpuUpdateTime(spuIds, null, null, null); + } + } + + @Override + public void deleteByCategoryIds(Long attrId, List categoryIds) { + if (CollUtil.isEmpty(categoryIds)) { + return; + } + spuAttrValueMapper.deleteByCategoryIds(attrId, categoryIds); + if (CollUtil.isNotEmpty(categoryIds)) { + spuMapper.updateSpuUpdateTime(null, categoryIds, null, null); + } + } + + @Override + public List getSpuAttrsBySpuId(Long spuId) { + return spuAttrValueMapper.getSpuAttrsBySpuId(spuId); + } + + /** + * 为商品属性插入国际化信息 + * + * @param spuId 商品id + * @param categoryId 分类id(用于获取完整的属性信息) + * @param spuAttrValues 需要插入国际化信息的属性列表 + * @return + */ + private List setSpuAttrValueInfo(Long spuId, Long categoryId, List spuAttrValues, Integer sysType) { + if (CollUtil.isEmpty(spuAttrValues)) { + return new ArrayList<>(0); + } + if (Objects.isNull(sysType)) { + sysType = AuthUserContext.get().getSysType(); + } + List dbAttrList = attrMapper.getAttrsByCategoryIdAndAttrType(AttrType.BASIC.value(), categoryId, null, sysType); + Map dbAttrMap = dbAttrList.stream().collect(Collectors.toMap(AttrVO::getAttrId, a -> a)); + List spuAttrValueList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuAttrValueDTO spuAttrValueDTO : spuAttrValues) { + // 不保存属性值为空的数据 + if (StrUtil.isBlank(spuAttrValueDTO.getAttrValueName())) { + continue; + } + AttrVO dbAttr = dbAttrMap.get(spuAttrValueDTO.getAttrId()); + // 属性值为输入的数据,没有属性值的国际化信息, 设为通用语言 + boolean isShare = (Objects.isNull(spuAttrValueDTO.getAttrId()) && Objects.isNull(spuAttrValueDTO.getAttrValueId())) || Objects.isNull(dbAttr); + if (isShare) { + SpuAttrValue spuAttrValue = BeanUtil.map(spuAttrValueDTO, SpuAttrValue.class); + spuAttrValue.setSpuId(spuId); + spuAttrValue.setLang(LanguageEnum.LANGUAGE_ZH_CN.getLang()); + spuAttrValueList.add(spuAttrValue); + continue; + } + // 插入中英文国际化信息 + SpuAttrValue spuAttrValueZh = BeanUtil.map(spuAttrValueDTO, SpuAttrValue.class); + SpuAttrValue spuAttrValueEn = BeanUtil.map(spuAttrValueDTO, SpuAttrValue.class); + //属性国际化信息 + for (AttrLangVO attrLangVO : dbAttr.getAttrLangList()) { + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), attrLangVO.getLang())) { + spuAttrValueZh.setSpuId(spuId); + spuAttrValueZh.setLang(LanguageEnum.LANGUAGE_ZH_CN.getLang()); + spuAttrValueZh.setAttrName(attrLangVO.getName()); + spuAttrValueZh.setAttrDesc(attrLangVO.getDesc()); + spuAttrValueList.add(spuAttrValueZh); + continue; + } + spuAttrValueEn.setSpuId(spuId); + spuAttrValueEn.setLang(LanguageEnum.LANGUAGE_EN.getLang()); + spuAttrValueEn.setAttrName(attrLangVO.getName()); + spuAttrValueEn.setAttrDesc(attrLangVO.getDesc()); + spuAttrValueList.add(spuAttrValueEn); + } + if (Objects.isNull(spuAttrValueDTO.getAttrValueId())) { + continue; + } + // 属性值国际化信息 + Map attrValueMap = dbAttr.getAttrValues().stream() + .filter(attrValueVO -> Objects.equals(spuAttrValueDTO.getAttrValueId(), attrValueVO.getAttrValueId())) + .collect(Collectors.toMap(AttrValueVO::getAttrValueId, a -> a)); + AttrValueVO attrValueVO = attrValueMap.get(spuAttrValueDTO.getAttrValueId()); + if (Objects.isNull(attrValueVO)) { + continue; + } + for (AttrValueLangVO attrValueLang : attrValueVO.getValues()) { + if (Objects.equals(LanguageEnum.LANGUAGE_ZH_CN.getLang(), attrValueLang.getLang())) { + spuAttrValueZh.setAttrValueName(attrValueLang.getValue()); + continue; + } + spuAttrValueEn.setAttrValueName(attrValueLang.getValue()); + } + } + return spuAttrValueList; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuBrowseLogServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuBrowseLogServiceImpl.java new file mode 100644 index 0000000..acd9345 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuBrowseLogServiceImpl.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.bo.mongo.MongoSpuBrowseLogBO; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.dto.SpuBrowseLogDTO; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.SpuBrowseLog; +import com.tmerclub.cloud.product.service.SpuBrowseLogService; +import com.tmerclub.cloud.product.vo.SpuBrowseLogVO; +import com.tmerclub.cloud.product.vo.mongo.MongoSpuBrowseLogVO; +import com.mongodb.client.result.UpdateResult; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品浏览记录表 + * + * @author YXF + * @date 2021-03-19 14:28:14 + */ +@Service +public class SpuBrowseLogServiceImpl implements SpuBrowseLogService { + private static final Logger logger = LoggerFactory.getLogger(SpuBrowseLogServiceImpl.class); + + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private SpuMapper spuMapper; + @Autowired + private MongoPageUtil mongoPageUtil; + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + List selectSpuIds = spuMapper.listSpuIdsByExcludeStatus(StatusEnum.DELETE.value()); + Query query = new Query(); + query.addCriteria(Criteria.where("userId").is(AuthUserContext.get().getUserId()) + .and("status").is(StatusEnum.ENABLE.value()) + .and("spuId").in(selectSpuIds)); + query.with(Sort.by(Sort.Direction.DESC, "updateTime")); + PageVO mongoSpuBrowseLogPage = mongoPageUtil.doPage(MongoSpuBrowseLogBO.class, pageDTO, query); + + // 处理商品分页列表 + PageVO pageVO = new PageVO<>(); + pageVO.setPages(mongoSpuBrowseLogPage.getPages()); + pageVO.setTotal(mongoSpuBrowseLogPage.getTotal()); + pageVO.setList(new ArrayList<>(Constant.INITIAL_CAPACITY)); + if (CollUtil.isEmpty(mongoSpuBrowseLogPage.getList())) { + return pageVO; + } + List spuIds = mongoSpuBrowseLogPage.getList().stream().map(MongoSpuBrowseLogBO::getSpuId).collect(Collectors.toList()); + ServerResponseEntity> spuResponse = searchSpuFeignClient.listSpuBySpuIds(spuIds); + Map spuMap = spuResponse.getData().stream().collect(Collectors.toMap(SpuSearchVO::getSpuId, s -> s)); + for (MongoSpuBrowseLogBO mongoSpuBrowseLogBO : mongoSpuBrowseLogPage.getList()) { + if (!spuMap.containsKey(mongoSpuBrowseLogBO.getSpuId())) { + continue; + } + SpuBrowseLogVO spuBrowseLogVO = new SpuBrowseLogVO(); + spuBrowseLogVO.setSpuId(mongoSpuBrowseLogBO.getSpuId()); + SpuSearchVO spuSearchVO = spuMap.get(spuBrowseLogVO.getSpuId()); + spuBrowseLogVO.setSpuStatus(spuSearchVO.getSpuStatus()); + spuBrowseLogVO.setMainImgUrl(spuSearchVO.getMainImgUrl()); + spuBrowseLogVO.setSpuName(spuSearchVO.getSpuName()); + spuBrowseLogVO.setSpuType(spuSearchVO.getSpuType()); + spuBrowseLogVO.setScoreFee(spuSearchVO.getScoreFee()); + spuBrowseLogVO.setPriceFee(spuSearchVO.getPriceFee()); + spuBrowseLogVO.setBrowseTime(mongoSpuBrowseLogBO.getUpdateTime()); + spuBrowseLogVO.setSpuBrowseLogId(mongoSpuBrowseLogBO.getSpuBrowseLogId()); + pageVO.getList().add(spuBrowseLogVO); + } + return pageVO; + } + + @Override + public void save(MongoSpuBrowseLogBO spuBrowseLog) { + Long spuBrowseLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_SPU_BROWSE_LOG); + spuBrowseLog.setSpuBrowseLogId(spuBrowseLogId); + spuBrowseLog.setCreateTime(new Date()); + spuBrowseLog.setUpdateTime(new Date()); + spuBrowseLog.setStatus(StatusEnum.ENABLE.value()); + mongoTemplate.insert(spuBrowseLog); + } + + @Override + public void updateStatus(MongoSpuBrowseLogBO spuBrowseLog) { + Update update = new Update(); + update.set("status", spuBrowseLog.getStatus()); + update.set("updateTime", new Date()); + Query query = new Query(); + query.addCriteria(Criteria.where("spuBrowseLogId").is(spuBrowseLog.getSpuBrowseLogId())); + if (Objects.nonNull(spuBrowseLog.getUserId())) { + query.addCriteria(Criteria.where("userId").is(spuBrowseLog.getUserId())); + } + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoSpuBrowseLogBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public void delete(SpuBrowseLogDTO spuBrowseLogDTO) { + if (CollUtil.isEmpty(spuBrowseLogDTO.getSpuBrowseLogIds())) { + return; + } + Long userId = AuthUserContext.get().getUserId(); + Query query = new Query(); + query.addCriteria(Criteria.where("spuBrowseLogId").in(spuBrowseLogDTO.getSpuBrowseLogIds())); + query.addCriteria(Criteria.where("userId").is(userId)); + Update update = new Update(); + update.set("status", StatusEnum.DELETE.value()); + UpdateResult updateResult = mongoTemplate.updateMulti(query, update, MongoSpuBrowseLogBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + public Long recommendCategoryId(Integer spuType) { + if (Objects.isNull(spuType)) { + spuType = SpuType.NORMAL.value(); + } + // 过滤 + Criteria criteria = Criteria.where("status").is(StatusEnum.ENABLE.value()) + .and("userId").is(AuthUserContext.get().getUserId()) + .and("spuType").is(spuType); + // 更新时间倒序 + SortOperation updateTimeSort = Aggregation.sort(Sort.Direction.DESC, "updateTime"); + // 使用商品浏览记录进行推荐时,使用的数据数量 + LimitOperation limitOperation = Aggregation.limit(Constant.MAX_SPU_BROWSE_NUM); + // 分组 + GroupOperation groupOperation = Aggregation.group("categoryId") + .count().as("num") + .last("categoryId").as("categoryId"); + // 分类数倒序 + SortOperation numSort = Aggregation.sort(Sort.Direction.DESC, "num"); + // 只获取一个结果 + LimitOperation one = Aggregation.limit(1); + ProjectionOperation projectionOperation = Aggregation.project("num", "categoryId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoSpuBrowseLogBO.class, + Aggregation.match(criteria), + updateTimeSort, + limitOperation, + groupOperation, + numSort, + one, + projectionOperation + ); + logger.info("recommendCategoryId()的mongodb查询语句: {}", typedAggregation); + // 执行聚合操作 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoSpuBrowseLogVO.class); + // 取出最终结果 + List spuBrowseLogList = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(spuBrowseLogList)) { + return null; + } + return spuBrowseLogList.get(0).getCategoryId(); + } + + @Override + public SpuBrowseLog getCurrentLogBySpuIdAndUserId(SpuBrowseLogDTO spuBrowseLogDTO) { + Query query = new Query(); + query.addCriteria(Criteria.where("userId").is(spuBrowseLogDTO.getUserId()) + .and("spuId").is(spuBrowseLogDTO.getSpuId()) + .and("spuType").is(spuBrowseLogDTO.getSpuType()) + .and("createTime").lte(new Date())); + MongoSpuBrowseLogBO spuBrowseLogBO = mongoTemplate.findOne(query, MongoSpuBrowseLogBO.class); + return BeanUtil.map(spuBrowseLogBO, SpuBrowseLog.class); + } + + @Override + public List recentBrowse(Long userId, Long shopId) { + List spuIds = spuMapper.listSpuIdByShopIdsAndStatus(SysTypeEnum.MULTISHOP.value(), Collections.singletonList(shopId), null, StatusEnum.DELETE.value()); + Criteria criteria = new Criteria(); + criteria.and("status").is(StatusEnum.ENABLE.value()) + .and("userId").is(userId) + .and("spuId").in(spuIds); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "updateTime"); + LimitOperation limitOperation = Aggregation.limit(3); + Aggregation aggregation = Aggregation.newAggregation( + Aggregation.match(criteria), + sortOperation, + limitOperation + ); + logger.info("recentBrowse()的mongodb查询语句: {}", aggregation); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoSpuBrowseLogBO.class, MongoSpuBrowseLogBO.class); + List spuBrowseLogList = aggregate.getMappedResults(); + if (CollUtil.isEmpty(spuBrowseLogList)) { + return new ArrayList<>(0); + } + return spuBrowseLogList.stream().map(MongoSpuBrowseLogBO::getSpuId).collect(Collectors.toList()); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuCollectionServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuCollectionServiceImpl.java new file mode 100644 index 0000000..1b7de6c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuCollectionServiceImpl.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SpuAppVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.mapper.SpuCollectionMapper; +import com.tmerclub.cloud.product.model.SpuCollection; +import com.tmerclub.cloud.product.service.SpuCollectionService; +import com.tmerclub.cloud.product.service.SpuService; +import com.tmerclub.cloud.product.vo.SpuCollectionVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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 FrozenWatermelon + * @date 2020-11-21 14:43:16 + */ +@Service +public class SpuCollectionServiceImpl implements SpuCollectionService { + + @Autowired + private SpuCollectionMapper spuCollectionMapper; + + @Autowired + private SpuService spuService; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> spuCollectionMapper.list()); + } + + @Override + public SpuCollectionVO getById(Long id) { + return spuCollectionMapper.getById(id); + } + + @Override + public void save(SpuCollection spuCollection) { + spuCollectionMapper.save(spuCollection); + } + + @Override + public void update(SpuCollection spuCollection) { + spuCollectionMapper.update(spuCollection); + } + + @Override + public void deleteById(Long id) { + spuCollectionMapper.deleteById(id); + } + + @Override + public int userCollectionCount(Long spuId, Long userId) { + return spuCollectionMapper.userCollectionCount(spuId, userId); + } + + @Override + public PageVO getUserCollectionDtoPageByUserId(PageDTO pageDTO, Long userId, String spuName, Integer prodType) { + return PageUtil.doPage(pageDTO, () -> spuCollectionMapper.getUserCollectionDtoPageByUserId(userId, spuName, I18nMessage.getLang(), prodType)); + } + + @Override + public void deleteBySpuIdAndUserId(Long spuId, Long userId) { + spuCollectionMapper.deleteUserCollection(spuId, null, userId); + } + + @Override + public void spuBatchCollection(List spuIdList) { + Long userId = AuthUserContext.get().getUserId(); + List spuIds = spuCollectionMapper.hasCollection(spuIdList, userId); + spuIdList.removeAll(spuIds); + if (CollectionUtil.isEmpty(spuIdList)) { + return; + } + // 过滤活动商品 + List spuVOList = spuService.getBySpuIds(spuIdList); + for (SpuVO spuVO : spuVOList) { + if (Objects.equals(spuVO.getSpuType(), SpuType.ACTIVE.value())) { + logger.info("活动商品不可收藏,spuId:{}", spuVO.getSpuId()); + spuIdList.remove(spuVO.getSpuId()); + } + } + spuCollectionMapper.saveBatch(spuIdList, userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteBatchBySpuIdsAndUserId(List spuIds, Long userId) { + boolean remove = false; + for (Long spuId : spuIds) { + if (Objects.isNull(spuService.getBySpuId(spuId))) { + continue; + } + if (userCollectionCount(spuId, userId) > 0) { + deleteBySpuIdAndUserId(spuId, userId); + } + } + } + + @Override + public void deleteBySpuId(Long spuId) { + spuCollectionMapper.deleteBySpuId(spuId); + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuEsSearchServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuEsSearchServiceImpl.java new file mode 100644 index 0000000..5a9561f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuEsSearchServiceImpl.java @@ -0,0 +1,311 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.api.group.feign.GroupFeignClient; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.seckill.vo.SeckillApiVO; +import com.tmerclub.cloud.api.supplier.bo.SupplierDetailBO; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.bo.*; +import com.tmerclub.cloud.common.product.constant.CommissionSpuStatus; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierDeliveryType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.SpuExtension; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.service.*; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品es信息处理 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SpuEsSearchServiceImpl implements SpuEsSearchService { + + private static final Logger LOG = LoggerFactory.getLogger(SpuEsSearchServiceImpl.class); + + @Autowired + private SpuMapper spuMapper; + @Autowired + private SpuExtensionService spuExtensionService; + @Autowired + private SpuCommService spuCommService; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private SkuService skuService; + @Autowired + private BrandService brandService; + @Autowired + private CategoryService categoryService; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private GroupFeignClient groupFeignClient; + @DubboReference + private SeckillFeignClient seckillFeignClient; + @DubboReference + private DistributionFeignClient distributionFeignClient; + + @Override + public EsProductBO loadEsProductBO(Long spuId) { + // 获取商品 + EsProductBO esProductBO = spuMapper.loadEsProductBO(spuId); + // 插入模糊搜索的商品名称 + esProductBO.setSpuNameLikeZh(esProductBO.getSpuNameZh()); + esProductBO.setSpuNameLikeEn(esProductBO.getSpuNameEn()); + // 获取sku的销量和库存 + boolean supplierDelivery = Objects.equals(esProductBO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value()) && + Objects.equals(esProductBO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value()); + List skuList; + if (supplierDelivery) { + // 代销商品且是供应商发货, 查询供应商商品的sku列表 + skuList = skuService.listSkuWithAttrBySpuId(esProductBO.getSupplierSpuId()); + } else { + skuList = skuService.listSkuWithAttrBySpuId(esProductBO.getSpuId()); + } + + //获取sku信息 + skuService.setEsSkuStock(skuList); + // 商品编码、商品条形码列表信息 + Set partyCodes = new HashSet<>(Constant.INITIAL_CAPACITY); + Set modelIds = new HashSet<>(Constant.INITIAL_CAPACITY); + int stockWarning = 0; + int stock = 0; + int saleNum = 0; + for (SkuVO skuVO : skuList) { + stockWarning += Objects.isNull(skuVO.getStockWarning()) ? 0 : skuVO.getStockWarning(); + stock += Objects.isNull(skuVO.getStock()) ? 0: skuVO.getStock(); + saleNum += Objects.isNull(skuVO.getSaleNum()) ? 0: skuVO.getSaleNum(); + if (StrUtil.isNotBlank(skuVO.getPartyCode())) { + partyCodes.add(skuVO.getPartyCode()); + } + if (StrUtil.isNotBlank(skuVO.getModelId())) { + modelIds.add(skuVO.getModelId()); + } + } + // 配送方式 + esProductBO.setDeliveryMode(Json.parseObject(esProductBO.getDeliveryModeVO(), EsDeliveryModeBO.class)); + // 商品库存 + esProductBO.setStock(stock); + // 商品销量 + esProductBO.setActualSoldNum(saleNum); + esProductBO.setHasStock(stock > 0); + esProductBO.setStockWarning(stockWarning); + // 编码和条形码 + esProductBO.setPartyCodes(partyCodes); + esProductBO.setModelIds(modelIds); + //代销商品 + if (Objects.equals(esProductBO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value())) { + //如果是代销商品获取供应商名称 + ServerResponseEntity supplier = supplierDetailFeignClient.getSupplierBySupplierId(esProductBO.getSupplierId()); + if (!Objects.isNull(supplier.getData())) { + //防止空指针异常 + esProductBO.setSupplierName(supplier.getData().getSupplierName()); + } + //设置设置代销商品状态 + if (esProductBO.getSpuStatus() == 1) { + //1:上架 2: 部分上架 + //判断skuChoiceStatus是否 == 1:全选 + esProductBO.setCommissionSpuStatus(esProductBO.getSkuChoiceStatus() == 1 ? CommissionSpuStatus.PUT_SHELF.value() : CommissionSpuStatus.PART_PUT_SHELF.value()); + } + if (esProductBO.getSpuStatus() == 0) { + //3: 下架 4: 部分下架 + //判断skuChoiceStatus是否 == 1:全选 + esProductBO.setCommissionSpuStatus(esProductBO.getSkuChoiceStatus() == 1 ? CommissionSpuStatus.OFF_SHELF.value() : CommissionSpuStatus.PART_OFF_SHELF.value()); + } + } + if (Objects.equals(esProductBO.getSpuStatus(), StatusEnum.ENABLE.value())) { + esProductBO.setAppDisplay(Boolean.TRUE); + } else { + esProductBO.setAppDisplay(Boolean.FALSE); + } + // 获取分类、品牌、评论、库存、属性信息 + this.setEsProductInfo(esProductBO); + // 团购活动商品,添加活动时间 + if (Objects.equals(esProductBO.getSpuType(), SpuType.GROUP.value())) { + ServerResponseEntity responseEntity = groupFeignClient.getActivityStartTime(esProductBO.getActivityId()); + if (Objects.nonNull(responseEntity.getData())) { + esProductBO.setActivityStartTime(responseEntity.getData().getTime()); + } + } + // 秒杀活动商品,添加活动时间,秒杀分类,并添加批次信息 + if (Objects.equals(esProductBO.getSpuType(), SpuType.SECKILL.value())) { + ServerResponseEntity responseEntity = seckillFeignClient.getSeckillInfoById(esProductBO.getActivityId()); + SeckillApiVO seckillApiVO = responseEntity.getData(); + esProductBO.setActivityStartTime(seckillApiVO.getStartTime().getTime()); + esProductBO.setSelectedLot(seckillApiVO.getSelectedLot()); + esProductBO.setSeckillCategoryId(seckillApiVO.getCategoryId()); + } + // 分销信息,添加是否属于分销商品,添加分销参数 + try { + ServerResponseEntity distributionRes = distributionFeignClient.getBySpuId(spuId); + if (!distributionRes.isSuccess()) { + esProductBO.setDistributionSpu(Boolean.FALSE); + return esProductBO; + } + DistributionSpuVO distributionProdVO = distributionRes.getData(); + if (Objects.isNull(distributionProdVO)) { + esProductBO.setDistributionSpu(Boolean.FALSE); + } else { + esProductBO.setDistributionSpu(Boolean.TRUE); + EsDistributionInfoBO esDistributionInfoBO = new EsDistributionInfoBO(); + esDistributionInfoBO.setDistributionSpuId(distributionProdVO.getDistributionSpuId()); + esDistributionInfoBO.setAwardMode(distributionProdVO.getAwardMode()); + esDistributionInfoBO.setState(distributionProdVO.getState()); + esDistributionInfoBO.setParentAwardSet(distributionProdVO.getParentAwardSet()); + esDistributionInfoBO.setAwardNumbers(distributionProdVO.getAwardNumbers()); + esDistributionInfoBO.setParentAwardNumbers(distributionProdVO.getParentAwardNumbers()); + esProductBO.setDistributionInfo(esDistributionInfoBO); + } + } catch (Exception e) { + return esProductBO; + } + return esProductBO; + } + + + /** + * 获取分类、品牌、评论、库存、属性信息 + * + * @param esProductBO 商品信息 + */ + private void setEsProductInfo(EsProductBO esProductBO) { + + // 获取品牌 + EsBrandBO brand = brandService.getEsBrandBO(esProductBO); + esProductBO.setBrand(brand); + // 分类数据 + this.setCategory(esProductBO); + // 好评数量 + esProductBO.setGoodReviewNum(spuCommService.countGoodReview(esProductBO.getSpuId())); + SpuExtension spuExtension = getSpuExtension(esProductBO); + + esProductBO.setWaterSoldNum(spuExtension.getWaterSoldNum()); + esProductBO.setSaleNum(esProductBO.getWaterSoldNum() + esProductBO.getActualSoldNum()); + esProductBO.setCommentNum(spuExtension.getCommentNum()); + + // 获取属性 + List spuAttrsBySpuId = spuAttrValueService.getSpuAttrsBySpuId(esProductBO.getSpuId()); + List attrs = spuAttrsBySpuId.stream().filter(spuAttrValueVO -> + Objects.nonNull(spuAttrValueVO.getSearchType()) && Objects.equals(spuAttrValueVO.getSearchType(), 1)).toList(); + List esAttrBOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuAttrValueVO attr : attrs) { + EsAttrBO esAttrBO = new EsAttrBO(); + esAttrBO.setAttrId(attr.getAttrId()); + esAttrBO.setAttrValueId(attr.getAttrValueId()); + // 国际化信息 + Map spuAttrValueLangMap = attr.getSpuAttrValueLangList().stream() + .collect(Collectors.toMap(SpuAttrValueLangVO::getLang, s -> s)); + // 中文信息 + SpuAttrValueLangVO spuAttrValueZh = spuAttrValueLangMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang()); + esAttrBO.setAttrNameZh(spuAttrValueZh.getAttrName()); + esAttrBO.setAttrValueNameZh(spuAttrValueZh.getAttrValueName()); + // 英文信息 + SpuAttrValueLangVO spuAttrValueEn = spuAttrValueLangMap.get(LanguageEnum.LANGUAGE_EN.getLang()); + if (Objects.nonNull(spuAttrValueEn)) { + esAttrBO.setAttrNameEn(spuAttrValueEn.getAttrName()); + esAttrBO.setAttrValueNameEn(spuAttrValueEn.getAttrValueName()); + } + esAttrBOList.add(esAttrBO); + } + esProductBO.setAttrs(esAttrBOList); + } + + private void setCategory(EsProductBO esProductBO) { + if (!Objects.equals(esProductBO.getSpuType(), SpuType.SCORE.value())) { + // 获取平台分类数据 + CategoryVO category = categoryService.getInfo(esProductBO.getCategoryId()); + if (Objects.isNull(category)) { + LOG.error("商品id:" + esProductBO.getSpuId() + "绑定的分类不存在"); + return; + } + List categories = category.getCategories(); + //平台三级分类名称 + String threeCategory = category.getCategoryLangList().get(0).getName(); + //平台二级分类名称 + String twoCategory = categories.get(1).getName(); + //平台一级分类名称 + String oneCategory = categories.get(0).getName(); + String categoryNames = oneCategory + "/" + twoCategory + "/" + threeCategory; + esProductBO.setCategoryNames(categoryNames); + esProductBO.setPrimaryCategoryId(categories.get(0).getCategoryId()); + esProductBO.setSecondaryCategoryId(categories.get(1).getCategoryId()); + // 平台三级分类信息 + esProductBO.setCategory(handleCategory(category)); + if (esProductBO.getAppDisplay() && !Objects.equals(category.getStatus(), StatusEnum.ENABLE.value())) { + esProductBO.setAppDisplay(Boolean.FALSE); + } + // 获取店铺分类数据 + if (Objects.nonNull(esProductBO.getShopCategoryId()) && !Objects.equals(esProductBO.getShopCategoryId(), -1L) && !Objects.equals(esProductBO.getShopCategoryId(), Constant.DEFAULT_ID)) { + CategoryVO shopCategory = categoryService.getInfo(esProductBO.getShopCategoryId()); + if (Objects.isNull(shopCategory)) { + throw new LuckException("商品id:" + esProductBO.getSpuId() + "绑定的店铺分类不存在"); + } + esProductBO.setShopPrimaryCategoryId(shopCategory.getCategories().get(0).getCategoryId()); + // 店铺二级分类信息 + esProductBO.setShopCategory(handleCategory(shopCategory)); + + if (esProductBO.getAppDisplay() && !Objects.equals(shopCategory.getStatus(), StatusEnum.ENABLE.value())) { + esProductBO.setAppDisplay(Boolean.FALSE); + } + } + } + } + + private SpuExtension getSpuExtension(EsProductBO esProductBO) { + SpuExtension spuExtension; + if (Objects.equals(esProductBO.getSupplierDeliveryType(), SupplierDeliveryType.SUPPLIER_DELIVERY.value())) { + spuExtension = spuExtensionService.getBySpuId(esProductBO.getSupplierSpuId()); + } else { + spuExtension = spuExtensionService.getBySpuId(esProductBO.getSpuId()); + } + return spuExtension; + } + + /** + * 处理分类数据 + * + * @param category + * @return + */ + private EsCategoryBO handleCategory(CategoryVO category) { + EsCategoryBO categoryBO = new EsCategoryBO(); + categoryBO.setCategoryId(category.getCategoryId()); + Map categoryMap = category.getCategoryLangList().stream().collect(Collectors.toMap(CategoryLangVO::getLang, CategoryLangVO::getName)); + categoryBO.setCategoryNameZh(categoryMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + categoryBO.setCategoryNameEn(categoryMap.get(LanguageEnum.LANGUAGE_EN.getLang())); + return categoryBO; + } + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSkuAttrValueLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSkuAttrValueLangServiceImpl.java new file mode 100644 index 0000000..e70c521 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSkuAttrValueLangServiceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.product.mapper.SpuSkuAttrValueLangMapper; +import com.tmerclub.cloud.product.model.SpuSkuAttrValueLang; +import com.tmerclub.cloud.product.service.SpuSkuAttrValueLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 商品sku销售属性关联信息-国际化 + * + * @author YXF + * @date 2021-04-09 17:08:38 + */ +@Service +public class SpuSkuAttrValueLangServiceImpl implements SpuSkuAttrValueLangService { + + @Autowired + private SpuSkuAttrValueLangMapper spuSkuAttrValueLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> spuSkuAttrValueLangMapper.list()); + } + + @Override + public SpuSkuAttrValueLang getBySpuSkuAttrId(Long spuSkuAttrId) { + return spuSkuAttrValueLangMapper.getBySpuSkuAttrId(spuSkuAttrId); + } + + @Override + public void save(SpuSkuAttrValueLang spuSkuAttrValueLang) { + spuSkuAttrValueLangMapper.save(spuSkuAttrValueLang); + } + + @Override + public void update(SpuSkuAttrValueLang spuSkuAttrValueLang) { + spuSkuAttrValueLangMapper.update(spuSkuAttrValueLang); + } + + @Override + public void deleteById(Long spuSkuAttrId) { + spuSkuAttrValueLangMapper.deleteById(spuSkuAttrId); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuStockServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuStockServiceImpl.java new file mode 100644 index 0000000..b737e5b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuStockServiceImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.product.service.SkuStockService; +import com.tmerclub.cloud.product.service.SpuStockService; +import com.tmerclub.cloud.product.task.ProductTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 库存信息 + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +@Service +public class SpuStockServiceImpl implements SpuStockService { + private static final Logger log = LoggerFactory.getLogger(ProductTask.class); + + @Autowired + private SkuStockService skuStockService; + + @Override + public void setSpuStock(List list) { + if (CollUtil.isEmpty(list)) { + return ; + } + List spuIds = list.stream().map(SpuVO::getSpuId).collect(Collectors.toList()); + log.info("SpuStockServiceImpl.setSpuStock(): spuIds: {}", spuIds); + Map spuStockMap = skuStockService.spuStockMapBySpuIds(spuIds); + for (SpuVO spuVO : list) { + spuVO.setTotalStock(spuStockMap.getOrDefault(spuVO.getSpuId(), Constant.ZERO_INTEGER)); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSupplierChangeLogServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSupplierChangeLogServiceImpl.java new file mode 100644 index 0000000..375e227 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuSupplierChangeLogServiceImpl.java @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.api.multishop.feign.ShopSubstituteSalesFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.product.constant.ContentKey; +import com.tmerclub.cloud.common.product.constant.ContentValue; +import com.tmerclub.cloud.common.product.constant.SpuStatus; +import com.tmerclub.cloud.common.product.constant.SupplierSpuChangeType; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.common.vo.ShopSubstituteSalesVO; +import com.tmerclub.cloud.product.dto.SpuSupplierChangeLogDTO; +import com.tmerclub.cloud.product.mapper.SkuLangMapper; +import com.tmerclub.cloud.product.mapper.SkuMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.mapper.SpuSupplierChangeLogMapper; +import com.tmerclub.cloud.product.model.Sku; +import com.tmerclub.cloud.product.model.SpuSupplierChangeLog; +import com.tmerclub.cloud.product.service.SkuService; +import com.tmerclub.cloud.product.service.SpuAttrValueService; +import com.tmerclub.cloud.product.service.SpuExtensionService; +import com.tmerclub.cloud.product.service.SpuSupplierChangeLogService; +import com.tmerclub.cloud.product.vo.SpuSupplierChangeLogVO; +import org.apache.dubbo.config.annotation.DubboReference; +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.Objects; +import java.util.stream.Collectors; + +/** + * 商品供应商变更记录 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +@Service +public class SpuSupplierChangeLogServiceImpl implements SpuSupplierChangeLogService { + + @Autowired + private SpuSupplierChangeLogMapper spuSupplierChangeLogMapper; + @Autowired + private SpuMapper spuMapper; + @Autowired + private SkuService skuService; + @Autowired + private SkuMapper skuMapper; + @Autowired + private SkuLangMapper skuLangMapper; + @Autowired + private SpuAttrValueService spuAttrValueService; + @Autowired + private SpuExtensionService spuExtensionService; + @DubboReference + private ShopSubstituteSalesFeignClient shopSubstituteSalesFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + //获取供应商商品id列表 + List supplierSpuId = spuMapper.getSupplierSpuId(shopId); + //获取供应商名称 + if (supplierSpuId.size() > 0) { + PageVO pageVO = PageUtil.doPage(pageDTO, () -> spuSupplierChangeLogMapper.listBySpuIds(supplierSpuId)); + List spuSupplierChangeLogVOList = pageVO.getList(); + //供应商id + List supplierIdList = spuSupplierChangeLogVOList.stream().map(SpuSupplierChangeLogVO::getSupplierId).collect(Collectors.toList()); + //获取供应商名称 + List supplierApiDetailVOList = supplierDetailFeignClient.listBySupplierIds(supplierIdList).getData(); + Map supplierNameMap = supplierApiDetailVOList.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName)); + //获取供应商商品对应的代销商品id + List supplieSpuIds = spuSupplierChangeLogVOList.stream().map(SpuSupplierChangeLogVO::getSpuId).collect(Collectors.toList()); + if (supplieSpuIds.size() == 0) { + return pageVO; + } + List spuVOList = spuMapper.listSpuByShopIdAndSupplierSpuId(shopId, supplieSpuIds); + Map collect = spuVOList.stream().collect(Collectors.toMap(SpuVO::getSupplierSpuId, SpuVO::getSpuId)); + for (SpuSupplierChangeLogVO spuSupplierChangeLogVO : spuSupplierChangeLogVOList) { + //设置供应商名称 + spuSupplierChangeLogVO.setSupplierName(supplierNameMap.get(spuSupplierChangeLogVO.getSupplierId())); + spuSupplierChangeLogVO.setCommissionSpuId(collect.get(spuSupplierChangeLogVO.getSpuId())); + if (Objects.equals(spuSupplierChangeLogVO.getChangeType(), SupplierSpuChangeType.PUT_SHELF.value())) { + //上架 + spuSupplierChangeLogVO.setContentKey(ContentKey.STATUS_CHANGE.value()); + spuSupplierChangeLogVO.setContentValue(ContentValue.SPU_PUT.value()); + } + if (Objects.equals(spuSupplierChangeLogVO.getChangeType(), SupplierSpuChangeType.OFF_SHELF.value())) { + //下架 + spuSupplierChangeLogVO.setContentKey(ContentKey.STATUS_CHANGE.value()); + spuSupplierChangeLogVO.setContentValue(ContentValue.SPU_OFF.value()); + } + if (Objects.equals(spuSupplierChangeLogVO.getChangeType(), SupplierSpuChangeType.SKU_MSG_CHANGE.value())) { + //SKU描述变更 + spuSupplierChangeLogVO.setContentKey(ContentKey.DESCRIBE_CHANGE.value()); + spuSupplierChangeLogVO.setContentValue(ContentValue.SKU_CHANGE.value()); + } + if (Objects.equals(spuSupplierChangeLogVO.getChangeType(), SupplierSpuChangeType.ADD_SKU.value())) { + //新增sku + spuSupplierChangeLogVO.setContentKey(ContentKey.ELSE_CHANGE.value()); + spuSupplierChangeLogVO.setContentValue(ContentValue.ADD_SKU.value()); + } + if (Objects.equals(spuSupplierChangeLogVO.getChangeType(), SupplierSpuChangeType.SPU_MSG_CHANGE.value())) { + // Spu描述变更 + spuSupplierChangeLogVO.setContentKey(ContentKey.DESCRIBE_CHANGE.value()); + spuSupplierChangeLogVO.setContentValue(ContentValue.SPU_CHANGE.value()); + } + } + return pageVO; + } + return null; + } + + @Override + public SpuSupplierChangeLog getBySpuChangeId(Long spuChangeId) { + return spuSupplierChangeLogMapper.getBySpuChangeId(spuChangeId); + } + + @Override + public void save(SpuSupplierChangeLog spuSupplierChangeLog) { + spuSupplierChangeLogMapper.save(spuSupplierChangeLog); + } + + @Override + public void update(SpuSupplierChangeLog spuSupplierChangeLog) { + spuSupplierChangeLogMapper.update(spuSupplierChangeLog); + } + + @Override + public void deleteById(Long spuChangeId) { + spuSupplierChangeLogMapper.deleteById(spuChangeId); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncSpu(Long shopId, List spuSupplierChangeLog) { + Map> collect = spuSupplierChangeLog.stream().collect(Collectors.groupingBy(SpuSupplierChangeLogDTO::getChangeType)); + //上架 + List putShelf = collect.get(SupplierSpuChangeType.PUT_SHELF.value()); + if (!Objects.isNull(putShelf)) { + List putSupplierSpuId = putShelf.stream().map(SpuSupplierChangeLogDTO::getSpuId).collect(Collectors.toList()); + List putSpuId = spuMapper.getSpuIdByShopIdAndSupplierSpuId(shopId, putSupplierSpuId); + spuMapper.batchChangeSpuStatus(putSpuId, SpuStatus.PUT_SHELF.value()); + spuSupplierChangeLog.removeAll(putShelf); + spuMapper.batchChangeSynUpdate(putSpuId, 1); + } + //下架 + List offShelf = collect.get(SupplierSpuChangeType.OFF_SHELF.value()); + if (!Objects.isNull(offShelf)) { + List offSupplierSpuId = offShelf.stream().map(SpuSupplierChangeLogDTO::getSpuId).collect(Collectors.toList()); + List offSpuId = spuMapper.getSpuIdByShopIdAndSupplierSpuId(shopId, offSupplierSpuId); + spuMapper.batchChangeSpuStatus(offSpuId, SpuStatus.OFF_SHELF.value()); + spuSupplierChangeLog.removeAll(offShelf); + spuMapper.batchChangeSynUpdate(offSpuId, 1); + } + for (SpuSupplierChangeLogDTO supplierChangeLog : spuSupplierChangeLog) { + //获取到代销商品信息 + SpuVO spuVo = spuMapper.getSpuByShopIdAndSupplierSpuId(shopId, supplierChangeLog.getSpuId()); + //获取代销商品sku信息 + List skuVOList = skuService.listSkuAllInfoBySpuId(spuVo.getSpuId(), spuVo, false); + //获取供应商品sku信息 + List supplierSkuVOList = skuService.listSkuAllInfoBySpuId(supplierChangeLog.getSpuId(), spuVo, false); + //同步sku信息变更 + if (Objects.equals(SupplierSpuChangeType.SKU_MSG_CHANGE.value(), supplierChangeLog.getChangeType())) { + skuMsgChange(supplierSkuVOList, spuVo); + spuMapper.changeSynUpdate(spuVo.getSpuId(), 1); + } + //同步新增sku + if (Objects.equals(SupplierSpuChangeType.ADD_SKU.value(), supplierChangeLog.getChangeType())) { + addSku(skuVOList, supplierSkuVOList, spuVo); + spuMapper.changeSynUpdate(spuVo.getSpuId(), 1); + } + } + } + + /** + * 同步sku信息变更 + * + * @param supplierSkuVOList + * @param spuVo + */ + public void skuMsgChange(List supplierSkuVOList, SpuVO spuVo) { + List skus = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : supplierSkuVOList) { + //根据供应商品skuId获取代销商品skuId + Long skuId = skuMapper.getSkuIdBySupplierSkuId(skuVO.getSkuId(), spuVo.getSpuId()); + skuVO.setSpuId(spuVo.getSpuId()); + skuVO.setSkuId(skuId); + //获取店铺代销设置设置销售价格 + Long priceFee = setPriceFee(skuVO); + skuVO.setPriceFee(priceFee); + skuVO.setMarketPriceFee(null); + skus.add(BeanUtil.map(skuVO, Sku.class)); + } + skuMapper.updateBatch(skus); + } + + /** + * 同步新增sku + * + * @param skuVOList + * @param supplierSkuVOList + * @param spuVo + */ + public void addSku(List skuVOList, List supplierSkuVOList, SpuVO spuVo) { + List skuIds = skuVOList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + List supplierSkuIds = supplierSkuVOList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + //获取供应商新增skuId + supplierSkuIds.removeAll(skuIds); + //获取供应商新增sku信息 + List skuList = skuMapper.listSkuBySkuIds(supplierSkuIds); + List skuDtoS = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SkuVO skuVO : skuList) { + skuVO.setSpuId(spuVo.getSpuId()); + //获取店铺代销设置设置销售价格 + Long priceFee = setPriceFee(skuVO); + skuVO.setPriceFee(priceFee); + skuDtoS.add(BeanUtil.map(skuVO, SkuDTO.class)); + } + skuMapper.saveBatch(skuDtoS); + } + + @Override + public void insertBatchChangeStatus(List spuIds, Integer status) { + if (status.equals(StatusEnum.ENABLE.value())) { + spuSupplierChangeLogMapper.insertBatch(spuIds, SupplierSpuChangeType.PUT_SHELF.value()); + } else if (status.equals(StatusEnum.DISABLE.value())) { + spuSupplierChangeLogMapper.insertBatch(spuIds, SupplierSpuChangeType.OFF_SHELF.value()); + } + + } + + @Override + public void saveBatch(List spuSupplierChangeLogs) { + spuSupplierChangeLogMapper.saveBatch(spuSupplierChangeLogs); + } + + public Long setPriceFee(SkuVO skuVO) { + Long shopId = AuthUserContext.get().getTenantId(); + //获取商家代销设置 + ServerResponseEntity salesType = shopSubstituteSalesFeignClient.getByShopSubstituteSalesId(shopId); + ShopSubstituteSalesVO shopSubstituteSalesVO = salesType.getData(); + if (!Objects.isNull(shopSubstituteSalesVO)) { + if (shopSubstituteSalesVO.getSalesType() == 0) { + //智能设价计算售价 + long price = 0L; + if (shopSubstituteSalesVO.getSalesPriceType() == 0) { + //按比例加价 + price = PriceUtil.divideByBankerRounding(skuVO.getPriceFee() * shopSubstituteSalesVO.getSalesPrice(), 10000) + skuVO.getPriceFee(); + } + if (shopSubstituteSalesVO.getSalesPriceType() == 1) { + //按固定数值加价 + price = skuVO.getPriceFee() + shopSubstituteSalesVO.getSalesPrice(); + } + return price; + } + } + return 0L; + } + + +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuTagReferenceServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuTagReferenceServiceImpl.java new file mode 100644 index 0000000..bd6747f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/SpuTagReferenceServiceImpl.java @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.dto.SpuDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.product.dto.SpuTagReferenceDTO; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.mapper.SpuTagReferenceMapper; +import com.tmerclub.cloud.product.model.SpuTag; +import com.tmerclub.cloud.product.model.SpuTagReference; +import com.tmerclub.cloud.product.service.SpuTagReferenceService; +import com.tmerclub.cloud.product.service.SpuTagService; +import com.tmerclub.cloud.product.vo.SpuTagReferenceVO; +import com.tmerclub.cloud.product.vo.SpuTagVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品分组标签关联信息 + * + * @author lhd + * @date 2021-02-20 14:28:10 + */ +@Service +public class SpuTagReferenceServiceImpl implements SpuTagReferenceService { + + @Autowired + private SpuTagReferenceMapper spuTagReferenceMapper; + + @DubboReference + private SearchSpuFeignClient searchSpuFeignClient; + + @Autowired + private SpuTagService spuTagService; + + @Autowired + private SpuMapper spuMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> spuTagReferenceMapper.list()); + } + + @Override + public SpuTagReferenceVO getByReferenceId(Long referenceId) { + return spuTagReferenceMapper.getByReferenceId(referenceId); + } + + @Override + public void save(SpuTagReference spuTagReference) { + spuTagReferenceMapper.save(spuTagReference); + } + + @Override + public void update(SpuTagReference spuTagReference) { + spuTagReferenceMapper.update(spuTagReference); + } + + @Override + public void deleteById(Long referenceId) { + spuTagReferenceMapper.deleteById(referenceId); + } + + @Override + public int countByStatusAndTagId(Integer status, Long id) { + return spuTagReferenceMapper.countByStatusAndTagId(status, id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addProdForTag(SpuTag spuTag, List spuList) { + if (CollUtil.isEmpty(spuList)) { + return; + } + List prodTagReferences = new ArrayList<>(Constant.INITIAL_CAPACITY); + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuDTO product : spuList) { + SpuVO spuVO = spuMapper.getBySpuId(product.getSpuId()); + if (spuVO.getStatus() != 1) { + continue; + } + spuIds.add(product.getSpuId()); + SpuTagReference prodTagReference = new SpuTagReference(); + prodTagReference.setTagId(spuTag.getId()); + prodTagReference.setShopId(spuTag.getShopId()); + prodTagReference.setStatus(1); + prodTagReference.setSpuId(product.getSpuId()); + prodTagReference.setSeq(0); + prodTagReferences.add(prodTagReference); + } + if (prodTagReferences.size() > 0) { + spuTagReferenceMapper.saveBatch(prodTagReferences); + updateSpuTagInfo(spuTag.getId(), spuIds); + } + + } + + @Override + public List listByIds(List ids) { + return spuTagReferenceMapper.listByIds(ids); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateProdSeq(List spuTagReferenceDTOList) { + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + Long tagId = null; + List spuTagReferenceList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuTagReferenceDTO spuTagReferenceDTO : spuTagReferenceDTOList) { + if (Objects.isNull(tagId)) { + tagId = spuTagReferenceDTO.getTagId(); + } + spuIds.add(spuTagReferenceDTO.getSpuId()); + SpuTagReference spuTagReference = new SpuTagReference(); + spuTagReference.setTagId(tagId); + spuTagReference.setSeq(spuTagReferenceDTO.getSeq()); + spuTagReference.setSpuId(spuTagReferenceDTO.getSpuId()); + spuTagReferenceList.add(spuTagReference); + } + SpuTagVO spuTagVO = spuTagService.getById(tagId); + if (Objects.isNull(spuTagVO)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + if (!Objects.equals(spuTagVO.getShopId(), AuthUserContext.get().getTenantId())) { + // 您无权进行操作 + throw new LuckException("您无权进行操作"); + } + spuTagReferenceMapper.updateSpuSeq(spuTagReferenceList); + updateSpuTagInfo(tagId, spuIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeByProdId(Long prodTagId, List spuIds) { + // 移除关联 + spuTagReferenceMapper.removeByIds(prodTagId, spuIds); + updateSpuTagInfo(prodTagId, spuIds); + } + + /** + * 更新商品分组信息 + * + * @param prodTagId + * @param spuIds + */ + private void updateSpuTagInfo(Long prodTagId, List spuIds) { + // 更新分组商品数量 + spuTagService.updateProdCountById(prodTagId); + // 更新es商品信息 + spuMapper.updateSpuUpdateTime(spuIds, null, null, null); + } + + @Override + public List tagListBySpuId(Long spuId) { + return spuTagReferenceMapper.tagListBySpuId(spuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSpuData(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + List tagIds = spuTagReferenceMapper.listSpuTagIdBySpuIds(spuIds); + if (CollUtil.isEmpty(tagIds)) { + return; + } + spuTagReferenceMapper.deleteSpuData(spuIds); + spuTagService.batchUpdateProdCountById(tagIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSpuTagByShopIdAndCategoryIds(Long shopId, List categoryIds) { + List tagIds = spuTagReferenceMapper.getTagIdsByShopIdAndCategoryIds(shopId, categoryIds); + if (CollUtil.isEmpty(tagIds)) { + return; + } + spuTagReferenceMapper.deleteSpuTagByShopIdAndCategoryIds(shopId, categoryIds); + spuTagService.batchUpdateProdCountById(tagIds); + } + + @Override + public List spuIdsByTagId(Long tagId) { + return spuTagReferenceMapper.spuIdsByTagId(tagId); + } + + @Override + public PageVO pageSpuListByTagId(PageDTO pageDTO, SpuTagReferenceDTO spuTagReferenceDTO) { + PageVO pageSpuTagReference = PageUtil.doPage(pageDTO, () -> spuTagReferenceMapper.getSpuIds(spuTagReferenceDTO)); + if (CollUtil.isEmpty(pageSpuTagReference.getList()) && Objects.isNull(spuTagService.getById(spuTagReferenceDTO.getTagId()))) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + PageVO pageVO = new PageVO<>(); + if (CollUtil.isEmpty(pageSpuTagReference.getList())) { + return pageVO; + } + Map seqMap = new HashMap<>(pageSpuTagReference.getList().size()); + List spuIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SpuTagReference spuTagReference : pageSpuTagReference.getList()) { + seqMap.put(spuTagReference.getSpuId(), spuTagReference.getSeq()); + spuIds.add(spuTagReference.getSpuId()); + } + ServerResponseEntity> spuResponseEntity = searchSpuFeignClient.listSpuBySpuIds(spuIds); + List searchProdList = spuResponseEntity.getData(); + for (SpuSearchVO spuSearchVO : searchProdList) { + spuSearchVO.setSeq(seqMap.get(spuSearchVO.getSpuId())); + } + searchProdList = searchProdList.stream().sorted(Comparator.comparing(SpuSearchVO::getSeq).reversed()).collect(Collectors.toList()); + + pageVO.setTotal(pageSpuTagReference.getTotal()); + pageVO.setPages(pageSpuTagReference.getPages()); + pageVO.setList(searchProdList); + return pageVO; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockBillLogServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockBillLogServiceImpl.java new file mode 100644 index 0000000..04438f8 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockBillLogServiceImpl.java @@ -0,0 +1,1019 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.product.bo.SpuSimpleBO; +import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO; +import com.tmerclub.cloud.api.product.util.ProductLangUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.bo.RefundReductionStockBO; +import com.tmerclub.cloud.common.order.bo.RefundStockOperateBO; +import com.tmerclub.cloud.common.order.constant.StockModeEnum; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.*; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.AnalysisUtil; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogBO; +import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogItemBO; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.constant.ProdKeyType; +import com.tmerclub.cloud.product.dto.StockBillLogDTO; +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.SkuMapper; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.model.StockBillLog; +import com.tmerclub.cloud.product.model.StockBillLogItem; +import com.tmerclub.cloud.product.service.StockBillLogService; +import com.tmerclub.cloud.product.service.StockChangeReasonService; +import com.tmerclub.cloud.product.service.StockPointSkuService; +import com.tmerclub.cloud.product.service.WarehouseService; +import com.tmerclub.cloud.product.util.StockUtil; +import com.tmerclub.cloud.product.vo.StockBillLogExcelVO; +import com.tmerclub.cloud.product.vo.StockChangeReasonVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogItemVO; +import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogVO; +import com.mongodb.client.result.UpdateResult; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.BulkOperations; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 出入库明细 + * + * @author lhd + * @date 2022-06-22 16:57:26 + */ +@Service +public class StockBillLogServiceImpl implements StockBillLogService { + private static final Logger logger = LoggerFactory.getLogger(StockBillLogServiceImpl.class); + + @Autowired + private StockManager stockManager; + @Autowired + private SkuMapper skuMapper; + @Autowired + private SpuMapper spuMapper; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private AccountFeignClient accountFeignClient; + @Autowired + private WarehouseService warehouseService; + + @Autowired + private StockChangeReasonService stockChangeReasonService; + + @Autowired + private StockPointSkuService stockPointSkuService; + @Autowired + private StationFeignClient stationFeignClient; + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @Override + public PageVO page(PageDTO pageDTO, StockBillLogDTO stockBillLogDTO) { + // 查询条件 + Criteria criteria = loadStockBillLogItemQuery(stockBillLogDTO); + + // 返回字段 + ProjectionOperation projectionOperation = Aggregation.project().andExclude("stockBillItemLogs"); + // 排序 + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime").and(Sort.Direction.DESC, "_id"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageDTO.getPageSize() * (pageDTO.getPageNum() - 1)); + LimitOperation limitOperation = Aggregation.limit(pageDTO.getPageSize()); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoStockBillLogBO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("pageStockLog()的mongodb查询语句: {}", typedAggregation); + + GroupOperation countGroupOperation = Aggregation.group().count().as("totalCount"); + // 执行聚合操作获取当前页数据 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoStockBillLogBO.class); + // 总条数 + TypedAggregation totalTypedAggregation = Aggregation.newAggregation( + MongoStockBillLogBO.class, + Aggregation.match(criteria), + countGroupOperation + ); + AggregationResults totalAggregationResults = mongoTemplate.aggregate(totalTypedAggregation, MongoStockBillLogBO.class); + List countStockList = totalAggregationResults.getMappedResults(); + long size = 0L; + if (CollUtil.isNotEmpty(countStockList)) { + size = countStockList.get(0).getTotalCount(); + } + // 返回查询结果 + List mappedResults = aggregationResults.getMappedResults(); + Set employeeIds = new HashSet<>(Constant.INITIAL_CAPACITY); + Set warehouseIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (MongoStockBillLogBO mongoStockBillLogBO : mappedResults) { + employeeIds.add(mongoStockBillLogBO.getEmployeeId()); + warehouseIds.add(mongoStockBillLogBO.getStockPointId()); + } + // 获取制单人Map + List accounts = accountFeignClient.listByUserIdsAndPhoneAndType(new ArrayList<>(employeeIds), null, SysTypeEnum.MULTISHOP.value()).getData(); + Map userMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(accounts)) { + userMap = accounts.stream().collect(Collectors.toMap(AuthAccountVO::getUserId, x -> x)); + } + // 获取仓库Map + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setWarehouseIds(new ArrayList<>(warehouseIds)); + List warehouses = warehouseService.listWarehouse(warehouseDTO); + Map warehouseMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(warehouses)) { + warehouseMap = warehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + } + //出入库原因 + StockChangeReasonDTO stockChangeReasonDTO = new StockChangeReasonDTO(); + stockChangeReasonDTO.setShopId(AuthUserContext.get().getTenantId()); + List reasonList = stockChangeReasonService.list(stockChangeReasonDTO); + Map reasonMap = reasonList.stream().collect(Collectors.toMap(StockChangeReasonVO::getStockChangeReasonId, StockChangeReasonVO::getReason)); + // 数据补充 + AuthAccountVO accountVO; + for (MongoStockBillLogBO mongoStockBillLogBO : mappedResults) { + // 补充制单人信息 + if (!Objects.isNull(accountVO = userMap.get(mongoStockBillLogBO.getEmployeeId()))) { + mongoStockBillLogBO.setMakerName(accountVO.getUsername()); + mongoStockBillLogBO.setMakerMobile(accountVO.getPhone()); + } + // 补充库存点信息 + mongoStockBillLogBO.setStockPointName(warehouseMap.get(mongoStockBillLogBO.getStockPointId())); + mongoStockBillLogBO.setStockPointType(mongoStockBillLogBO.getStockPointType() == null ? StockPointType.WAREHOUSE.getValue() : mongoStockBillLogBO.getStockPointType()); + // 补充出入库原因 + mongoStockBillLogBO.setReason(reasonMap.getOrDefault(mongoStockBillLogBO.getStockChangeReasonId(), "")); + if (StrUtil.isNotBlank(mongoStockBillLogBO.getMakerMobile())) { + mongoStockBillLogBO.setMakerMobile(PhoneUtil.hideBetween(mongoStockBillLogBO.getMakerMobile()).toString()); + } + } + // 构建分页数据 + PageVO mongoStockBillLogPage = new PageVO<>(); + mongoStockBillLogPage.setTotal(size); + mongoStockBillLogPage.setList(mappedResults); + mongoStockBillLogPage.setPages(PageUtil.getPages(size, pageDTO.getPageSize())); + return mongoStockBillLogPage; + } + + private Criteria loadStockBillLogItemQuery(StockBillLogDTO stockBillLogDTO) { + Criteria criteria = new Criteria(); + if (Objects.nonNull(stockBillLogDTO.getShopId())) { + criteria.and("shopId").is(stockBillLogDTO.getShopId()); + } + if (Objects.nonNull(stockBillLogDTO.getSupplierId())) { + criteria.and("supplierId").is(stockBillLogDTO.getSupplierId()); + } + SpuSimpleBO spuSimpleBO = new SpuSimpleBO(); + spuSimpleBO.setLang(I18nMessage.getLang()); + if (StrUtil.isNotBlank(stockBillLogDTO.getProdKey())) { + if (Objects.equals(stockBillLogDTO.getProdKeyType(), ProdKeyType.SPU_NAME.value())) { + // 商品名称 + spuSimpleBO.setSpuName(stockBillLogDTO.getProdKey()); + List spuList = spuMapper.listSimple(spuSimpleBO); + List spuIds = spuList.stream().map(SpuSimpleBO::getSpuId).collect(Collectors.toList()); + criteria.and("stockBillItemLogs.spuId").in(spuIds); + } else if (Objects.equals(stockBillLogDTO.getProdKeyType(), ProdKeyType.PARTY_CODE.value())) { + logger.info("通过商品编码查询库存流水,商品编码:{}", stockBillLogDTO.getProdKey()); + // 商品编码 + List skuVoList = skuMapper.listSkuByPartyCodeAndShopId(stockBillLogDTO.getProdKey(), stockBillLogDTO.getShopId(), stockBillLogDTO.getSupplierId()); + // skuId + List skuIdList = skuVoList.stream().map(SkuVO::getSkuId).collect(Collectors.toList()); + // 供应商skuId + List supplierSkuIdList = skuVoList.stream().map(SkuVO::getSupplierSkuId).toList(); + skuIdList.addAll(supplierSkuIdList); + criteria.and("stockBillItemLogs.skuId").in(skuIdList); + } + } + if (Objects.nonNull(stockBillLogDTO.getCreateStartTime()) && Objects.nonNull(stockBillLogDTO.getCreateEndTime())) { + criteria.and("createTime").lte(stockBillLogDTO.getCreateEndTime()).gte(stockBillLogDTO.getCreateStartTime()); + } + if (Objects.nonNull(stockBillLogDTO.getBusinessStartTime()) && Objects.nonNull(stockBillLogDTO.getBusinessEndTime())) { + criteria.and("businessTime").lte(stockBillLogDTO.getBusinessEndTime()).gte(stockBillLogDTO.getBusinessStartTime()); + } + if (Objects.nonNull(stockBillLogDTO.getSourceOrderNo()) && !Objects.equals(stockBillLogDTO.getSourceOrderNo(),"")) { + // 模糊查询只支持字段属性是字符串 + criteria.and("sourceOrderNo").regex(Pattern.compile("^.*" + stockBillLogDTO.getSourceOrderNo() + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getStockBillNo())) { + criteria.and("stockBillNo").regex(Pattern.compile("^.*" + stockBillLogDTO.getStockBillNo() + ".*$", Pattern.CASE_INSENSITIVE)); + } + if (Objects.nonNull(stockBillLogDTO.getStockBillType()) && !Objects.equals(stockBillLogDTO.getStockBillType(), 0)) { + criteria.and("stockBillType").is(stockBillLogDTO.getStockBillType()); + } + if (Objects.nonNull(stockBillLogDTO.getType())) { + criteria.and("type").is(stockBillLogDTO.getType()); + } + if (Objects.nonNull(stockBillLogDTO.getStatus())) { + criteria.and("status").is(stockBillLogDTO.getStatus()); + } + if (StrUtil.isNotBlank(stockBillLogDTO.getMakerMobile())) { + criteria.and("makerMobile").is(stockBillLogDTO.getMakerMobile()); + } + if (Objects.nonNull(stockBillLogDTO.getEmployeeId())) { + criteria.and("employeeId").is(stockBillLogDTO.getEmployeeId()); + } + if (CollUtil.isNotEmpty(stockBillLogDTO.getStockBillLogIds())) { + criteria.and("stockBillLogId").in(stockBillLogDTO.getStockBillLogIds()); + } + if (!ObjectUtils.isEmpty(stockBillLogDTO.getStockPointName())) { + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setWarehouseName(stockBillLogDTO.getStockPointName()); + List warehouse = warehouseService.listWarehouse(warehouseDTO); + if (!CollectionUtils.isEmpty(warehouse)) { + List warehouseIds = warehouse.stream().map(WarehouseVO::getWarehouseId).toList(); + criteria.and("stockPointId").in(warehouseIds); + } + } + return criteria; + } + + @Override + public MongoStockBillLogVO getByStockBillLogId(Long stockBillLogId) { + MongoStockBillLogBO stockBillLogDb = mongoTemplate.findById(stockBillLogId, MongoStockBillLogBO.class); + if (Objects.isNull(stockBillLogDb)) { + return null; + } + MongoStockBillLogVO mongoStockBillLogVO = BeanUtil.map(stockBillLogDb, MongoStockBillLogVO.class); + List spuIds = mongoStockBillLogVO.getStockBillItemLogs().stream().map(MongoStockBillLogItemVO::getSpuId).toList(); + List spuList = spuMapper.listSpuBySpuIds(spuIds); + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, spuVO -> spuVO)); + List skuVOS = skuMapper.listBySpuIds(spuIds); + Map skuMap = new HashMap<>(skuVOS.size()); + if (!CollectionUtils.isEmpty(skuVOS)) { + skuVOS.forEach( s-> { + skuMap.put(s.getSkuId(), Objects.isNull(s.getImgUrl()) || Objects.equals(s.getImgUrl(), "") ? s.getMainImgUrl() : s.getImgUrl()); + }); + } + if (Objects.nonNull(stockBillLogDb.getStockPointId())) { + // 补充库存点名称 + WarehouseVO warehouse = warehouseService.getByWarehouseId(stockBillLogDb.getStockPointId()); + if (!Objects.isNull(warehouse)) { + mongoStockBillLogVO.setStockPointName(warehouse.getWarehouseName()); + } + } else { + mongoStockBillLogVO.setStockPointName("默认仓库"); + mongoStockBillLogVO.setStockPointType(StockPointType.WAREHOUSE.getValue()); + } + // 补充出入库原因 + if (!Objects.isNull(mongoStockBillLogVO.getStockChangeReasonId())) { + StockChangeReasonVO changeReason = stockChangeReasonService.getByStockChangeReasonId(mongoStockBillLogVO.getStockChangeReasonId()); + mongoStockBillLogVO.setReason(Objects.isNull(changeReason) ? null : changeReason.getReason()); + } + // 处理商品信息 + for (MongoStockBillLogItemVO mongoStockBillLogItemVO : mongoStockBillLogVO.getStockBillItemLogs()) { + SpuVO spu = spuMap.get(mongoStockBillLogItemVO.getSpuId()); + String mainImgUrl = skuMap.getOrDefault(mongoStockBillLogItemVO.getSkuId(), spu.getMainImgUrl()); + mongoStockBillLogItemVO.setMainImgUrl(mainImgUrl); + } + return mongoStockBillLogVO; + } + + @Override + public List exportStockBillLogList(StockBillLogDTO stockBillLogDTO) { + // 查询条件 + Criteria criteria = loadStockBillLogItemQuery(stockBillLogDTO); + // 返回字段 + ProjectionOperation projectionOperation = Aggregation.project("stockBillLogId", "stockBillNo", "sourceOrderNo", "stockBillType", + "createTime", "updateTime", "stockChangeReasonId", "employeeId", "status", "businessTime","stockPointId","stockPointType", + "totalCount", "totalAmount", "qualifications", "shopId", "supplierId", "remark", "type", "makerMobile", "stockBillItemLogs"); + // 排序 + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime").and(Sort.Direction.DESC, "_id"); + + TypedAggregation typedAggregation = Aggregation.newAggregation( + MongoStockBillLogBO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation + ); + logger.info("exportStockBillLogList()的mongodb查询语句: {}", Json.toJsonString(typedAggregation)); + // 执行聚合操作获取当前页数据 + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoStockBillLogVO.class); + List mappedResults = aggregationResults.getMappedResults(); + + for (MongoStockBillLogVO mongoStockBillLog : mappedResults) { + if (StrUtil.isNotBlank(mongoStockBillLog.getMakerMobile())) { + mongoStockBillLog.setMakerMobile(PhoneUtil.hideBetween(mongoStockBillLog.getMakerMobile()).toString()); + } + } + + return handleExportStockBillLogListInfo(mappedResults, stockBillLogDTO.getType()); + } + + private List handleExportStockBillLogListInfo(List stockBillLogList, Integer billType) { + List stockBillLogExcelList = BeanUtil.mapAsList(stockBillLogList, StockBillLogExcelVO.class); + Map stockBillLogItemMap = stockBillLogList.stream().collect(Collectors.toMap(MongoStockBillLogVO::getStockBillLogId, item -> item)); + List stationIds = stockBillLogList.stream().filter(stockBillLog -> Objects.equals(stockBillLog.getStockPointType(), StockPointType.STATION.getValue())).map(MongoStockBillLogVO::getStockPointId).collect(Collectors.toList()); + Map stationMap = stationFeignClient.listStationByIds(stationIds).stream().collect(Collectors.toMap(StationVO::getStationId, StationVO::getStationName)); + WarehouseDTO warehouseDTO = new WarehouseDTO(); + List warehouseIds = stockBillLogList.stream().filter(stockBillLog -> Objects.equals(stockBillLog.getStockPointType(), StockPointType.WAREHOUSE.getValue())).map(MongoStockBillLogVO::getStockPointId).collect(Collectors.toList()); + warehouseDTO.setWarehouseIds(warehouseIds); + Map warehouseMap = warehouseService.listWarehouse(warehouseDTO).stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + for (StockBillLogExcelVO stockBillLogExcelVO : stockBillLogExcelList) { + String statusName = stockBillLogExcelVO.getStatus() == 1 + ? (billType == 1 ? "已出库" : "已入库") + : Objects.requireNonNull(StockBillStatus.instance(stockBillLogExcelVO.getStatus())).text(); + MongoStockBillLogItemVO mongoStockBillItemLogVO = stockBillLogItemMap.get(stockBillLogExcelVO.getStockBillLogId()).getStockBillItemLogs().get(0); + stockBillLogExcelVO.setSkuName(mongoStockBillItemLogVO.getSkuName()); + stockBillLogExcelVO.setSpuName(mongoStockBillItemLogVO.getSpuName()); + stockBillLogExcelVO.setPartyCode(mongoStockBillItemLogVO.getPartyCode()); + stockBillLogExcelVO.setStockCount(mongoStockBillItemLogVO.getStockCount()); + stockBillLogExcelVO.setUnitPrice(AnalysisUtil.conversionPrices(mongoStockBillItemLogVO.getUnitPrice().toString())); + stockBillLogExcelVO.setStockBillTypeName(Objects.requireNonNull(StockBillType.instance(stockBillLogExcelVO.getStockBillType())).text()); + stockBillLogExcelVO.setStatusName(statusName); + stockBillLogExcelVO.setTotalAmount(AnalysisUtil.conversionPrices(stockBillLogItemMap.get(stockBillLogExcelVO.getStockBillLogId()).getTotalAmount().toString())); + if (Objects.equals(stockBillLogItemMap.get(stockBillLogExcelVO.getStockBillLogId()).getStockPointType(), StockPointType.STATION.getValue())) { + stockBillLogExcelVO.setStockPointType(StockPointType.STATION.getDesc()); + stockBillLogExcelVO.setStockPointName(stationMap.get(stockBillLogItemMap.get(stockBillLogExcelVO.getStockBillLogId()).getStockPointId())); + } else { + stockBillLogExcelVO.setStockPointType(StockPointType.WAREHOUSE.getDesc()); + stockBillLogExcelVO.setStockPointName(warehouseMap.get(stockBillLogItemMap.get(stockBillLogExcelVO.getStockBillLogId()).getStockPointId())); + } + } + return stockBillLogExcelList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveInfo(StockBillLogVO stockBillLogVO) { + StockType stockType = Objects.requireNonNull(StockType.instance(stockBillLogVO.getType())); + // mq幂等处理 + if (Objects.nonNull(stockBillLogVO.getStockBillNo())) { + String stockBillNoPre = Objects.equals(stockType.value(), 1) ? Constant.OB : Constant.IB; + stockBillLogVO.setStockBillNo(stockBillNoPre + stockBillLogVO.getStockBillNo()); + Query query = new Query(); + query.addCriteria(Criteria.where("stockBillNo").is(stockBillLogVO.getStockBillNo())); + if (Objects.nonNull(mongoTemplate.findOne(query, MongoStockBillLogBO.class))) { + return; + } + } + Date now = new Date(); + // 校验部分信息 + this.checkInfo(stockBillLogVO); + stockBillLogVO.setCreateTime(now); + stockBillLogVO.setUpdateTime(now); + if (Objects.isNull(stockBillLogVO.getStockBillNo())) { + // 没有id就生成一个 + stockBillLogVO.setStockBillNo(getStockBillNoByType(stockType)); + } + List changeStockList = Collections.emptyList(); + // 处理金额并对商品完成出入库操作 - 非采购入库操作 + if (!Objects.equals(stockBillLogVO.getStockBillType(), StockBillType.PURCHASE_STORAGE.value()) + && !Objects.equals(stockBillLogVO.getChangeStock(), false)) { + changeStockList = this.processingAmountAndStock(stockBillLogVO); + } + MongoStockBillLogBO mongoStockBillLogBO = BeanUtil.map(stockBillLogVO, MongoStockBillLogBO.class); + if (Objects.nonNull(stockBillLogVO.getSourceOrderNo())) { + mongoStockBillLogBO.setSourceOrderNo(stockBillLogVO.getSourceOrderNo()); + } + List mongoStockBillLogItemList = BeanUtil.mapAsList(stockBillLogVO.getStockBillLogItems(), MongoStockBillLogItemBO.class); + this.saveMongoStockBillLog(mongoStockBillLogBO, mongoStockBillLogItemList); + if (CollUtil.isNotEmpty(changeStockList)) { + stockManager.skuStock(changeStockList, null); + } + } + + @Override + public void generateStockLogOfRefundOrderList(RefundStockOperateBO refundStockOperateBO) { + List stockBillLogItems = refundStockOperateBO.getRefundReductionStockList(); + // 如果供应商商品 退款需要添加库存记录 +// if (Objects.equals(stockBillLogItems.get(0).getSupplierProd(), 1)) { +// return; +// } + List skuStockLockList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map stockPointMap = new HashMap<>(stockBillLogItems.size()); + for (RefundReductionStockBO stockBillLogItem : stockBillLogItems) { + String key = StockUtil.skuPointKey(stockBillLogItem.getSkuId(), stockBillLogItem.getStockPointId()); + if (stockPointMap.containsKey(key)) { + continue; + } + StockPointSkuVO stockPointSkuVO = new StockPointSkuVO(); + stockPointSkuVO.setSkuId(stockBillLogItem.getSkuId()); + stockPointSkuVO.setStockPointId(stockBillLogItem.getStockPointId()); + stockPointMap.put(key, stockPointSkuVO); + } + // 获取sku区域库存 + Map skuStockVOMap = stockManager.skuStockMap(new ArrayList<>(stockPointMap.values())); + // 生成入库明细 + for (RefundReductionStockBO refundReductionStock : stockBillLogItems) { + StockBillLogItemDTO skuStockLockDTO = new StockBillLogItemDTO( + refundReductionStock.getSpuId(), + refundReductionStock.getSkuId(), + refundReductionStock.getShopId(), + refundReductionStock.getOrderId(), + refundReductionStock.getSpuName(), + refundReductionStock.getSkuName(), + refundReductionStock.getCount(), + refundReductionStock.getPrice(), + refundReductionStock.getPartyCode(), + refundReductionStock.getPic() + ); + skuStockLockDTO.setSupplierId(refundReductionStock.getSupplierId()); + skuStockLockDTO.setStockPointId(refundReductionStock.getStockPointId()); + SkuStockVO skuStockVO = skuStockVOMap.get(StockUtil.skuPointKey(skuStockLockDTO.getSkuId(), skuStockLockDTO.getStockPointId())); + // 当前的sku库存减去sku退货数量 + skuStockLockDTO.setAfterStock(skuStockVO.getStock() - refundReductionStock.getCount()); + skuStockLockDTO.setStockBillLogId(refundStockOperateBO.getId()); + skuStockLockDTO.setStockBillType(StockBillType.RETURN_STORAGE.value()); + skuStockLockDTO.setStocktype(StockType.WAREHOUSING.value()); + skuStockLockList.add(skuStockLockDTO); + } + + // 生成入库明细信息 - 操作成功才扣除库存,操作失败代表是空列表或者已经入库了不需要扣库存,如果报错会回滚 + StockBillLogService stockBillLogService = (StockBillLogService) AopContext.currentProxy(); + + // 生成入库明细信息 + stockBillLogService.generateStockLogOfOrderList(skuStockLockList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void generateStockLogOfOrderList(List stockBillLogItems) { + if (CollUtil.isEmpty(stockBillLogItems)) { + return; + } + Map> shopStockMap = stockBillLogItems.stream().collect(Collectors.groupingBy(StockBillLogItemDTO::getShopId)); + // 如果id为空,就生成新的id + if (Objects.isNull(stockBillLogItems.get(0).getStockBillLogId())) { + logger.info("生成sku出入库记录id, 订单号:{}, 数量:{}", stockBillLogItems.get(0).getOrderId(), shopStockMap.keySet().size()); + for (StockBillLogItemDTO stockBillLogItem : stockBillLogItems) { + stockBillLogItem.setStockBillLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_BILL_LOG)); + } + } + + Date now = new Date(); + // 根据店铺处理 + for (Long shopId : shopStockMap.keySet()) { + // 如果没有出入库项,就不生成出入库单 + if (CollUtil.isEmpty(shopStockMap.get(shopId))) { + continue; + } + List stockBillLogItemDTOList = shopStockMap.get(shopId); + Map> stockTypeMap = stockBillLogItemDTOList.stream().collect(Collectors.groupingBy(StockBillLogItemDTO::getStocktype)); + // 分别处理出入库数据 + for (Map.Entry> typeMap : stockTypeMap.entrySet()) { + Integer stockType = typeMap.getKey(); + List mapValue = typeMap.getValue(); + Map> pointMap = mapValue.stream().collect(Collectors.groupingBy(StockBillLogItemDTO::getStockPointId)); + // 根据库存点分别生成记录 + for (Map.Entry> map : pointMap.entrySet()) { + Long stockBillLogId = map.getValue().get(0).getStockBillLogId(); + Integer stockBillType = map.getValue().get(0).getStockBillType(); + StockBillLogItemDTO stockBillLogItem = map.getValue().get(0); + MongoStockBillLogBO stockBillLog = new MongoStockBillLogBO( + stockBillLogItem.getShopId(), + now, + stockBillType, + stockType, + getStockBillNoByType(Objects.requireNonNull(StockType.instance(stockType))), + StockBillStatus.SUCCESS.value(), + stockBillLogItem.getOrderId() != null ? stockBillLogItem.getOrderId().toString() : null + ); + stockBillLog.setMakerMobile(stockBillLogItem.getMakerMobile()); + stockBillLog.setStockPointId(map.getKey()); + stockBillLog.setStockPointType(stockBillLogItem.getStockPointType()); + stockBillLog.setSupplierId(stockBillLogItem.getSupplierId()); + long totalAmount = 0L; + int totalCount = 0; + // 设置id + stockBillLog.setStockBillLogId(stockBillLogItem.getStockBillLogId()); + for (StockBillLogItemDTO stockBillLogItemDTO : map.getValue()) { + // 计算总金额 + totalAmount += stockBillLogItemDTO.getStockCount() * stockBillLogItemDTO.getUnitPrice(); + // 计算总数量 + totalCount += stockBillLogItemDTO.getStockCount(); + } +// if (totalCount == 0) { +// continue; +// } + stockBillLog.setTotalAmount(totalAmount); + stockBillLog.setTotalCount(totalCount); + List mongoStockBillLogItemList = BeanUtil.mapAsList(map.getValue(), MongoStockBillLogItemBO.class); + try { + this.saveMongoStockBillLog(stockBillLog, mongoStockBillLogItemList); + } catch (DuplicateKeyException e) { + // 主键重复就说明数据已经插入了,不需要再重复操作 + stockBillLog.setStockBillItemLogs(mongoStockBillLogItemList); + logger.info("generateStockLogOfOrderList-sku库存记录重复插入,stockBillLog:{}", stockBillLog); + return; + } + } + }; + } + } + + @Override + public void updateInfo(StockBillLogDTO stockBillLogDTO) { + if (AuthUserContext.get().getSysType().equals(SysTypeEnum.MULTISHOP.value())) { + stockBillLogDTO.setShopId(AuthUserContext.get().getTenantId()); + } + if (AuthUserContext.get().getSysType().equals(SysTypeEnum.SUPPLIER.value())) { + stockBillLogDTO.setSupplierId(AuthUserContext.get().getTenantId()); + } + Date now = new Date(); + StockBillLogVO stockBillLogVO = BeanUtil.map(stockBillLogDTO, StockBillLogVO.class); + this.checkInfo(stockBillLogVO); + stockBillLogVO.setUpdateTime(now); + + // 库存项 + // 保存初始化商品项信息 + List mongoStockBillLogItemList = Collections.emptyList(); + if (CollUtil.isNotEmpty(stockBillLogDTO.getStockBillLogItems())) { + List stockBillLogItemList = stockBillLogDTO.getStockBillLogItems(); + // 更新的数据不一定完整,所以查询最新的库存信息 + List stockBillLogList= mongoTemplate.find(new Query(Criteria.where("_id").is(stockBillLogDTO.getStockBillLogId())), MongoStockBillLogBO.class); + if (CollUtil.isEmpty(stockBillLogList)) { + throw new LuckException("该出入库单不存在"); + } + MongoStockBillLogBO mongoStockBillLogBO = stockBillLogList.get(0); + // 保存库存项信息 + mongoStockBillLogItemList = BeanUtil.mapAsList(stockBillLogItemList, MongoStockBillLogItemBO.class); + for (MongoStockBillLogItemBO mongoStockBillLogItemBO : mongoStockBillLogItemList) { + mongoStockBillLogItemBO.setCreateTime(now); + mongoStockBillLogItemBO.setUpdateTime(now); + } + mongoStockBillLogItemList.addAll(mongoStockBillLogBO.getStockBillItemLogs()); + } + + + List changeStockList = this.processingAmountAndStock(stockBillLogVO); + //更新出入库明细信息 + StockBillLog stockBillLog = BeanUtil.map(stockBillLogVO, StockBillLog.class); + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(stockBillLogDTO.getStockBillLogId())); + Update update = this.getStockBillLogUpdateParam(stockBillLog, mongoStockBillLogItemList); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoStockBillLogBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + stockManager.skuStock(changeStockList, null); + } + + @Override + public long countByOrderId(Long orderId, Integer type) { + Query query = new Query(Criteria.where("sourceOrderNo").is(orderId.toString()).and("type").is(type)).limit(1); + return mongoTemplate.count(query, MongoStockBillLogBO.class); + } + + private Update getStockBillLogUpdateParam(StockBillLog stockBillLog, List stockBillLogItemList) { + Update update = new Update(); + if (Objects.nonNull(stockBillLog.getStockChangeReasonId())) { + update.set("stockChangeReasonId", stockBillLog.getStockChangeReasonId()); + } + if (Objects.nonNull(stockBillLog.getEmployeeId())) { + update.set("employeeId", stockBillLog.getEmployeeId()); + } + if (Objects.nonNull(stockBillLog.getStatus())) { + update.set("status", stockBillLog.getStatus()); + } + if (Objects.nonNull(stockBillLog.getBusinessTime())) { + update.set("businessTime", stockBillLog.getBusinessTime()); + } + if (Objects.nonNull(stockBillLog.getTotalCount())) { + update.set("totalCount", stockBillLog.getTotalCount()); + } + if (Objects.nonNull(stockBillLog.getTotalAmount())) { + update.set("totalAmount", stockBillLog.getTotalAmount()); + } + if (Objects.nonNull(stockBillLog.getQualifications())) { + update.set("qualifications", stockBillLog.getQualifications()); + } + if (Objects.nonNull(stockBillLog.getSupplierId())) { + update.set("supplierId", stockBillLog.getSupplierId()); + } + if (Objects.nonNull(stockBillLog.getRemark())) { + update.set("remark", stockBillLog.getRemark()); + } + if (Objects.nonNull(stockBillLog.getMakerMobile())) { + update.set("makerMobile", stockBillLog.getMakerMobile()); + } + if (CollUtil.isNotEmpty(stockBillLogItemList)) { + update.set("stockBillLogItemList", stockBillLogItemList); + } + return update; + } + + private void saveMongoStockBillLog(MongoStockBillLogBO mongoStockBillLogBO, List stockBillLogItems) { + Long stockBillLogId = mongoStockBillLogBO.getStockBillLogId(); + // 没有库存项id,需要去生成 + if (Objects.isNull(stockBillLogId)) { + stockBillLogId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_BILL_LOG); + } + + Date now = new Date(); + mongoStockBillLogBO.setStockBillLogId(stockBillLogId); + mongoStockBillLogBO.setStockBillItemLogs(stockBillLogItems); + mongoStockBillLogBO.setCreateTime(now); + mongoStockBillLogBO.setUpdateTime(now); + + for (MongoStockBillLogItemBO stockBillLogItem : stockBillLogItems) { + stockBillLogItem.setCreateTime(now); + stockBillLogItem.setUpdateTime(now); + } + + // 不是供应商的库存记录,supplierId 为null + if (Objects.equals(mongoStockBillLogBO.getSupplierId(), Constant.ZERO_LONG)) { + mongoStockBillLogBO.setSupplierId(null); + } + + // 保存初始化明细信息 + mongoTemplate.insert(mongoStockBillLogBO); + + // 更新es的商品库存和销量数据 + // 采购入库、退款入库、销售出库、订单取消 - 判断是否更新es商品的库存、销量 + // 库存初始化、编辑入库、其他入库、盘盈入库、编辑出库、其他出库、盘盈出库 - 直接更新es商品的库存、销量 + } + + + /** + * 校验出入库明细信息 + */ + private void checkInfo(StockBillLogVO stockBillLog) { + if (CollUtil.isEmpty(stockBillLog.getStockBillLogItems())) { + // 出入库商品项不能为空 + throw new LuckException("商品项不能为空"); + } + if (Objects.nonNull(stockBillLog.getStockBillLogId())) { + // 更新时校验 + MongoStockBillLogBO mongoStockBillLog = mongoTemplate.findById(stockBillLog.getStockBillLogId(), MongoStockBillLogBO.class); + if (Objects.isNull(mongoStockBillLog)) { + throw new LuckException("该出入库信息不存在"); + } + if (AuthUserContext.get().getSysType().equals(SysTypeEnum.MULTISHOP.value())) { + if (!Objects.equals(stockBillLog.getShopId(), mongoStockBillLog.getShopId())) { + throw new LuckException("当前出入库信息不属于你的店铺"); + } + } + if (AuthUserContext.get().getSysType().equals(SysTypeEnum.SUPPLIER.value())) { + if (!Objects.equals(stockBillLog.getSupplierId(), mongoStockBillLog.getSupplierId())) { + throw new LuckException("当前出入库信息不属于你的店铺"); + } + } + if (!Objects.equals(mongoStockBillLog.getStatus(), StockBillStatus.AWAIT_SUBMIT.value())) { + throw new LuckException("当前信息已完成或已作废,无法继续修改,请刷新页面"); + } + stockBillLog.setStockBillNo(mongoStockBillLog.getStockBillNo()); + stockBillLog.setStockBillType(mongoStockBillLog.getStockBillType()); + } + List spuIds= stockBillLog.getStockBillLogItems().stream().map(StockBillLogItemVO::getSpuId).collect(Collectors.toList()); + Map spuMap = spuMapper.listSpuBySpuIds(spuIds).stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getSpuMold)); + for (StockBillLogItemVO stockBillLogItem : stockBillLog.getStockBillLogItems()) { + // 判断非默认仓库且不是普通商品 + if (!Objects.equals(spuMap.get(stockBillLogItem.getSpuId()), SpuMold.REAL.value()) && !Objects.equals(stockBillLog.getWarehouseType(), 0)) { + throw new LuckException("当前仓库不能添加该商品:" + stockBillLogItem.getSpuName()); + } + } + } + + private List processingAmountAndStock(StockBillLogVO stockBillLog) { + List stockBillLogItems = stockBillLog.getStockBillLogItems(); + Integer totalCount = 0; + long totalAmount = 0L; + List skuIds = stockBillLogItems.stream().map(StockBillLogItemVO::getSkuId).collect(Collectors.toList()); + Map> listMap = stockBillLogItems.stream().collect(Collectors.groupingBy(StockBillLogItemVO::getSpuId)); + List list = new ArrayList<>(stockBillLog.getStockBillLogItems().size()); + // TODO 获取sku区域库存 + Map stockPointSkuMap = new HashMap<>(stockBillLogItems.size()); + for (StockBillLogItemVO stockBillLogItem : stockBillLogItems) { + String key = StockUtil.skuPointKey(stockBillLogItem.getSkuId(), stockBillLogItem.getStockPointId()); + if (stockPointSkuMap.containsKey(key)) { + continue; + } + stockPointSkuMap.put(key, new StockPointSkuVO(stockBillLogItem.getSkuId(), stockBillLogItem.getStockPointId())); + } + // 其他操作 + List skuList = skuMapper.listSkuBySkuIds(skuIds); + Map skuMap = skuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, s -> s)); + List stockPointSkuVOS = stockPointSkuService.listByPointId(stockBillLog.getStockPointId()); + Map stockPointSkuVOMap = stockPointSkuVOS.stream().collect(Collectors.toMap(StockPointSkuVO::getSkuId, s -> s)); + List addPointSkus = new ArrayList<>(); + // 获取sku总库存信息集合 + Map skuStockVOMap = stockManager.skuStockMap(new ArrayList<>(stockPointSkuMap.values())); + for (Long spuId : listMap.keySet()) { + for (StockBillLogItemVO stockBillLogItem : listMap.get(spuId)) { + // 其他出库或其他入库 + boolean isOther = (Objects.equals(stockBillLog.getStockBillType(), StockBillType.OTHER_STORAGE.value()) || Objects.equals(stockBillLog.getStockBillType(), StockBillType.OTHER_OUTBOUND.value())) && Objects.equals(stockBillLog.getStatus(), StockBillStatus.SUCCESS.value()); + int stock = 0; + if (isOther) { + // 更新商品与sku的库存 + stock = Objects.equals(stockBillLog.getType(), StockType.OUT_OF_STOCK.value()) ? -stockBillLogItem.getStockCount() : stockBillLogItem.getStockCount(); + // skuId_采购库存数量,skuId_采购库存数量... + // int addOrSub = Objects.equals(stockBillLog.getStockBillType(), StockBillType.OTHER_STORAGE.value()) ? StockUtil.ADD : StockUtil.SUBTRACT; + //list.add(StockUtil.loadQueryArray(stockBillLogItem.getSkuId(), StockManager.WAREHOUSE_ID, stock, LuaOperateEnum.SKU_REPLACE)); + SkuStockVO skuStockVO = new SkuStockVO(stockBillLogItem.getSkuId(), stock, stockBillLog.getStockPointId(), stockBillLog.getStockPointType()); + // 判断该库存点是否有改商品数据 + if (stockPointSkuVOMap.containsKey(stockBillLogItem.getSkuId())) { + // 有就修改 + if (Objects.equals(stockBillLog.getType(), StockType.OUT_OF_STOCK.value())) { + skuStockVO.setOperateType(LuaOperateEnum.SKU_SUB.value()); + } else { + skuStockVO.setOperateType(LuaOperateEnum.SKU_ADD.value()); + } + //list.add(StockUtil.loadQueryArray(stockBillLogItem.getSkuId(), stockBillLog.getStockPointId(), stock, LuaOperateEnum.SKU_ADD)); + } else { + if (Objects.equals(stockBillLog.getType(), StockType.OUT_OF_STOCK.value())) { + throw new LuckException("该库存点没有商品" + stockBillLogItem.getSpuName() + "的库存"); + } + // 没有就添加 + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO( + stockBillLog.getStockPointId(), stockBillLog.getStockPointType(), + stockBillLogItem.getSpuId(),stockBillLogItem.getSkuId(), + 1, stockBillLogItem.getWarehouseType(), stockBillLogItem.getWarehouseType() == null ? StockModeEnum.SINGLE_STOCK.value() : null); + addPointSkus.add(stockPointSkuDTO); + skuStockVO.setOperateType(LuaOperateEnum.SKU_INSERT.value()); + // list.add(StockUtil.loadQueryArray(stockBillLogItem.getSkuId(), stockBillLog.getStockPointId(), stock, LuaOperateEnum.SKU_INSERT)); + } + list.add(skuStockVO); + } + SkuStockVO skuStockVO = skuStockVOMap.get(StockUtil.skuPointKey(stockBillLogItem.getSkuId(), stockBillLogItem.getStockPointId())); + SkuVO skuDb = skuMap.get(stockBillLogItem.getSkuId()); + stockBillLogItem.setAfterStock(skuStockVO.getStock() + stock); + // 更新计算后的库存,用于下一次的计算 + skuStockVO.setStock(stockBillLogItem.getAfterStock()); + // 设置默认单价 + stockBillLogItem.setUnitPrice(skuDb.getPriceFee()); + // 累计总金额 + totalAmount = (long) Arith.add(totalAmount, Arith.mul(stockBillLogItem.getStockCount().doubleValue(), skuDb.getPriceFee().doubleValue())); + // 累计总数量 + totalCount += stockBillLogItem.getStockCount(); + } + } + stockPointSkuService.batchSave(addPointSkus); + stockBillLog.setTotalCount(totalCount); + stockBillLog.setTotalAmount(totalAmount); + return list; + } + + + /** + * 根据类型生成出入库单号 + */ + private String getStockBillNoByType(StockType stockType) { + // 出库 + if (Objects.equals(stockType.value(), 1)) { + // 获取订单号 + return Constant.OB + segmentManager.getSegmentCode(DistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_OUT); + } + // 入库 + else { + // 获取订单号 + return Constant.IB + segmentManager.getSegmentCode(DistributedIdKey.MALL4CLOUD_PRODUCT_STOCK_IN); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void voided(Long shopId, Long stockBillLogId) { + MongoStockBillLogBO stockBillLogBO = mongoTemplate.findById(stockBillLogId, MongoStockBillLogBO.class); + if (Objects.isNull(stockBillLogBO) || !Objects.equals(stockBillLogBO.getStatus(), StockBillStatus.AWAIT_SUBMIT.value())) { + throw new LuckException("当前数据不存在或状态已经发生改变,请刷新后重试"); + } + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + if (!Objects.equals(shopId, stockBillLogBO.getShopId()) && AuthUserContext.get().getSysType().equals(SysTypeEnum.MULTISHOP.value())){ + throw new LuckException("当前数据不属于你的店铺"); + } + if (!Objects.equals(shopId, stockBillLogBO.getSupplierId()) && AuthUserContext.get().getSysType().equals(SysTypeEnum.SUPPLIER.value())){ + throw new LuckException("当前数据不属于你的店铺"); + } + } + StockBillLog stockBillLog = BeanUtil.map(stockBillLogBO, StockBillLog.class); + stockBillLog.setStatus(StockBillStatus.ABOLISHED.value()); + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(stockBillLog.getStockBillLogId())); + Update update = this.getStockBillLogUpdateParam(stockBillLog, null); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoStockBillLogBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException("操作失败,请刷新后重试"); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void generateStockLogOfTakeStock(StockBillLog stockBillLog, List skuDTOList) { + if (CollUtil.isEmpty(skuDTOList)) { + return; + } + Date now = new Date(); + stockBillLog.setCreateTime(now); + stockBillLog.setUpdateTime(now); + stockBillLog.setBusinessTime(now); + stockBillLog.setStatus(StockBillStatus.SUCCESS.value()); + stockBillLog.setStockBillNo(getStockBillNoByType(Objects.requireNonNull(StockBillType.instance(stockBillLog.getStockBillType())).getStockType())); + stockBillLog.setType(Objects.equals(stockBillLog.getStockBillType(), StockBillType.LOSS_OUTBOUND.value()) ? StockType.OUT_OF_STOCK.value() : StockType.WAREHOUSING.value()); + // 构建库存日志商品列表,并统计总数量和总金额 + List stockBillLogItems = new ArrayList<>(skuDTOList.size()); + double totalAmount = 0.0; + int totalCount = 0; + if (CollUtil.isNotEmpty(skuDTOList)) { + for (SkuDTO skuDTO : skuDTOList) { + int changeStock = Math.abs(skuDTO.getChangeStock()); + MongoStockBillLogItemBO stockBillLogItem = this.getStockBillLogItem(skuDTO,changeStock); + totalCount += changeStock; + totalAmount = Arith.add(totalAmount, Arith.mul(skuDTO.getPriceFee(), changeStock)); + stockBillLogItems.add(stockBillLogItem); + } + } + stockBillLog.setTotalCount(totalCount); + stockBillLog.setTotalAmount((long) totalAmount); + // 保存初始化明细信息 + MongoStockBillLogBO mongoStockBillLogBO = new MongoStockBillLogBO(); + BeanUtils.copyProperties(stockBillLog, mongoStockBillLogBO); + // 保存库存日志 + this.saveMongoStockBillLog(mongoStockBillLogBO, stockBillLogItems); + } + + private MongoStockBillLogItemBO getStockBillLogItem(SkuDTO skuDTO, Integer changeStock) { + MongoStockBillLogItemBO stockBillLogItem = new MongoStockBillLogItemBO(); + stockBillLogItem.setSpuId(skuDTO.getSpuId()); + stockBillLogItem.setSkuId(skuDTO.getSkuId()); + stockBillLogItem.setSpuName(skuDTO.getSpuName()); + stockBillLogItem.setSkuName(skuDTO.getSkuName()); + stockBillLogItem.setMainImgUrl(Objects.nonNull(skuDTO.getImgUrl()) ? skuDTO.getImgUrl() : skuDTO.getSpuMainImgUrl()); + stockBillLogItem.setUnitPrice(skuDTO.getPriceFee()); + stockBillLogItem.setStockCount(changeStock); + stockBillLogItem.setAfterStock(skuDTO.getStock() + changeStock); + stockBillLogItem.setPartyCode(skuDTO.getPartyCode()); + return stockBillLogItem; + } + + @Override + public void removeByOrderIds(List orderIds, Integer stockBillType) { + Query query = new Query(Criteria.where("stockBillType").is(stockBillType).and("orderId").in(orderIds)); + List mongoStockBillLogList = mongoTemplate.find(query, MongoStockBillLogBO.class); + if (CollUtil.isEmpty(mongoStockBillLogList)) { + return; + } + List ids = mongoStockBillLogList.stream().map(MongoStockBillLogBO::getStockBillLogId).collect(Collectors.toList()); + Query deleteQuery = new Query(Criteria.where("stockBillLogId").in(ids)); + mongoTemplate.remove(deleteQuery, MongoStockBillLogBO.class); + } + + @Override + public List listSpuIdOfStockChange(Date beginTime, Date endTime) { + List aggregationOperations = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(beginTime) && Objects.nonNull(endTime)) { + aggregationOperations.add(Aggregation.match(Criteria.where("createTime").gte(beginTime).lte(endTime))); + } + aggregationOperations.add(Aggregation.unwind("stockBillItemLogs")); + + aggregationOperations.add(Aggregation.group("stockBillItemLogs.spuId")); + + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoStockBillLogBO.class, + aggregationOperations + ); + logger.info("listSpuIdOfStockChange()的mongodb查询语句: {}", typedAggregation); + + AggregationResults aggregationResults = mongoTemplate.aggregate(typedAggregation, MongoStockBillLogBO.class); + List spuList = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(spuList)) { + return Collections.emptyList(); + } + + return spuList.stream().map(MongoStockBillLogBO::getStockBillLogId).collect(Collectors.toList()); + } + + @Override + public void initStockBillLog() { + while (true) { + int size = 10000; + // 分页获取,每页10000条 + Criteria criteria = Criteria.where("stockBillItemLogs").exists(false); + Query query = new Query(criteria).skip(0).limit(size); + List mongoStockBillLogList = mongoTemplate.find(query, MongoStockBillLogBO.class); + if (CollUtil.isEmpty(mongoStockBillLogList)) { + break; + } + // 查询库存项记录 + List stockBillLogIds = mongoStockBillLogList.stream().map(MongoStockBillLogBO::getStockBillLogId).collect(Collectors.toList()); + Criteria criteriaItem = Criteria.where("stockBillLogId").in(stockBillLogIds); + List mongoStockBillLogItemList = mongoTemplate.find(new Query(criteriaItem), MongoStockBillLogItemBO.class, "stock_bill_log_item"); + if (CollUtil.isEmpty(mongoStockBillLogItemList)) { + break; + } + // 查询sku和spu信息 + Set spuIds = mongoStockBillLogItemList.stream().map(MongoStockBillLogItemBO::getSpuId).collect(Collectors.toSet()); + Set skuIds = mongoStockBillLogItemList.stream().map(MongoStockBillLogItemBO::getSkuId).collect(Collectors.toSet()); + List skuList = skuMapper.listSkuBySkuIds(new ArrayList<>(skuIds)); + ProductLangUtil.skuList(skuList); + List spuList = spuMapper.listSpuBySpuIds(new ArrayList<>(spuIds)); + ProductLangUtil.spuList(spuList); + Map skuMap = skuList.stream().collect(Collectors.toMap(SkuVO::getSkuId, Function.identity())); + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, Function.identity())); + + // 拼接库存项数据 + BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, MongoStockBillLogBO.class); + + Map> stockBillMap = mongoStockBillLogItemList.stream().collect(Collectors.groupingBy(MongoStockBillLogItemBO::getStockBillLogId)); + for (MongoStockBillLogBO mongoStockBillLogBO : mongoStockBillLogList) { + if (!stockBillMap.containsKey(mongoStockBillLogBO.getStockBillLogId())) { + continue; + } + List mongoStockBillLogItems = stockBillMap.get(mongoStockBillLogBO.getStockBillLogId()); + for (MongoStockBillLogItemBO mongoStockBillLogItem : mongoStockBillLogItems) { + mongoStockBillLogItem.setStockBillLogId(null); + SkuVO skuVO = skuMap.get(mongoStockBillLogItem.getSkuId()); + SpuVO spuVO = spuMap.get(mongoStockBillLogItem.getSpuId()); + if (Objects.nonNull(spuVO)) { + mongoStockBillLogItem.setSpuName(spuVO.getName()); + mongoStockBillLogItem.setMainImgUrl(spuVO.getMainImgUrl()); + } + if (Objects.nonNull(skuVO)) { + mongoStockBillLogItem.setSkuName(skuVO.getSkuName()); + mongoStockBillLogItem.setPartyCode(skuVO.getPartyCode()); + if (StrUtil.isNotBlank(skuVO.getImgUrl())) { + mongoStockBillLogItem.setMainImgUrl(skuVO.getImgUrl()); + } + } + } + mongoStockBillLogBO.setStockBillItemLogs(mongoStockBillLogItems); + bulkOperations.replaceOne(new Query(Criteria.where("_id").is(mongoStockBillLogBO.getStockBillLogId())), mongoStockBillLogBO); + } + // 执行批量操作 + bulkOperations.execute(); + if (mongoStockBillLogList.size() < size) { + break; + } + } + } + + @Override + public List listLastSkuStock() { + GroupOperation groupOperation = Aggregation.group("stockBillItemLogs.skuId") + .last("stockBillItemLogs.skuId").as("skuId") + .last("stockBillItemLogs.afterStock").as("afterStock"); + + Aggregation aggregation = Aggregation.newAggregation( + Aggregation.unwind("stockBillItemLogs"), + groupOperation + ); + + AggregationResults aggregationResults = mongoTemplate.aggregate(aggregation, "stock_bill_log", MongoStockBillLogItemBO.class); + List mongoStockBillLogItemBOList = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(mongoStockBillLogItemBOList)) { + return Collections.emptyList(); + } + return mongoStockBillLogItemBOList; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonLangServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonLangServiceImpl.java new file mode 100644 index 0000000..449c8e6 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonLangServiceImpl.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.product.mapper.StockChangeReasonLangMapper; +import com.tmerclub.cloud.product.model.StockChangeReasonLang; +import com.tmerclub.cloud.product.service.StockChangeReasonLangService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * 出入库原因-国际化 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +@Service +public class StockChangeReasonLangServiceImpl implements StockChangeReasonLangService { + + @Autowired + private StockChangeReasonLangMapper stockChangeReasonLangMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> stockChangeReasonLangMapper.list()); + } + + @Override + public StockChangeReasonLang getByStockChangeReasonId(Long stockChangeReasonId) { + List reasonLangs = stockChangeReasonLangMapper.getByStockChangeReasonId(stockChangeReasonId); + // 中0,英1,与LanguageEnum字段不一致,需额外减1 + Integer lang = I18nMessage.getLang() - 1; + for (StockChangeReasonLang reasonLang : reasonLangs) { + if (Objects.equals(lang, reasonLang.getLang())) { + return reasonLang; + } + } + return null; + } + + @Override + public void save(StockChangeReasonLang stockChangeReasonLang) { + stockChangeReasonLangMapper.save(stockChangeReasonLang); + } + + @Override + public void update(StockChangeReasonLang stockChangeReasonLang) { + stockChangeReasonLangMapper.update(stockChangeReasonLang); + } + + @Override + public void deleteById(Long stockChangeReasonId) { + stockChangeReasonLangMapper.deleteById(stockChangeReasonId); + } + + @Override + public Integer countReason(StockChangeReasonDTO stockChangeReasonDTO) { + return stockChangeReasonLangMapper.countReason(stockChangeReasonDTO); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonServiceImpl.java new file mode 100644 index 0000000..cb4528b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/StockChangeReasonServiceImpl.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.product.dto.StockChangeReasonDTO; +import com.tmerclub.cloud.product.mapper.StockChangeReasonLangMapper; +import com.tmerclub.cloud.product.mapper.StockChangeReasonMapper; +import com.tmerclub.cloud.product.model.StockChangeReason; +import com.tmerclub.cloud.product.model.StockChangeReasonLang; +import com.tmerclub.cloud.product.model.StockChangeReasonStatus; +import com.tmerclub.cloud.product.service.StockChangeReasonLangService; +import com.tmerclub.cloud.product.service.StockChangeReasonService; +import com.tmerclub.cloud.product.service.StockChangeReasonStatusService; +import com.tmerclub.cloud.product.vo.StockChangeReasonVO; +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 lhd + * @date 2022-06-22 16:57:27 + */ +@Service +public class StockChangeReasonServiceImpl implements StockChangeReasonService { + + @Autowired + private StockChangeReasonMapper stockChangeReasonMapper; + + @Autowired + private StockChangeReasonLangMapper stockChangeReasonLangMapper; + + + @Autowired + private StockChangeReasonLangService stockChangeReasonLangService; + + @Autowired + private StockChangeReasonStatusService stockChangeReasonStatusService; + + @Override + public PageVO page(PageDTO pageDTO, StockChangeReasonDTO stockChangeReasonDTO) { + return PageUtil.doPage(pageDTO, () -> stockChangeReasonMapper.pageByParams(stockChangeReasonDTO)); + } + + @Override + public StockChangeReasonVO getByStockChangeReasonId(Long stockChangeReasonId) { + StockChangeReasonVO stockChangeReasonVO = BeanUtil.map(stockChangeReasonMapper.getByStockChangeReasonId(stockChangeReasonId), StockChangeReasonVO.class); + List reasonLangs = stockChangeReasonLangMapper.getByStockChangeReasonId(stockChangeReasonId); + // 中0,英1,与LanguageEnum字段不一致,需额外减1 + Integer lang = I18nMessage.getLang() - 1; + for (StockChangeReasonLang reasonLang : reasonLangs) { + if (Objects.equals(reasonLang.getLang(), lang)) { + stockChangeReasonVO.setReason(reasonLang.getReason()); + stockChangeReasonVO.setRemark(reasonLang.getRemark()); + } + } + return stockChangeReasonVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(StockChangeReasonDTO stockChangeReasonDTO) { + stockChangeReasonDTO.setShopId(AuthUserContext.get().getTenantId()); + stockChangeReasonDTO.setSysType(AuthUserContext.get().getSysType()); + // 校验信息 + this.checkInfo(stockChangeReasonDTO, true); + // 设置默认值 + stockChangeReasonDTO.setStatus(StatusEnum.ENABLE.value()); + // 保存出入库原因 + StockChangeReason stockChangeReason = BeanUtil.map(stockChangeReasonDTO, StockChangeReason.class); + stockChangeReason.setStatus(StatusEnum.ENABLE.value()); + stockChangeReasonMapper.save(stockChangeReason); + StockChangeReasonLang stockChangeReasonLang = BeanUtil.map(stockChangeReasonDTO, StockChangeReasonLang.class); + stockChangeReasonLang.setStockChangeReasonId(stockChangeReason.getStockChangeReasonId()); + stockChangeReasonLang.setLang(0); + stockChangeReasonLangMapper.save(stockChangeReasonLang); + } + + @Override + public void update(StockChangeReason stockChangeReason) { + StockChangeReasonDTO stockChangeReasonDTO = BeanUtil.map(stockChangeReason, StockChangeReasonDTO.class); + // 校验信息 + this.checkInfo(stockChangeReasonDTO, false); + stockChangeReasonMapper.update(stockChangeReason); + } + + @Override + public void deleteById(Long stockChangeReasonId) { + stockChangeReasonMapper.deleteById(stockChangeReasonId); + stockChangeReasonLangMapper.deleteById(stockChangeReasonId); + } + + @Override + public void changeStatus(Long shopId, Long stockChangeReasonId, Integer status) { + StockChangeReason stockChangeReason = stockChangeReasonMapper.getByStockChangeReasonId(stockChangeReasonId); + if (Objects.equals(stockChangeReason.getShopId(), Constant.PLATFORM_SHOP_ID) && !Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + // 商家端改变系统内置的出入库原因状态 + if (Objects.equals(status, StatusEnum.DELETE.value())) { + //系统内置出入库原因不能删除 + throw new LuckException("系统内置出入库原因不能删"); + } + // 新增or更新系统出入库原因状态 + StockChangeReasonStatus reasonStatus = stockChangeReasonStatusService.getStatusByShopIdAndReasonId(shopId, stockChangeReasonId); + boolean isSave = Objects.isNull(reasonStatus); + if (isSave) { + reasonStatus = new StockChangeReasonStatus(); + reasonStatus.setShopId(shopId); + reasonStatus.setStockChangeReasonId(stockChangeReasonId); + reasonStatus.setStatus(status); + stockChangeReasonStatusService.save(reasonStatus); + } else { + reasonStatus.setStatus(status); + stockChangeReasonStatusService.update(reasonStatus); + } + } else { + // 非系统出入库原因,直接修改出入库原因 + stockChangeReason.setStatus(status); + stockChangeReasonMapper.update(stockChangeReason); + } + } + + @Override + public List list(StockChangeReasonDTO stockChangeReasonDTO) { + return stockChangeReasonMapper.getByShopId(stockChangeReasonDTO); + } + + /** + * 校验信息 + * @param stockChangeReasonDTO 出入库原因 + * @param saveOrUpdate true: 新增时校验 false: 更新时校验 + */ + private void checkInfo(StockChangeReasonDTO stockChangeReasonDTO, Boolean saveOrUpdate) { + if (!saveOrUpdate && Objects.isNull(stockChangeReasonDTO.getStockChangeReasonId())) { + throw new LuckException("id不能为空"); + } + int count = stockChangeReasonLangService.countReason(stockChangeReasonDTO); + if (count > 0) { + throw new LuckException("出入库原因不能重复!"); + } + + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/TakeStockServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/TakeStockServiceImpl.java new file mode 100644 index 0000000..1beb3ef --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/TakeStockServiceImpl.java @@ -0,0 +1,493 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.delivery.feign.StationFeignClient; +import com.tmerclub.cloud.api.delivery.vo.StationVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.constant.*; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.dto.TakeStockDTO; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.TakeStockMapper; +import com.tmerclub.cloud.product.model.StockBillLog; +import com.tmerclub.cloud.product.model.TakeStock; +import com.tmerclub.cloud.product.model.TakeStockSpu; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.util.StockUtil; +import com.tmerclub.cloud.product.vo.TakeStockExcelVO; +import com.tmerclub.cloud.product.vo.TakeStockVO; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author lhd + * @date 2022-06-22 16:57:27 + */ +@Service +public class TakeStockServiceImpl implements TakeStockService { + private static final Logger LOGGER = LoggerFactory.getLogger(TakeStockServiceImpl.class); + + @Autowired + private TakeStockMapper takeStockMapper; + @Autowired + private TakeStockSpuService takeStockSpuService; + @Autowired + private SkuService skuService; + @Autowired + private SpuService spuService; + @Autowired + private SkuStockService skuStockService; + + @Autowired + private StockManager stockManager; + + @Autowired + private StockBillLogService stockBillLogService; + @DubboReference + private AccountFeignClient accountFeignClient; + @Autowired + private WarehouseService warehouseService; + @DubboReference + private StationFeignClient stationFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> takeStockMapper.list(new TakeStockDTO())); + } + + @Override + public TakeStockVO getByTakeStockId(Long takeStockId) { + TakeStock takeStock = takeStockMapper.getByTakeStockId(takeStockId); + TakeStockVO takeStockVO = new TakeStockVO(); + BeanUtils.copyProperties(takeStock, takeStockVO); + // 补充仓库名称 + WarehouseVO warehouse = null; + if (!Objects.isNull(takeStockVO.getWarehouseId())) { + warehouse = warehouseService.getByWarehouseId(takeStockVO.getWarehouseId()); + } + if (!Objects.isNull(warehouse)) { + takeStockVO.setWarehouseName(warehouse.getWarehouseName()); + } else { + takeStockVO.setWarehouseName("默认仓库"); + takeStockVO.setStockPointType(StockPointType.WAREHOUSE.getValue()); + } + return takeStockVO; + } + + @Override + public void save(TakeStock takeStock) { + // 检查仓库 + WarehouseVO warehouse = this.checkWarehouse(takeStock.getWarehouseId(), takeStock.getShopId(), SysTypeEnum.MULTISHOP.value()); + takeStock.setStockPointType(Objects.equals(warehouse.getSysType(), SysTypeEnum.STATION.value()) ? StockPointType.STATION.getValue() : StockPointType.WAREHOUSE.getValue()); + takeStockMapper.save(takeStock); + } + + @Override + public void update(TakeStock takeStock) { + takeStockMapper.update(takeStock); + } + + @Override + public void deleteById(Long takeStockId) { + takeStockMapper.deleteById(takeStockId); + } + + @Override + public PageVO pageByParam(PageDTO pageDTO, TakeStockDTO takeStockDTO) { + PageVO page = PageUtil.doPage(pageDTO, () -> takeStockMapper.pageByParam(I18nMessage.getLang(), takeStockDTO)); + // 数据准备 + List takeStockList = page.getList(); + Set warehouseIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (TakeStockVO takeStockVO : takeStockList) { + warehouseIds.add(takeStockVO.getWarehouseId()); + } + // 查询仓库数据 + List warehouses = new ArrayList<>(0); + if (!CollectionUtils.isEmpty(warehouseIds)) { + WarehouseDTO searchDTO = new WarehouseDTO(); + searchDTO.setWarehouseIds(new ArrayList<>(warehouseIds)); + warehouses = warehouseService.listWarehouse(searchDTO); + } + Map warehouseMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(warehouses)) { + warehouseMap = warehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + } + // 查询制单人信息 + Map userIdNameMap = getUserIdNameMap(takeStockList.stream().map(TakeStockVO::getMaker)); + // 信息补充or处理 + for (TakeStockVO takeStockVO : takeStockList) { + // 补充制单人名称 + takeStockVO.setMakerName(userIdNameMap.get(takeStockVO.getMaker())); + // 手机号码处理 + if (StrUtil.isNotBlank(takeStockVO.getMakerMobile())) { + takeStockVO.setMakerMobile(PhoneUtil.hideBetween(takeStockVO.getMakerMobile()).toString()); + } + // 补充仓库名称 + takeStockVO.setWarehouseName(warehouseMap.get(takeStockVO.getWarehouseId())); + takeStockVO.setStockPointType(takeStockVO.getStockPointType() == null ? StockPointType.WAREHOUSE.getValue() : takeStockVO.getStockPointType()); + } + return page; + } + + private Map getUserIdNameMap(Stream takeStockList) { + Set userIds = takeStockList.collect(Collectors.toSet()); + List accounts = accountFeignClient.listByUserIdsAndPhoneAndType(new ArrayList<>(userIds), null, SysTypeEnum.MULTISHOP.value()).getData(); + Map userIdNameMap = new HashMap<>(16); + if (!CollectionUtils.isEmpty(accounts)) { + userIdNameMap = accounts.stream().collect(Collectors.toMap(AuthAccountVO::getUserId, AuthAccountVO::getUsername)); + } + return userIdNameMap; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void updateTakeStock(TakeStockDTO takeStockDTO) { + // 校验实物盘点信息 + this.checkInfo(takeStockDTO); + // 更新实物盘点 + TakeStock takeStock = new TakeStock(); + BeanUtils.copyProperties(takeStockDTO, takeStock); + takeStockMapper.update(takeStock); + // 补充商品盘盈盘亏状态 + if (!CollectionUtils.isEmpty(takeStockDTO.getTakeStockSpuList())) { + for (TakeStockSpu takeStockSpu : takeStockDTO.getTakeStockSpuList()) { + if (takeStockSpu.getStocks().compareTo(takeStockSpu.getTotalStock()) > 0) { + takeStockSpu.setIoType(TakeStockSpuStatus.LOSS.value()); + } else if (takeStockSpu.getStocks().compareTo(takeStockSpu.getTotalStock()) < 0) { + takeStockSpu.setIoType(TakeStockSpuStatus.PROFIT.value()); + } else { + takeStockSpu.setIoType(TakeStockSpuStatus.EQUAL.value()); + } + } + } + // 更新实物盘点商品 + takeStockSpuService.updateByTakeStockDTO(takeStockDTO); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void finishTakeStock(TakeStockDTO takeStockDTO) { + // 数据校验 + TakeStock dbTakeStock = this.checkInfo(takeStockDTO); + // 更新实物盘点 + TakeStock takeStock = new TakeStock(); + BeanUtils.copyProperties(takeStockDTO, takeStock); + takeStock.setBillStatus(TakeStockBillStatus.COMPLETED.value()); + takeStockMapper.update(takeStock); + // 更新库存并获取ioType分类 + if (CollectionUtils.isEmpty(takeStockDTO.getTakeStockSpuList())) { + return; + } + Map> ioTypeSkuMap = this.updateSkuAndGetIoTypeMap(takeStockDTO.getTakeStockSpuList(), dbTakeStock.getWarehouseId()); + // 更新实物盘点商品 + takeStockSpuService.updateByTakeStockDTO(takeStockDTO); + // 记录出入库信息 + StockBillLog stockBillLog; + List skuStocks = new ArrayList<>(Constant.INITIAL_CAPACITY); + List skuDTOList = ioTypeSkuMap.get(TakeStockSpuStatus.PROFIT.value()); + if (!CollectionUtils.isEmpty(skuDTOList)) { + // 盘盈记录 + stockBillLog = this.buildStockBillLog(dbTakeStock, StockBillType.PROFIT_STORAGE); + stockBillLogService.generateStockLogOfTakeStock(stockBillLog, skuDTOList); + for (SkuDTO skuDTO : skuDTOList) { + skuStocks.add(this.buildSkuStock(skuDTO, dbTakeStock.getWarehouseId(), LuaOperateEnum.SKU_ADD)); + } + } + skuDTOList = ioTypeSkuMap.get(TakeStockSpuStatus.LOSS.value()); + if (!CollectionUtils.isEmpty(skuDTOList)) { + // 盘亏记录 + stockBillLog = this.buildStockBillLog(dbTakeStock, StockBillType.LOSS_OUTBOUND); + stockBillLogService.generateStockLogOfTakeStock(stockBillLog, skuDTOList); + for (SkuDTO skuDTO : skuDTOList) { + skuStocks.add(this.buildSkuStock(skuDTO, dbTakeStock.getWarehouseId(), LuaOperateEnum.SKU_SUB)); + } + } + // 更新库存 + if (!CollectionUtils.isEmpty(skuStocks)) { + skuStockService.changeSkuStock(skuStocks); + } + } + + @Override + public void nullifyByWarehouseId(Long warehouseId) { + // 查找未完成/作废的实物盘点 + TakeStockDTO searchParam = new TakeStockDTO(); + searchParam.setWarehouseId(warehouseId); + searchParam.setBillStatus(TakeStockBillStatus.TAKING.value()); + List takeStocks = takeStockMapper.list(searchParam); + if (CollectionUtils.isEmpty(takeStocks)) { + return; + } + // 作废(直接更新状态) + for (TakeStock takeStock : takeStocks) { + takeStock.setBillStatus(TakeStockBillStatus.VOIDED.value()); + takeStockMapper.update(takeStock); + } + } + + @Override + public void exportExcel(TakeStockDTO takeStockDTO, HttpServletResponse response) { + // 获取excel导出数据 + List takeStockExcelVOList = takeStockMapper.listTakeStockExportData(takeStockDTO, I18nMessage.getLang()); + // 查询仓库信息 + Set warehouseIds = new HashSet<>(Constant.INITIAL_CAPACITY); + for (TakeStockExcelVO takeStockExcelVO : takeStockExcelVOList) { + warehouseIds.add(takeStockExcelVO.getWarehouseId()); + } + List warehouses = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(warehouseIds)) { + WarehouseDTO searchDTO = new WarehouseDTO(); + searchDTO.setWarehouseIds(new ArrayList<>(warehouseIds)); + warehouses = warehouseService.listWarehouse(searchDTO); + } + Map warehouseMap = new HashMap<>(Constant.INITIAL_CAPACITY); + if (!CollectionUtils.isEmpty(warehouses)) { + warehouseMap = warehouses.stream().collect(Collectors.toMap(WarehouseVO::getWarehouseId, WarehouseVO::getWarehouseName)); + } + // 制单人名称数据准备 + Map userIdNameMap = getUserIdNameMap(takeStockExcelVOList.stream().map(TakeStockExcelVO::getMaker)); + // 数据转换 + TakeStockBillStatus billStatusEnum; + TakeStockSpuStatus spuStatusEnum; + for (TakeStockExcelVO takeStockExcelVO : takeStockExcelVOList) { + // 盘点状态 + billStatusEnum = TakeStockBillStatus.instance(takeStockExcelVO.getBillStatus()); + takeStockExcelVO.setBillStatusStr(billStatusEnum == null ? "" : billStatusEnum.strCn()); + // 盈亏状态 + spuStatusEnum = TakeStockSpuStatus.instance(takeStockExcelVO.getIoType()); + takeStockExcelVO.setIoTypeStr(spuStatusEnum == null ? "" : spuStatusEnum.str()); + // 制单人名称 + takeStockExcelVO.setMakerName(userIdNameMap.get(takeStockExcelVO.getMaker())); + // 仓库名称 + takeStockExcelVO.setWarehouseName(warehouseMap.get(takeStockExcelVO.getWarehouseId())); + // 库存点类型 + takeStockExcelVO.setStockPointTypeStr(Objects.equals(takeStockExcelVO.getStockPointType(), StockPointType.STATION.getValue()) ? StockPointType.STATION.getDesc() : StockPointType.WAREHOUSE.getDesc()); + } + // 数据导出为excel + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder writerBuilder = ExcelUtil.getExcelWriterMerge(response, TakeStockExcelVO.EXCEL_NAME, TakeStockExcelVO.MERGE_ROW_INDEX, TakeStockExcelVO.MERGE_COLUMN_INDEX); + if (CollUtil.isNotEmpty(takeStockExcelVOList)) { + excelWriter = writerBuilder.build(); + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel + .writerSheet(TakeStockExcelVO.SHEET_NAME) + .head(TakeStockExcelVO.class) + .build(); + excelWriter.write(takeStockExcelVOList, sheetWriter); + } + } catch (Exception e) { + LOGGER.error("导出excel失败{}", e.getMessage()); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + @Override + public Long countUnFinish(Long warehouseId) { + if (Objects.isNull(warehouseId)) { + return 0L; + } + return takeStockMapper.countUnFinish(warehouseId); + } + + /** + * 校验实物盘点信息 + * + * @param takeStock + * @return 数据库实物判断信息 + */ + private TakeStock checkInfo(TakeStockDTO takeStock) { + TakeStock dbTakeStock = takeStockMapper.getByTakeStockId(takeStock.getTakeStockId()); + if (!Objects.equals(dbTakeStock.getShopId(), takeStock.getShopId())) { + throw new LuckException("当前盘点信息不属于你的店铺"); + } + if (Objects.equals(dbTakeStock.getBillStatus(), TakeStockBillStatus.COMPLETED.value()) + || Objects.equals(dbTakeStock.getBillStatus(), TakeStockBillStatus.VOIDED.value())) { + throw new LuckException(("当前盘点任务已完成或已作废,请刷新页面")); + } + //不是废弃再进行判断 + List prods = takeStock.getTakeStockSpuList(); + for (TakeStockSpu prod : prods) { + if (Objects.isNull(prod.getTotalStock())) { + throw new LuckException("商品实盘库存不能为空"); + } + } + return dbTakeStock; + } + + /** + * 更新库存并获取分类ioTypeMap + * + * @param takeStockProdList + * @return + */ + private Map> updateSkuAndGetIoTypeMap(List takeStockProdList, Long warehouseId) { + List skuIds = takeStockProdList.stream().map(TakeStockSpu::getSkuId).collect(Collectors.toList()); + List spuIds = takeStockProdList.stream().map(TakeStockSpu::getSpuId).collect(Collectors.toList()); + List skuVOList = skuService.listSkuAndStockBySkuIds(skuIds); + List skuList = BeanUtil.mapAsList(skuVOList, SkuDTO.class); + Map skuIdSkuMap = skuList.stream().collect(Collectors.toMap(SkuDTO::getSkuId, s -> s)); + List spuList = spuService.listSpuBySpuIds(spuIds); + Map spuMap = spuList.stream().collect(Collectors.toMap(SpuVO::getSpuId, s -> s)); + // 库存查询 + List skuStocks = skuIds.stream().map(x -> new SkuStockVO(x, warehouseId)).collect(Collectors.toList()); + Map skuStockMap = stockManager.mapSkuStockBySkuStocks(skuStocks); + // 根据sku库存盘点判断盘盈or盘亏,并进行归类 + Map> ioTypeSkuMap = new HashMap<>(16); + List skuDtoList; + Integer ioType; + SkuDTO sku; + SkuStockVO skuStockVO; + for (TakeStockSpu prod : takeStockProdList) { + sku = skuIdSkuMap.get(prod.getSkuId()); + SpuVO spuVO = spuMap.get(prod.getSpuId()); + sku.setSpuName(spuVO.getName()); + sku.setSpuMainImgUrl(spuVO.getMainImgUrl()); + skuStockVO = skuStockMap.get(StockUtil.skuPointKey(sku.getSkuId(), warehouseId)); + //盈亏以及异常判断 + if (Objects.isNull(sku)) { + //sku删除,异常 + prod.setIoType(TakeStockSpuStatus.EXCEPTION.value()); + prod.setExceptionReason(TakeStockExceptionEnum.DELETE_PROD.value()); + continue; + } else if (Objects.isNull(skuStockVO) || + ! prod.getStocks().equals(skuStockVO.getStock())) { + //库存不相等,异常 + prod.setIoType(TakeStockSpuStatus.EXCEPTION.value()); + prod.setExceptionReason(TakeStockExceptionEnum.PROD_CHANGE.value()); + continue; + } + if (prod.getStocks() > prod.getTotalStock()) { + //盘亏 + prod.setIoType(TakeStockSpuStatus.LOSS.value()); + ioType = TakeStockSpuStatus.LOSS.value(); + } else if (prod.getStocks() < prod.getTotalStock()) { + //盘盈 + prod.setIoType(TakeStockSpuStatus.PROFIT.value()); + ioType = TakeStockSpuStatus.PROFIT.value(); + } else { + //盘平 + prod.setIoType(TakeStockSpuStatus.EQUAL.value()); + continue; + } + // 分类 + sku.setChangeStock(prod.getTotalStock() - prod.getStocks()); + sku.setStock(prod.getTotalStock()); + skuDtoList = ioTypeSkuMap.getOrDefault(ioType, new ArrayList<>(Constant.INITIAL_CAPACITY)); + skuDtoList.add(sku); + ioTypeSkuMap.put(ioType, skuDtoList); + } + return ioTypeSkuMap; + } + + /** + * 检查仓库 + * @param warehouseId 仓库id + * @param shopId 店铺id + * @param sysType 系统类型 + */ + private WarehouseVO checkWarehouse(Long warehouseId, + Long shopId, + Integer sysType) { + WarehouseVO warehouse = warehouseService.getByWarehouseId(warehouseId); + if (Objects.isNull(warehouse)) { + throw new LuckException(String.format("仓库[%s]不存在", warehouseId)); + } + if (Objects.equals(warehouse.getSysType(), com.tmerclub.cloud.common.constant.SysTypeEnum.STATION.value())) { + // 检查门店仓库 + if(Objects.equals(sysType, com.tmerclub.cloud.common.constant.SysTypeEnum.SUPPLIER.value())) { + throw new LuckException("供应商不存在门店"); + } + StationVO station = stationFeignClient.getStationByInside(warehouse.getShopId()).getData(); + if (!Objects.equals(station.getShopId(), shopId)) { + throw new LuckException(String.format("门店[%s]非该店铺的门店", station.getStationId())); + } + } else if (!Objects.equals(shopId, warehouse.getShopId()) + || !Objects.equals(sysType, warehouse.getSysType())) { + // 检查商家/供应商仓库 + throw new LuckException(String.format("仓库[%s]非该店铺的仓库", warehouseId)); + } + return warehouse; + } + + /** + * 构建库存流水日志对象 + * @param takeStock 实物判断 + * @param stockBillType 库存流水类型 + * @return 库存流水日志对象 + */ + private StockBillLog buildStockBillLog(TakeStock takeStock, StockBillType stockBillType) { + StockBillLog stockBillLog = new StockBillLog(); + stockBillLog.setShopId(takeStock.getShopId()); + stockBillLog.setEmployeeId(takeStock.getMaker()); + stockBillLog.setMakerMobile(takeStock.getMakerMobile()); + stockBillLog.setStockBillType(stockBillType.value()); + stockBillLog.setStockPointId(takeStock.getWarehouseId()); + stockBillLog.setStockPointType(takeStock.getStockPointType()); + stockBillLog.setSourceOrderNo(takeStock.getTakeStockNo()); + return stockBillLog; + } + + /** + * 构建sku库存对象 + * @param skuDTO skuDTO + * @param warehouseId 仓库id + * @param luaOperateEnum 库存操作 + * @return sku库存对象 + */ + private SkuStockVO buildSkuStock(SkuDTO skuDTO, Long warehouseId, LuaOperateEnum luaOperateEnum) { + SkuStockVO skuStockVO = new SkuStockVO(); + BeanUtils.copyProperties(skuDTO, skuStockVO); + skuStockVO.setStockPointId(warehouseId); + skuStockVO.setOperateType(luaOperateEnum.value()); + skuStockVO.setStock(Math.abs(skuDTO.getChangeStock())); + return skuStockVO; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/TakeStockSpuServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/TakeStockSpuServiceImpl.java new file mode 100644 index 0000000..0623d88 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/TakeStockSpuServiceImpl.java @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.auth.vo.AuthAccountVO; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.constant.StockPointType; +import com.tmerclub.cloud.common.product.constant.TakeStockBillStatus; +import com.tmerclub.cloud.common.product.constant.TakeStockSpuStatus; +import com.tmerclub.cloud.common.product.dto.SkuDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.product.dto.TakeStockDTO; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.mapper.SpuMapper; +import com.tmerclub.cloud.product.mapper.TakeStockMapper; +import com.tmerclub.cloud.product.mapper.TakeStockSpuMapper; +import com.tmerclub.cloud.product.model.TakeStock; +import com.tmerclub.cloud.product.model.TakeStockSpu; +import com.tmerclub.cloud.product.service.*; +import com.tmerclub.cloud.product.util.StockUtil; +import com.tmerclub.cloud.product.vo.TakeStockExcelVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuExcelVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuImportVO; +import com.tmerclub.cloud.product.vo.TakeStockSpuVO; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 盘点商品列表 + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +@Service +public class TakeStockSpuServiceImpl implements TakeStockSpuService { + private static final Logger LOGGER = LoggerFactory.getLogger(TakeStockSpuServiceImpl.class); + + @Autowired + private TakeStockSpuMapper takeStockSpuMapper; + @Autowired + private TakeStockMapper takeStockMapper; + @Autowired + private SpuMapper spuMapper; + + @Autowired + private SkuService skuService; + @Autowired + private SpuService spuService; + @Autowired + private StockPointSkuService stockPointSkuService; + + @Autowired + private StockManager stockManager; + + @DubboReference + private AccountFeignClient accountFeignClient; + @Autowired + private WarehouseService warehouseService; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> takeStockSpuMapper.list()); + } + + @Override + public TakeStockSpu getByTakeStockSpuId(Long takeStockSpuId) { + return takeStockSpuMapper.getByTakeStockSpuId(takeStockSpuId); + } + + @Override + public void save(TakeStockSpu takeStockSpu) { + takeStockSpuMapper.save(takeStockSpu); + } + + @Override + public void update(TakeStockSpu takeStockSpu) { + takeStockSpuMapper.update(takeStockSpu); + } + + @Override + public void deleteById(Long takeStockSpuId) { + takeStockSpuMapper.deleteById(takeStockSpuId); + } + + @Override + public void updateByTakeStockDTO(TakeStockDTO takeStockDTO) { + // 先删后增 + Long takeStockId = takeStockDTO.getTakeStockId(); + takeStockSpuMapper.deleteByTackStockId(takeStockId); + if (CollectionUtils.isEmpty(takeStockDTO.getTakeStockSpuList())) { + return; + } + takeStockSpuMapper.saveBatch(takeStockDTO.getTakeStockSpuList()); + } + + @Override + public List listByTakeStockId(Long takeStockId) { + return takeStockSpuMapper.listByTakeStockId(takeStockId, I18nMessage.getLang()); + } + + @Override + public void downloadModel(HttpServletResponse response) { + ExcelWriter excelWriter = null; + try { + excelWriter = ExcelUtil.getExcelWriterMerge( + response, + TakeStockSpuExcelVO.EXCEL_NAME, + TakeStockSpuExcelVO.MERGE_ROW_INDEX, + TakeStockSpuExcelVO.MERGE_COLUMN_INDEX + ).build(); + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel + .writerSheet(TakeStockSpuExcelVO.SHEET_NAME) + .head(TakeStockSpuExcelVO.class) + .build(); + excelWriter.write(Collections.emptyList(), sheetWriter); + } catch (Exception e) { + LOGGER.error("导出实物盘点导入模板excel失败,原因{}", e.getMessage()); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + @Override + public void importExcel(List list, + List errorList, + Set partyCodes, + Long takeStockId, + TakeStockSpuImportVO takeStockSpuImportVO) { + if (checkInfo(list, takeStockId, takeStockSpuImportVO)) { + return; + } + List takeStockSpuVOList = this.listByTakeStockId(takeStockId); + if (CollectionUtil.isNotEmpty(takeStockSpuVOList)) { + takeStockSpuImportVO.setTips("该盘点单已有商品导入,无法使用批量导入功能"); + return; + } + Map changeStockMap = list.stream().collect(Collectors.toMap(TakeStockSpuExcelVO::getPartyCode, TakeStockSpuExcelVO::getChangeStock)); + TakeStock dbTakeStock = takeStockMapper.getByTakeStockId(takeStockId); + // 查询sku信息 + SkuDTO skuDTO = new SkuDTO(); + skuDTO.setPartyCodes(new ArrayList<>(partyCodes)); + List skuVOList = skuService.listSku(skuDTO); + if (CollectionUtils.isEmpty(skuVOList)) { + takeStockSpuImportVO.setTips("导入商品不存在"); + return; + } + Map skuMap = skuVOList.stream().collect(Collectors.toMap(SkuVO::getSkuId, x -> x)); + // 校验仓库是否存在这些skuId + List skuIds = stockPointSkuService.checkStockPointContainSku(Collections.singletonList(dbTakeStock.getWarehouseId()), new ArrayList<>(skuMap.keySet())); + if (CollectionUtils.isEmpty(skuIds)) { + takeStockSpuImportVO.setTips("导入商品含有非当前仓库的商品"); + return; + } + // 查询库存 + List skuStocks = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long skuId : skuIds) { + skuStocks.add(new SkuStockVO(skuId, dbTakeStock.getWarehouseId())); + } + Map skuStockMap = stockManager.mapSkuStockBySkuStocks(skuStocks); + // 构建实物盘点商品对象 + List takeStockSpuList = new ArrayList<>(Constant.INITIAL_CAPACITY); + Integer ioType; + for (Long skuId : skuIds) { + TakeStockSpu takeStockSpu = new TakeStockSpu(); + SkuVO skuVO = skuMap.get(skuId); + takeStockSpu.setTakeStockId(takeStockId); + takeStockSpu.setSpuId(skuVO.getSpuId()); + takeStockSpu.setSkuId(skuVO.getSkuId()); + SkuStockVO skuStockVO = skuStockMap.get(StockUtil.skuPointKey(skuId, dbTakeStock.getWarehouseId())); + takeStockSpu.setStocks(Objects.isNull(skuStockVO) ? 0 : skuStockVO.getStock()); + takeStockSpu.setTotalStock(changeStockMap.get(skuVO.getPartyCode())); + if (takeStockSpu.getStocks().compareTo(takeStockSpu.getTotalStock()) == 0) { + ioType = TakeStockSpuStatus.EQUAL.value(); + } else if (takeStockSpu.getStocks().compareTo(takeStockSpu.getTotalStock()) > 0) { + ioType = TakeStockSpuStatus.PROFIT.value(); + } else { + ioType = TakeStockSpuStatus.LOSS.value(); + } + takeStockSpu.setIoType(ioType); + takeStockSpuList.add(takeStockSpu); + } + // 新增数据 + if (takeStockSpuList.size() > 0) { + takeStockSpuMapper.saveBatch(takeStockSpuList); + } + String tips = "检查到" + list.size() + "条商品信息,成功导入" + + (takeStockSpuList.size()) + "条商品信息!错误" + (list.size() - takeStockSpuList.size()) + "条商品信息!" + + (CollUtil.isNotEmpty(errorList) ? errorList.toString() : ""); + takeStockSpuImportVO.setTips(tips); + takeStockSpuImportVO.setTakeStockSpuList(takeStockSpuList); + } + + private boolean checkInfo(List list, Long takeStockId, TakeStockSpuImportVO takeStockSpuImportVO) { + if (CollectionUtils.isEmpty(list)) { + takeStockSpuImportVO.setTips("导入数据为空,请检查下文件"); + return true; + } + TakeStock takeStock = takeStockMapper.getByTakeStockId(takeStockId); + if (takeStock == null) { + takeStockSpuImportVO.setTips("实物盘点不存在"); + return true; + } + if (Objects.equals(takeStock.getBillStatus(), TakeStockBillStatus.VOIDED.value()) || + Objects.equals(takeStock.getBillStatus(), TakeStockBillStatus.COMPLETED.value())) { + takeStockSpuImportVO.setTips("当前盘点任务已完成或已作废,请返回列表页面后刷新"); + return true; + } + return false; + } + + @Override + public void exportExcel(Long takeStockId, HttpServletResponse response) { + TakeStock dbTakeStock = takeStockMapper.getByTakeStockId(takeStockId); + if (Objects.isNull(dbTakeStock)) { + throw new LuckException("实物判断不存在"); + } + // 获取excel导出数据 + TakeStockDTO takeStockDTO = new TakeStockDTO(); + takeStockDTO.setTakeStockId(takeStockId); + takeStockDTO.setShopId(AuthUserContext.get().getTenantId()); + List takeStockExcelVOList = takeStockMapper.listTakeStockExportData(takeStockDTO, I18nMessage.getLang()); + // 获取仓库信息 + String warehouseName = ""; + if (!Objects.isNull(dbTakeStock.getWarehouseId())) { + WarehouseVO warehouse = warehouseService.getByWarehouseId(dbTakeStock.getWarehouseId()); + warehouseName = Objects.isNull(warehouse) ? "" : warehouse.getWarehouseName(); + } + // 制单人名称数据准备 + Map userIdNameMap = getUserIdNameMap(takeStockExcelVOList.stream().map(TakeStockExcelVO::getMaker)); + // 字典数据信息补充 + TakeStockBillStatus billStatusEnum; + TakeStockSpuStatus spuStatusEnum; + for (TakeStockExcelVO takeStockExcelVO : takeStockExcelVOList) { + billStatusEnum = TakeStockBillStatus.instance(takeStockExcelVO.getBillStatus()); + takeStockExcelVO.setBillStatusStr(billStatusEnum == null ? "" : billStatusEnum.strCn()); + spuStatusEnum = TakeStockSpuStatus.instance(takeStockExcelVO.getIoType()); + takeStockExcelVO.setIoTypeStr(spuStatusEnum == null ? "" : spuStatusEnum.str()); + // 制单人名称 + takeStockExcelVO.setMakerName(userIdNameMap.get(takeStockExcelVO.getMaker())); + // 仓库信息 + takeStockExcelVO.setWarehouseName(warehouseName); + takeStockExcelVO.setStockPointTypeStr(Objects.equals(StockPointType.STATION.getValue(), dbTakeStock.getStockPointType()) ? StockPointType.STATION.getDesc() : StockPointType.WAREHOUSE.getDesc()); + } + // 数据导出为excel + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + excelWriter = ExcelUtil.getExcelWriterMerge(response, TakeStockExcelVO.EXCEL_NAME, TakeStockExcelVO.MERGE_ROW_INDEX, TakeStockExcelVO.MERGE_COLUMN_INDEX).build(); + if (CollUtil.isNotEmpty(takeStockExcelVOList)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel + .writerSheet(TakeStockExcelVO.SHEET_NAME) + .head(TakeStockExcelVO.class) + .build(); + excelWriter.write(takeStockExcelVOList, sheetWriter); + } + } catch (Exception e) { + LOGGER.error("导出excel失败{} ", e.getMessage()); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + private Map getUserIdNameMap(Stream takeStockList) { + Set userIds = takeStockList.collect(Collectors.toSet()); + List accounts = accountFeignClient.listByUserIdsAndPhoneAndType(new ArrayList<>(userIds), null, SysTypeEnum.MULTISHOP.value()).getData(); + Map userIdNameMap = new HashMap<>(16); + if (!CollectionUtils.isEmpty(accounts)) { + userIdNameMap = accounts.stream().collect(Collectors.toMap(AuthAccountVO::getUserId, AuthAccountVO::getUsername)); + } + return userIdNameMap; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/WarehouseServiceImpl.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/WarehouseServiceImpl.java new file mode 100644 index 0000000..9432481 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/service/impl/WarehouseServiceImpl.java @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.delivery.feign.AreaFeignClient; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.order.feign.AllotOrderFeignClient; +import com.tmerclub.cloud.api.order.feign.PurchaseOrderFeignClient; +import com.tmerclub.cloud.api.product.dto.WarehouseDTO; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.product.feign.StockPointFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.SysTypeEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.dto.AreaDTO; +import com.tmerclub.cloud.common.order.vo.WarehouseVO; +import com.tmerclub.cloud.common.product.vo.StockPointVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.product.constant.DistributedIdKey; +import com.tmerclub.cloud.product.dto.WarehouseAreaDTO; +import com.tmerclub.cloud.product.mapper.TakeStockMapper; +import com.tmerclub.cloud.product.mapper.WarehouseMapper; +import com.tmerclub.cloud.product.model.Warehouse; +import com.tmerclub.cloud.product.service.WarehouseAreaService; +import com.tmerclub.cloud.product.service.WarehouseService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +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.*; +import java.util.stream.Collectors; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-08 11:11:44 + */ +@Service +public class WarehouseServiceImpl implements WarehouseService { + + @Autowired + private WarehouseMapper warehouseMapper; + @Autowired + private WarehouseAreaService warehouseAreaService; + @Autowired + private TakeStockMapper takeStockMapper; + @DubboReference + private SpuFeignClient spuFeignClient; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private StockPointFeignClient stockPointFeignClient; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + @DubboReference + private AreaFeignClient areaFeignClient; + @DubboReference + private AllotOrderFeignClient allotOrderFeignClient; + @DubboReference + private PurchaseOrderFeignClient purchaseOrderFeignClient; + + @Override + public PageVO page(PageDTO pageDTO, WarehouseDTO warehouseDTO) { + PageVO pageVO = PageUtil.doPage(pageDTO, () -> warehouseMapper.list(warehouseDTO)); + if (pageVO.getList().size() == 0) { + return pageVO; + } + if (Objects.nonNull(warehouseDTO.getSkuId())) { + List warehouseIds = pageVO.getList().stream().map(WarehouseVO::getWarehouseId).collect(Collectors.toList()); + Map stockMap = skuStockFeignClient.getStockMapBySkuIdAndStockPointIds(warehouseDTO.getSkuId(), warehouseIds).getData(); + for (WarehouseVO warehouseVO : pageVO.getList()) { + warehouseVO.setStock(stockMap.containsKey(warehouseVO.getWarehouseId()) ? stockMap.get(warehouseVO.getWarehouseId()) : 0); + } + } + for (WarehouseVO warehouseVO : pageVO.getList()) { + if (StrUtil.isNotBlank(warehouseVO.getPhone()) && PrincipalUtil.isMobile(warehouseVO.getPhone())) { + warehouseVO.setPhone(PhoneUtil.hideBetween(warehouseVO.getPhone()).toString()); + } + } + return pageVO; + } + + @Override + @Cacheable(cacheNames = ProductCacheNames.WAREHOUSE_BY_ID_PREFIX, key = "#warehouseId", sync = true) + public WarehouseVO getByWarehouseId(Long warehouseId) { + WarehouseVO warehouse = warehouseMapper.getByWarehouseId(warehouseId); + if (warehouse == null) { + return null; + } + List areaIds = warehouseMapper.getWarehouseAreaByWarehouseId(warehouseId); + warehouse.setCityList(areaFeignClient.listByAreaIdList(areaIds)); + return warehouse; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertWarehouseAndArea(WarehouseDTO warehouseDTO) { + this.checkIsRepeat(warehouseDTO); + Warehouse warehouse = BeanUtil.map(warehouseDTO, Warehouse.class); + if (Objects.isNull(warehouseDTO.getWarehouseId())) { + warehouse.setWarehouseId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_POINT)); + } + warehouse.setCreateTime(new Date()); + warehouse.setUpdateTime(new Date()); + // 插入仓库 + warehouseMapper.save(warehouse); + // 插入供应城市数据 + insertWarehouseArea(warehouse.getWarehouseId(), warehouseDTO.getCityList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = ProductCacheNames.WAREHOUSE_BY_ID_PREFIX, key = "#warehouseDTO.warehouseId") + public void updateWarehouseAndArea(WarehouseDTO warehouseDTO) { + WarehouseVO warehouseDb = warehouseMapper.getByWarehouseId(warehouseDTO.getWarehouseId()); + this.checkIsRepeat(warehouseDTO); + if (!Objects.equals(warehouseDb.getShopId(), warehouseDTO.getShopId())) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (!PrincipalUtil.isDbPhone(warehouseDTO.getPhone(), warehouseDb.getPhone(), true)) { + throw new LuckException("请输入正确的手机号"); + } + if (warehouseDTO.getPhone().contains(Constant.ASTERISK)) { + warehouseDTO.setPhone(warehouseDb.getPhone()); + } + // 更新运费模板 + warehouseMapper.update(BeanUtil.map(warehouseDTO, Warehouse.class)); + // 删除供应城市 + warehouseAreaService.deleteByWarehouseId(warehouseDTO.getWarehouseId()); + // 添加供应城市关系 + insertWarehouseArea(warehouseDTO.getWarehouseId(), warehouseDTO.getCityList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public WarehouseVO deleteWarehouseAndArea(Long warehouseId) { + WarehouseVO warehouseVO = warehouseMapper.getByWarehouseId(warehouseId); + if (warehouseVO.getType() == 0) { + throw new LuckException("默认仓库不能删除"); + } + // 检查库存 + int count = stockPointFeignClient.countStockList(warehouseId).getData(); + if (count > 0) { + throw new LuckException("存在商品库存,不可删除"); + } + // 检查采购订单 + Long unFinishCount = purchaseOrderFeignClient.countUnFinish(warehouseId); + if (unFinishCount > 0) { + throw new LuckException("存在未完成的采购订单,不可删除"); + } + // 检查调拨订单 + unFinishCount = allotOrderFeignClient.countUnFinish(warehouseId); + if (unFinishCount > 0) { + throw new LuckException("存在未完成的调拨订单,不可删除"); + } + // 检查实物盘点 + unFinishCount = takeStockMapper.countUnFinish(warehouseId); + if (unFinishCount > 0) { + throw new LuckException("存在未完成的实物盘点,不可删除"); + } + warehouseAreaService.deleteByWarehouseId(warehouseId); + // 删除运费模板 + warehouseMapper.deleteById(warehouseId); + return warehouseVO; + } + + @Override + public void removeWarehouseCache(Long warehouseId, Long shopId, Integer sysType) { + List keys = new ArrayList<>(Constant.TWO); + if (Objects.nonNull(warehouseId)) { + keys.add(CacheNames.WAREHOUSE_BY_ID_PREFIX + CacheNames.UNION + warehouseId); + } + keys.add(CacheNames.WAREHOUSE_BY_ID_PREFIX + CacheNames.UNION + warehouseId); + keys.add(CacheNames.SHOP_WAREHOUSE_LIST_PREFIX + CacheNames.UNION + shopId + CacheNames.UNION_KEY + sysType); + RedisUtil.deleteBatch(keys); + } + + @Override + public void createWarehouseByShopId(Long shopId, Integer sysType, String phone, String name) { + Warehouse warehouse = new Warehouse(); + warehouse.setWarehouseId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_POINT)); + warehouse.setShopId(shopId); + warehouse.setSysType(sysType); + warehouse.setType(0); + warehouse.setWarehouseName("默认仓库"); + warehouse.setPhone(phone); + warehouse.setManage(name); + warehouse.setCreateTime(new Date()); + warehouse.setUpdateTime(new Date()); + warehouseMapper.save(warehouse); + } + + @Override + public List listWarehouseAreaByShopId(Long shopId, Integer sysType, Long warehouseId) { + return warehouseMapper.listareaByShopIdAndSysType(shopId, sysType, warehouseId); + } + + @Override + public List listWarehouse(WarehouseDTO warehouseDTO) {; + return warehouseMapper.list(warehouseDTO); + } + + @Override + public List listCanDeliveryWarehouse(WarehouseDTO warehouseDTO) { + // 按areaId获取可配送的仓库(区域仓库和默认仓库都查出来) + List warehouses = warehouseMapper.listCanDeliveryWarehouse(warehouseDTO); + // 区分区域仓库和默认仓库 + Set shopIds = new HashSet<>(Constant.INITIAL_CAPACITY); + List areaWarehouses = new ArrayList<>(Constant.INITIAL_CAPACITY); + List defaultWarehouses = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (WarehouseVO warehouse : warehouses) { + if (Objects.equals(warehouse.getType(), 0)) { + defaultWarehouses.add(warehouse); + } else { + areaWarehouses.add(warehouse); + shopIds.add(warehouse.getShopId()); + } + } + // 若店铺的可配送的区域仓库不存在则使用默认仓库 + for (WarehouseVO defaultWarehouse : defaultWarehouses) { + if (shopIds.add(defaultWarehouse.getShopId())) { + areaWarehouses.add(defaultWarehouse); + } + } + return areaWarehouses; + } + + @Override + public WarehouseVO getDefaultWarehouseByShopId(Long shopId, Integer sysType) { + return warehouseMapper.getDefaultWarehouseIdByShopId(shopId,sysType); + } + + @Override + @Cacheable(cacheNames = CacheNames.SHOP_WAREHOUSE_LIST_PREFIX, key = "#shopId + ':' + #sysType") + public List listWarehouseByShopId(Long shopId, Integer sysType) { + List warehouseVOS = warehouseMapper.listWarehouseByShopId(shopId, sysType); + // 将默认仓库放到第一位 + warehouseVOS.sort(Comparator.comparing(WarehouseVO::getType)); + return warehouseVOS; + } + + @Override + public void intiWarehouse() { + List warehouseList = new ArrayList<>(); + WarehouseDTO warehouseDTO = new WarehouseDTO(); + warehouseDTO.setSysType(SysTypeEnum.MULTISHOP.value()); + warehouseDTO.setType(0); + List list = warehouseMapper.list(warehouseDTO); + List shopIds = list.stream().map(WarehouseVO::getShopId).toList(); + // 初始化店铺默认仓库 + List shopList = shopDetailFeignClient.listShopIds().getData(); + + if (CollectionUtil.isNotEmpty(shopList)) { + shopList.forEach(shop-> { + if (shopIds.contains(shop.getShopId())) { + return; + } + Warehouse warehouse = new Warehouse(); + warehouse.setShopId(shop.getShopId()); + warehouse.setManage(shop.getContactName()); + warehouse.setPhone(shop.getContactPhone()); + warehouse.setSysType(SysTypeEnum.MULTISHOP.value()); + warehouseList.add(warehouse); + }); + } + // 初始化供应商默认仓库 + warehouseDTO.setSysType(SysTypeEnum.SUPPLIER.value()); + list = warehouseMapper.list(warehouseDTO); + List supplierIds = list.stream().map(WarehouseVO::getShopId).toList(); + List supplierList = supplierDetailFeignClient.listSupplierIds().getData(); + if (CollectionUtil.isNotEmpty(supplierList)) { + supplierList.forEach(supplier-> { + if (supplierIds.contains(supplier.getSupplierId())) { + return; + } + Warehouse warehouse = new Warehouse(); + warehouse.setShopId(supplier.getSupplierId()); + warehouse.setManage(supplier.getContactName()); + warehouse.setPhone(supplier.getContactPhone()); + warehouse.setSysType(SysTypeEnum.SUPPLIER.value()); + warehouseList.add(warehouse); + }); + } + if (warehouseList.size() != 0) { + warehouseList.forEach( s-> { + s.setWarehouseId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_STOCK_POINT)); + s.setWarehouseName("默认仓库"); + s.setType(0); + }); + warehouseMapper.batchSave(warehouseList); + } + } + + @Override + public List listDefaultWarehouses() { + return warehouseMapper.listDefaultWarehouses(); + } + + @Override + public StockPointVO getWarehousePoint(Long shopId, Integer sysType) { + StockPointVO stockPointVO = new StockPointVO(); + List warehouseVOS = warehouseMapper.listWarehouseByShopId(shopId, sysType); + stockPointVO.setWarehouseSize(warehouseVOS.size()); + for (WarehouseVO warehouseVO : warehouseVOS) { + if (warehouseVO.getType() == 0) { + stockPointVO.setDefaultWarehouseId(warehouseVO.getWarehouseId()); + break; + } + } + return stockPointVO; + } + + private void checkIsRepeat(WarehouseDTO warehouseDTO) { + int count = warehouseMapper.countByWarehouseName(warehouseDTO.getShopId(), warehouseDTO.getWarehouseName(), warehouseDTO.getSysType(), warehouseDTO.getWarehouseId()); + if (count > 0) { + throw new LuckException("仓库名称已存在,请重新输入"); + } + // 查询是否已经存在重复供应城市,一个城市只能有一个区域仓库 + if (warehouseDTO.getType() == 1) { + if (CollectionUtil.isEmpty(warehouseDTO.getCityList())) { + throw new LuckException("区域仓库必须要有供应城市"); + } + List cityList = warehouseMapper.listareaByShopIdAndSysType(warehouseDTO.getShopId(), warehouseDTO.getSysType(), warehouseDTO.getWarehouseId()); + if (CollectionUtil.isNotEmpty(cityList)) { + for (AreaDTO areaDTO : warehouseDTO.getCityList()) { + if (cityList.contains(areaDTO.getAreaId())) { + throw new LuckException(areaDTO.getAreaName() + " 已有区域仓库,请重新选择"); + } + } + } + } + } + + private void insertWarehouseArea(Long warehouseId, List areaDTOList) { + List warehouseAreaList = new ArrayList<>(areaDTOList.size()); + for (AreaDTO areaDTO : areaDTOList) { + WarehouseAreaDTO warehouseAreaDTO = new WarehouseAreaDTO(); + warehouseAreaDTO.setWarehouseId(warehouseId); + warehouseAreaDTO.setAreaId(areaDTO.getAreaId()); + warehouseAreaList.add(warehouseAreaDTO); + } + warehouseAreaService.batchSave(warehouseAreaList); + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/strategy/TakeStockMergeStrategy.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/strategy/TakeStockMergeStrategy.java new file mode 100644 index 0000000..46f848e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/strategy/TakeStockMergeStrategy.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.product.strategy; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.merge.AbstractMergeStrategy; +import com.tmerclub.cloud.common.constant.Constant; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; +/** + * @author lanhai + */ +public class TakeStockMergeStrategy extends AbstractMergeStrategy { + + private final List groupSizes; + + public TakeStockMergeStrategy(List fruitGroupCount) { + this.groupSizes = fruitGroupCount; + } + + @Override + protected void merge(Sheet sheet, Cell cell, Head head, Integer integer) { + if (cell.getRowIndex() == Constant.TWO) { + if (cell.getColumnIndex() < Constant.SIX) { + int rowCnt = 2; + for (Integer count : groupSizes) { + if (count > 1) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCnt, rowCnt + count - 1, cell.getColumnIndex(), cell.getColumnIndex()); + sheet.addMergedRegionUnsafe(cellRangeAddress); + } + rowCnt += count; + } + } + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/task/ProductTask.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/task/ProductTask.java new file mode 100644 index 0000000..1543b8f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/task/ProductTask.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.product.manager.StockManager; +import com.tmerclub.cloud.product.model.Giveaway; +import com.tmerclub.cloud.product.service.*; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 商品定时任务 + * + * @author FrozenWatermelon + */ +@Component +public class ProductTask { + private static final Logger log = LoggerFactory.getLogger(ProductTask.class); + @Autowired + private SpuService spuService; + @Autowired + private GiveawayService giveawayService; + @Autowired + private StockManager stockManager; + @Autowired + private SkuStockService skuStockService; + @Autowired + private StockBillLogService stockBillLogService; + @Autowired + private SkuStockLockService skuStockLockService; + @Autowired + private WarehouseService warehouseService; + + /** + * 校验商品数量是否完整 + * 商品数据是否为最新的:根据商品更新时间判断 + */ + @XxlJob("verifySpuData") + public void verifySpuData() { + spuService.verifySpuData(); + } + + /** + * 结束赠品活动 + */ + @XxlJob("activityFinishAndProdChange") + public void activityFinishAndProdChange() { + XxlJobHelper.log("赠品活动结束,主商品恢复为普通商品。。。"); + // -1:已删除 0:关闭 1:开启 2:未开启 + // 获取活动结束,需要改变商品类型的列表 + List giveawayActivityList = giveawayService.listUnEndButNeedEndActivity(); + + if (CollUtil.isEmpty(giveawayActivityList)) { + return; + } + giveawayService.changeSpuTypeByGiveawayActivityIdList(giveawayActivityList); + } + + /** + * 启用赠品活动 + */ + @XxlJob("activityStartAndProdChange") + public void activityStartAndProdChange() { + XxlJobHelper.log("赠品活动开启"); + giveawayService.startGiveawayActivity(); + } + + + @XxlJob("offlineExpireVirtualProd") + public void offlineExpireVirtualProd() { + XxlJobHelper.log("过了核销时间的虚拟商品,进行下架操作。"); + // 获取30分钟之前未支付的订单 + List spuVOList = spuService.handleExpireVirtualProd(); + if (CollectionUtils.isEmpty(spuVOList)) { + return; + } + for (SpuVO spuVO : spuVOList) { + //清除缓存 + spuService.removeSpuCacheBySpuId(spuVO.getSpuId()); + } + } + + /** + * 处理sku库存的变化 + * + * sku库存发生变化时,将最新的sku库存、销量求和,写入es的商品库存、销量中 + * 以及变更sku的库存预警 + */ + @XxlJob("handleSkuStockChange") + public void handleSkuStockChange() { + try { + skuStockService.handleSkuStockChange(); + } catch (Exception e) { + log.error("处理sku库存变化失败", e); + } + } + + @XxlJob("intiStock") + public void intiStock() { + + // ===================== 初始化商品库存 ===================== + try{ + skuStockService.initSkuStock(); + } catch (Exception e) { + log.error("初始化商品库存失败", e); + } + // ===================== 初始化商品库存记录 ===================== + // 缺少库存项的库存记录,都更新一遍,补全数据 + stockBillLogService.initStockBillLog(); + } + + @XxlJob("intiPointStock") + public void intiPointStock() { + // ===================== 初始化商品库存 ===================== + try{ + warehouseService.intiWarehouse(); + spuService.intiStockPointSKu(); + skuStockService.initPointStock(); + } catch (Exception e) { + log.error("初始化商品库存失败", e); + } + } + + + /** + * 订单解锁sku库存 + * + */ + @XxlJob("unLockOrderSkuStock") + public void unLockOrderSkuStock() { + // 获取所有锁定库存的订单记录 + List skuStockList = stockManager.scanLockStockOrderLog(); + // 批量处理订单解锁库存 + try { + skuStockLockService.unlockStockByException(skuStockList); + } catch (Exception e) { + log.error("订单解锁库存失败", e); + } + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/BrandShopVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/BrandShopVO.java new file mode 100644 index 0000000..e15feaa --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/BrandShopVO.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 品牌店铺关联信息VO + * + * @author FrozenWatermelon + * @date 2021-05-08 13:31:45 + */ +public class BrandShopVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long brandShopId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "授权资质图片,以,分割") + private String qualifications; + + @Schema(description = "类型 0:平台品牌,1:店铺自定义品牌") + private Integer type; + + @Schema(description = "索引首字母") + private String firstLetter; + + @Schema(description = "logo") + private String imgUrl; + + @Schema(description = "品牌名称") + private String name; + + @Schema(description = "品牌状态") + private Integer brandStatus; + @Schema(description = "分类id列表") + private List categoryIds; + + @Schema(description = "绑定分类列表") + private List categories; + + @Schema(description = "关联系统类型 1.店铺 2.平台端 3.供应商") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getBrandStatus() { + return brandStatus; + } + + public void setBrandStatus(Integer brandStatus) { + this.brandStatus = brandStatus; + } + + public String getFirstLetter() { + return firstLetter; + } + + public void setFirstLetter(String firstLetter) { + this.firstLetter = firstLetter; + } + + public Long getBrandShopId() { + return brandShopId; + } + + public void setBrandShopId(Long brandShopId) { + this.brandShopId = brandShopId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getCategoryIds() { + return categoryIds; + } + + public void setCategoryIds(List categoryIds) { + this.categoryIds = categoryIds; + } + + public List getCategories() { + return categories; + } + + public void setCategories(List categories) { + this.categories = categories; + } + + @Override + public String toString() { + return "BrandShopVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", brandShopId=" + brandShopId + + ", shopId=" + shopId + + ", brandId=" + brandId + + ", qualifications='" + qualifications + '\'' + + ", type=" + type + + ", firstLetter='" + firstLetter + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", name='" + name + '\'' + + ", brandStatus=" + brandStatus + + ", categoryIds=" + categoryIds + + ", categories=" + categories + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/BrandSigningVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/BrandSigningVO.java new file mode 100644 index 0000000..9ec4169 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/BrandSigningVO.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author lth + * @Date 2021/5/13 19:06 + */ +public class BrandSigningVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "签约的平台品牌列表") + private List platformBrandList; + + @Schema(description = "签约的自定义品牌列表") + private List customizeBrandList; + + public List getPlatformBrandList() { + return platformBrandList; + } + + public void setPlatformBrandList(List platformBrandList) { + this.platformBrandList = platformBrandList; + } + + public List getCustomizeBrandList() { + return customizeBrandList; + } + + public void setCustomizeBrandList(List customizeBrandList) { + this.customizeBrandList = customizeBrandList; + } + + @Override + public String toString() { + return "BrandSigningDTO{" + + "platformBrandList=" + platformBrandList + + ", customizeBrandList=" + customizeBrandList + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryBrandVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryBrandVO.java new file mode 100644 index 0000000..fa7b22b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryBrandVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 品牌分类关联信息VO + * + * @author FrozenWatermelon + * @date 2020-10-28 15:27:24 + */ +public class CategoryBrandVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long id; + + @Schema(description = "品牌id") + private Long brandId; + + @Schema(description = "分类id") + private Long categoryId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + @Override + public String toString() { + return "CategoryBrandVO{" + + "id=" + id + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",brandId=" + brandId + + ",categoryId=" + categoryId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryExcelVO.java new file mode 100644 index 0000000..7ff6759 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryExcelVO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.product.vo.CategoryLangVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @Author TRACK + */ +public class CategoryExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "分类信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty({"分类信息", "分类中文名称"}) + private String nameZh; + + @ExcelProperty({"分类信息", "分类层级"}) + private String grade; + + @ExcelProperty({"分类信息", "父级分类"}) + private String parentName; + + @ExcelProperty({"分类信息", "分类状态"}) + private String categoryStatus; + + @ExcelProperty({"分类信息", "排序"}) + private Integer seq; + + @ExcelIgnore + private Long categoryId; + + @ExcelIgnore + private Long parentId; + + @ExcelIgnore + private List categoryLangList; + + @ExcelIgnore + private Integer level; + + @ExcelIgnore + private Integer status; + + public String getNameZh() { + return nameZh; + } + + public void setNameZh(String nameZh) { + this.nameZh = nameZh; + } + + + public String getGrade() { + return grade; + } + + public void setGrade(String grade) { + this.grade = grade; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public String getCategoryStatus() { + return categoryStatus; + } + + public void setCategoryStatus(String categoryStatus) { + this.categoryStatus = categoryStatus; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public List getCategoryLangList() { + return categoryLangList; + } + + public void setCategoryLangList(List categoryLangList) { + this.categoryLangList = categoryLangList; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "CategoryExcelVO{" + + "nameZh='" + nameZh + '\'' + + ", grade='" + grade + '\'' + + ", parentName='" + parentName + '\'' + + ", categoryStatus='" + categoryStatus + '\'' + + ", seq=" + seq + + ", categoryId=" + categoryId + + ", parentId=" + parentId + + ", categoryLangList=" + categoryLangList + + ", level=" + level + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryShopVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryShopVO.java new file mode 100644 index 0000000..ed59c49 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryShopVO.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author lth + * @Date 2021/4/26 9:28 + */ +public class CategoryShopVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键id") + private Long categoryShopId; + + @Schema(description = "分类id") + private Long categoryId; + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "上级分类id") + private Long parentId; + + @Schema(description = "上级分类名称") + private String parentName; + + @Schema(description = "平台扣率") + private Double platformRate; + + @Schema(description = "自定义扣率,为空代表采用平台扣率") + private Double customizeRate; + + @Schema(description = "经营资质") + private String qualifications; + + @Schema(description = "分类状态 1:上架 0:下架 -1:已删除") + private Integer categoryStatus; + + @Schema(description = "关联系统类型 1.店铺 2.平台端 3.供应商") + private Integer sysType; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public Integer getCategoryStatus() { + return categoryStatus; + } + + public void setCategoryStatus(Integer categoryStatus) { + this.categoryStatus = categoryStatus; + } + + public Long getCategoryShopId() { + return categoryShopId; + } + + public void setCategoryShopId(Long categoryShopId) { + this.categoryShopId = categoryShopId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Double getPlatformRate() { + return platformRate; + } + + public void setPlatformRate(Double platformRate) { + this.platformRate = platformRate; + } + + public Double getCustomizeRate() { + return customizeRate; + } + + public void setCustomizeRate(Double customizeRate) { + this.customizeRate = customizeRate; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + @Override + public String toString() { + return "CategoryShopVO{" + + "categoryShopId=" + categoryShopId + + ", categoryId=" + categoryId + + ", name='" + name + '\'' + + ", parentId=" + parentId + + ", parentName='" + parentName + '\'' + + ", platformRate=" + platformRate + + ", customizeRate=" + customizeRate + + ", qualifications='" + qualifications + '\'' + + ", categoryStatus=" + categoryStatus + + ", sysType=" + sysType + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryUseNumVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryUseNumVO.java new file mode 100644 index 0000000..5e3f062 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/CategoryUseNumVO.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @Author YXF + * @Date 2021/7/06 + */ +public class CategoryUseNumVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private static final Integer CATEGORY = 1; + private static final Integer ATTR = 2; + private static final Integer BRAND = 3; + private static final Integer SPU = 3; + + @Schema(description = "类型") + private Integer type; + + @Schema(description = "数量") + private Integer num; + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getNum() { + return num; + } + + public void setNum(Integer num) { + this.num = num; + } + + @Override + public String toString() { + return "CategoryUseNumVO{" + + "type=" + type + + ", num=" + num + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SkuExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SkuExcelVO.java new file mode 100644 index 0000000..c8528ac --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SkuExcelVO.java @@ -0,0 +1,119 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class SkuExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "商品库存信息"; + public static final String SHEET_NAME = "商品库存"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + @ExcelProperty(value = {"商品库存信息", "商品名称"}, index = 0) + private String spuName; + + @ExcelProperty(value = {"商品库存信息", "商品编码"}, index = 1) + private String partyCode; + + + @ExcelProperty(value = {"商品库存信息", "商品规格"}, index = 2) + private String skuName; + + @ExcelProperty(value = {"商品库存信息", "库存"}, index = 3) + private Integer stock; + + @ExcelProperty(value = {"商品库存信息", "销售价(元)"}, index = 4) + private String priceFee; + + + @ExcelIgnore + private Long spuId; + + @ExcelIgnore + private Long skuId; + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public String getPriceFee() { + return priceFee; + } + + public void setPriceFee(String priceFee) { + this.priceFee = priceFee; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + @Override + public String toString() { + return "SkuExcelVO{" + + "partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", stock=" + stock + + ", priceFee=" + priceFee + + ", spuId=" + spuId + + ", skuId=" + skuId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuBrowseLogVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuBrowseLogVO.java new file mode 100644 index 0000000..5ba9760 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuBrowseLogVO.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品浏览记录表VO + * + * @author YXF + * @date 2021-03-19 14:28:14 + */ +public class SpuBrowseLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品浏览记录id") + private Long spuBrowseLogId; + + @JsonFormat(pattern = "yyyy-MM-dd") + @Schema(description = "商品浏览记录id") + private Date browseTime; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "商品主图") + private String mainImgUrl; + + @Schema(description = "商品价格") + private Long priceFee; + + @Schema(description = "积分价格") + private Long scoreFee; + + @Schema(description = "商品状态 1:上架,其他:下架") + private Integer spuStatus; + + @Schema(description = "商品类型") + private Integer spuType; + + public Long getSpuBrowseLogId() { + return spuBrowseLogId; + } + + public void setSpuBrowseLogId(Long spuBrowseLogId) { + this.spuBrowseLogId = spuBrowseLogId; + } + + public Date getBrowseTime() { + return browseTime; + } + + public void setBrowseTime(Date browseTime) { + this.browseTime = browseTime; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Integer getSpuStatus() { + return spuStatus; + } + + public void setSpuStatus(Integer spuStatus) { + this.spuStatus = spuStatus; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + @Override + public String toString() { + return "SpuBrowseLogVO{" + + "spuBrowseLogId=" + spuBrowseLogId + + ", browseTime=" + browseTime + + ", userId=" + userId + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", priceFee=" + priceFee + + ", spuStatus=" + spuStatus + + ", spuType=" + spuType + + ", scoreFee =" + scoreFee + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommStatisticsStarVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommStatisticsStarVO.java new file mode 100644 index 0000000..70ddd2d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommStatisticsStarVO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品评论统计(按星数) + * + * @Author lth + * @Date 2021/6/1 9:41 + */ +public class SpuCommStatisticsStarVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "五星") + private Integer fiveStarsNumber; + + @Schema(description = "四星") + private Integer fourStarsNumber; + + @Schema(description = "三星") + private Integer threeStarsNumber; + + @Schema(description = "二星") + private Integer twoStarsNumber; + + @Schema(description = "一星") + private Integer oneStarsNumber; + + public Integer getFiveStarsNumber() { + return fiveStarsNumber; + } + + public void setFiveStarsNumber(Integer fiveStarsNumber) { + this.fiveStarsNumber = fiveStarsNumber; + } + + public Integer getFourStarsNumber() { + return fourStarsNumber; + } + + public void setFourStarsNumber(Integer fourStarsNumber) { + this.fourStarsNumber = fourStarsNumber; + } + + public Integer getThreeStarsNumber() { + return threeStarsNumber; + } + + public void setThreeStarsNumber(Integer threeStarsNumber) { + this.threeStarsNumber = threeStarsNumber; + } + + public Integer getTwoStarsNumber() { + return twoStarsNumber; + } + + public void setTwoStarsNumber(Integer twoStarsNumber) { + this.twoStarsNumber = twoStarsNumber; + } + + public Integer getOneStarsNumber() { + return oneStarsNumber; + } + + public void setOneStarsNumber(Integer oneStarsNumber) { + this.oneStarsNumber = oneStarsNumber; + } + + @Override + public String toString() { + return "SpuCommStatisticsStarVO{" + + "fiveStarsNumber=" + fiveStarsNumber + + ", fourStarsNumber=" + fourStarsNumber + + ", threeStarsNumber=" + threeStarsNumber + + ", twoStarsNumber=" + twoStarsNumber + + ", oneStarsNumber=" + oneStarsNumber + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommStatisticsVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommStatisticsVO.java new file mode 100644 index 0000000..e25b37c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommStatisticsVO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品评论统计VO + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +public class SpuCommStatisticsVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "好评率") + private Double positiveRating; + + @Schema(description = "评论数量") + private Integer number; + + @Schema(description = "好评数") + private Integer praiseNumber; + + @Schema(description = "中评数") + private Integer secondaryNumber; + + @Schema(description = "差评数") + private Integer negativeNumber; + + @Schema(description = "有图数") + private Integer picNumber; + + public Double getPositiveRating() { + return positiveRating; + } + + public void setPositiveRating(Double positiveRating) { + this.positiveRating = positiveRating; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public Integer getPraiseNumber() { + return praiseNumber; + } + + public void setPraiseNumber(Integer praiseNumber) { + this.praiseNumber = praiseNumber; + } + + public Integer getSecondaryNumber() { + return secondaryNumber; + } + + public void setSecondaryNumber(Integer secondaryNumber) { + this.secondaryNumber = secondaryNumber; + } + + public Integer getNegativeNumber() { + return negativeNumber; + } + + public void setNegativeNumber(Integer negativeNumber) { + this.negativeNumber = negativeNumber; + } + + public Integer getPicNumber() { + return picNumber; + } + + public void setPicNumber(Integer picNumber) { + this.picNumber = picNumber; + } + + @Override + public String toString() { + return "ProdCommEvaluateVO{" + + "positiveRating=" + positiveRating + + ", number=" + number + + ", praiseNumber=" + praiseNumber + + ", secondaryNumber=" + secondaryNumber + + ", negativeNumber=" + negativeNumber + + ", picNumber=" + picNumber + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommVO.java new file mode 100644 index 0000000..227339e --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuCommVO.java @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商品评论VO + * + * @author YXF + * @date 2021-01-11 13:47:33 + */ +public class SpuCommVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long spuCommId; + + @Schema(description = "商品ID") + private Long spuId; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "店铺ID") + private Long shopId; + + @Schema(description = "订单项ID") + private Long orderItemId; + + @Schema(description = "评论用户ID") + private Long userId; + + @Schema(description = "评论内容") + private String content; + + @Schema(description = "掌柜回复") + private String replyContent; + + @Schema(description = "记录时间") + private Date createTime; + + @Schema(description = "回复时间") + private Date replyTime; + + @Schema(description = "是否回复 0:未回复 1:已回复") + private Integer replySts; + + @Schema(description = "IP来源") + private String postip; + + @Schema(description = "商品得分,1-5分") + private Integer score; + + @Schema(description = "店铺评分 1-5分") + private Integer storeScore; + + @Schema(description = "物流评分 1-5分") + private Integer logisticsScore; + + @Schema(description = "有用的计数") + private Integer usefulCounts; + + @Schema(description = "晒图的json字符串") + private String pics; + + @Schema(description = "是否匿名(1:是 0:否)") + private Integer isAnonymous; + + @Schema(description = "评价(0好评 1中评 2差评)") + private Integer evaluate; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "用户头像") + private String userPic; + + @Schema(description = "商品图片") + private String spuImg; + + @Schema(description = "商品规格") + private String skuName; + + @Schema(description = "成交时间") + private Date transactionTime; + + @Schema(description = "用户是否注销了") + private Boolean isWriteOff; + + public Boolean getIsWriteOff() { + return isWriteOff; + } + + public void setIsWriteOff(Boolean writeOff) { + this.isWriteOff = writeOff; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Date getTransactionTime() { + return transactionTime; + } + + public void setTransactionTime(Date transactionTime) { + this.transactionTime = transactionTime; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getSpuCommId() { + return spuCommId; + } + + public void setSpuCommId(Long spuCommId) { + this.spuCommId = spuCommId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(Long orderItemId) { + this.orderItemId = orderItemId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getReplyContent() { + return replyContent; + } + + public void setReplyContent(String replyContent) { + this.replyContent = replyContent; + } + + @Override + public Date getCreateTime() { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getReplyTime() { + return replyTime; + } + + public void setReplyTime(Date replyTime) { + this.replyTime = replyTime; + } + + public Integer getReplySts() { + return replySts; + } + + public void setReplySts(Integer replySts) { + this.replySts = replySts; + } + + public String getPostip() { + return postip; + } + + public void setPostip(String postip) { + this.postip = postip; + } + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + public Integer getStoreScore() { + return storeScore; + } + + public void setStoreScore(Integer storeScore) { + this.storeScore = storeScore; + } + + public Integer getLogisticsScore() { + return logisticsScore; + } + + public void setLogisticsScore(Integer logisticsScore) { + this.logisticsScore = logisticsScore; + } + + public Integer getUsefulCounts() { + return usefulCounts; + } + + public void setUsefulCounts(Integer usefulCounts) { + this.usefulCounts = usefulCounts; + } + + public String getPics() { + return pics; + } + + public void setPics(String pics) { + this.pics = pics; + } + + public Integer getIsAnonymous() { + return isAnonymous; + } + + public void setIsAnonymous(Integer isAnonymous) { + this.isAnonymous = isAnonymous; + } + + public Integer getEvaluate() { + return evaluate; + } + + public void setEvaluate(Integer evaluate) { + this.evaluate = evaluate; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getUserPic() { + return userPic; + } + + public void setUserPic(String userPic) { + this.userPic = userPic; + } + + public String getSpuImg() { + return spuImg; + } + + public void setSpuImg(String spuImg) { + this.spuImg = spuImg; + } + + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + @Override + public String toString() { + return "SpuCommVO{" + + "spuCommId=" + spuCommId + + ", spuId=" + spuId + + ", spuName='" + spuName + '\'' + + ", shopId=" + shopId + + ", orderItemId=" + orderItemId + + ", userId=" + userId + + ", content='" + content + '\'' + + ", replyContent='" + replyContent + '\'' + + ", createTime=" + createTime + + ", replyTime=" + replyTime + + ", replySts=" + replySts + + ", postip='" + postip + '\'' + + ", score=" + score + + ", storeScore=" + storeScore + + ", logisticsScore=" + logisticsScore + + ", usefulCounts=" + usefulCounts + + ", pics='" + pics + '\'' + + ", isAnonymous=" + isAnonymous + + ", evaluate=" + evaluate + + ", nickName='" + nickName + '\'' + + ", userPic='" + userPic + '\'' + + ", spuImg='" + spuImg + '\'' + + ", skuName='" + skuName + '\'' + + ", transactionTime=" + transactionTime + + ", isWriteOff=" + isWriteOff + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuExtensionVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuExtensionVO.java new file mode 100644 index 0000000..f671c44 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuExtensionVO.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +public class SpuExtensionVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品扩展信息表id") + private Long spuExtendId; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "评论数量") + private Integer commentNum; + + @Schema(description = "销量") + private Integer saleNum; + + public Long getSpuExtendId() { + return spuExtendId; + } + + public void setSpuExtendId(Long spuExtendId) { + this.spuExtendId = spuExtendId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getCommentNum() { + return commentNum; + } + + public void setCommentNum(Integer commentNum) { + this.commentNum = commentNum; + } + + public Integer getSaleNum() { + return saleNum; + } + + public void setSaleNum(Integer saleNum) { + this.saleNum = saleNum; + } + + @Override + public String toString() { + return "SpuExtensionVO{" + + "spuExtendId=" + spuExtendId + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", spuId=" + spuId + + ", commentNum=" + commentNum + + ", saleNum=" + saleNum + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuSupplierChangeLogVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuSupplierChangeLogVO.java new file mode 100644 index 0000000..68d0ea0 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SpuSupplierChangeLogVO.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品供应商变更记录VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class SpuSupplierChangeLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "商品供应商变更记录id") + private Long spuChangeId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "变更类型 1.商品上架 2.商品下架 3.代销sku信息变更 4.新增sku") + private Integer changeType; + + @Schema(description = "备注") + private String remarks; + + @Schema(description = "spu编码") + private String spuCode; + + @Schema(description = "商品主图") + private String mainImgUrl; + + @Schema(description = "商品名称") + private String spuName; + + @Schema(description = "供应商名称") + private String supplierName; + + @Schema(description = "变更内容key") + private String contentKey; + + @Schema(description = "变更内容值") + private String contentValue; + + @Schema(description = "代销商品id") + private Long commissionSpuId; + + @Schema(description = "供应商id") + private Long supplierId; + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Long getCommissionSpuId() { + return commissionSpuId; + } + + public void setCommissionSpuId(Long commissionSpuId) { + this.commissionSpuId = commissionSpuId; + } + + public String getContentValue() { + return contentValue; + } + + public void setContentValue(String contentValue) { + this.contentValue = contentValue; + } + + public String getContentKey() { + return contentKey; + } + + public void setContentKey(String contentKey) { + this.contentKey = contentKey; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getSpuChangeId() { + return spuChangeId; + } + + public void setSpuChangeId(Long spuChangeId) { + this.spuChangeId = spuChangeId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getChangeType() { + return changeType; + } + + public void setChangeType(Integer changeType) { + this.changeType = changeType; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "SpuSupplierChangeLogVO{" + + "spuChangeId=" + spuChangeId + + ", spuId=" + spuId + + ", changeType=" + changeType + + ", remarks='" + remarks + '\'' + + ", spuCode='" + spuCode + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", spuName='" + spuName + '\'' + + ", supplierName='" + supplierName + '\'' + + ", contentKey='" + contentKey + '\'' + + ", contentValue='" + contentValue + '\'' + + ", commissionSpuId=" + commissionSpuId + + ", supplierId=" + supplierId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogExcelVO.java new file mode 100644 index 0000000..0e9692b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogExcelVO.java @@ -0,0 +1,289 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +/** + * @author lanhai + */ +public class StockBillLogExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "出入库明细信息"; + public static final String SHEET_NAME = "出入库明细"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + + @ExcelProperty(value = {"出入库明细信息", "出入库单号"}, index = 0) + private String stockBillNo; + + @ExcelProperty(value = {"出入库明细信息", "关联订单号"}, index = 1) + private String sourceOrderNo; + + @ExcelProperty(value = {"入库明细信息", "库存点名称"}, index = 2) + private String stockPointName; + + @ExcelProperty(value = {"入库明细信息", "库存点类型"}, index = 3) + private String stockPointType; + + @ExcelProperty(value = {"出入库明细信息", "单据类型"}, index = 4) + private String stockBillTypeName; + + @ExcelProperty(value = {"出入库明细信息", "出入库原因"}, index = 5) + private String reason; + + + @ExcelProperty(value = {"出入库明细信息", "单据状态"}, index = 6) + private String statusName; + + @ExcelProperty(value = {"出入库明细信息", "出入库时间"}, index = 7) + private Date businessTime; + + @ExcelProperty(value = {"出入库明细信息", "总出入库数量"}, index = 8) + private Integer totalCount; + + @ExcelProperty(value = {"出入库明细信息", "总出入库金额"}, index = 9) + private String totalAmount; + + @ExcelProperty(value = {"出入库明细信息", "制单人"}, index = 10) + private String makerMobile; + + @ExcelProperty(value = {"出入库明细信息", "制单时间"}, index = 11) + private Date createTime; + + @ExcelProperty(value = {"出入库明细信息", "商品编码"}, index = 12) + private String partyCode; + + @ExcelProperty(value = {"出入库明细信息", "商品名称"}, index = 13) + private String spuName; + + @ExcelProperty(value = {"出入库明细信息", "规格"}, index = 14) + private String skuName; + + @ExcelProperty(value = {"出入库明细信息", "实际出入库数量"}, index = 15) + private Integer stockCount; + + @ExcelProperty(value = {"出入库明细信息", "成本单价"}, index = 16) + private String unitPrice; + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + public String getStockPointType() { + return stockPointType; + } + + public void setStockPointType(String stockPointType) { + this.stockPointType = stockPointType; + } + + @ExcelIgnore + private Long stockBillLogId; + + @ExcelIgnore + private Integer status; + + + @ExcelIgnore + private Integer stockBillType; + + @ExcelIgnore + private Long stockChangeReasonId; + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public String getStatusName() { + return statusName; + } + + public void setStatusName(String statusName) { + this.statusName = statusName; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + public String getStockBillTypeName() { + return stockBillTypeName; + } + + public void setStockBillTypeName(String stockBillTypeName) { + this.stockBillTypeName = stockBillTypeName; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(String totalAmount) { + this.totalAmount = totalAmount; + } + + public String getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(String unitPrice) { + this.unitPrice = unitPrice; + } + + @Override + public String toString() { + return "StockBillLogExcelVO{" + + "stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointType='" + stockPointType + '\'' + + ", stockBillTypeName='" + stockBillTypeName + '\'' + + ", reason='" + reason + '\'' + + ", statusName='" + statusName + '\'' + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount='" + totalAmount + '\'' + + ", makerMobile='" + makerMobile + '\'' + + ", createTime=" + createTime + + ", partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", stockCount=" + stockCount + + ", unitPrice='" + unitPrice + '\'' + + ", stockBillLogId=" + stockBillLogId + + ", status=" + status + + ", stockBillType=" + stockBillType + + ", stockChangeReasonId=" + stockChangeReasonId + + '}'; + } +} + diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemImportExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemImportExcelVO.java new file mode 100644 index 0000000..0171aa3 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemImportExcelVO.java @@ -0,0 +1,70 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class StockBillLogItemImportExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME_IMPORT = "其他入库模板"; + public static final String EXCEL_NAME_EXPORT = "其他出库模板"; + public static final String SHEET_NAME_IMPORT = "库存流水"; + public static final String SHEET_NAME_EXPORT = "库存流水"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + @ExcelProperty(value = {"其他出入库模板", "商品编码(必填)"}, index = 0) + private String partyCode; + + @ExcelProperty(value = {"其他出入库模板", "商品名称"}, index = 1) + private String spuName; + + @ExcelProperty(value = {"其他出入库模板", "实际出入库数量(必填)"}, index = 2) + private Integer stockCount; + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public Integer getStockCount() { + return stockCount; + } + + public void setStockCount(Integer stockCount) { + this.stockCount = stockCount; + } + + @Override + public String toString() { + return "StockBillLogItemImportExcelVO{" + + "partyCode='" + partyCode + '\'' + + ", spuName='" + spuName + '\'' + + ", stockCount=" + stockCount + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemImportVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemImportVO.java new file mode 100644 index 0000000..ca3455d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockBillLogItemImportVO.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.product.vo.StockBillLogItemVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +/** + * @author lanhai + */ +public class StockBillLogItemImportVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "成功解析的数据项") + private List stockBillLogItemList; + + @Schema(description = "导入结果提示") + private String tips; + + public List getStockBillLogItemList() { + return stockBillLogItemList; + } + + public void setStockBillLogItemList(List stockBillLogItemList) { + this.stockBillLogItemList = stockBillLogItemList; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + @Override + public String toString() { + return "StockBillLogItemImportVO{" + + "stockBillLogItemList=" + stockBillLogItemList + + ", tips='" + tips + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonVO.java new file mode 100644 index 0000000..a528aa1 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/StockChangeReasonVO.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 出入库原因VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class StockChangeReasonVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long stockChangeReasonId; + + @Schema(description = "出入库类别,1:出库 2:入库") + private Integer type; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "状态,1:启用 0:禁用 -1:删除") + private Integer status; + + @Schema(description = "系统类型") + private Integer sysType; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "是否系统内置") + private Integer sysSet; + + @Schema(description = "原因") + private String reason; + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getSysSet() { + return sysSet; + } + + public void setSysSet(Integer sysSet) { + this.sysSet = sysSet; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "StockChangeReasonVO{" + + "stockChangeReasonId=" + stockChangeReasonId + + ", type=" + type + + ", shopId=" + shopId + + ", status=" + status + + ", sysType=" + sysType + + ", remark='" + remark + '\'' + + ", sysSet=" + sysSet + + ", reason='" + reason + '\'' + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierSpuExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierSpuExcelVO.java new file mode 100644 index 0000000..19cef5c --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierSpuExcelVO.java @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.tmerclub.cloud.common.model.ExcelModel; +import com.tmerclub.cloud.common.product.vo.BrandLangVO; +import com.tmerclub.cloud.common.product.vo.SpuLangVO; +import com.tmerclub.cloud.common.product.vo.SpuSkuAttrValueVO; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author xxw + * @date 2022/6/30 9:47 + */ +public class SupplierSpuExcelVO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "商品信息"; + public static final String SHEET_NAME = "商品"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + + @ExcelProperty(value = {"商品信息", "编号*"}, index = 0) + private String seq; + + @ExcelProperty(value = {"商品信息", "商品中文名称*"}, index = 1) + private String nameZh; + + + @ExcelProperty(value = {"商品信息", "商品中文卖点"}, index = 3) + private String sellingPointZh; + + + @ExcelProperty(value = {"商品信息", "品牌"}, index = 5) + private String brandName; + + @ExcelProperty(value = {"商品信息", "平台分类*"}, index = 6) + private String categoryName; + + @ExcelProperty(value = {"商品信息", "店铺分类*"}, index = 7) + private String shopCategoryName; + + @ExcelProperty(value = {"商品信息", "配送方式*"}, index = 8) + private String deliveryMode; + + @ExcelProperty(value = {"商品信息", "运费模板"}, index = 9) + private String deliveryTemplate; + + @ExcelProperty(value = {"商品信息", "固定运费金额(运费模板为固定运费时必填*)"}, index = 10) + private String deliveryAmount; + + @ExcelProperty(value = {"商品信息", "状态*"}, index = 11) + private String status; + + @ExcelProperty(value = {"商品信息", "所属供应商"}, index = 12) + private String supplierName; + + @ExcelProperty(value = {"商品信息", "代销商品状态"}, index = 13) + private String commissionSpuStatus; + + @ExcelProperty(value = {"商品信息", "发货方式"}, index = 14) + private String supplierDelivery; + + @ExcelProperty({"商品sku信息", "中文sku名称"}) + private String skuNameZh; + + + @ExcelProperty({"商品sku信息", "中文销售属性"}) + private String propertiesZh; + + + @ExcelProperty({"商品sku信息", "售价"}) + private String priceFee; + + @ExcelProperty({"商品sku信息", "市场价"}) + private String marketPriceFee; + + @ExcelProperty({"商品sku信息", "供货价"}) + private String supplyPrice; + + @ExcelProperty({"商品sku信息", "库存"}) + private Integer stock; + + @ExcelProperty({"商品sku信息", "商品编码"}) + private String partyCode; + + @ExcelProperty({"商品sku信息", "商品重量"}) + private Double weight; + + @ExcelProperty({"商品sku信息", "商品体积"}) + private Double volume; + + /** + * 商品id + */ + @ExcelIgnore + private Long spuId; + + /** + * 物流模板id + */ + @ExcelIgnore + private Long deliveryTemplateId; + + @ExcelIgnore + private List spuSkuAttrValueList; + + @ExcelIgnore + private List brandLangList; + + @ExcelIgnore + private List spuLangList; + + @ExcelIgnore + private Long categoryId; + + @ExcelIgnore + private Long shopCategoryId; + + /** + * 供应商id + */ + @ExcelIgnore + private Long supplierId; + + /** + * 代销商品规格选择状态,1: 全选 2:部分选择 + */ + @ExcelIgnore + private Integer skuChoiceStatus; + + /** + * 发货方式 1.供应商发货 2.仓库发货 + */ + @ExcelIgnore + private Integer supplierDeliveryType; + + /** + * 供应商商品id + */ + @ExcelIgnore + private Long supplierSpuId; + + public String getDeliveryAmount() { + return deliveryAmount; + } + + public void setDeliveryAmount(String deliveryAmount) { + this.deliveryAmount = deliveryAmount; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getSupplyPrice() { + return supplyPrice; + } + + public void setSupplyPrice(String supplyPrice) { + this.supplyPrice = supplyPrice; + } + + public String getCommissionSpuStatus() { + return commissionSpuStatus; + } + + public void setCommissionSpuStatus(String commissionSpuStatus) { + this.commissionSpuStatus = commissionSpuStatus; + } + + public String getSupplierDelivery() { + return supplierDelivery; + } + + public void setSupplierDelivery(String supplierDelivery) { + this.supplierDelivery = supplierDelivery; + } + + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public Integer getSkuChoiceStatus() { + return skuChoiceStatus; + } + + public void setSkuChoiceStatus(Integer skuChoiceStatus) { + this.skuChoiceStatus = skuChoiceStatus; + } + + public Integer getSupplierDeliveryType() { + return supplierDeliveryType; + } + + public void setSupplierDeliveryType(Integer supplierDeliveryType) { + this.supplierDeliveryType = supplierDeliveryType; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getNameZh() { + return nameZh; + } + + public void setNameZh(String nameZh) { + this.nameZh = nameZh; + } + + + public String getSellingPointZh() { + return sellingPointZh; + } + + public void setSellingPointZh(String sellingPointZh) { + this.sellingPointZh = sellingPointZh; + } + + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getShopCategoryName() { + return shopCategoryName; + } + + public void setShopCategoryName(String shopCategoryName) { + this.shopCategoryName = shopCategoryName; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public String getDeliveryTemplate() { + return deliveryTemplate; + } + + public void setDeliveryTemplate(String deliveryTemplate) { + this.deliveryTemplate = deliveryTemplate; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSkuNameZh() { + return skuNameZh; + } + + public void setSkuNameZh(String skuNameZh) { + this.skuNameZh = skuNameZh; + } + + + public String getPropertiesZh() { + return propertiesZh; + } + + public void setPropertiesZh(String propertiesZh) { + this.propertiesZh = propertiesZh; + } + + public String getPriceFee() { + return priceFee; + } + + public void setPriceFee(String priceFee) { + this.priceFee = priceFee; + } + + public String getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(String marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public Double getVolume() { + return volume; + } + + public void setVolume(Double volume) { + this.volume = volume; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + + public List getSpuSkuAttrValueList() { + return spuSkuAttrValueList; + } + + public void setSpuSkuAttrValueList(List spuSkuAttrValueList) { + this.spuSkuAttrValueList = spuSkuAttrValueList; + } + + public List getBrandLangList() { + return brandLangList; + } + + public void setBrandLangList(List brandLangList) { + this.brandLangList = brandLangList; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + @Override + public String toString() { + return "SpuExcelVO{" + + "seq='" + seq + '\'' + + ", nameZh='" + nameZh + '\'' + + ", sellingPointZh='" + sellingPointZh + '\'' + + ", brandName='" + brandName + '\'' + + ", categoryName='" + categoryName + '\'' + + ", shopCategoryName='" + shopCategoryName + '\'' + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplate='" + deliveryTemplate + '\'' + + ", status='" + status + '\'' + + ", supplierName='" + supplierName + '\'' + + ", supplyPrice=" + supplyPrice + + ", commissionSpuStatus='" + commissionSpuStatus + '\'' + + ", supplierDelivery='" + supplierDelivery + '\'' + + ", skuNameZh='" + skuNameZh + '\'' + + ", propertiesZh='" + propertiesZh + '\'' + + ", priceFee='" + priceFee + '\'' + + ", marketPriceFee='" + marketPriceFee + '\'' + + ", stock=" + stock + + ", partyCode='" + partyCode + '\'' + + ", weight=" + weight + + ", volume=" + volume + + ", spuId=" + spuId + + ", deliveryTemplateId=" + deliveryTemplateId + + ", spuSkuAttrValueList=" + spuSkuAttrValueList + + ", brandLangList=" + brandLangList + + ", spuLangList=" + spuLangList + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", supplierId=" + supplierId + + ", skuChoiceStatus=" + skuChoiceStatus + + ", supplierDeliveryType=" + supplierDeliveryType + + ", supplierSpuId=" + supplierSpuId + + ", deliveryAmount=" + deliveryAmount + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierSpuVo.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierSpuVo.java new file mode 100644 index 0000000..1883b2f --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/SupplierSpuVo.java @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.product.vo.*; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author xxw + * @date 2022/6/23 9:41 + */ +public class SupplierSpuVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "供应商商品id") + private Long supplierSpuId; + + @Schema(description = "卖点") + private String sellingPoint; + + @Schema(description = "多语言信息列表") + private List spuLangList; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "商品介绍主图 多个图片逗号分隔") + private String imgUrls; + + @Schema(description = "商品视频") + private String video; + + @Schema(description = "计量单位") + private String measureUnit; + + @Schema(description = "供应商spu编码") + private String spuCode; + + @Schema(description = "规格属性") + private List spuAttrValues; + + @Schema(description = "sku列表") + private List skus; + + @Schema(description = "供应商平台分类信息") + private CategoryVO category; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "店铺分类ID") + private Long shopCategoryId; + + @Schema(description = "店铺分类信息") + private CategoryVO shopCategory; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "品牌信息") + private BrandVO brand; + + @Schema(description = "品牌ID") + private Long brandId; + + @Schema(description = "商品详情") + private String detail; + + @Schema(description = "商品详情列表") + private List detailList; + + @Schema(description = "sku是否含有图片 0无 1有") + private Integer hasSkuImg; + + public Integer getHasSkuImg() { + return hasSkuImg; + } + + public void setHasSkuImg(Integer hasSkuImg) { + this.hasSkuImg = hasSkuImg; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public List getDetailList() { + return detailList; + } + + public void setDetailList(List detailList) { + this.detailList = detailList; + } + + public BrandVO getBrand() { + return brand; + } + + public void setBrand(BrandVO brand) { + this.brand = brand; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public List getSpuLangList() { + return spuLangList; + } + + public void setSpuLangList(List spuLangList) { + this.spuLangList = spuLangList; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public CategoryVO getShopCategory() { + return shopCategory; + } + + public void setShopCategory(CategoryVO shopCategory) { + this.shopCategory = shopCategory; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Long getShopCategoryId() { + return shopCategoryId; + } + + public void setShopCategoryId(Long shopCategoryId) { + this.shopCategoryId = shopCategoryId; + } + + public Long getSupplierSpuId() { + return supplierSpuId; + } + + public void setSupplierSpuId(Long supplierSpuId) { + this.supplierSpuId = supplierSpuId; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getMeasureUnit() { + return measureUnit; + } + + public void setMeasureUnit(String measureUnit) { + this.measureUnit = measureUnit; + } + + public String getSpuCode() { + return spuCode; + } + + public void setSpuCode(String spuCode) { + this.spuCode = spuCode; + } + + public List getSpuAttrValues() { + return spuAttrValues; + } + + public void setSpuAttrValues(List spuAttrValues) { + this.spuAttrValues = spuAttrValues; + } + + public List getSkus() { + return skus; + } + + public void setSkus(List skus) { + this.skus = skus; + } + + public CategoryVO getCategory() { + return category; + } + + public void setCategory(CategoryVO category) { + this.category = category; + } + + @Override + public String toString() { + return "SupplierSpuVo{" + + "supplierSpuId=" + supplierSpuId + + ", sellingPoint='" + sellingPoint + '\'' + + ", spuLangList=" + spuLangList + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", video='" + video + '\'' + + ", measureUnit='" + measureUnit + '\'' + + ", spuCode='" + spuCode + '\'' + + ", spuAttrValues=" + spuAttrValues + + ", skus=" + skus + + ", category=" + category + + ", categoryId=" + categoryId + + ", shopCategoryId=" + shopCategoryId + + ", shopCategory=" + shopCategory + + ", supplierId=" + supplierId + + ", brand=" + brand + + ", brandId=" + brandId + + ", detail='" + detail + '\'' + + ", detailList=" + detailList + + ", hasSkuImg=" + hasSkuImg + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockExcelVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockExcelVO.java new file mode 100644 index 0000000..c4d6b6b --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockExcelVO.java @@ -0,0 +1,285 @@ +package com.tmerclub.cloud.product.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serial; +import java.io.Serializable; +/** + * @author lanhai + */ +public class TakeStockExcelVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "实物盘点信息"; + public static final String SHEET_NAME = "实物盘点信息"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {0, 1, 2, 3, 4, 5}; + + @ExcelProperty(value = {"盘点商品明细", "盘点单号"}, index = 0) + private String takeStockNo; + + @ExcelProperty(value = {"盘点商品明细", "盘点日期"}, index = 1) + private String createTime; + + @ExcelIgnore + private Integer billStatus; + + @ExcelProperty(value = {"盘点商品明细", "盘点状态"}, index = 2) + private String billStatusStr; + + @ExcelProperty(value = {"盘点商品明细", "制单人"}, index = 3) + private String makerName; + + @ExcelIgnore + private Long warehouseId; + + @ExcelProperty(value = {"盘点商品明细", "库存点名称"}, index = 4) + private String warehouseName; + + @ExcelIgnore + private Integer stockPointType; + + @ExcelProperty(value = {"盘点商品明细", "库存点类型"}, index = 5) + private String stockPointTypeStr; + + @ExcelProperty(value = {"盘点商品明细", "盘点区域名称"}, index = 6) + private String stockRegionName; + + @ExcelProperty(value = {"盘点商品明细", "备注"}, index = 7) + private String remark; + + @ExcelProperty(value = {"盘点商品明细", "商品名称"}, index = 8) + private String spuName; + + @ExcelProperty(value = {"盘点商品明细", "商品规格"}, index = 9) + private String skuName; + + @ExcelProperty(value = {"盘点商品明细", "商品编码"}, index = 10) + private String partyCode; + + @ExcelProperty(value = {"盘点商品明细", "账面库存"}, index = 11) + private Integer stocks; + + @ExcelProperty(value = {"盘点商品明细", "实盘库存"}, index = 12) + private Integer actualStock; + + @ExcelProperty(value = {"盘点商品明细", "盈亏数量"}, index = 13) + private Integer changeStock; + + @ExcelIgnore + private Integer ioType; + + @ExcelProperty(value = {"盘点商品明细", "盈亏状态"}, index = 14) + private String ioTypeStr; + + @ExcelProperty(value = {"盘点商品明细", "盘点商品备注"}, index = 15) + private String takeStockRemark; + + @ExcelIgnore + private Long maker; + + public String getTakeStockNo() { + return takeStockNo; + } + + public void setTakeStockNo(String takeStockNo) { + this.takeStockNo = takeStockNo; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getBillStatus() { + return billStatus; + } + + public void setBillStatus(Integer billStatus) { + this.billStatus = billStatus; + } + + public String getBillStatusStr() { + return billStatusStr; + } + + public void setBillStatusStr(String billStatusStr) { + this.billStatusStr = billStatusStr; + } + + public String getMakerName() { + return makerName; + } + + public void setMakerName(String makerName) { + this.makerName = makerName; + } + + public String getStockRegionName() { + return stockRegionName; + } + + public void setStockRegionName(String stockRegionName) { + this.stockRegionName = stockRegionName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSpuName() { + return spuName; + } + + public void setSpuName(String spuName) { + this.spuName = spuName; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public String getPartyCode() { + return partyCode; + } + + public void setPartyCode(String partyCode) { + this.partyCode = partyCode; + } + + public Integer getStocks() { + return stocks; + } + + public void setStocks(Integer stocks) { + this.stocks = stocks; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getChangeStock() { + return changeStock; + } + + public void setChangeStock(Integer changeStock) { + this.changeStock = changeStock; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public String getIoTypeStr() { + return ioTypeStr; + } + + public void setIoTypeStr(String ioTypeStr) { + this.ioTypeStr = ioTypeStr; + } + + public String getTakeStockRemark() { + return takeStockRemark; + } + + public void setTakeStockRemark(String takeStockRemark) { + this.takeStockRemark = takeStockRemark; + } + + public Long getMaker() { + return maker; + } + + public void setMaker(Long maker) { + this.maker = maker; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public String getStockPointTypeStr() { + return stockPointTypeStr; + } + + public void setStockPointTypeStr(String stockPointTypeStr) { + this.stockPointTypeStr = stockPointTypeStr; + } + + @Override + public String toString() { + return "TakeStockExcelVO{" + + "takeStockNo='" + takeStockNo + '\'' + + ", createTime='" + createTime + '\'' + + ", billStatus=" + billStatus + + ", billStatusStr='" + billStatusStr + '\'' + + ", makerName='" + makerName + '\'' + + ", warehouseId=" + warehouseId + + ", warehouseName='" + warehouseName + '\'' + + ", stockPointType=" + stockPointType + + ", stockPointTypeStr='" + stockPointTypeStr + '\'' + + ", stockRegionName='" + stockRegionName + '\'' + + ", remark='" + remark + '\'' + + ", spuName='" + spuName + '\'' + + ", skuName='" + skuName + '\'' + + ", partyCode='" + partyCode + '\'' + + ", stocks=" + stocks + + ", actualStock=" + actualStock + + ", changeStock=" + changeStock + + ", ioType=" + ioType + + ", ioTypeStr='" + ioTypeStr + '\'' + + ", takeStockRemark='" + takeStockRemark + '\'' + + ", maker=" + maker + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockVO.java new file mode 100644 index 0000000..186df3d --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/TakeStockVO.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.product.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * VO + * + * @author lhd + * @date 2022-06-22 16:57:27 + */ +public class TakeStockVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "盘点id") + private Long takeStockId; + + @Schema(description = "盘点单号") + private String takeStockNo; + + @Schema(description = "盘点状态 0已作废 1盘点中 2已完成") + private Integer billStatus; + + @Schema(description = "制单人") + private Long maker; + + @Schema(description = "盘点区域名称") + private String stockRegionName; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @Schema(description = "sku数量") + private Integer skuCount; + + @Schema(description = "制单人名称") + private String makerName; + + @Schema(description = "仓库id") + private Long warehouseId; + + @Schema(description = "仓库名称") + private String warehouseName; + + @Schema(description = "库存点类型(1:仓库, 2:门店)") + private Integer stockPointType; + + @Schema(description = "实物盘点商品列表") + private List takeStockSpuVOList; + + public Long getTakeStockId() { + return takeStockId; + } + + public void setTakeStockId(Long takeStockId) { + this.takeStockId = takeStockId; + } + + public String getTakeStockNo() { + return takeStockNo; + } + + public void setTakeStockNo(String takeStockNo) { + this.takeStockNo = takeStockNo; + } + + public Integer getBillStatus() { + return billStatus; + } + + public void setBillStatus(Integer billStatus) { + this.billStatus = billStatus; + } + + public Long getMaker() { + return maker; + } + + public void setMaker(Long maker) { + this.maker = maker; + } + + public String getStockRegionName() { + return stockRegionName; + } + + public void setStockRegionName(String stockRegionName) { + this.stockRegionName = stockRegionName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public Integer getSkuCount() { + return skuCount; + } + + public void setSkuCount(Integer skuCount) { + this.skuCount = skuCount; + } + + public String getMakerName() { + return makerName; + } + + public void setMakerName(String makerName) { + this.makerName = makerName; + } + + public List getTakeStockSpuVOList() { + return takeStockSpuVOList; + } + + public void setTakeStockSpuVOList(List takeStockSpuVOList) { + this.takeStockSpuVOList = takeStockSpuVOList; + } + + public Long getWarehouseId() { + return warehouseId; + } + + public void setWarehouseId(Long warehouseId) { + this.warehouseId = warehouseId; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + @Override + public String toString() { + return "TakeStockVO{" + + "takeStockId=" + takeStockId + + ", takeStockNo='" + takeStockNo + '\'' + + ", billStatus=" + billStatus + + ", maker=" + maker + + ", stockRegionName='" + stockRegionName + '\'' + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", makerMobile='" + makerMobile + '\'' + + ", skuCount=" + skuCount + + ", makerName='" + makerName + '\'' + + ", warehouseId=" + warehouseId + + ", warehouseName='" + warehouseName + '\'' + + ", stockPointType=" + stockPointType + + ", takeStockSpuVOList=" + takeStockSpuVOList + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoSpuCommStatisticsVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoSpuCommStatisticsVO.java new file mode 100644 index 0000000..456f513 --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoSpuCommStatisticsVO.java @@ -0,0 +1,167 @@ +package com.tmerclub.cloud.product.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 对应MongoDB存储出入库日志emp + * + * @author track + */ +@Document("spu_comm") +public class MongoSpuCommStatisticsVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "好评率") + private Double positiveRating; + + @Schema(description = "评论数量") + private Integer number; + + @Schema(description = "好评数") + private Integer praiseNumber; + + @Schema(description = "中评数") + private Integer secondaryNumber; + + @Schema(description = "差评数") + private Integer negativeNumber; + + @Schema(description = "有图数") + private Integer picNumber; + + @Schema(description = "五星") + private Integer fiveStarsNumber; + + @Schema(description = "四星") + private Integer fourStarsNumber; + + @Schema(description = "三星") + private Integer threeStarsNumber; + + @Schema(description = "二星") + private Integer twoStarsNumber; + + @Schema(description = "一星") + private Integer oneStarsNumber; + + @Schema(description = "商品id") + private Long spuId; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Double getPositiveRating() { + return positiveRating; + } + + public void setPositiveRating(Double positiveRating) { + this.positiveRating = positiveRating; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public Integer getPraiseNumber() { + return praiseNumber; + } + + public void setPraiseNumber(Integer praiseNumber) { + this.praiseNumber = praiseNumber; + } + + public Integer getSecondaryNumber() { + return secondaryNumber; + } + + public void setSecondaryNumber(Integer secondaryNumber) { + this.secondaryNumber = secondaryNumber; + } + + public Integer getNegativeNumber() { + return negativeNumber; + } + + public void setNegativeNumber(Integer negativeNumber) { + this.negativeNumber = negativeNumber; + } + + public Integer getPicNumber() { + return picNumber; + } + + public void setPicNumber(Integer picNumber) { + this.picNumber = picNumber; + } + + public Integer getFiveStarsNumber() { + return fiveStarsNumber; + } + + public void setFiveStarsNumber(Integer fiveStarsNumber) { + this.fiveStarsNumber = fiveStarsNumber; + } + + public Integer getFourStarsNumber() { + return fourStarsNumber; + } + + public void setFourStarsNumber(Integer fourStarsNumber) { + this.fourStarsNumber = fourStarsNumber; + } + + public Integer getThreeStarsNumber() { + return threeStarsNumber; + } + + public void setThreeStarsNumber(Integer threeStarsNumber) { + this.threeStarsNumber = threeStarsNumber; + } + + public Integer getTwoStarsNumber() { + return twoStarsNumber; + } + + public void setTwoStarsNumber(Integer twoStarsNumber) { + this.twoStarsNumber = twoStarsNumber; + } + + public Integer getOneStarsNumber() { + return oneStarsNumber; + } + + public void setOneStarsNumber(Integer oneStarsNumber) { + this.oneStarsNumber = oneStarsNumber; + } + + @Override + public String toString() { + return "MongoSpuCommStatisticsVO{" + + "positiveRating=" + positiveRating + + ", number=" + number + + ", praiseNumber=" + praiseNumber + + ", secondaryNumber=" + secondaryNumber + + ", negativeNumber=" + negativeNumber + + ", picNumber=" + picNumber + + ", fiveStarsNumber=" + fiveStarsNumber + + ", fourStarsNumber=" + fourStarsNumber + + ", threeStarsNumber=" + threeStarsNumber + + ", twoStarsNumber=" + twoStarsNumber + + ", oneStarsNumber=" + oneStarsNumber + + ", spuId=" + spuId + + '}'; + } +} diff --git a/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoStockBillLogVO.java b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoStockBillLogVO.java new file mode 100644 index 0000000..0fd813a --- /dev/null +++ b/tmerclub-product/src/main/java/com/tmerclub/cloud/product/vo/mongo/MongoStockBillLogVO.java @@ -0,0 +1,313 @@ +package com.tmerclub.cloud.product.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 对应MongoDB存储出入库日志emp + * + * @author track + */ +@Document("stock_bill_log") +public class MongoStockBillLogVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "出入库明细id") + private Long stockBillLogId; + + @Schema(description = "出入库单号") + private String stockBillNo; + + @Schema(description = "关联订单号") + private String sourceOrderNo; + + @Schema(description = "单据类型") + private Integer stockBillType; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "更新时间") + private Date updateTime; + + @Schema(description = "出入库原因id") + private Long stockChangeReasonId; + + @Schema(description = "出入库原因") + private String reason; + + @Schema(description = "操作员工id") + private Long employeeId; + + @Schema(description = "状态,0:已作废,1:已出/入库,2:待提交") + private Integer status; + + @Schema(description = "出入库时间") + private Date businessTime; + + @Schema(description = "总出入库数量") + private Integer totalCount; + + @Schema(description = "总出入库金额") + private Long totalAmount; + + @Schema(description = "出入库凭证") + private String qualifications; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "供应商id") + private Long supplierId; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "类型,1:出库 2:入库") + private Integer type; + + @Schema(description = "制单人手机号") + private String makerMobile; + + @Schema(description = "制单人姓名") + private String makerName; + + @Schema(description = "出入库项列表") + List stockBillItemLogs; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点名称") + private String stockPointName; + + @Schema(description = "库存点类型(1:仓库 2:门店)") + private Integer stockPointType; + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public String getStockPointName() { + return stockPointName; + } + + public void setStockPointName(String stockPointName) { + this.stockPointName = stockPointName; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getStockBillLogId() { + return stockBillLogId; + } + + public void setStockBillLogId(Long stockBillLogId) { + this.stockBillLogId = stockBillLogId; + } + + public String getStockBillNo() { + return stockBillNo; + } + + public void setStockBillNo(String stockBillNo) { + this.stockBillNo = stockBillNo; + } + + public String getSourceOrderNo() { + return sourceOrderNo; + } + + public void setSourceOrderNo(String sourceOrderNo) { + this.sourceOrderNo = sourceOrderNo; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Integer getStockBillType() { + return stockBillType; + } + + public void setStockBillType(Integer stockBillType) { + this.stockBillType = stockBillType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getStockChangeReasonId() { + return stockChangeReasonId; + } + + public void setStockChangeReasonId(Long stockChangeReasonId) { + this.stockChangeReasonId = stockChangeReasonId; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getBusinessTime() { + return businessTime; + } + + public void setBusinessTime(Date businessTime) { + this.businessTime = businessTime; + } + + public Integer getTotalCount() { + return totalCount; + } + + public void setTotalCount(Integer totalCount) { + this.totalCount = totalCount; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public String getQualifications() { + return qualifications; + } + + public void setQualifications(String qualifications) { + this.qualifications = qualifications; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getMakerMobile() { + return makerMobile; + } + + public void setMakerMobile(String makerMobile) { + this.makerMobile = makerMobile; + } + + public List getStockBillItemLogs() { + return stockBillItemLogs; + } + + public void setStockBillItemLogs(List stockBillItemLogs) { + this.stockBillItemLogs = stockBillItemLogs; + } + + public String getMakerName() { + return makerName; + } + + public void setMakerName(String makerName) { + this.makerName = makerName; + } + + @Override + public String toString() { + return "MongoStockBillLogVO{" + + "stockBillLogId=" + stockBillLogId + + ", stockBillNo='" + stockBillNo + '\'' + + ", sourceOrderNo='" + sourceOrderNo + '\'' + + ", stockBillType=" + stockBillType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", stockChangeReasonId=" + stockChangeReasonId + + ", reason='" + reason + '\'' + + ", employeeId=" + employeeId + + ", status=" + status + + ", businessTime=" + businessTime + + ", totalCount=" + totalCount + + ", totalAmount=" + totalAmount + + ", qualifications='" + qualifications + '\'' + + ", shopId=" + shopId + + ", supplierId=" + supplierId + + ", remark='" + remark + '\'' + + ", type=" + type + + ", makerMobile='" + makerMobile + '\'' + + ", makerName='" + makerName + '\'' + + ", stockBillItemLogs=" + stockBillItemLogs + + ", stockPointId=" + stockPointId + + ", stockPointName='" + stockPointName + '\'' + + ", stockPointType=" + stockPointType + + '}'; + } +} diff --git a/tmerclub-product/src/main/resources/logback.xml b/tmerclub-product/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-product/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/AttrLangMapper.xml b/tmerclub-product/src/main/resources/mapper/AttrLangMapper.xml new file mode 100644 index 0000000..86b3fc7 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/AttrLangMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + `attr_id`,`lang`,`name` + + + + + delete from attr_lang where attr_id = #{attrId} + + + + insert into attr_lang (`attr_id`,`lang`,`name`,`desc`) values + + (#{attrLang.attrId},#{attrLang.lang},#{attrLang.name},#{attrLang.desc}) + + + + + + update attr_lang + + + `name` = #{attrLang.name}, + + + `desc` = #{attrLang.desc}, + + + where attr_id = #{attrLang.attrId} and `lang` = #{attrLang.lang}; + + + + + delete from attr_lang where attr_id = #{attrId} and lang in + + #{lang} + + + diff --git a/tmerclub-product/src/main/resources/mapper/AttrMapper.xml b/tmerclub-product/src/main/resources/mapper/AttrMapper.xml new file mode 100644 index 0000000..8814de7 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/AttrMapper.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `attr_id`,`shop_id`,`create_time`,`update_time`,`search_type`,`attr_type` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into attr (`search_type`,`attr_type`,`shop_id`, `sys_type`) + values (#{attr.searchType},#{attr.attrType},#{attr.shopId},#{attr.sysType}) + + + update attr + set + + `search_type` = #{attr.searchType}, + + update_time = NOW() + where attr_id = #{attr.attrId} + + + delete from attr where attr_id = #{attrId}; + delete from attr_value where attr_id = #{attrId}; + delete from attr_category where attr_id = #{attrId}; + + + + diff --git a/tmerclub-product/src/main/resources/mapper/CategoryLangMapper.xml b/tmerclub-product/src/main/resources/mapper/CategoryLangMapper.xml new file mode 100644 index 0000000..2bb9655 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/CategoryLangMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + `category_id`,`lang`,`name` + + + + + delete from category_lang where category_id = #{categoryId} + + + + + insert into category_lang (`category_id`,`lang`,`name`) + values (#{categoryLang.categoryId},#{categoryLang.lang},#{categoryLang.name}); + + + + + + update category_lang + + + `name` = #{categoryLang.name}, + + + where category_id = #{categoryLang.categoryId} and lang = #{categoryLang.lang}; + + + + + delete from category_lang where category_id = #{categoryId} and lang in + + #{lang} + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/CategoryShopMapper.xml b/tmerclub-product/src/main/resources/mapper/CategoryShopMapper.xml new file mode 100644 index 0000000..c9d88bd --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/CategoryShopMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `category_shop_id`,`create_time`,`update_time`,`shop_id`,`category_id`,`rate`,`qualifications`,`sys_type` + + + + + + insert into category_shop (`category_shop_id`,`shop_id`,`category_id`,`rate`,`qualifications`,`sys_type`) values + + (#{categoryShop.categoryShopId},#{shopId},#{categoryShop.categoryId},#{categoryShop.rate},#{categoryShop.qualifications},#{sysType}) + + + + + delete from category_shop where category_shop_id = #{categoryShopId} + + + delete from category_shop where shop_id = #{shopId} and sys_type = #{sysType} + + + delete from category_shop where category_id = #{categoryId} + + + + + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/GiveawayMapper.xml b/tmerclub-product/src/main/resources/mapper/GiveawayMapper.xml new file mode 100644 index 0000000..1937342 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/GiveawayMapper.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `giveaway_id`,`name`,`create_time`,`update_time`,`start_time`,`end_time`,`shop_id`,`buy_num`,`spu_id`,`status` + + + + + + + + + + + insert into giveaway (`name`,`start_time`,`end_time`,`shop_id`,`buy_num`,`spu_id`,`status`) + values (#{giveaway.name},#{giveaway.startTime},#{giveaway.endTime},#{giveaway.shopId},#{giveaway.buyNum},#{giveaway.spuId},#{giveaway.status}); + + + + update giveaway + + + `name` = #{giveaway.name}, + + + `start_time` = #{giveaway.startTime}, + + + `end_time` = #{giveaway.endTime}, + + + `shop_id` = #{giveaway.shopId}, + + + `buy_num` = #{giveaway.buyNum}, + + + `spu_id` = #{giveaway.spuId}, + + + `status` = #{giveaway.status}, + + + where giveaway_id = #{giveaway.giveawayId} and + + `status` != 0 + + + `status` > #{giveaway.status} + + + + + + + + + + + + + + UPDATE giveaway SET `status` = 1 + WHERE `status` = 2 + and start_time < now() + + + + + + UPDATE giveaway SET `status` = 0 WHERE giveaway_id IN + + #{giveaway.giveawayId} + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/GiveawaySpuMapper.xml b/tmerclub-product/src/main/resources/mapper/GiveawaySpuMapper.xml new file mode 100644 index 0000000..b0835d7 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/GiveawaySpuMapper.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `giveaway_spu_id`,`giveaway_id`,`spu_id`,`sku_id`,`giveaway_num`,`refund_price`,`status` + + + + + + + + + + + insert into giveaway_spu (`giveaway_id`,`spu_id`,`sku_id`,`giveaway_num`,`refund_price`,`status`) + values (#{giveawaySpu.giveawayId},#{giveawaySpu.spuId},#{giveawaySpu.skuId},#{giveawaySpu.giveawayNum},#{giveawaySpu.refundPrice},#{giveawaySpu.status}); + + + + update giveaway_spu set status = #{status} where giveaway_id = #{giveawayId} and status > #{status} + + + + delete from giveaway_spu where giveaway_spu_id = #{giveawaySpuId} + + + insert into giveaway_spu (`giveaway_id`,`spu_id`,`sku_id`,`giveaway_num`,`refund_price`,`status`) + values + + (#{giveawaySpu.giveawayId},#{giveawaySpu.spuId},#{giveawaySpu.skuId},#{giveawaySpu.giveawayNum},#{giveawaySpu.refundPrice},#{giveawaySpu.status}) + + + + + delete from giveaway_spu where giveaway_spu_id in + + #{giveawaySpuId} + + + + + + + + + UPDATE giveaway_spu SET `status` = 0 WHERE giveaway_id IN + + #{giveawayId} + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SkuComboMapper.xml b/tmerclub-product/src/main/resources/mapper/SkuComboMapper.xml new file mode 100644 index 0000000..90401b6 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SkuComboMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `sku_id`,`combo_sku_id`,`combo_spu_id`,`combo_count`,`create_time`,`update_time` + + + + + + + + + + + + + + + + + + + + insert into sku_combo (`sku_id`,`combo_sku_id`,`combo_spu_id`,`combo_count`) values + + (#{skuCombo.skuId},#{skuCombo.comboSkuId},#{skuCombo.comboSpuId},#{skuCombo.comboCount}) + + + + + update sku_combo + + + `combo_sku_id` = #{skuCombo.comboSkuId}, + + + where sku_id = #{skuCombo.skuId} + + + + delete from sku_combo where sku_id in + + #{skuId} + + + + + delete from sku_combo where combo_spu_id in + + #{spuId} + + + + + delete from sku_combo where combo_sku_id in + + #{skuId} + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SkuLangMapper.xml b/tmerclub-product/src/main/resources/mapper/SkuLangMapper.xml new file mode 100644 index 0000000..ce62599 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SkuLangMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + `sku_id`,`lang`,`sku_name`,`attrs` + + + + + insert into sku_lang (`lang`,`sku_name`,`attrs`) + values (#{skuLang.lang},#{skuLang.skuName},#{skuLang.attrs}); + + + update sku_lang + + + `lang` = #{skuLang.lang}, + + + `sku_name` = #{skuLang.skuName}, + + + `attrs` = #{skuLang.attrs}, + + + where sku_id = #{skuLang.skuId} + + + delete from sku_lang where sku_id = #{skuId} + + + + insert into sku_lang (`sku_id`,`lang`,`sku_name`,`attrs`) values + + (#{skuLang.skuId},#{skuLang.lang},#{skuLang.skuName},#{skuLang.attrs}) + + + diff --git a/tmerclub-product/src/main/resources/mapper/SkuMapper.xml b/tmerclub-product/src/main/resources/mapper/SkuMapper.xml new file mode 100644 index 0000000..d8175da --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SkuMapper.xml @@ -0,0 +1,597 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sku.`sku_id`,sku.`create_time`,sku.`update_time`,sku.`spu_id`,sku.`img_url`,sku.`price_fee`,sku.`market_price_fee`,sku.`status` + ,sku.weight,sku.volume,sku.score_fee,sku.party_code,sku.model_id,sku.stock_warning,sku.supplier_sku_id + + + + + + insert into sku (`spu_id`,`img_url`,`price_fee`,`market_price_fee`,`score_fee`,`party_code`,`model_id`,`status`,`weight`,`volume`,`supplier_sku_id`,`stock_warning`) values + + (#{sku.spuId},#{sku.imgUrl},#{sku.priceFee},#{sku.marketPriceFee},#{sku.scoreFee},#{sku.partyCode},#{sku.modelId},#{sku.status},#{sku.weight},#{sku.volume},#{sku.supplierSkuId},#{sku.stockWarning}) + + + + + update sku + + + `spu_id` = #{sku.spuId}, + + + `img_url` = #{sku.imgUrl}, + + + `price_fee` = #{sku.priceFee}, + + + `market_price_fee` = #{sku.marketPriceFee}, + + + `score_fee` = #{sku.scoreFee}, + + + `status` = #{sku.status}, + + + `supplier_sku_id` = #{sku.supplierSkuId}, + + + where sku_id = #{sku.skuId} + + + delete from sku where sku_id = #{skuId} + + + + update sku set status = -1 where spu_id = #{spuId} + + + + + update sku + + update_time = now(), + + `img_url` = #{sku.imgUrl}, + + + `price_fee` = #{sku.priceFee}, + + + `market_price_fee` = #{sku.marketPriceFee}, + + + `score_fee` = #{sku.scoreFee}, + + + `party_code` = #{sku.partyCode}, + + + `model_id` = #{sku.modelId}, + + + `status` = #{sku.status}, + + + `weight` = #{sku.weight}, + + + `volume` = #{sku.volume}, + + + `stock_warning` = #{sku.stockWarning}, + + + `supplier_sku_id` = #{sku.supplierSkuId}, + + + where sku_id = #{sku.skuId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE `sku` SET stock_warning_status = IF(stock_warning <= #{sku.stock}, 0, 1) WHERE sku_id = #{sku.skuId} + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuCollectionMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuCollectionMapper.xml new file mode 100644 index 0000000..f7eb98e --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuCollectionMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + `id`,`create_time`,`update_time`,`spu_id`,`user_id` + + + + + insert into spu_collection (`spu_id`,`user_id`) + values (#{spuCollection.spuId},#{spuCollection.userId}); + + + update spu_collection + + + `spu_id` = #{spuCollection.spuId}, + + + `user_id` = #{spuCollection.userId}, + + + where id = #{spuCollection.id} + + + delete from spu_collection where id = #{id} + + + + + + + + delete from spu_collection where user_id = #{userId} + + and spu_id = #{spuId} + + + and spu_id in + + #{spuId} + + + + + + + + + insert into spu_collection (`spu_id`,`user_id`) values (#{spuId},#{userId}); + + + + + delete from spu_collection where spu_id = #{spuId} + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuConsignmentChangeMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuConsignmentChangeMapper.xml new file mode 100644 index 0000000..5e10cad --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuConsignmentChangeMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + `consignment_change_id`,`spu_id`,`name_change`,`image_change`,`selling_point_change`,`video_change`,`measure_unit_change`,`brand_change`,`detail_change`,`spu_code_change`,`create_time`,`update_time` + + + + + insert into spu_consignment_change (`spu_id`) + values (#{spuConsignmentChange.spuId}) + + + update spu_consignment_change + + + `spu_id` = #{spuConsignmentChange.spuId}, + + + `name_change` = #{spuConsignmentChange.nameChange}, + + + `image_change` = #{spuConsignmentChange.imageChange}, + + + `selling_point_change` = #{spuConsignmentChange.sellingPointChange}, + + + `video_change` = #{spuConsignmentChange.videoChange}, + + + `measure_unit_change` = #{spuConsignmentChange.measureUnitChange}, + + + `brand_change` = #{spuConsignmentChange.brandChange}, + + + `detail_change` = #{spuConsignmentChange.detailChange}, + + + where consignment_change_id = #{spuConsignmentChange.consignmentChangeId} + + + delete from spu_consignment_change where consignment_change_id = #{consignmentChangeId} + + + + update spu_consignment_change + + + `name_change` = #{spuConsignmentChange.nameChange}, + + + `image_change` = #{spuConsignmentChange.imageChange}, + + + `selling_point_change` = #{spuConsignmentChange.sellingPointChange}, + + + `video_change` = #{spuConsignmentChange.videoChange}, + + + `measure_unit_change` = #{spuConsignmentChange.measureUnitChange}, + + + `brand_change` = #{spuConsignmentChange.brandChange}, + + + `detail_change` = #{spuConsignmentChange.detailChange}, + + + `spu_code_change` = #{spuConsignmentChange.spuCodeChange}, + + + where spu_id = #{spuConsignmentChange.spuId} + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuDetailMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuDetailMapper.xml new file mode 100644 index 0000000..b7d739d --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuDetailMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + `spu_id`,`create_time`,`update_time`,`detail` + + + + update spu_detail set `detail` = #{spuDetail.detail} + where spu_id = #{spuDetail.spuId} and lang = #{spuDetail.lang}; + + + + delete from spu_detail where spu_id = #{spuId} + + + + + insert into spu_detail (`spu_id`,`lang`,`detail`) + values (#{spuDetail.spuId},#{spuDetail.lang},#{spuDetail.detail}); + + + + + delete from spu_detail where spu_id = #{spuId} and lang in + + #{lang} + + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuExtensionMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuExtensionMapper.xml new file mode 100644 index 0000000..e49d093 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuExtensionMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + `spu_extend_id`, + `create_time`, + `update_time`, + `spu_id`, + `comment_num` + + + + + insert into spu_extension (`spu_id`, `comment_num`) + values (#{spuExtension.spuId}, 0); + + + delete + from spu_extension + where spu_id = #{spuId} + + + + + + update spu_extension + + + stock = #{spuExtension.stock}, + + + actual_stock = #{spuExtension.actualStock}, + + + lock_stock = #{spuExtension.lockStock} + + + where spu_id = #{spuExtension.spuId} + + + update spu_extension + set water_sold_num = #{waterSoldNum} + where spu_id = #{spuId} + + + update spu_extension + set comment_num = comment_num + #{changeCount} + where spu_id = #{spuId} + + + update spu_extension + set `sale_num` = `sale_num` + #{prodCount} + where spu_id = #{spuId} + + diff --git a/tmerclub-product/src/main/resources/mapper/SpuMapper.xml b/tmerclub-product/src/main/resources/mapper/SpuMapper.xml new file mode 100644 index 0000000..d27e37b --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/SpuMapper.xml @@ -0,0 +1,1652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s.`spu_id`,s.`shop_id`,s.`create_time`,s.`update_time`,s.`brand_id`,s.`shop_category_id`,s.`category_id`,s.`img_urls`,s.`main_img_url`,s.`price_fee`,s.`market_price_fee`, + s.`status`,s.`has_sku_img`,s.`seq`,s.`is_top`,s.delivery_mode,s.delivery_template_id,s.is_refund,s.activity_id,s.spu_type,s.spu_mold,s.video,s.spu_code,s.`supplier_spu_type`, + s.`supplier_spu_id`,s.`supplier_delivery_type`,s.`supplier_id`,s.`measure_unit`,s.`sku_choice_status`,s.`is_syn_update`,s.`is_update_msg`,s.`pre_sale_type`,s.`deposit_type`, + s.`deposit_amount`,s.`deposit_expansion_amount`,s.`deposit_start_time`,s.`deposit_end_time`,s.`balance_start_time`,s.`balance_end_time`,s.`pre_sale_delivery_type`,s.`pre_sale_delivery_time`,s.`virtual_remark`, + s.`write_off_num`,s.`write_off_multiple_count`,s.`write_off_time`,s.`write_off_start`,s.`write_off_end`,s.`delivery_amount` + + + + + + + + + + insert into spu (`spu_id`, `brand_id`, `shop_id`, `category_id`, `shop_category_id`, `img_urls`, `main_img_url`, `video`, + `price_fee`, `market_price_fee`, `score_fee`, `status`, `delivery_mode`, + `delivery_template_id`, has_sku_img, `spu_type`,`spu_mold`,`is_refund`, `seq`, `spu_code`, + `supplier_spu_type`, `supplier_spu_id`, `supplier_delivery_type`, `supplier_id`, + `measure_unit`, `sku_choice_status`,`is_syn_update`,`pre_sale_type`,`deposit_type`, + `deposit_amount`,`deposit_expansion_amount`,`deposit_start_time`,`deposit_end_time`, + `balance_start_time`,`balance_end_time`,`pre_sale_delivery_type`,`pre_sale_delivery_time`,`virtual_remark`, + `write_off_num`,`write_off_multiple_count`,`write_off_time`,`write_off_start`,`write_off_end`, `delivery_amount`, `is_all_entity`) + values (#{spu.spuId}, #{spu.brandId}, #{spu.shopId}, #{spu.categoryId}, #{spu.shopCategoryId}, #{spu.imgUrls}, + #{spu.mainImgUrl}, #{spu.video}, #{spu.priceFee}, #{spu.marketPriceFee}, #{spu.scoreFee}, #{spu.status}, + #{spu.deliveryMode}, #{spu.deliveryTemplateId}, #{spu.hasSkuImg}, #{spu.spuType}, #{spu.spuMold}, + #{spu.isRefund},#{spu.seq}, #{spu.spuCode}, #{spu.supplierSpuType}, #{spu.supplierSpuId}, #{spu.supplierDeliveryType}, + #{spu.supplierId}, #{spu.measureUnit}, #{spu.skuChoiceStatus},#{spu.isSynUpdate},#{spu.preSaleType}, + #{spu.depositType},#{spu.depositAmount},#{spu.depositExpansionAmount},#{spu.depositStartTime},#{spu.depositEndTime}, + #{spu.balanceStartTime},#{spu.balanceEndTime},#{spu.preSaleDeliveryType},#{spu.preSaleDeliveryTime},#{spu.virtualRemark}, + #{spu.writeOffNum},#{spu.writeOffMultipleCount},#{spu.writeOffTime},#{spu.writeOffStart},#{spu.writeOffEnd}, #{spu.deliveryAmount}, #{spu.isAllEntity}); + + + + update spu + set status = -1 + where spu_id = #{spuId} + + + update spu + set + + `category_id` = #{spu.categoryId}, + + + `shop_category_id` = #{spu.shopCategoryId}, + + + `img_urls` = #{spu.imgUrls}, + + + `main_img_url` = #{spu.mainImgUrl}, + + + `video` = #{spu.video}, + + + `price_fee` = #{spu.priceFee}, + + + `market_price_fee` = #{spu.marketPriceFee}, + + + `score_fee` = #{spu.scoreFee}, + + + `status` = #{spu.status}, + + + `delivery_mode` = #{spu.deliveryMode}, + + + `delivery_template_id` = #{spu.deliveryTemplateId}, + + + `delivery_amount` = #{spu.deliveryAmount}, + + + `spu_type` = #{spu.spuType}, + + + `activity_id` = #{spu.activityId}, + + + `spu_mold` = #{spu.spuMold}, + + + `is_refund` = #{spu.isRefund}, + + + `is_top` = #{spu.isTop}, + + + `has_sku_img` = #{spu.hasSkuImg}, + + + `seq` = #{spu.seq}, + + + `spu_code` = #{spu.spuCode}, + + + `measure_unit` = #{spu.measureUnit}, + + + `supplier_delivery_type` = #{spu.supplierDeliveryType}, + + + `supplier_spu_type` = #{spu.supplierSpuType}, + + + + `brand_id` = #{spu.brandId}, + + + pre_sale_type = #{spu.preSaleType}, + + + deposit_type = #{spu.depositType}, + + + deposit_amount = #{spu.depositAmount}, + + + deposit_expansion_amount = #{spu.depositExpansionAmount}, + + + deposit_start_time = #{spu.depositStartTime}, + + + deposit_end_time = #{spu.depositEndTime}, + + + balance_start_time = #{spu.balanceStartTime}, + + + balance_end_time = #{spu.balanceEndTime}, + + + pre_sale_delivery_type = #{spu.preSaleDeliveryType}, + + + pre_sale_delivery_time = #{spu.preSaleDeliveryTime}, + + + virtual_remark = #{spu.virtualRemark}, + + + write_off_num = #{spu.writeOffNum}, + + + write_off_multiple_count = #{spu.writeOffMultipleCount}, + + + write_off_time = #{spu.writeOffTime}, + + + write_off_start = #{spu.writeOffStart}, + + + write_off_end = #{spu.writeOffEnd}, + + + is_all_entity = #{spu.isAllEntity}, + + `update_time` = NOW() + where spu_id = #{spu.spuId} + + + + + + + + update spu set `status` = #{status}, `update_time` = NOW() where spu_id in + + #{spuId} + + + + update spu set `update_time` = NOW() + + + status = 1 + + + and category_id in + + #{categoryId} + + + + and spu_id in + + #{spuId} + + + + + and shop_id in + + + and supplier_spu_type = 1 and supplier_id in + + + #{shopId} + + + + + + + + + + + + update spu + set status = 0 + where shop_id = #{shopId} + and status = 1 + + + + + + update spu set spu_type = 0,activity_id = 0 where spu_id in + + #{spuId} + + + + + + + + + + + + update spu + + + `brand_id` = #{spu.brandId}, + + + `category_id` = #{spu.categoryId}, + + + `price_fee` = #{spu.priceFee}, + + + `market_price_fee` = #{spu.marketPriceFee}, + + + `status` = #{spu.status}, + + + `spu_type` = #{spu.spuType}, + + + `activity_id` = #{spu.activityId}, + + + `seq` = #{spu.seq}, + + update_time=NOW() + + where spu_id = #{spu.spuId} + + + + update spu + set is_top = if(is_top = 1, 0, 1) + where spu_id = #{spuId} + and (status = 1 or is_top = 1) + limit 1 + + + + update spu + + + `brand_id` = #{spu.brandId}, + + + `brand_id` = null, + + + `category_id` = #{spu.categoryId}, + + + `price_fee` = #{spu.priceFee}, + + + `market_price_fee` = #{spu.marketPriceFee}, + + + `status` = #{spu.status}, + + + `spu_type` = #{spu.spuType}, + + + `activity_id` = #{spu.activityId}, + + + `seq` = #{spu.seq}, + + + where spu_id = #{spu.spuId} + + + + + + + + + + + + + + + + + update spu + set brand_id = null + where brand_id = #{brandId} + + + + + + + + + + + + + + + + + + + + + + + UPDATE spu SET is_syn_update = #{isSynUpdate} WHERE spu_id IN + + #{spuId} + + + + + UPDATE spu + SET is_syn_update = #{isSynUpdate} + WHERE spu_id = #{spuId} + + + + + + + + + + + + + + + + + + + + + + + UPDATE spu SET supplier_delivery_type = #{deliverType} WHERE spu_id IN + + #{spuId} + + + + + + + + + + + + update spu + set brand_id = null + + + and supplier_id = #{shopId} and supplier_spu_type = 1 + + + and shop_id = #{shopId} + + + and brand_id in + + #{brandId} + + + + + + + + + + + + + + + + + update spu set `update_time` = NOW() where + + shop_id = #{shopId} + + + supplier_id = #{shopId} + + + + + + + + + + + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/WarehouseAreaMapper.xml b/tmerclub-product/src/main/resources/mapper/WarehouseAreaMapper.xml new file mode 100644 index 0000000..14d5074 --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/WarehouseAreaMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + `warehouse_area_id`,`create_time`,`update_time`,`warehouse_id`,`area_id` + + + + + insert into warehouse_area (`warehouse_id`,`area_id`) + values (#{warehouseArea.warehouseId},#{warehouseArea.areaId}); + + + update warehouse_area + + + `warehouse_id` = #{warehouseArea.warehouseId}, + + + `area_id` = #{warehouseArea.areaId}, + + + where warehouse_area_id = #{warehouseArea.warehouseAreaId} + + + delete from warehouse_area where warehouse_area_id = #{warehouseAreaId} + + + + insert into warehouse_area (`warehouse_id`,`area_id`) values + + (#{warehouseArea.warehouseId},#{warehouseArea.areaId}) + + + + + diff --git a/tmerclub-product/src/main/resources/mapper/WarehouseMapper.xml b/tmerclub-product/src/main/resources/mapper/WarehouseMapper.xml new file mode 100644 index 0000000..5ef22ad --- /dev/null +++ b/tmerclub-product/src/main/resources/mapper/WarehouseMapper.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `warehouse_id`,`create_time`,`update_time`,`shop_id`,`warehouse_name`,`type`,`address`,`manage`,`phone`,`sys_type`,`province_id`,`province`,`city_id`,`city`,`area_id`,`area` + + + w.`warehouse_id`,w.`create_time`,w.`update_time`,w.`shop_id`,w.`warehouse_name`,w.`type`,w.`address`,w.`manage`,w.`phone`,w.`sys_type` + + + + + insert into warehouse (`warehouse_id`,`shop_id`,`warehouse_name`,`type`,`address`,`manage`,`phone`,`sys_type`, + `province_id`,`province`,`city_id`,`city`,`area_id`,`area`) + values (#{warehouse.warehouseId},#{warehouse.shopId},#{warehouse.warehouseName},#{warehouse.type},#{warehouse.address},#{warehouse.manage},#{warehouse.phone},#{warehouse.sysType}, + #{warehouse.provinceId},#{warehouse.province},#{warehouse.cityId},#{warehouse.city},#{warehouse.areaId},#{warehouse.area}); + + + update warehouse + + + `warehouse_name` = #{warehouse.warehouseName}, + + + `address` = #{warehouse.address}, + + + `manage` = #{warehouse.manage}, + + + `phone` = #{warehouse.phone}, + + + `province_id` = #{warehouse.provinceId}, + + + `province` = #{warehouse.province}, + + + `city_id` = #{warehouse.cityId}, + + + `city` = #{warehouse.city}, + + + `area_id` = #{warehouse.areaId}, + + + `area` = #{warehouse.area}, + + update_time = now() + + where warehouse_id = #{warehouse.warehouseId} + + + delete from warehouse where warehouse_id = #{warehouseId} + + + + + + + + + + + + + + + + + diff --git a/tmerclub-search/Dockerfile b/tmerclub-search/Dockerfile new file mode 100644 index 0000000..0b93728 --- /dev/null +++ b/tmerclub-search/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:17.0.2 as builder +WORKDIR application +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} application.jar +RUN java -Djarmode=layertools -jar application.jar extract + +FROM openjdk:17.0.2 +WORKDIR application +COPY --from=builder application/dependencies/ ./ +COPY --from=builder application/spring-boot-loader/ ./ +COPY --from=builder application/snapshot-dependencies/ ./ +COPY --from=builder application/application/ ./ +ENTRYPOINT ["java", "-Xms512m", "-Xmx512m", "org.springframework.boot.loader.JarLauncher"] diff --git a/tmerclub-search/pom.xml b/tmerclub-search/pom.xml new file mode 100644 index 0000000..09f3cca --- /dev/null +++ b/tmerclub-search/pom.xml @@ -0,0 +1,94 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-search + mall4cloud 搜索模块 + jar + + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-cache + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-group + ${project.version} + + + com.xuxueli + xxl-job-core + + + com.moyuer.cloud + tmerclub-api-seckill + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + true + + + + + diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/AllotOrderBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/AllotOrderBO.java new file mode 100644 index 0000000..f280640 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/AllotOrderBO.java @@ -0,0 +1,243 @@ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author gaozijie + * @since 2023-11-24 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_order", table = "allot_order", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class AllotOrderBO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 调拨订单id + */ + private Long allotOrderId; + + /** + * 调出点仓库id + */ + private Long outWarehouseId; + + /** + * 调出点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer outStockPointType; + + /** + * 调入点仓库id + */ + private Long inWarehouseId; + + /** + * 调入点库存点类型 + * @see com.tmerclub.cloud.common.product.constant.StockPointType + */ + private Integer inStockPointType; + + /** + * 物流公司id + */ + private Long dvyCompanyId; + + /** + * 物流方式 + * @see com.tmerclub.cloud.common.order.constant.DeliveryType + */ + private Integer dvyType; + + /** + * 物流单号 + */ + private String dvyOrderNumber; + + /** + * 状态 + */ + private Integer status; + + /** + * 总调拨数量 + */ + private Integer totalAllotCount; + + /** + * 备注 + */ + private String remark; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 系统类型 + * @see com.tmerclub.cloud.common.constant.SysTypeEnum + */ + private Integer sysType; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + public AllotOrderBO() { + } + + public Long getAllotOrderId() { + return allotOrderId; + } + + public void setAllotOrderId(Long allotOrderId) { + this.allotOrderId = allotOrderId; + } + + public Long getOutWarehouseId() { + return outWarehouseId; + } + + public void setOutWarehouseId(Long outWarehouseId) { + this.outWarehouseId = outWarehouseId; + } + + public Integer getOutStockPointType() { + return outStockPointType; + } + + public void setOutStockPointType(Integer outStockPointType) { + this.outStockPointType = outStockPointType; + } + + public Long getInWarehouseId() { + return inWarehouseId; + } + + public void setInWarehouseId(Long inWarehouseId) { + this.inWarehouseId = inWarehouseId; + } + + public Integer getInStockPointType() { + return inStockPointType; + } + + public void setInStockPointType(Integer inStockPointType) { + this.inStockPointType = inStockPointType; + } + + public Long getDvyCompanyId() { + return dvyCompanyId; + } + + public void setDvyCompanyId(Long dvyCompanyId) { + this.dvyCompanyId = dvyCompanyId; + } + + public Integer getDvyType() { + return dvyType; + } + + public void setDvyType(Integer dvyType) { + this.dvyType = dvyType; + } + + public String getDvyOrderNumber() { + return dvyOrderNumber; + } + + public void setDvyOrderNumber(String dvyOrderNumber) { + this.dvyOrderNumber = dvyOrderNumber; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getTotalAllotCount() { + return totalAllotCount; + } + + public void setTotalAllotCount(Integer totalAllotCount) { + this.totalAllotCount = totalAllotCount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSysType() { + return sysType; + } + + public void setSysType(Integer sysType) { + this.sysType = sysType; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public LocalDateTime getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(LocalDateTime updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "AllotOrderBO{" + + "allotOrderId=" + allotOrderId + + ", outWarehouseId=" + outWarehouseId + + ", outStockPointType=" + outStockPointType + + ", inWarehouseId=" + inWarehouseId + + ", inStockPointType=" + inStockPointType + + ", dvyCompanyId=" + dvyCompanyId + + ", dvyType=" + dvyType + + ", dvyOrderNumber='" + dvyOrderNumber + '\'' + + ", status=" + status + + ", totalAllotCount=" + totalAllotCount + + ", remark='" + remark + '\'' + + ", shopId=" + shopId + + ", sysType=" + sysType + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/PurchaseOrderBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/PurchaseOrderBO.java new file mode 100644 index 0000000..6a3bbbd --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/PurchaseOrderBO.java @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 订单信息 + * + * @author YXF + * @date 2021-07-07 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_order", table = "purchase_order", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class PurchaseOrderBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 采购id + */ + private Long purchaseOrderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 订单创建时间 + */ + private Date createTime; + + /** + * 订单更新时间 + */ + private Date updateTime; + + /** + * 送达时间 + */ + private Date deliverTime; + + /** + * 发货时间 + */ + private Date deliveryTime; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 总采购金额 + */ + private Long totalAmount; + + /** + * 总采购库存数量 + */ + private Integer totalStock; + + /** + * 实际总库存数量 + */ + private Integer actualTotalStock; + + /** + * 状态 0:已作废 1:待入库 2:已发货 3.部分入库 5:已完成 + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + + /** + * 操作员工id + */ + private Long employeeId; + + /** + * 配送类型 1:快递 2:自提 3:无需快递 4同城配送 + */ + private Integer deliveryType; + + public Long getPurchaseOrderId() { + return purchaseOrderId; + } + + public void setPurchaseOrderId(Long purchaseOrderId) { + this.purchaseOrderId = purchaseOrderId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + @Override + public Date getCreateTime() { + return createTime; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + public Date getUpdateTime() { + return updateTime; + } + + @Override + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getDeliverTime() { + return deliverTime; + } + + public void setDeliverTime(Date deliverTime) { + this.deliverTime = deliverTime; + } + + public Date getDeliveryTime() { + return deliveryTime; + } + + public void setDeliveryTime(Date deliveryTime) { + this.deliveryTime = deliveryTime; + } + + public Long getSupplierId() { + return supplierId; + } + + public void setSupplierId(Long supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getActualTotalStock() { + return actualTotalStock; + } + + public void setActualTotalStock(Integer actualTotalStock) { + this.actualTotalStock = actualTotalStock; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + public Integer getDeliveryType() { + return deliveryType; + } + + public void setDeliveryType(Integer deliveryType) { + this.deliveryType = deliveryType; + } + + @Override + public String toString() { + return "PurchaseOrderBO{" + + "purchaseOrderId=" + purchaseOrderId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", deliverTime=" + deliverTime + + ", deliveryTime=" + deliveryTime + + ", supplierId=" + supplierId + + ", supplierName='" + supplierName + '\'' + + ", totalAmount=" + totalAmount + + ", totalStock=" + totalStock + + ", actualTotalStock=" + actualTotalStock + + ", status=" + status + + ", remark='" + remark + '\'' + + ", employeeId=" + employeeId + + ", deliveryType=" + deliveryType + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/ShopDetailBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/ShopDetailBO.java new file mode 100644 index 0000000..847f64b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/ShopDetailBO.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 品牌信息 + * + * @author YXF + * @date 2020-12-23 15:27:24 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_admin", table = "shop_detail", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class ShopDetailBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺类型1自营店 2普通店 + */ + private Integer type; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 店铺logo(可修改) + */ + private String shopLogo; + + /** + * 店铺状态(-1:已删除 0: 停业中 1:营业中 2:平台下线 3:开店申请待审核 4:店铺申请中 5:上线申请待审核) + */ + private Integer shopStatus; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getShopLogo() { + return shopLogo; + } + + public void setShopLogo(String shopLogo) { + this.shopLogo = shopLogo; + } + + public Integer getShopStatus() { + return shopStatus; + } + + public void setShopStatus(Integer shopStatus) { + this.shopStatus = shopStatus; + } + + @Override + public String toString() { + return "ShopDetail{" + + "shopId=" + shopId + + ",type=" + type + + ",shopName=" + shopName + + ",shopLogo=" + shopLogo + + ",shopStatus=" + shopStatus + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuStockBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuStockBO.java new file mode 100644 index 0000000..b7dc5b5 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SkuStockBO.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.model.BaseModel; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 库存信息 + * + * @author FrozenWatermelon + * @date 2020-11-11 13:49:06 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "sku_stock", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class SkuStockBO extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 库存id + */ + private Long stockId; + + /** + * SKU ID + */ + private Long skuId; + + /** + * 实际库存 + */ + private Integer actualStock; + + /** + * 锁定库存 + */ + private Integer lockStock; + + /** + * 可售卖库存 + */ + private Integer stock; + + private Long spuId; + + /** + * 是否已经进行分片 + */ + private Integer hasZone; + + /** + * 剩余的分片数量 + */ + private Integer limitZone; + + public Long getStockId() { + return stockId; + } + + public void setStockId(Long stockId) { + this.stockId = stockId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Integer getActualStock() { + return actualStock; + } + + public void setActualStock(Integer actualStock) { + this.actualStock = actualStock; + } + + public Integer getLockStock() { + return lockStock; + } + + public void setLockStock(Integer lockStock) { + this.lockStock = lockStock; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getHasZone() { + return hasZone; + } + + public void setHasZone(Integer hasZone) { + this.hasZone = hasZone; + } + + public Integer getLimitZone() { + return limitZone; + } + + public void setLimitZone(Integer limitZone) { + this.limitZone = limitZone; + } + + @Override + public String toString() { + return "SkuStockBO{" + + "stockId=" + stockId + + ", skuId=" + skuId + + ", actualStock=" + actualStock + + ", lockStock=" + lockStock + + ", stock=" + stock + + ", spuId=" + spuId + + ", hasZone=" + hasZone + + ", limitZone=" + limitZone + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuBO.java new file mode 100644 index 0000000..3127412 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuBO.java @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品信息 + * + * @author YXF + * @date 2020-12-23 15:27:24 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "spu", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class SpuBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * spu id + */ + private Long spuId; + + /** + * 品牌ID + */ + private Long brandId; + + /** + * 分类ID + */ + private Long categoryId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * spu名称 + */ + private String name; + + /** + * 卖点 + */ + private String sellingPoint; + + /** + * 主图 + */ + private String mainImgUrl; + + /** + * 商品图片 多个图片逗号分隔 + */ + private String imgUrls; + + /** + * 商品视频 + */ + private String video; + + /** + * 售价,整数方式保存 + */ + private Long priceFee; + + /** + * 市场价,整数方式保存 + */ + private Long marketPriceFee; + + /** + * 积分价格 + */ + private Long scoreFee; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 配送方式json见TransportModeVO + */ + private String deliveryMode; + + /** + * 运费模板id + */ + private Long deliveryTemplateId; + + private Integer hasSkuImg; + /** + * 商品类型(0普通商品 1拼团 2秒杀 3积分) + */ + private Integer spuType; + + /** + * 活动id(关联prod_type) + */ + private Long activityId; + + /** + * 序号 + */ + private Integer seq; + + /** + * 是否置顶 + */ + private Integer isTop; + + /** + * 供应商商品类型 0.否 1.是 2.商家代销 + */ + private Integer supplierSpuType; + + public Integer getSupplierSpuType() { + return supplierSpuType; + } + + public void setSupplierSpuType(Integer supplierSpuType) { + this.supplierSpuType = supplierSpuType; + } + + public Integer getIsTop() { + return isTop; + } + + public void setIsTop(Integer isTop) { + this.isTop = isTop; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getBrandId() { + return brandId; + } + + public void setBrandId(Long brandId) { + this.brandId = brandId; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSellingPoint() { + return sellingPoint; + } + + public void setSellingPoint(String sellingPoint) { + this.sellingPoint = sellingPoint; + } + + public String getImgUrls() { + return imgUrls; + } + + public void setImgUrls(String imgUrls) { + this.imgUrls = imgUrls; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public Long getScoreFee() { + return scoreFee; + } + + public void setScoreFee(Long scoreFee) { + this.scoreFee = scoreFee; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getDeliveryMode() { + return deliveryMode; + } + + public void setDeliveryMode(String deliveryMode) { + this.deliveryMode = deliveryMode; + } + + public Long getDeliveryTemplateId() { + return deliveryTemplateId; + } + + public void setDeliveryTemplateId(Long deliveryTemplateId) { + this.deliveryTemplateId = deliveryTemplateId; + } + + public Integer getSpuType() { + return spuType; + } + + public void setSpuType(Integer spuType) { + this.spuType = spuType; + } + + public Long getActivityId() { + return activityId; + } + + public void setActivityId(Long activityId) { + this.activityId = activityId; + } + + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public Integer getHasSkuImg() { + return hasSkuImg; + } + + public void setHasSkuImg(Integer hasSkuImg) { + this.hasSkuImg = hasSkuImg; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "SpuBO{" + + "spuId=" + spuId + + ", brandId=" + brandId + + ", categoryId=" + categoryId + + ", shopId=" + shopId + + ", name='" + name + '\'' + + ", sellingPoint='" + sellingPoint + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", imgUrls='" + imgUrls + '\'' + + ", video='" + video + '\'' + + ", priceFee=" + priceFee + + ", marketPriceFee=" + marketPriceFee + + ", scoreFee=" + scoreFee + + ", status=" + status + + ", deliveryMode='" + deliveryMode + '\'' + + ", deliveryTemplateId=" + deliveryTemplateId + + ", hasSkuImg=" + hasSkuImg + + ", spuType=" + spuType + + ", activityId=" + activityId + + ", seq=" + seq + + ", isTop=" + isTop + + ", supplierSpuType=" + supplierSpuType + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuTagBO.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuTagBO.java new file mode 100644 index 0000000..aa005a5 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/bo/SpuTagBO.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.bo; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.FieldNamingPolicy; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商品分组信息 + * + * @author YXF + * @date 2020-12-23 15:27:24 + */ +@CanalModel(database = "mall4cloud" + Constant.UNDERLINE_ENV + "_product", table = "spu_tag_reference", fieldNamingPolicy = FieldNamingPolicy.LOWER_UNDERSCORE) +public class SpuTagBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分组引用id + */ + private Long referenceId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 标签id + */ + private Long tagId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 序号 + */ + private Integer seq; + + /** + * 状态(1:正常,0:删除) + */ + private Integer status; + + public Long getReferenceId() { + return referenceId; + } + + public void setReferenceId(Long referenceId) { + this.referenceId = referenceId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getTagId() { + return tagId; + } + + public void setTagId(Long tagId) { + this.tagId = tagId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "SpuTagBO{" + + "referenceId=" + referenceId + + ", shopId=" + shopId + + ", tagId=" + tagId + + ", spuId=" + spuId + + ", status=" + status + + ", seq=" + seq + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalGlue.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalGlue.java new file mode 100644 index 0000000..21b79d4 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/LuckCanalGlue.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.canal; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; +import com.tmerclub.cloud.search.canal.model.ModelTable; +import com.tmerclub.cloud.search.canal.support.adapter.SourceAdapterFacade; +import com.tmerclub.cloud.search.canal.support.processor.BaseCanalBinlogEventProcessor; +import com.tmerclub.cloud.search.canal.support.processor.CanalBinlogEventProcessorFactory; + +import java.util.List; + +/** + * @author FrozenWatermelon + */ +public class LuckCanalGlue implements CanalGlue { + + private final CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory; + + @Override + public void process(String content) { + CanalBinLogEvent event = SourceAdapterFacade.X.adapt(CanalBinLogEvent.class, content); + ModelTable modelTable = ModelTable.of(event.getDatabase(), event.getTable()); + List> baseCanalBinlogEventProcessors = this.canalBinlogEventProcessorFactory.get(modelTable); + if (CollectionUtil.isEmpty(baseCanalBinlogEventProcessors)) { + return; + } + baseCanalBinlogEventProcessors.forEach((processor) -> processor.process(event)); + } + + + private LuckCanalGlue(CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory) { + this.canalBinlogEventProcessorFactory = canalBinlogEventProcessorFactory; + } + + public static LuckCanalGlue of(CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory) { + return new LuckCanalGlue(canalBinlogEventProcessorFactory); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/NamingPolicy.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/NamingPolicy.java new file mode 100644 index 0000000..78189cb --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/NamingPolicy.java @@ -0,0 +1,17 @@ +package com.tmerclub.cloud.search.canal.common; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 22:08 + */ +public interface NamingPolicy { + + /** + * 转换 + * @param source + * @return + */ + String convert(String source); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/OperationType.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/OperationType.java new file mode 100644 index 0000000..646cab3 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/common/OperationType.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.search.canal.common; + + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:20 + */ +public enum OperationType { + + /** + * DML + */ + DML("dml", "DML语句"), + + /** + * DDL + */ + DDL("ddl", "DDL语句"), + ; + + private final String type; + private final String description; + + OperationType(String type, String description) { + this.type = type; + this.description = description; + } + + public String getType() { + return type; + } + + public String getDescription() { + return description; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/CanalBinLogEvent.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/CanalBinLogEvent.java new file mode 100644 index 0000000..77acd01 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/CanalBinLogEvent.java @@ -0,0 +1,204 @@ +package com.tmerclub.cloud.search.canal.model; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:12 + */ +public class CanalBinLogEvent implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 事件ID,没有实际意义 + */ + private Long id; + + /** + * 当前更变后节点数据 + */ + private List> data; + + /** + * 主键行名称列表 + */ + private List pkNames; + + /** + * 当前更变前节点数据 + */ + private List> old; + + /** + * 类型 UPDATE\INSERT\DELETE\QUERY + */ + private String type; + + /** + * binlog execute time + */ + private Long es; + + /** + * dml build timestamp + */ + private Long ts; + + /** + * 执行的sql,不一定存在 + */ + private String sql; + + /** + * 数据库名称 + */ + private String database; + + /** + * 表名称 + */ + private String table; + + /** + * SQL类型映射 + */ + private Map sqlType; + + /** + * MySQL字段类型映射 + */ + private Map mysqlType; + + /** + * 是否DDL + */ + private Boolean isDdl; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List> getData() { + return data; + } + + public void setData(List> data) { + this.data = data; + } + + public List getPkNames() { + return pkNames; + } + + public void setPkNames(List pkNames) { + this.pkNames = pkNames; + } + + public List> getOld() { + return old; + } + + public void setOld(List> old) { + this.old = old; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Long getEs() { + return es; + } + + public void setEs(Long es) { + this.es = es; + } + + public Long getTs() { + return ts; + } + + public void setTs(Long ts) { + this.ts = ts; + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + public String getDatabase() { + return database; + } + + public void setDatabase(String database) { + this.database = database; + } + + public String getTable() { + return table; + } + + public void setTable(String table) { + this.table = table; + } + + public Map getSqlType() { + return sqlType; + } + + public void setSqlType(Map sqlType) { + this.sqlType = sqlType; + } + + public Map getMysqlType() { + return mysqlType; + } + + public void setMysqlType(Map mysqlType) { + this.mysqlType = mysqlType; + } + + public Boolean getIsDdl() { + return isDdl; + } + + public void setDdl(Boolean ddl) { + isDdl = ddl; + } + + @Override + public String toString() { + return "CanalBinLogEvent{" + + "id=" + id + + ", data=" + data + + ", pkNames=" + pkNames + + ", old=" + old + + ", type='" + type + '\'' + + ", es=" + es + + ", ts=" + ts + + ", sql='" + sql + '\'' + + ", database='" + database + '\'' + + ", table='" + table + '\'' + + ", sqlType=" + sqlType + + ", mysqlType=" + mysqlType + + ", isDdl=" + isDdl + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/CanalBinLogResult.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/CanalBinLogResult.java new file mode 100644 index 0000000..9eab673 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/model/CanalBinLogResult.java @@ -0,0 +1,136 @@ +package com.tmerclub.cloud.search.canal.model; + +import com.tmerclub.cloud.search.canal.common.BinLogEventType; +import com.tmerclub.cloud.search.canal.common.OperationType; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:17 + */ +public class CanalBinLogResult implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 提取的长整型主键 + */ + private Long primaryKey; + + + /** + * binlog事件类型 + */ + private BinLogEventType binLogEventType; + + /** + * 更变前的数据 + */ + private T beforeData; + + /** + * 更变后的数据 + */ + private T afterData; + + /** + * 数据库名称 + */ + private String databaseName; + + /** + * 表名称 + */ + private String tableName; + + /** + * sql语句 - 一般是DDL的时候有用 + */ + private String sql; + + /** + * mysql操作类型 + */ + private OperationType operationType; + + public Long getPrimaryKey() { + return primaryKey; + } + + public void setPrimaryKey(Long primaryKey) { + this.primaryKey = primaryKey; + } + + public BinLogEventType getBinLogEventType() { + return binLogEventType; + } + + public void setBinLogEventType(BinLogEventType binLogEventType) { + this.binLogEventType = binLogEventType; + } + + public T getBeforeData() { + return beforeData; + } + + public void setBeforeData(T beforeData) { + this.beforeData = beforeData; + } + + public T getAfterData() { + return afterData; + } + + public void setAfterData(T afterData) { + this.afterData = afterData; + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + public OperationType getOperationType() { + return operationType; + } + + public void setOperationType(OperationType operationType) { + this.operationType = operationType; + } + + @Override + public String toString() { + return "CanalBinLogResult{" + + "primaryKey=" + primaryKey + + ", binLogEventType=" + binLogEventType + + ", beforeData=" + beforeData + + ", afterData=" + afterData + + ", databaseName='" + databaseName + '\'' + + ", tableName='" + tableName + '\'' + + ", sql='" + sql + '\'' + + ", operationType=" + operationType + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/RawStringSourceAdapter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/RawStringSourceAdapter.java new file mode 100644 index 0000000..95edad4 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/RawStringSourceAdapter.java @@ -0,0 +1,22 @@ +package com.tmerclub.cloud.search.canal.support.adapter; + + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:31 + */ +class RawStringSourceAdapter implements SourceAdapter { + public RawStringSourceAdapter() { + } + + public static RawStringSourceAdapter of() { + return new RawStringSourceAdapter(); + } + + @Override + public String adapt(String source) { + return source; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/SourceAdapter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/SourceAdapter.java new file mode 100644 index 0000000..64ed5f4 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/SourceAdapter.java @@ -0,0 +1,17 @@ +package com.tmerclub.cloud.search.canal.support.adapter; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:26 + */ +public interface SourceAdapter { + + /** + * adapt + * @param source + * @return + */ + SINK adapt(SOURCE source); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/SourceAdapterFacade.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/SourceAdapterFacade.java new file mode 100644 index 0000000..a48c7d3 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/adapter/SourceAdapterFacade.java @@ -0,0 +1,26 @@ +package com.tmerclub.cloud.search.canal.support.adapter; + + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:27 + */ +public enum SourceAdapterFacade { + + /** + * 单例 + */ + X; + + private static final SourceAdapter I_S_A = RawStringSourceAdapter.of(); + + @SuppressWarnings("unchecked") + public T adapt(Class klass, String source) { + if (klass.isAssignableFrom(String.class)) { + return (T) I_S_A.adapt(source); + } + return (T) FastJsonSourceAdapter.of(klass).adapt(source); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BaseCommonEntryFunction.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BaseCommonEntryFunction.java new file mode 100644 index 0000000..5525c9f --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BaseCommonEntryFunction.java @@ -0,0 +1,18 @@ +package com.tmerclub.cloud.search.canal.support.parser; + +import java.util.Map; +import java.util.function.Function; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:51 + */ +public abstract class BaseCommonEntryFunction implements Function, T> { + + @Override + public T apply(Map entry) { + throw new UnsupportedOperationException(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BaseParseResultInterceptor.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BaseParseResultInterceptor.java new file mode 100644 index 0000000..ce44a13 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/BaseParseResultInterceptor.java @@ -0,0 +1,58 @@ +package com.tmerclub.cloud.search.canal.support.parser; + + +import com.tmerclub.cloud.search.canal.model.ModelTable; +import com.tmerclub.cloud.search.canal.support.BaseParameterizedTypeReferenceSupport; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/26 18:07 + */ +public abstract class BaseParseResultInterceptor extends BaseParameterizedTypeReferenceSupport { + + public void onParse(ModelTable modelTable) { + + } + + public void onBeforeInsertProcess(ModelTable modelTable, T beforeData, T afterData) { + + } + + public void onAfterInsertProcess(ModelTable modelTable, T beforeData, T afterData) { + + } + + public void onBeforeUpdateProcess(ModelTable modelTable, T beforeData, T afterData) { + + } + + public void onAfterUpdateProcess(ModelTable modelTable, T beforeData, T afterData) { + + } + + public void onBeforeDeleteProcess(ModelTable modelTable, T beforeData, T afterData) { + + } + + public void onAfterDeleteProcess(ModelTable modelTable, T beforeData, T afterData) { + + } + + public void onBeforeDdlProcess(ModelTable modelTable, T beforeData, T afterData, String sql) { + + } + + public void onAfterDdlProcess(ModelTable modelTable, T beforeData, T afterData, String sql) { + + } + + public void onParseFinish(ModelTable modelTable) { + + } + + public void onParseCompletion(ModelTable modelTable) { + + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/CanalBinLogEventParser.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/CanalBinLogEventParser.java new file mode 100644 index 0000000..46ac04c --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/CanalBinLogEventParser.java @@ -0,0 +1,30 @@ +package com.tmerclub.cloud.search.canal.support.parser; + + +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; + +import java.util.List; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:29 + */ +public interface CanalBinLogEventParser { + + /** + * 解析binlog事件 + * + * @param event 事件 + * @param klass 目标类型 + * @param primaryKeyFunction 主键映射方法 + * @param commonEntryFunction 其他属性映射方法 + * @return CanalBinLogResult + */ + List> parse(CanalBinLogEvent event, + Class klass, + BasePrimaryKeyTupleFunction primaryKeyFunction, + BaseCommonEntryFunction commonEntryFunction); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/InMemoryModelTableMetadataManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/InMemoryModelTableMetadataManager.java new file mode 100644 index 0000000..0dea2a3 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/InMemoryModelTableMetadataManager.java @@ -0,0 +1,84 @@ +package com.tmerclub.cloud.search.canal.support.parser; + +import com.tmerclub.cloud.search.canal.annotation.CanalField; +import com.tmerclub.cloud.search.canal.annotation.CanalModel; +import com.tmerclub.cloud.search.canal.common.NamingPolicy; +import com.tmerclub.cloud.search.canal.model.ModelTable; +import com.tmerclub.cloud.search.canal.support.parser.converter.BaseCanalFieldConverter; +import com.tmerclub.cloud.search.canal.support.parser.converter.CanalFieldConvertInput; +import com.tmerclub.cloud.search.canal.support.parser.converter.CanalFieldConvertResult; +import com.tmerclub.cloud.search.canal.support.parser.converter.CanalFieldConverterFactory; +import com.tmerclub.cloud.search.canal.util.AssertUtils; +import com.tmerclub.cloud.search.canal.util.ReflectionUtils; +import com.tmerclub.cloud.search.canal.util.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.sql.JDBCType; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 0:56 + */ +public class InMemoryModelTableMetadataManager implements ModelTableMetadataManager { + + private final ConcurrentMap, ModelTableMetadata> cache = new ConcurrentHashMap<>(16); + + @Autowired + private CanalFieldConverterFactory canalFieldConverterFactory; + + public InMemoryModelTableMetadataManager(CanalFieldConverterFactory canalFieldConverterFactory) { + this.canalFieldConverterFactory = canalFieldConverterFactory; + } + + public static InMemoryModelTableMetadataManager of(CanalFieldConverterFactory canalFieldConverterFactory) { + return new InMemoryModelTableMetadataManager(canalFieldConverterFactory); + } + + @Override + public ModelTableMetadata load(Class klass) { + return cache.computeIfAbsent(klass, clazz -> { + AssertUtils.X.isTrue(klass.isAnnotationPresent(CanalModel.class), String.format("[%s]没有使用@CanalModel注解", klass.getName())); + CanalModel canalModel = klass.getAnnotation(CanalModel.class); + NamingPolicy namingPolicy = canalModel.fieldNamingPolicy(); + ModelTableMetadata metadata = new ModelTableMetadata(); + metadata.setModelTable(ModelTable.of(canalModel.database(), canalModel.table())); + Map fieldColumnMapping = new HashMap<>(8); + ReflectionUtils.X.doWithFields(klass, field -> { + CanalField canalField; + JDBCType sqlType = null; + Class> converterKlass = null; + String columnName = null; + if (field.isAnnotationPresent(CanalField.class)) { + canalField = field.getAnnotation(CanalField.class); + sqlType = canalField.sqlType(); + converterKlass = canalField.converterKlass(); + if (StringUtils.X.isNotEmpty(canalField.columnName())) { + columnName = canalField.columnName(); + } + } + String fieldName = field.getName(); + if (null == columnName) { + columnName = namingPolicy.convert(fieldName); + } + CanalFieldConvertInput input = CanalFieldConvertInput.builder() + .fieldKlass(field.getType()) + .sqlType(sqlType) + .converterKlass(converterKlass) + .build(); + CanalFieldConvertResult result = canalFieldConverterFactory.load(input); + ColumnMetadata columnMetadata = new ColumnMetadata(); + columnMetadata.setColumnName(columnName); + columnMetadata.setConverter(result.getConverter()); + fieldColumnMapping.put(fieldName, columnMetadata); + }); + metadata.setFieldColumnMapping(fieldColumnMapping); + return metadata; + }); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/InMemoryParseResultInterceptorManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/InMemoryParseResultInterceptorManager.java new file mode 100644 index 0000000..bb57124 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/InMemoryParseResultInterceptorManager.java @@ -0,0 +1,51 @@ +package com.tmerclub.cloud.search.canal.support.parser; + + +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/26 22:39 + */ +public class InMemoryParseResultInterceptorManager implements ParseResultInterceptorManager { + + private final ConcurrentMap, List>> cache = new ConcurrentHashMap<>(16); + + @Autowired + private ModelTableMetadataManager modelTableMetadataManager; + + public InMemoryParseResultInterceptorManager(ModelTableMetadataManager modelTableMetadataManager) { + this.modelTableMetadataManager = modelTableMetadataManager; + } + + public static InMemoryParseResultInterceptorManager of(ModelTableMetadataManager modelTableMetadataManager) { + return new InMemoryParseResultInterceptorManager(modelTableMetadataManager); + } + + @Override + public void registerParseResultInterceptor(BaseParseResultInterceptor parseResultInterceptor) { + synchronized (cache) { + Class klass = parseResultInterceptor.getKlass(); + ModelTableMetadata modelTableMetadata = modelTableMetadataManager.load(klass); + Optional.ofNullable(modelTableMetadata).ifPresent(ignore -> { + cache.putIfAbsent(parseResultInterceptor.getKlass(), new LinkedList<>()); + cache.get(klass).add(parseResultInterceptor); + }); + } + } + + @SuppressWarnings("unchecked") + @Override + public List> getParseResultInterceptors(Class klass) { + return (List>) (List) cache.getOrDefault(klass, Collections.emptyList()); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ModelTableMetadata.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ModelTableMetadata.java new file mode 100644 index 0000000..2e4755d --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ModelTableMetadata.java @@ -0,0 +1,45 @@ +package com.tmerclub.cloud.search.canal.support.parser; + +import com.tmerclub.cloud.search.canal.model.ModelTable; + +import java.util.Map; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 0:53 + */ +public class ModelTableMetadata { + + private ModelTable modelTable; + + /** + * fieldName -> ColumnMetadata + */ + private Map fieldColumnMapping; + + public ModelTable getModelTable() { + return modelTable; + } + + public void setModelTable(ModelTable modelTable) { + this.modelTable = modelTable; + } + + public Map getFieldColumnMapping() { + return fieldColumnMapping; + } + + public void setFieldColumnMapping(Map fieldColumnMapping) { + this.fieldColumnMapping = fieldColumnMapping; + } + + @Override + public String toString() { + return "ModelTableMetadata{" + + "modelTable=" + modelTable + + ", fieldColumnMapping=" + fieldColumnMapping + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ParseResultInterceptorManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ParseResultInterceptorManager.java new file mode 100644 index 0000000..5491702 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ParseResultInterceptorManager.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.search.canal.support.parser; + + +import java.util.List; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/26 22:35 + */ +public interface ParseResultInterceptorManager { + + /** + * register + * @param parseResultInterceptor + * @param + */ + void registerParseResultInterceptor(BaseParseResultInterceptor parseResultInterceptor); + + /** + * get + * @param klass + * @return + * @param + */ + List> getParseResultInterceptors(Class klass); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ReflectionBinLogEntryFunction.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ReflectionBinLogEntryFunction.java new file mode 100644 index 0000000..57921ea --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/ReflectionBinLogEntryFunction.java @@ -0,0 +1,76 @@ +package com.tmerclub.cloud.search.canal.support.parser; + +import com.tmerclub.cloud.search.canal.util.AssertUtils; +import com.tmerclub.cloud.search.canal.util.ClassUtils; +import com.tmerclub.cloud.search.canal.util.ReflectionUtils; + +import java.lang.reflect.Constructor; +import java.util.Map; +import java.util.Objects; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:38 + */ +@SuppressWarnings("rawtypes") +public class ReflectionBinLogEntryFunction extends BaseCommonEntryFunction { + + private final Class klass; + private final ModelTableMetadata modelTableMetadata; + + private ReflectionBinLogEntryFunction(Class klass, ModelTableMetadata modelTableMetadata) { + this.klass = klass; + this.modelTableMetadata = modelTableMetadata; + } + + @SuppressWarnings("unchecked") + public static ReflectionBinLogEntryFunction of(Class klass, ModelTableMetadata modelTableMetadata) { + return new ReflectionBinLogEntryFunction<>(klass, modelTableMetadata); + } + + @Override + public T apply(Map data) { + Constructor constructor = ClassUtils.X.getConstructorIfAvailable(klass); + if (Objects.nonNull(constructor)) { + try { + T instance = constructor.newInstance(); + Map fieldColumnMapping = modelTableMetadata.getFieldColumnMapping(); + ReflectionUtils.X.doWithFields(klass, field -> { + String fieldName = field.getName(); + ColumnMetadata columnMetadata = fieldColumnMapping.get(fieldName); + // 理论上这里不会为NULL,谨慎起见避免低端NPE做个断言 + AssertUtils.X.notNull(columnMetadata, String.format("[%s.%s]属性获取列属性元数据失败", klass.getSimpleName(), fieldName)); + String value = data.get(columnMetadata.getColumnName()); + if (null != value) { + Object convertValue = columnMetadata.getConverter().convert(value); + // 抑制修饰符和值设置 + ReflectionUtils.X.makeAccessible(field); + field.set(instance, convertValue); + } + }); + return instance; + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + } + throw new IllegalArgumentException(String.format("基于类型[%s]实例化和反射赋值失败,请确定是否提供了默认的构造函数", klass.getName())); + } + + public Class getKlass() { + return klass; + } + + public ModelTableMetadata getModelTableMetadata() { + return modelTableMetadata; + } + + @Override + public String toString() { + return "ReflectionBinLogEntryFunction{" + + "klass=" + klass + + ", modelTableMetadata=" + modelTableMetadata + + '}'; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/TupleFunction.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/TupleFunction.java new file mode 100644 index 0000000..a5b961a --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/TupleFunction.java @@ -0,0 +1,20 @@ +package com.tmerclub.cloud.search.canal.support.parser; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:32 + */ +@FunctionalInterface +public interface TupleFunction { + + /** + * apply + * @param before + * @param after + * @param key + * @return + */ + R apply(BEFORE before, AFTER after, KEY key); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BinLogFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BinLogFieldConverter.java new file mode 100644 index 0000000..273fd69 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/BinLogFieldConverter.java @@ -0,0 +1,17 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 18:00 + */ +public interface BinLogFieldConverter { + + /** + * 转换 + * @param source + * @return + */ + TARGET convert(SOURCE source); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConvertResult.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConvertResult.java new file mode 100644 index 0000000..b0db0c9 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConvertResult.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import groovy.transform.builder.Builder; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:55 + */ +@Builder +public class CanalFieldConvertResult { + + private final BaseCanalFieldConverter converter; + + public BaseCanalFieldConverter getConverter() { + return converter; + } + + + public CanalFieldConvertResult(BaseCanalFieldConverter converter) { + this.converter = converter; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConverterFactory.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConverterFactory.java new file mode 100644 index 0000000..cab0028 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/CanalFieldConverterFactory.java @@ -0,0 +1,33 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:54 + */ +public interface CanalFieldConverterFactory { + + /** + * 注册 + * @param converter + */ + default void registerConverter(BaseCanalFieldConverter converter) { + registerConverter(converter, true); + } + + /** + * 注册 + * @param converter + * @param replace + */ + void registerConverter(BaseCanalFieldConverter converter, boolean replace); + + /** + * 加载 + * @param input + * @return + */ + CanalFieldConvertResult load(CanalFieldConvertInput input); +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/DecimalCanalFieldConverter.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/DecimalCanalFieldConverter.java new file mode 100644 index 0000000..a3cfb25 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/DecimalCanalFieldConverter.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.math.BigDecimal; +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:25 + */ +public class DecimalCanalFieldConverter extends BaseCanalFieldConverter { + + /** + * 单例 + */ + public static final BaseCanalFieldConverter X = new DecimalCanalFieldConverter(); + + private DecimalCanalFieldConverter() { + super(JDBCType.DECIMAL, BigDecimal.class); + } + + @Override + protected BigDecimal convertInternal(String source) { + return new BigDecimal(source); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/InMemoryCanalFieldConverterFactory.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/InMemoryCanalFieldConverterFactory.java new file mode 100644 index 0000000..c3ca2ca --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/InMemoryCanalFieldConverterFactory.java @@ -0,0 +1,79 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import com.alibaba.fastjson2.JSON; + +import java.sql.SQLType; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 1:00 + */ +@SuppressWarnings("rawtypes") +public class InMemoryCanalFieldConverterFactory implements CanalFieldConverterFactory { + + private final Set converters = new HashSet<>(16); + + private final ConcurrentMap, BaseCanalFieldConverter> typeKlassConverters = new ConcurrentHashMap<>(16); + + private final ConcurrentMap sqlTypeConverters = new ConcurrentHashMap<>(16); + + private final ConcurrentMap, BaseCanalFieldConverter> klassConverters = new ConcurrentHashMap<>(16); + + public static CanalFieldConverterFactory of() { + return new InMemoryCanalFieldConverterFactory(); + } + + private InMemoryCanalFieldConverterFactory() { + loadInternalConverters(); + } + + private void loadInternalConverters() { + converters.add(NullCanalFieldConverter.X); + converters.add(BigIntCanalFieldConverter.X); + converters.add(VarcharCanalFieldConverter.X); + converters.add(IntCanalFieldConverter.X); + converters.add(DecimalCanalFieldConverter.X); + converters.add(TinyIntCanalFieldConverter.X); + converters.add(TimestampCanalFieldConverter0.X); + converters.add(SqlDateCanalFieldConverter0.X); + converters.add(TimestampCanalFieldConverter1.X); + converters.add(SqlDateCanalFieldConverter1.X); + converters.add(TimestampCanalFieldConverter2.X); + converters.forEach(converter -> registerConverter(converter, true)); + } + + @Override + public void registerConverter(BaseCanalFieldConverter converter, boolean replace) { + if (replace) { + typeKlassConverters.put(converter.typeKlass(), converter); + sqlTypeConverters.put(converter.sqlType(), converter); + klassConverters.put(converter.getClass(), converter); + } else { + typeKlassConverters.putIfAbsent(converter.typeKlass(), converter); + sqlTypeConverters.putIfAbsent(converter.sqlType(), converter); + klassConverters.putIfAbsent(converter.getClass(), converter); + } + } + + @Override + public CanalFieldConvertResult load(CanalFieldConvertInput input) { + BaseCanalFieldConverter converter; + if (null != input.getSqlType() && null != (converter = sqlTypeConverters.get(input.getSqlType()))) { + return new CanalFieldConvertResult(converter); + } + if (null != input.getConverterKlass() && null != (converter = klassConverters.get(input.getConverterKlass()))) { + return new CanalFieldConvertResult(converter); + } + if (null != input.getFieldKlass() && null != (converter = typeKlassConverters.get(input.getFieldKlass()))) { + return new CanalFieldConvertResult(converter); + } + throw new IllegalArgumentException(String.format("加载Canal类型转换器失败,输入参数:%s", JSON.toJSONString(input))); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/SqlDateCanalFieldConverter0.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/SqlDateCanalFieldConverter0.java new file mode 100644 index 0000000..f2ddb30 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/SqlDateCanalFieldConverter0.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:34 + */ +public class SqlDateCanalFieldConverter0 extends BaseCanalFieldConverter { + + private static final DateTimeFormatter F = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + public static final BaseCanalFieldConverter X = new SqlDateCanalFieldConverter0(); + + public SqlDateCanalFieldConverter0() { + super(JDBCType.DATE, LocalDate.class); + } + + @Override + protected LocalDate convertInternal(String source) { + return LocalDate.parse(source, F); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/SqlDateCanalFieldConverter1.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/SqlDateCanalFieldConverter1.java new file mode 100644 index 0000000..1f24d7b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/SqlDateCanalFieldConverter1.java @@ -0,0 +1,25 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.Date; +import java.sql.JDBCType; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:34 + */ +public class SqlDateCanalFieldConverter1 extends BaseCanalFieldConverter { + + public static final BaseCanalFieldConverter X = new SqlDateCanalFieldConverter1(); + + private SqlDateCanalFieldConverter1() { + super(JDBCType.DATE, Date.class); + } + + @Override + protected Date convertInternal(String source) { + return Date.valueOf(SqlDateCanalFieldConverter0.X.convert(source)); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter1.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter1.java new file mode 100644 index 0000000..4b42d07 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter1.java @@ -0,0 +1,32 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:41 + */ +public class TimestampCanalFieldConverter1 extends BaseCanalFieldConverter { + + public static final BaseCanalFieldConverter X = new TimestampCanalFieldConverter1(); + + private TimestampCanalFieldConverter1() { + super(JDBCType.TIMESTAMP, Date.class); + } + + @Override + protected Date convertInternal(String source) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return format.parse(source); + } catch (ParseException e) { + throw new IllegalArgumentException(String.format("转换日期时间类型java.util.Date失败,原始字符串:%s", source), e); + } + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter2.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter2.java new file mode 100644 index 0000000..7d400c3 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/parser/converter/TimestampCanalFieldConverter2.java @@ -0,0 +1,33 @@ +package com.tmerclub.cloud.search.canal.support.parser.converter; + + +import java.sql.JDBCType; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/22 0:41 + */ +public class TimestampCanalFieldConverter2 extends BaseCanalFieldConverter { + + public static final BaseCanalFieldConverter X = new TimestampCanalFieldConverter2(); + + /** + * 东八区 + */ + private static final ZoneOffset ZONE_OFFSET = ZoneOffset.of("+08:00"); + + private TimestampCanalFieldConverter2() { + super(JDBCType.TIMESTAMP, OffsetDateTime.class); + } + + @Override + protected OffsetDateTime convertInternal(String source) { + LocalDateTime localDateTime = TimestampCanalFieldConverter0.X.convert(source); + return OffsetDateTime.of(localDateTime, ZONE_OFFSET); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/BaseCanalBinlogEventProcessor.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/BaseCanalBinlogEventProcessor.java new file mode 100644 index 0000000..25b07b1 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/BaseCanalBinlogEventProcessor.java @@ -0,0 +1,217 @@ +package com.tmerclub.cloud.search.canal.support.processor; + +import com.tmerclub.cloud.search.canal.common.BinLogEventType; +import com.tmerclub.cloud.search.canal.common.OperationType; +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.canal.model.ModelTable; +import com.tmerclub.cloud.search.canal.support.BaseParameterizedTypeReferenceSupport; +import com.tmerclub.cloud.search.canal.support.parser.*; +import com.tmerclub.cloud.search.canal.util.AssertUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:54 + */ +public abstract class BaseCanalBinlogEventProcessor extends BaseParameterizedTypeReferenceSupport { + + private BasePrimaryKeyTupleFunction primaryKeyFunction; + + private BaseCommonEntryFunction commonEntryFunction; + + private ExceptionHandler exceptionHandler; + + private List> parseResultInterceptors; + + private CanalBinLogEventParser canalBinLogEventParser; + + protected final Logger logger = LoggerFactory.getLogger(getChildKlass()); + + private final AtomicBoolean init = new AtomicBoolean(false); + + protected BaseCanalBinlogEventProcessor() { + } + + @SuppressWarnings("unchecked") + public void init(CanalBinLogEventParser canalBinLogEventParser, + ModelTableMetadataManager modelTableMetadataManager, + CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory, + ParseResultInterceptorManager parseResultInterceptorManager) { + AssertUtils.X.notNull(canalBinLogEventParser, "CanalBinLogEventParser"); + AssertUtils.X.notNull(modelTableMetadataManager, "ModelTableMetadataManager"); + AssertUtils.X.notNull(canalBinlogEventProcessorFactory, "CanalBinlogEventProcessorFactory"); + AssertUtils.X.notNull(parseResultInterceptorManager, "ParseResultInterceptorManager"); + // 确定只需要初始化一次 + if (init.compareAndSet(false, true)) { + this.canalBinLogEventParser = canalBinLogEventParser; + Class modelKlass = getKlass(); + ModelTableMetadata modelTableMetadata = modelTableMetadataManager.load(modelKlass); + ModelTable modelTable = modelTableMetadata.getModelTable(); + this.primaryKeyFunction = Optional.ofNullable(primaryKeyFunction()).orElse(BigIntPrimaryKeyTupleFunction.X); + this.commonEntryFunction = Optional.ofNullable(commonEntryFunction()) + .orElse(ReflectionBinLogEntryFunction.of(modelKlass, modelTableMetadata)); + this.exceptionHandler = Optional.ofNullable(exceptionHandler()).orElse(ExceptionHandler.NO_OP); + this.parseResultInterceptors = Optional.ofNullable(parseResultInterceptors()) + .orElse(parseResultInterceptorManager.getParseResultInterceptors(modelKlass)); + // 自注册 + canalBinlogEventProcessorFactory.register(modelTable, this); + logger.info("初始化binlog处理器成功,数据库:{},表:{} -> {}", modelTable.database(), modelTable.table(), + getChildKlass().getName()); + } + } + + public void process(CanalBinLogEvent event) { + AssertUtils.X.isTrue(init.get(), String.format("Processor %s Not Init!", getChildKlass().getSimpleName())); + ModelTable modelTable = ModelTable.of(event.getDatabase(), event.getTable()); + try { + onParse(modelTable); + List> resultList + = canalBinLogEventParser.parse(event, getKlass(), primaryKeyFunction, commonEntryFunction); + Optional.ofNullable(resultList).ifPresent(list -> list.forEach(result -> { + // insert事件 + if (BinLogEventType.INSERT == result.getBinLogEventType() && OperationType.DML == result.getOperationType()) { + onBeforeInsertProcess(modelTable, result.getBeforeData(), result.getAfterData()); + processInsertInternal(result); + onAfterInsertProcess(modelTable, result.getBeforeData(), result.getAfterData()); + } + // update事件 + if (BinLogEventType.UPDATE == result.getBinLogEventType() && OperationType.DML == result.getOperationType()) { + onBeforeUpdateProcess(modelTable, result.getBeforeData(), result.getAfterData()); + processUpdateInternal(result); + onAfterUpdateProcess(modelTable, result.getBeforeData(), result.getAfterData()); + } + // delete事件 + if (BinLogEventType.DELETE == result.getBinLogEventType() && OperationType.DML == result.getOperationType()) { + onBeforeDeleteProcess(modelTable, result.getBeforeData(), result.getAfterData()); + processDeleteInternal(result); + onAfterDeleteProcess(modelTable, result.getBeforeData(), result.getAfterData()); + } + // DDL事件 + if (OperationType.DDL == result.getOperationType()) { + onBeforeDdlProcess(modelTable, result.getBeforeData(), result.getAfterData(), result.getSql()); + processDdlInternal(result); + onAfterDdlProcess(modelTable, result.getBeforeData(), result.getAfterData(), result.getSql()); + } + })); + onParseFinish(modelTable); + } catch (Exception e) { + exceptionHandler.onError(event, e); + } finally { + onParseCompletion(modelTable); + } + } + + private void onParse(ModelTable modelTable) { + Optional.ofNullable(parseResultInterceptors).ifPresent(items -> items.forEach(item -> item.onParse(modelTable))); + } + + private void onParseFinish(ModelTable modelTable) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onParseFinish(modelTable))); + } + + private void onBeforeInsertProcess(ModelTable modelTable, T before, T after) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onBeforeInsertProcess(modelTable, before, after))); + } + + private void onAfterInsertProcess(ModelTable modelTable, T before, T after) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onAfterInsertProcess(modelTable, before, after))); + } + + private void onBeforeUpdateProcess(ModelTable modelTable, T before, T after) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onBeforeUpdateProcess(modelTable, before, after))); + } + + private void onAfterUpdateProcess(ModelTable modelTable, T before, T after) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onAfterUpdateProcess(modelTable, before, after))); + } + + private void onBeforeDeleteProcess(ModelTable modelTable, T before, T after) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onBeforeDeleteProcess(modelTable, before, after))); + } + + private void onAfterDeleteProcess(ModelTable modelTable, T before, T after) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onAfterDeleteProcess(modelTable, before, after))); + } + + private void onBeforeDdlProcess(ModelTable modelTable, T before, T after, String sql) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onBeforeDdlProcess(modelTable, before, after, sql))); + } + + private void onAfterDdlProcess(ModelTable modelTable, T before, T after, String sql) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onAfterDdlProcess(modelTable, before, after, sql))); + } + + private void onParseCompletion(ModelTable modelTable) { + Optional.ofNullable(parseResultInterceptors) + .ifPresent(items -> items.forEach(item -> item.onParseCompletion(modelTable))); + } + + @SuppressWarnings("SameReturnValue") + protected BasePrimaryKeyTupleFunction primaryKeyFunction() { + return null; + } + + @SuppressWarnings("SameReturnValue") + protected BaseCommonEntryFunction commonEntryFunction() { + return null; + } + + protected ExceptionHandler exceptionHandler() { + return null; + } + + @SuppressWarnings("SameReturnValue") + protected List> parseResultInterceptors() { + return null; + } + + /** + * 内部处理insert事件 + * + * @param result binlog实体 + */ + protected void processInsertInternal(CanalBinLogResult result) { + } + + /** + * 内部处理update事件 + * + * @param result binlog实体 + */ + protected void processUpdateInternal(CanalBinLogResult result) { + } + + + /** + * 内部处理delete事件 + * + * @param result binlog实体 + */ + protected void processDeleteInternal(CanalBinLogResult result) { + } + + /** + * 内部处理DDL事件 + * + * @param result binlog实体 + */ + protected void processDdlInternal(CanalBinLogResult result) { + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/ExceptionHandler.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/ExceptionHandler.java new file mode 100644 index 0000000..d476ed2 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/ExceptionHandler.java @@ -0,0 +1,24 @@ +package com.tmerclub.cloud.search.canal.support.processor; + + +import com.tmerclub.cloud.search.canal.model.CanalBinLogEvent; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/23 23:13 + */ +@FunctionalInterface +public interface ExceptionHandler { + + /** + * 错误信息 + * @param event + * @param throwable + */ + void onError(CanalBinLogEvent event, Throwable throwable); + + ExceptionHandler NO_OP = (event, throwable) -> { + }; +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/InMemoryCanalBinlogEventProcessorFactory.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/InMemoryCanalBinlogEventProcessorFactory.java new file mode 100644 index 0000000..be6179a --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/support/processor/InMemoryCanalBinlogEventProcessorFactory.java @@ -0,0 +1,38 @@ +package com.tmerclub.cloud.search.canal.support.processor; + +import com.tmerclub.cloud.search.canal.model.ModelTable; +import com.tmerclub.cloud.search.canal.util.AssertUtils; +import com.tmerclub.cloud.search.canal.util.CollectionUtils; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/24 1:00 + */ +public class InMemoryCanalBinlogEventProcessorFactory implements CanalBinlogEventProcessorFactory { + private void of() { + } + + private final ConcurrentMap>> cache = new ConcurrentHashMap<>(16); + + @Override + public void register(ModelTable modelTable, BaseCanalBinlogEventProcessor processor) { + synchronized (cache) { + cache.putIfAbsent(modelTable, new LinkedList<>()); + cache.get(modelTable).add(processor); + } + } + + @Override + public List> get(ModelTable modelTable) { + List> processors = cache.get(modelTable); + AssertUtils.X.isTrue(CollectionUtils.X.isNotEmpty(processors), String.format("Processor Not Found For %s", modelTable)); + return processors; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/AssertUtils.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/AssertUtils.java new file mode 100644 index 0000000..e8df825 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/AssertUtils.java @@ -0,0 +1,37 @@ +package com.tmerclub.cloud.search.canal.util; + + +import java.util.Objects; + +/** + * @author throwable + * @version v1 + * @description 断言工具 + * @since 2020/9/28 0:43 + */ +public enum AssertUtils { + + /** + * 单例 + */ + X; + + public void notNull(Object object, String message) { + if (Objects.isNull(object)) { + throw new IllegalArgumentException(message); + } + } + + public void isInstanceOf(Class type, Object obj, String message) { + notNull(type, "Type to check against must not be null"); + if (!type.isInstance(obj)) { + throw new IllegalArgumentException(message); + } + } + + public void isTrue(boolean expression, String message) { + if (!expression) { + throw new IllegalArgumentException(message); + } + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/ClassUtils.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/ClassUtils.java new file mode 100644 index 0000000..fb6da2d --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/ClassUtils.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.search.canal.util; + + +import java.lang.reflect.Constructor; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/28 23:04 + */ +public enum ClassUtils { + + /** + * 单例 + */ + X; + + public Constructor getConstructorIfAvailable(Class clazz, Class... paramTypes) { + AssertUtils.X.notNull(clazz, "Class must not be null"); + try { + return clazz.getConstructor(paramTypes); + } catch (NoSuchMethodException var3) { + return null; + } + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/StringUtils.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/StringUtils.java new file mode 100644 index 0000000..85c18ab --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/canal/util/StringUtils.java @@ -0,0 +1,39 @@ +package com.tmerclub.cloud.search.canal.util; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/28 22:32 + */ +public enum StringUtils { + + /** + * 单例 + */ + X; + + public boolean isBlank(CharSequence content) { + int len; + if (content != null && (len = content.length()) != 0) { + for (int i = 0; i < len; ++i) { + if (!Character.isWhitespace(content.charAt(i))) { + return false; + } + } + } + return true; + } + + public boolean isNotBlank(CharSequence content) { + return !isBlank(content); + } + + public boolean isEmpty(CharSequence content) { + return null == content || 0 == content.length(); + } + + public boolean isNotEmpty(CharSequence content) { + return !isEmpty(content); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/CanalGlueAutoConfiguration.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/CanalGlueAutoConfiguration.java new file mode 100644 index 0000000..7b35912 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/CanalGlueAutoConfiguration.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.config; + +import com.tmerclub.cloud.search.canal.CanalGlue; +import com.tmerclub.cloud.search.canal.LuckCanalBinLogEventParser; +import com.tmerclub.cloud.search.canal.LuckCanalBinlogEventProcessorFactory; +import com.tmerclub.cloud.search.canal.LuckCanalGlue; +import com.tmerclub.cloud.search.canal.support.parser.*; +import com.tmerclub.cloud.search.canal.support.parser.converter.CanalFieldConverterFactory; +import com.tmerclub.cloud.search.canal.support.parser.converter.InMemoryCanalFieldConverterFactory; +import com.tmerclub.cloud.search.canal.support.processor.BaseCanalBinlogEventProcessor; +import com.tmerclub.cloud.search.canal.support.processor.CanalBinlogEventProcessorFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import java.util.Map; + +/** + * @author throwable + * @version v1 + * @description + * @since 2020/9/20 17:05 + */ +@Configuration +public class CanalGlueAutoConfiguration implements SmartInitializingSingleton, BeanFactoryAware { + + private ConfigurableListableBeanFactory configurableListableBeanFactory; + + @Bean + @ConditionalOnMissingBean + public CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory() { + return LuckCanalBinlogEventProcessorFactory.of(); + } + + @Bean + @ConditionalOnMissingBean + public ModelTableMetadataManager modelTableMetadataManager(CanalFieldConverterFactory canalFieldConverterFactory) { + return InMemoryModelTableMetadataManager.of(canalFieldConverterFactory); + } + + @Bean + @ConditionalOnMissingBean + public CanalFieldConverterFactory canalFieldConverterFactory() { + return InMemoryCanalFieldConverterFactory.of(); + } + + @Bean + @ConditionalOnMissingBean + public CanalBinLogEventParser canalBinLogEventParser() { + return LuckCanalBinLogEventParser.of(); + } + + @Bean + @ConditionalOnMissingBean + public ParseResultInterceptorManager parseResultInterceptorManager(ModelTableMetadataManager modelTableMetadataManager) { + return InMemoryParseResultInterceptorManager.of(modelTableMetadataManager); + } + + @Bean + @Primary + public CanalGlue canalGlue(CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory) { + return LuckCanalGlue.of(canalBinlogEventProcessorFactory); + } + + @SuppressWarnings("NullableProblems") + @Override + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + this.configurableListableBeanFactory = (ConfigurableListableBeanFactory) beanFactory; + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Override + public void afterSingletonsInstantiated() { + ParseResultInterceptorManager parseResultInterceptorManager + = configurableListableBeanFactory.getBean(ParseResultInterceptorManager.class); + ModelTableMetadataManager modelTableMetadataManager + = configurableListableBeanFactory.getBean(ModelTableMetadataManager.class); + CanalBinlogEventProcessorFactory canalBinlogEventProcessorFactory + = configurableListableBeanFactory.getBean(CanalBinlogEventProcessorFactory.class); + CanalBinLogEventParser canalBinLogEventParser + = configurableListableBeanFactory.getBean(CanalBinLogEventParser.class); + Map interceptors + = configurableListableBeanFactory.getBeansOfType(BaseParseResultInterceptor.class); + interceptors.forEach((k, interceptor) -> parseResultInterceptorManager.registerParseResultInterceptor(interceptor)); + Map processors + = configurableListableBeanFactory.getBeansOfType(BaseCanalBinlogEventProcessor.class); + processors.forEach((k, processor) -> processor.init(canalBinLogEventParser, modelTableMetadataManager, + canalBinlogEventProcessorFactory, parseResultInterceptorManager)); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/ElasticConfig.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/ElasticConfig.java new file mode 100644 index 0000000..6b5e651 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/ElasticConfig.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.config; + +import cn.hutool.core.util.StrUtil; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestClientBuilder; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/9/24 + */ +@Configuration +public class ElasticConfig { + + @Value("${spring.elasticsearch.uris}") + private List addressList; + + @Value("${spring.elasticsearch.password:}") + private String password; + + @Value("${spring.elasticsearch.username:}") + private String username; + + @Bean + public RestHighLevelClient restHighLevelClient() { + HttpHost[] httpHosts = new HttpHost[addressList.size()]; + + for (int i = 0; i < addressList.size(); i++) { + httpHosts[i] = HttpHost.create(addressList.get(i)); + } + RestClientBuilder builder = RestClient.builder(httpHosts); + + // 异步httpclient连接延时配置 + builder.setRequestConfigCallback(requestConfigBuilder -> { + requestConfigBuilder.setConnectTimeout(5000); + requestConfigBuilder.setSocketTimeout(5000); + requestConfigBuilder.setConnectionRequestTimeout(5000); + return requestConfigBuilder; + }); + // 异步httpclient配置 + builder.setHttpClientConfigCallback(httpClientBuilder -> { + // httpclient连接数配置 + httpClientBuilder.setMaxConnTotal(100); + httpClientBuilder.setMaxConnPerRoute(100); + // httpclient保活策略 + httpClientBuilder.setKeepAliveStrategy((httpResponse, httpContext) -> 10000); + return httpClientBuilder; + }); + + // 设置es密码 + if (StrUtil.isNotBlank(password)) { + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); + builder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder + .setDefaultCredentialsProvider(credentialsProvider)); + } + return new RestHighLevelClient(builder); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/XxlJobConfig.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/XxlJobConfig.java new file mode 100644 index 0000000..2042c99 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/DataType.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/DataType.java new file mode 100644 index 0000000..be4870a --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/DataType.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.constant; + +/** + * es当中的index + * + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public enum DataType { + + + /** + * 全部 + */ + ALL(0), + + /** + * 销售中 + */ + SALE(1), + + /** + * 已售罄 + */ + SOLD_OUT(2), + + /** + * 已下架 + */ + DISABLE(3), + + /** + * 全部商品(普通、团购、秒杀、积分商品) + */ + ALL_PROD(4); + + private final Integer value; + + public Integer value() { + return value; + } + + DataType(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java new file mode 100644 index 0000000..90f6ada --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.constant; + +import com.tmerclub.cloud.common.constant.Constant; + +/** + * es当中的index + * @author FrozenWatermelon + * @date 2020/11/12 + */ +public enum EsIndexEnum { + + /** + * 商品 + */ + PRODUCT(Constant.NAME_SPACE + "product"), + + /** + * 订单 + */ + ORDER(Constant.NAME_SPACE + "order"), + + /** + * 订单发票 + */ + ORDER_INVOICE(Constant.NAME_SPACE + "order-invoice"), + + /** + * 采购订单 + */ + PURCHASE_ORDER(Constant.NAME_SPACE + "purchase-order"), + + /** + * 退款订单 + */ + ORDER_REFUND(Constant.NAME_SPACE + "order-refund"), + + /** + * 调拨订单 + */ + ALLOT_ORDER(Constant.NAME_SPACE + "allot-order") + ; + + private final String value; + + public String value() { + return value; + } + + EsIndexEnum(String value) { + this.value = value; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsRenovationProductSortEnum.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsRenovationProductSortEnum.java new file mode 100644 index 0000000..cfdd025 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsRenovationProductSortEnum.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.constant; + +import org.elasticsearch.search.sort.SortOrder; + + +/** + * 装修商品排序 + * @author lhd + * @date 2023/01/30 + */ +public enum EsRenovationProductSortEnum { + + /** + * 上架时间升序 + */ + CREATE_TIME_ASC(0, "createTime", SortOrder.ASC), + + /** + * 上架时间降序 + */ + CREATE_TIME_DESC(1, "createTime", SortOrder.DESC), + + /** + * 销量倒序 + */ + SALE_NUM_DESC(2, "saleNum", SortOrder.DESC), + + /** + * 销量正序 + */ + SALE_NUM_ASC(3, "saleNum", SortOrder.ASC), + + /** + * 评论数量倒序 + */ + COMMENT_NUM_DESC(4, "commentNum", SortOrder.DESC), + + /** + * 评论数量正序 + */ + COMMENT_NUM_ASC(5, "commentNum", SortOrder.ASC), + ; + + private final Integer value; + + private final String param; + + private final SortOrder order; + + public Integer value() { + return value; + } + + EsRenovationProductSortEnum(Integer value, String param, SortOrder order) { + this.value = value; + this.param = param; + this.order = order; + } + + public String param() { + return param; + } + + public SortOrder order() { + return order; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsTimeRangeEnum.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsTimeRangeEnum.java new file mode 100644 index 0000000..f601fce --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsTimeRangeEnum.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.constant; + +import org.elasticsearch.search.sort.SortOrder; + + +/** + * 时间排序 + * @author lhd + * @date 2023/01/30 + */ +public enum EsTimeRangeEnum { + + /** + * 全部 + */ + ALL(0, "createTime", SortOrder.ASC), + + /** + * 最近一年 + */ + LAST_YEAR(1, "createTime", SortOrder.DESC), + + /** + * 最近三个月 + */ + LAST_THREE_MONTHS(2, "saleNum", SortOrder.DESC), + + /** + * 最近一个月 + */ + LAST_MONTH(3, "saleNum", SortOrder.ASC), + + /** + * 最近一个星期 + */ + LAST_WEEK(4, "priceFee", SortOrder.DESC), + ; + + private final Integer value; + + private final String param; + + private final SortOrder order; + + public Integer value() { + return value; + } + + EsTimeRangeEnum(Integer value, String param, SortOrder order) { + this.value = value; + this.param = param; + this.order = order; + } + + public String param() { + return param; + } + + public SortOrder order() { + return order; + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/OrderSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/OrderSearchController.java new file mode 100644 index 0000000..a94c355 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/OrderSearchController.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.admin; + +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.OrderExcelVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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 YXF + * @date 2023/08/10 + */ +@RestController("adminOrderSearchController") +@RequestMapping("/mp/order/search") +@Tag(name = "admin-order管理列表接口") +public class OrderSearchController { + private static final Logger LOGGER = LoggerFactory.getLogger(OrderSearchController.class); + + @Autowired + private OrderSearchManager orderSearchManager; + @Autowired + private SkuFeignClient skuFeignClient; + @Autowired + private CategoryShopFeignClient categoryShopFeignClient; + @Autowired + private SpuFeignClient spuFeignClient; + @Autowired + private SupplierDetailFeignClient supplierDetailFeignClient; + + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出订单excel") + public ServerResponseEntity orderSoldExcel(HttpServletResponse response, OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + if (Objects.equals(orderSearchDTO.getStatus(), OrderStatus.WAIT_PURCHASE.value())) { + LOGGER.info("导出待采购订单excel"); + orderSearchDTO.setStatus(OrderStatus.PAYED.value()); + orderSearchDTO.setWaitPurchase(1); + } + // 查询订单列表 + List orderExcelList = orderSearchManager.orderExcelScrollSearch(orderSearchDTO); + // 生成excel + ExcelUtil.soleExcel(response, orderExcelList, OrderExcelVO.EXCEL_NAME, OrderExcelVO.MERGE_ROW_INDEX, OrderExcelVO.MERGE_COLUMN_INDEX, OrderExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/ProductSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/ProductSearchController.java new file mode 100644 index 0000000..e758178 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/admin/ProductSearchController.java @@ -0,0 +1,446 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.admin; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.bo.EsBrandBO; +import com.tmerclub.cloud.common.product.constant.SpuMold; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.SkuVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.constant.DataType; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.manager.ProductSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.commons.compress.utils.Lists; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.*; +import java.util.stream.Collectors; + +/** + * 商品搜索 + * + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("adminSearchSpuController") +@RequestMapping("/mp/search") +@Tag(name = "admin-spu管理列表接口") +public class ProductSearchController { + private static final Logger LOGGER = LoggerFactory.getLogger(ProductSearchController.class); + + @Autowired + private ProductSearchManager productSearchManager; + @DubboReference + private SkuFeignClient skuFeignClient; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private CategoryShopFeignClient categoryShopFeignClient; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + + @GetMapping("/page") + @Operation(summary = "商品信息列表", description = "商品信息列表") + public ServerResponseEntity> page(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + productSearchDTO.setFetchSource(EsConstant.SHOP_FETCH_SOURCE); + productSearchDTO.setShopId(shopId); + if (Objects.nonNull(productSearchDTO.getSupplierDeliveryType())) { + productSearchDTO.setSpuMold(0); + } + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + List spuList = searchPage.getList(); + List spuIds = spuList.stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + List supplierSpuIds = Lists.newArrayList(); + List comboSpuList = Lists.newArrayList(); + if (CollUtil.isNotEmpty(spuList)) { + for (SpuAdminVO item : spuList) { + long spuId = item.getSpuId(); + if (Objects.equals(item.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value()) && Objects.nonNull(item.getSupplierSpuId())) { + supplierSpuIds.add(item.getSupplierSpuId()); + spuId = item.getSupplierSpuId(); + } + if(Objects.equals(item.getSpuMold(), SpuMold.COMBO.value())) { + comboSpuList.add(spuId); + } + } + } + if (CollUtil.isNotEmpty(supplierSpuIds)) { + //代销商品 供应商商品更新后代销商品是否已同步更新 值 + List spuIsSyn = spuFeignClient.getSpuIsSynUpdate(spuIds).getData(); + Map isSynUpdate = spuIsSyn.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getIsSynUpdate)); + for (SpuAdminVO spuAdminVO : searchPage.getList()) { + spuAdminVO.setIsSynUpdate(isSynUpdate.get(spuAdminVO.getSpuId())); + } + } + // 如果是组合商品,需要重新计算一下库存 + if (CollUtil.isNotEmpty(comboSpuList)) { + ServerResponseEntity> spuIdStockMapResp = skuStockFeignClient.calculateStockByComboSpuList(comboSpuList); + Map spuStockMap = spuIdStockMapResp.getData(); + for (SpuAdminVO spuAdminVO : spuList) { + if(!spuStockMap.containsKey(spuAdminVO.getSpuId()) && !spuStockMap.containsKey(spuAdminVO.getSupplierSpuId())){ + continue; + } + spuAdminVO.setStock(spuStockMap.get(spuAdminVO.getSpuId())); + if (Objects.equals(spuAdminVO.getSupplierSpuType(), SupplierSpuType.CONSIGNMENT.value()) && Objects.nonNull(spuAdminVO.getSupplierSpuId())) { + spuAdminVO.setStock(spuStockMap.get(spuAdminVO.getSupplierSpuId())); + } + } + } + //检查代销商品是否改变了原有得供应商图片和名字,如果改变了显示商家改变后的图片和名字,没有改变则显示供应商信息 + List data = spuFeignClient.checkCommissionSpuIsUpdateMsg(spuList).getData(); + searchPage.setList(data); + // 加载商品总库存 + this.loadSpuStock(searchPage); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/page_distribution_spu") + @Operation(summary = "分销商品列表", description = "分销商品列表") + public ServerResponseEntity> pageDistributionSpu(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + productSearchDTO.setShopId(shopId); + } + productSearchDTO.setFetchSource(EsConstant.DISTRIBUTION_SPU_SOURCE); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + // 加载商品总库存 + this.loadSpuStock(searchPage); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/page_supply_spu") + @Operation(summary = "商家搜索供应商品列表", description = "商家搜索供应商品列表") + public ServerResponseEntity> pageSupplySup(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + Integer sysType = AuthUserContext.get().getSysType(); + ServerResponseEntity> oneCategoryIdByShopId = categoryShopFeignClient.getOneCategoryIdByShopId(shopId, sysType, I18nMessage.getLang()); + if (Objects.isNull(oneCategoryIdByShopId.getData())) { + return ServerResponseEntity.success(); + } + // 查询出已经代销的商品 + ProductSearchDTO productSearchConsignment = new ProductSearchDTO(); + productSearchConsignment.setSupplierSpuType(SupplierSpuType.CONSIGNMENT.value()); + productSearchConsignment.setShopId(shopId); + productSearchConsignment.setFetchSource(EsConstant.CONSIGNMENT_SPU); + productSearchConsignment.setShopQuerySupplierSpu(true); + EsPageDTO pageConsignment = new EsPageDTO(); + pageConsignment.setPageSize(EsPageDTO.MAX_PAGE_SIZE); + pageConsignment.setPageNum(1); + EsPageVO spuAdminEsPage = productSearchManager.adminPage(pageConsignment, productSearchConsignment); + List spuIdList = spuAdminEsPage.getList().stream().map(SpuAdminVO::getSupplierSpuId).toList(); + //根据分类查找对应的供应商id + ServerResponseEntity> supplyIdByCategoryIds = categoryShopFeignClient.getSupplyIdByCategoryIds(oneCategoryIdByShopId.getData()); + //es搜索商品 + productSearchDTO.setSupplierIds(supplyIdByCategoryIds.getData()); + productSearchDTO.setCategoryIds(oneCategoryIdByShopId.getData()); + productSearchDTO.setFetchSource(EsConstant.SUPPLIER_SPU); + productSearchDTO.setSupplierSpuType(1); + productSearchDTO.setShopQuerySupplierSpu(true); + EsPageVO spuAdminPage = productSearchManager.adminPage(pageConsignment, productSearchDTO); + List list = spuAdminPage.getList(); + // 代销商品过滤 + Set filterSpuIdList = new HashSet<>(Constant.INITIAL_CAPACITY); + if (!Objects.isNull(productSearchDTO.getIsCommission())) { + if (productSearchDTO.getIsCommission() == 0) { + filterSpuIdList.addAll(spuIdList); + } else { + List includeSpuIds = new ArrayList<>(spuIdList); + productSearchDTO.setSpuIds(includeSpuIds); + } + } + // 需要过滤的商品id(过滤掉没有导入,且供应商商品状态不是上架状态的商品) + for (SpuAdminVO spuAdminVO : list) { + boolean contains = spuIdList.contains(spuAdminVO.getSpuId()); + if (!contains) { + if (!Objects.equals(spuAdminVO.getSpuStatus(), StatusEnum.ENABLE.value())) { + filterSpuIdList.add(spuAdminVO.getSpuId()); + } + } + } + productSearchDTO.setSpuIdsExclude(new ArrayList<>(filterSpuIdList)); + spuAdminPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + list = spuAdminPage.getList(); + ServerResponseEntity> supplierResp = supplierDetailFeignClient.listSupplierDetailBySupplierIds(supplyIdByCategoryIds.getData()); + Map supplierNameMap = supplierResp.getData().stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, SupplierApiDetailVO::getSupplierName)); + for (SpuAdminVO spuAdminVO : list) { + spuAdminVO.setSupplyPriceFee(spuAdminVO.getPriceFee()); + //品牌名称 + setBrandName(spuAdminVO); + spuAdminVO.setSupplierName(supplierNameMap.get(spuAdminVO.getSupplierId()) == null ? spuAdminVO.getShopName() : supplierNameMap.get(spuAdminVO.getSupplierId())); + } + //验证是否代销了供应商商品 + ServerResponseEntity> result = spuFeignClient.isCommissionByShopIdAndSpuId(list, shopId); + spuAdminPage.setList(result.getData()); + // 加载商品总库存 + this.loadSpuStock(spuAdminEsPage); + return ServerResponseEntity.success(spuAdminPage); + } + + @GetMapping("/page_supplier_spu_list") + @Operation(summary = "获取某个供应商或商家(不含代销商品)的商品列表", description = "获取某个供应商或商家(不含代销商品)的商品列表") + public ServerResponseEntity> pageSupplierSpuList(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (Objects.isNull(productSearchDTO.getCategoryId()) || Objects.isNull(productSearchDTO.getSupplierIds())) { + ServerResponseEntity> categoryIdsResp = categoryShopFeignClient.getCategoryIdsByShopId(shopId, AuthUserContext.get().getSysType()); + if (!categoryIdsResp.isSuccess()) { + throw new LuckException(categoryIdsResp.getMsg()); + } + // 根据分类过滤商品 + if (Objects.isNull(productSearchDTO.getCategoryId())) { + productSearchDTO.setCategoryIds(categoryIdsResp.getData()); + } + // 根据供应商过滤商品 + if (CollUtil.isEmpty(productSearchDTO.getSupplierIds())) { + //根据分类查找对应的供应商id + ServerResponseEntity> supplyIdByCategoryIds = categoryShopFeignClient.getSupplyIdByCategoryIds(categoryIdsResp.getData()); + //es搜索商品 + productSearchDTO.setSupplierIds(supplyIdByCategoryIds.getData()); + } + } + productSearchDTO.setFetchSource(EsConstant.CONSIGNMENT_SPU); + productSearchDTO.setHasStock(1); + productSearchDTO.setSpuStatus(StatusEnum.ENABLE.value()); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + // 加载商品总库存 + this.loadSpuStock(searchPage); + if (CollUtil.isEmpty(searchPage.getList())) { + return ServerResponseEntity.success(searchPage); + } + List spuIds = searchPage.getList().stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + // 商家端查询供应商库存时,stock为商家库存,supplierStock为供应商库存 + List skuListResp; + boolean isQueryShopStock = productSearchDTO.getShopQuerySupplierSpu() != null && productSearchDTO.getShopQuerySupplierSpu(); + if (isQueryShopStock) { + skuListResp = skuFeignClient.listSupplierBySpuIds(spuIds, shopId).getData(); + } else { + skuListResp = skuFeignClient.listBySpuIds(spuIds); + } + Map> skuMap = skuListResp.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + // 去掉库存为0的sku + for (SpuAdminVO spuAdminVO : searchPage.getList()) { + List skuList = skuMap.get(spuAdminVO.getSpuId()); + skuList.removeIf(skuVO -> (isQueryShopStock && skuVO.getSupplierStock() == 0) + || (!isQueryShopStock && Objects.equals(skuVO.getStock(), 0))); + spuAdminVO.setSkuList(skuList); + } + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/page_shop_spu_list") + @Operation(summary = "获取商家的商品列表", description = "获取商家的商品列表") + public ServerResponseEntity> pageShopSpuList(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + ServerResponseEntity> categoryIdsResp = categoryShopFeignClient.getCategoryIdsByShopId(shopId, SysTypeEnum.MULTISHOP.value()); + if (!categoryIdsResp.isSuccess()) { + throw new LuckException(categoryIdsResp.getMsg()); + } + productSearchDTO.setCategoryIds(categoryIdsResp.getData()); + productSearchDTO.setShopId(shopId); + productSearchDTO.setFetchSource(EsConstant.SHOP_FETCH_SOURCE); + productSearchDTO.setDataType(DataType.ALL_PROD.value()); + productSearchDTO.setSupplierSpuType(null); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + // 加载商品总库存 + this.loadSpuStock(searchPage); + if (CollectionUtil.isEmpty(searchPage.getList())) { + return ServerResponseEntity.success(searchPage); + } + List spuIds = searchPage.getList().stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + List skuListResp = skuFeignClient.listBySpuIds(spuIds); + Map> skuMap = skuListResp.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + for (SpuAdminVO spuAdminVO : searchPage.getList()) { + spuAdminVO.setSkuList(skuMap.get(spuAdminVO.getSpuId())); + } + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/page_consignment_spu") + @Operation(summary = "代销商品列表", description = "代销商品列表") + public ServerResponseEntity> pageConsignmentSpu(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + productSearchDTO.setSupplierSpuType(SupplierSpuType.CONSIGNMENT.value()); + productSearchDTO.setShopId(shopId); + productSearchDTO.setFetchSource(EsConstant.CONSIGNMENT_SPU); + productSearchDTO.setShopQuerySupplierSpu(false); + EsPageVO spuAdminEsPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + if (spuAdminEsPage.getList().size() == 0) { + //查询为空直接返回 + LOGGER.info("代销商品列表查询列表为空,条件为{}", productSearchDTO); + } else { + List commissionSpu = spuAdminEsPage.getList(); + //供商品id + List supplierSpuIds = commissionSpu.stream().map(SpuAdminVO::getSupplierSpuId).collect(Collectors.toList()); + //代销商品id + List spuIds = commissionSpu.stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + //供应商品信息 + ServerResponseEntity> supplierEntity = spuFeignClient.listSpuBySpuIds(supplierSpuIds); + //代销商品 供应商商品更新后代销商品是否已同步更新 值 + List supplierSpu = supplierEntity.getData(); + List spuIsSyn = spuFeignClient.getSpuIsSynUpdate(spuIds).getData(); + Map isSynUpdate = spuIsSyn.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getIsSynUpdate)); + //供应商品供货价 + Map supplierSpuFee = supplierSpu.stream().collect(Collectors.toMap(SpuVO::getSpuId, SpuVO::getPriceFee)); + for (SpuAdminVO spuAdminVO : commissionSpu) { + spuAdminVO.setIsSynUpdate(isSynUpdate.get(spuAdminVO.getSpuId())); + //品牌名称 + setBrandName(spuAdminVO); + //设置供货价 + spuAdminVO.setSupplyPriceFee(supplierSpuFee.get(spuAdminVO.getSupplierSpuId())); + } + + //检查代销商品是否改变了原有得供应商图片和名字,如果改变了显示商家改变后的图片和名字,没有改变则显示供应商信息 + List result = spuFeignClient.checkCommissionSpuIsUpdateMsg(commissionSpu).getData(); + spuAdminEsPage.setList(result); + } + // 加载商品总库存 + this.loadSpuStock(spuAdminEsPage); + return ServerResponseEntity.success(spuAdminEsPage); + } + + @GetMapping("/page_can_combo_spu") + @Operation(summary = "获取可以参加组合商品的商品列表", description = "获取可以参加组合商品的商品列表,商家关联商品范围:商家商品+代销但商家发货商品;供应商关联商品范围:供应商商品") + public ServerResponseEntity> pageCanComboSpu(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); +// if (Objects.isNull(productSearchDTO.getCategoryId()) || Objects.isNull(productSearchDTO.getSupplierIds())) { +// ServerResponseEntity> categoryIdsResp = categoryShopFeignClient.getCategoryIdsByShopId(shopId, SysTypeEnum.MULTISHOP.value()); +// if (!categoryIdsResp.isSuccess()) { +// throw new LuckException(categoryIdsResp.getMsg()); +// } +// // 根据分类过滤商品 +// if (Objects.isNull(productSearchDTO.getCategoryId())) { +// productSearchDTO.setCategoryIds(categoryIdsResp.getData()); +// } +// } + productSearchDTO.setFetchSource(EsConstant.CONSIGNMENT_SPU); + productSearchDTO.setIsGiveaway(1); + productSearchDTO.setCanDeposit(1); + productSearchDTO.setIsVirtual(null); + Integer sysType = AuthUserContext.get().getSysType(); + if(Objects.equals(sysType,SysTypeEnum.MULTISHOP.value())) { + productSearchDTO.setIsSupplierDelivery(1); + productSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + } + if(Objects.equals(sysType,SysTypeEnum.SUPPLIER.value())){ + productSearchDTO.setSupplierSpuType(1); + productSearchDTO.setSupplierId(AuthUserContext.get().getTenantId()); + } + productSearchDTO.setSpuMold(SpuMold.REAL.value()); +// productSearchDTO.setHasStock(1); + productSearchDTO.setSpuStatus(StatusEnum.ENABLE.value()); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + // 加载商品总库存 + this.loadSpuStock(searchPage); + if (CollUtil.isEmpty(searchPage.getList())) { + return ServerResponseEntity.success(searchPage); + } + List spuIds = searchPage.getList().stream().map(SpuAdminVO::getSpuId).collect(Collectors.toList()); + // 商家端查询供应商库存时,stock为商家库存,supplierStock为供应商库存 + List skuListResp; + boolean isQueryShopStock = productSearchDTO.getShopQuerySupplierSpu() != null && productSearchDTO.getShopQuerySupplierSpu(); + if (isQueryShopStock) { + skuListResp = skuFeignClient.listSupplierBySpuIds(spuIds, shopId).getData(); + } else { + skuListResp = skuFeignClient.listBySpuIds(spuIds); + } + Map> skuMap = skuListResp.stream().collect(Collectors.groupingBy(SkuVO::getSpuId)); + // 去掉库存为0的sku + for (SpuAdminVO spuAdminVO : searchPage.getList()) { + List skuList = skuMap.get(spuAdminVO.getSpuId()); +// skuList.removeIf(skuVO -> (isQueryShopStock && skuVO.getSupplierStock() == 0) +// || (!isQueryShopStock && Objects.equals(skuVO.getStock(), 0))); + spuAdminVO.setSkuList(skuList); + } + return ServerResponseEntity.success(searchPage); + } + + public void setBrandName(SpuAdminVO spuAdminVO) { + //品牌名称 + Integer lang = I18nMessage.getLang(); + EsBrandBO brand = spuAdminVO.getBrand(); + if (!Objects.isNull(brand)) { + if (Objects.equals(lang, LanguageEnum.LANGUAGE_EN.getLang())) { + spuAdminVO.setBrandName(brand.getBrandNameEn()); + } + if (Objects.equals(lang, LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + spuAdminVO.setBrandName(brand.getBrandNameZh()); + } + } + } + + + @GetMapping("/page_combo_add_spu") + @Operation(summary = "套餐以及赠品选择商品列表", description = "套餐以及赠品选择商品列表") + public ServerResponseEntity> pageComboAddSpu(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + productSearchDTO.setFetchSource(EsConstant.SHOP_FETCH_SOURCE); + productSearchDTO.setShopId(shopId); + productSearchDTO.setSpuType(SpuType.NORMAL.value()); + productSearchDTO.setNotSpuMold(SpuMold.COMBO.value()); + productSearchDTO.setKeyword(productSearchDTO.getSpuName()); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + List spuList = searchPage.getList(); + // 插入sku列表 - 套餐是可以选择供应商商品的,所以供应商发货的sku的库存要换成供应商sku库存 + List spuAdminList = skuFeignClient.setSpuSku(spuList).getData(); + searchPage.setList(spuAdminList); + // 加载商品总库存 + this.loadSpuStock(searchPage); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/renovation_page") + @Operation(summary = "商品信息列表(商家装修商品列表)", description = "商品信息列表(商家装修商品列表)") + public ServerResponseEntity> renovationPage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + EsPageVO searchPage = productSearchManager.showSpuTypeRenovationPage(pageDTO, productSearchDTO); + return ServerResponseEntity.success(searchPage); + } + + private void loadSpuStock(EsPageVO searchPage) { + ServerResponseEntity> listServerResponseEntity = skuStockFeignClient.loadProdStock(searchPage.getList()); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + searchPage.setList(listServerResponseEntity.getData()); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/OrderInvoiceSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/OrderInvoiceSearchController.java new file mode 100644 index 0000000..29ff4cf --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/OrderInvoiceSearchController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.multishop; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.OrderInvoiceSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderInvoiceVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.manager.OrderInvoiceSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("multishopOrderInvoiceSearchController") +@RequestMapping("/m/order_invoice_search") +@Tag(name = "multishop-订单发票管理接口") +public class OrderInvoiceSearchController { + + @Autowired + private OrderInvoiceSearchManager orderInvoiceSearchManager; + + @GetMapping("/page") + @Operation(summary = "获取订单发票列表", description = "分页获取列表") + public ServerResponseEntity> page(@Valid EsPageDTO pageDTO, OrderInvoiceSearchDTO orderInvoiceSearchDTO) { + orderInvoiceSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + orderInvoiceSearchDTO.setSupplierId(null); + EsPageVO page = orderInvoiceSearchManager.page(pageDTO, orderInvoiceSearchDTO); + return ServerResponseEntity.success(page); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/PurchaseOrderSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/PurchaseOrderSearchController.java new file mode 100644 index 0000000..e3b5133 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/multishop/PurchaseOrderSearchController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.multishop; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.PurchaseOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsPurchaseOrderVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.manager.PurchaseOrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("multishopPurchaseOrderSearchController") +@RequestMapping("/m/purchase_order_search") +@Tag(name = "multishop-采购订单管理接口") +public class PurchaseOrderSearchController { + + @Autowired + private PurchaseOrderSearchManager purchaseOrderSearchManager; + + @GetMapping("/page") + @Operation(summary = "商品信息列表", description = "商品信息列表") + public ServerResponseEntity> page(@Valid EsPageDTO pageDTO, PurchaseOrderSearchDTO purchaseOrderDTO) { + purchaseOrderDTO.setShopId(AuthUserContext.get().getTenantId()); + EsPageVO page = purchaseOrderSearchManager.page(pageDTO, purchaseOrderDTO); + return ServerResponseEntity.success(page); + + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/OrderSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/OrderSearchController.java new file mode 100644 index 0000000..be10ce2 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/OrderSearchController.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.platform; + +import com.tmerclub.cloud.api.product.feign.CategoryShopFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.OrderExcelVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.ExcelUtil; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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; + +/** + * 订单搜索 + * + * @author YXF + * @date 2023/08/10 + */ +@RestController("platformOrderSearchController") +@RequestMapping("/p/order/search") +@Tag(name = "admin-order管理列表接口") +public class OrderSearchController { + private static final Logger LOGGER = LoggerFactory.getLogger(OrderSearchController.class); + + @Autowired + private OrderSearchManager orderSearchManager; + @Autowired + private SkuFeignClient skuFeignClient; + @Autowired + private CategoryShopFeignClient categoryShopFeignClient; + @Autowired + private SpuFeignClient spuFeignClient; + @Autowired + private SupplierDetailFeignClient supplierDetailFeignClient; + + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出订单excel") + public ServerResponseEntity orderSoldExcel(HttpServletResponse response,OrderSearchDTO orderSearchDTO) { + // 查询订单列表 + List orderExcelList = orderSearchManager.orderExcelScrollSearch(orderSearchDTO); + // 生成excel + ExcelUtil.soleExcel(response, orderExcelList, OrderExcelVO.EXCEL_NAME, OrderExcelVO.MERGE_ROW_INDEX, OrderExcelVO.MERGE_COLUMN_INDEX, OrderExcelVO.class); + return ServerResponseEntity.success(); + } + + + + + @GetMapping("/score_sold_excel") + @Operation(summary = "积分订单导出excel", description = "积分订单导出excel") + public ServerResponseEntity scoreOrderSoldExcel(HttpServletResponse response,OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setShopId(AuthUserContext.get().getTenantId()); + // 查询订单列表 + List orderExcelList = orderSearchManager.orderExcelScrollSearch(orderSearchDTO); + // 生成excel + ExcelUtil.soleExcel(response, orderExcelList, OrderExcelVO.EXCEL_NAME, OrderExcelVO.MERGE_ROW_INDEX, OrderExcelVO.MERGE_COLUMN_INDEX, OrderExcelVO.class); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/ProductSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/ProductSearchController.java new file mode 100644 index 0000000..5ee04c3 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/platform/ProductSearchController.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.platform; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.multishop.vo.ShopDetailVO; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.supplier.feign.SupplierDetailFeignClient; +import com.tmerclub.cloud.api.supplier.vo.SupplierApiDetailVO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SearchSpuTagVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.manager.ProductSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +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.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 商品搜索 + * + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("platformSearchSpuController") +@RequestMapping("/p/search") +@Tag(name = "platform-spu列表接口") +public class ProductSearchController { + + @Autowired + private ProductSearchManager productSearchManager; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + @DubboReference + private SupplierDetailFeignClient supplierDetailFeignClient; + + @GetMapping("/page") + @Operation(summary = "商品管理信息列表(平台端)", description = "商品管理信息列表(平台端)") + public ServerResponseEntity> adminPage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setFetchSource(EsConstant.PLATFORM_FETCH_SOURCE); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + List spuAdminVOList = searchPage.getList(); + List supplierSpuList = spuAdminVOList.stream().filter(s -> Objects.equals(s.getSupplierSpuType(), SupplierSpuType.YES.value())).collect(Collectors.toList()); + List supplierIds = supplierSpuList.stream().map(SpuAdminVO::getSupplierId).collect(Collectors.toList()); + List supplierApiDetailVOList = supplierDetailFeignClient.listSupplierDetailBySupplierIds(supplierIds).getData(); + Map supplierMap = supplierApiDetailVOList.stream().collect(Collectors.toMap(SupplierApiDetailVO::getSupplierId, s -> s)); + //供应商商品的店铺名称 + for (SpuAdminVO supplierSpu : supplierSpuList) { + supplierSpu.setShopName(supplierMap.get(supplierSpu.getSupplierId()).getSupplierName()); + } + // 店铺名称 + if (CollUtil.isNotEmpty(spuAdminVOList) && spuAdminVOList.size() != 0) { + List shopIdList = spuAdminVOList.stream().map(SpuAdminVO::getShopId).collect(Collectors.toList()); + List shopDetailVOList = shopDetailFeignClient.listByShopIds(shopIdList).getData(); + Map> shopDetailVoMap = shopDetailVOList.stream().collect(Collectors.groupingBy(ShopDetailVO::getShopId)); + for (SpuAdminVO spuAdminVO : spuAdminVOList) { + List shopDetailList = shopDetailVoMap.get(spuAdminVO.getShopId()); + if (Objects.isNull(shopDetailList)) { + continue; + } + spuAdminVO.setShopName(shopDetailList.get(0).getShopName()); + } + } + // 加载商品总库存 + this.loadSpuStock(searchPage); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/score_page") + @Operation(summary = "积分商品搜索(平台端)", description = "积分商品搜索(平台端)") + public ServerResponseEntity> scorePage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setFetchSource(EsConstant.PLATFORM_FETCH_SOURCE); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + for (SpuAdminVO spuAdminVO : searchPage.getList()) { + if (Objects.equals(spuAdminVO.getSupplierSpuType(), SupplierSpuType.YES.value()) && Objects.isNull(spuAdminVO.getShopName())) { + spuAdminVO.setShopName(spuAdminVO.getSupplierName()); + } + } + // 加载商品总库存 + this.loadSpuStock(searchPage); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/tag_page") + @Operation(summary = "分组商品列表(平台端)", description = "分组商品列表(平台端)") + public ServerResponseEntity> tagPage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + productSearchDTO.setFetchSource(EsConstant.PLATFORM_TAG_FETCH_SOURCE); + EsPageVO searchPage = productSearchManager.adminPage(pageDTO, productSearchDTO); + // 插入序号 + for (SpuAdminVO spuAdminVO : searchPage.getList()) { + for (SearchSpuTagVO tag : spuAdminVO.getTags()) { + if (Objects.equals(productSearchDTO.getTagId(), tag.getTagId())) { + spuAdminVO.setSeq(tag.getSeq()); + } + } + spuAdminVO.setTags(null); + } + // 加载商品总库存 + this.loadSpuStock(searchPage); + return ServerResponseEntity.success(searchPage); + } + + @GetMapping("/renovation_page") + @Operation(summary = "商品信息列表(平台装修商品列表)", description = "商品信息列表(平台装修商品列表)") + public ServerResponseEntity> renovationPage(@Valid EsPageDTO pageDTO, ProductSearchDTO productSearchDTO) { + EsPageVO searchPage = productSearchManager.showSpuTypeRenovationPage(pageDTO, productSearchDTO); + return ServerResponseEntity.success(searchPage); + } + + private void loadSpuStock(EsPageVO searchPage) { + ServerResponseEntity> listServerResponseEntity = skuStockFeignClient.loadProdStock(searchPage.getList()); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + searchPage.setList(listServerResponseEntity.getData()); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/OrderInvoiceSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/OrderInvoiceSearchController.java new file mode 100644 index 0000000..48526ab --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/supplier/OrderInvoiceSearchController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.controller.supplier; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.order.dto.OrderInvoiceSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderInvoiceVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.search.manager.OrderInvoiceSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 FrozenWatermelon + * @date 2020/11/16 + */ +@RestController("supplierOrderInvoiceSearchController") +@RequestMapping("/s/order_invoice_search") +@Tag(name = "supplier-订单发票管理接口") +public class OrderInvoiceSearchController { + + @Autowired + private OrderInvoiceSearchManager orderInvoiceSearchManager; + + @GetMapping("/page") + @Operation(summary = "获取订单发票列表", description = "分页获取列表") + public ServerResponseEntity> page(@Valid EsPageDTO pageDTO, OrderInvoiceSearchDTO orderInvoiceSearchDTO) { + orderInvoiceSearchDTO.setSupplierId(AuthUserContext.get().getTenantId()); + orderInvoiceSearchDTO.setShopId(null); + EsPageVO page = orderInvoiceSearchManager.page(pageDTO, orderInvoiceSearchDTO); + return ServerResponseEntity.success(page); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderFeignController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderFeignController.java new file mode 100644 index 0000000..427fe34 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderFeignController.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.feign; + + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderVO; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.order.vo.UserOrderStatisticVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.search.manager.OrderRefundSearchManager; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * 订单搜索feign连接 + * + * @author YXF + * @date 2020/12/07 + */ +@DubboService +public class SearchOrderFeignController implements SearchOrderFeignClient { + + @Autowired + private OrderSearchManager orderSearchManager; + @Autowired + private OrderRefundSearchManager orderRefundSearchManager; + + + @Override + public ServerResponseEntity> countOrderByUserIds(List userIds) { + List list = orderSearchManager.countOrderByUserIds(userIds); + return ServerResponseEntity.success(list); + } + + @Override + public ServerResponseEntity> pageOrder(OrderSearchDTO orderSearchDTO) { + return ServerResponseEntity.success(orderSearchManager.pageSearchResult(orderSearchDTO)); + } + + @Override + public ServerResponseEntity countOrder(OrderSearchDTO orderSearchDTO) { + orderSearchDTO.setPageSize(1); + orderSearchDTO.setPageNum(1); + EsPageVO esOrderPage = orderSearchManager.pageSearchResult(orderSearchDTO); + return ServerResponseEntity.success(esOrderPage.getTotal()); + } + + @Override + public ServerResponseEntity> listOrderById(List orderIds) { + if (CollUtil.isEmpty(orderIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + List orderList = orderSearchManager.listByOrderIds(orderIds); + return ServerResponseEntity.success(orderList); + } + + @Override + public ServerResponseEntity> listOrder(OrderSearchDTO orderSearchDTO) { + EsPageVO orderPage = orderSearchManager.pageSearchResult(orderSearchDTO); + return ServerResponseEntity.success(orderPage.getList()); + } + + @Override + public ServerResponseEntity> getOrderItems(List orderItemIds) { + if (CollUtil.isEmpty(orderItemIds)) { + return ServerResponseEntity.success(); + } + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setOrderItemIds(orderItemIds); + orderSearchDTO.setPageSize(orderItemIds.size()); + orderSearchDTO.setPageNum(1); + orderSearchDTO.setFetchSource(new String[]{"orderId", "orderItems", "actualTotal"}); + EsPageVO orderPage = orderSearchManager.pageSearchResult(orderSearchDTO); + List orderItemList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (EsOrderVO esOrderVO : orderPage.getList()) { + orderItemList.addAll(BeanUtil.mapAsList(esOrderVO.getOrderItems(), OrderItemVO.class)); + } + return ServerResponseEntity.success(orderItemList); + } + + @Override + public ServerResponseEntity> listEsOrder(OrderSearchDTO orderSearchDTO) { + List esOrders = orderSearchManager.listSearchResult(orderSearchDTO); + return ServerResponseEntity.success(esOrders); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderTaskFeignController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderTaskFeignController.java new file mode 100644 index 0000000..7c98473 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchOrderTaskFeignController.java @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.feign; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.feign.SearchOrderTaskFeignClient; +import com.tmerclub.cloud.api.multishop.bo.OrderChangeShopWalletAmountBO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.api.order.feign.PurchaseOrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.order.bo.PayNotifyBO; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.order.dto.PurchaseOrderSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsPurchaseOrderVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.manager.OrderSearchManager; +import com.tmerclub.cloud.search.manager.PurchaseOrderSearchManager; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchScrollRequest; +import org.elasticsearch.core.TimeValue; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.SearchHit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.support.GenericMessage; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 搜索符合定时任务条件的订单 + * + * @author YXF + * @date 2020/12/07 + */ +@DubboService +public class SearchOrderTaskFeignController implements SearchOrderTaskFeignClient { + private static final Logger logger = LoggerFactory.getLogger(SearchOrderTaskFeignController.class); + + private static final String SETTLED = "settled"; + private static final String CONFIRM = "confirm"; + private static final String PRESALE = "presale"; + private static final String PRESALE_CANAL = "presaleCanal"; + + @Autowired + private OrderSearchManager orderSearchManager; + @Autowired + private RocketMQTemplate orderNotifyTemplate; + @Autowired + private RocketMQTemplate presaleOrderCanalMqTemplate; + @Autowired + private PurchaseOrderSearchManager purchaseOrderSearchManager; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private OrderRefundFeignClient orderRefundFeignClient; + @DubboReference + private PurchaseOrderFeignClient purchaseOrderFeignClient; + + @Override + public ServerResponseEntity settledOrder() { + //设置查询超时时间 + OrderSearchDTO param = new OrderSearchDTO(); + param.setStatus(OrderStatus.SUCCESS.value()); + param.setIsSettled(0); + Date finallyTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -15)).toJdkDate(); + param.setFinallyTime(finallyTime); + return handleOrder(param, SETTLED); + } + + @Override + public ServerResponseEntity confirmOrder() { + OrderSearchDTO param = new OrderSearchDTO(); + param.setStatus(OrderStatus.CONSIGNMENT.value()); + Date deliveryTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -15)).toJdkDate(); + param.setDeliveryTime(deliveryTime); + return handleOrder(param, CONFIRM); + } + + @Override + public ServerResponseEntity handlerBalanceTimeStartOrder() { + OrderSearchDTO param = new OrderSearchDTO(); + param.setStatus(OrderStatus.WAIT_BALANCE.value()); + param.setPreSaleType(PreSaleType.DEPOSIT.value()); + param.setMaxBalanceAmount(0L); + param.setBalanceStartTime(new Date()); + return handleOrder(param, PRESALE); + } + + @Override + public ServerResponseEntity handleBalanceTimeExpireOrder() { + OrderSearchDTO param = new OrderSearchDTO(); + param.setStatus(OrderStatus.WAIT_BALANCE.value()); + //定金预售 + param.setPreSaleType(PreSaleType.DEPOSIT.value()); + // 尾款金额大于0的订单 + param.setMinBalanceAmount(1L); + param.setBalanceEndTime(new Date()); + return handleOrder(param, PRESALE_CANAL); + } + + @Override + public ServerResponseEntity checkPurchaseOrderPayStatus() { + EsPageDTO esPageDTO = new EsPageDTO(); + esPageDTO.setPageSize(100); + esPageDTO.setPageNum(1); + PurchaseOrderSearchDTO purchaseOrderSearchDTO = new PurchaseOrderSearchDTO(); + // 采购订单状态(0:已作废 1:待入库 2:发货 3:部分入库 4:代付款 5:已完成 4:待审核) + purchaseOrderSearchDTO.setStatus(4); + purchaseOrderSearchDTO.setEndTime(new Date()); + EsPageVO esPurchaseOrderPage = purchaseOrderSearchManager.page(esPageDTO, purchaseOrderSearchDTO); + List purchaseOrderIds = esPurchaseOrderPage.getList().stream().map(EsPurchaseOrderVO::getPurchaseOrderId).collect(Collectors.toList()); + while (esPurchaseOrderPage.getPages() > esPageDTO.getPageNum()) { + esPageDTO.setPageNum(esPageDTO.getPageNum() + 1); + esPurchaseOrderPage = purchaseOrderSearchManager.page(esPageDTO, purchaseOrderSearchDTO); + purchaseOrderIds.addAll(esPurchaseOrderPage.getList().stream().map(EsPurchaseOrderVO::getPurchaseOrderId).toList()); + } + return purchaseOrderFeignClient.updatePurchaseOrderStatus(purchaseOrderIds, StatusEnum.DISABLE.value()); + } + + private ServerResponseEntity handleOrder(OrderSearchDTO param, String type) { + param.setFetchSource(EsConstant.ORDER_TASK_FETCH_SOURCE); + String scrollId = null; + //设置查询超时时间 + Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L)); + SearchRequest searchRequest = orderSearchManager.buildScrollSearchRequest(param, scroll); + try { + // 进行第一次滚动查询 + SearchResponse searchResponse = EsSearchUtil.search(searchRequest); + scrollId = searchResponse.getScrollId(); + /* + 在这个位置已经读到了前一百条数据,可以在这先对这一百数据进行处理。下面滚动查询剩下的数据 + */ + this.sendOrderMq(searchResponse, type); + //记录要滚动的ID + //滚动查询部分,将从第1001笔数据开始取 + SearchHit[] hitsScroll = searchResponse.getHits().getHits(); + while (hitsScroll != null && hitsScroll.length > 0) { + //构造滚动查询条件 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId); + searchScrollRequest.scroll(scroll); + searchResponse = EsSearchUtil.scroll(searchScrollRequest); + scrollId = searchResponse.getScrollId(); + hitsScroll = searchResponse.getHits().getHits(); + // 发送消息 + sendOrderMq(searchResponse, type); + } + } catch (Exception e) { + logger.error("订单结算异常", e); + return ServerResponseEntity.fail(ResponseEnum.EXCEPTION); + } finally { + if (Objects.nonNull(scrollId)) { + //清除滚动,否则影响下次查询 + EsSearchUtil.clearScroll(scrollId); + } + } + return ServerResponseEntity.success(); + } + + private void sendOrderMq(SearchResponse searchResponse, String type) { + List orderChangeShopWalletAmountList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SearchHit hit : searchResponse.getHits().getHits()) { + EsOrderBO esOrderBO = JSON.parseObject(hit.getSourceAsString(), EsOrderBO.class); + OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO = new OrderChangeShopWalletAmountBO(); + orderChangeShopWalletAmountBO.setOrderId(esOrderBO.getOrderId()); + orderChangeShopWalletAmountBO.setPaySysType(esOrderBO.getPaySysType()); + orderChangeShopWalletAmountBO.setShopId(esOrderBO.getShopId()); + orderChangeShopWalletAmountBO.setFreightAmount(esOrderBO.getFreightAmount()); + orderChangeShopWalletAmountBO.setPlatformFreeFreightAmount(esOrderBO.getPlatformFreeFreightAmount()); + orderChangeShopWalletAmountList.add(orderChangeShopWalletAmountBO); + } + if (CollUtil.isEmpty(orderChangeShopWalletAmountList)) { + return; + } + List orderIds = orderChangeShopWalletAmountList.stream().map(OrderChangeShopWalletAmountBO::getOrderId).collect(Collectors.toList()); + // 发送mq消息 + if (StrUtil.equals(type, CONFIRM)) { + ServerResponseEntity serverResponseEntity = orderFeignClient.confirmOrder(orderIds); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } else if (StrUtil.equals(type, SETTLED)) { + handleSettledOrders(orderChangeShopWalletAmountList, orderIds); + } else if (StrUtil.equals(type, PRESALE)) { + orderIds = new ArrayList<>(); + // 判断一下尾款为0且运费为0的才进行订单支付消息发送 + for (OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO : orderChangeShopWalletAmountList) { + if(orderChangeShopWalletAmountBO.getFreightAmount() - orderChangeShopWalletAmountBO.getPlatformFreeFreightAmount() == 0){ + orderIds.add(orderChangeShopWalletAmountBO.getOrderId()); + } + } + if(CollectionUtil.isEmpty(orderIds)){ + return; + } + // 发送消息,订单支付成功 + SendStatus sendStatus = orderNotifyTemplate.syncSend(RocketMqConstant.ORDER_NOTIFY_TOPIC, new GenericMessage<>(new PayNotifyBO(orderIds, null, null, null,null))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } else if (StrUtil.equals(type, PRESALE_CANAL)) { + // 发送消息,订单支付成功 + SendStatus sendStatus = presaleOrderCanalMqTemplate.syncSend(RocketMqConstant.PRESALE_ORDER_CANAL_TOPIC, new GenericMessage<>(orderIds)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + + private void handleSettledOrders(List orderChangeShopWalletAmountList, List orderIds) { + // 获取所有的订单的退款信息, 如果有正在平台介入的不进行结算 + ServerResponseEntity> listServerResponseEntity = orderRefundFeignClient.listOrderRefundByOrderIds(orderIds); + if (!listServerResponseEntity.isSuccess()) { + throw new LuckException(listServerResponseEntity.getMsg()); + } + List refundIds = listServerResponseEntity.getData(); + List filterOrderChangeShopWalletAmountList = new ArrayList<>(Constant.INITIAL_CAPACITY); + filterOrderChangeShopWalletAmountList.addAll(orderChangeShopWalletAmountList); + if(CollectionUtil.isNotEmpty(refundIds)){ + filterOrderChangeShopWalletAmountList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (OrderChangeShopWalletAmountBO orderChangeShopWalletAmountBO : orderChangeShopWalletAmountList) { + if(refundIds.contains(orderChangeShopWalletAmountBO.getOrderId())){ + continue; + } + filterOrderChangeShopWalletAmountList.add(orderChangeShopWalletAmountBO); + } + } + if(CollectionUtil.isEmpty(filterOrderChangeShopWalletAmountList)){ + return; + } + List normalOrderList = filterOrderChangeShopWalletAmountList.stream().filter(orderChangeShopWalletAmountBO -> Objects.equals(orderChangeShopWalletAmountBO.getPaySysType(), PaySysType.DEFAULT.value())).collect(Collectors.toList()); + List allinpayOrderList = filterOrderChangeShopWalletAmountList.stream().filter(orderChangeShopWalletAmountBO -> Objects.equals(orderChangeShopWalletAmountBO.getPaySysType(), PaySysType.ALLINPAY.value())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(allinpayOrderList)) { + ServerResponseEntity serverResponseEntity = orderFeignClient.settledOrderByAllinpay(allinpayOrderList); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + if (CollUtil.isNotEmpty(normalOrderList)) { + ServerResponseEntity serverResponseEntity = orderFeignClient.settledOrder(normalOrderList); + if (!serverResponseEntity.isSuccess()) { + throw new LuckException(serverResponseEntity.getMsg()); + } + } + } + +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchSpuFeignController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchSpuFeignController.java new file mode 100644 index 0000000..c9c468a --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/feign/SearchSpuFeignController.java @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.feign; + + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSON; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.feign.SearchSpuFeignClient; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.product.dto.ProductSearchDTO; +import com.tmerclub.cloud.common.product.dto.ProductSearchLimitDTO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.search.ProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuAdminVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.builder.ProductSearchRequestBuilder; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.manager.ProductOperateManager; +import com.tmerclub.cloud.search.manager.ProductSearchManager; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboService; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchScrollRequest; +import org.elasticsearch.core.TimeValue; +import org.elasticsearch.search.Scroll; +import org.elasticsearch.search.SearchHit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 商品搜索feign连接 + * + * @author YXF + * @date 2020/12/07 + */ +@DubboService +public class SearchSpuFeignController implements SearchSpuFeignClient { + + private static final Logger log = LoggerFactory.getLogger(SearchSpuFeignController.class); + + @Autowired + private ProductSearchManager productSearchManager; + + @Autowired + private ProductOperateManager productOperateManager; + @Autowired + private ProductSearchRequestBuilder productSearchRequestBuilder; + + @Override + public ServerResponseEntity> search(@Valid ProductSearchDTO productSearch) { + Integer lang = I18nMessage.getLang(); + EsPageDTO pageDTO = new EsPageDTO(); + pageDTO.setPageNum(productSearch.getPageNum()); + pageDTO.setPageSize(productSearch.getPageSize()); + return ServerResponseEntity.success(productSearchManager.spuPage(pageDTO, productSearch)); + } + + @Override + public ServerResponseEntity> listSpuBySpuIds(List spuIds) { + if (CollUtil.isEmpty(spuIds)) { + return ServerResponseEntity.success(new ArrayList<>(0)); + } + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setSpuIds(spuIds); + List list = productSearchManager.listSpuBySpuIds(productSearchDTO); + return ServerResponseEntity.success(list); + } + + + @Override + public ServerResponseEntity> spuPage(Integer pageNum, Integer pageSize, Long shopId) { + EsPageDTO pageDTO = new EsPageDTO(); + pageDTO.setPageNum(pageNum); + pageDTO.setPageSize(pageSize); + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + // 平台id则搜索整个平台的商品 + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + productSearchDTO.setShopId(shopId); + } + EsPageVO page = productSearchManager.spuPage(pageDTO, productSearchDTO); + return ServerResponseEntity.success(page); + } + + @Override + public ServerResponseEntity> adminPage(ProductSearchDTO productSearch) { + EsPageDTO pageDTO = new EsPageDTO(); + pageDTO.setPageNum(productSearch.getPageNum()); + pageDTO.setPageSize(productSearch.getPageSize()); + productSearch.setFetchSource(Objects.isNull(productSearch.getShopId()) ? EsConstant.PLATFORM_FETCH_SOURCE : EsConstant.SHOP_FETCH_SOURCE); + EsPageVO adminPage = productSearchManager.adminPage(pageDTO, productSearch); + return ServerResponseEntity.success(adminPage); + } + + @Override + public ServerResponseEntity> limitSpuList(ProductSearchLimitDTO productSearchLimitDTO) { + return ServerResponseEntity.success(productSearchManager.limitSpuList(productSearchLimitDTO)); + } + + @Override + public ServerResponseEntity>> limitSpuMap(ProductSearchLimitDTO productSearchLimitDTO) { + return ServerResponseEntity.success(productSearchManager.limitSpuMap(productSearchLimitDTO)); + } + + @Override + public ServerResponseEntity> listNotDeleteSpu(List spuIds) { + ProductSearchDTO productSearchDTO = new ProductSearchDTO(); + productSearchDTO.setSpuIds(spuIds); + productSearchDTO.setFetchSource(EsConstant.SHOP_FETCH_SOURCE); + return ServerResponseEntity.success(productSearchManager.listSpuBySpuIds(productSearchDTO)); + } + + @Override + public ServerResponseEntity> simpleList(ProductSearchDTO productSearchDTO) { + productSearchDTO.setFetchSource(EsConstant.SIMPLE_FETCH_SOURCE); + List list = productSearchManager.listSpuBySpuIds(productSearchDTO); + return ServerResponseEntity.success(list); + } + + @Override + public ServerResponseEntity> listExcelPlatformSpu(ProductSearchDTO productSearchDTO) { + productSearchDTO.setFetchSource(EsConstant.PLATFORM_EXPORT_FETCH_SOURCE); + productSearchDTO.setAppDisplay(Boolean.FALSE); + String scrollId = null; + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 设置查询超时时间 + Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L)); + SearchRequest searchRequest = productSearchRequestBuilder.buildScrollSearchRequest(productSearchDTO, scroll); + try { + // 进行第一次滚动查询 + SearchResponse searchResponse = EsSearchUtil.search(searchRequest); + scrollId = searchResponse.getScrollId(); + + //记录要滚动的ID + //滚动查询部分,将从第1001笔数据开始取 + SearchHit[] hitsScroll = searchResponse.getHits().getHits(); + for (SearchHit searchHit : hitsScroll) { + SpuSearchVO spuSearchVO = JSON.parseObject(searchHit.getSourceAsString(), SpuSearchVO.class); + result.add(spuSearchVO); + } + while (hitsScroll != null && hitsScroll.length > 0) { + //构造滚动查询条件 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId); + searchScrollRequest.scroll(scroll); + searchResponse = EsSearchUtil.scroll(searchScrollRequest); + scrollId = searchResponse.getScrollId(); + hitsScroll = searchResponse.getHits().getHits(); + + for (SearchHit searchHit : searchResponse.getHits().getHits()) { + SpuSearchVO spuSearchVO = JSON.parseObject(searchHit.getSourceAsString(), SpuSearchVO.class); + result.add(spuSearchVO); + } + } + } catch (Exception e) { + log.error("获取平台商品异常", e); + throw new LuckException("获取平台商品异常"); + } finally { + if (Objects.nonNull(scrollId)) { + //清除滚动,否则影响下次查询 + EsSearchUtil.clearScroll(scrollId); + } + } + return ServerResponseEntity.success(result); + } + +// @Override +// public ServerResponseEntity checkSpuStatus(List spuIds) { +// ProductSearchDTO productSearchDTO = new ProductSearchDTO(); +// productSearchDTO.setSpuIds(spuIds); +// productSearchDTO.setFetchSource(EsConstant.SHOP_FETCH_SOURCE); +// List spuList = productSearchManager.listSpuBySpuIds(productSearchDTO); +// spuList.forEach(spuVO -> { +// if (!Objects.equals(spuVO.getSpuStatus(), StatusEnum.ENABLE.value())) { +// throw new LuckException(ResponseEnum.SPU_STATUS_ERROR, spuVO.getSpuId()); +// } +// }); +// return ServerResponseEntity.success(); +// } + + @Override + public void batchUpdateStockAndSaleNum(List spuList) { + productOperateManager.batchUpdateSpuStockAndSale(spuList); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BrandCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BrandCanalListener.java new file mode 100644 index 0000000..13e4962 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/BrandCanalListener.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.product.feign.BrandFeignClient; +import com.tmerclub.cloud.api.product.feign.ProductFeignClient; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.bo.EsBrandBO; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.vo.BrandLangVO; +import com.tmerclub.cloud.common.product.vo.BrandVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.BrandBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * @author YXF + * @date 2021/01/21 + */ +@Component +public class BrandCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(BrandCanalListener.class); + + @DubboReference + private ProductFeignClient productFeignClient; + @DubboReference + private BrandFeignClient brandFeignClient; + + /** + * 更新品牌 + * @param result + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + BrandBO afterData = result.getAfterData(); + ServerResponseEntity brandResponse = brandFeignClient.getInfo(afterData.getBrandId()); + BrandVO brand = brandResponse.getData(); + EsProductBO esProductBO = new EsProductBO(); + esProductBO.setBrand(new EsBrandBO()); + for (BrandLangVO brandLangVO : brand.getBrandLangList()) { + if (Objects.equals(brandLangVO.getLang(), LanguageEnum.LANGUAGE_ZH_CN.getLang())) { + esProductBO.getBrand().setBrandNameZh(brandLangVO.getName()); + continue; + } + esProductBO.getBrand().setBrandNameEn(brandLangVO.getName()); + } + esProductBO.getBrand().setBrandId(brand.getBrandId()); + esProductBO.getBrand().setBrandImg(afterData.getImgUrl()); + ServerResponseEntity> responseData = productFeignClient.getSpuIdsByBrandId(afterData.getBrandId()); + EsSearchUtil.esUpdateSpuBySpuIds(responseData.getData(), esProductBO); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/CategoryCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/CategoryCanalListener.java new file mode 100644 index 0000000..cec5d9d --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/CategoryCanalListener.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.product.constant.CategoryLevel; +import com.tmerclub.cloud.api.product.feign.CategoryFeignClient; +import com.tmerclub.cloud.api.product.feign.ProductFeignClient; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.LanguageEnum; +import com.tmerclub.cloud.common.product.bo.EsCategoryBO; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.vo.CategoryLangVO; +import com.tmerclub.cloud.common.product.vo.CategoryVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.CategoryBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2020/11/13 + */ +@Component +public class CategoryCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(CategoryCanalListener.class); + + @DubboReference + private CategoryFeignClient categoryFeignClient; + @DubboReference + private ProductFeignClient productFeignClient; + + /** + * 更新分类,删除商品索引,再重新构建一个 + * + * @param result + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + CategoryBO afterData = result.getAfterData(); + boolean updateCategoryName = Objects.equals(Constant.PLATFORM_SHOP_ID, afterData.getShopId()) && afterData.getLevel().equals(CategoryLevel.THIRD.value()); + boolean updateShopCategoryName = !Objects.equals(Constant.PLATFORM_SHOP_ID, afterData.getShopId()) && afterData.getLevel().equals(CategoryLevel.SECOND.value()); + boolean isUpdate = updateCategoryName || updateShopCategoryName; + // 非平台三级分类或商家二级分类,则不需要更改分类名 + if (!isUpdate) { + return; + } + + EsProductBO esProductBO = new EsProductBO(); + ServerResponseEntity categoryResponse = categoryFeignClient.getByCategoryId(afterData.getCategoryId()); + if (!categoryResponse.isSuccess()) { + logger.error("分类id为:{}的分类数据异常", afterData.getCategoryId()); + return; + } + CategoryVO categoryVO = categoryResponse.getData(); + if (CollUtil.isEmpty(categoryVO.getCategoryLangList())) { + logger.error("分类id为:{}的分类国际化数据异常", afterData.getCategoryId()); + return; + } + Map categoryMap = categoryVO.getCategoryLangList().stream().collect(Collectors.toMap(CategoryLangVO::getLang, CategoryLangVO::getName)); + // 平台分类 + if (Objects.equals(Constant.PLATFORM_SHOP_ID, afterData.getShopId()) && afterData.getLevel().equals(CategoryLevel.THIRD.value())) { + esProductBO.setCategory(new EsCategoryBO()); + esProductBO.getCategory().setCategoryNameZh(categoryMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + esProductBO.getCategory().setCategoryNameEn(categoryMap.get(LanguageEnum.LANGUAGE_EN.getLang())); + } + // 商家分类 + else if (!Objects.equals(Constant.PLATFORM_SHOP_ID, afterData.getShopId()) && afterData.getLevel().equals(CategoryLevel.SECOND.value())) { + esProductBO.setShopCategory(new EsCategoryBO()); + esProductBO.getShopCategory().setCategoryNameZh(categoryMap.get(LanguageEnum.LANGUAGE_ZH_CN.getLang())); + esProductBO.getShopCategory().setCategoryNameEn(categoryMap.get(LanguageEnum.LANGUAGE_EN.getLang())); + } + List spuIds = getSpuIdsByCategoryId(afterData); + EsSearchUtil.esUpdateSpuBySpuIds(spuIds, esProductBO); + } + + /** + * 根据分类信息,获取分类下的商品Id列表 + * + * @param category + * @return + */ + private List getSpuIdsByCategoryId(CategoryBO category) { + ServerResponseEntity> spuIdResponse; + // 平台分类 + if (Objects.equals(category.getShopId(), Constant.PLATFORM_SHOP_ID)) { + spuIdResponse = productFeignClient.getSpuIdsByCategoryIds(Collections.singletonList(category.getCategoryId())); + } else { + spuIdResponse = productFeignClient.getSpuIdsByShopCategoryIds(Collections.singletonList(category.getCategoryId())); + } + return spuIdResponse.getData(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/DistributionSpuListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/DistributionSpuListener.java new file mode 100644 index 0000000..650fcc6 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/DistributionSpuListener.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.distribution.feign.DistributionFeignClient; +import com.tmerclub.cloud.api.distribution.vo.DistributionSpuVO; +import com.tmerclub.cloud.common.product.bo.EsDistributionInfoBO; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.DistributionInfoBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Collections; + +/** + * @Author lth + * @Date 2021/8/9 16:55 + */ +@Component +public class DistributionSpuListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(DistributionSpuListener.class); + + @DubboReference + private DistributionFeignClient distributionFeignClient; + + /** + * 新增分销商品 + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + updateDistributionSpuInfo(result.getAfterData().getDistributionSpuId()); + } + + /** + * 更新分销商品 + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + updateDistributionSpuInfo(result.getAfterData().getDistributionSpuId()); + } + + /** + * 删除分销商品 + */ + @Override + protected void processDeleteInternal(CanalBinLogResult result) { + DistributionInfoBO afterData = result.getAfterData(); + EsProductBO esProductBO = new EsProductBO(); + esProductBO.setDistributionSpu(Boolean.FALSE); + esProductBO.setDistributionInfo(null); + EsSearchUtil.esUpdateSpuBySpuIds(Collections.singletonList(afterData.getSpuId()), esProductBO); + } + + /** + * 更新商品的分销信息 + * @param distributionId + */ + private void updateDistributionSpuInfo(Long distributionId) { + ServerResponseEntity distributionRes = distributionFeignClient.getByDistributionId(distributionId); + DistributionSpuVO distributionSpuVO = distributionRes.getData(); + EsProductBO esProductBO = new EsProductBO(); + esProductBO.setDistributionSpu(Boolean.TRUE); + + EsDistributionInfoBO esDistributionInfoBO = new EsDistributionInfoBO(); + esDistributionInfoBO.setDistributionSpuId(distributionSpuVO.getDistributionSpuId()); + esDistributionInfoBO.setState(distributionSpuVO.getState()); + esDistributionInfoBO.setAwardNumbers(distributionSpuVO.getAwardNumbers()); + esDistributionInfoBO.setAwardMode(distributionSpuVO.getAwardMode()); + esDistributionInfoBO.setAwardNumbers(distributionSpuVO.getAwardNumbers()); + esDistributionInfoBO.setParentAwardNumbers(distributionSpuVO.getParentAwardNumbers()); + esDistributionInfoBO.setParentAwardSet(distributionSpuVO.getParentAwardSet()); + esProductBO.setDistributionInfo(esDistributionInfoBO); + + EsSearchUtil.esUpdateSpuBySpuIds(Collections.singletonList(distributionSpuVO.getSpuId()), esProductBO); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderCanalListener.java new file mode 100644 index 0000000..0471d8b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderCanalListener.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.order.bo.EsOrderInvoiceBO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderInvoiceFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.mongodb.bo.order.MongoOrderBO; +import com.tmerclub.cloud.common.order.bo.EsOrderBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.search.bo.OrderBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/13 + */ +@Component +public class OrderCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(OrderCanalListener.class); + + @Autowired + private MongoTemplate mongoTemplate;; + @DubboReference + private OrderFeignClient orderFeignClient; + @DubboReference + private OrderInvoiceFeignClient orderInvoiceFeignClient; + + /** + * 插入订单,此时插入es + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + Long orderId = result.getPrimaryKey(); + EsOrderBO esOrder = getEsOrderData(orderId); + if (Objects.isNull(esOrder)) { + log.error("订单信息异常的订单id为:{}", orderId); + return; + } + EsSearchUtil.esSave(esOrder.getOrderId(), EsIndexEnum.ORDER, esOrder); + } + + /** + * 更新订单数据(同时更新订单对应发票的es数据) + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + OrderBO afterData = result.getAfterData(); + EsOrderBO esOrder = getEsOrderData(afterData.getOrderId()); + if (Objects.isNull(esOrder)) { + log.error("订单信息异常的订单id为:{}", afterData.getOrderId()); + return; + } + EsSearchUtil.esUpdate(esOrder.getOrderId(), EsIndexEnum.ORDER, esOrder); + // 更新发票的es数据 + List esOrderInvoiceBOList = this.getEsOrderInvoiceData(afterData.getOrderId()); + for (EsOrderInvoiceBO esOrderInvoiceBO : esOrderInvoiceBOList) { + if (esOrder.getWaitPurchase() == 1) { + esOrderInvoiceBO.setOrderStatus(OrderStatus.WAIT_PURCHASE.value()); + } + EsSearchUtil.esUpdate(esOrderInvoiceBO.getOrderInvoiceId(), EsIndexEnum.ORDER_INVOICE, esOrderInvoiceBO); + } + } + + private EsOrderBO getEsOrderData(Long orderId) { + EsOrderBO esOrderBO = orderFeignClient.getEsOrderInfo(orderId); + if (Objects.isNull(esOrderBO)) { + return null; + } + // 保存订单数据到mongodb + MongoOrderBO mongoOrderBO = BeanUtil.map(esOrderBO, MongoOrderBO.class); + mongoTemplate.save(mongoOrderBO); + // 添加es中保存的订单数据 + return esOrderBO; + } + + /** + * 获取订单发票的es数据 + * + * @param orderId + * @return + */ + private List getEsOrderInvoiceData(Long orderId) { + ServerResponseEntity> response = orderInvoiceFeignClient.listEsOrderInvoiceByOrderId(orderId); + if (!response.isSuccess()) { + throw new LuckException(response.getMsg()); + } + return response.getData(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderInvoiceCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderInvoiceCanalListener.java new file mode 100644 index 0000000..463ed51 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/OrderInvoiceCanalListener.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.order.bo.EsOrderInvoiceBO; +import com.tmerclub.cloud.api.order.feign.OrderInvoiceFeignClient; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.OrderInvoiceBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/13 + */ +@Component +public class OrderInvoiceCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(OrderInvoiceCanalListener.class); + + @DubboReference + private OrderInvoiceFeignClient orderInvoiceFeignClient; + + /** + * 插入商品,此时插入es + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + Long orderInvoiceId = result.getPrimaryKey(); + EsOrderInvoiceBO esOrder = getEsOrderInvoiceData(orderInvoiceId); + if (Objects.isNull(esOrder)) { + log.error("订单发票信息异常的订单id为:{}", orderInvoiceId); + return; + } + EsSearchUtil.esSave(esOrder.getOrderInvoiceId(), EsIndexEnum.ORDER_INVOICE, esOrder); + } + + /** + * 更新订单数据 + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + OrderInvoiceBO afterData = result.getAfterData(); + EsOrderInvoiceBO esOrder = getEsOrderInvoiceData(afterData.getOrderInvoiceId()); + if (Objects.isNull(esOrder)) { + log.error("订单发票信息异常的订单id为:{}", afterData.getOrderInvoiceId()); + return; + } + EsSearchUtil.esUpdate(esOrder.getOrderInvoiceId(), EsIndexEnum.ORDER_INVOICE, esOrder); + } + + private EsOrderInvoiceBO getEsOrderInvoiceData(Long orderInvoiceId) { + ServerResponseEntity orderResponseEntity = orderInvoiceFeignClient.getEsOrderInvoice(orderInvoiceId); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + // 添加es中保存的订单数据 + return orderResponseEntity.getData(); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuCanalListener.java new file mode 100644 index 0000000..8a696dc --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuCanalListener.java @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.combo.feign.ComboFeignClient; +import com.tmerclub.cloud.api.group.feign.GroupFeignClient; +import com.tmerclub.cloud.api.live.feign.LiveFeignClient; +import com.tmerclub.cloud.api.multishop.feign.IndexImgFeignClient; +import com.tmerclub.cloud.api.product.dto.SupplierSpuUpdateDTO; +import com.tmerclub.cloud.api.product.feign.*; +import com.tmerclub.cloud.api.seckill.feign.SeckillFeignClient; +import com.tmerclub.cloud.api.user.feign.PopupFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.GroupCacheNames; +import com.tmerclub.cloud.common.cache.constant.ProductCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.constant.SalesType; +import com.tmerclub.cloud.common.product.constant.SpuType; +import com.tmerclub.cloud.common.product.constant.SupplierSpuType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.SpuBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.action.delete.DeleteResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/13 + */ +@Component +public class SpuCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(SpuCanalListener.class); + + @Autowired + private RestHighLevelClient restHighLevelClient; + + @DubboReference + private ProductFeignClient productFeignClient; + + @DubboReference + private SpuFeignClient spuFeignClient; + + @DubboReference + private ComboFeignClient comboFeignClient; + + @DubboReference + private GiveawayFeignClient giveawayFeignClient; + + @DubboReference + private IndexImgFeignClient indexImgFeignClient; + + @DubboReference + private GroupFeignClient groupFeignClient; + + @DubboReference + private SeckillFeignClient seckillFeignClient; + + @DubboReference + private LiveFeignClient liveFeignClient; + + @DubboReference + private PopupFeignClient popupFeignClient; + + /** + * 插入商品,此时插入es + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + Long spuId = result.getPrimaryKey(); + ServerResponseEntity esProductResponse = productFeignClient.loadEsProductBO(spuId); + if (!esProductResponse.isSuccess()) { + log.error("商品id为:{}的商品数据异常!", spuId); + return; + } + EsProductBO esProductBO = esProductResponse.getData(); + //为团购商品获取商品活动最低价对应的sku原价 + if (esProductBO.getSpuType() == 1) { + //获取活动sku最低价 + Object priceFree = RedisUtil.get(CacheNames.GROUP_SPU_PRICE_FREE + esProductBO.getActivityId()); + if (!Objects.isNull(priceFree)) { + esProductBO.setPriceFee(Long.valueOf(priceFree.toString())); + //移除 + RedisUtil.del(CacheNames.GROUP_SPU_PRICE_FREE + esProductBO.getActivityId()); + } + } + EsSearchUtil.esSave(esProductBO.getSpuId(), EsIndexEnum.PRODUCT, esProductBO); + removeCache(esProductBO); + } + + /** + * 更新商品,删除商品索引,再重新构建一个 + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + SpuBO afterData = result.getAfterData(); + SpuBO beforeData = result.getBeforeData(); + this.handleStatusChange(afterData, beforeData.getStatus()); + if (!Objects.isNull(beforeData.getPriceFee())) { + log.info("更新代销商品价格,spuId:{}", afterData.getSpuId()); + // 更新代销商品价格 + spuFeignClient.soldOutSpuBySpu(afterData.getSpuId(), afterData.getPriceFee(), afterData.getMarketPriceFee()); + } + + // 供应商品更新品牌或者排序时,需要同步更新代销商品的品牌或排序 + if (Objects.nonNull(beforeData.getBrandId()) || Objects.nonNull(beforeData.getSeq())) { + Long brandId = -1L; + Integer seq = -1; + if (Objects.nonNull(beforeData.getBrandId())) { + brandId = afterData.getBrandId(); + } + if (Objects.nonNull(beforeData.getSeq())) { + seq = afterData.getSeq(); + } + spuFeignClient.syncUpdateCommissionSpuBrandOrSeq(brandId, seq, afterData.getSpuId()); + } + // 删除数据 + DeleteRequest request = new DeleteRequest(EsIndexEnum.PRODUCT.value(), String.valueOf(result.getPrimaryKey())); + try { + DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT); + if (!Objects.isNull(beforeData.getStatus()) && Objects.equals(afterData.getSupplierSpuType(), SupplierSpuType.YES.value())) { + Object skuDelete = RedisUtil.get(ProductCacheNames.SKU_STATUS_DELETE + afterData.getSpuId()); + if (Objects.isNull(skuDelete)) { + log.info("供应商商品状态改变时同步改变商家发布的供应商品,spuId:{}", afterData.getSpuId()); + //供应商商品状态改变时同步改变商家发布的供应商品 + spuFeignClient.supplierUpdateSpuStatus(afterData.getSpuId(), afterData.getStatus()); + } + } + // 更新代销商品状态 + this.supplierUpdateSkuStatus(afterData, beforeData); + log.info(deleteResponse.toString()); + // 保存es商品信息,删除的商品也要存一下,装修接口使用 + this.processInsertInternal(result); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("更新es信息异常", e); + } + } + + /** + * 清除商品关联的缓存 + * + * @param esProductBO + */ + private void removeCache(EsProductBO esProductBO) { + // keys不能使用Arrays.asList生成,Arrays.asList生成的ArrayList是内部类没有实现add方法 + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + keys.add(CacheNames.SKU_WITH_ATTR_LIST_KEY + CacheNames.UNION + esProductBO.getSpuId()); + keys.add(CacheNames.SPU_KEY + CacheNames.UNION + esProductBO.getSpuId()); + keys.add(CacheNames.SPU_EXTENSION_KEY + CacheNames.UNION + esProductBO.getSpuId()); + keys.add(CacheNames.SPU_DETAIL_KEY + CacheNames.UNION + esProductBO.getSpuId()); + keys.add(CacheNames.SPU_ATTR_VALUE_KEY + CacheNames.UNION + esProductBO.getSpuId()); + keys.add(CacheNames.SPU_ACTIVITY_KEY + CacheNames.UNION + esProductBO.getSpuId()); + keys.add(GroupCacheNames.GROUP_BY_SPU_KEY + CacheNames.UNION + esProductBO.getSpuId()); + if (CollUtil.isNotEmpty(esProductBO.getTagIds())) { + keys.add(CacheNames.SPU_TAG_BY_SHOP + CacheNames.UNION + Constant.PLATFORM_SHOP_ID); + } + // 批量删除与商品关联的缓存信息 + RedisUtil.deleteBatch(keys); + } + + /** + * 商品状态发生改变时,需要处理的事件 + * + * @param spuBO 修改后的商品数据 + * @param oldStatus 修改前的商品状态 + */ + private void handleStatusChange(SpuBO spuBO, Integer oldStatus) { + // 状态没有发生改变或者不是变更未下线、下架、删除状态,则不进行处理 + if (Objects.isNull(oldStatus)) { + return; + } + + productFeignClient.handleStatusChange(spuBO.getSpuId()); + if (!StatusEnum.offlineStatus(spuBO.getStatus())) { + return; + } + boolean isTrue = (Objects.equals(spuBO.getStatus(), StatusEnum.DISABLE.value()) || Objects.equals(spuBO.getStatus(), StatusEnum.OFFLINE.value())) + && !Objects.equals(spuBO.getSpuType(), SpuType.SCORE.value()); + if (isTrue) { + log.info("不是积分商品下架,处理相关活动: {}", spuBO.getSpuId()); + // 下架商品时如果商品在套餐活动中且为主商品则失效套餐活动,赠品同样 + comboFeignClient.offComboMainSpu(spuBO.getSpuId()); + giveawayFeignClient.changeGiveawayStatus(spuBO.getSpuId()); + if (!Objects.equals(SpuType.ACTIVE.value(), spuBO.getSpuType())) { + // 失效拼团和秒杀活动 + groupFeignClient.updateGroupActivityStatus(spuBO.getSpuId()); + seckillFeignClient.offlineSeckillBySpuIds(Arrays.asList(spuBO.getSpuId()),true); + } + //切换轮播图 + indexImgFeignClient.udpateIndexImgBySpuId(spuBO.getSpuId(), spuBO.getShopId()); + // 直播活动 + liveFeignClient.deleteLiveRoomProd(spuBO.getSpuId()); + // 弹窗广告 + popupFeignClient.deletePopupProd(spuBO.getSpuId(), spuBO.getShopId()); + } + giveawayFeignClient.changeGiveawaySpuStatus(spuBO.getSpuId()); + comboFeignClient.removeComboSpuCache(spuBO.getSpuId()); + + } + + + /** + * 检查供应商sku状态是否改变,改变对代销商品进行下架 + */ + private void supplierUpdateSkuStatus(SpuBO afterData, SpuBO beforeData) { + // 非供应商商品,不需要判断 + if (!Objects.equals(afterData.getSupplierSpuType(), SupplierSpuType.YES.value())) { + return; + } + // 供应商是否修改商品相关信息 + Object spuUpdateInfo = RedisUtil.get(ProductCacheNames.SUPPLIER_SPU_UPDATE_STATUS + afterData.getSpuId()); + if (Objects.isNull(spuUpdateInfo)) { + RedisUtil.del(ProductCacheNames.SUPPLIER_SPU_UPDATE_STATUS + afterData.getSpuId()); + return; + } + SupplierSpuUpdateDTO updateInfo = (SupplierSpuUpdateDTO) spuUpdateInfo; + // 价格没变化,sku没变化,不进行下架 + if (!(updateInfo.isPriceUpdate() || updateInfo.isSkuUpdate())) { + RedisUtil.del(ProductCacheNames.SUPPLIER_SPU_UPDATE_STATUS + afterData.getSpuId()); + return; + } + //供应商sku禁用状态是否改变 + Object enable = RedisUtil.get(ProductCacheNames.SKU_STATUS_ENABLE + afterData.getSpuId()); + Object skuDelete = RedisUtil.get(ProductCacheNames.SKU_STATUS_DELETE + afterData.getSpuId()); + if (Objects.isNull(enable)) { + if (Objects.isNull(skuDelete)) { + // 供应商变更了商品信息,下架手动设价的代销商品,商家自行发货的不下价 + log.info("下架手动设价的代销商品,spuId:{}", afterData.getSpuId()); + spuFeignClient.soldOutManualPriceCommissionSpu(afterData.getSpuId(), SalesType.MANUAL_OPERATION_PRICE.value(), 1); + } + RedisUtil.del(ProductCacheNames.SKU_STATUS_DELETE + afterData.getSpuId()); + } else { + if (!Objects.isNull(enable)) { + //sku启用,下架手动设价 + log.info("sku启用,下架手动设价,spuId:{}", afterData.getSpuId()); + spuFeignClient.soldOutManualPriceCommissionSpu(afterData.getSpuId(), SalesType.MANUAL_OPERATION_PRICE.value(), -1); + RedisUtil.del(ProductCacheNames.SKU_STATUS_ENABLE + afterData.getSpuId()); + } + } + RedisUtil.del(ProductCacheNames.SKU_STATUS_DELETE + afterData.getSpuId()); + RedisUtil.del(ProductCacheNames.SUPPLIER_SPU_UPDATE_STATUS + afterData.getSpuId()); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuExtensionCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuExtensionCanalListener.java new file mode 100644 index 0000000..41bd928 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuExtensionCanalListener.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.bo.SpuExtensionBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.xcontent.XContentType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/11/13 + */ +@Component +public class SpuExtensionCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(SpuExtensionCanalListener.class); + + @Autowired + private RestHighLevelClient restHighLevelClient; + + /** + * 插入商品,此时插入es + */ + @Override + protected void processInsertInternal(CanalBinLogResult result) { + } + + /** + * 更新商品,删除商品索引,再重新构建一个 + */ + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + + // 更新之后的数据 + SpuExtensionBO afterData = result.getAfterData(); + + // 清除商品扩展信息缓存 + List keys = new ArrayList<>(3); + keys.add(CacheNames.SPU_EXTENSION_KEY + CacheNames.UNION + afterData.getSpuId()); + RedisUtil.deleteBatch(keys); + + UpdateRequest request = new UpdateRequest(EsIndexEnum.PRODUCT.value(), String.valueOf(afterData.getSpuId())); + EsProductBO esProductBO = new EsProductBO(); + esProductBO.setSpuId(afterData.getSpuId()); + // 更新注水销量和评论数量 + esProductBO.setWaterSoldNum(afterData.getWaterSoldNum()); + esProductBO.setCommentNum(afterData.getCommentNum()); + request.doc(Json.toJsonString(esProductBO), XContentType.JSON); + try { + UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT); + log.info(updateResponse.toString()); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("更新es信息异常", e); + } + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuTagCanalListener.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuTagCanalListener.java new file mode 100644 index 0000000..21799aa --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/listener/SpuTagCanalListener.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.listener; + +import com.tmerclub.cloud.api.product.feign.ProductFeignClient; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.bo.SpuTagBO; +import com.tmerclub.cloud.search.canal.model.CanalBinLogResult; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + + +/** + * @author YXF + * @date 2021/01/21 + */ +@Component +public class SpuTagCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor { + + private static final Logger log = LoggerFactory.getLogger(SpuTagCanalListener.class); + + @DubboReference + private ProductFeignClient productFeignClient; + @Autowired + private CacheManagerUtil cacheManagerUtil; + + @Override + protected void processInsertInternal(CanalBinLogResult result) { + updateSpuTagData(result); + } + + @Override + protected void processUpdateInternal(CanalBinLogResult result) { + SpuTagBO beforeData = result.getBeforeData(); + if (Objects.isNull(beforeData.getSeq())) { + return; + } + updateSpuTagData(result); + } + + @Override + protected void processDeleteInternal(CanalBinLogResult result) { + updateSpuTagData(result); + } + + private void updateSpuTagData(CanalBinLogResult result) { + SpuTagBO afterData = result.getAfterData(); + cacheManagerUtil.evictCache(CacheNames.SPU_TAG_BY_SHOP, afterData.getShopId().toString()); + + ServerResponseEntity> spuTagResponse = productFeignClient.getSpuTagBySpuId(afterData.getSpuId()); + if (!spuTagResponse.isSuccess()) { + throw new LuckException(spuTagResponse.getMsg()); + } + EsProductBO esProductBO = new EsProductBO(); + esProductBO.setTagIds(spuTagResponse.getData()); + List spuIds = Collections.singletonList(afterData.getSpuId()); + EsSearchUtil.esUpdateSpuBySpuIds(spuIds, esProductBO); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderInvoiceSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderInvoiceSearchManager.java new file mode 100644 index 0000000..0f2e5c7 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderInvoiceSearchManager.java @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.manager; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderInvoiceSearchDTO; +import com.tmerclub.cloud.common.order.vo.EsOrderInvoiceVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@Component +public class OrderInvoiceSearchManager { + + private static final Logger log = LoggerFactory.getLogger(OrderInvoiceSearchManager.class); + + @Autowired + private RestHighLevelClient restHighLevelClient; + + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param orderInvoiceSearchDTO 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO page(EsPageDTO pageDTO, OrderInvoiceSearchDTO orderInvoiceSearchDTO) { + orderInvoiceSearchDTO.setPageSize(pageDTO.getPageSize()); + orderInvoiceSearchDTO.setPageNum(pageDTO.getPageNum()); + return pageSearchResult(orderInvoiceSearchDTO); + } + + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param orderInvoiceSearchDTO 退款订单搜索条件 + * @return 搜索结果 + */ + public EsPageVO pageSearchResult(OrderInvoiceSearchDTO orderInvoiceSearchDTO) { + if (Objects.isNull(orderInvoiceSearchDTO.getPageSize())) { + orderInvoiceSearchDTO.setPageSize(10); + } + if (Objects.isNull(orderInvoiceSearchDTO.getPageNum())) { + orderInvoiceSearchDTO.setPageNum(1); + } + //1、查询订单数据 + SearchResponse response = searchResult(orderInvoiceSearchDTO); + //2.处理响应的数据 + return pageEsOrderBO(response, orderInvoiceSearchDTO.getPageSize()); + } + + private EsPageVO pageEsOrderBO(SearchResponse response, Integer pageSize) { + EsPageVO pageVO = new EsPageVO<>(); + List orderInvoiceList = getOrderInvoiceListByResponse(response.getHits().getHits()); + pageVO.setList(orderInvoiceList); + buildSearchPage(pageVO, response, pageSize); + return pageVO; + } + + /** + * 构建分页数据 + * + * @param esPageVO + * @param response + * @param pageSize + */ + private void buildSearchPage(EsPageVO esPageVO, SearchResponse response, Integer pageSize) { + //总记录数 + long total = response.getHits().getTotalHits().value; + esPageVO.setTotal(total); + // 总页码 + int totalPages = (int) total % pageSize == 0 ? + (int) total / pageSize : ((int) total / pageSize + 1); + esPageVO.setPages(totalPages); + } + + private SearchResponse searchResult(OrderInvoiceSearchDTO orderInvoiceSearchDTO) { + // 封装检索条件 + SearchResponse response; + SearchRequest searchRequest = buildSearchRequest(orderInvoiceSearchDTO); + try { + //2、执行检索请求 + response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + + log.info("搜索返回结果:{}", response.toString()); + + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("搜索服务出了点小差,请稍后再试", e); + } + return response; + } + + /** + * 从es返回的数据中获取spu列表 + * + * @param hits es返回的数据 + * @return + */ + private List getOrderInvoiceListByResponse(SearchHit[] hits) { + List orderInvoiceList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SearchHit hit : hits) { + EsOrderInvoiceVO esOrderInvoiceVO = Json.parseObject(hit.getSourceAsString(), EsOrderInvoiceVO.class); + orderInvoiceList.add(esOrderInvoiceVO); + } + return orderInvoiceList; + } + + + /** + * 准备检索请求 + * + * @param param 搜索参数 + * @return + */ + private SearchRequest buildSearchRequest(OrderInvoiceSearchDTO param) { + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 过滤 + filterQueryIfNecessary(param, boolQueryBuilder); + + // 排序 + sort(searchSourceBuilder, boolQueryBuilder); + + if (Objects.nonNull(param.getPageNum()) && Objects.nonNull(param.getPageSize())) { + //分页 + searchSourceBuilder.size(param.getPageSize()); + searchSourceBuilder.from((param.getPageNum() - 1) * param.getPageSize()); + } + + log.info("构建的订单发票DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.ORDER_INVOICE.value()}, searchSourceBuilder); + } + + + /** + * 进行排序 + */ + private void sort(SearchSourceBuilder searchSourceBuilder, BoolQueryBuilder boolQueryBuilder) { + searchSourceBuilder.sort("applicationTime", SortOrder.DESC); + searchSourceBuilder.query(boolQueryBuilder); + } + + /** + * 过滤查询条件,如果有必要的话 + * + * @param param 查询条件 + * @param boolQueryBuilder 组合进boolQueryBuilder + */ + private void filterQueryIfNecessary(OrderInvoiceSearchDTO param, BoolQueryBuilder boolQueryBuilder) { + // 店铺id + if (Objects.nonNull(param.getShopId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("shopId", param.getShopId())); + } + // 供应商id + if (Objects.nonNull(param.getSupplierId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("supplierId", param.getSupplierId())); + boolQueryBuilder.filter(QueryBuilders.termQuery("shopId", 0L)); + } + // 订单id + if (Objects.nonNull(param.getOrderId())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("orderId", param.getOrderId())); + } + boolQueryBuilder.must(QueryBuilders.existsQuery("orderStatus")); + // 发票状态 + if (Objects.nonNull(param.getInvoiceState())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("invoiceState", param.getInvoiceState())); + } + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderScrollSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderScrollSearchManager.java new file mode 100644 index 0000000..dd9723b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/OrderScrollSearchManager.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.manager; + +import org.elasticsearch.client.RestHighLevelClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author FrozenWatermelon + * @date 2020/11/16 + */ +@Component +public class OrderScrollSearchManager { + + private static final Logger log = LoggerFactory.getLogger(OrderScrollSearchManager.class); + + /** 最大分页数 */ + private static final Integer MAX_PAGE_SIZE = 5000; + + + @Autowired + private RestHighLevelClient restHighLevelClient; + + +// /** +// * 通过搜索信息分页搜索es数据的信息 +// * +// * @param orderSearchDTO 订单搜索条件 +// * @return 搜索结果 +// */ +// public List listSearchResult(OrderSearchDTO orderSearchDTO) { +// // 处理支付类型 +// if(Objects.nonNull(orderSearchDTO.getPayType())) { +// addPayTypeList(orderSearchDTO); +// } +// // 查询订单数据 +// SearchResponse response = searchResult(orderSearchDTO); +// // 处理响应的数据 +// List result = getEsOrderBOList(response); +// return result; +// +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/util/EsSearchUtil.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/util/EsSearchUtil.java new file mode 100644 index 0000000..2059291 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/util/EsSearchUtil.java @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.search.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.bo.EsProductBO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchUpdateVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import org.apache.lucene.search.join.ScoreMode; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.action.search.*; +import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; +import org.elasticsearch.script.Script; +import org.elasticsearch.script.ScriptType; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; +import org.elasticsearch.search.aggregations.metrics.TopHitsAggregationBuilder; +import org.elasticsearch.xcontent.XContentType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.util.*; + +/** + * @author YXF + * @date 2021/07/29 + */ +@Component +public class EsSearchUtil { + + private static final Logger log = LoggerFactory.getLogger(EsSearchUtil.class); + private static RestHighLevelClient restHighLevelClient; + + /** + * 正常来说普通方法才是属于实体对象(也就是New出来的对象)的,spring注入是在容器中实例化对象,静态变量是无法注入的 + * 所以需要通过构造方法的方式来进行注入,或者使用@PostConstruct注解 + */ + @Autowired + private EsSearchUtil(RestHighLevelClient restHighLevelClient) { + EsSearchUtil.restHighLevelClient = restHighLevelClient; + } + + private EsSearchUtil() { + } + + + public static void esSave(Long id, EsIndexEnum esIndexEnum, Object data) { + IndexRequest request = new IndexRequest(esIndexEnum.value()); + request.id(String.valueOf(id)); + request.source(Json.toJsonString(data), XContentType.JSON); + try { + IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT); + log.info("es插入结果, {}", indexResponse.toString()); + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("保存es信息异常", e); + } + } + + + public static void esUpdateSpuBySpuIds(List spuIds, EsProductBO esProductBO) { + if (CollUtil.isEmpty(spuIds)) { + return; + } + String source = Json.toJsonString(esProductBO); + try { + BulkRequest request = new BulkRequest(); + // 准备更新的数据 + for (Long spuId : spuIds) { + request.add(new UpdateRequest(EsIndexEnum.PRODUCT.value(), String.valueOf(spuId)).doc(source, XContentType.JSON)); + } + //更新 + BulkResponse bulkResponse = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + if (bulkResponse.hasFailures()) { + throw new LuckException(bulkResponse.buildFailureMessage()); + } + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (Exception e) { + throw new LuckException(e.getMessage()); + } + } + + + /** + * + */ + public static SearchResponse search(SearchRequest searchRequest) { + SearchResponse response; + try { + //2、执行检索请求 + response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + log.info("搜索返回结果:{}", response.toString()); + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("搜索服务出了小差,请稍后再试", e); + } + return response; + } + + + /** + * + */ + public static QueryBuilder termsQueryByArray(String name, String data) { + List list = StrUtil.split(data, Constant.COMMA); + return QueryBuilders.termsQuery(name, list); + } + + + /** + * + */ + public static QueryBuilder nestedQuery(String nestedName, String name, Long data) { + return nestedQuery(nestedName, name, data.toString()); + } + + /** + * + */ + public static QueryBuilder nestedQuery(String nestedName, String name, String data) { + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.should(QueryBuilders.termsQuery(name, data)); + return QueryBuilders.nestedQuery(nestedName, boolQuery, ScoreMode.None); + } + + @SuppressWarnings("rawtypes") + public static QueryBuilder nestedQuery(String nestedName, String name, List list) { + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.should(QueryBuilders.termsQuery(name, list)); + return QueryBuilders.nestedQuery(nestedName, boolQuery, ScoreMode.None); + } + + /** + * + */ + public static QueryBuilder nestedQueryByArray(String nestedName, String name, String data) { + String[] ids = data.split(Constant.COMMA); + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + for (String brandId : ids) { + boolQuery.should(QueryBuilders.termsQuery(name, brandId)); + } + return QueryBuilders.nestedQuery(nestedName, boolQuery, ScoreMode.None); + } + + /** + * + */ + public static RangeQueryBuilder rangeQuery(String name, Long minValue, Long maxValue) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(name); + if (Objects.nonNull(minValue)) { + rangeQueryBuilder.gte(minValue); + } + if (Objects.nonNull(maxValue)) { + rangeQueryBuilder.lte(maxValue); + } + return rangeQueryBuilder; + } + + /** + * + */ + public static NestedAggregationBuilder nestedAggregation(String nestedName, String fieldName, String name) { + return nestedAggregation(nestedName, fieldName, name, null, null); + } + + /** + * + */ + public static NestedAggregationBuilder nestedAggregation(String nestedName, String fieldName, String name, String[] fetchSource) { + return nestedAggregation(nestedName, fieldName, name, fetchSource, null); + } + + /** + * + */ + public static NestedAggregationBuilder nestedAggregation(String nestedName, String fieldName, String name, Integer size) { + return nestedAggregation(nestedName, fieldName, name, null, size); + } + + /** + * + */ + public static NestedAggregationBuilder nestedAggregation(String nestedName, String fieldName, String name, String[] fetchSource, Integer size) { + if (Objects.isNull(size)) { + size = 1; + } + NestedAggregationBuilder nested = AggregationBuilders.nested(nestedName, nestedName); + TermsAggregationBuilder terms = AggregationBuilders.terms(name).field(fieldName).size(10); + TopHitsAggregationBuilder topHits = AggregationBuilders + .topHits(EsConstant.TOP_HITS_DATA) + .size(size); + // 指定响应的数据字段 + if (ArrayUtil.isNotEmpty(fetchSource)) { + topHits.fetchSource(fetchSource, null); + } + terms.subAggregation(topHits); + nested.subAggregation(terms); + return nested; + } + + public static void esUpdate(Long id, EsIndexEnum esIndexEnum, Object data) { + try { + UpdateRequest request = new UpdateRequest(esIndexEnum.value(), String.valueOf(id)).retryOnConflict(3); + // 存在就更新,不存就保存 + request.docAsUpsert(true); + request.doc(Json.toJsonString(data), XContentType.JSON); + UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT); + log.info("es更新结果, {}", updateResponse.toString()); + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("更新es信息异常", e); + } + } + + /** + * 滚动检索 + */ + public static SearchResponse scroll(SearchScrollRequest searchScrollRequest) { + SearchResponse response; + try { + //2、执行检索请求 + response = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT); + + log.debug("滚动搜索返回结果:{}", response.toString()); + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("滚动搜索服务出了点小差,请稍后再试", e); + } + return response; + } + + /** + * 删除滚动 + */ + public static void clearScroll(String scrollId) { + + ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); + clearScrollRequest.addScrollId(scrollId); + ClearScrollResponse clearScrollResponse; + try { + //2、执行检索请求 + clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT); + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (IOException e) { + log.error(e.toString()); + throw new LuckException("删除滚动服务出了点小差,请稍后再试", e); + } + if (!clearScrollResponse.isSucceeded()) { + log.error("删除滚动返回结果:{}", clearScrollResponse); + throw new LuckException(""); + } + clearScrollResponse.isSucceeded(); + } + + /** + * 批量更新商品库存 + */ + public static void changeSpuStockBatch(List esSpuList) { + if (CollUtil.isEmpty(esSpuList)) { + return; + } + Map map = new HashMap<>(esSpuList.size()); + for (SpuSearchUpdateVO esSpuUpdate : esSpuList) { + String code = "= "; + Script script = new Script(ScriptType.INLINE, + "painless", + "ctx._source.stock " + code + esSpuUpdate.getCount(), + Collections.emptyMap()); + map.put(esSpuUpdate.getSpuId(), script); + } + updateStockByPainless(map); + } + + public static void updateStockByPainless(Map spuMap) { + BulkRequest request = new BulkRequest(); + spuMap.forEach((spuId, script) -> { + UpdateRequest updateRequest = new UpdateRequest(EsIndexEnum.PRODUCT.value(), String.valueOf(spuId)); + updateRequest.script(script); + request.add(updateRequest); + }); + try { + BulkResponse bulkResponse = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + log.info("painless脚本更新商品{}", Json.toJsonString(bulkResponse)); + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (IOException e) { + log.error("更新es商品库存信息异常信息:{},商品信息:{}", e, spuMap); + throw new LuckException("更新es商品库存信息异常信息 " + e); + } + } + + public static void updateByPainless(Map map, String indexName) { + BulkRequest request = new BulkRequest(); + map.forEach((id, script) -> { + UpdateRequest updateRequest = new UpdateRequest(indexName, String.valueOf(id)); + updateRequest.script(script); + request.add(updateRequest); + }); + try { + BulkResponse bulkResponse = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); + log.info("painless脚本执行的索引:{}, 数据:{}", indexName, bulkResponse); + } catch (SocketTimeoutException e) { + log.error("es连接超时", e); + throw new LuckException("当前请求人数太多,请稍后重试"); + } catch (IOException e) { + log.error("更新es索引:{}, 异常信息:{},商品信息:{}", indexName, e, map); + throw new LuckException("更新es商品库存信息异常信息 " + e); + } + } +} diff --git a/tmerclub-search/src/main/resources/logback.xml b/tmerclub-search/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-search/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-seckill/pom.xml b/tmerclub-seckill/pom.xml new file mode 100644 index 0000000..d506475 --- /dev/null +++ b/tmerclub-seckill/pom.xml @@ -0,0 +1,78 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-seckill + mall4cloud 秒杀服务 + jar + + + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-api-seckill + ${project.version} + + + com.xuxueli + xxl-job-core + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/SeckillCacheTtlAdapter.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/SeckillCacheTtlAdapter.java new file mode 100644 index 0000000..af4c214 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/SeckillCacheTtlAdapter.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.config; + +import com.tmerclub.cloud.common.cache.adapter.CacheTtlAdapter; +import com.tmerclub.cloud.common.cache.bo.CacheNameWithTtlBO; +import com.tmerclub.cloud.common.cache.constant.SeckillCacheNames; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2020/12/18 + */ +@Component +public class SeckillCacheTtlAdapter implements CacheTtlAdapter { + + @Override + public List listCacheNameWithTtl() { + List cacheNameWithTtls = new ArrayList<>(4); + // 秒杀库存信息缓存10秒 + cacheNameWithTtls.add(new CacheNameWithTtlBO(SeckillCacheNames.SECKILL_SKU_BY_SECKILL_ID, 10)); + cacheNameWithTtls.add(new CacheNameWithTtlBO(SeckillCacheNames.SECKILL_SKU_BY_ID, 10)); + cacheNameWithTtls.add(new CacheNameWithTtlBO(SeckillCacheNames.SECKILL_BY_SECKILL_ID, 10)); + cacheNameWithTtls.add(new CacheNameWithTtlBO(SeckillCacheNames.SECKILL_BY_SPU_ID, 10)); + return cacheNameWithTtls; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/XxlJobConfig.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/XxlJobConfig.java new file mode 100644 index 0000000..7a5ee2d --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/config/XxlJobConfig.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.config; + +import com.tmerclub.cloud.common.constant.Constant; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private static final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${mall4cloud.job.admin.addresses}") + private String adminAddresses; + + @Value("${mall4cloud.job.accessToken}") + private String accessToken; + + @Value("${mall4cloud.job.logPath}") + private String logPath; + + @Value("${spring.application.name}") + private String appname; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname + Constant.DASHED_ENV); + // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP + xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); + xxlJobSpringExecutor.setPort(port + 1000); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(3); + return xxlJobSpringExecutor; + } + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SeckillStatusEnum.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SeckillStatusEnum.java new file mode 100644 index 0000000..57560c1 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/constant/SeckillStatusEnum.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.constant; + +/** + * 秒杀活动状态 + * + * @author lhd + * @date 2021/04/01 + */ +public enum SeckillStatusEnum { + + /** + * 删除 (逻辑删除) + */ + DELETE(-1), + + /** + * 禁用/过期/下架 + */ + DISABLE(0), + + /** + * 启用/未过期/上架 + */ + ENABLE(1), + + /** + * 违规下架 + */ + OFFLINE(2), + + /** + * 等待审核 + */ + WAIT_AUDIT(3); + + private final Integer value; + + public Integer value() { + return value; + } + + SeckillStatusEnum(Integer value) { + this.value = value; + } + + public static Boolean offlineStatus(Integer value) { + SeckillStatusEnum[] enums = values(); + for (SeckillStatusEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/admin/SeckillCategoryController.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/admin/SeckillCategoryController.java new file mode 100644 index 0000000..c347cd7 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/admin/SeckillCategoryController.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.controller.admin; + +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.seckill.constant.SeckillConstant; +import com.tmerclub.cloud.seckill.dto.SeckillCategoryDTO; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.mapper.SeckillMapper; +import com.tmerclub.cloud.seckill.model.SeckillCategory; +import com.tmerclub.cloud.seckill.service.SeckillCategoryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 秒杀分类信息 + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +@RestController("adminSeckillCategoryController") +@RequestMapping("/mp/seckill_category") +@Tag(name = "秒杀分类信息") +public class SeckillCategoryController { + + @Autowired + private SeckillCategoryService seckillCategoryService; + + @Autowired + private SeckillMapper seckillMapper; + + + @GetMapping("/list") + @Operation(summary = "获取秒杀分类信息列表", description = "分页获取秒杀分类信息列表") + public ServerResponseEntity> list() { + List seckillCategory = seckillCategoryService.list(); + return ServerResponseEntity.success(seckillCategory); + } + + @GetMapping + @Operation(summary = "获取秒杀分类信息", description = "根据categoryId获取秒杀分类信息") + public ServerResponseEntity getByCategoryId(@RequestParam Long categoryId) { + return ServerResponseEntity.success(seckillCategoryService.getByCategoryId(categoryId)); + } + + @PostMapping + @Operation(summary = "保存秒杀分类信息", description = "保存秒杀分类信息") + public ServerResponseEntity save(@Valid @RequestBody SeckillCategoryDTO seckillCategoryDTO) { + Long shopId = AuthUserContext.get().getTenantId(); + if (!Objects.equals(shopId, Constant.PLATFORM_SHOP_ID)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (seckillCategoryService.countByName(null, null) + 1 > SeckillConstant.SECKILL_CATEGORY_MAX_NUM) { + throw new LuckException("分类最多存在16个!"); + } + if (seckillCategoryService.countByName(seckillCategoryDTO.getName(), null) > 0) { + throw new LuckException("已存在有相同的分类名称"); + } + SeckillCategory seckillCategory = BeanUtil.map(seckillCategoryDTO, SeckillCategory.class); + seckillCategory.setCategoryId(null); + seckillCategoryService.save(seckillCategory); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新秒杀分类信息", description = "更新秒杀分类信息") + public ServerResponseEntity update(@Valid @RequestBody SeckillCategoryDTO seckillCategoryDTO) { + if (!Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + if (seckillCategoryService.countByName(seckillCategoryDTO.getName(), seckillCategoryDTO.getCategoryId()) > 0) { + throw new LuckException("已存在有相同的分类名称"); + } + SeckillCategory seckillCategory = BeanUtil.map(seckillCategoryDTO, SeckillCategory.class); + seckillCategoryService.update(seckillCategory); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_batch_seq") + @Operation(summary = "批量更新秒杀分类排序", description = "批量更新秒杀分类排序") + public ServerResponseEntity updateBatchSeq(@Valid @RequestBody SeckillCategoryDTO seckillCategoryDTO) { + if (!Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + List categoryIds = seckillCategoryDTO.getCategoryIds(); + List seckillCategoryList = new ArrayList<>(Constant.INITIAL_CAPACITY); + int seq = 16; + for (Long categoryId : categoryIds) { + SeckillCategory seckillCategory = new SeckillCategory(); + seckillCategory.setCategoryId(categoryId); + seckillCategory.setSeq(seq); + seckillCategoryList.add(seckillCategory); + seq--; + } + seckillCategoryService.updateBatch(seckillCategoryList); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除秒杀分类信息", description = "根据秒杀分类信息id删除秒杀分类信息") + public ServerResponseEntity delete(@RequestParam Long categoryId) { + if (!Objects.equals(AuthUserContext.get().getTenantId(), Constant.PLATFORM_SHOP_ID)) { + throw new LuckException(ResponseEnum.UNAUTHORIZED); + } + SeckillDTO seckillDTO = new SeckillDTO(); + seckillDTO.setCategoryId(categoryId); + if (seckillMapper.countBySeckillConditions(seckillDTO) > 0) { + throw new LuckException("已有秒杀商品关联该分类,无法删除"); + } + seckillCategoryService.deleteById(categoryId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillController.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillController.java new file mode 100644 index 0000000..2dfac00 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillController.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.controller.app; + +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.product.vo.app.SkuAppVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.seckill.dto.SeckillDTO; +import com.tmerclub.cloud.seckill.service.SeckillService; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import com.tmerclub.cloud.seckill.vo.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +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.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + + +/** + * 秒杀信息 + * + * @author lhd + * @date 2021-04-12 09:36:59 + */ +@RestController("appSeckillController") +@RequestMapping("/ua/seckill") +@Tag(name = "app-秒杀活动信息") +public class SeckillController { + + @Autowired + private SeckillService seckillService; + + + @DubboReference + private ConfigFeignClient configFeignClient; + + @DubboReference + private SpuFeignClient spuFeignClient; + + @Autowired + private SeckillSkuService seckillSkuService; + + @DubboReference + private SkuFeignClient skuFeignClient; + + @GetMapping("/page") + @Operation(summary = "获取首页秒杀信息", description = "获取首页秒杀信息") + public ServerResponseEntity page(SeckillDTO seckillDTO) { + seckillDTO.setStatus(StatusEnum.ENABLE.value()); + AppSeckillVO appSeckillVO = seckillService.pageBySelectLot(seckillDTO); + return ServerResponseEntity.success(appSeckillVO); + } + + @GetMapping("/prod") + @Operation(summary = "获取秒杀商品信息", description = "根据商品id,获取当前秒杀的商品信息") + @Parameters(@Parameter(name = "seckillId", description = "秒杀id", required = true)) + public ServerResponseEntity getSeckill(Long seckillId) { + if (Objects.isNull(seckillId)) { + throw new LuckException("该秒杀活动已过期"); + } + + // 秒杀活动信息(来自缓存) + SeckillVO seckill = seckillService.getBySeckillId(seckillId); + + // 前端看到这个状态码的时候,不用渲染活动页面了 + if (seckill == null || !Objects.equals(seckill.getStatus(), StatusEnum.ENABLE.value()) || seckill.getEndTime().getTime() < System.currentTimeMillis()) { + return ServerResponseEntity.fail(ResponseEnum.ACTIVITY_END); + } + + // 秒杀活动sku信息(来自缓存) + List seckillSkus = seckillSkuService.listSeckillSkuBySeckillId(seckill.getSeckillId()); + + // 商品信息(来自缓存) + SpuVO spuVO = spuFeignClient.getDetailById(seckill.getSpuId()).getData(); + + // 商品sku信息(来自缓存) + List skuAppVO = skuFeignClient.listBySpuId(seckill.getSpuId()).getData(); + Integer totalStock = 0; + + List seckillSkusVO = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (SeckillSkuVO seckillSku : seckillSkus) { + AppSeckillSkuVO appSeckillSkuVO = new AppSeckillSkuVO(); + for (SkuAppVO sku : skuAppVO) { + if (!Objects.equals(sku.getSkuId(), seckillSku.getSkuId())) { + continue; + } + appSeckillSkuVO.setSkuName(sku.getSkuName()); + appSeckillSkuVO.setImgUrl(sku.getImgUrl()); + appSeckillSkuVO.setProperties(sku.getProperties()); + appSeckillSkuVO.setPriceFee(sku.getPriceFee()); + // 如果没有市场价,就用售价当作市场价 + appSeckillSkuVO.setMarketPriceFee(Objects.equals(sku.getMarketPriceFee(), 0L) ? sku.getPriceFee() : sku.getMarketPriceFee()); + + appSeckillSkuVO.setSkuId(sku.getSkuId()); + appSeckillSkuVO.setSeckillId(seckill.getSeckillId()); + Integer stock = seckillSkuService.getStockBySeckillSkuId(seckillSku.getSeckillId(),seckillSku.getSkuId()); + totalStock += stock; + appSeckillSkuVO.setStock(stock); + appSeckillSkuVO.setSeckillPrice(seckillSku.getSeckillPrice()); + appSeckillSkuVO.setSeckillSkuId(seckillSku.getSeckillSkuId()); + } + seckillSkusVO.add(appSeckillSkuVO); + } + + + AppSeckillSpuVO seckillSpuVO = BeanUtil.map(seckill, AppSeckillSpuVO.class); + seckillSpuVO.setShopId(seckill.getShopId()); + seckillSpuVO.setSpuVO(spuVO); + seckillSpuVO.setSeckillOriginStocks(seckill.getSeckillOriginStocks()); + seckillSpuVO.setMaxNum(seckill.getMaxNum()); + seckillSpuVO.setSeckillTotalStocks(totalStock); + seckillSpuVO.setSeckillPrice(seckill.getSeckillPrice()); + seckillSpuVO.setSeckillSkuList(seckillSkusVO); + + long now = System.currentTimeMillis(); + int activityStatus = 2; + Date startTime = seckill.getStartTime(); + // 活动还没开始 + if (startTime.getTime() > now) { + long residualTime = (startTime.getTime() - now) / 1000; + // 距离活动开始还有 + seckillSpuVO.setStartIn(residualTime); + activityStatus = 1; + } + // 活动还没结束 + if (seckill.getEndTime().getTime() > now) { + // 距离活动结束还有 + long residualTime = (seckill.getEndTime().getTime() - now) / 1000; + seckillSpuVO.setExpiresIn(residualTime); + } else { + activityStatus = 3; + } + seckillSpuVO.setActivityStatus(activityStatus); + return ServerResponseEntity.success(seckillSpuVO); + } + + + @GetMapping("/list_seckill_times") + @Operation(summary = "显示秒杀后台配置信息", description = "显示秒杀后台配置信息") + public ServerResponseEntity listSeckillTimes() { + String config = configFeignClient.getConfig(ConfigNameConstant.SECKILL_TIME_CONFIG).getData(); + if (Objects.isNull(config)) { + return ServerResponseEntity.success(); + } + SeckillConfigVO seckillConfigVO = Json.parseObject(config, SeckillConfigVO.class); + return ServerResponseEntity.success(seckillConfigVO); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillOrderController.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillOrderController.java new file mode 100644 index 0000000..7458943 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/controller/app/SeckillOrderController.java @@ -0,0 +1,233 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.controller.app; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.delivery.dto.CalculateAndGetDeliverInfoDTO; +import com.tmerclub.cloud.api.delivery.feign.DeliveryFeignClient; +import com.tmerclub.cloud.api.order.manager.ConfirmOrderManager; +import com.tmerclub.cloud.api.order.manager.SubmitOrderManager; +import com.tmerclub.cloud.api.product.manager.ShopCartAdapter; +import com.tmerclub.cloud.api.product.manager.ShopCartItemAdapter; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.order.constant.DeliveryType; +import com.tmerclub.cloud.common.order.constant.OrderActivityType; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.util.OrderLangUtil; +import com.tmerclub.cloud.common.order.vo.*; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.seckill.constant.DistributedIdKey; +import com.tmerclub.cloud.seckill.dto.app.SeckillOrderDTO; +import com.tmerclub.cloud.seckill.dto.app.SubmitSeckillOrderDTO; +import com.tmerclub.cloud.seckill.manager.SeckillCacheManager; +import com.tmerclub.cloud.seckill.service.SeckillOrderService; +import com.tmerclub.cloud.seckill.service.SeckillService; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import com.tmerclub.cloud.seckill.vo.SeckillSkuVO; +import com.tmerclub.cloud.seckill.vo.SeckillVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Objects; + + +/** + * 秒杀信息 + * + * @author lhd + * @date 2021-04-19 09:36:59 + */ +@RestController +@RequestMapping("/seckill_order") +@Tag(name = "秒杀订单接口") +public class SeckillOrderController { + + @Autowired + private SeckillService seckillService; + @Autowired + private SeckillSkuService seckillSkuService; + @Autowired + private SeckillCacheManager seckillCacheManager; + @Autowired + private ConfirmOrderManager confirmOrderManager; + @Autowired + private ShopCartAdapter shopCartAdapter; + @Autowired + private ShopCartItemAdapter shopCartItemAdapter; + @DubboReference + private DeliveryFeignClient deliveryFeignClient; + @Autowired + private SubmitOrderManager submitOrderManager; + @Autowired + private SeckillOrderService seckillOrderService; + @Autowired + private SegmentManager segmentManager; + + + @Operation(summary = "获取秒杀订单路径") + @GetMapping("/order_path") + public ServerResponseEntity getOrderPath(Long spuId) { + Long userId = AuthUserContext.get().getUserId(); + SeckillVO seckill = seckillService.getBySpuId(spuId); + // 前端看到这个状态码的时候,不用渲染活动页面了 + if (seckill == null || !Objects.equals(seckill.getStatus(), StatusEnum.ENABLE.value()) || seckill.getEndTime().getTime() < System.currentTimeMillis()) { + return ServerResponseEntity.showFailMsg("活动已结束"); + } + if (seckill.getStartTime().getTime() > System.currentTimeMillis()) { + return ServerResponseEntity.showFailMsg("活动尚未开始"); + } + String orderPath = seckillCacheManager.createOrderPath(userId + spuId); + + return ServerResponseEntity.success(orderPath); + } + + + @Operation(summary = "确认订单") + @PostMapping("/{orderPath}/confirm") + public ServerResponseEntity confirm(@PathVariable("orderPath") String orderPath, @Valid @RequestBody SeckillOrderDTO orderParam) { + + Long userId = AuthUserContext.get().getUserId(); + + Long spuId = orderParam.getShopCartItem().getSpuId(); + seckillCacheManager.checkOrderPath(userId + spuId, orderPath); + + SeckillSkuVO appSeckillSkuVO = seckillSkuService.getBySeckillSkuId(orderParam.getSeckillSkuId()); + if (appSeckillSkuVO == null || !Objects.equals(orderParam.getShopCartItem().getSkuId(), appSeckillSkuVO.getSkuId())) { + throw new LuckException("sku 信息有误"); + } + + List shopCartItemsDb = shopCartItemAdapter.conversionShopCartItem(orderParam.getShopCartItem(), appSeckillSkuVO.getSeckillPrice(), userId, orderParam.getDvyTypes()); + // 获取用户地址信息 + UserDeliveryInfoVO userDeliveryInfoVO = confirmOrderManager.getUserDeliveryInfoVO(shopCartItemsDb, userId, orderParam); + // 将要返回给前端的完整的订单信息 + ShopCartOrderMergerVO shopCartOrderMerger = new ShopCartOrderMergerVO(); + shopCartOrderMerger.setDvyTypes(orderParam.getDvyTypes()); + shopCartOrderMerger.setOrderType(OrderType.SECKILL); + shopCartOrderMerger.setSeckillSkuId(orderParam.getSeckillSkuId()); + shopCartOrderMerger.setActivityId(appSeckillSkuVO.getSeckillId()); + shopCartOrderMerger.setActivityType(OrderActivityType.SECKILL.value()); + + // 筛选过滤掉不同配送的商品 + List shopCartItems = confirmOrderManager.filterShopItemsByType(shopCartOrderMerger, userDeliveryInfoVO, shopCartItemsDb); + OrderLangUtil.shopCartItemList(shopCartItems); + // 无法配送的商品添加商品详细和店铺详细 + shopCartAdapter.setFilterShopItemsLong(shopCartOrderMerger); + // 该商品不满足任何的配送方式 + if (CollectionUtil.isEmpty(shopCartItems)) { + // 设置用户地址 + userDeliveryInfoVO = deliveryFeignClient.calculateAndGetDeliverInfo(new CalculateAndGetDeliverInfoDTO(shopCartItems, userDeliveryInfoVO)).getData(); + shopCartOrderMerger.setUserAddr(userDeliveryInfoVO.getUserAddr()); + return ServerResponseEntity.success(shopCartOrderMerger); + } + + // 自提订单处理 + confirmOrderManager.handleStationOrder(shopCartOrderMerger, shopCartItems, userDeliveryInfoVO); + + + // 商品类别 0.实物商品 1. 虚拟商品 2.组合商品 + int mold = 0; + if (shopCartItemsDb.stream().filter(shopCartItemDto -> Objects.nonNull(shopCartItemDto.getMold()) && shopCartItemDto.getMold() == 1).count() == shopCartItemsDb.size()) { + // 订单项中的所有商品都为虚拟商品时,才是虚拟订单 + mold = 1; + shopCartOrderMerger.getDvyTypes().forEach(s -> s.setDvyType(DeliveryType.NOT_DELIVERY.value())); + } + shopCartOrderMerger.setSpuMold(mold); + // 购物车 + List shopCarts = shopCartAdapter.conversionShopCart(shopCartItems); + // 计算运费,获取用户地址,自提信息 + ServerResponseEntity userDeliveryInfoResponseEntity = deliveryFeignClient.calculateAndGetDeliverInfo(new CalculateAndGetDeliverInfoDTO(shopCartItems, userDeliveryInfoVO)); + + // 当算完一遍店铺的各种满减活动时,重算一遍订单金额 + confirmOrderManager.recalculateAmountWhenFinishingCalculateShop(shopCartOrderMerger, shopCarts, userDeliveryInfoResponseEntity.getData()); + + // 处理完赠品后,插入订单项库存区域id + confirmOrderManager.handleShopCartStockPoint(userDeliveryInfoVO, shopCarts, shopCartItemsDb, shopCartOrderMerger.getSpuMold()); + + // 结束平台优惠的计算之后,还要重算一遍金额 + confirmOrderManager.recalculateAmountWhenFinishingCalculatePlatform(shopCartOrderMerger, userDeliveryInfoResponseEntity.getData()); + + shopCartOrderMerger.getShopCartOrders().forEach(shopCartOrderVO -> shopCartOrderVO.setOrderType(OrderType.SECKILL.value())); + + // 计算平台佣金-跟订单其他金额是独立的,可以单独计算 + confirmOrderManager.confirmPlatformCommission(shopCartOrderMerger); + + // 缓存计算新 + confirmOrderManager.cacheCalculatedInfo(userId, shopCartOrderMerger); + + List shopCartOrders = shopCartOrderMerger.getShopCartOrders(); + // 移除没有商品项的店铺的订单信息 + shopCartOrders.removeIf(shopCartOrderVO -> shopCartOrderVO.getShopCartItemDiscounts().size() == 0); + return ServerResponseEntity.success(shopCartOrderMerger); + } + + /** + * 购物车/立即购买 提交订单,根据店铺拆单 + */ + @PostMapping("/{orderPath}/submit") + @Operation(summary = "提交订单", description = "提交之后返回WebSocket路径,请求对应的WebSocket路径,开始等待响应") + public ServerResponseEntity> submitOrders(@PathVariable("orderPath") String orderPath, @Valid @RequestBody SubmitSeckillOrderDTO submitOrderParam) { + Long userId = AuthUserContext.get().getUserId(); + + + // 在这里面已经生成了订单id了 + ServerResponseEntity checkResult = submitOrderManager.checkSubmitInfo(submitOrderParam, userId); + if (!checkResult.isSuccess()) { + return ServerResponseEntity.transform(checkResult); + } + ShopCartOrderMergerVO mergerOrder = checkResult.getData(); + mergerOrder.setUserId(userId); + ShopCartOrderVO shopCartOrderVO = mergerOrder.getShopCartOrders().get(0); + ShopCartItemVO shopCartItemVO = shopCartOrderVO.getShopCartItemDiscounts().get(0).getShopCartItems().get(0); + + // 验证订单路径 + seckillCacheManager.checkOrderPath(userId + shopCartItemVO.getSpuId(), orderPath); + + // 秒杀活动信息(来自缓存) + SeckillVO seckill = seckillService.getBySpuId(shopCartItemVO.getSpuId()); + + // 前端看到这个状态码的时候,不用渲染活动页面了 + if (seckill == null || !Objects.equals(seckill.getStatus(), StatusEnum.ENABLE.value()) || seckill.getEndTime().getTime() < System.currentTimeMillis()) { + return ServerResponseEntity.showFailMsg("活动已结束"); + } + + // 判断之前秒杀的商品有没有超过限制,-1表示商品不限制秒杀数量 + if (seckill.getMaxNum() != -1 && seckill.getMaxNum() < shopCartItemVO.getCount()) { + return ServerResponseEntity.showFailMsg("超过购买限制"); + } + // 判断之前秒杀的商品有没有超过限制,-1表示商品不限制秒杀数量 + boolean isOverNum = seckillOrderService.checkOrderSpuNum(seckill, mergerOrder.getUserId(), shopCartItemVO.getCount()); + if (!isOverNum) { + return ServerResponseEntity.showFailMsg("超过购买限制"); + } + + // 生成订单id + Long orderId = segmentManager.getSegmentIdWithDateTime(DistributedIdKey.MALL4CLOUD_ORDER, mergerOrder.getUserId()); + shopCartOrderVO.setOrderId(orderId); + + mergerOrder.setActivityId(seckill.getSeckillId()); + mergerOrder.setActivityType(OrderActivityType.SECKILL.value()); + mergerOrder.setCreateTime(new Date()); + seckillOrderService.submit(mergerOrder, seckill.getSeckillId(), seckill.getMaxNum()); + + return ServerResponseEntity.success(Collections.singletonList(shopCartOrderVO.getOrderId())); + } + +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillDTO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillDTO.java new file mode 100644 index 0000000..f545f11 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillDTO.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 秒杀信息DTO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "活动名称") + private String seckillName; + + @Schema(description = "开始日期") + private Date startTime; + + @Schema(description = "开始时间(时间戳)") + private Long startTimestamps; + + @Schema(description = "结束日期") + private Date endTime; + + @Schema(description = "所选批次") + private Integer selectedLot; + + @Schema(description = "所选秒杀分类") + private Long categoryId; + + @Schema(description = "活动标签") + private String seckillTag; + + @Schema(description = "限购数量") + private Integer maxNum; + + @Schema(description = "取消订单时间") + private Integer maxCancelTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "0 未删除 1已删除") + private Integer isDelete; + + @Schema(description = "状态(0:失效、1:正常、2:违规下架、3:等待审核)") + private Integer status; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "秒杀活动剩余总库存") + private Integer seckillTotalStocks; + + @Schema(description = "秒杀活动原始库存") + private Integer seckillOriginStocks; + + @Schema(description = "秒杀活动最低价") + private Long seckillPrice; + + @Schema(description = "秒杀活动最低价") + private Boolean supplement; + + @Schema(description = "秒杀活动关联sku信息") + private List seckillSkuList; + + @Schema(description = "0不补充 1补充库存") + private Integer replenish; + + public Integer getReplenish() { + return replenish; + } + + public void setReplenish(Integer replenish) { + this.replenish = replenish; + } + + public Long getStartTimestamps() { + return startTimestamps; + } + + public void setStartTimestamps(Long startTimestamps) { + this.startTimestamps = startTimestamps; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public List getSeckillSkuList() { + return seckillSkuList; + } + + public void setSeckillSkuList(List seckillSkuList) { + this.seckillSkuList = seckillSkuList; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public String getSeckillName() { + return seckillName; + } + + public void setSeckillName(String seckillName) { + this.seckillName = seckillName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public String getSeckillTag() { + return seckillTag; + } + + public void setSeckillTag(String seckillTag) { + this.seckillTag = seckillTag; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getMaxCancelTime() { + return maxCancelTime; + } + + public void setMaxCancelTime(Integer maxCancelTime) { + this.maxCancelTime = maxCancelTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getSeckillTotalStocks() { + return seckillTotalStocks; + } + + public void setSeckillTotalStocks(Integer seckillTotalStocks) { + this.seckillTotalStocks = seckillTotalStocks; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + @Override + public String toString() { + return "SeckillDTO{" + + "seckillId=" + seckillId + + ", seckillName='" + seckillName + '\'' + + ", startTime=" + startTime + + ", startTimestamps=" + startTimestamps + + ", endTime=" + endTime + + ", selectedLot=" + selectedLot + + ", categoryId=" + categoryId + + ", seckillTag='" + seckillTag + '\'' + + ", maxNum=" + maxNum + + ", maxCancelTime=" + maxCancelTime + + ", shopId=" + shopId + + ", isDelete=" + isDelete + + ", status=" + status + + ", spuId=" + spuId + + ", seckillTotalStocks=" + seckillTotalStocks + + ", seckillOriginStocks=" + seckillOriginStocks + + ", seckillPrice=" + seckillPrice + + ", seckillSkuList=" + seckillSkuList + + ", replenish=" + replenish + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillOrderDTO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillOrderDTO.java new file mode 100644 index 0000000..5294483 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillOrderDTO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 秒杀订单DTO + * + * @author lhd + * @date 2021-03-30 14:59:28 + */ +public class SeckillOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀订单id") + private Long seckillOrderId; + + @Schema(description = "秒杀订单id") + private Long seckillId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "秒杀到的商品数量") + private Integer prodCount; + + @Schema(description = "创建时间") + private Date createTime; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "-1指无效,0指成功,1指已付款") + private Integer state; + + @Schema(description = "秒杀到的秒杀商品sku") + private Long seckillSkuId; + + public Long getSeckillOrderId() { + return seckillOrderId; + } + + public void setSeckillOrderId(Long seckillOrderId) { + this.seckillOrderId = seckillOrderId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + @Override + public String toString() { + return "SeckillOrderVO{" + + "seckillOrderId=" + seckillOrderId + + ",seckillId=" + seckillId + + ",userId=" + userId + + ",orderId=" + orderId + + ",prodCount=" + prodCount + + ",createTime=" + createTime + + ",spuId=" + spuId + + ",state=" + state + + ",seckillSkuId=" + seckillSkuId + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillSkuDTO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillSkuDTO.java new file mode 100644 index 0000000..036b9a9 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillSkuDTO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 秒杀活动skuDTO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillSkuDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动单个skuid") + private Long seckillSkuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "用于秒杀的库存") + private Integer seckillStocks; + + @Schema(description = "秒杀价格") + private Long seckillPrice; + + @Schema(description = "库存关联列表") + private List seckillStockPointList; + + public List getSeckillStockPointList() { + return seckillStockPointList; + } + + public void setSeckillStockPointList(List seckillStockPointList) { + this.seckillStockPointList = seckillStockPointList; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Integer getSeckillStocks() { + return seckillStocks; + } + + public void setSeckillStocks(Integer seckillStocks) { + this.seckillStocks = seckillStocks; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + @Override + public String toString() { + return "SeckillSkuDTO{" + + "seckillSkuId=" + seckillSkuId + + ", skuId=" + skuId + + ", seckillId=" + seckillId + + ", seckillStocks=" + seckillStocks + + ", seckillPrice=" + seckillPrice + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillStockPointSkuDTO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillStockPointSkuDTO.java new file mode 100644 index 0000000..12d7d0f --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/SeckillStockPointSkuDTO.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2023-11-23 15:32:01 + */ +public class SeckillStockPointSkuDTO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "库存商品关联skuid") + private Long seckillStockPointSkuId; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点类型 1仓库 2门店") + private Integer stockPointType; + + @Schema(description = "sku_id") + private Long skuId; + + @Schema(description = "秒杀活动skuid") + private Long seckillSkuId; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "仓库类型(0默认仓库,1区域仓库)") + private Integer type; + + @Schema(description = "库存") + private Integer stock; + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getSeckillStockPointSkuId() { + return seckillStockPointSkuId; + } + + public void setSeckillStockPointSkuId(Long seckillStockPointSkuId) { + this.seckillStockPointSkuId = seckillStockPointSkuId; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "SeckillStockPointSkuDTO{" + + "seckillStockPointSkuId=" + seckillStockPointSkuId + + ",stockPointId=" + stockPointId + + ",stockPointType=" + stockPointType + + ",skuId=" + skuId + + ",seckillSkuId=" + seckillSkuId + + ",status=" + status + + ",type=" + type + + ",stock=" + stock + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/app/SubmitSeckillOrderDTO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/app/SubmitSeckillOrderDTO.java new file mode 100644 index 0000000..2240a9f --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/dto/app/SubmitSeckillOrderDTO.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.dto.app; + +import com.tmerclub.cloud.common.order.dto.SubmitOrderDTO; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 秒杀订单 + * + * @author FrozenWatermelon + * @date 2021-04-07 10:39:32 + */ +public class SubmitSeckillOrderDTO extends SubmitOrderDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Override + public String toString() { + return "SubmitSeckillOrderDTO{} " + super.toString(); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/SecKillOrderRefundConsumer.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/SecKillOrderRefundConsumer.java new file mode 100644 index 0000000..bdb0380 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/SecKillOrderRefundConsumer.java @@ -0,0 +1,28 @@ +package com.tmerclub.cloud.seckill.listener; + +import com.tmerclub.cloud.api.seckill.dto.SecKillRefundDTO; +import com.tmerclub.cloud.common.order.bo.RefundReductionStockBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +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; +/** + * @author lanhai + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SECKILL_ORDER_REFUND_TOPIC, consumerGroup = RocketMqConstant.SECKILL_ORDER_REFUND_TOPIC) +public class SecKillOrderRefundConsumer implements RocketMQListener { + + @Autowired + private SeckillSkuService seckillSkuService; + + @Override + public void onMessage(SecKillRefundDTO secKillRefundDTO) { + // 还原秒杀库存 + for (RefundReductionStockBO stockBO : secKillRefundDTO.getRefundReductionStocks()) { + seckillSkuService.rollbackSecKillStock(secKillRefundDTO.getActivityId(), stockBO.getSkuId(), stockBO.getCount(), 0L,secKillRefundDTO.getUserId(), stockBO.getStockPointId()); + } + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/SeckillOrderCancelConsumer.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/SeckillOrderCancelConsumer.java new file mode 100644 index 0000000..a64487a --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/listener/SeckillOrderCancelConsumer.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.listener; + +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderVO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import org.apache.dubbo.config.annotation.DubboReference; +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.Objects; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SECKILL_ORDER_CANCEL_TOPIC, consumerGroup = RocketMqConstant.SECKILL_ORDER_CANCEL_TOPIC) +public class SeckillOrderCancelConsumer implements RocketMQListener { + + @Autowired + private SeckillSkuService seckillSkuService; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private MultiRedisStockManager multiRedisStockManager; + /** + * 秒杀订单取消,还原库存 + */ + @Override + public void onMessage(ShopCartOrderMergerVO shopCartOrderMergerVO) { + if (Objects.isNull(shopCartOrderMergerVO)) { + return; + } + ShopCartOrderVO shopCartOrderVO = shopCartOrderMergerVO.getShopCartOrders().get(0); + ShopCartItemVO shopCartItemVO = shopCartOrderVO.getShopCartItemDiscounts().get(0).getShopCartItems().get(0); + seckillSkuService.rollbackSecKillStock(shopCartOrderMergerVO.getActivityId(), shopCartItemVO.getSkuId(), shopCartItemVO.getCount(),shopCartOrderVO.getOrderId(),shopCartOrderMergerVO.getUserId(), shopCartItemVO.getStockPointId()); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillCategoryMapper.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillCategoryMapper.java new file mode 100644 index 0000000..3e41cb8 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillCategoryMapper.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.mapper; + +import com.tmerclub.cloud.seckill.model.SeckillCategory; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 秒杀分类信息 + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +public interface SeckillCategoryMapper { + + /** + * 获取秒杀分类信息列表 + * @return 秒杀分类信息列表 + */ + List list(); + + /** + * 根据秒杀分类信息id获取秒杀分类信息 + * + * @param categoryId 秒杀分类信息id + * @return 秒杀分类信息 + */ + SeckillCategory getByCategoryId(@Param("categoryId") Long categoryId); + + /** + * 保存秒杀分类信息 + * @param seckillCategory 秒杀分类信息 + */ + void save(@Param("seckillCategory") SeckillCategory seckillCategory); + + /** + * 更新秒杀分类信息 + * @param seckillCategory 秒杀分类信息 + */ + void update(@Param("seckillCategory") SeckillCategory seckillCategory); + + /** + * 根据秒杀分类信息id删除秒杀分类信息 + * @param categoryId + */ + void deleteById(@Param("categoryId") Long categoryId); + + /** + * 根据名称获取分类总数 + * @return 分类总数 + * @param name + * @param categoryId + */ + int countByName(@Param("name") String name, @Param("categoryId") Long categoryId); + + /** + * 批量更新秒杀分类 + * @param seckillCategoryList 秒杀分类 + */ + void updateBatch(@Param("seckillCategoryList") List seckillCategoryList); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillSkuMapper.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillSkuMapper.java new file mode 100644 index 0000000..ef961db --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillSkuMapper.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.mapper; + +import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO; +import com.tmerclub.cloud.seckill.vo.SeckillSkuVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 秒杀活动sku + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public interface SeckillSkuMapper { + + /** + * 根据秒杀活动skuid获取秒杀活动sku + * 库存请不要从这里查 + * @param seckillSkuId 秒杀活动skuid + * @return 秒杀活动sku + */ + SeckillSkuVO getBySeckillSkuId(@Param("seckillSkuId") Long seckillSkuId); + + /** + * 根据秒杀活动id获取秒杀商品规格信息 + * + * @param seckillId 秒杀活动id + * @return 秒杀商品规格信息 + */ + List selectListBySeckillId(@Param("seckillId") Long seckillId); + + /** + * 批量保存秒杀活动sku + * + * @param seckillSkuList 秒杀活动sku + */ + void saveBatch(@Param("seckillSkuList") List seckillSkuList); + + /** + * 更新商品秒杀库存 + * + * @param seckillSkuId + * @param count + * @return + */ + int updateStocks(@Param("seckillSkuId") Long seckillSkuId, @Param("count") Integer count); + + /** + * 还原秒杀库存 + * + * @param seckillSkuId 秒杀SKU id + * @param count 库存数量 + */ + void returnStocksByOrderId(@Param("seckillSkuId") Long seckillSkuId, @Param("count") Integer count); + + /** + * 获取指定的秒杀活动sku信息 + * + * @param seckillId + * @param skuId + * @return + */ + SeckillSkuVO getBySkuIdAndSeckillId(@Param("seckillId") Long seckillId, @Param("skuId") Long skuId); + + /** + * 获取可能需要落库的秒杀活动 + * @return 秒杀信息 + */ + List listMaybeNeedStockPlacementActivity(); + + /** + * 获取刚刚结束的秒杀活动 + * @return + */ + List listOverJustNow(); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillStockPointSkuMapper.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillStockPointSkuMapper.java new file mode 100644 index 0000000..6cf3cfa --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/mapper/SeckillStockPointSkuMapper.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.mapper; + +import com.tmerclub.cloud.seckill.dto.SeckillStockPointSkuDTO; +import com.tmerclub.cloud.seckill.model.SeckillStockPointSku; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-23 15:32:01 + */ +public interface SeckillStockPointSkuMapper { + + /** + * 获取列表 + * @return 列表 + */ + List list(); + + /** + * 根据id获取 + * + * @param seckillStockPointSkuId id + * @return + */ + SeckillStockPointSku getBySeckillStockPointSkuId(@Param("seckillStockPointSkuId") Long seckillStockPointSkuId); + + /** + * 保存 + * @param seckillStockPointSku + */ + void save(@Param("seckillStockPointSku") SeckillStockPointSku seckillStockPointSku); + + /** + * 更新 + * @param seckillStockPointSku + */ + void update(@Param("seckillStockPointSku") SeckillStockPointSku seckillStockPointSku); + + /** + * 根据id删除 + * @param seckillStockPointSkuId + */ + void deleteById(@Param("seckillStockPointSkuId") Long seckillStockPointSkuId); + + /** + * 批量保存 + * @param seckillStockPointSkuList + */ + void batchSave(@Param("seckillStockPointSkuList") List seckillStockPointSkuList); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/Seckill.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/Seckill.java new file mode 100644 index 0000000..6c35af3 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/Seckill.java @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 秒杀信息 + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class Seckill extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 秒杀活动id + */ + private Long seckillId; + + /** + * 活动名称 + */ + private String seckillName; + + /** + * 开始日期 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 所选批次 + */ + private Integer selectedLot; + + /** + * 所选秒杀分类 + */ + private Long categoryId; + + /** + * 活动标签 + */ + private String seckillTag; + + /** + * 限购数量 + */ + private Integer maxNum; + + /** + * 取消订单时间 + */ + private Integer maxCancelTime; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 0 未删除 1已删除 + */ + private Integer isDelete; + + /** + * 状态(0:失效、1:正常、2:违规下架、3:等待审核) + */ + private Integer status; + + /** + * 商品id + */ + private Long spuId; + + /** + * 秒杀活动剩余总库存 + */ + private Integer seckillTotalStocks; + + /** + * 秒杀活动原始库存 + */ + private Integer seckillOriginStocks; + + /** + * 秒杀活动最低价 + */ + private Long seckillPrice; + + /** + * 补充库存 0不补充 1补充 + */ + private Integer replenish; + + public Integer getReplenish() { + return replenish; + } + + public void setReplenish(Integer replenish) { + this.replenish = replenish; + } + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public String getSeckillName() { + return seckillName; + } + + public void setSeckillName(String seckillName) { + this.seckillName = seckillName; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Integer getSelectedLot() { + return selectedLot; + } + + public void setSelectedLot(Integer selectedLot) { + this.selectedLot = selectedLot; + } + + public String getSeckillTag() { + return seckillTag; + } + + public void setSeckillTag(String seckillTag) { + this.seckillTag = seckillTag; + } + + public Integer getMaxNum() { + return maxNum; + } + + public void setMaxNum(Integer maxNum) { + this.maxNum = maxNum; + } + + public Integer getMaxCancelTime() { + return maxCancelTime; + } + + public void setMaxCancelTime(Integer maxCancelTime) { + this.maxCancelTime = maxCancelTime; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getSeckillTotalStocks() { + return seckillTotalStocks; + } + + public void setSeckillTotalStocks(Integer seckillTotalStocks) { + this.seckillTotalStocks = seckillTotalStocks; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + @Override + public String toString() { + return "Seckill{" + + "seckillId=" + seckillId + + ", seckillName='" + seckillName + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", selectedLot=" + selectedLot + + ", categoryId=" + categoryId + + ", seckillTag='" + seckillTag + '\'' + + ", maxNum=" + maxNum + + ", maxCancelTime=" + maxCancelTime + + ", shopId=" + shopId + + ", isDelete=" + isDelete + + ", status=" + status + + ", spuId=" + spuId + + ", seckillTotalStocks=" + seckillTotalStocks + + ", seckillOriginStocks=" + seckillOriginStocks + + ", seckillPrice=" + seckillPrice + + ", replenish=" + replenish + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillOrder.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillOrder.java new file mode 100644 index 0000000..ff7bb00 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillOrder.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 秒杀订单 + * + * @author lhd + * @date 2021-03-30 14:59:28 + */ +public class SeckillOrder extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 秒杀订单id + */ + private Long seckillOrderId; + + /** + * 秒杀订单id + */ + private Long seckillId; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 秒杀到的商品数量 + */ + private Integer prodCount; + /** + * 商品id + */ + private Long spuId; + + /** + * -1指无效,0指待付款,1指已付款 + */ + private Integer state; + + /** + * 秒杀到的秒杀商品sku + */ + private Long seckillSkuId; + + public Long getSeckillOrderId() { + return seckillOrderId; + } + + public void setSeckillOrderId(Long seckillOrderId) { + this.seckillOrderId = seckillOrderId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + @Override + public String toString() { + return "SeckillOrderVO{" + + "seckillOrderId=" + seckillOrderId + + ",seckillId=" + seckillId + + ",userId=" + userId + + ",orderId=" + orderId + + ",prodCount=" + prodCount + + ",spuId=" + spuId + + ",state=" + state + + ",seckillSkuId=" + seckillSkuId + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillStockPointSku.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillStockPointSku.java new file mode 100644 index 0000000..a071f5c --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/model/SeckillStockPointSku.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serializable; +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-23 15:32:01 + */ +public class SeckillStockPointSku extends BaseModel implements Serializable{ + private static final long serialVersionUID = 1L; + + /** + * 库存商品关联skuid + */ + private Long seckillStockPointSkuId; + + /** + * 库存点id + */ + private Long stockPointId; + + /** + * 库存点类型 1仓库 2门店 + */ + private Integer stockPointType; + + /** + * sku_id + */ + private Long skuId; + + /** + * 秒杀活动skuid + */ + private Long seckillSkuId; + + /** + * 状态 1:enable, 0:disable, -1:deleted + */ + private Integer status; + + /** + * 仓库类型(0默认仓库,1区域仓库) + */ + private Integer type; + + /** + * 秒杀库存关联商品原始库存 + */ + private Integer seckillOriginStocks; + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public Long getSeckillStockPointSkuId() { + return seckillStockPointSkuId; + } + + public void setSeckillStockPointSkuId(Long seckillStockPointSkuId) { + this.seckillStockPointSkuId = seckillStockPointSkuId; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "SeckillStockPointSku{" + + "seckillStockPointSkuId=" + seckillStockPointSkuId + + ", stockPointId=" + stockPointId + + ", stockPointType=" + stockPointType + + ", skuId=" + skuId + + ", seckillSkuId=" + seckillSkuId + + ", status=" + status + + ", type=" + type + + ", seckillOriginStocks=" + seckillOriginStocks + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillStockPointSkuService.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillStockPointSkuService.java new file mode 100644 index 0000000..3ddb30e --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/SeckillStockPointSkuService.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.seckill.dto.SeckillStockPointSkuDTO; +import com.tmerclub.cloud.seckill.model.SeckillStockPointSku; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-23 15:32:01 + */ +public interface SeckillStockPointSkuService { + + /** + * 分页获取列表 + * @param pageDTO 分页参数 + * @return 列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据id获取 + * + * @param seckillStockPointSkuId id + * @return + */ + SeckillStockPointSku getBySeckillStockPointSkuId(Long seckillStockPointSkuId); + + /** + * 保存 + * @param seckillStockPointSku + */ + void save(SeckillStockPointSku seckillStockPointSku); + + /** + * 更新 + * @param seckillStockPointSku + */ + void update(SeckillStockPointSku seckillStockPointSku); + + /** + * 根据id删除 + * @param seckillStockPointSkuId id + */ + void deleteById(Long seckillStockPointSkuId); + + /** + * 批量保存库存点和商品关联 + * @param stockPointDTOList + */ + void batchSave(List stockPointDTOList); +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillCategoryServiceImpl.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillCategoryServiceImpl.java new file mode 100644 index 0000000..0c4fd30 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillCategoryServiceImpl.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service.impl; + +import com.tmerclub.cloud.common.cache.constant.SeckillCacheNames; +import com.tmerclub.cloud.seckill.mapper.SeckillCategoryMapper; +import com.tmerclub.cloud.seckill.model.SeckillCategory; +import com.tmerclub.cloud.seckill.service.SeckillCategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 秒杀分类信息 + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +@Service +public class SeckillCategoryServiceImpl implements SeckillCategoryService { + + @Autowired + private SeckillCategoryMapper seckillCategoryMapper; + + @Override + @Cacheable(cacheNames = SeckillCacheNames.CATEGORY_LIST, key = "'categoryList'", sync = true) + public List list() { + return seckillCategoryMapper.list(); + } + + @Override + public SeckillCategory getByCategoryId(Long categoryId) { + return seckillCategoryMapper.getByCategoryId(categoryId); + } + + @Override + @CacheEvict(cacheNames = SeckillCacheNames.CATEGORY_LIST, key = "'categoryList'") + public void save(SeckillCategory seckillCategory) { + seckillCategoryMapper.save(seckillCategory); + } + + @Override + @CacheEvict(cacheNames = SeckillCacheNames.CATEGORY_LIST, key = "'categoryList'") + public void update(SeckillCategory seckillCategory) { + seckillCategoryMapper.update(seckillCategory); + } + + @Override + @CacheEvict(cacheNames = SeckillCacheNames.CATEGORY_LIST, key = "'categoryList'") + public void deleteById(Long categoryId) { + seckillCategoryMapper.deleteById(categoryId); + } + + @Override + public Integer countByName(String name, Long categoryId) { + return seckillCategoryMapper.countByName(name, categoryId); + } + + @Override + @CacheEvict(cacheNames = SeckillCacheNames.CATEGORY_LIST, key = "'categoryList'") + public void updateBatch(List seckillCategoryList) { + seckillCategoryMapper.updateBatch(seckillCategoryList); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillSkuServiceImpl.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillSkuServiceImpl.java new file mode 100644 index 0000000..11e9353 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillSkuServiceImpl.java @@ -0,0 +1,385 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.nacos.common.utils.CollectionUtils; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.product.feign.SkuStockFeignClient; +import com.tmerclub.cloud.api.product.feign.StockPointFeignClient; +import com.tmerclub.cloud.api.product.vo.SkuStockVO; +import com.tmerclub.cloud.common.cache.bo.MultiDecrementBO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.cache.constant.SeckillCacheNames; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.product.dto.SkuStockPointSearchDTO; +import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO; +import com.tmerclub.cloud.common.product.vo.StockPointSkuVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.seckill.constant.SeckillConstant; +import com.tmerclub.cloud.seckill.dto.SeckillSkuDTO; +import com.tmerclub.cloud.seckill.dto.SeckillStockPointSkuDTO; +import com.tmerclub.cloud.seckill.mapper.SeckillMapper; +import com.tmerclub.cloud.seckill.mapper.SeckillSkuMapper; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import com.tmerclub.cloud.seckill.service.SeckillStockPointSkuService; +import com.tmerclub.cloud.seckill.vo.SeckillSkuVO; +import com.tmerclub.cloud.seckill.vo.SeckillStockPointSkuVO; +import com.tmerclub.cloud.seckill.vo.SeckillVO; +import io.seata.spring.annotation.GlobalTransactional; +import org.apache.dubbo.config.annotation.DubboReference; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +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.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 秒杀活动sku + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +@Service +public class SeckillSkuServiceImpl implements SeckillSkuService { + + @Autowired + private SeckillSkuMapper seckillSkuMapper; + + @Autowired + private CacheManagerUtil cacheManagerUtil; + + @Autowired + private RedissonClient redissonClient; + + @DubboReference + private OrderFeignClient orderFeignClient; + + @Autowired + private SeckillMapper seckillMapper; + @Autowired + private MultiRedisStockManager multiRedisStockManager; + @Autowired + private SeckillStockPointSkuService seckillStockPointSkuService; + @DubboReference + private SkuStockFeignClient skuStockFeignClient; + @DubboReference + private StockPointFeignClient stockPointFeignClient; + + @Override + @Cacheable(cacheNames = SeckillCacheNames.SECKILL_SKU_BY_ID, key = "#seckillSkuId", sync = true) + public SeckillSkuVO getBySeckillSkuId(Long seckillSkuId) { + // 这里的库存不准的不要用这个方法获取库存,请使用getStockBySeckillSkuId 这个方法获取库存 + return seckillSkuMapper.getBySeckillSkuId(seckillSkuId); + } + + @Override + @Cacheable(cacheNames = SeckillCacheNames.SECKILL_SKU_BY_SECKILL_ID, key = "#seckillId", sync = true) + public List listSeckillSkuBySeckillId(Long seckillId) { + + List seckillSkuVOS = seckillSkuMapper.selectListBySeckillId(seckillId); + + return seckillSkuVOS; + } + + @Override + public void saveBatch(List seckillSkuList) { + seckillSkuMapper.saveBatch(seckillSkuList); + List stockPointSkus = new ArrayList<>(Constant.INITIAL_CAPACITY); + Map> stockPointMap = new HashMap<>(); + for (SeckillSkuDTO seckillSkuDTO : seckillSkuList) { + List stockPointList = new ArrayList<>(seckillSkuDTO.getSeckillStockPointList().size()); + seckillSkuDTO.getSeckillStockPointList().forEach(s-> { + s.setSeckillSkuId(seckillSkuDTO.getSeckillSkuId()); + s.setSkuId(seckillSkuDTO.getSkuId()); + stockPointList.add(s.getStockPointId().toString() + StrUtil.C_UNDERLINE + s.getStock()); + }); + stockPointMap.put(seckillSkuDTO.getSkuId(), stockPointList); + stockPointSkus.addAll(seckillSkuDTO.getSeckillStockPointList()); + } + seckillStockPointSkuService.batchSave(stockPointSkus); + // 库存分片到redis + for (SeckillSkuDTO seckillSku : seckillSkuList) { + multiRedisStockManager.doZone(new MultiDecrementBO(MultiStockEnum.SECKILL,null,null, + seckillSku.getSeckillId(), seckillSku.getSkuId(), null,null,null, stockPointMap.get(seckillSku.getSkuId()))); + } + } + + @Override + @CacheEvict(cacheNames = SeckillCacheNames.SECKILL_SKU_BY_SECKILL_ID, key = "#seckillId") + public void removeSeckillSkuCacheBySeckillId(Long seckillId) { + List seckillSkus = listSeckillSkuBySeckillId(seckillId); + //清除缓存 + if (CollectionUtils.isNotEmpty(seckillSkus)) { + for (SeckillSkuVO seckillSku : seckillSkus) { + // 不能采用this清除缓存,因为这样没有aop + cacheManagerUtil.evictCache(SeckillCacheNames.SECKILL_SKU_BY_ID, String.valueOf(seckillSku.getSeckillSkuId())); + } + } + } + + @Override + public Integer doZone(Long seckillSkuId, Integer totalStock) { + // 分片数量 + int zoneNum = SeckillConstant.ZONE_NUM; + // 可用分片数量 + int availableZone = 0; + if (totalStock == 0) { + RedisUtil.set(SeckillCacheNames.SECKILL_SKU_AVAILABLE_ZONE + seckillSkuId, availableZone, 0); + // 分片库存数量归零 + for (int i = 0; i < zoneNum; i++) { + RedisUtil.set(SeckillCacheNames.SECKILL_SKU_STOCK + seckillSkuId + CacheNames.UNION_KEY + i, 0, 0); + } + return availableZone; + } + + // 每个分片至少的库存数量(目前是想分片出来的结果要么是这个数量,要么是0) + // 比如 ( 10,10,5,0,0,0,0,) 这种结果 + int avgStock = getAvgStock(zoneNum, totalStock); + // 获取要存进缓存的每个分片库存数量 + for (int i = 0; i < zoneNum; i++) { + + if (totalStock != 0) { + availableZone = i + 1; + } + // 更新缓存 + if (totalStock - avgStock >= 0) { + RedisUtil.set(SeckillCacheNames.SECKILL_SKU_STOCK + seckillSkuId + CacheNames.UNION_KEY + i, avgStock, 0); + totalStock -= avgStock; + } else { + RedisUtil.set(SeckillCacheNames.SECKILL_SKU_STOCK + seckillSkuId + CacheNames.UNION_KEY + i, totalStock, 0); + totalStock = 0; + } + } + // 缓存可用分片数量 + RedisUtil.set(SeckillCacheNames.SECKILL_SKU_AVAILABLE_ZONE + seckillSkuId, availableZone, 0); + return availableZone; + } + + @Override + public Integer getStockBySeckillSkuId(Long activityId,Long skuId) { + int totalStock = 0; + RLock rLock = redissonClient.getLock(LockCacheNames.LOCK_SECKILL_ZONE_PERFIX + skuId); + rLock.lock(); + try { + totalStock = multiRedisStockManager.getSeckillStock( + new MultiDecrementBO(MultiStockEnum.SECKILL, null, null, + activityId, skuId, null, null, null, null)); + } finally { + rLock.unlock(); + } + return totalStock; + } + + @Override + public Map getPointStockBySeckillSkuId(Long activityId, Long skuId, List stockPointIds) { + Map map = new HashMap<>(stockPointIds.size()); + for (Long stockPointId : stockPointIds) { + int totalStock = 0; + RLock rLock = redissonClient.getLock(LockCacheNames.LOCK_SECKILL_ZONE_PERFIX + skuId); + rLock.lock(); + try { + MultiDecrementBO decrementBO = new MultiDecrementBO(MultiStockEnum.SECKILL, null, null, + activityId, skuId, null, null, null, null); + decrementBO.setStockPointId(stockPointId); + totalStock = multiRedisStockManager.getSeckillStock(decrementBO); + } finally { + rLock.unlock(); + } + map.put(stockPointId, totalStock); + } + return map; + } + + @Override + public Integer getStockBySeckillId(Long seckillId) { + SeckillSkuServiceImpl seckillSkuService = (SeckillSkuServiceImpl) AopContext.currentProxy(); + List skuList = seckillSkuService.listSeckillSkuBySeckillId(seckillId); + int totalStock = 0; + for (SeckillSkuVO seckillSkuVO : skuList) { + totalStock += getStockBySeckillSkuId(seckillSkuVO.getSeckillId(),seckillSkuVO.getSkuId()); + } + return totalStock; + } + + @Override + public List listMaybeNeedStockPlacementActivity() { + return seckillSkuMapper.listMaybeNeedStockPlacementActivity(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void flushStockToDb(Long seckillSkuId, Long seckillId) { + SeckillSkuVO seckillSku = seckillSkuMapper.getBySeckillSkuId(seckillSkuId); + + // 可用库存 + Integer hasStock = getStockBySeckillSkuId(seckillId,seckillSku.getSkuId()); + + // 数据库里面的还没更新的剩余库存 + Integer seckillStocks = seckillSku.getSeckillStocks(); + // 改变的库存 + Integer changeStock = seckillStocks - hasStock; + // 数据就真的没有变过,不需要更新数据库 + if (changeStock == 0) { + return; + } + // 更新数据库秒杀活动的剩余库存 + seckillMapper.updateStocksById(seckillId, changeStock); + // 更新数据库sku剩余的库存 + seckillSkuMapper.updateStocks(seckillSkuId, changeStock); + } + + @Override + public List listOverJustNow() { + return seckillSkuMapper.listOverJustNow(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void rollbackSecKillStock(Long activityId, Long skuId, Integer count, Long orderId, Long userId, Long stockPointId) { + SeckillSkuVO secKillSku = seckillSkuMapper.getBySkuIdAndSeckillId(activityId, skuId); + if (Objects.isNull(secKillSku)) { + throw new LuckException("秒杀商品信息不存在"); + } + // 还原秒杀库存(redis) + RLock rLock = redissonClient.getLock(LockCacheNames.LOCK_SECKILL_ZONE_PERFIX + secKillSku.getSkuId()); + rLock.lock(); + try { +// // 随机对一个分片增加库存 +// Random random = new Random(); +// int zoneNo = random.nextInt(availableZone); + // TODO 秒杀取消订单的应该很少,所以直接在userId那台redis处理就好 + multiRedisStockManager.rollbackSecKillStock(activityId, skuId, count, orderId, userId,null, stockPointId); + } finally { + rLock.unlock(); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @GlobalTransactional(rollbackFor = Exception.class) + public void handSeckillPointSku(SeckillVO seckillVO) { + if (seckillVO == null) { + return; + } + if (Objects.equals(seckillVO.getReplenish(), 1)) { + // 补充库存 + List seckillSkuList = listSeckillSkuBySeckillId(seckillVO.getSeckillId()); + List updateList = new ArrayList<>(); + for (SeckillSkuVO seckillSkuVO : seckillSkuList) { + List pointList = new ArrayList<>(); + seckillSkuVO.getSeckillStockPointList().forEach(s-> pointList.add(String.valueOf(s.getStockPointId()))); + // 获取各仓库库存 + Map pointMap = multiRedisStockManager.getSeckillStockPointMap( + new MultiDecrementBO(MultiStockEnum.SECKILL, null, null, + seckillVO.getSeckillId(), seckillSkuVO.getSkuId(), null, null, null, pointList)); + seckillSkuVO.getSeckillStockPointList().forEach(s-> { + s.setStock(pointMap.get(s.getStockPointId())); + s.setSkuId(seckillSkuVO.getSkuId()); + s.setSpuId(seckillVO.getSpuId()); + s.setStatus(1); + }); + // 过滤掉已经为空的库存数据 + updateList.addAll(seckillSkuVO.getSeckillStockPointList().stream().filter(s-> s.getStock() > 0).collect(Collectors.toList())); + } + // 补充到仓库里面 + skuStockFeignClient.addAndUpdateStockPoint(seckillVO.getSpuId(), BeanUtil.mapAsList(updateList, StockPointSkuDTO.class)); + } + } + + @Override + public void initPointSeckillStock() { + + String key = MultiStockEnum.SECKILL.value() + MultiRedisStockManager.STOCK; + Map> seckillSkuStockMap = multiRedisStockManager.scan(key); + + for (Map.Entry> keyEntry : seckillSkuStockMap.entrySet()) { + Integer index = keyEntry.getKey(); + Map keyMap = keyEntry.getValue(); + Set skuIdSet = new HashSet<>(Constant.INITIAL_CAPACITY); + Set existKeySet = new HashSet<>(Constant.INITIAL_CAPACITY); + Map stockVOMap = new HashMap<>(Constant.INITIAL_CAPACITY); + for (Map.Entry stockEntry : keyMap.entrySet()) { + String stockKey = stockEntry.getKey(); + String replace = stockKey.replace(key, ""); + String[] split = replace.split(Constant.UNDERLINE); + SeckillSkuVO skuStockVO = new SeckillSkuVO(); + skuStockVO.setSeckillId(Long.parseLong(split[0])); + skuStockVO.setSkuId(Long.parseLong(split[1])); + skuStockVO.setSeckillStocks(Integer.parseInt(stockEntry.getValue())); + String seckillSkuKey = skuStockVO.getSeckillId() + Constant.UNDERLINE + skuStockVO.getSkuId(); + if (existKeySet.contains(seckillSkuKey)) { + continue; + } + // 已经有区域库存的sku不再插入 + if (split.length > 2) { + existKeySet.add(seckillSkuKey); + stockVOMap.remove(seckillSkuKey); + skuIdSet.remove(skuStockVO.getSkuId()); + continue; + } + skuIdSet.add(skuStockVO.getSkuId()); + stockVOMap.put(seckillSkuKey, skuStockVO); + } + StockPointSkuDTO stockPointSkuDTO = new StockPointSkuDTO(); + stockPointSkuDTO.setSkuIds(new ArrayList<>(skuIdSet)); + stockPointSkuDTO.setType(0); + // 获取要初始化的sku默认库存 + List stockPointSkuVOList = stockPointFeignClient.listStockPointSku(stockPointSkuDTO); + Map stockPointMap = stockPointSkuVOList.stream().collect(Collectors.toMap(StockPointSkuVO::getSkuId, StockPointSkuVO::getStockPointId)); + + Map msetMap = new HashMap<>(); + for (Map.Entry skuStockEntry : stockVOMap.entrySet()) { + SeckillSkuVO seckillSkuVO = skuStockEntry.getValue(); + Long stockPointId = stockPointMap.get(seckillSkuVO.getSkuId()); + if (Objects.isNull(stockPointId)) { + continue; + } + msetMap.put(key + skuStockEntry.getKey() + Constant.UNDERLINE + stockPointId, seckillSkuVO.getSeckillStocks().toString()); + } + multiRedisStockManager.mset(index, msetMap); + } + } + + private int getAvgStock(int zoneNum, Integer totalStock) { + + // 每个分片可以分配的库存数量,可能小于10(这里的平均库存并不是真正的平均库存,因为这里进行了线上取整) + // 比如平均库存是 333.33 可以能会变成334 + int everyZoneStockRoundUp = divToRoundUp(totalStock, zoneNum); + + // 平均库存向上取整,因为就算是平均库存 + return Math.max(everyZoneStockRoundUp, SeckillConstant.ZONE_MIN_STOCK); + } + + /** + * 两个数相除然后向上取整 + * + * @param a 除数 + * @param b 被除数 + * @return 返回值 + */ + private int divToRoundUp(int a, int b) { + return new BigDecimal(a).divide(new BigDecimal(b), 0, RoundingMode.UP).intValue(); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillStockPointSkuServiceImpl.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillStockPointSkuServiceImpl.java new file mode 100644 index 0000000..fbdbbac --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/service/impl/SeckillStockPointSkuServiceImpl.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.seckill.dto.SeckillStockPointSkuDTO; +import com.tmerclub.cloud.seckill.mapper.SeckillStockPointSkuMapper; +import com.tmerclub.cloud.seckill.model.SeckillStockPointSku; +import com.tmerclub.cloud.seckill.service.SeckillStockPointSkuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * + * + * @author FrozenWatermelon + * @date 2023-11-23 15:32:01 + */ +@Service +public class SeckillStockPointSkuServiceImpl implements SeckillStockPointSkuService { + + @Autowired + private SeckillStockPointSkuMapper seckillStockPointSkuMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> seckillStockPointSkuMapper.list()); + } + + @Override + public SeckillStockPointSku getBySeckillStockPointSkuId(Long seckillStockPointSkuId) { + return seckillStockPointSkuMapper.getBySeckillStockPointSkuId(seckillStockPointSkuId); + } + + @Override + public void save(SeckillStockPointSku seckillStockPointSku) { + seckillStockPointSkuMapper.save(seckillStockPointSku); + } + + @Override + public void update(SeckillStockPointSku seckillStockPointSku) { + seckillStockPointSkuMapper.update(seckillStockPointSku); + } + + @Override + public void deleteById(Long seckillStockPointSkuId) { + seckillStockPointSkuMapper.deleteById(seckillStockPointSkuId); + } + + @Override + public void batchSave(List stockPointDTOList) { + if (CollectionUtil.isEmpty(stockPointDTOList)) { + return; + } + seckillStockPointSkuMapper.batchSave(stockPointDTOList); + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/task/SeckillTask.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/task/SeckillTask.java new file mode 100644 index 0000000..0418c15 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/task/SeckillTask.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.task; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.product.feign.StockPointFeignClient; +import com.tmerclub.cloud.common.cache.config.MultiRedisConfig; +import com.tmerclub.cloud.common.cache.constant.LockCacheNames; +import com.tmerclub.cloud.common.cache.constant.SeckillCacheNames; +import com.tmerclub.cloud.common.cache.enums.MultiStockEnum; +import com.tmerclub.cloud.common.cache.manager.MultiRedisStockManager; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.seckill.model.Seckill; +import com.tmerclub.cloud.seckill.service.SeckillService; +import com.tmerclub.cloud.seckill.service.SeckillSkuService; +import com.tmerclub.cloud.seckill.vo.SeckillSkuVO; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +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.List; + + +/** + * 秒杀订单的定时任务 + * + * @author FrozenWatermelon + */ +@Component +public class SeckillTask { + + private static final Logger log = LoggerFactory.getLogger(SeckillTask.class); + + @Autowired + private SeckillService seckillService; + + @Autowired + private SeckillSkuService seckillSkuService; + + @Autowired + private RedissonClient redissonClient; + @Autowired + private MultiRedisConfig multiRedisConfig; + @Autowired + private StockPointFeignClient stockPointFeignClient; + + /** + * 秒杀结束,改变商品类型 + */ + @XxlJob("activityFinishAndProdChange") + public void activityFinishAndProdChange() { + XxlJobHelper.log("秒杀活动结束,秒杀商品恢复为普通商品。。。"); + // 获取活动结束,需要改变商品类型的列表 + List seckillList = seckillService.listUnEndButNeedEndActivity(); + if (CollectionUtil.isEmpty(seckillList)) { + return; + } + seckillService.changeProdTypeBySeckillIdList(seckillList); + } + + + /** + * 已经结束的秒杀活动落库 + * 每个小时的中间时刻执行一次,获取上一个结束的活动 + * 比如 9点结束的活动,9点半,或者9点xx分的时候查下数据库,有没有还在处理但没有落库的订单 + * 这个9点xx分,通过定时任务查询 + */ + @XxlJob("coldStockPlacement") + public void coldStockPlacement() { + XxlJobHelper.log("秒杀库存落库"); + // 获取需要库存落库的秒杀活动 + List seckillSkuList = seckillSkuService.listOverJustNow(); + + if (CollectionUtil.isEmpty(seckillSkuList)) { + return; + } + int zoneNum = multiRedisConfig.getRedisCount(); + + for (SeckillSkuVO seckillSkuVO : seckillSkuList) { + RLock rLock = redissonClient.getLock(LockCacheNames.LOCK_SECKILL_ZONE_PERFIX + seckillSkuVO.getSeckillSkuId()); + rLock.lock(); + try { + String key = MultiStockEnum.SECKILL + SeckillCacheNames.STOCK + seckillSkuVO.getSeckillId() + StrUtil.C_UNDERLINE + seckillSkuVO.getSkuId(); + seckillSkuService.flushStockToDb(seckillSkuVO.getSeckillSkuId(), seckillSkuVO.getSeckillId()); + // 获取要存进缓存的每个redis库存信息并删除 + for (int i = 0; i < zoneNum; i++) { + multiRedisConfig.getRedisByIndex(i).delete(key); + } + } finally { + rLock.unlock(); + } + } + } + + + /** + * 初始化秒杀区域库存 + */ + @XxlJob("initPointSeckillStock") + public void initPointSeckillStock() { + // ===================== 初始化商品库存 ===================== + try{ + seckillSkuService.initPointSeckillStock(); + // 秒杀活动库存 + } catch (Exception e) { + log.error("初始化秒杀商品库存失败", e); + } + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillSkuVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillSkuVO.java new file mode 100644 index 0000000..1030b6c --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/AppSeckillSkuVO.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 秒杀活动skuVO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class AppSeckillSkuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动单个skuid") + private Long seckillSkuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "用于秒杀的库存") + private Integer stock; + + @Schema(description = "商品价格") + private Long priceFee; + + @Schema(description = "秒杀价格") + private Long seckillPrice; + + @Schema(description = "banner图片") + private String imgUrl; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "市场价,整数方式保存") + private Long marketPriceFee; + + @Schema(description = "属性") + private String properties; + + @Schema(description = "状态") + private Integer status; + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getMarketPriceFee() { + return marketPriceFee; + } + + public void setMarketPriceFee(Long marketPriceFee) { + this.marketPriceFee = marketPriceFee; + } + + public String getProperties() { + return properties; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "AppSeckillSkuVO{" + + "seckillSkuId=" + seckillSkuId + + ", skuId=" + skuId + + ", seckillId=" + seckillId + + ", stock=" + stock + + ", priceFee=" + priceFee + + ", seckillPrice=" + seckillPrice + + ", imgUrl='" + imgUrl + '\'' + + ", skuName='" + skuName + '\'' + + ", marketPriceFee=" + marketPriceFee + + ", properties='" + properties + '\'' + + ", status=" + status + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillCategoryVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillCategoryVO.java new file mode 100644 index 0000000..83a6075 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillCategoryVO.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 秒杀分类信息VO + * + * @author lhd + * @date 2021-04-19 11:26:35 + */ +public class SeckillCategoryVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀分类id") + private Long categoryId; + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "排序") + private Integer seq; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + @Override + public String toString() { + return "SeckillCategoryVO{" + + "categoryId=" + categoryId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",name=" + name + + ",seq=" + seq + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillOrderVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillOrderVO.java new file mode 100644 index 0000000..d9dea1d --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillOrderVO.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 秒杀订单VO + * + * @author lhd + * @date 2021-03-30 14:59:28 + */ +public class SeckillOrderVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀订单id") + private Long seckillOrderId; + + @Schema(description = "秒杀订单id") + private Long seckillId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "订单id") + private Long orderId; + + @Schema(description = "秒杀到的商品数量") + private Integer prodCount; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "-1指无效,0指成功,1指已付款") + private Integer state; + + @Schema(description = "秒杀到的秒杀商品sku") + private Long seckillSkuId; + + public Long getSeckillOrderId() { + return seckillOrderId; + } + + public void setSeckillOrderId(Long seckillOrderId) { + this.seckillOrderId = seckillOrderId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getProdCount() { + return prodCount; + } + + public void setProdCount(Integer prodCount) { + this.prodCount = prodCount; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + @Override + public String toString() { + return "SeckillOrderVO{" + + "seckillOrderId=" + seckillOrderId + + ",seckillId=" + seckillId + + ",userId=" + userId + + ",orderId=" + orderId + + ",prodCount=" + prodCount + + ",spuId=" + spuId + + ",state=" + state + + ",seckillSkuId=" + seckillSkuId + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillSkuVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillSkuVO.java new file mode 100644 index 0000000..195c0a7 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillSkuVO.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 秒杀活动skuVO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillSkuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动单个skuid") + private Long seckillSkuId; + + @Schema(description = "skuId") + private Long skuId; + + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "用于秒杀的库存") + private Integer seckillStocks; + + @Schema(description = "秒杀价格") + private Long seckillPrice; + + @Schema(description = "banner图片") + private String imgUrl; + + @Schema(description = "sku名称") + private String skuName; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "属性") + private String properties; + + @Schema(description = "秒杀的原始库存") + private Integer seckillOriginStocks; + + @Schema(description = "库存关联列表") + private List seckillStockPointList; + + public List getSeckillStockPointList() { + return seckillStockPointList; + } + + public void setSeckillStockPointList(List seckillStockPointList) { + this.seckillStockPointList = seckillStockPointList; + } + + public String getProperties() { + return properties; + } + + public void setProperties(String properties) { + this.properties = properties; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Integer getSeckillStocks() { + return seckillStocks; + } + + public void setSeckillStocks(Integer seckillStocks) { + this.seckillStocks = seckillStocks; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + @Override + public String toString() { + return "SeckillSkuVO{" + + "seckillSkuId=" + seckillSkuId + + ", skuId=" + skuId + + ", seckillId=" + seckillId + + ", seckillStocks=" + seckillStocks + + ", seckillPrice=" + seckillPrice + + ", imgUrl='" + imgUrl + '\'' + + ", skuName='" + skuName + '\'' + + ", priceFee=" + priceFee + + ", properties='" + properties + '\'' + + ", seckillOriginStocks=" + seckillOriginStocks + + ", seckillStockPointList=" + seckillStockPointList + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillSpuVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillSpuVO.java new file mode 100644 index 0000000..d7fd620 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillSpuVO.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 秒杀商品信息VO + * + * @author lhd + * @date 2021-03-30 14:53:09 + */ +public class SeckillSpuVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "秒杀活动id") + private Long seckillId; + + @Schema(description = "spu id") + private Long spuId; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "店铺名称") + private String shopName; + + @Schema(description = "分类名称") + private String categoryId; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "商品介绍主图") + private String mainImgUrl; + + @Schema(description = "spu名称") + private String name; + + @Schema(description = "售价,整数方式保存") + private Long priceFee; + + @Schema(description = "限购数量") + private Long maxNum; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "秒杀活动最低价") + private Long seckillPrice; + + @Schema(description = "立减xx元") + private Long reducePrice; + + @Schema(description = "秒杀活动剩余总库存") + private Integer seckillTotalStocks; + + @Schema(description = "秒杀活动原始库存") + private Integer seckillOriginStocks; + + @Schema(description = "秒杀活动关联sku信息") + private List seckillSkuList; + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getMaxNum() { + return maxNum; + } + + public void setMaxNum(Long maxNum) { + this.maxNum = maxNum; + } + + public String getCategoryId() { + return categoryId; + } + + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public Long getReducePrice() { + return reducePrice; + } + + public void setReducePrice(Long reducePrice) { + this.reducePrice = reducePrice; + } + + public Long getSeckillId() { + return seckillId; + } + + public void setSeckillId(Long seckillId) { + this.seckillId = seckillId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public String getMainImgUrl() { + return mainImgUrl; + } + + public void setMainImgUrl(String mainImgUrl) { + this.mainImgUrl = mainImgUrl; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getPriceFee() { + return priceFee; + } + + public void setPriceFee(Long priceFee) { + this.priceFee = priceFee; + } + + public Long getSeckillPrice() { + return seckillPrice; + } + + public void setSeckillPrice(Long seckillPrice) { + this.seckillPrice = seckillPrice; + } + + public Integer getSeckillTotalStocks() { + return seckillTotalStocks; + } + + public void setSeckillTotalStocks(Integer seckillTotalStocks) { + this.seckillTotalStocks = seckillTotalStocks; + } + + public Integer getSeckillOriginStocks() { + return seckillOriginStocks; + } + + public void setSeckillOriginStocks(Integer seckillOriginStocks) { + this.seckillOriginStocks = seckillOriginStocks; + } + + public List getSeckillSkuList() { + return seckillSkuList; + } + + public void setSeckillSkuList(List seckillSkuList) { + this.seckillSkuList = seckillSkuList; + } + + @Override + public String toString() { + return "SeckillSpuVO{" + + "seckillId=" + seckillId + + ", spuId=" + spuId + + ", shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", categoryId='" + categoryId + '\'' + + ", categoryName='" + categoryName + '\'' + + ", mainImgUrl='" + mainImgUrl + '\'' + + ", name='" + name + '\'' + + ", priceFee=" + priceFee + + ", maxNum=" + maxNum + + ", status=" + status + + ", seckillPrice=" + seckillPrice + + ", reducePrice=" + reducePrice + + ", seckillTotalStocks=" + seckillTotalStocks + + ", seckillOriginStocks=" + seckillOriginStocks + + ", seckillSkuList=" + seckillSkuList + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillStockPointSkuVO.java b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillStockPointSkuVO.java new file mode 100644 index 0000000..bb02595 --- /dev/null +++ b/tmerclub-seckill/src/main/java/com/tmerclub/cloud/seckill/vo/SeckillStockPointSkuVO.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.seckill.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * VO + * + * @author FrozenWatermelon + * @date 2023-11-23 15:32:01 + */ +public class SeckillStockPointSkuVO extends BaseVO{ + private static final long serialVersionUID = 1L; + + @Schema(description = "库存商品关联skuid") + private Long seckillStockPointSkuId; + + @Schema(description = "库存点id") + private Long stockPointId; + + @Schema(description = "库存点类型 1仓库 2门店") + private Integer stockPointType; + + @Schema(description = "sku_id") + private Long skuId; + + @Schema(description = "秒杀活动skuid") + private Long seckillSkuId; + + @Schema(description = "状态 1:enable, 0:disable, -1:deleted") + private Integer status; + + @Schema(description = "仓库类型(0默认仓库,1区域仓库)") + private Integer type; + + @Schema(description = "原始仓库") + private Integer stock; + + @Schema(description = "商品id") + private Long spuId; + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Integer getStock() { + return stock; + } + + public void setStock(Integer stock) { + this.stock = stock; + } + + public Long getSeckillStockPointSkuId() { + return seckillStockPointSkuId; + } + + public void setSeckillStockPointSkuId(Long seckillStockPointSkuId) { + this.seckillStockPointSkuId = seckillStockPointSkuId; + } + + public Long getStockPointId() { + return stockPointId; + } + + public void setStockPointId(Long stockPointId) { + this.stockPointId = stockPointId; + } + + public Integer getStockPointType() { + return stockPointType; + } + + public void setStockPointType(Integer stockPointType) { + this.stockPointType = stockPointType; + } + + public Long getSkuId() { + return skuId; + } + + public void setSkuId(Long skuId) { + this.skuId = skuId; + } + + public Long getSeckillSkuId() { + return seckillSkuId; + } + + public void setSeckillSkuId(Long seckillSkuId) { + this.seckillSkuId = seckillSkuId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @Override + public String toString() { + return "SeckillStockPointSkuVO{" + + "seckillStockPointSkuId=" + seckillStockPointSkuId + + ",stockPointId=" + stockPointId + + ",stockPointType=" + stockPointType + + ",skuId=" + skuId + + ",seckillSkuId=" + seckillSkuId + + ",status=" + status + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",type=" + type + + ",spuId=" + spuId + + ",stock=" + stock + + '}'; + } +} diff --git a/tmerclub-seckill/src/main/resources/logback.xml b/tmerclub-seckill/src/main/resources/logback.xml new file mode 100644 index 0000000..5804d46 --- /dev/null +++ b/tmerclub-seckill/src/main/resources/logback.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + true + + ${FILE_LOG_PATTERN} + UTF-8 + + ${PROJECT_PATH}/log/api.log + + + ${logging.level} + + + ${PROJECT_PATH}/log/api/%d{yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz + ${LOG_FILE_MAX_SIZE} + ${LOG_FILE_MAX_HISTORY} + + + + + + + + + + + + + diff --git a/tmerclub-seckill/src/main/resources/mapper/SeckillMapper.xml b/tmerclub-seckill/src/main/resources/mapper/SeckillMapper.xml new file mode 100644 index 0000000..59bdca1 --- /dev/null +++ b/tmerclub-seckill/src/main/resources/mapper/SeckillMapper.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + `seckill_id` + ,`seckill_name`,`start_time`,`end_time`,`selected_lot`,seckill.category_id,`seckill_tag`,`max_num`,`max_cancel_time`,`shop_id`,`is_delete`,`status`,`spu_id`,`seckill_total_stocks`,`seckill_origin_stocks`,`seckill_price`,`replenish` + + + + + + + + + + + + + + insert into seckill (`seckill_name`, `start_time`, `end_time`, `selected_lot`, `category_id`, `seckill_tag`, + `max_num`, `max_cancel_time`, `shop_id`, `is_delete`, `status`, `spu_id`, + `seckill_total_stocks`, `seckill_origin_stocks`, `seckill_price`,`replenish`) + values (#{seckill.seckillName}, #{seckill.startTime}, #{seckill.endTime}, #{seckill.selectedLot}, + #{seckill.categoryId}, #{seckill.seckillTag}, #{seckill.maxNum}, #{seckill.maxCancelTime}, + #{seckill.shopId}, #{seckill.isDelete}, #{seckill.status}, #{seckill.spuId}, + #{seckill.seckillTotalStocks}, #{seckill.seckillOriginStocks}, #{seckill.seckillPrice}, #{seckill.replenish}); + + + + update seckill + + + `seckill_name` = #{seckill.seckillName}, + + + `start_time` = #{seckill.startTime}, + + + `selected_lot` = #{seckill.selectedLot}, + + + `seckill_tag` = #{seckill.seckillTag}, + + + `max_num` = #{seckill.maxNum}, + + + `max_cancel_time` = #{seckill.maxCancelTime}, + + + `shop_id` = #{seckill.shopId}, + + + `is_delete` = #{seckill.isDelete}, + + + `status` = #{seckill.status}, + + + `spu_id` = #{seckill.spuId}, + + + `seckill_total_stocks` = #{seckill.seckillTotalStocks}, + + + `seckill_origin_stocks` = #{seckill.seckillOriginStocks}, + + + `seckill_price` = #{seckill.seckillPrice}, + + + where seckill_id = #{seckill.seckillId} + + + delete + from seckill + where seckill_id = #{seckillId} + + + + + + + + UPDATE seckill + set seckill_total_stocks = seckill_total_stocks - #{prodCount} + where seckill_id = #{seckillId} + and seckill_total_stocks >= #{prodCount} + + + + UPDATE seckill set is_delete = -1,status = -1 where seckill_id in + + #{seckill.seckillId} + + + + UPDATE seckill + SET seckill_total_stocks = seckill_total_stocks + #{count} + WHERE seckill_id = #{seckillId} + + + + + + + + UPDATE seckill SET `status` = 0 WHERE seckill_id IN + + #{seckill.seckillId} + + + + + UPDATE seckill SET `status` = 0 WHERE spu_id IN + + #{spuId} + + + + + + + + + diff --git a/tmerclub-seckill/src/main/resources/mapper/SeckillStockPointSkuMapper.xml b/tmerclub-seckill/src/main/resources/mapper/SeckillStockPointSkuMapper.xml new file mode 100644 index 0000000..cc2a812 --- /dev/null +++ b/tmerclub-seckill/src/main/resources/mapper/SeckillStockPointSkuMapper.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + `seckill_stock_point_sku_id`,`stock_point_id`,`stock_point_type`,`sku_id`,`seckill_sku_id`,`status`,`create_time`,`update_time`,`type` + + + + + insert into seckill_stock_point_sku (`stock_point_id`,`stock_point_type`,`sku_id`,`seckill_sku_id`,`status`,`type`) + values (#{seckillStockPointSku.stockPointId},#{seckillStockPointSku.stockPointType},#{seckillStockPointSku.skuId},#{seckillStockPointSku.seckillSkuId},#{seckillStockPointSku.status},#{seckillStockPointSku.type}); + + + update seckill_stock_point_sku + + + `stock_point_id` = #{seckillStockPointSku.stockPointId}, + + + `stock_point_type` = #{seckillStockPointSku.stockPointType}, + + + `sku_id` = #{seckillStockPointSku.skuId}, + + + `seckill_sku_id` = #{seckillStockPointSku.seckillSkuId}, + + + `status` = #{seckillStockPointSku.status}, + + + `type` = #{seckillStockPointSku.type}, + + + where seckill_stock_point_sku_id = #{seckillStockPointSku.seckillStockPointSkuId} + + + delete from seckill_stock_point_sku where seckill_stock_point_sku_id = #{seckillStockPointSkuId} + + + + diff --git a/tmerclub-user/pom.xml b/tmerclub-user/pom.xml new file mode 100644 index 0000000..1f1fb28 --- /dev/null +++ b/tmerclub-user/pom.xml @@ -0,0 +1,98 @@ + + + + tmerclub + com.moyuer.cloud + 0.0.1 + + 4.0.0 + + tmerclub-user + mall4cloud 用户服务 + jar + + + + + com.moyuer.cloud + tmerclub-common-database + ${project.version} + + + com.moyuer.cloud + tmerclub-common-security + ${project.version} + + + com.moyuer.cloud + tmerclub-common-leaf + ${project.version} + + + com.moyuer.cloud + tmerclub-common-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-user + ${project.version} + + + com.moyuer.cloud + tmerclub-api-search + ${project.version} + + + com.moyuer.cloud + tmerclub-api-marketing + ${project.version} + + + com.moyuer.cloud + tmerclub-api-admin + ${project.version} + + + com.moyuer.cloud + tmerclub-api-biz + ${project.version} + + + com.moyuer.cloud + tmerclub-api-order + ${project.version} + + + com.moyuer.cloud + tmerclub-api-product + ${project.version} + + + com.moyuer.cloud + tmerclub-common-rocketmq + ${project.version} + + + com.moyuer.cloud + tmerclub-common-mongodb + ${project.version} + + + com.xuxueli + xxl-job-core + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/UserApplication.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/UserApplication.java new file mode 100644 index 0000000..27e5830 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/UserApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; + +/** + * @author FrozenWatermelon + * @date 2020/11/19 + */ +@SpringBootApplication(scanBasePackages = "com.moyuer.cloud", exclude = UserDetailsServiceAutoConfiguration.class) +@EnableDubbo(scanBasePackages = "com.moyuer.cloud.**.feign") +public class UserApplication { + + public static void main(String[] args) { + SpringApplication.run(UserApplication.class, args); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/JumpUrlBO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/JumpUrlBO.java new file mode 100644 index 0000000..71a0ee1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/JumpUrlBO.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.bo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 跳转链接 + * @author TRACK + */ +public class JumpUrlBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "类型 1.商品 2.分类 3.店铺 4.页面 5.微页面 6.自定义链接 7.优惠券") + private String type; + + @Schema(description = "商品名称/优惠券名称等") + private String name; + + @Schema(description = "商品id/优惠券id等") + private String link; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + @Override + public String toString() { + return "JumpUrlBO{" + + "type='" + type + '\'' + + ", name='" + name + '\'' + + ", link='" + link + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/UserScoreChangeLogBO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/UserScoreChangeLogBO.java new file mode 100644 index 0000000..cc604f5 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/UserScoreChangeLogBO.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.bo; + +import com.tmerclub.cloud.user.model.UserScoreGetLog; +import com.tmerclub.cloud.user.model.UserScoreLog; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 用户积分日志、积分明细 + * + * @author cl + * @date 2021-06-17 17:46:07 + */ +public class UserScoreChangeLogBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "用户积分日志集合") + private List userScoreLogs; + + @Schema(description = "用户积分明细集合-保存") + private List saveUserScoreGetLogs; + + @Schema(description = "用户积分明细集合-修改") + private List updateUserScoreGetLogs; + + public List getUserScoreLogs() { + return userScoreLogs; + } + + public void setUserScoreLogs(List userScoreLogs) { + this.userScoreLogs = userScoreLogs; + } + + public List getSaveUserScoreGetLogs() { + return saveUserScoreGetLogs; + } + + public void setSaveUserScoreGetLogs(List saveUserScoreGetLogs) { + this.saveUserScoreGetLogs = saveUserScoreGetLogs; + } + + public List getUpdateUserScoreGetLogs() { + return updateUserScoreGetLogs; + } + + public void setUpdateUserScoreGetLogs(List updateUserScoreGetLogs) { + this.updateUserScoreGetLogs = updateUserScoreGetLogs; + } + + @Override + public String toString() { + return "UserScoreChangeLogBO{" + + "userScoreLogs=" + userScoreLogs + + ", saveUserScoreGetLogs=" + saveUserScoreGetLogs + + ", updateUserScoreGetLogs=" + updateUserScoreGetLogs + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoPopupUserLogBO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoPopupUserLogBO.java new file mode 100644 index 0000000..e59e264 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/bo/mongo/MongoPopupUserLogBO.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.bo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.index.CompoundIndex; +import org.springframework.data.mongodb.core.index.CompoundIndexes; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 弹窗记录mongodb + * @author TRACK + */ +@Document("popup_user_log") +@CompoundIndexes({ + @CompoundIndex(name = "idx_user_popup", def = "{'popupId':1, 'userId':1}"), + @CompoundIndex(name = "idx_uuid_popup", def = "{'popupId':1, 'uuid':1}"), + @CompoundIndex(name = "idx_user_time_popup", def = "{'popupId':1, 'userId':1, 'createTime':1}"), + @CompoundIndex(name = "idx_uuid_time_popup", def = "{'popupId':1, 'uuid':1, 'createTime':1}") +}) +public class MongoPopupUserLogBO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "弹窗id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long popupId; + + @Schema(description = "弹窗时间 yyMMdd", requiredMode = Schema.RequiredMode.REQUIRED) + private String createTime; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "游客uuid") + private Long uuid; + + public MongoPopupUserLogBO() { + } + + public MongoPopupUserLogBO(Long popupId, Long userId, Long uuid) { + this.popupId = popupId; + this.userId = userId; + this.uuid = uuid; + } + + public Long getPopupId() { + return popupId; + } + + public void setPopupId(Long popupId) { + this.popupId = popupId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getUuid() { + return uuid; + } + + public void setUuid(Long uuid) { + this.uuid = uuid; + } + + @Override + public String toString() { + return "MongoPopupUserLogBO{" + + "popupId=" + popupId + + ", createTime=" + createTime + + ", userId=" + userId + + ", uuid='" + uuid + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/UserThreadConfig.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/UserThreadConfig.java new file mode 100644 index 0000000..500fbfc --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/config/UserThreadConfig.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.config; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author cl + * @date 2021-05-11 15:48:02 + */ +@Configuration +@EnableConfigurationProperties(ThreadPoolConfigProperties.class) +public class UserThreadConfig { + + /** + * 因为每台机器不同,所以线程数量应该是通过配置文件进行配置的 + * 主要用来多线程导出用户信息 + * @param pool 线程池配置信息 + * @return 用户信息线程池 + */ + @Bean + public ThreadPoolExecutor userThreadPoolExecutor(ThreadPoolConfigProperties pool) { + return new ThreadPoolExecutor( + pool.getCoreSize(), + pool.getMaxSize(), + pool.getKeepAliveTime(), + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(100000), + new ThreadFactoryBuilder() + .setNameFormat("User-Thread-Pool-%d").build() + ); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DiscountRangeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DiscountRangeEnum.java new file mode 100644 index 0000000..3748b24 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DiscountRangeEnum.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 折扣范围[0.全平台 1.自营店] + * + * @author Pineapple + * @date 2021/5/10 14:47 + */ +public enum DiscountRangeEnum { + /** + * 全平台 + */ + ALL_PLATFORMS(0), + + /** + * 自营店 + */ + SELF_OPERATED_STORE(1); + + private final Integer value; + + public Integer value() { + return value; + } + + DiscountRangeEnum(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DiscountTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DiscountTypeEnum.java new file mode 100644 index 0000000..e050853 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/DiscountTypeEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 会员等级折扣商品类型 + * + * @author yxf + * @date 2020/11/20 + */ +public enum DiscountTypeEnum { + + /** + * 全部商品 + */ + ALL_SPU(0), + + /** + * 分类下的商品 + */ + CATEGORY_SPU(1); + + private final Integer value; + + public Integer value() { + return value; + } + + DiscountTypeEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/LevelChangeReasonEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/LevelChangeReasonEnum.java new file mode 100644 index 0000000..3b8c9b2 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/LevelChangeReasonEnum.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 用户等级变更原因1.成长值不足 2.成长值足够 3.购买会员 4.续费会员 5.会员到期 + * + * @author FrozenWatermelon + */ +public enum LevelChangeReasonEnum { + /** + * 成长值不足 + */ + GROWTH_NOT_ENOUGH(1), + + /** + * 成长值足够 + */ + GROWTH_ENOUGH(2), + + /** + * 购买会员 + */ + BUY_VIP(3), + + /** + * 续费会员 + */ + RENEW_VIP(4), + + /** + * 会员到期 + */ + VIP_EXPIRE(5), + + /** + * 会员等级配置更新 + * user_level 表增加/删除/修改 引起用户等级发生变化 + */ + USER_LEVEL_CHANGE(6); + + private final Integer value; + + public Integer value() { + return value; + } + + LevelChangeReasonEnum(Integer value) { + this.value = value; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/LevelTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/LevelTypeEnum.java new file mode 100644 index 0000000..bb6ea64 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/LevelTypeEnum.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 等级 + * + * @author yxf + * @date 2020/11/20 + */ +public enum LevelTypeEnum { + + /** + * 普通会员 + */ + ORDINARY_USER(0, "普通会员"), + + /** + * 付费会员 + */ + PAY_USER(1, "付费会员"); + + private final Integer value; + + private final String desc; + + public Integer value() { + return value; + } + + public String desc() { + return desc; + } + + LevelTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public static LevelTypeEnum instance(Integer value) { + LevelTypeEnum[] enums = values(); + for (LevelTypeEnum typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupStatusEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupStatusEnum.java new file mode 100644 index 0000000..f168f00 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PopupStatusEnum.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 弹窗广告状态 1.未开始 2.投放中 3.已结束 + * @author TRACK + */ +public enum PopupStatusEnum { + + /** + * 未开始 + */ + NOT_START(1), + + /** + * 投放中 + */ + PUT_ON(2), + + /** + * 已结束 + */ + FINISH(3); + + private final Integer value; + + public Integer value() { + return value; + } + + PopupStatusEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PushFrequencyEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PushFrequencyEnum.java new file mode 100644 index 0000000..5c76bfc --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/PushFrequencyEnum.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 推送频次 0.永久一次 1.每次进入 2.自定义频次 + * @author TRACK + */ +public enum PushFrequencyEnum { + + /** + * 永久一次 -- 只给用户推送一次 + */ + ONCE(0), + + /** + * 每次进入 -- 用户每次到达触发页面都会推送 + */ + EVERY_TIME(1), + + /** + * 自定义频次 -- 可按天、周来定期推送一次 + */ + CUSTOM(2); + + private final Integer value; + + public Integer value() { + return value; + } + + PushFrequencyEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RecentDaysTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RecentDaysTypeEnum.java new file mode 100644 index 0000000..ce1f149 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RecentDaysTypeEnum.java @@ -0,0 +1,81 @@ + + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 最近几天类型 + * @author cl + * @date 2021-05-18 17:17:54 + */ +public enum RecentDaysTypeEnum { + + /** + * 今天 + */ + TODAY(0), + + /** + * 最近7天 + */ + RECENT_SEVEN_DAYS(7), + + /** + * 最近15天 + */ + RECENT_FIFTEEN_DAYS(15), + + /** + * 最近30天 + */ + RECENT_THIRTY_DAYS(30), + + /** + * 最近45天 + */ + RECENT_FORTY_FIVE_DAYS(45), + + /** + * 最近60天 + */ + RECENT_SIXTY_DAYS(60), + + /** + * 最近90天 + */ + RECENT_NINETY_DAYS(90), + + /** + * 最近180天 + */ + RECENT_ONE_HUNDRED_AND_EIGHTY_DAYS(180); + + private final Integer num; + + public Integer value() { + return num; + } + + RecentDaysTypeEnum(Integer num) { + this.num = num; + } + + public static RecentDaysTypeEnum instance(Integer value) { + RecentDaysTypeEnum[] enums = values(); + for (RecentDaysTypeEnum statusEnum : enums) { + if (statusEnum.value().equals(value)) { + return statusEnum; + } + } + return null; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RechargeIoTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RechargeIoTypeEnum.java new file mode 100644 index 0000000..97222de --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RechargeIoTypeEnum.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 充值 收入 支出 + * + * @author cl + * @date 2021-4-28 10:04:25 + */ +public enum RechargeIoTypeEnum { + /** + * 0.支出 + */ + EXPENDITURE(0), + /** + * 1. 收入 + */ + INCOME(1), + ; + + private final Integer num; + + public Integer value() { + return num; + } + + RechargeIoTypeEnum(Integer num) { + this.num = num; + } + + public static RechargeIoTypeEnum instance(Integer value) { + RechargeIoTypeEnum[] enums = values(); + for (RechargeIoTypeEnum typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RechargeTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RechargeTypeEnum.java new file mode 100644 index 0000000..e8d3ca7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/RechargeTypeEnum.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 充值类型 1:充值 2:赠送 3:支付 4:退款 5:平台手动修改 + * + * @author cl + * @date 2021-4-28 10:04:28 + */ +public enum RechargeTypeEnum { + + /** + * 1.充值 + */ + RECHARGE(1), + + /** + * 赠送 + */ + PRESENT(2), + + /** + * 支付 + */ + PAY(3), + + /** + * 退款 + */ + REFUND(4), + + /** + * 平台手动修改 + */ + SYSTEM(5), + + /** + * 购买会员 + */ + VIP(6), + + /** + * 提现 + */ + WITHDRAW(7); + + + private final Integer num; + + public Integer value() { + return num; + } + + RechargeTypeEnum(Integer num) { + this.num = num; + } + + public static RechargeTypeEnum instance(Integer value) { + RechargeTypeEnum[] enums = values(); + for (RechargeTypeEnum typeEnum : enums) { + if (typeEnum.value().equals(value)) { + return typeEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreGetLogStatusEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreGetLogStatusEnum.java new file mode 100644 index 0000000..0921ca9 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/ScoreGetLogStatusEnum.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 积分明细状态 + * + * @author yxf + * @date 2020/11/20 + */ +public enum ScoreGetLogStatusEnum { + + /** + * 过期 + */ + EXPIRED(-1), + /** + * 订单抵现 + */ + OFFSET_CASH(0), + /** + * 正常 + */ + NORMAL(1); + + private final Integer value; + + public Integer value() { + return value; + } + + ScoreGetLogStatusEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/SystemUserRightsEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/SystemUserRightsEnum.java new file mode 100644 index 0000000..41f73f9 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/SystemUserRightsEnum.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 系统权益 + * + * @author YXF + * @date 2020-12-23 10:16:53 + */ +public enum SystemUserRightsEnum { + /** + * 打折 + */ + DISCOUNT(1L, 100), + /** + * 包邮 + */ + FREE_FEE(2L, null), + /** + * 送积分 + */ + SCORE(3L, 0), + /** + * 送优惠券 + */ + COUPON(4L, null), + /** + * 积分倍率 + */ + RATE_SCORE(5L, 1), + /** + * 折扣范围 + */ + DISCOUNT_RANGE(6L, null); + + private final Long id; + private final Integer defaultVallue; + + public Long value() { + return id; + } + + public Integer getDefaultVallue() { + return defaultVallue; + } + + SystemUserRightsEnum(Long id, Integer defaultVallue) { + this.id = id; + this.defaultVallue = defaultVallue; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/TermTypeEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/TermTypeEnum.java new file mode 100644 index 0000000..18d0514 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/TermTypeEnum.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 期数类型(0:月,1:季,2:年) + * + * @author Pineapple + * @date 2021/5/10 14:51 + */ +public enum TermTypeEnum { + /** + * 月 + */ + MONTH(0, 31), + + /** + * 季 + */ + SEASON(1, 92), + + /** + * 年 + */ + YEAR(2, 366); + + private final Integer value; + + private final Integer day; + + public Integer value() { + return value; + } + + public Integer getDay() { + return day; + } + + TermTypeEnum(Integer value, Integer day) { + this.value = value; + this.day = day; + } + + public static TermTypeEnum instance(Integer value) { + TermTypeEnum[] enums = values(); + for (TermTypeEnum termTypeEnum : enums) { + if (termTypeEnum.value().equals(value)) { + return termTypeEnum; + } + } + return null; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/UpdateStatusEnum.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/UpdateStatusEnum.java new file mode 100644 index 0000000..9606aa3 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/constant/UpdateStatusEnum.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.constant; + +/** + * 会员等级更新状态 + * + * @author yxf + * @date 2020/11/20 + */ +public enum UpdateStatusEnum { + + /** + * 未更新 + */ + WAIT_UPDATE(0), + + /** + * 已更新 + */ + UPDATE(1); + + private final Integer value; + + public Integer value() { + return value; + } + + UpdateStatusEnum(Integer value) { + this.value = value; + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/CostPerPopupController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/CostPerPopupController.java new file mode 100644 index 0000000..a9482bc --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/CostPerPopupController.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.auth.bo.UidInfoBO; +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.payment.constant.PayEntry; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.bo.OrderStatusBO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.bo.mongo.MongoPopupUserLogBO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.constant.PopupPageTypeEnum; +import com.tmerclub.cloud.user.dto.QueryPopupDTO; +import com.tmerclub.cloud.user.model.CostPerPopup; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.service.*; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * 弹窗广告 + * @author TRACK + */ +@RestController("userCostPerPopupController") +@RequestMapping("/ma/cost_per_popup") +@Tag(name = "用户弹窗广告") +public class CostPerPopupController { + + @Autowired + private CostPerPopupService costPerPopupService; + @Autowired + private UserService userService; + @Autowired + private ShopCustomerService shopCustomerService; + @Autowired + private PopupUserLogService popupUserLogService; + @Autowired + private UserLevelService userLevelService; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private UserBalanceLogService userBalanceLogService; + @Autowired + private UserLevelLogService userLevelLogService; + + @PostMapping("/popup") + @Operation(summary = "获取用户在当前页面的弹窗广告") + public ServerResponseEntity page(@RequestBody QueryPopupDTO queryPopupDTO) { + Long userId = getUserId(queryPopupDTO.getUuid()); + // 先获取有没有符合条件的一个弹窗广告 + CostPerPopup costPerPopup = getCostPerPopup(queryPopupDTO, userId); + if (Objects.isNull(costPerPopup)) { + // 没有符合条件的弹窗广告直接返回 + return ServerResponseEntity.success(); + } + if (Objects.equals(queryPopupDTO.getPageType(), PopupPageTypeEnum.PAY_SUCCESS.value())) { + if (Objects.equals(queryPopupDTO.getPayEntry(), PayEntry.ORDER.value())) { + List orderStatusBOList = + orderFeignClient.getOrdersStatus(Collections.singletonList(queryPopupDTO.getOrderId())).getData(); + if (CollUtil.isEmpty(orderStatusBOList) || OrderStatus.unPay(orderStatusBOList.get(0).getStatus())) { + // 没有支付成功不记录弹窗广告 + return ServerResponseEntity.success(); + } + } + else if (Objects.equals(queryPopupDTO.getPayEntry(), PayEntry.RECHARGE.value())) { + MongoUserBalanceLogBO userBalanceLogBO = userBalanceLogService.getByBalanceLogId(queryPopupDTO.getOrderId()); + if (Objects.isNull(userBalanceLogBO) || Objects.equals(userBalanceLogBO.getIsPayed(), 0)) { + // 没有支付成功不记录弹窗广告 + return ServerResponseEntity.success(); + } + } + else if (Objects.equals(queryPopupDTO.getPayEntry(), PayEntry.VIP.value())) { + UserLevelLog userLevelLog = userLevelLogService.getByLevelLogId(queryPopupDTO.getOrderId()); + if (Objects.isNull(userLevelLog) || Objects.equals(userLevelLog.getIsPayed(), 0)) { + // 没有支付成功不记录弹窗广告 + return ServerResponseEntity.success(); + } + } + } + // 最后保存弹窗广告记录 + popupUserLogService.save(new MongoPopupUserLogBO(costPerPopup.getPopupId(), userId, queryPopupDTO.getUuid())); + return ServerResponseEntity.success(costPerPopup); + } + + private CostPerPopup getCostPerPopup(QueryPopupDTO queryPopupDTO, Long userId) { + Long uuid = queryPopupDTO.getUuid(); + Integer pageType = queryPopupDTO.getPageType(); + Long shopId = queryPopupDTO.getShopId(); + CostPerPopup costPerPopup; + if (PopupPageTypeEnum.isSys(pageType)) { + // 平台弹窗 + UserApiVO userApiVO = getUserApiVO(userId); + costPerPopup = costPerPopupService.getSysPopupByCondition(userApiVO, pageType, uuid); + } else { + // 商家弹窗 + Integer isShopCustomer = Objects.nonNull(userId) ? shopCustomerService.getIsShopCustomer(shopId, userId) : 0; + costPerPopup = costPerPopupService.getShopPopupByCondition(isShopCustomer, pageType, queryPopupDTO.getSpuId(), shopId, userId, uuid); + } + return costPerPopup; + } + + private static Long getUserId(Long uuid) { + UidInfoBO uidInfoBO = AuthUserContext.get(); + Long userId = null; + if (Objects.nonNull(uidInfoBO)) { + userId = uidInfoBO.getUserId(); + } else if (Objects.isNull(uuid)){ + throw new LuckException("uuid不能为空"); + } + return userId; + } + + private UserApiVO getUserApiVO(Long userId) { + UserApiVO userApiVO = new UserApiVO(); + if (Objects.nonNull(userId)) { + userApiVO = userService.getByUserId(userId); + UserLevelVO ordinary = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.ORDINARY_USER.value(), userApiVO.getLevel()); + userApiVO.setUserLevelId(ordinary.getUserLevelId()); + if (Objects.equals(userApiVO.getLevelType(), LevelTypeEnum.PAY_USER.value()) && Objects.nonNull(userApiVO.getVipLevel())) { + UserLevelVO vip = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.PAY_USER.value(), userApiVO.getVipLevel()); + userApiVO.setVipUserLevelId(vip.getUserLevelId()); + } + } + return userApiVO; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserAddrController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserAddrController.java new file mode 100644 index 0000000..e34c9d6 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserAddrController.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.dto.UserAddrDTO; +import com.tmerclub.cloud.user.model.UserAddr; +import com.tmerclub.cloud.user.service.UserAddrService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户地址 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +@RestController("appUserAddrController") +@RequestMapping("/user_addr") +@Tag(name = "app-用户地址") +public class UserAddrController { + + @Autowired + private UserAddrService userAddrService; + + + private static final Integer MAX_USER_ADDR = 10; + + @GetMapping("/list") + @Operation(summary = "获取用户地址列表", description = "获取用户地址列表") + public ServerResponseEntity> list() { + Long userId = AuthUserContext.get().getUserId(); + List userAddrPage = userAddrService.list(userId); + return ServerResponseEntity.success(userAddrPage); + } + + @GetMapping + @Operation(summary = "获取用户地址", description = "根据addrId获取用户地址") + public ServerResponseEntity getByAddrId(@RequestParam Long addrId) { + return ServerResponseEntity.success(userAddrService.getUserAddrByUserId(addrId, AuthUserContext.get().getUserId())); + } + + @PostMapping + @Operation(summary = "保存用户地址", description = "保存用户地址") + public ServerResponseEntity save(@Valid @RequestBody UserAddrDTO userAddrDTO) { + Long userId = AuthUserContext.get().getUserId(); + int userAddrCount = userAddrService.countByUserId(userId); + if (userAddrCount >= MAX_USER_ADDR) { + return ServerResponseEntity.showFailMsg("收货地址已达到上限,无法再新增地址"); + } + UserAddr userAddr = BeanUtil.map(userAddrDTO, UserAddr.class); + if (userAddrCount == 0) { + userAddr.setIsDefault(UserAddr.DEFAULT_ADDR); + } else if (!UserAddr.DEFAULT_ADDR.equals(userAddr.getIsDefault())) { + userAddr.setIsDefault(UserAddr.NOT_DEFAULT_ADDR); + } + userAddr.setAddrId(null); + userAddr.setUserId(userId); + userAddrService.save(userAddr); + // 清除默认地址缓存 + if (UserAddr.DEFAULT_ADDR.equals(userAddr.getIsDefault())) { + userAddrService.removeUserDefaultAddrCacheByUserId(userId); + } + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新用户地址", description = "更新用户地址") + public ServerResponseEntity update(@Valid @RequestBody UserAddrDTO userAddrDTO) { + Long userId = AuthUserContext.get().getUserId(); + UserAddrVO dbUserAddr = userAddrService.getUserAddrByUserId(userAddrDTO.getAddrId(), userId); + if (dbUserAddr == null) { + throw new LuckException("该地址已被删除"); + } + // 默认地址不能修改为普通地址 + else if (dbUserAddr.getIsDefault().equals(UserAddr.DEFAULT_ADDR) && userAddrDTO.getIsDefault().equals(UserAddr.NOT_DEFAULT_ADDR)) { + throw new LuckException(ResponseEnum.DATA_ERROR); + } + UserAddr userAddr = BeanUtil.map(userAddrDTO, UserAddr.class); + userAddr.setUserId(userId); + userAddrService.update(userAddr); + // 清除默认地址缓存 + if (userAddr.getIsDefault().equals(UserAddr.DEFAULT_ADDR)) { + userAddrService.removeUserDefaultAddrCacheByUserId(userId); + } + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除用户地址", description = "根据用户地址id删除用户地址") + public ServerResponseEntity delete(@RequestParam Long addrId) { + Long userId = AuthUserContext.get().getUserId(); + UserAddrVO dbUserAddr = userAddrService.getUserAddrByUserId(addrId, userId); + if (dbUserAddr == null) { + throw new LuckException("该地址已被删除"); + } else if (dbUserAddr.getIsDefault().equals(UserAddr.DEFAULT_ADDR)) { + throw new LuckException("默认地址不能删除"); + } + userAddrService.deleteUserAddrByUserId(addrId, userId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserBalanceLogController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserBalanceLogController.java new file mode 100644 index 0000000..7c7e6c2 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserBalanceLogController.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.vo.UserBalanceLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +@RestController("appUserBalanceLogController") +@RequestMapping("/user_balance_log") +@Tag(name = "余额记录") +public class UserBalanceLogController { + + @Autowired + private UserBalanceLogService userBalanceLogService; + + @GetMapping("/page") + @Operation(summary = "获取余额记录列表", description = "分页获取余额记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + Long userId = AuthUserContext.get().getUserId(); + PageVO userBalanceLogPage = userBalanceLogService.getPageByUserId(pageDTO, userId); + return ServerResponseEntity.success(userBalanceLogPage); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserGrowthLogController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserGrowthLogController.java new file mode 100644 index 0000000..0f99b14 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserGrowthLogController.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.service.UserGrowthLogService; +import com.tmerclub.cloud.user.vo.UserGrowthLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 YXF + * @date 2020-12-08 10:16:53 + */ +@RestController("appUserGrowthLogController") +@RequestMapping("/user_growth_log") +@Tag(name = "app-用户成长值记录") +public class UserGrowthLogController { + + @Autowired + private UserGrowthLogService userGrowthLogService; + + + @GetMapping("/page") + @Operation(summary = "获取用户成长值记录列表", description = "分页获取用户成长值记录列表") + public ServerResponseEntity> getPageByUserId(@Valid PageDTO pageDTO) { + Long userId = AuthUserContext.get().getUserId(); + PageVO userGrowthLogPage = userGrowthLogService.getPageByUserId(pageDTO, userId); + return ServerResponseEntity.success(userGrowthLogPage); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserLevelController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserLevelController.java new file mode 100644 index 0000000..2aad844 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserLevelController.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.api.payment.vo.PaySettlementConfigVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.constant.LevelChangeReasonEnum; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.constant.RecruitStatusEnum; +import com.tmerclub.cloud.user.dto.UserLevelRechargeOrderDTO; +import com.tmerclub.cloud.user.mapper.UserLevelTermMapper; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.service.*; +import com.tmerclub.cloud.user.vo.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 会员等级表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@RestController("appUserLevelController") +@RequestMapping("/user_level") +@Tag(name = "app-会员等级表") +public class UserLevelController { + + @Autowired + private UserLevelService userLevelService; + + @Autowired + private UserExtensionService userExtensionService; + + @DubboReference + private ConfigFeignClient configFeignClient; + + @Autowired + private UserLevelLogService userLevelLogService; + + @Autowired + private UserLevelTermService userLevelTermService; + + @Autowired + private UserLevelTermMapper userLevelTermMapper; + + @Autowired + private UserService userService; + + @GetMapping("/member_info") + @Operation(summary = "获取用户会员中心信息", description = "获取用户会员中心信息") + public ServerResponseEntity getMemberInfoVO() { + Long userId = AuthUserContext.get().getUserId(); + UserApiVO user = userService.getByUserId(userId); + // 查询用户基本信息名称加头像 + UserMemberInfoVO userMemberInfoVO = new UserMemberInfoVO(); + userMemberInfoVO.setNickName(user.getNickName()); + userMemberInfoVO.setPic(user.getPic()); + userMemberInfoVO.setExpireTime(user.getVipEndTime()); + // 查询用户扩展信息 + UserExtension userExtension = userExtensionService.getByUserId(userId); + userMemberInfoVO.setScore(userExtension.getScore()); + userMemberInfoVO.setGrowth(userExtension.getGrowth()); + //设置用户的会员等级信息 + setLevelInformation(userMemberInfoVO, userExtension); + userMemberInfoVO.setSignInCount(userExtension.getSignDay()); + // 查询成长值配置信息 + String growthConfigValue = configFeignClient.getConfig(ConfigNameConstant.GROWTH_CONFIG).getData(); + GrowthCompleteConfigVO growthCompleteConfigVO = Json.parseObject(growthConfigValue, GrowthCompleteConfigVO.class); + userMemberInfoVO.setShopScore(growthCompleteConfigVO.getBuyOrder()); + + return ServerResponseEntity.success(userMemberInfoVO); + } + + @GetMapping("/ua/list_level_by_type") + @Operation(summary = "会员等级列表信息", description = "会员等级列表信息") + @Parameter(name = "levelType", description = "会员等级类型0为根据会员自身情况 1为付费", required = true) + public ServerResponseEntity> listLevel(Integer levelType) { + List userLevelVOList = userLevelService.list(levelType); + return ServerResponseEntity.success(userLevelVOList); + } + + /** + * 等级页展示 + * + * @return 等级页展示 + */ + @GetMapping("/get_level_show") + @Operation(summary = "会员中心页展示", description = "会员中心页展示") + public ServerResponseEntity getLevelShow() { + String growthDescriptionValue = configFeignClient.getConfig(ConfigNameConstant.MEMBER_GROWTH_DESCRIPTION).getData(); + if (Objects.isNull(growthDescriptionValue)) { + return ServerResponseEntity.success(); + } + return ServerResponseEntity.success(growthDescriptionValue); + } + + + @GetMapping("/get_user_level_term") + @Operation(summary = "会员等级期数表", description = "会员等级期数表列表") + @Parameter(name = "userLevelId", description = "用户会员等级id", required = true) + public ServerResponseEntity> getUserLevelTerm(Long userLevelId) { + List levelTermVOList = userLevelTermService.getAmountAndTypeByUserLevelId(userLevelId); + int monthAmount = userLevelTermMapper.getMonthAmount(userLevelId); + + for (UserLevelTermVO levelTermVO : levelTermVOList) { + switch (levelTermVO.getTermType()) { + case 0: + levelTermVO.setOriginalPrice(monthAmount); + levelTermVO.setDiscount(Arith.div(levelTermVO.getNeedAmount(), levelTermVO.getOriginalPrice(), 2)); + break; + case 1: + levelTermVO.setOriginalPrice(monthAmount * 3); + levelTermVO.setDiscount(Arith.div(levelTermVO.getNeedAmount(), levelTermVO.getOriginalPrice(), 2)); + break; + case 2: + levelTermVO.setOriginalPrice(monthAmount * 12); + levelTermVO.setDiscount(Arith.div(levelTermVO.getNeedAmount(), levelTermVO.getOriginalPrice(), 2)); + break; + default: + break; + } + } + return ServerResponseEntity.success(levelTermVOList); + } + + @PostMapping("/buy_vip") + @Operation(summary = "购买付费会员", description = "付费 or 续费,成为付费会员") + public ServerResponseEntity save(@Valid @RequestBody UserLevelRechargeOrderDTO userLevelRechargeOrderDTO) { + + // 从缓存获取用户充值信息 + UserLevelVO userLevelVO = userLevelService.getByUserLevelId(userLevelRechargeOrderDTO.getUserLevelId()); + if (userLevelVO == null || !Objects.equals(LevelTypeEnum.PAY_USER.value(), userLevelVO.getLevelType())) { + return ServerResponseEntity.showFailMsg("订单异常,请刷新页面重试"); + } + if (Objects.equals(userLevelVO.getRecruitStatus(), RecruitStatusEnum.STOP_RECRUIT.value())) { + return ServerResponseEntity.showFailMsg("付费会员等级为:" + userLevelVO.getLevelName() + ",已停止招募"); + } + + List userLevelTerms = userLevelVO.getUserLevelTerms(); + + UserLevelTermVO userLevelTerm = null; + for (UserLevelTermVO userLevelTermVo : userLevelTerms) { + if (Objects.equals(userLevelTermVo.getLevelTermId(), userLevelRechargeOrderDTO.getLevelTermId())) { + userLevelTerm = userLevelTermVo; + } + } + if (userLevelTerm == null) { + return ServerResponseEntity.showFailMsg("订单异常,请刷新页面重试"); + } + + Long userId = AuthUserContext.get().getUserId(); + // 缓存中获取用户信息 + UserApiVO user = userService.getByUserId(userId); + // 已付费会员不能购买其他等级的会员,请到期后重新购买 + if (Objects.equals(user.getLevelType(), LevelTypeEnum.PAY_USER.value()) && !Objects.equals(user.getVipLevel(), userLevelVO.getLevel())) { + return ServerResponseEntity.showFailMsg("已付费会员不能购买其他等级的会员,请到期后重新购买"); + } + UserLevelVO userlevel = userLevelService.getByUserLevelId(userLevelRechargeOrderDTO.getUserLevelId()); + UserLevelLog userLevelLog = new UserLevelLog(); + userLevelLog.setUserId(userId); + userLevelLog.setPayAmount(userLevelTerm.getNeedAmount()); + userLevelLog.setAfterLevel(userLevelVO.getLevel()); + userLevelLog.setAfterLevelType(userLevelVO.getLevelType()); + userLevelLog.setBeforeLevel(user.getVipLevel() == null ? user.getLevel() : user.getVipLevel()); + userLevelLog.setBeforeLevelType(user.getLevelType()); + userLevelLog.setIsPayed(0); + userLevelLog.setLevelChangeReason(Objects.equals(user.getVipLevel(), userLevelVO.getLevel()) ? LevelChangeReasonEnum.RENEW_VIP.value() : LevelChangeReasonEnum.BUY_VIP.value()); + userLevelLog.setLevelIoType(Objects.equals(user.getVipLevel(), userLevelVO.getLevel()) ? 0 : 1); + userLevelLog.setTermType(userLevelTerm.getTermType()); + userLevelLog.setLevelName(userlevel.getLevelName()); + // 补充支付系统类型 + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + userLevelLog.setPaySysType(paySettlementConfigVO.getPaySettlementType()); + userLevelLogService.save(userLevelLog); + return ServerResponseEntity.success(userLevelLog.getLevelLogId()); + } + + @GetMapping("/list_rights_by_level_type") + @Operation(summary = "根据会员类型查权益", description = "0普通会员 1付费会员") + @Parameter(name = "levelType", description = " 会员等级类型0为根据会员自身情况 1为付费") + public List listRightsByLevelType(Integer levelType) { + return userLevelService.listRightsByLevelType(levelType, null); + } + + private void setLevelInformation(UserMemberInfoVO userMemberInfoVO, UserExtension userExtension) { + // 查询用户当前普通会员的等级信息 + UserLevelVO ordinaryLevel = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.ORDINARY_USER.value(), userExtension.getLevel()); + userMemberInfoVO.setUserOrdinaryLevel(ordinaryLevel); + //用户当前的付费会员信息 + if (Objects.nonNull(userExtension.getVipLevel()) && Objects.equals(userExtension.getLevelType(), LevelTypeEnum.PAY_USER.value())) { + UserLevelVO payedLevel = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.PAY_USER.value(), userExtension.getVipLevel()); + userMemberInfoVO.setUserPayedLevel(payedLevel); + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRechargeCouponController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRechargeCouponController.java new file mode 100644 index 0000000..6708e38 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserRechargeCouponController.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.dto.UserRechargeCouponDTO; +import com.tmerclub.cloud.user.model.UserRechargeCoupon; +import com.tmerclub.cloud.user.service.UserRechargeCouponService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 余额优惠券关联表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +@RestController("appUserRechargeCouponController") +@RequestMapping("/user_recharge_coupon") +@Tag(name = "余额优惠券关联表") +public class UserRechargeCouponController { + + @Autowired + private UserRechargeCouponService userRechargeCouponService; + + + @GetMapping("/page") + @Operation(summary = "获取余额优惠券关联表列表", description = "分页获取余额优惠券关联表列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO) { + PageVO userRechargeCouponPage = userRechargeCouponService.page(pageDTO); + return ServerResponseEntity.success(userRechargeCouponPage); + } + + @GetMapping + @Operation(summary = "获取余额优惠券关联表", description = "根据rechargeId获取余额优惠券关联表") + public ServerResponseEntity getByRechargeId(@RequestParam Long rechargeId) { + return ServerResponseEntity.success(userRechargeCouponService.getByRechargeId(rechargeId)); + } + + @PostMapping + @Operation(summary = "保存余额优惠券关联表", description = "保存余额优惠券关联表") + public ServerResponseEntity save(@Valid @RequestBody UserRechargeCouponDTO userRechargeCouponDTO) { + UserRechargeCoupon userRechargeCoupon = BeanUtil.map(userRechargeCouponDTO, UserRechargeCoupon.class); + userRechargeCouponService.save(userRechargeCoupon); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新余额优惠券关联表", description = "更新余额优惠券关联表") + public ServerResponseEntity update(@Valid @RequestBody UserRechargeCouponDTO userRechargeCouponDTO) { + UserRechargeCoupon userRechargeCoupon = BeanUtil.map(userRechargeCouponDTO, UserRechargeCoupon.class); + userRechargeCouponService.update(userRechargeCoupon); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除余额优惠券关联表", description = "根据余额优惠券关联表id删除余额优惠券关联表") + public ServerResponseEntity delete(@RequestParam Long rechargeId) { + userRechargeCouponService.deleteById(rechargeId); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserScoreLogController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserScoreLogController.java new file mode 100644 index 0000000..7afbc0a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserScoreLogController.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.UserScoreLogService; +import com.tmerclub.cloud.user.vo.UserScoreLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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; + +/** + * 用户积分记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@RestController("appUserScoreLogController") +@RequestMapping("/user_score_log") +@Tag(name = "app-用户积分记录") +public class UserScoreLogController { + + @Autowired + private UserScoreLogService userScoreLogService; + + @GetMapping("/page") + @Operation(summary = "获取用户积分记录列表", description = "根据用户id分页获取用户积分记录列表") + @Parameters({ + @Parameter(name = "ioType", description = "出入类型 0:支出 1:收入"), + @Parameter(name = "source", description = "积分类型 0.注册送积分1.购物 2.会员等级提升加积分 3.签到加积分 4.购物抵扣使用积分 5.积分过期 6.余额充值 7.系统更改积分 8.购物抵扣使用积分退还") + }) + public ServerResponseEntity> page(@Valid PageDTO pageDTO, + @RequestParam(value = "ioType", required = false) Integer ioType, + @RequestParam(value = "source", required = false) Integer source) { + PageVO userScoreLogPage = userScoreLogService.pageByIoTypeAndSource(pageDTO, ioType, source); + return ServerResponseEntity.success(userScoreLogPage); + } + + @GetMapping("/score_prod_page") + @Operation(summary = "获取用户积分商品兑换记录列表", description = "分页获取用户积分商品兑换记录列表") + public ServerResponseEntity> scoreProdPage(@Valid PageDTO pageDTO) { + PageVO userScoreLogPage = userScoreLogService.scoreProdPage(pageDTO); + return ServerResponseEntity.success(userScoreLogPage); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserWithdrawCashController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserWithdrawCashController.java new file mode 100644 index 0000000..67decda --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/app/UserWithdrawCashController.java @@ -0,0 +1,65 @@ +package com.tmerclub.cloud.user.controller.app; + +import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp; +import com.tmerclub.cloud.api.payment.allinpay.order.resp.WithdrawApplyResp; +import com.tmerclub.cloud.api.payment.feign.AllinpayFeignClient; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.dto.UserWithDrawDTO; +import com.tmerclub.cloud.user.service.UserWithdrawCashService; +import com.tmerclub.cloud.user.vo.DateUserWithdrawCashVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; + +/** + * @author gaozijie + * @date 2023-04-24 + */ +@RestController("appUserWithdrawController") +@RequestMapping("/user_withdraw") +@Tag(name = "app-用户提现") +public class UserWithdrawCashController { + + @DubboReference + private AllinpayFeignClient allinpayFeignClient; + + @Autowired + private UserWithdrawCashService userWithdrawCashService; + + @PostMapping("/apply") + @Operation(summary = "提现申请(通联)", description = "申请后需调用确认支付") + public ServerResponseEntity withdrawApply(@RequestBody UserWithDrawDTO userWithDrawDTO) { + userWithDrawDTO.setUserId(AuthUserContext.get().getUserId()); + WithdrawApplyResp resp = userWithdrawCashService.withdrawApply(userWithDrawDTO); + return ServerResponseEntity.success(resp); + } + + @PostMapping("/pay_confirm") + @Operation(summary = "提现确认支付(通联)", description = "确认支付") + public ServerResponseEntity payByBackSms(@RequestBody UserWithDrawDTO userWithDrawDTO) { + userWithDrawDTO.setUserId(AuthUserContext.get().getUserId()); + PayByBackSmsResp resp = userWithdrawCashService.payConfirm(userWithDrawDTO); + return ServerResponseEntity.success(resp); + } + + @GetMapping("/get_total_withdraw_amount") + @Operation(summary = "获取用户提现总金额") + public ServerResponseEntity getTotalWithdrawAmount() { + BigDecimal totalWithdrawAmount = userWithdrawCashService.getTotalWithdrawAmount(AuthUserContext.get().getUserId()); + return ServerResponseEntity.success(totalWithdrawAmount); + } + + @GetMapping("/page_date_user_withdraw_cash") + @Operation(summary = "分页获取按年月分组的用户提现记录") + public ServerResponseEntity> pageDateUserWithdrawCash(PageDTO pageDTO) { + PageVO pageVO = userWithdrawCashService.pageDateUserWithdrawCashVOList(AuthUserContext.get().getUserId(), pageDTO); + return ServerResponseEntity.success(pageVO); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/multishop/CostPerPopupController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/multishop/CostPerPopupController.java new file mode 100644 index 0000000..e3fa115 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/multishop/CostPerPopupController.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.multishop; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.constant.PopupPageTypeEnum; +import com.tmerclub.cloud.user.constant.PopupStatusEnum; +import com.tmerclub.cloud.user.constant.PopupUserTypeEnum; +import com.tmerclub.cloud.user.constant.PushFrequencyEnum; +import com.tmerclub.cloud.user.dto.CostPerPopupDTO; +import com.tmerclub.cloud.user.model.CostPerPopup; +import com.tmerclub.cloud.user.service.CostPerPopupService; +import com.tmerclub.cloud.user.vo.CostPerPopupVO; +import com.tmerclub.cloud.user.vo.PopupRelateVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 弹窗广告 + * @author TRACK + */ +@RestController("multishopCostPerPopupController") +@RequestMapping("/m/cost_per_popup") +@Tag(name = "multishop-弹窗广告") +public class CostPerPopupController { + + @Autowired + private CostPerPopupService costPerPopupService; + + @GetMapping("/page") + @Operation(summary = "获取弹窗广告列表", description = "分页获取弹窗广告列表") + public ServerResponseEntity> page(PageDTO pageDTO, CostPerPopupDTO costPerPopupDTO) { + costPerPopupDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO costPerPopupPage = costPerPopupService.page(pageDTO, costPerPopupDTO); + return ServerResponseEntity.success(costPerPopupPage); + } + + @GetMapping + @Operation(summary = "获取弹窗广告", description = "根据popupId获取弹窗广告") + public ServerResponseEntity getByPopupId(@RequestParam Long popupId) { + CostPerPopupVO popup = costPerPopupService.getByPopupId(popupId); + costPerPopupService.handleInfo(popup); + return ServerResponseEntity.success(popup); + } + + @PostMapping + @Operation(summary = "保存弹窗广告", description = "保存弹窗广告") + public ServerResponseEntity save(@Valid @RequestBody CostPerPopupDTO costPerPopupDTO) { + CostPerPopup costPerPopup = BeanUtil.map(costPerPopupDTO, CostPerPopup.class); + costPerPopup.setPopupId(null); + costPerPopup.setShopId(AuthUserContext.get().getTenantId()); + costPerPopup.setStatus(PopupStatusEnum.NOT_START.value()); + checkInfo(costPerPopup); + costPerPopupService.save(costPerPopup); + return ServerResponseEntity.success(); + } + + @PutMapping + @Operation(summary = "更新弹窗广告", description = "更新弹窗广告") + public ServerResponseEntity update(@Valid @RequestBody CostPerPopupDTO costPerPopupDTO) { + CostPerPopup costPerPopup = BeanUtil.map(costPerPopupDTO, CostPerPopup.class); + checkInfo(costPerPopup); + costPerPopupService.update(costPerPopup); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除弹窗广告", description = "根据弹窗广告id删除弹窗广告") + public ServerResponseEntity delete(@RequestParam Long popupId) { + costPerPopupService.deleteById(popupId); + return ServerResponseEntity.success(); + } + + @PutMapping("/invalid") + @Operation(summary = "失效弹窗广告", description = "根据弹窗广告id失效弹窗广告") + public ServerResponseEntity invalid(@RequestParam Long popupId) { + costPerPopupService.invalid(popupId); + return ServerResponseEntity.success(); + } + + private void checkInfo(CostPerPopup costPerPopup) { + costPerPopup.setUserLevelIds(null); + if (!PopupPageTypeEnum.isShop(costPerPopup.getPageType())) { + throw new LuckException("触发页面类型错误"); + } + if (!PopupUserTypeEnum.isShop(costPerPopup.getUserType())) { + throw new LuckException("推送用户类型错误"); + } + if (Objects.equals(costPerPopup.getPageType(), PopupPageTypeEnum.SPU_DETAIL.value()) && CollUtil.isEmpty(costPerPopup.getSpuIds())) { + throw new LuckException("关联商品不能为空"); + } + if (Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.CUSTOM.value())) { + if (Objects.nonNull(costPerPopup.getDayFrequency()) && StrUtil.isNotBlank(costPerPopup.getWeekFrequency())) { + throw new LuckException("推送天数/周不能同时存在"); + } + if (Objects.isNull(costPerPopup.getDayFrequency()) && StrUtil.isBlank(costPerPopup.getWeekFrequency())) { + throw new LuckException("推送天数/周不能为空"); + } + } + // 校验重复 + List dbList = costPerPopupService.listByParam(costPerPopup); + if (CollUtil.isEmpty(dbList)) { + return; + } + boolean checkFrequency = Objects.equals(costPerPopup.getPushFrequency(), PushFrequencyEnum.CUSTOM.value()) && StrUtil.isNotBlank(costPerPopup.getWeekFrequency()); + if (checkFrequency) { + // 只有按周推送需要再校验一下周数重复 + for (CostPerPopupVO costPerPopupVO : dbList) { + if (!Objects.equals(costPerPopupVO.getPushFrequency(), PushFrequencyEnum.CUSTOM.value()) || StrUtil.isBlank(costPerPopupVO.getWeekFrequency())) { + checkSingle(costPerPopup, costPerPopupVO); + } else { + // 按周推送的检查是否有重复周 + List duplicateList = costPerPopupService.getDuplicateList(costPerPopup, costPerPopupVO); + if (CollUtil.isNotEmpty(duplicateList)) { + checkSingle(costPerPopup, costPerPopupVO); + } + } + } + return; + } + if (Objects.equals(costPerPopup.getPageType(), PopupPageTypeEnum.SHOP_HOME.value())) { + throw new LuckException("已有重复弹窗广告"); + } + for (CostPerPopupVO costPerPopupVO : dbList) { + checkSpu(costPerPopup, costPerPopupVO); + } + } + + private static void checkSingle(CostPerPopup costPerPopup, CostPerPopupVO costPerPopupVO) { + if (Objects.equals(costPerPopup.getPageType(), PopupPageTypeEnum.SHOP_HOME.value())) { + throw new LuckException("已有重复弹窗广告"); + } + checkSpu(costPerPopup, costPerPopupVO); + } + + private static void checkSpu(CostPerPopup costPerPopup, CostPerPopupVO costPerPopupVO) { + List dbSpuIds = costPerPopupVO.getPopupRelateList().stream().map(PopupRelateVO::getSpuId).toList(); + List duplicateList = dbSpuIds.stream().filter(costPerPopup.getSpuIds()::contains).toList(); + if (CollUtil.isNotEmpty(duplicateList)) { + throw new LuckException("关联商品中已有弹窗广告"); + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/multishop/UserController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/multishop/UserController.java new file mode 100644 index 0000000..6222b58 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/multishop/UserController.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.multishop; + +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.dto.ShopCustomerDTO; +import com.tmerclub.cloud.user.dto.UserDTO; +import com.tmerclub.cloud.user.dto.UserManagerDTO; +import com.tmerclub.cloud.user.manager.UserExcelManager; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.service.UserTagUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + + +/** + * 用户信息 + * + * @author cl + */ +@RestController("multishopUserController") +@RequestMapping("/m/user") +@Tag(name = "multishop-客户信息") +public class UserController { + + @Autowired + private UserService userService; + @Autowired + private UserTagUserService userTagUserService; + @Autowired + private UserExcelManager userExcelManager; + + + @GetMapping("/shop_customer_page") + @Operation(summary = "获取客户列表", description = "分页获客户列表") + public ServerResponseEntity> userPage(@Valid PageDTO pageDTO, ShopCustomerDTO shopCustomerDTO) { + shopCustomerDTO.setShopId(AuthUserContext.get().getTenantId()); + PageVO shopCustomerPageVO = userService.pageShopCustomerByParam(pageDTO, shopCustomerDTO); + return ServerResponseEntity.success(shopCustomerPageVO); + } + + + /** + * 修改 + */ + @PutMapping + public ServerResponseEntity update(@RequestBody UserDTO userDTO) { + userService.updateUserInfo(userDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/user_info") + @Operation(summary = "根据用户id获取会员信息", description = "根据用户id获取会员信息") + public ServerResponseEntity info(@RequestParam Long userId) { + UserManagerVO param = userService.getUserInfo(userId, AuthUserContext.get().getTenantId()); + List userTagParams = userTagUserService.getUserTagsByUserId(userId); + param.setUserTagList(userTagParams); + return ServerResponseEntity.success(param); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出客户信息excel") + public ServerResponseEntity userSoldExcel(HttpServletResponse response, UserManagerDTO userManagerDTO) { + userExcelManager.exportUserInfoExcel(response, userManagerDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/down_model") + @Operation(summary = "下载客户信息excel模板", description = "下载客户信息excel模板") + public ServerResponseEntity downloadModel(HttpServletResponse response) { + userExcelManager.downloadShopCustomerModel(response); + return ServerResponseEntity.success(); + } + + @PostMapping("/import_excel") + @Operation(summary = "导入excel", description = "导入客户信息excel") + public ServerResponseEntity importExcel(@RequestParam("excelFile") MultipartFile file) { + if (file == null) { + throw new LuckException("网络繁忙,请稍后重试"); + } + String info = userExcelManager.importShopCustomerExcel(file); + return ServerResponseEntity.success(info); + } + + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserController.java new file mode 100644 index 0000000..2d575fc --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserController.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.PhoneUtil; +import com.tmerclub.cloud.api.user.vo.MemberOverviewVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.dto.UserDTO; +import com.tmerclub.cloud.user.dto.UserManagerDTO; +import com.tmerclub.cloud.user.manager.UserExcelManager; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.service.UserTagUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Date; +import java.util.List; + + +/** + * 用户信息 + * + * @author cl + */ +@RestController("platformUserController") +@RequestMapping("/p/user") +@Tag(name = "platform-用户信息") +public class UserController { + + @Value("${mall4cloud.expose.operation.auth:}") + private Boolean permission; + + @Autowired + private UserService userService; + @Autowired + private UserTagUserService userTagUserService; + @Autowired + private UserExcelManager userExcelManager; + + @GetMapping("/user_page") + @Operation(summary = "获取会员管理别表列表", description = "分页获取会员管理别表列表") + public ServerResponseEntity> userPage(@Valid PageDTO pageDTO, UserManagerDTO userManagerDTO) { + PageVO userPage = userService.getUserInfoPage(pageDTO, userManagerDTO); + for (UserManagerVO userManagerVO : userPage.getList()) { + userManagerVO.setPhone(PhoneUtil.hideBetween(userManagerVO.getPhone()).toString()); + } + return ServerResponseEntity.success(userPage); + } + + @GetMapping("/user_info") + @Operation(summary = "根据用户id获取会员信息", description = "根据用户id获取会员信息") + public ServerResponseEntity info(@RequestParam Long userId) { + UserManagerVO param = userService.getUserInfo(userId, Constant.PLATFORM_SHOP_ID); + List userTagParams = userTagUserService.getUserTagsByUserId(userId); + param.setUserTagList(userTagParams); + return ServerResponseEntity.success(param); + } + + /** + * 修改 + */ + @PutMapping + public ServerResponseEntity update(@RequestBody UserDTO userDTO) { + userService.updateUserInfo(userDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/sold_excel") + @Operation(summary = "导出excel", description = "导出用户信息excel") + public ServerResponseEntity userSoldExcel(HttpServletResponse response, UserManagerDTO userManagerDTO) { + userExcelManager.exportUserInfoExcel(response, userManagerDTO); + return ServerResponseEntity.success(); + } + + @GetMapping("/down_model") + @Operation(summary = "导出用户信息导入excel模板", description = "下载用户信息导入excel模板") + public ServerResponseEntity downloadModel(HttpServletResponse response) { + userExcelManager.downloadModel(response); + return ServerResponseEntity.success(); + } + + @Operation(summary = "导入文件") + @PostMapping("/import_excel") + public ServerResponseEntity importExcel(@RequestParam("excelFile") MultipartFile file) { + if (file == null) { + throw new LuckException("网络繁忙,请稍后重试"); + } + String info = userExcelManager.importUserExcel(file); + return ServerResponseEntity.success(info); + } + + @GetMapping("/get_user_count_info") + @Operation(summary = "获取今日客户概况", description = "获取今日客户概况") + public ServerResponseEntity getUserCountInfo() { + MemberOverviewVO memberOverviewListVO = userService.getUserCountInfo(new Date()); + return ServerResponseEntity.success(memberOverviewListVO); + } + + @GetMapping("/list") + @Operation(summary = "获取会员基本信息列表", description = "分页获取会员会员基本信息列表") + public ServerResponseEntity> list(@Valid PageDTO pageDTO, UserManagerDTO userManagerDTO) { + return ServerResponseEntity.success(userService.page(pageDTO, userManagerDTO)); + } + + @Operation(summary = "更新用户保存的通联信息", description = "同步数据用(慎重使用)") + @PutMapping("/update_user_info_by_allinpay") + public ServerResponseEntity updateUserByAllinpay() { + userService.updateUserInfoByAllinpay(); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserGrowthLogController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserGrowthLogController.java new file mode 100644 index 0000000..91a0675 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserGrowthLogController.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.UserGrowthLogService; +import com.tmerclub.cloud.user.vo.UserGrowthLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 cl + * @date 2021-05-08 20:16:53 + */ +@RestController("platformUserGrowthLogController") +@RequestMapping("/p/user_growth_log") +@Tag(name = "platform-用户成长值记录") +public class UserGrowthLogController { + + @Autowired + private UserGrowthLogService userGrowthLogService; + + + @Operation(summary = "分页获取用户成长值记录列表", description = "分页获取用户成长值记录列表") + @GetMapping("/page") + public ServerResponseEntity> getPageByUserId(@Valid PageDTO pageDTO, Long userId) { + PageVO resPage = userGrowthLogService.getPageByUserId(pageDTO, userId); + return ServerResponseEntity.success(resPage); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserLevelController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserLevelController.java new file mode 100644 index 0000000..186a7fa --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserLevelController.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.dto.UserLevelDTO; +import com.tmerclub.cloud.user.service.UserLevelService; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 会员等级表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@RestController("platformUserLevelController") +@RequestMapping("/p/user_level") +@Tag(name = "平台-会员等级表") +public class UserLevelController { + + @Autowired + private UserLevelService userLevelService; + @Autowired + private UserService userService; + + @GetMapping("/list") + @Operation(summary = "获取会员等级表列表", description = "分页获取会员等级表列表") + public ServerResponseEntity> list(@RequestParam("levelType") Integer levelType) { + List userLevels = userLevelService.list(levelType); + return ServerResponseEntity.success(userLevels); + } + + @GetMapping + @Operation(summary = "获取会员等级表", description = "根据id获取会员等级表") + public ServerResponseEntity getById(@RequestParam Long userLevelId) { + UserLevelVO userLevelVO = userLevelService.getByUserLevelId(userLevelId); + return ServerResponseEntity.success(userLevelVO); + } + + @PutMapping + @Operation(summary = "更新会员等级表", description = "更新会员等级表") + public ServerResponseEntity saveOrUpdate(@Valid @RequestBody UserLevelDTO userLevelDTO) { + if (userLevelDTO.getLevelType() == 1 && userLevelDTO.getUserLevelTerms().size() == 0) { + return ServerResponseEntity.showFailMsg("等级期数表不能为空"); + } + if (userLevelDTO.getLevelType() == 1) { + //付费会员没有成长值限制 + userLevelDTO.setNeedGrowth(0); + } + userLevelService.saveOrUpdate(userLevelDTO); + userLevelService.removeLevelCache(userLevelDTO.getUserLevelId(), userLevelDTO.getLevelType(), userLevelDTO.getLevel()); + return ServerResponseEntity.success(); + } + + @DeleteMapping + @Operation(summary = "删除会员等级表", description = "根据会员等级表id删除会员等级表") + public ServerResponseEntity delete(@RequestParam Long userLevelId) { + UserLevelVO userLevelVO = userLevelService.getByUserLevelId(userLevelId); + if (Objects.equals(userLevelVO.getLevelType(), LevelTypeEnum.PAY_USER.value())) { + Integer userNum = userService.countUserByLevel(userLevelVO.getLevel(), userLevelVO.getLevelType()); + if (userNum > 0) { + //如果有用户是该付费会员等级,则不允许删除该等级 + throw new LuckException("存在属于该等级的用户,该等级无法删除!"); + } + } + userLevelService.deleteByUserLevelId(userLevelId); + userLevelService.removeLevelCache(userLevelVO.getUserLevelId(), userLevelVO.getLevelType(), userLevelVO.getLevel()); + return ServerResponseEntity.success(); + } + + @PutMapping("/recruit_status") + @Operation(summary = "付费会员,是否可以招募会员;1可以招募,0停止招募", description = "付费会员,是否可以招募会员;1可以招募,0停止招募") + public ServerResponseEntity updateRecruitStatus(@Valid @RequestBody UserLevelDTO userLevelDTO) { + Long userLevelId = userLevelDTO.getUserLevelId(); + if (!Objects.equals(userLevelDTO.getLevelType(), LevelTypeEnum.PAY_USER.value())) { + // 非付费会员,不可以使用招募 + throw new LuckException("非付费会员,不可以使用招募!"); + } + userLevelService.updateRecruitStatus(userLevelDTO); + userLevelService.removeLevelCache(userLevelId, userLevelDTO.getLevelType(), userLevelDTO.getLevel()); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_user_level") + @Operation(summary = "新增/更新用户会员等级", description = "新增/更新用户会员等级") + public ServerResponseEntity updateUserLevel() { + userLevelService.updateUserLevel(); + userLevelService.removeLevelListCache(LevelTypeEnum.ORDINARY_USER.value()); + return ServerResponseEntity.success(); + } + + @PutMapping("/update_growth") + @Operation(summary = "批量修改会员成长值", description = "批量修改会员成长值") + public ServerResponseEntity batchUserGrowth(@RequestBody @Valid UserAdminDTO userAdminDTO) { + userLevelService.batchUpdateGrowth(userAdminDTO); + return ServerResponseEntity.success(); + } + + @PutMapping("/batch_user_score") + @Operation(summary = "批量修改会员积分", description = "批量修改会员积分") + public ServerResponseEntity batchUserScore(@RequestBody @Valid UserAdminDTO userAdminDTO) { + userLevelService.batchUserScore(userAdminDTO); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserLevelLogController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserLevelLogController.java new file mode 100644 index 0000000..c0f5461 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserLevelLogController.java @@ -0,0 +1,35 @@ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.dto.UserLevelLogDTO; +import com.tmerclub.cloud.user.service.UserLevelLogService; +import com.tmerclub.cloud.user.vo.UserLevelLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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: zsm + * @date: 2023/2/3 16:49 + */ +@RestController("platformUserLevelLogController") +@RequestMapping("/p/user_level_log") +@Tag(name = "用户等级记录") +public class UserLevelLogController { + + @Autowired + private UserLevelLogService userLevelLogService; + + @GetMapping("/page_buy_level_log") + @Operation(summary = "获取付费会员购买记录", description = "获取付费会员购买记录") + ServerResponseEntity> getUserLevelLogPage(@Valid PageDTO pageDTO, UserLevelLogDTO userLevelLogDTO) { + return ServerResponseEntity.success(userLevelLogService.pageBuyLevelLog(pageDTO, userLevelLogDTO)); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserScoreLogController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserScoreLogController.java new file mode 100644 index 0000000..9f2a879 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/controller/platform/UserScoreLogController.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.controller.platform; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.service.UserScoreLogService; +import com.tmerclub.cloud.user.vo.UserScoreLogVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +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 cl + * @date 2020-05-06 10:16:53 + */ +@RestController("platformUserScoreLogController") +@RequestMapping("/p/user_score_log") +@Tag(name = "店铺-用户积分记录") +public class UserScoreLogController { + + @Autowired + private UserScoreLogService userScoreLogService; + + @GetMapping("/page") + @Operation(summary = "获取用户积分记录列表", description = "分页获取用户积分记录列表") + public ServerResponseEntity> page(@Valid PageDTO pageDTO, Long userId) { + PageVO userScoreLogPage = userScoreLogService.pageByUserId(pageDTO, userId); + return ServerResponseEntity.success(userScoreLogPage); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/converter/LevelTypeConverter.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/converter/LevelTypeConverter.java new file mode 100644 index 0000000..b49153b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/converter/LevelTypeConverter.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; + +import java.util.Objects; + +/** + * Excel导出转换器,会员类型转换器,将数值转为String + * @author cl + * @date 2021-05-11 11:03:06 + */ +public class LevelTypeConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return LevelTypeEnum.valueOf(cellData.getStringValue()).value(); + } + + @Override + public WriteCellData convertToExcelData(Integer value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) { + return new WriteCellData(Objects.requireNonNull(LevelTypeEnum.instance(value)).desc()); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/AllinpayUserExcelDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/AllinpayUserExcelDTO.java new file mode 100644 index 0000000..392f2da --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/AllinpayUserExcelDTO.java @@ -0,0 +1,203 @@ +package com.tmerclub.cloud.user.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.alibaba.excel.annotation.write.style.ColumnWidth; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gaozijie + * @date 2023-05-24 + */ +public class AllinpayUserExcelDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "导入用户信息模板"; + public static final String SHEET_NAME = "sheet"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 1; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + /** + * 需要批注的列 + */ + public static final int[] COMMENT_INDEX = {2}; + + public static final String[] COMMENTS = { + "由字母、数字和特殊符号三种字符组成8-20位半角字符,区分大小写" + }; + + @ExcelProperty(value = "序号", index = 0) + private String seq; + + @ExcelProperty(value = "手机号(必填)", index = 1) + @ColumnWidth(20) + private String phone; + + @ExcelProperty(value = "密码(必填)", index = 2) + @ColumnWidth(16) + private String password; + + @ExcelProperty(value = "用户昵称(最多15个字符),必填", index = 3) + @ColumnWidth(30) + private String nickName; + + @ExcelProperty(value = "会员类型(0普通会员/1付费会员(不填默认为普通会员)", index = 4) + @ColumnWidth(15) + private Integer levelType; + + @ExcelProperty(value = "付费会员等级(付费会员必填,普通会员以成长值为准)", index = 5) + @ColumnWidth(15) + private String level; + + /** + * 注解@ContentStyle(dataFormat = 49) 设置单元格格式为文本格式 + * 只会将对象属性所在单元格设置为文本格式,所在列的其他单元格还是为自定义格式 + */ + @DateTimeFormat("yyyy-MM-dd") + @ExcelProperty(value = "vip结束时间(格式:2021-08-08,会员类型是1则必填)", index = 6) + @ColumnWidth(25) + private Date vipEndTime; + + @ExcelProperty(value = "邮箱", index = 7) + @ColumnWidth(20) + private String email; + + @ExcelProperty(value = "性别(0男/1女)", index = 8) + private String sex; + + @ExcelProperty(value = "生日(格式:2009-11-27)", index = 9) + @ColumnWidth(20) + private String birthDate; + + @ExcelProperty(value = "积分(限整数)", index = 10) + private String score; + + @ExcelProperty(value = "成长值(限整数)", index = 11) + private String growth; + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getScore() { + return score; + } + + public void setScore(String score) { + this.score = score; + } + + public String getGrowth() { + return growth; + } + + public void setGrowth(String growth) { + this.growth = growth; + } + + @Override + public String toString() { + return "AllinpayUserExcelDTO{" + + "seq='" + seq + '\'' + + ", phone='" + phone + '\'' + + ", password='" + password + '\'' + + ", nickName='" + nickName + '\'' + + ", levelType=" + levelType + + ", level='" + level + '\'' + + ", vipEndTime=" + vipEndTime + + ", email='" + email + '\'' + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", score='" + score + '\'' + + ", growth='" + growth + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/CheckSmsDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/CheckSmsDTO.java new file mode 100644 index 0000000..13c96e9 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/CheckSmsDTO.java @@ -0,0 +1,81 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import com.tmerclub.cloud.common.util.PrincipalUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Pattern; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lhd + * @date 2020/12/30 + */ +public class CheckSmsDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "手机号") + @Pattern(regexp = PrincipalUtil.MOBILE_REGEXP, message = "请输入正确的手机号") + private String mobile; + + @Schema(description = "是否店铺账号,1是") + private Integer shopAccount; + + @Schema(description = "验证码") + private String validCode; + + @Schema(description = "校验修改手机号验证码成功的标识") + private String checkUpdatePhoneSmsFlag; + + public String getCheckUpdatePhoneSmsFlag() { + return checkUpdatePhoneSmsFlag; + } + + public void setCheckUpdatePhoneSmsFlag(String checkUpdatePhoneSmsFlag) { + this.checkUpdatePhoneSmsFlag = checkUpdatePhoneSmsFlag; + } + + public String getValidCode() { + return validCode; + } + + public void setValidCode(String validCode) { + this.validCode = validCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getShopAccount() { + return shopAccount; + } + + public void setShopAccount(Integer shopAccount) { + this.shopAccount = shopAccount; + } + + @Override + public String toString() { + return "CheckSmsDTO{" + + "mobile='" + mobile + '\'' + + ", shopAccount=" + shopAccount + + ", validCode='" + validCode + '\'' + + ", checkUpdatePhoneSmsFlag='" + checkUpdatePhoneSmsFlag + '\'' + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/PopupRelateDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/PopupRelateDTO.java new file mode 100644 index 0000000..8b38bf1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/PopupRelateDTO.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.Date; +import java.io.Serial; + +/** + * 弹窗广告关联DTO + * @author TRACK + */ +public class PopupRelateDTO { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "关联id") + private Long relateId; + + @Schema(description = "弹窗广告id") + private Long popupId; + + @Schema(description = "商品id") + private Long spuId; + + @Schema(description = "会员等级id") + private Long userLevelId; + + public Long getRelateId() { + return relateId; + } + + public void setRelateId(Long relateId) { + this.relateId = relateId; + } + + public Long getPopupId() { + return popupId; + } + + public void setPopupId(Long popupId) { + this.popupId = popupId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + @Override + public String toString() { + return "PopupRelateDTO{" + + "relateId=" + relateId + + ",popupId=" + popupId + + ",spuId=" + spuId + + ",userLevelId=" + userLevelId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/QueryPopupDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/QueryPopupDTO.java new file mode 100644 index 0000000..6628298 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/QueryPopupDTO.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; + +/** + * 弹窗广告查询dto + * @author TRACK + */ +public class QueryPopupDTO { + + @Schema(description = "触发页面类型 1.平台首页 2.会员中心 3.支付成功 4.店铺首页 5.商品详情") + @Max(value = 5) + @Min(value = 1) + private Integer pageType; + + @Schema(description = "商品详情页必传 商品id") + private Long spuId; + + @Schema(description = "游客uuid 未登录时必传") + private Long uuid; + + @Schema(description = "店铺id 平台为0") + private Long shopId; + + @Schema(description = "支付成功页必传 订单号") + private Long orderId; + + @Schema(description = "支付入口 0订单 1充值 2开通会员") + private Integer payEntry; + + public Integer getPageType() { + return pageType; + } + + public void setPageType(Integer pageType) { + this.pageType = pageType; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUuid() { + return uuid; + } + + public void setUuid(Long uuid) { + this.uuid = uuid; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + @Override + public String toString() { + return "QueryPopupDTO{" + + "pageType=" + pageType + + ", spuId=" + spuId + + ", uuid=" + uuid + + ", shopId=" + shopId + + ", orderId=" + orderId + + ", payEntry=" + payEntry + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserConsigneeDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserConsigneeDTO.java new file mode 100644 index 0000000..4c22d0f --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserConsigneeDTO.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户提货人信息DTO + * + * @author FrozenWatermelon + * @date 2020-12-15 17:18:56 + */ +public class UserConsigneeDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "id") + private Long userConsigneeId; + + @Schema(description = "提货人姓名") + private String name; + + @Schema(description = "提货人联系方式") + private String mobile; + + public Long getUserConsigneeId() { + return userConsigneeId; + } + + public void setUserConsigneeId(Long userConsigneeId) { + this.userConsigneeId = userConsigneeId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + @Override + public String toString() { + return "UserConsigneeDTO{" + + "userConsigneeId=" + userConsigneeId + + ",name=" + name + + ",mobile=" + mobile + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelTermDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelTermDTO.java new file mode 100644 index 0000000..40231cf --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserLevelTermDTO.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.io.Serial; +import java.io.Serializable; + +/** + * DTO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelTermDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "主键") + private Long levelTermId; + + @Schema(description = "等级id") + private Long userLevelId; + + @NotNull(message = "期数类型不能为空") + @Schema(description = "期数类型(0:月,1:季,2:年)") + private Integer termType; + + @NotNull(message = "价格不能为空") + @Schema(description = "价格") + private Long needAmount; + + @NotNull(message = "状态不能为空") + @Schema(description = "状态(0: 禁用1: 启用)") + private Integer status; + + public Long getLevelTermId() { + return levelTermId; + } + + public void setLevelTermId(Long levelTermId) { + this.levelTermId = levelTermId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Integer getTermType() { + return termType; + } + + public void setTermType(Integer termType) { + this.termType = termType; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "UserLevelTermDTO{" + + "levelTermId=" + levelTermId + + ",userLevelId=" + userLevelId + + ",termType=" + termType + + ",needAmount=" + needAmount + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserManagerDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserManagerDTO.java new file mode 100644 index 0000000..b62f565 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserManagerDTO.java @@ -0,0 +1,477 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 全部会员,请求参数 + * + * @author cl + * @data 2020-04-09 16:16:50 + */ +public class UserManagerDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "真实姓名") + private String realName; + + @Schema(description = "手机号码") + private String phone; + + @Schema(description = "性别 null 不限,M男,F女") + private String sex; + + @Schema(description = "状态 1 正常 0 无效") + private Integer status; + + @Schema(description = "客户注册时间-条件开始时间") + private Date userRegStartTime; + @Schema(description = "客户注册时间-条件结束时间") + private Date userRegEndTime; + + @Schema(description = "客户渠道 null 不限,公众号,小程序,H5,自有App") + private Integer appType; + + @Schema(description = "客户身份 0普通会员,1付费会员") + private Integer levelType; + @Schema(description = "会员等级") + private Integer level; + + // ------交易信息---------------------------------- + + @Schema(description = "最近消费时间-开始时间") + private Date reConsStartTime; + @Schema(description = "最近消费时间-结算时间") + private Date reconsEndTime; + + + @Schema(description = "消费金额") + private Double preConsAmount; + @Schema(description = "消费金额") + private Double apConsAmount; + + @Schema(description = "消费次数") + private Integer preConsTimes; + @Schema(description = "消费次数") + private Integer apConsTimes; + + @Schema(description = "订单均价") + private Double preOrderAverAmount; + @Schema(description = "订单均价") + private Double apOrderAverAmount; + + @Schema(description = "平均折扣") + private Double preAverDiscount; + @Schema(description = "平均折扣") + private Double apAverDiscount; + + @Schema(description = "当前余额") + private Double preCurrentBalance; + + @Schema(description = "用户ids") + private List userIds; + + @Schema(description = "当前余额") + private Double apCurrentBalance; + + + @Schema(description = "当前积分") + private Integer preCurrentScore; + @Schema(description = "当前积分") + private Integer apCurrentScore; + + + @Schema(description = "充值金额") + private Double preRechargeAmount; + @Schema(description = "充值金额") + private Double apRechargeAmount; + + @Schema(description = "充值次数") + private Integer preRechargeTimes; + @Schema(description = "充值次数") + private Integer apRechargeTimes; + + @Schema(description = "客户标签") + private List tagIds; + + @Schema(description = "排序字段的名称") + private String fieldName; + + @Schema(description = "排序规则:一次只能安照一个字段排序; 升序:ascending 降序:descending 不排序: null ") + private String sortingType; + + @Schema(description = "注册时间筛选-注册开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createStartTime; + + @Schema(description = "注册时间筛选-注册结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createEndTime; + + @Schema(description = "店铺id") + private Long shopId; + + @Hidden + @Schema(description = "支付系统类型") + private Integer paySysType; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Date getUserRegStartTime() { + return userRegStartTime; + } + + public void setUserRegStartTime(Date userRegStartTime) { + this.userRegStartTime = userRegStartTime; + } + + public Date getUserRegEndTime() { + return userRegEndTime; + } + + public void setUserRegEndTime(Date userRegEndTime) { + this.userRegEndTime = userRegEndTime; + } + + public Integer getAppType() { + return appType; + } + + public void setAppType(Integer appType) { + this.appType = appType; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Date getReConsStartTime() { + return reConsStartTime; + } + + public void setReConsStartTime(Date reConsStartTime) { + this.reConsStartTime = reConsStartTime; + } + + public Date getReconsEndTime() { + return reconsEndTime; + } + + public void setReconsEndTime(Date reconsEndTime) { + this.reconsEndTime = reconsEndTime; + } + + public Double getPreConsAmount() { + return preConsAmount; + } + + public void setPreConsAmount(Double preConsAmount) { + this.preConsAmount = preConsAmount; + } + + public Double getApConsAmount() { + return apConsAmount; + } + + public void setApConsAmount(Double apConsAmount) { + this.apConsAmount = apConsAmount; + } + + public Integer getPreConsTimes() { + return preConsTimes; + } + + public void setPreConsTimes(Integer preConsTimes) { + this.preConsTimes = preConsTimes; + } + + public Integer getApConsTimes() { + return apConsTimes; + } + + public void setApConsTimes(Integer apConsTimes) { + this.apConsTimes = apConsTimes; + } + + public Double getPreOrderAverAmount() { + return preOrderAverAmount; + } + + public void setPreOrderAverAmount(Double preOrderAverAmount) { + this.preOrderAverAmount = preOrderAverAmount; + } + + public Double getApOrderAverAmount() { + return apOrderAverAmount; + } + + public void setApOrderAverAmount(Double apOrderAverAmount) { + this.apOrderAverAmount = apOrderAverAmount; + } + + public Double getPreAverDiscount() { + return preAverDiscount; + } + + public void setPreAverDiscount(Double preAverDiscount) { + this.preAverDiscount = preAverDiscount; + } + + public Double getApAverDiscount() { + return apAverDiscount; + } + + public void setApAverDiscount(Double apAverDiscount) { + this.apAverDiscount = apAverDiscount; + } + + public Double getPreCurrentBalance() { + return preCurrentBalance; + } + + public void setPreCurrentBalance(Double preCurrentBalance) { + this.preCurrentBalance = preCurrentBalance; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public Double getApCurrentBalance() { + return apCurrentBalance; + } + + public void setApCurrentBalance(Double apCurrentBalance) { + this.apCurrentBalance = apCurrentBalance; + } + + public Integer getPreCurrentScore() { + return preCurrentScore; + } + + public void setPreCurrentScore(Integer preCurrentScore) { + this.preCurrentScore = preCurrentScore; + } + + public Integer getApCurrentScore() { + return apCurrentScore; + } + + public void setApCurrentScore(Integer apCurrentScore) { + this.apCurrentScore = apCurrentScore; + } + + public Double getPreRechargeAmount() { + return preRechargeAmount; + } + + public void setPreRechargeAmount(Double preRechargeAmount) { + this.preRechargeAmount = preRechargeAmount; + } + + public Double getApRechargeAmount() { + return apRechargeAmount; + } + + public void setApRechargeAmount(Double apRechargeAmount) { + this.apRechargeAmount = apRechargeAmount; + } + + public Integer getPreRechargeTimes() { + return preRechargeTimes; + } + + public void setPreRechargeTimes(Integer preRechargeTimes) { + this.preRechargeTimes = preRechargeTimes; + } + + public Integer getApRechargeTimes() { + return apRechargeTimes; + } + + public void setApRechargeTimes(Integer apRechargeTimes) { + this.apRechargeTimes = apRechargeTimes; + } + + public List getTagIds() { + return tagIds; + } + + public void setTagIds(List tagIds) { + this.tagIds = tagIds; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getSortingType() { + return sortingType; + } + + public void setSortingType(String sortingType) { + this.sortingType = sortingType; + } + + public Date getCreateStartTime() { + return createStartTime; + } + + public void setCreateStartTime(Date createStartTime) { + this.createStartTime = createStartTime; + } + + public Date getCreateEndTime() { + return createEndTime; + } + + public void setCreateEndTime(Date createEndTime) { + this.createEndTime = createEndTime; + } + + public Integer getPaySysType() { + return paySysType; + } + + public void setPaySysType(Integer paySysType) { + this.paySysType = paySysType; + } + + @Override + public String toString() { + return "UserManagerDTO{" + + "userId=" + userId + + ", nickName='" + nickName + '\'' + + ", realName='" + realName + '\'' + + ", phone='" + phone + '\'' + + ", sex='" + sex + '\'' + + ", status=" + status + + ", userRegStartTime=" + userRegStartTime + + ", userRegEndTime=" + userRegEndTime + + ", appType=" + appType + + ", levelType=" + levelType + + ", level=" + level + + ", reConsStartTime=" + reConsStartTime + + ", reconsEndTime=" + reconsEndTime + + ", preConsAmount=" + preConsAmount + + ", apConsAmount=" + apConsAmount + + ", preConsTimes=" + preConsTimes + + ", apConsTimes=" + apConsTimes + + ", preOrderAverAmount=" + preOrderAverAmount + + ", apOrderAverAmount=" + apOrderAverAmount + + ", preAverDiscount=" + preAverDiscount + + ", apAverDiscount=" + apAverDiscount + + ", preCurrentBalance=" + preCurrentBalance + + ", userIds=" + userIds + + ", apCurrentBalance=" + apCurrentBalance + + ", preCurrentScore=" + preCurrentScore + + ", apCurrentScore=" + apCurrentScore + + ", preRechargeAmount=" + preRechargeAmount + + ", apRechargeAmount=" + apRechargeAmount + + ", preRechargeTimes=" + preRechargeTimes + + ", apRechargeTimes=" + apRechargeTimes + + ", tagIds=" + tagIds + + ", fieldName='" + fieldName + '\'' + + ", sortingType='" + sortingType + '\'' + + ", createStartTime=" + createStartTime + + ", createEndTime=" + createEndTime + + ", shopId=" + shopId + + ", paySysType=" + paySysType + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserScoreGetLogDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserScoreGetLogDTO.java new file mode 100644 index 0000000..86d520c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserScoreGetLogDTO.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户积分获取记录DTO + * + * @author FrozenWatermelon + * @date 2021-05-17 17:17:14 + */ +public class UserScoreGetLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "积分明细表") + private Long userScoreGetLogId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "可用积分") + private Long usableScore; + + @Schema(description = "业务id") + private String bizId; + + @Schema(description = "过期时间") + private Date expireTime; + + @Schema(description = "状态 -1过期 0订单抵现 1正常") + private Integer status; + + public Long getUserScoreGetLogId() { + return userScoreGetLogId; + } + + public void setUserScoreGetLogId(Long userScoreGetLogId) { + this.userScoreGetLogId = userScoreGetLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getUsableScore() { + return usableScore; + } + + public void setUsableScore(Long usableScore) { + this.usableScore = usableScore; + } + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "UserScoreGetLogDTO{" + + "userScoreGetLogId=" + userScoreGetLogId + + ",userId=" + userId + + ",usableScore=" + usableScore + + ",bizId=" + bizId + + ",expireTime=" + expireTime + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserScoreLogDTO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserScoreLogDTO.java new file mode 100644 index 0000000..2170f22 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/dto/UserScoreLogDTO.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户积分记录DTO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserScoreLogDTO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "日志id") + private Long logId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "1.购物 2.会员等级提升加积分 3.签到加积分 4.购物抵扣使用积分 5.积分过期") + private Integer source; + + @Schema(description = "变动积分数额") + private Long score; + + @Schema(description = "业务id") + private Long bizId; + + @Schema(description = "出入类型 0=支出 1=收入") + private Integer ioType; + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + @Override + public String toString() { + return "UserScoreLogDTO{" + + "logId=" + logId + + ", userId=" + userId + + ", source=" + source + + ", score=" + score + + ", bizId=" + bizId + + ", ioType=" + ioType + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/ShopCustomerClientController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/ShopCustomerClientController.java new file mode 100644 index 0000000..ad35b51 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/ShopCustomerClientController.java @@ -0,0 +1,27 @@ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.dto.ShopCustomerReqDTO; +import com.tmerclub.cloud.api.user.feign.ShopCustomerFeignClient; +import com.tmerclub.cloud.user.service.ShopCustomerService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * 店铺客户 + * + * @author: zsm + * @date: 2023/1/15 16:44 + */ +@DubboService +public class ShopCustomerClientController implements ShopCustomerFeignClient { + + @Autowired + private ShopCustomerService shopCustomerService; + + @Override + public void saveBatchByOrders(List shopCustomerReqList) { + shopCustomerService.saveBatchByOrders(shopCustomerReqList); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserBalanceLogFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserBalanceLogFeignController.java new file mode 100644 index 0000000..6e24fbe --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserBalanceLogFeignController.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.order.constant.FinanceType; +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.BalancePayBO; +import com.tmerclub.cloud.api.user.bo.BalanceRefundBO; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.feign.UserBalanceLogFeignClient; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.RechargeIoTypeEnum; +import com.tmerclub.cloud.user.constant.RechargeTypeEnum; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.service.UserLevelLogService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 充值信息 + * + * @author FrozenWatermelon + */ +@DubboService +public class UserBalanceLogFeignController implements UserBalanceLogFeignClient { + + @Autowired + private UserBalanceLogService userBalanceLogService; + @Autowired + private UserLevelLogService userLevelLogService; + @Autowired + private SegmentManager segmentManager; + @DubboReference + private ConfigFeignClient configFeignClient; + + @Override + public ServerResponseEntity getPayAmount(Long rechargeLogId) { + MongoUserBalanceLogBO userBalanceLog = userBalanceLogService.getByBalanceLogId(rechargeLogId); + return ServerResponseEntity.success(userBalanceLog.getChangeBalance()); + } + + @Override + public ServerResponseEntity getIsPay(Long rechargeLogId) { + MongoUserBalanceLogBO userBalanceLog = userBalanceLogService.getByBalanceLogId(rechargeLogId); + return ServerResponseEntity.success(userBalanceLog.getIsPayed()); + } + + @Override + public ServerResponseEntity insertBalancePayLog(BalancePayBO balancePayBO) { + Long userId = AuthUserContext.get().getUserId(); + MongoUserBalanceLogBO userBalanceLog = new MongoUserBalanceLogBO(); + userBalanceLog.setBalanceLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_BALANCE_LOG)); + userBalanceLog.setUserId(userId); + userBalanceLog.setChangeBalance(balancePayBO.getChangeBalance()); + userBalanceLog.setIoType(RechargeIoTypeEnum.EXPENDITURE.value()); + if (Objects.nonNull(balancePayBO.getIsVip()) && Objects.equals(balancePayBO.getIsVip(), true)) { + userBalanceLog.setType(RechargeTypeEnum.VIP.value()); + } else { + userBalanceLog.setType(RechargeTypeEnum.PAY.value()); + } + userBalanceLog.setIsPayed(0); + userBalanceLog.setPayId(balancePayBO.getPayId()); + userBalanceLog.setPaySysType(balancePayBO.getPaySysType()); + userBalanceLogService.saveToMongdb(userBalanceLog); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity doRefund(BalanceRefundBO balanceRefundBO) { + userBalanceLogService.doRefund(balanceRefundBO); + return ServerResponseEntity.success(); + } + + @Override + public ServerResponseEntity> pageFinanceDetail(FinanceDetailDTO financeDetailDTO) { + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageSize(financeDetailDTO.getPageSize()); + pageDTO.setPageNum(financeDetailDTO.getPageNum()); + financeDetailDTO.setPaySysType(configFeignClient.getPaySysType().getData()); + PageVO result = userBalanceLogService.pageFinanceDetail(pageDTO, financeDetailDTO); + return ServerResponseEntity.success(result); + } + + @Override + public ServerResponseEntity> listFinanceDetail(FinanceDetailDTO financeDetailDTO) { + List listFinanceDetail = userBalanceLogService.listFinanceDetail(financeDetailDTO); + return ServerResponseEntity.success(listFinanceDetail); + } + + @Override + public ServerResponseEntity getPlatformAccountDetail(Date startTime, Date endTime) { + ShopAccountDetailVO shopAccountDetailVO = userBalanceLogService.getPlatformAccountDetail(startTime, endTime); + return ServerResponseEntity.success(shopAccountDetailVO); + } + + @Override + public ServerResponseEntity> pageUserPayInfo(Date startTime, Date endTime, Integer financeType, Integer pageSize, Integer pageNum) { + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageSize(pageSize); + pageDTO.setPageNum(pageNum); + PageVO pageVO = new PageVO<>(); + if (Objects.equals(financeType, FinanceType.RECHARGE.value())) { + pageVO = userBalanceLogService.pagePayInfoVO(startTime, endTime, pageDTO); + } else if (Objects.equals(financeType, FinanceType.LEVEL.value())) { + pageVO = PageUtil.doPage(pageDTO, () -> userLevelLogService.listPayInfoVO(startTime, endTime)); + } + return ServerResponseEntity.success(pageVO); + } + + @Override + public ServerResponseEntity> listUserPayInfo(Date startTime, Date endTime, Integer financeType) { + List result = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.equals(financeType, FinanceType.RECHARGE.value())) { + result = userBalanceLogService.listPayInfoVO(startTime, endTime); + } else if (Objects.equals(financeType, FinanceType.LEVEL.value())) { + result = userLevelLogService.listPayInfoVO(startTime, endTime); + } + return ServerResponseEntity.success(result); + } + + @Override + public ServerResponseEntity updateToOrderPaySuccess(Long payId) { + MongoUserBalanceLogBO userBalanceLog = userBalanceLogService.getByPayId(payId); + userBalanceLogService.updateToOrderPaySuccess(payId, userBalanceLog); + return ServerResponseEntity.success(); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserLevelAndScoreOrderFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserLevelAndScoreOrderFeignController.java new file mode 100644 index 0000000..a90e392 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserLevelAndScoreOrderFeignController.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.feign.UserLevelAndScoreOrderFeignClient; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.manager.UserLevelOrderManager; +import com.tmerclub.cloud.user.manager.UserScoreOrderManager; +import com.tmerclub.cloud.user.service.UserScoreLogService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * 用户等级积分订单计算feign连接 + * @author FrozenWatermelon + * @date 2021/05/10 + */ +@DubboService +public class UserLevelAndScoreOrderFeignController implements UserLevelAndScoreOrderFeignClient { + + + @Autowired + private UserScoreOrderManager userScoreOrderManager; + + @Autowired + private UserLevelOrderManager userLevelOrderManager; + + @Autowired + private UserScoreLogService userScoreLogService; + + + @Override + public ServerResponseEntity calculateLevelAndScoreDiscount(ShopCartOrderMergerVO shopCartOrderMerger) { + // 订单预售不能参与积分等级优惠 + userLevelOrderManager.calculateLevelDiscount(shopCartOrderMerger); + userScoreOrderManager.calculateScoreDiscount(shopCartOrderMerger); + return ServerResponseEntity.success(shopCartOrderMerger); + } + + @Override + public ServerResponseEntity getScoreCount(List refundIds) { + return ServerResponseEntity.success(userScoreLogService.getScoreCountByRefundIds(refundIds)); + } + + @Override + public ServerResponseEntity getHaveFreeFeeRight(Long userId, Long shopId) { + Boolean haveFreeFeeRight = userLevelOrderManager.getHaveFreeFeeRight(userId, shopId); + return ServerResponseEntity.success(haveFreeFeeRight); + } + + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserWithdrawCashFeignController.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserWithdrawCashFeignController.java new file mode 100644 index 0000000..09d6fcd --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/feign/UserWithdrawCashFeignController.java @@ -0,0 +1,58 @@ +package com.tmerclub.cloud.user.feign; + +import com.tmerclub.cloud.api.user.feign.UserWithdrawCashFeignClient; +import com.tmerclub.cloud.common.constant.AllinpayPayStatus; +import com.tmerclub.cloud.common.constant.AllinpayWithdrawCashStatusType; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.user.constant.RechargeTypeEnum; +import com.tmerclub.cloud.user.model.UserWithdrawCash; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.service.UserWithdrawCashService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * @author gaozijie + * @date 2023-04-24 + */ +@DubboService +public class UserWithdrawCashFeignController implements UserWithdrawCashFeignClient { + + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private UserWithdrawCashService userWithdrawCashService; + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResponseEntity withdrawBack(String bizOrderNo, + String payStatus, + String payFailMessage) { + // 查询提现记录 + UserWithdrawCash withdrawCash = userWithdrawCashService.getByBizOrderNo(bizOrderNo); + if (withdrawCash == null) { + throw new LuckException("提现记录不存在"); + } + // 更新提现记录 + boolean isOk = Objects.equals(payStatus, AllinpayPayStatus.OK.value()); + if (isOk) { + withdrawCash.setStatus(AllinpayWithdrawCashStatusType.CASH_SUCCESS.value()); + userWithdrawCashService.update(withdrawCash); + } else { + withdrawCash.setStatus(AllinpayWithdrawCashStatusType.CASH_FAIL.value()); + withdrawCash.setPayFailMessage(payFailMessage); + userWithdrawCashService.update(withdrawCash); + // 提现失败,不做余额变动 + return ServerResponseEntity.success(); + } + // 余额变动,新增余额日志 + userExtensionService.changeAllinpayBalance( + withdrawCash.getUserId(), -withdrawCash.getAmount(), RechargeTypeEnum.WITHDRAW.value() + ); + return ServerResponseEntity.success(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/handler/UserRowWriterHandler.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/handler/UserRowWriterHandler.java new file mode 100644 index 0000000..a4dd145 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/handler/UserRowWriterHandler.java @@ -0,0 +1,54 @@ +package com.tmerclub.cloud.user.handler; + +import com.alibaba.excel.util.BooleanUtils; +import com.alibaba.excel.write.handler.RowWriteHandler; +import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; +import com.tmerclub.cloud.user.dto.AllinpayUserExcelDTO; +import com.tmerclub.cloud.user.dto.UserExcelDTO; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; + +/** + * @author gaozijie + * @since 2024-01-02 + */ +public class UserRowWriterHandler implements RowWriteHandler { + + private boolean isSetComment = false; + + private boolean isAllinpay; + + public UserRowWriterHandler(boolean isAllinpay) { + this.isAllinpay = isAllinpay; + } + + @Override + public void afterRowDispose(RowWriteHandlerContext context) { + // 表头批注 + if (BooleanUtils.isTrue(context.getHead()) && !isSetComment) { + Sheet sheet = context.getWriteSheetHolder().getSheet(); + Drawing drawingPatriarch = sheet.createDrawingPatriarch(); + // 批注准备 + int[] commentIndex; + String[] comments; + if (isAllinpay) { + commentIndex = UserExcelDTO.COMMENT_INDEX; + comments = UserExcelDTO.COMMENTS; + } else { + commentIndex = AllinpayUserExcelDTO.COMMENT_INDEX; + comments = AllinpayUserExcelDTO.COMMENTS; + } + // 插入批注 + Comment comment; + for (int i = 0; i < commentIndex.length; i++) { + comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, commentIndex[i], 0, commentIndex[i] + 1, 1)); + comment.setString(new XSSFRichTextString(comments[i])); + sheet.getRow(0).getCell(commentIndex[i]).setCellComment(comment); + } + isSetComment = true; + } + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/BalancePayTransactionListener.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/BalancePayTransactionListener.java new file mode 100644 index 0000000..25ef7eb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/BalancePayTransactionListener.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener; +import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Component; + +import java.util.Objects; + + +/** + * 确认收货事务监听 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQTransactionListener(rocketMQTemplateBeanName = "balancePayTemplate", maximumPoolSize = 20) +public class BalancePayTransactionListener implements RocketMQLocalTransactionListener { + + @Autowired + private UserBalanceLogService userBalanceLogService; + + @Override + public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object userBalanceLog) { + Long payId = Json.parseObject((byte[]) msg.getPayload(), Long.class); + // 扣减余额,并将余额记录的支付状态变为已支付 + userBalanceLogService.updateToOrderPaySuccess(payId, (MongoUserBalanceLogBO) userBalanceLog); + return RocketMQLocalTransactionState.COMMIT; + } + + @Override + public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { + Long payId = Json.parseObject((byte[]) msg.getPayload(), Long.class); + // 查询支付状态 + MongoUserBalanceLogBO userBalanceLog = userBalanceLogService.getByPayId(payId); + if (!Objects.equals(userBalanceLog.getIsPayed(), 0)) { + return RocketMQLocalTransactionState.ROLLBACK; + } + return RocketMQLocalTransactionState.COMMIT; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/BuyVipNotifyConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/BuyVipNotifyConsumer.java new file mode 100644 index 0000000..dfb0285 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/BuyVipNotifyConsumer.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.api.user.bo.BuyVipNotifyBO; +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.common.cache.util.CacheManagerUtil; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.service.UserLevelLogService; +import com.tmerclub.cloud.user.service.UserLevelService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.BUY_VIP_NOTIFY_TOPIC, consumerGroup = RocketMqConstant.BUY_VIP_NOTIFY_TOPIC) +public class BuyVipNotifyConsumer implements RocketMQListener { + + @Autowired + private UserLevelLogService userLevelLogService; + @Autowired + private UserLevelService userLevelService; + @Autowired + private CacheManagerUtil cacheManagerUtil; + + private static final Logger LOG = LoggerFactory.getLogger(BuyVipNotifyConsumer.class); + + @Override + public void onMessage(BuyVipNotifyBO message) { + LOG.info("购买vip回调开始... message: {}", Json.toJsonString(message)); + UserLevelLog userLevelLog = userLevelLogService.getByLevelLogId(message.getUserLevelLogId()); + + userLevelService.paySuccess(userLevelLog, message); + // 移除用户缓存 + cacheManagerUtil.evictCache(UserCacheNames.USER_INFO, userLevelLog.getUserId().toString()); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/OrderRefundSuccessScoreConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/OrderRefundSuccessScoreConsumer.java new file mode 100644 index 0000000..055d7ae --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/OrderRefundSuccessScoreConsumer.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.api.order.constant.OrderStatus; +import com.tmerclub.cloud.api.user.bo.UserOrderScoreBo; +import com.tmerclub.cloud.common.order.bo.RefundNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.service.UserExtensionService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Objects; + + +/** + * @author cl + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.ORDER_REFUND_SUCCESS_SERVICE_TOPIC, consumerGroup = RocketMqConstant.ORDER_REFUND_SUCCESS_SCORE_GROUP) +public class OrderRefundSuccessScoreConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(OrderRefundSuccessScoreConsumer.class); + + @Autowired + private UserExtensionService userExtensionService; + + + /** + * 订单退货退款,还原用户的成长值 + * + * @param message + */ + @Override + public void onMessage(RefundNotifyBO message) { + // 订单已关闭就不退积分 + if (Objects.equals(message.getDbOrderStatus(), OrderStatus.CLOSE.value())) { + return; + } + LOG.info("订单退款成功,还原用户成长值... message: {}", Json.toJsonString(message)); + UserOrderScoreBo userOrderScoreBo = new UserOrderScoreBo(); + userOrderScoreBo.setUserId(message.getUserId()); + userOrderScoreBo.setRefundId(message.getRefundId()); + userOrderScoreBo.setOrderId(message.getOrderId()); + userOrderScoreBo.setOrderScore(message.getOrderScore()); + userExtensionService.refundScore(userOrderScoreBo); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/RechargeNotifyConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/RechargeNotifyConsumer.java new file mode 100644 index 0000000..6348c02 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/RechargeNotifyConsumer.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.service.UserRechargeService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 余额充值回调 + * + * @author FrozenWatermelon + * @date 2021/1/7 + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.USER_RECHARGE_NOTIFY_TOPIC, consumerGroup = RocketMqConstant.USER_RECHARGE_NOTIFY_TOPIC) +public class RechargeNotifyConsumer implements RocketMQListener { + + @Autowired + private UserRechargeService userRechargeService; + + private static final Logger LOG = LoggerFactory.getLogger(RechargeNotifyConsumer.class); + + @Override + public void onMessage(RechargeNotifyBO message) { + LOG.info("充值回调开始... message: {}", Json.toJsonString(message)); + userRechargeService.rechargeSuccess(message); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/ShopCustomerExcelListener.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/ShopCustomerExcelListener.java new file mode 100644 index 0000000..5f46648 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/ShopCustomerExcelListener.java @@ -0,0 +1,78 @@ +package com.tmerclub.cloud.user.listener; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.user.dto.ShopCustomerExcelDTO; +import com.tmerclub.cloud.user.manager.UserExcelManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author: zsm + * @date: 2023/1/16 10:41 + */ +public class ShopCustomerExcelListener extends AnalysisEventListener { + + private UserExcelManager userExcelManager; + private Map> errorMap; + private List list; + public static final String OTHER = "other"; + public static final String ERROR_ROWS = "error_rows"; + public static final String IMPORT_ROWS = "import_rows"; + + /** + * 每隔1000条数据存储数据库,然后清理map ,方便内存回收 + */ + private static final int BATCH_COUNT = 3000; + private static String seq; + + public ShopCustomerExcelListener() { + } + + public ShopCustomerExcelListener(UserExcelManager userExcelManager, Map> errorMap) { + this.userExcelManager = userExcelManager; + errorMap.put(OTHER, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(ERROR_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + errorMap.put(IMPORT_ROWS, new ArrayList<>(Constant.INITIAL_CAPACITY)); + this.errorMap = errorMap; + this.list = new ArrayList<>(Constant.INITIAL_CAPACITY); + } + + /** + * 这个每一条数据解析都会来调用 + */ + + @Override + public void invoke(ShopCustomerExcelDTO shopCustomerExcelDTO, AnalysisContext analysisContext) { + boolean isSave = list.size() > BATCH_COUNT; + if (isSave) { + saveData(); + } + + list.add(shopCustomerExcelDTO); + } + + /** + * 所有数据解析完成了 都会来调用 + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + //确保所有数据都能入库 + saveData(); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + if (CollUtil.isEmpty(list)) { + return; + } + userExcelManager.importShopCustomerExcel(list, errorMap); + list.clear(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserScoreUnlockConsumer.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserScoreUnlockConsumer.java new file mode 100644 index 0000000..8b77f00 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/listener/UserScoreUnlockConsumer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.listener; + +import com.tmerclub.cloud.api.user.bo.UserScoreBO; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.service.UserScoreLockService; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author FrozenWatermelon + */ +@Component +@RocketMQMessageListener(topic = RocketMqConstant.SCORE_UNLOCK_TOPIC, consumerGroup = RocketMqConstant.SCORE_UNLOCK_TOPIC) +public class UserScoreUnlockConsumer implements RocketMQListener { + + private static final Logger LOG = LoggerFactory.getLogger(UserScoreUnlockConsumer.class); + + @Autowired + private UserScoreLockService userScoreLockService; + + /** + * 1、积分锁定一定时间后,如果订单支付未支付,则解锁积分(有可能积分锁定成功,订单因为异常回滚导致订单未创建) + * 2、取消订单,直接解锁积分 + */ + @Override + public void onMessage(UserScoreBO userScoreBo) { + LOG.info("订单取消解锁库存... message: {}", Json.toJsonString(userScoreBo)); + userScoreLockService.unlock(userScoreBo); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserExcelManager.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserExcelManager.java new file mode 100644 index 0000000..72e0c93 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserExcelManager.java @@ -0,0 +1,820 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.manager; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.tmerclub.cloud.api.auth.constant.SysTypeEnum; +import com.tmerclub.cloud.api.auth.dto.AuthAccountDTO; +import com.tmerclub.cloud.api.auth.dto.AuthAccountUserDTO; +import com.tmerclub.cloud.api.auth.dto.UserRegisterDTO; +import com.tmerclub.cloud.api.auth.dto.UserRegisterExtensionDTO; +import com.tmerclub.cloud.api.auth.feign.AccountFeignClient; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.*; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.constant.SexTypeEnum; +import com.tmerclub.cloud.user.constant.UserStatusEnum; +import com.tmerclub.cloud.user.dto.*; +import com.tmerclub.cloud.user.handler.UserRowWriterHandler; +import com.tmerclub.cloud.user.listener.ShopCustomerExcelListener; +import com.tmerclub.cloud.user.listener.UserExcelListener; +import com.tmerclub.cloud.user.model.ShopCustomer; +import com.tmerclub.cloud.user.model.User; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.ShopCustomerService; +import com.tmerclub.cloud.user.service.UserLevelService; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.vo.ShopCustomerExcelVO; +import com.tmerclub.cloud.user.vo.UserExcelVO; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import com.tmerclub.cloud.user.vo.UserVO; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.stream.Collectors; + +/** + * 用户信息导入导出 + * + * @author cl + * @date 2021-05-11 09:33:25 + */ +@Component +public class UserExcelManager { + + @Autowired + private UserService userService; + + @Autowired + private UserLevelService userLevelService; + + @Autowired + private ThreadPoolExecutor userThreadPoolExecutor; + @Autowired + private SegmentManager segmentManager; + + @Autowired + private PasswordEncoder passwordEncoder; + + @DubboReference + private AccountFeignClient accountFeignClient; + + @Autowired + private ShopCustomerService shopCustomerService; + + @DubboReference + private ConfigFeignClient configFeignClient; + + /** + * 定义excel中一个sheet最大的行数 一百万行数据, 必须是PageDTO.MAX_PAGE_SIZE 的整数倍 + */ + public static final long SHEET_MAX_ROWS = 1000000; + public static final String[] LEVEL_TYPE_MODE = {LevelTypeEnum.ORDINARY_USER.value().toString(), LevelTypeEnum.PAY_USER.value().toString()}; + public static final String[] SEX_MODE = {SexTypeEnum.FEMALE.desc(), SexTypeEnum.MALE.desc()}; + public static final int LEVEL_TYPE_INDEX = 4; + public static final int LEVEL_NAME_INDEX = 5; + public static final int SEX_INDEX = 8; + public static final String FORMAT = "yyyy-MM-dd"; + public static final int YEAR_MONTH_DAY_LENGTH = 10; + public static final int PHONE_LENGTH = 11; + + private static final Logger log = LoggerFactory.getLogger(UserExcelManager.class); + + /** + * 导出用户信息 + * + * @param response 响应 + * @param userManagerDTO 条件查询参数 + */ + public void exportUserInfoExcel(HttpServletResponse response, UserManagerDTO userManagerDTO) { + PageDTO pageDTO = new PageDTO(); + pageDTO.setPageNum(PageDTO.DEFAULT_PAGE_NUM); + pageDTO.setPageSize(PageDTO.MAX_PAGE_SIZE); + userManagerDTO.setShopId(AuthUserContext.get().getTenantId()); + // 是否是商家端 商家端导出客户信息, 平台端导出用户信息 + boolean isShop = Objects.equals(AuthUserContext.get().getSysType(), SysTypeEnum.MULTISHOP.value()); + PageVO userPage = userService.getUserInfoPage(pageDTO, userManagerDTO); + long total = userPage.getTotal(); + if (total == 0) { + throw new LuckException("无用户数据导出"); + } + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + // 总数大于PageDTO.MAX_PAGE_SIZE条 + if (total > PageDTO.MAX_PAGE_SIZE) { + // 总共可以分多少页 + Integer pages = userPage.getPages(); + // 从第一页开始 + int page = 1; + ExcelWriter excelWriter = null; + try { + // 初始化 ExcelWriter + excelWriter = isShop ? + ExcelUtil.getExcelWriterMerge(response, ShopCustomerExcelVO.EXCEL_NAME, ShopCustomerExcelVO.MERGE_ROW_INDEX, ShopCustomerExcelVO.MERGE_COLUMN_INDEX).build() : + ExcelUtil.getExcelWriterMerge(response, UserExcelVO.EXCEL_NAME, UserExcelVO.MERGE_ROW_INDEX, UserExcelVO.MERGE_COLUMN_INDEX).build(); + // 大于 PageDTO.MAX_PAGE_SIZE行,进行分页查询 + // 计算有多少个sheet + int sheetNum = countSlicesNum(SHEET_MAX_ROWS, total); + for (int i = 0; i < sheetNum; i++) { + // 第i个sheet最多有多少行数据 + long eachSheetRows = Math.min(total - i * SHEET_MAX_ROWS, SHEET_MAX_ROWS); + // 计算每个sheet的最大行数,要分多少次分页查询 + int slicesNum = countSlicesNum(PageDTO.MAX_PAGE_SIZE.longValue(), eachSheetRows); + // 收集好获取到当前sheet的所有准备写入的用户数据 + List sheetDataList = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (int j = 0; j < slicesNum; j++) { + if (page > pages) { + break; + } + // 多线程分页查询数据 + PageDTO pageIndex = new PageDTO(); + pageIndex.setPageSize(PageDTO.MAX_PAGE_SIZE); + // 第几页开始 + pageIndex.setPageNum(page); + int tempPage = page; + CompletableFuture> userFuture = CompletableFuture.supplyAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List userInfoList = userService.getUserInfoList(pageIndex, userManagerDTO); + List list = BeanUtil.mapAsList(userInfoList, UserExcelVO.class); + // 给数组一个序列号 + list.forEach(item -> item.setSeq(Integer.toString(list.indexOf(item) + (tempPage - 1) * pageIndex.getPageSize() + 1))); + return list; + }, userThreadPoolExecutor); + page++; + sheetDataList.addAll(userFuture.get()); + } + // 导出excel + int sheetNo = i + 1; + WriteSheet writeSheet = isShop ? + EasyExcel.writerSheet(ShopCustomerExcelVO.SHEET_NAME + sheetNo).head(ShopCustomerExcelVO.class).build() : + EasyExcel.writerSheet(UserExcelVO.SHEET_NAME + sheetNo).head(UserExcelVO.class).build(); + excelWriter.write(sheetDataList, writeSheet); + } + } catch (Exception e) { + log.error("导出excel失败", e); + } finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + } else { + // 小于等于 PageDTO.MAX_PAGE_SIZE行 直接导出 + if (isShop) { + List customerList = BeanUtil.mapAsList(userPage.getList(), ShopCustomerExcelVO.class); + customerList.forEach(item -> item.setSeq(Integer.toString(customerList.indexOf(item) + 1))); + ExcelUtil.soleExcel(response, customerList, ShopCustomerExcelVO.EXCEL_NAME, ShopCustomerExcelVO.MERGE_ROW_INDEX, ShopCustomerExcelVO.MERGE_COLUMN_INDEX, ShopCustomerExcelVO.class); + } else { + List userList = BeanUtil.mapAsList(userPage.getList(), UserExcelVO.class); + userList.forEach(item -> item.setSeq(Integer.toString(userList.indexOf(item) + 1))); + ExcelUtil.soleExcel(response, userList, UserExcelVO.EXCEL_NAME, UserExcelVO.MERGE_ROW_INDEX, UserExcelVO.MERGE_COLUMN_INDEX, UserExcelVO.class); + } + + } + } + + /** + * 下载用户导入模板 + * + * @param response 响应 + */ + public void downloadModel(HttpServletResponse response) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + list.add(new UserExcelDTO()); + Map map = new HashMap<>(8); + List userLevelList = userLevelService.list(LevelTypeEnum.PAY_USER.value()); + List levelNameList = userLevelList.stream().map(UserLevelVO::getLevelName).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(levelNameList)) { + map.put(LEVEL_NAME_INDEX, levelNameList.toArray(new String[]{})); + } + map.put(LEVEL_TYPE_INDEX, LEVEL_TYPE_MODE); + map.put(SEX_INDEX, SEX_MODE); + ExcelWriter excelWriter = null; + try { + // 通联支付会员导入模板去除余额列 + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, AllinpayUserExcelDTO.EXCEL_NAME, AllinpayUserExcelDTO.MERGE_ROW_INDEX, AllinpayUserExcelDTO.MERGE_COLUMN_INDEX); + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, 1).useDefaultStyle(false).build(); + if (!CollUtil.isEmpty(list)) { + WriteSheet sheetWriter = EasyExcel.writerSheet(AllinpayUserExcelDTO.SHEET_NAME) + .registerWriteHandler(new UserRowWriterHandler(true)) + .head(AllinpayUserExcelDTO.class).build(); + excelWriter.write(list, sheetWriter); + } + } else { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, UserExcelDTO.EXCEL_NAME, UserExcelDTO.MERGE_ROW_INDEX, UserExcelDTO.MERGE_COLUMN_INDEX); + // useDefaultStyle false 不需要默认的头部加粗/自动换行样式 + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, map, 1).useDefaultStyle(false).build(); + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(UserExcelDTO.SHEET_NAME) + .registerWriteHandler(new UserRowWriterHandler(false)) + .head(UserExcelDTO.class).build(); + excelWriter.write(list, sheetWriter); + } + } + } catch (Exception e) { + log.error("导出用户信息模板excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + /** + * 分片个数,计算总数total分为每片为eachNum的片数 + * + * @param eachNum 每片的个数 + * @param total 被分片的总数 + * @return 分片个数 + */ + private int countSlicesNum(Long eachNum, Long total) { + boolean isZero = Objects.isNull(eachNum) || eachNum == 0 || Objects.isNull(total) || total == 0; + if (isZero) { + return 0; + } + // 分片数 + int pageSize = new BigDecimal(total).divide(new BigDecimal(eachNum), RoundingMode.DOWN).intValue(); + // 余数 + int mod = new BigDecimal(total).divideAndRemainder(new BigDecimal(eachNum))[1].intValue(); + if (mod > 0) { + pageSize = pageSize + 1; + } + return pageSize; + } + + /** + * 导入用户 + * + * @param file + * @return + */ + public String importUserExcel(MultipartFile file) { + try { + Map> errorMap = new HashMap<>(16); + UserExcelListener userExcelListener = new UserExcelListener(this, errorMap); + EasyExcel.read(file.getInputStream(), UserExcelDTO.class, userExcelListener).sheet().doRead(); + return getUserExportInfo(errorMap); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } catch (ExcelDataConvertException e) { + throw new LuckException(":数据格式错误"); + } + } + + /** + * 处理导入的需要响应的信息 + * + * @param errorMap 响应信息的集合 + * @return 响应信息 + */ + private String getUserExportInfo(Map> errorMap) { + StringBuilder info = new StringBuilder(Constant.INITIAL_CAPACITY); + List importTotal = errorMap.get(UserExcelListener.IMPORT_ROWS); + BigDecimal total = new BigDecimal("0"); + if (CollUtil.isNotEmpty(importTotal)) { + for (String item : importTotal) { + if (StrUtil.isNotBlank(item)) { + total = total.add(new BigDecimal(item)); + } + } + } + info.append("共有: ").append(total.intValue()).append("条数据成功导入").append(StrUtil.LF); + // 错误信息 + List errorRows = errorMap.get(UserExcelListener.ERROR_ROWS); + if (CollUtil.isNotEmpty(errorRows)) { + info.append("用户信息错误行数: ").append(Arrays.toString(errorRows.toArray())).append(StrUtil.LF); + } + List errors = errorMap.get(UserExcelListener.OTHER); + if (CollUtil.isNotEmpty(errors)) { + for (String error : errors) { + info.append(error); + } + } + return info.toString(); + } + + + /** + * 根据导入的用户数据,批量注册用户 + * + * @param list 导入的用户信息 + * @param errorMap 错误信息集合 + */ + public void importExcel(List list, Map> errorMap) { + if (CollUtil.isEmpty(list)) { + throw new LuckException("解析到0条数据"); + } + int size = list.size(); + // 全平台统一账户信息 + List accountDTOList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 用户扩展表信息集合 + List userExtensionList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 普通会员等级列表 + List ordinaryLevels = userLevelService.list(LevelTypeEnum.ORDINARY_USER.value()); + // 付费会员等级列表 + List payLevels = userLevelService.list(LevelTypeEnum.PAY_USER.value()); + Map payLevelMap = payLevels.stream().collect(Collectors.toMap(UserLevelVO::getLevelName, u -> u)); + // 集合去重复 + list = list.stream().filter(user -> Objects.nonNull(user.getPhone())).collect( + Collectors.collectingAndThen( + Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserExcelDTO::getPhone))), ArrayList::new)); + // 第几行数据有误 的集合 + List errorRows = new ArrayList<>(Constant.INITIAL_CAPACITY); + long currentTime = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); + this.loadErrorData(list, errorMap, size); + int row = 1; + String ipAddr = IpHelper.getIpAddr(); + // 处理数据 + for (UserExcelDTO userExcelDTO : list) { + row++; + if (checkInfo(errorRows, row, userExcelDTO)) { + continue; + } + // 会员类型(0普通会员/1付费会员),不填默认为普通会员 + Integer levelType = Objects.isNull(userExcelDTO.getLevelType()) ? LevelTypeEnum.ORDINARY_USER.value() : userExcelDTO.getLevelType(); + Date vipEndTime = userExcelDTO.getVipEndTime(); + // 如果是付费会员,会员结束时间没填写,则不能导入 + if (Objects.equals(LevelTypeEnum.PAY_USER.value(), levelType) && Objects.isNull(vipEndTime)) { + errorRows.add(row); + continue; + } + // 成长值 + int growth = new BigDecimal(userExcelDTO.getGrowth()).intValue(); + // 会员等级 + Integer payUserLevel = null; + if (Objects.equals(levelType, LevelTypeEnum.PAY_USER.value())) { + levelType = getLevelType(payLevels, currentTime, levelType, vipEndTime); + // 付费会员等级以导入为准, + payUserLevel = Constant.USER_LEVEL_INIT; + String importLevel = userExcelDTO.getLevel(); + if (!payLevelMap.containsKey(importLevel)) { + //输入了不存在的会员等级 + errorRows.add(row); + continue; + } + + payUserLevel = getPayUserLevel(payLevels, payLevelMap, payUserLevel, importLevel); + } + // 统一账户Id + Long userId = segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER); + // 统一账户表信息 + AuthAccountDTO authAccountDTO = getInitAuthAccountDTO(ipAddr, userExcelDTO, userId); + accountDTOList.add(authAccountDTO); + // 用户表信息 + Integer normalLevel = getUserLevelByGrowth(ordinaryLevels, growth); + User user = getInitUser(userExcelDTO, levelType, vipEndTime, userId, normalLevel, payUserLevel); + userList.add(user); + // 用户扩展表信息 + UserExtension userExtension = getInitUserExtension(userExcelDTO, growth, user); + userExtensionList.add(userExtension); + } + // 批量注册用户 + batchRegisterUser(accountDTOList, userList, userExtensionList, errorMap); + if (CollUtil.isNotEmpty(errorRows)) { + List collect = errorRows.stream().map(String::valueOf).collect(Collectors.toList()); + errorMap.get(UserExcelListener.ERROR_ROWS).addAll(collect); + } + } + + private static Integer getPayUserLevel(List payLevels, Map payLevelMap, Integer payUserLevel, String importLevel) { + for (UserLevelVO payLevel : payLevels) { + if (payLevel.getLevel() <= payLevelMap.get(importLevel).getLevel()) { + payUserLevel = payLevel.getLevel(); + } + } + return payUserLevel; + } + + private static boolean checkInfo(List errorRows, int row, UserExcelDTO userExcelDTO) { + // 手机号必须是11位 + String phone = userExcelDTO.getPhone(); + if (StrUtil.isBlank(phone) || phone.length() != PHONE_LENGTH) { + errorRows.add(row); + return true; + } + // 密码不能为空 + if (StrUtil.isBlank(userExcelDTO.getPassword())) { + errorRows.add(row); + return true; + } + // 密码格式错误 + if (!PasswordUtil.checkFormat(userExcelDTO.getPassword())) { + errorRows.add(row); + return true; + } + // 用户昵称最多15个字符 + if (StrUtil.isNotBlank(userExcelDTO.getNickName()) + && userExcelDTO.getNickName().length() > 15) { + errorRows.add(row); + return true; + } + // 昵称为空时 自动填入u+手机号后四位 + if (StrUtil.isBlank(userExcelDTO.getNickName())) { + log.info("昵称为空时 自动填入u+手机号后四位"); + userExcelDTO.setNickName("u" + phone.substring(7)); + } + //余额必须为整数 + if (!NumberUtil.isInteger(userExcelDTO.getBalance())) { + errorRows.add(row); + return true; + } + //积分必须为整数 + if (!NumberUtil.isInteger(userExcelDTO.getScore())) { + errorRows.add(row); + return true; + } + //成长值必须为整数 + if (!NumberUtil.isInteger(userExcelDTO.getGrowth())) { + errorRows.add(row); + return true; + } + return false; + } + + private static Integer getLevelType(List payLevels, long currentTime, Integer levelType, Date vipEndTime) { + if (CollUtil.isEmpty(payLevels)) { + throw new LuckException("请在平台端设置好付费会员的等级,才可以导入付费会员"); + } + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime ldt = LocalDateTime.parse(DateUtil.beginOfDay(vipEndTime).toString(), dtf); + //获取毫秒数 + long milliSecond = ldt.toInstant(ZoneOffset.of("+8")).toEpochMilli(); + if (currentTime >= milliSecond) { + levelType = LevelTypeEnum.ORDINARY_USER.value(); + } + return levelType; + } + + /** + * 过滤用户手机号已经存在的用户 + * + * @param list 用户数据列表 + * @param size 数据数量 + */ + private void loadErrorData(List list, Map> errorMap, int size) { + List errorPhones = new ArrayList<>(Constant.INITIAL_CAPACITY); + List phones = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserExcelDTO userExcelDTO : list) { + phones.add(userExcelDTO.getPhone()); + } + List userVOList = userService.getUserListByPhones(phones); + phones = userVOList.stream().map(UserVO::getPhone).collect(Collectors.toList()); + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + UserExcelDTO userExcelDTO = iterator.next(); + boolean phone = phones.contains(userExcelDTO.getPhone()); + if (phone) { + errorPhones.add(userExcelDTO.getPhone()); + iterator.remove(); + } else { + phones.add(userExcelDTO.getPhone()); + } + } + List errorList = errorMap.get(UserExcelListener.OTHER); + if (CollUtil.isNotEmpty(errorPhones)) { + errorList.add("手机号码:" + errorPhones + "已存在)"); + } + } + + /** + * 批量注册用户 + * + * @param accountDTOList 账户信息列表 + * @param userList 用户信息列表 + * @param userExtensionList 用户扩展信息列表 + * @param errorMap 错误信息集合 + */ + private void batchRegisterUser(List accountDTOList, List userList, List userExtensionList, Map> errorMap) { + if (CollUtil.isEmpty(accountDTOList)) { + return; + } + List userRegisterList = BeanUtil.mapAsList(userList, UserRegisterDTO.class); + List userRegisterExtensionDTOList = BeanUtil.mapAsList(userExtensionList, UserRegisterExtensionDTO.class); + // 只有先去全平台统一账户那里把账号注册成功了,才可以添加用户信息 + AuthAccountUserDTO authAccountUserDTO = new AuthAccountUserDTO(); + authAccountUserDTO.setAccountDTOList(accountDTOList); + authAccountUserDTO.setUserRegisterList(userRegisterList); + authAccountUserDTO.setUserRegisterExtensionDTOList(userRegisterExtensionDTOList); + ServerResponseEntity userRegisterResponse = accountFeignClient.batchRegisterAccount(authAccountUserDTO); + if (!userRegisterResponse.isSuccess()) { + throw new LuckException(userRegisterResponse.getMsg()); + } + String row = userRegisterResponse.getData(); + errorMap.get(UserExcelListener.IMPORT_ROWS).add(row); + } + + /** + * 根据参数初始化用户扩展表信息 + * + * @param userExcelDTO 导入参数 + * @param growth 成长值 + * @param user 用户信息 + * @return 用户扩展表信息 + */ + private UserExtension getInitUserExtension(UserExcelDTO userExcelDTO, int growth, User user) { + UserExtension userExtension = new UserExtension(); + // 元转分 + BigDecimal price = new BigDecimal(userExcelDTO.getBalance()); + BigDecimal maxAmount = new BigDecimal(Long.valueOf(PriceUtil.MAX_AMOUNT).toString()); + if (price.compareTo(maxAmount) > 0) { + price = maxAmount; + } + BigDecimal zero = new BigDecimal("0"); + if (zero.compareTo(price) > 0) { + price = zero; + } + userExtension.setBalance(PriceUtil.toLongCent(price)); + userExtension.setActualBalance(userExtension.getBalance()); + userExtension.setGrowth(growth); + userExtension.setLevel(user.getLevel()); + userExtension.setLevelType(user.getLevelType()); + userExtension.setScore(new BigDecimal(userExcelDTO.getScore()).longValue()); + userExtension.setVersion(0); + userExtension.setSignDay(0); + userExtension.setVipLevel(user.getVipLevel()); + userExtension.setUserId(user.getUserId()); + userExtension.setAllinpayBalance(0L); + userExtension.setAllinpayActualBalance(0L); + userExtension.setAllinpayRealNameSet(0); + userExtension.setAllinpayPhoneBind(0); + userExtension.setAllinpayPayPwdSet(0); + userExtension.setAllinpayProtocolSign(0); + userExtension.setAllinpayPayAcctBind(0); + return userExtension; + } + + /** + * 根据参数初始化用户信息 + * + * @param userExcelDTO 导入参数 + * @param levelType 会员类型 + * @param vipEndTime vip结束时间 + * @param userId 用户id + * @param normalLevel 普通会员等级 + * @param payUserLevel 付费会员等级 + * @return 用户信息 + */ + private User getInitUser(UserExcelDTO userExcelDTO, Integer levelType, Date vipEndTime, Long userId, Integer normalLevel, Integer payUserLevel) { + // 用户信息 + User user = new User(); + user.setUserId(userId); + user.setNickName(userExcelDTO.getNickName()); + user.setLevel(normalLevel); + user.setVipLevel(Objects.equals(levelType, LevelTypeEnum.ORDINARY_USER.value()) ? null : payUserLevel); + user.setStatus(UserStatusEnum.ENABLE.value()); + user.setPhone(userExcelDTO.getPhone()); + user.setSex(userExcelDTO.getSex()); + // 将日期强制格式化为yyyy-MM-dd + String birthDate = dateStrFormatToStr(userExcelDTO.getBirthDate()); + user.setBirthDate(birthDate); + user.setVipEndTime(Objects.equals(levelType, LevelTypeEnum.ORDINARY_USER.value()) ? null : vipEndTime); + user.setLevelType(levelType); + return user; + } + + /** + * 根据参数初始化 账户表 + * + * @param ipAddr ip + * @param userExcelDTO 参数 + * @param userId 用户id + * @return 账户信息 + */ + private AuthAccountDTO getInitAuthAccountDTO(String ipAddr, UserExcelDTO userExcelDTO, Long userId) { + AuthAccountDTO authAccountDTO = new AuthAccountDTO(); + authAccountDTO.setCreateIp(ipAddr); + authAccountDTO.setPassword(passwordEncoder.encode(userExcelDTO.getPassword())); + authAccountDTO.setPhone(userExcelDTO.getPhone()); + // 普通用户,不是管理员 + authAccountDTO.setIsAdmin(0); + authAccountDTO.setSysType(SysTypeEnum.ORDINARY.value()); + authAccountDTO.setStatus(UserStatusEnum.ENABLE.value()); + authAccountDTO.setUserId(userId); + return authAccountDTO; + } + + + /** + * 根据成长值获取成长值所在等级 + * + * @param levelVOList 会员等级列表 + * @param growth 成长值 + * @return 会员等级 + */ + private Integer getUserLevelByGrowth(List levelVOList, Integer growth) { + int level = Constant.USER_LEVEL_INIT; + for (UserLevelVO levelVO : levelVOList) { + if (growth >= levelVO.getNeedGrowth()) { + level = levelVO.getLevel(); + } + } + return level; + } + + /** + * 将日期格式为 yyyy-MM-dd + * + * @param dateStr 日期字符串 + * @return yyyy-MM-dd日期字符串 + */ + private String dateStrFormatToStr(String dateStr) { + if (StrUtil.isNotBlank(dateStr) && dateStr.length() > YEAR_MONTH_DAY_LENGTH) { + try { + DateTime parse = DateUtil.parse(dateStr, FORMAT); + dateStr = DateUtil.format(parse, FORMAT); + } catch (Exception e) { + log.info("导入时,用户出生日期格式化异常"); + dateStr = ""; + } + } + return dateStr; + } + + /** + * 下载客户导入模板 + * + * @param response 响应 + */ + public void downloadShopCustomerModel(HttpServletResponse response) { + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + list.add(new ShopCustomerExcelDTO()); + ExcelWriter excelWriter = null; + try { + // 先执行合并策略 + ExcelWriterBuilder excelWriterMerge = ExcelUtil.getExcelWriterMerge(response, ShopCustomerExcelDTO.EXCEL_NAME, ShopCustomerExcelDTO.MERGE_ROW_INDEX, ShopCustomerExcelDTO.MERGE_COLUMN_INDEX); + // useDefaultStyle false 不需要默认的头部加粗/自动换行样式 + excelWriter = ExcelUtil.getExcelModel(excelWriterMerge, null, 1).useDefaultStyle(false).build(); + // 业务代码 + if (CollUtil.isNotEmpty(list)) { + // 进行写入操作 + WriteSheet sheetWriter = EasyExcel.writerSheet(ShopCustomerExcelDTO.SHEET_NAME).head(ShopCustomerExcelDTO.class).build(); + excelWriter.write(list, sheetWriter); + } + } catch (Exception e) { + log.error("导出客户信息模板excel失败", e); + } finally { + // 千万别忘记finish 会帮忙关闭流 + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + + /** + * 根据导入的客户数据,批量注册客户 + * + * @param list + * @param errorMap + * @return + */ + public void importShopCustomerExcel(List list, Map> errorMap) { + if (CollUtil.isEmpty(list)) { + throw new LuckException("解析到0条数据"); + } + int size = list.size(); + // 集合去重复 + try { + list = list.stream().collect( + Collectors.collectingAndThen( + Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ShopCustomerExcelDTO::getPhone))), ArrayList::new)); + } catch (Exception e) { + throw new LuckException("文件数据错误"); + } + // 第几行数据有误 的集合 + List errorRows = new ArrayList<>(Constant.INITIAL_CAPACITY); + this.loadShopCustomerErrorData(list, errorMap); + int row = 1; + // 处理数据 + for (ShopCustomerExcelDTO shopCustomerExcelDTO : list) { + row++; + // 手机号必须是11位 + String phone = shopCustomerExcelDTO.getPhone(); + if (StrUtil.isBlank(phone) || phone.length() != PHONE_LENGTH) { + errorRows.add(row); + } + } + List shopCustomers = BeanUtil.mapAsList(list, ShopCustomer.class); + if (CollUtil.isNotEmpty(shopCustomers)) { + shopCustomerService.saveBatch(shopCustomers); + errorMap.get(ShopCustomerExcelListener.IMPORT_ROWS).add(String.valueOf(shopCustomers.size())); + } + if (CollUtil.isNotEmpty(errorRows)) { + List collect = errorRows.stream().map(String::valueOf).toList(); + errorMap.get(ShopCustomerExcelListener.ERROR_ROWS).addAll(collect); + } + } + + private void loadShopCustomerErrorData(List list, Map> errorMap) { + List errorPhones = new ArrayList<>(Constant.INITIAL_CAPACITY); + List errorUsers = new ArrayList<>(Constant.INITIAL_CAPACITY); + List phones = list.stream().map(ShopCustomerExcelDTO::getPhone).collect(Collectors.toList()); + List userVOList = userService.getUserListByPhones(phones); + Map userMap = userVOList.stream().collect(Collectors.toMap(UserVO::getPhone, user -> user)); + + ShopCustomerDTO shopCustomerDTO = new ShopCustomerDTO(); + shopCustomerDTO.setShopId(AuthUserContext.get().getTenantId()); + List customers = shopCustomerService.listByParam(shopCustomerDTO); + Map customerMap = customers.stream().collect(Collectors.toMap(UserManagerVO::getUserId, cus -> cus)); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { + ShopCustomerExcelDTO shopCustomerExcelDTO = iterator.next(); + //导入的用户是否存在 + UserVO userVO = userMap.get(shopCustomerExcelDTO.getPhone()); + if (Objects.isNull(userVO)) { + errorUsers.add(shopCustomerExcelDTO.getPhone()); + iterator.remove(); + continue; + } + + //判断店铺客户是否已存在 + boolean phone = Objects.nonNull(customerMap.get(userVO.getUserId())); + if (!phone) { + phones.add(shopCustomerExcelDTO.getPhone()); + continue; + } + errorPhones.add(shopCustomerExcelDTO.getPhone()); + iterator.remove(); + } + for (ShopCustomerExcelDTO customerExcelDTO : list) { + UserVO user = userMap.get(customerExcelDTO.getPhone()); + customerExcelDTO.setUserId(user.getUserId()); + customerExcelDTO.setShopId(AuthUserContext.get().getTenantId()); + } + + List errorList = errorMap.get(UserExcelListener.OTHER); + if (CollUtil.isNotEmpty(errorPhones)) { + errorList.add("手机号码:" + errorPhones + "已存在)"); + } + if (CollUtil.isNotEmpty(errorUsers)) { + errorList.add("手机号:" + errorUsers + "用户不存在;"); + } + + } + + /** + * 导入客户 + * + * @param file + * @return + */ + public String importShopCustomerExcel(MultipartFile file) { + try { + Map> errorMap = new HashMap<>(16); + ShopCustomerExcelListener shopCustomerExcelListener = new ShopCustomerExcelListener(this, errorMap); + EasyExcel.read(file.getInputStream(), ShopCustomerExcelDTO.class, shopCustomerExcelListener).sheet().doRead(); + return getUserExportInfo(errorMap); + } catch (IOException e) { + throw new LuckException(e.getMessage()); + } + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserLevelOrderManager.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserLevelOrderManager.java new file mode 100644 index 0000000..d0f7264 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserLevelOrderManager.java @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.manager; + +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.api.multishop.bo.EsShopDetailBO; +import com.tmerclub.cloud.api.multishop.feign.ShopDetailFeignClient; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.constant.ShopType; +import com.tmerclub.cloud.common.order.vo.ShopCartItemDiscountVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderVO; +import com.tmerclub.cloud.common.product.constant.PreSaleType; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.user.constant.DiscountRangeEnum; +import com.tmerclub.cloud.user.constant.FreeFeeTypeEnum; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.constant.RightsTypeEnum; +import com.tmerclub.cloud.user.service.UserLevelService; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import com.tmerclub.cloud.user.vo.UserRightsVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2021/5/12 + */ +@Component +public class UserLevelOrderManager { + + @Autowired + private UserLevelService userLevelService; + @Autowired + private UserService userService; + @DubboReference + private ShopDetailFeignClient shopDetailFeignClient; + + public void calculateLevelDiscount(ShopCartOrderMergerVO shopCartOrderMerger) { + // 积分订单不享受会员权益, 直接返回 + if (Objects.equals(shopCartOrderMerger.getOrderType(), OrderType.SCORE)) { + return; + } + Long userId = AuthUserContext.get().getUserId(); + List userRightsList = getUserRightsList(userId); + // 会员没有权益,不用计算 + if (CollectionUtil.isEmpty(userRightsList)) { + return; + } + UserRightsVO discountRight = new UserRightsVO(); + UserRightsVO freeFeeRight = new UserRightsVO(); + // 循环查找最优惠的折扣以及包邮权益【范围下,选择折扣更低的】 + for (UserRightsVO userRightsVO : userRightsList) { + // 定金预售只参与会员包邮,不参与会员折扣 + if (!Objects.equals(shopCartOrderMerger.getPreSaleType(), PreSaleType.DEPOSIT.value())) { + discountRight = getDiscountRightsVO(discountRight, userRightsVO); + } + // 包邮 + freeFeeRight = getFreeFeeRightsVO(freeFeeRight, userRightsVO); + } + // 会员折扣计算 + if (Objects.nonNull(discountRight.getRightsType())) { + calculateMemberDiscount(discountRight, shopCartOrderMerger); + } + // 运费包邮处理 + if (Objects.nonNull(freeFeeRight.getRightsType())) { + calculateFreeFee(freeFeeRight, shopCartOrderMerger); + } + } + + private List getUserRightsList(Long userId) { + // 缓存获取用户信息 + UserApiVO user = userService.getByUserId(userId); + // 缓存获取用户对应的等级信息 + List userRightsList = new ArrayList<>(Constant.INITIAL_CAPACITY); + if (Objects.nonNull(user.getVipLevel()) && Objects.equals(user.getLevelType(), LevelTypeEnum.PAY_USER.value())) { + // 付费会员的权益 + UserLevelVO payLevelInfo = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.PAY_USER.value(), user.getVipLevel()); + if (CollectionUtil.isNotEmpty(payLevelInfo.getUserRightsList())) { + userRightsList.addAll(payLevelInfo.getUserRightsList()); + } + } else { + //普通会员的权益 + UserLevelVO userLevelInfo = userLevelService.getOneByTypeAndLevel(LevelTypeEnum.ORDINARY_USER.value(), user.getLevel()); + if (CollectionUtil.isNotEmpty(userLevelInfo.getUserRightsList())) { + userRightsList.addAll(userLevelInfo.getUserRightsList()); + } + } + return userRightsList; + } + + private UserRightsVO getFreeFeeRightsVO(UserRightsVO freeFeeRight, UserRightsVO userRightsVO) { + if (Objects.equals(userRightsVO.getRightsType(), RightsTypeEnum.FREE_FEE_TYPE.value())) { + if (Objects.isNull(freeFeeRight.getRightsType())) { + freeFeeRight = userRightsVO; + } else if (Objects.nonNull(freeFeeRight.getRightsType()) && Objects.equals(userRightsVO.getFreeFeeType(), FreeFeeTypeEnum.ALL_PLATFORMS_FREE.value())) { + freeFeeRight = userRightsVO; + } + } + return freeFeeRight; + } + + private UserRightsVO getDiscountRightsVO(UserRightsVO discountRight, UserRightsVO userRightsVO) { + if (Objects.equals(userRightsVO.getRightsType(), RightsTypeEnum.MEMBER_DISCOUNT.value())) { + if (Objects.isNull(discountRight.getRightsType())) { + discountRight = userRightsVO; + } else if (Objects.nonNull(discountRight.getRightsType()) && discountRight.getDiscount() > userRightsVO.getDiscount()) { + discountRight = userRightsVO; + } + } + return discountRight; + } + + private void calculateFreeFee(UserRightsVO userRightsVO, ShopCartOrderMergerVO shopCartOrderMerger) { + List shopCartOrders = shopCartOrderMerger.getShopCartOrders(); + long totalFreeTransfee = 0L; + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + // 是否为自营店 + 自营店包邮 + if (Objects.equals(FreeFeeTypeEnum.SELF_OPERATED_STORE_FREE.value(), userRightsVO.getFreeFeeType()) + && !Objects.equals(shopCartOrder.getShopType(), ShopType.SELF_SHOP.value())) { + continue; + } + // 运费 + // 注意:这里减免运费金额没有减少运费金额,如果需要改变这里记得改变下退款判断 + Long transfee = shopCartOrder.getTransfee(); + totalFreeTransfee += transfee; + shopCartOrder.setLevelFreeTransfee(transfee); + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() - transfee); + long orderLevelReduce = Objects.isNull(shopCartOrder.getPlatformAmount()) ? transfee : shopCartOrder.getPlatformAmount() + transfee; + shopCartOrder.setPlatformAmount(orderLevelReduce); + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce() + transfee); + } + shopCartOrderMerger.setFreeTransfee(totalFreeTransfee); + + } + + /** + * 计算会员折扣 + */ + private void calculateMemberDiscount(UserRightsVO userRightsVO, ShopCartOrderMergerVO shopCartOrderMerger) { + + List shopCartOrders = shopCartOrderMerger.getShopCartOrders(); + + // 进行折扣计算的总金额 + long totalFee = 0L; + List allShopCartItem = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + //如果可用范围为自营店不为当前店铺直接下一次循环 + if (Objects.equals(DiscountRangeEnum.SELF_OPERATED_STORE.value(), userRightsVO.getDiscountRange()) && !Objects.equals(shopCartOrder.getShopType(), ShopType.SELF_SHOP.value())) { + continue; + } + List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + for (ShopCartItemVO shopCartItem : shopCartItems) { + totalFee = totalFee + shopCartItem.getActualTotal(); + allShopCartItem.add(shopCartItem); + } + } + } + if (totalFee <= 1) { + // 订单金额为0.01时,不享受会员折扣优惠 + return; + } + // 优惠金额 这个九五折是95 九折是90 + long totalReduce = PriceUtil.divideByBankerRounding(totalFee * (100 - userRightsVO.getDiscount()), 100); + + if (CollectionUtil.isEmpty(allShopCartItem)) { + return; + } + // 订单项按金额从小到大 + allShopCartItem.sort(Comparator.comparingDouble(ShopCartItemVO::getActualTotal)); + + // 最后支付金额至少0.01 + if (totalFee - totalReduce < 1) { + totalReduce -= 1; + } + long discountAmount = 0L; + for (int i = 0; i < allShopCartItem.size(); i++) { + ShopCartItemVO shopCartItem = allShopCartItem.get(i); + long itemDiscount; + // 最后一项 + if (i == allShopCartItem.size() - 1) { + itemDiscount = totalReduce - discountAmount; + // 如果分到最后一项的钱太多了,比订单项目金额都要多,订单项的分摊金额就当作订单项金额咯 + if (itemDiscount > shopCartItem.getActualTotal()) { + itemDiscount = shopCartItem.getActualTotal(); + } + } + // 非最后一项 + else { + itemDiscount = PriceUtil.divideByBankerRounding(shopCartItem.getActualTotal() * (100 - userRightsVO.getDiscount()), 100); + discountAmount += itemDiscount; + } + shopCartItem.setLevelReduce(itemDiscount); + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - shopCartItem.getLevelReduce()); + shopCartItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce() + shopCartItem.getLevelReduce()); + } + + Map> shopCartOrderMap = allShopCartItem.stream().collect(Collectors.groupingBy(ShopCartItemVO::getShopId)); + + long totalLevelAmount = 0L; + // 重算一遍分摊金额 + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + //如果可用范围为自营店不为当前店铺直接下一次循环 + if (Objects.equals(DiscountRangeEnum.SELF_OPERATED_STORE.value(), userRightsVO.getDiscountRange()) && !Objects.equals(shopCartOrder.getShopType(), ShopType.SELF_SHOP.value())) { + continue; + } + List shopCartItems = shopCartOrderMap.get(shopCartOrder.getShopId()); + long levelReduce = 0; + + for (ShopCartItemVO shopCartItem : shopCartItems) { + levelReduce += shopCartItem.getLevelReduce(); + } + shopCartOrder.setLevelReduce(levelReduce); + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() - levelReduce); + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce() + levelReduce); + long orderLevelReduce = Objects.isNull(shopCartOrder.getPlatformAmount()) ? levelReduce : shopCartOrder.getPlatformAmount() + levelReduce; + shopCartOrder.setPlatformAmount(orderLevelReduce); + + totalLevelAmount += levelReduce; + } + + shopCartOrderMerger.setTotalLevelAmount(totalLevelAmount); + shopCartOrderMerger.setActualTotal(shopCartOrderMerger.getActualTotal() - totalLevelAmount); + } + + /** + * 获取用户是否具有包邮权益 + */ + public Boolean getHaveFreeFeeRight(Long userId, Long shopId) { + List userRightsList = getUserRightsList(userId); + // 会员没有权益,不用计算 + if (CollectionUtil.isEmpty(userRightsList)) { + return false; + } + UserRightsVO freeFeeRight = new UserRightsVO(); + for (UserRightsVO userRightsVO : userRightsList) { + // 包邮 + freeFeeRight = getFreeFeeRightsVO(freeFeeRight, userRightsVO); + } + // 运费包邮处理 + if (Objects.nonNull(freeFeeRight.getRightsType())) { + if (Objects.equals(freeFeeRight.getRightsType(), FreeFeeTypeEnum.ALL_PLATFORMS_FREE.value())) { + return true; + } else { + // 自营店包邮,判断下该店铺是不是自营的 + ServerResponseEntity responseEntity = shopDetailFeignClient.getShopByShopId(shopId); + if (!responseEntity.isSuccess()) { + throw new LuckException(responseEntity.getMsg()); + } + EsShopDetailBO shopDetailBO = responseEntity.getData(); + return Objects.equals(shopDetailBO.getType(), ShopType.SELF_SHOP.value()); + } + } + return false; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserScoreOrderManager.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserScoreOrderManager.java new file mode 100644 index 0000000..ef1854d --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/manager/UserScoreOrderManager.java @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.manager; + +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.common.constant.ConfigNameConstant; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.order.constant.OrderType; +import com.tmerclub.cloud.common.order.vo.ShopCartItemDiscountVO; +import com.tmerclub.cloud.common.order.vo.ShopCartItemVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO; +import com.tmerclub.cloud.common.order.vo.ShopCartOrderVO; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.Arith; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.service.UserExtensionService; +import com.tmerclub.cloud.user.vo.ScoreCompleteConfigVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户订单积分抵扣优惠 + * + * @author FrozenWatermelon + * @date 2021/05/10 + */ +@Component +public class UserScoreOrderManager { + + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private UserExtensionService userExtensionService; + + + public void calculateScoreDiscount(ShopCartOrderMergerVO shopCartOrderMerger) { + Long userId = AuthUserContext.get().getUserId(); + UserExtension userExtension = userExtensionService.getByUserId(userId); + // 积分订单处理 + if (Objects.equals(shopCartOrderMerger.getOrderType(), OrderType.SCORE)) { + // 积分订单不需要处理积分抵扣, 直接返回 + shopCartOrderMerger.setUserHasScore(userExtension.getScore()); + return; + } + // 积分成长值设置 + String scoreConfigValue = configFeignClient.getConfig(ConfigNameConstant.SCORE_CONFIG).getData(); + ScoreCompleteConfigVO scoreParam = Json.parseObject(scoreConfigValue, ScoreCompleteConfigVO.class); + // 如果未开启积分抵扣,那么直接返回 + if (scoreParam.getShoppingScoreSwitch() != null && !scoreParam.getShoppingScoreSwitch()) { + return; + } + + // 用户可用积分 + Long userHasScore = userExtension.getScore(); + shopCartOrderMerger.setUserHasScore(userHasScore); + + // 用户使用积分 + Long usableScore = userExtension.getScore(); +// // 如果没有说明使用多少积分或要求使用的积分大于用户已有的积分,则自动使用全部用户已有积分 +// if (usableScore == null || usableScore > userHasScore) { +// usableScore = userHasScore; +// } + //如果是用户选择的积分数额,则用此积分数额 + if (shopCartOrderMerger.getUsableScore() != null && shopCartOrderMerger.getIsScorePay() == 1 && shopCartOrderMerger.getUsableScore() >= 0) { + usableScore = Math.min(shopCartOrderMerger.getUsableScore(), usableScore); + } else { + usableScore = 0L; + } + + // 购物积分抵现比例(x积分抵扣1元) + long shoppingUseScoreRatio = Objects.isNull(scoreParam.getShoppingUseScoreRatio()) ? 0L : scoreParam.getShoppingUseScoreRatio(); + if (shoppingUseScoreRatio == 0) { + return; + } + shopCartOrderMerger.setShoppingUseScoreRatio(shoppingUseScoreRatio); + + // 平台使用积分分类比例上限 + double useRatioLimit = Objects.isNull(scoreParam.getUseRatioLimit()) ? 0.0 : scoreParam.getUseRatioLimit(); + + // 最大可抵现金额 = ((订单实际金额 - 订单最小金额) * 使用积分分类比例上限) + long totalActualAmount = shopCartOrderMerger.getActualTotal() - shopCartOrderMerger.getTotalTransfee(); + // 积分最多抵现金额 + long orderMaxCanOffsetCashAmount = PriceUtil.divideByBankerRounding((long) Arith.mul(totalActualAmount, useRatioLimit), 100); + + // 计算用户可用积分 + long canUseScore = orderMaxCanOffsetCashAmount * shoppingUseScoreRatio / 100; + long maxScore = Math.min(userHasScore, canUseScore); + usableScore = Math.min(usableScore, canUseScore); + // 计算可抵扣金额,然后算使用积分,再用使用积分算抵扣金额 + double totalScoreAmount = Arith.div(Arith.mul(usableScore, 100), shoppingUseScoreRatio); + usableScore = PriceUtil.divideByBankerRounding((long) Arith.mul(totalScoreAmount, shoppingUseScoreRatio), 100); + orderMaxCanOffsetCashAmount = PriceUtil.doublerDivideByBankerRounding(Arith.mul(usableScore, 100), shoppingUseScoreRatio); + // 在极端积分比例情况下,最大可用积分和使用的积分有冲突 + long maxScoreAmount = PriceUtil.doublerDivideByBankerRounding(Arith.mul(maxScore, 100), shoppingUseScoreRatio); + maxScore = maxScoreAmount * shoppingUseScoreRatio / 100; + // 这里如果不使用最大可用积分,则后续的计算还需要乘以这个比例 + long scale = 100; + if (usableScore < canUseScore) { + // 应该是使用的积分和最大可用积分的比例,此时的最大可用积分是订单估计最大可用积分,而不是用户最大可用积分 + // 如果使用用户最大可用积分做比例就会有问题,所以这里直接用订单预计最大可用积分做比例 + scale = PriceUtil.doublerDivideByBankerRounding(Arith.mul(usableScore, 100), canUseScore); + } + calculatedAmount(shopCartOrderMerger, scoreParam, orderMaxCanOffsetCashAmount, scale, usableScore, maxScore); + } + + /** + * 重新计算分摊金额 + * + * @param shopCartOrderMerger 购物车信息 + * @param scoreParam 积分配置信息 + * @param orderMaxCanOffsetCashAmount 积分最多抵现金额 + * @param scale 比例 + * @param usableScore 用户使用积分 + * @param maxScore 最大可用积分 + */ + private void calculatedAmount(ShopCartOrderMergerVO shopCartOrderMerger, ScoreCompleteConfigVO scoreParam, + long orderMaxCanOffsetCashAmount, long scale, long usableScore, long maxScore) { + // 用户选择积分抵现,组装积分信息 + List shopCartOrders = shopCartOrderMerger.getShopCartOrders(); + long totalScoreReduce = 0; + double useDiscount = Objects.isNull(scoreParam.getUseRatioLimit()) ? 0.0 : scoreParam.getUseRatioLimit(); + long totalScore = 0; + // 通过for i找出最后一项,将计算偏差的1积分给最后的最大的一项 + long maxAmount = 0; + Long maxAmountSkuId = 0L; + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + maxAmountSkuId = shopCartItem.getActualTotal() > maxAmount ? shopCartItem.getSkuId() : maxAmountSkuId; + maxAmount = Math.max(shopCartItem.getActualTotal(), maxAmount); + } + } + } + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + long reduceSum = 0; + long shopScore = 0; + List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + for (ShopCartItemVO shopCartItem : shopCartItems) { + // 如果是金额最大的一项,直接跳过,最后在处理 + if (Objects.equals(shopCartItem.getSkuId(), maxAmountSkuId)) { + continue; + } + // 计算商品分摊的金额,需要乘以比例 + long scoreReduceProd = PriceUtil.divideByBankerRounding((long) Arith.mul(shopCartItem.getActualTotal(), useDiscount), 100); + + long useScore = PriceUtil.divideByBankerRounding(scoreReduceProd * scale * scoreParam.getShoppingUseScoreRatio(), 10000L); + scoreReduceProd = PriceUtil.doublerDivideByBankerRounding(Arith.mul(useScore, 100), scoreParam.getShoppingUseScoreRatio()); + // 如果大于可用上限则直接等于,接将剩余的抵扣金额全部赋予最后一个,积分和金额直接等于 使用的 - 已经抵扣的 + if (totalScoreReduce + scoreReduceProd > orderMaxCanOffsetCashAmount) { + // 减去当前总共的积分,减去店铺已分摊的积分 + useScore = usableScore - totalScore - shopScore; + scoreReduceProd = orderMaxCanOffsetCashAmount - totalScoreReduce; + } + + totalScoreReduce = totalScoreReduce + scoreReduceProd; + reduceSum = reduceSum + scoreReduceProd; + shopScore += useScore; + setShopCartItemInfo(shopCartOrderMerger, shopCartItem, useScore, scoreReduceProd); + } + } + // 设置店铺的实际总值、积分优惠金额和订单优惠金额 + shopCartOrder.setScoreReduce(reduceSum); + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() - reduceSum); + // 放入优惠金额 + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce() + reduceSum); + // 放入平台优惠金额 + long orderScoreReduce = Objects.isNull(shopCartOrder.getPlatformAmount()) ? reduceSum : shopCartOrder.getPlatformAmount() + reduceSum; + shopCartOrder.setPlatformAmount(orderScoreReduce); + totalScore += shopScore; + if (shopCartOrderMerger.getIsScorePay() != null && shopCartOrderMerger.getIsScorePay() == 1) { + shopCartOrder.setUseScore(shopScore); + } + } + // 处理最后一项 + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + for (ShopCartItemVO shopCartItem : shopCartItemDiscount.getShopCartItems()) { + // 如果不是金额最大的一项,直接跳过 + if (!Objects.equals(shopCartItem.getSkuId(), maxAmountSkuId)) { + continue; + } + // 减去当前总共的积分,减去店铺已分摊的积分 + long useScore = usableScore - totalScore; + long scoreReduceProd = orderMaxCanOffsetCashAmount - totalScoreReduce; + setShopCartItemInfo(shopCartOrderMerger, shopCartItem, useScore, scoreReduceProd); + // 设置店铺的实际总值、积分优惠金额和订单优惠金额 + shopCartOrder.setScoreReduce(shopCartOrder.getScoreReduce() + scoreReduceProd); + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() - scoreReduceProd); + // 放入优惠金额 + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce() + scoreReduceProd); + // 放入平台优惠金额,如果用户等级免自营店运费也要放进去 + long orderScoreReduce = Objects.isNull(shopCartOrder.getPlatformAmount()) ? scoreReduceProd : shopCartOrder.getPlatformAmount() + scoreReduceProd; + shopCartOrder.setPlatformAmount(orderScoreReduce); + if (shopCartOrderMerger.getIsScorePay() != null && shopCartOrderMerger.getIsScorePay() == 1) { + shopCartOrder.setUseScore(shopCartOrder.getUseScore() + useScore); + } + totalScoreReduce = totalScoreReduce + scoreReduceProd; + totalScore += useScore; + break; + } + } + } + setAmount(shopCartOrderMerger, scoreParam, maxScore, totalScoreReduce, totalScore); + } + + private static void setAmount(ShopCartOrderMergerVO shopCartOrderMerger, ScoreCompleteConfigVO scoreParam, long maxScore, long totalScoreReduce, long totalScore) { + // 设置订单的实际总值和订单优惠金额 + shopCartOrderMerger.setTotalScoreAmount(totalScoreReduce); + shopCartOrderMerger.setShoppingUseScoreRatio(scoreParam.getShoppingUseScoreRatio()); + shopCartOrderMerger.setTotalUsableScore(totalScore); + shopCartOrderMerger.setActualTotal(shopCartOrderMerger.getActualTotal() - totalScoreReduce); + shopCartOrderMerger.setOrderReduce(shopCartOrderMerger.getOrderReduce() + totalScoreReduce); + shopCartOrderMerger.setMaxUsableScore(maxScore); + } + + private void setShopCartItemInfo(ShopCartOrderMergerVO shopCartOrderMerger, ShopCartItemVO shopCartItem, long useScore, long scoreReduceProd) { + if (shopCartOrderMerger.getIsScorePay() != null && shopCartOrderMerger.getIsScorePay() == 1) { + long platformReduce = shopCartItem.getPlatformShareReduce() == null ? 0 : shopCartItem.getPlatformShareReduce(); + shopCartItem.setPlatformShareReduce(platformReduce + scoreReduceProd); + shopCartItem.setScoreReduce(scoreReduceProd); + shopCartItem.setScorePrice(useScore); + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - scoreReduceProd); + } + } + + /** + * 再次校验分摊金额 + * + * @param shopCartOrderMerger 购物车信息 + * @param scoreAmountInOrder 积分在订单中占优惠的比例 + * @param actualTotalReduce 实际上使用积分优惠 + * @param shoppingUseScoreRatio 购物积分抵现比例(x积分抵扣1元) + */ + private void verifyAmount(ShopCartOrderMergerVO shopCartOrderMerger, double scoreAmountInOrder, long actualTotalReduce, Long shoppingUseScoreRatio) { + List shopCartOrders = shopCartOrderMerger.getShopCartOrders(); + List allShopCartItem = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + List shopCartItemDiscounts = shopCartOrder.getShopCartItemDiscounts(); + for (ShopCartItemDiscountVO shopCartItemDiscount : shopCartItemDiscounts) { + List shopCartItems = shopCartItemDiscount.getShopCartItems(); + allShopCartItem.addAll(shopCartItems); + } + } + + // 订单项按金额从小到大 + allShopCartItem.sort(Comparator.comparingDouble(ShopCartItemVO::getActualTotal)); + + long discountAmount = 0L; + for (int i = 0; i < allShopCartItem.size(); i++) { + ShopCartItemVO shopCartItem = allShopCartItem.get(i); + long itemDiscount; + // 最后一项 + if (i == allShopCartItem.size() - 1) { + itemDiscount = actualTotalReduce - discountAmount; + // 如果分到最后一项的钱太多了,比订单项目金额都要多,订单项的分摊金额就当作订单项金额咯 + if (itemDiscount > shopCartItem.getActualTotal()) { + itemDiscount = shopCartItem.getActualTotal(); + } + } + // 非最后一项 + else { + itemDiscount = PriceUtil.divideByBankerRounding((long) Arith.mul(shopCartItem.getActualTotal(), scoreAmountInOrder), 100); + + } + Long useScore = PriceUtil.divideByBankerRounding((long) Arith.mul(shoppingUseScoreRatio, itemDiscount), 100); + // 非最后一项 这里金额重新计算了一遍,请勿随意修改顺序 + if (i != allShopCartItem.size() - 1) { + discountAmount += PriceUtil.doublerDivideByBankerRounding(Arith.mul(useScore, 100), shoppingUseScoreRatio); + } + + + shopCartItem.setScoreReduce(PriceUtil.doublerDivideByBankerRounding(Arith.mul(useScore, 100), shoppingUseScoreRatio)); + shopCartItem.setScorePrice(useScore); + shopCartItem.setActualTotal(shopCartItem.getActualTotal() - shopCartItem.getScoreReduce()); + shopCartItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce() + shopCartItem.getScoreReduce()); + } + Map> shopCartOrderMap = allShopCartItem.stream().collect(Collectors.groupingBy(ShopCartItemVO::getShopId)); + long totalScoreAmount = 0L; + for (ShopCartOrderVO shopCartOrder : shopCartOrders) { + List shopCartItems = shopCartOrderMap.get(shopCartOrder.getShopId()); + long scoreReduce = 0; + long useScore = 0; + + for (ShopCartItemVO shopCartItem : shopCartItems) { + scoreReduce += shopCartItem.getScoreReduce(); + useScore += shopCartItem.getScorePrice(); + } + shopCartOrder.setUseScore(useScore); + shopCartOrder.setScoreReduce(scoreReduce); + shopCartOrder.setActualTotal(shopCartOrder.getActualTotal() - scoreReduce); + long orderScoreReduce = Objects.isNull(shopCartOrder.getPlatformAmount()) ? scoreReduce : shopCartOrder.getPlatformAmount() + scoreReduce; + shopCartOrder.setPlatformAmount(orderScoreReduce); + shopCartOrder.setShopReduce(shopCartOrder.getShopReduce() + scoreReduce); + totalScoreAmount += scoreReduce; + } + shopCartOrderMerger.setTotalScoreAmount(totalScoreAmount); + shopCartOrderMerger.setOrderReduce(shopCartOrderMerger.getOrderReduce() + totalScoreAmount); + shopCartOrderMerger.setActualTotal(shopCartOrderMerger.getActualTotal() - totalScoreAmount); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/PopupRelateMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/PopupRelateMapper.java new file mode 100644 index 0000000..5bf645e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/PopupRelateMapper.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.PopupRelate; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 弹窗广告关联 + * @author TRACK + */ +public interface PopupRelateMapper { + + /** + * 根据弹窗广告关联id获取弹窗广告关联 + * @param popupId 弹窗广告id + * @return 弹窗广告关联 + */ + List getByPopupId(@Param("popupId") Long popupId); + + /** + * 批量保存 + * @param popupRelates 弹窗广告关联 + */ + void saveBatch(@Param("popupRelates") List popupRelates); + + /** + * 根据弹窗广告id删除弹窗广告关联 + * @param popupId id + */ + void deleteById(@Param("popupId") Long popupId); + + /** + * 根据弹窗广告关联id删除弹窗广告关联 + * @param relateIds + */ + void deleteByRelateIds(@Param("relateIds") List relateIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserAddrMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserAddrMapper.java new file mode 100644 index 0000000..d374d2b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserAddrMapper.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.tmerclub.cloud.user.model.UserAddr; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户地址 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +public interface UserAddrMapper { + + /** + * 获取用户地址列表 + * + * @param userId + * @return 用户地址列表 + */ + List list(@Param("userId") Long userId); + + /** + * 根据用户地址id获取用户地址 + * + * @param userId 用户id + * @param addrId 用户地址id + * @return 用户地址 + */ + UserAddrVO getByAddrId(@Param("addrId") Long addrId, @Param("userId") Long userId); + + /** + * 保存用户地址 + * + * @param userAddr 用户地址 + */ + void save(@Param("userAddr") UserAddr userAddr); + + /** + * 更新用户地址 + * + * @param userAddr 用户地址 + */ + void update(@Param("userAddr") UserAddr userAddr); + + /** + * 删除地址 + * + * @param addrId 地址id + * @param userId 用户id + */ + void deleteById(@Param("addrId") Long addrId, @Param("userId") Long userId); + + + /** + * 移除用户默认地址 + * + * @param userId + */ + void removeDefaultUserAddr(@Param("userId") Long userId); + + /** + * 用户地址的数量 + * + * @param userId 用户id + * @return 数量 + */ + int countByUserId(Long userId); + + /** + * 通过用户id获取默认地址 + * @param userId 用户id + * @return 默认地址 + */ + UserAddrVO getUserDefaultAddrByUserId(@Param("userId") Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserGrowthLogMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserGrowthLogMapper.java new file mode 100644 index 0000000..629ef17 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserGrowthLogMapper.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserGrowthLog; +import com.tmerclub.cloud.user.vo.UserGrowthLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户成长值记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserGrowthLogMapper { + + /** + * 获取用户成长值记录列表 + * @return 用户成长值记录列表 + */ + List list(); + + /** + * 根据用户成长值记录id获取用户成长值记录 + * + * @param logId 用户成长值记录id + * @return 用户成长值记录 + */ + UserGrowthLog getByLogId(@Param("logId") Long logId); + + /** + * 保存用户成长值记录 + * @param userGrowthLog 用户成长值记录 + */ + void save(@Param("userGrowthLog") UserGrowthLog userGrowthLog); + + /** + * 更新用户成长值记录 + * @param userGrowthLog 用户成长值记录 + */ + void update(@Param("userGrowthLog") UserGrowthLog userGrowthLog); + + /** + * 根据用户成长值记录id删除用户成长值记录 + * @param logId + */ + void deleteById(@Param("logId") Long logId); + + /** + * 批量保存成长值记录 + * @param userGrowthLogs + * @return + */ + int saveBatch(@Param("userGrowthLogs") List userGrowthLogs); + + /** + * 获取用户成长值记录列表 + * @param userId 用户id + * @return 用户成长值记录列表 + */ + List getPageByUserId(@Param("userId") Long userId); + + /** + * 删除用户成长值记录列表 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 根据业务id获取成长值日志 + * @param bizId 业务id + * @param ioType 1收入 0减少 + * @return 成长值变更日志 + */ + UserGrowthLog getByBizId(@Param("bizId") Long bizId, @Param("ioType") Integer ioType); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelLogMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelLogMapper.java new file mode 100644 index 0000000..e8be55b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelLogMapper.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.user.dto.UserLevelLogDTO; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.vo.UserLevelLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 用户等级记录 + * + * @author FrozenWatermelon + * @date 2021-05-14 11:04:52 + */ +public interface UserLevelLogMapper { + + /** + * 获取用户等级记录列表 + * @param userLevelLogDTO + * @return 用户等级记录列表 + */ + List pageBuyLevelLog(@Param("userLevelLogDTO") UserLevelLogDTO userLevelLogDTO); + + /** + * 根据用户等级记录id获取用户等级记录 + * + * @param levelLogId 用户等级记录id + * @return 用户等级记录 + */ + UserLevelLog getByLevelLogId(@Param("levelLogId") Long levelLogId); + + /** + * 保存用户等级记录 + * + * @param userLevelLog 用户等级记录 + */ + void save(@Param("userLevelLog") UserLevelLog userLevelLog); + + /** + * 更新用户等级记录 + * + * @param userLevelLog 用户等级记录 + */ + void update(@Param("userLevelLog") UserLevelLog userLevelLog); + + /** + * 根据用户等级记录id删除用户等级记录 + * + * @param levelLogId + */ + void deleteById(@Param("levelLogId") Long levelLogId); + + /** + * 更新为支付成功状态 + * + * @param levelLogId 日志id + * @param payId 支付id + * @param payType 支付类型 + * @return 影响行数 + */ + int updateToSuccess(@Param("levelLogId") Long levelLogId, @Param("payId") Long payId, @Param("payType") Integer payType); + + /** + * 批量保存用户等级变更日志 + * + * @param userLevelLogs 保存日志列表 + * @return 影响行数 + */ + int batchSaveUserLevelLogs(@Param("userLevelLogs") List userLevelLogs); + + /** + * 根据开始结束时间及支付状态,筛选用户 + * + * @param isPayed 是否支付 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 用户id列表 + */ + List listUserIdByEarliestRechargeTime(@Param("isPayed") Integer isPayed, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate); + + /** + * 获取用户最高的等级(普通会员) + * + * @param userId 用户id + * @return 用户等级 + */ + Integer getMaxLevelByUserId(@Param("userId") Long userId); + + /** + * 获取指定时间内的用户类型 + * @param userId + * @param createTime + * @return + */ + UserApiVO getUserTypeAtTime(@Param("userId") Long userId, @Param("createTime") Date createTime); + + + /** + * 删除用户等级记录 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 获取财务详情列表 + * @param financeDetailDTO + * @return + */ + List listFinanceDetail(@Param("financeDetailsParam") FinanceDetailDTO financeDetailDTO); + + /** + * 获取平台财务信息 + * @param startTime + * @param endTime + * @param paySysType + * @return + */ + ShopAccountDetailVO getPlatformAccountDetail(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("paySysType") Integer paySysType); + + /** + * 获取购买会员财务信息 + * @param startTime + * @param endTime + * @param paySysType + * @return + */ + List listPayInfo(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("paySysType") Integer paySysType); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelMapper.java new file mode 100644 index 0000000..08c6e1c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelMapper.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.dto.UserLevelDTO; +import com.tmerclub.cloud.user.model.UserLevel; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 会员等级表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserLevelMapper { + + /** + * 获取会员等级表列表 + * + * @param levelType 等级类型 + * @param level 等级 + * @return 会员等级表列表 + */ + List list(@Param("levelType") Integer levelType, @Param("level") Integer level); + + /** + * 根据会员等级表id获取会员等级表 + * + * @param userLevelId 会员等级表id + * @return 会员等级表 + */ + UserLevelVO getByUserLevelId(@Param("userLevelId") Long userLevelId); + + /** + * 根据会员等级表id查优惠券张数 + * @param userLevelId + * @return + */ + Integer countCouponsNumByUserLevelId(@Param("userLevelId") Long userLevelId); + + /** + * 保存会员等级表 + * + * @param userLevelDTO 会员等级表 + */ + void save(@Param("userLevel") UserLevelDTO userLevelDTO); + + /** + * 更新会员等级表 + * + * @param userLevelDTO 会员等级表 + */ + void update(@Param("userLevel") UserLevelDTO userLevelDTO); + + /** + * 根据会员等级表id删除会员等级表 + * + * @param id 会员等级表id + */ + void deleteByUserLevelId(@Param("id") Long id); + + /** + * 根据等级类型,获取最大的用户等级 + * + * @param levelType 等级类型 + * @return 最大的用户等级 + */ + Integer getUserMaxLevelByLevelType(@Param("levelType") Integer levelType); + + /** + * 更新会员等级状态 + * + * @param userLevelIds 等级id + */ + void updateStatusByUserLevelIds(@Param("userLevelIds") List userLevelIds); + + /** + * 根据等级类型,获取当前类型等级数量 + * + * @param levelType 类型 + * @return 数量 + */ + int countByLevelType(Integer levelType); + + /** + * 根据会员类型与会员等级获取会员等级数据 + * + * @param levelType 会员类型 + * @param level 会员等级 + * @return 会员等级数据 + */ + UserLevelVO getOneByTypeAndLevel(@Param("levelType") Integer levelType, @Param("level") Integer level); + + /** + * 获取每个等级相关优惠券列表 + * + * @param levelType 会员类型 + * @param level 等级 + * @return 会员等级数据列表 + */ + List listLevelCouponByLevelType(@Param("levelType") Integer levelType, @Param("level") Integer level); + + /** + * 获取等级列表, 等级包含等级关联的分类id列表 (普通会员等级) + * + * @param nowGrowth 所需成长值 + * @param level 等级 + * @return 等级列表 + */ + List selectList(@Param("nowGrowth") Integer nowGrowth, @Param("level") Integer level); + + /** + * 获取当前用户作为普通会员的等级 + * @param growth 用户当前成长值 + * @return + */ + int getUserNormalLevel(@Param("growth") Integer growth); + + /** + * 根据类型获取当前类型的最大等级 + * + * @param levelType 等级类型 + * @return 最大等级 + */ + int getMaxLevel(@Param("levelType") Integer levelType); + + /** + * 根据权益id列表,获取等级列表 + * + * @param rightsIds 权益id列表 + * @return 等级列表 + */ + List listByCouponIds(@Param("rightsIds") List rightsIds); + + /** + * 根据指定会员类型和等级名称获取会员等级数据 + * @param levelType + * @param levelName + * @return + */ + UserLevelVO getByLevelTypeAndLevelName(@Param("levelType") Integer levelType, @Param("levelName") String levelName); + + /** + * 获取正常状态的等级id列表 + * @param userLevelIds + * @return + */ + List listUserLevelIds(@Param("userLevelIds") List userLevelIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelRightsMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelRightsMapper.java new file mode 100644 index 0000000..6621dc3 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelRightsMapper.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserLevel; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 等级-权益关联信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserLevelRightsMapper { + + /** + * 批量保存等级-权益关联信息 + * + * @param userLevelId 会员等级Id + * @param rightIds 权益id + */ + void saveBatch(@Param("userLevelId") Long userLevelId, @Param("rightIds") List rightIds); + + /** + * 根据等级id删除等级-权益关联信息 + * + * @param userLevelId 会员等级Id + */ + void deleteByUserLevelId(@Param("userLevelId") Long userLevelId); + + /** + * 根据权益id删除关联 + * + * @param rightId 权益id + */ + void deleteByRightId(@Param("rightId") Long rightId); + + /** + * 根据权益id查出拥有此权益的会员等级id列表 + * @param rightId 权益id + * @return 会员等级id列表 + */ + List listUserLevelIdByRightId(@Param("rightId") Long rightId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelTermMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelTermMapper.java new file mode 100644 index 0000000..a2a74b0 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserLevelTermMapper.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserLevelTerm; +import com.tmerclub.cloud.user.vo.UserLevelTermVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public interface UserLevelTermMapper { + + /** + * 获取列表 + * + * @return 列表 + */ + List list(); + + /** + * 根据id获取 + * + * @param levelTermId id + * @return 等级期数 + */ + UserLevelTerm getByLevelTermId(@Param("levelTermId") Long levelTermId); + + /** + * 保存 + * + * @param userLevelTerm 等级期数 + */ + void save(@Param("userLevelTerm") UserLevelTerm userLevelTerm); + + /** + * 更新 + * + * @param userLevelTerm 等级期数 + */ + void update(@Param("userLevelTerm") UserLevelTerm userLevelTerm); + + /** + * 批量删除 + * + * @param userLevelTermIds 等级期数id列表 + */ + void deleteBatch(@Param("userLevelTermIds") List userLevelTermIds); + + /** + * 根据id删除 + * + * @param levelTermId 等级期数id + */ + void deleteById(@Param("levelTermId") Long levelTermId); + + /** + * 根据用户等级id获取等级期数表 + * + * @param userLevelId 户等级id + * @return 等级期数表 + */ + List getListByUserLevelId(@Param("userLevelId") Long userLevelId); + + /** + * 根据用户等级id查价格表 + * + * @param userLevelId 用户等级id + * @return 价格表 + */ + List getAmountAndTypeByUserLevelId(@Param("userLevelId") Long userLevelId); + + /** + * 根据用户等级id查月价格 + * + * @param userLevelId 用户等级id + * @return 月价格 + */ + Integer getMonthAmount(@Param("userLevelId") Long userLevelId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRechargeCouponMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRechargeCouponMapper.java new file mode 100644 index 0000000..09d97a8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRechargeCouponMapper.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserRechargeCoupon; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * 余额优惠券关联表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public interface UserRechargeCouponMapper { + + /** + * 获取余额优惠券关联表列表 + * + * @return 余额优惠券关联表列表 + */ + List list(); + + /** + * 根据余额优惠券关联表id获取余额优惠券关联表 + * + * @param rechargeId 余额优惠券关联表id + * @return 余额优惠券关联表 + */ + UserRechargeCoupon getByRechargeId(@Param("rechargeId") Long rechargeId); + + /** + * 保存余额优惠券关联表 + * + * @param userRechargeCoupon 余额优惠券关联表 + */ + void save(@Param("userRechargeCoupon") UserRechargeCoupon userRechargeCoupon); + + /** + * 更新余额优惠券关联表 + * + * @param userRechargeCoupon 余额优惠券关联表 + */ + void update(@Param("userRechargeCoupon") UserRechargeCoupon userRechargeCoupon); + + /** + * 根据余额优惠券关联表id删除余额优惠券关联表 + * + * @param rechargeId + */ + void deleteById(@Param("rechargeId") Long rechargeId); + + /** + * 批量保存充值赠送优惠券 + * + * @param userRechargeCouponList + */ + void saveBatch(@Param("userRechargeCouponList") List userRechargeCouponList); + + /** + * 删除充值表详情中的一些关联优惠券 + * + * @param rechargeId + * @param couponIdList + */ + void removeByRechargeIdAndCouponId(@Param("rechargeId") Long rechargeId, @Param("couponIdList") Set couponIdList); + + /** + * 修改充值表详情中的一些关联优惠券 + * + * @param rechargeId + * @param couponList + */ + void updateBatchByCoupons(@Param("rechargeId") Long rechargeId, @Param("couponList") List couponList); + + /** + * 根据优惠券id列表,获取充值模板id列表 + * + * @param couponIds + * @return 充值模板id列表 + */ + List listRechargeIdByCouponIds(@Param("couponIds") List couponIds); + + /** + * 根据优惠券id列表删除 + * + * @param couponIds 优惠券id列表 + */ + void removeByCouponIds(@Param("couponIds") List couponIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRightsMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRightsMapper.java new file mode 100644 index 0000000..f5077e4 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserRightsMapper.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.dto.UserRightsDTO; +import com.tmerclub.cloud.user.model.UserRights; +import com.tmerclub.cloud.user.vo.UserRightsVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户权益信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserRightsMapper { + + /** + * 获取用户权益信息列表 + * + * @param userRightsDTO 搜索参数 + * @return 用户权益信息列表 + */ + List list(@Param("userRights") UserRightsDTO userRightsDTO); + + /** + * 根据用户权益信息id获取用户权益信息 + * + * @param rightsId 用户权益信息id + * @return 用户权益信息 + */ + UserRightsVO getByRightsId(@Param("rightsId") Long rightsId); + + /** + * 保存用户权益信息 + * + * @param userRights 用户权益信息 + */ + void save(@Param("userRights") UserRights userRights); + + /** + * 更新用户权益信息 + * + * @param userRights 用户权益信息 + */ + void update(@Param("userRights") UserRights userRights); + + /** + * 根据用户权益信息id删除用户权益信息 + * + * @param rightsId + */ + void deleteById(@Param("rightsId") Long rightsId); + + /** + * 根据会员类型获取全部权益列表 + * + * @param levelType 会员类型 + * @return 权益列表 + */ + List listRightsByLevelType(@Param("levelType") Integer levelType); + + /** + * 根据会员信息获取权益信息 + * + * @param level + * @param levelType + * @return + */ + List listRightByLevel(@Param("level") Integer level, + @Param("levelType") Integer levelType); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreGetLogMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreGetLogMapper.java new file mode 100644 index 0000000..d638bf7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreGetLogMapper.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.user.model.UserScoreGetLog; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 用户积分获取记录 + * + * @author FrozenWatermelon + * @date 2021-05-17 17:17:14 + */ +public interface UserScoreGetLogMapper { + + /** + * 获取用户积分获取记录列表 + * + * @return 用户积分获取记录列表 + */ + List list(); + + /** + * 根据用户积分获取记录id获取用户积分获取记录 + * + * @param userScoreGetLogId 用户积分获取记录id + * @return 用户积分获取记录 + */ + UserScoreGetLog getByUserScoreGetLogId(@Param("userScoreGetLogId") Long userScoreGetLogId); + + /** + * 保存用户积分获取记录 + * + * @param userScoreGetLog 用户积分获取记录 + */ + void save(@Param("userScoreGetLog") UserScoreGetLog userScoreGetLog); + + /** + * 更新用户积分获取记录 + * + * @param userScoreGetLog 用户积分获取记录 + */ + void update(@Param("userScoreGetLog") UserScoreGetLog userScoreGetLog); + + /** + * 根据用户积分获取记录id删除用户积分获取记录 + * + * @param userScoreGetLogId + */ + void deleteById(@Param("userScoreGetLogId") Long userScoreGetLogId); + + /** + * 批量保存积分明细 + * + * @param userScoreGetLogs + * @return + */ + void saveBatch(@Param("userScoreGetLogs") List userScoreGetLogs); + + /** + * 根据用户id查询最近一条积分过期记录 + * @param userId 用户id + * @return 积分过期记录 + */ + UserScoreGetLog getLogByUserId(@Param("userId") Long userId); + + /** + * 删除用户积分记录 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 查询已经过期但还没标记的积分 + * @param userId 用户id + * @param expireTime 过期时间 + * @param status 状态 + * @return 用户积分记录列表 + */ + List listByUserIdAndExpireTimeAndStatus(@Param("userId") Long userId, @Param("expireTime") Date expireTime, @Param("status") Integer status); + + /** + * 更新用户积分记录 + * @param userScoreGetLogList 用户积分记录列表 + */ + void updateBatchById(@Param("userScoreGetLogList") List userScoreGetLogList); + + /** + * 查询用户可用积分 + * @param userId 用户id + * @param status 状态 + * @param current 开始搜索的索引 + * @param size 分页的大小 + * @return 用户可用积分 + */ + Long sumUsableScoreByPage(@Param("userId") Long userId, @Param("status") Integer status, @Param("current") Integer current, @Param("size") Integer size); + + /** + * 查询用户积分详细表数据 + * @param userId 用户id + * @param status 状态 + * @return 用户积分详细表数据 + */ + List listByCreateTime(@Param("userId") Long userId, @Param("status") Integer status); + + /** + * 查询用户积分记录列表 + * @param userId 用户id + * @param status 状态 + * @param current 开始搜索的索引 + * @param size 分页的大小 + * @return + */ + List listByCreateTimeAndPage(@Param("userId") Long userId, @Param("status") Integer status, @Param("current") Integer current, @Param("size") Integer size); + + /** + * 批量更新用户积分状态 + * + * @param status 状态 + * @param userScoreGetIds 用户积分ids + */ + void batchUpdateUserScoreGetStatus(@Param("status") Integer status, @Param("userScoreGetIds") List userScoreGetIds); + + /** + * 获取用户可用的积分明细 + * @param userIds 用户id集合 + * @param status 状态 ScoreGetLogStatusEnum + * @return 用户可用的积分明细 + */ + List batchListByCreateTime(@Param("userIds") List userIds, @Param("status") Integer status); + + /** + * 修改状态为0的积分明细为过期状态 + * @param expireTime 过期时间 + */ + void updateExpireScoreDetail(@Param("expireTime") DateTime expireTime); + + /** + * 修改状态为0的积分明细为过期状态 + * @param expireTime 过期时间 + * @return + */ + List listExpireScoreDetail(@Param("expireTime") DateTime expireTime); + + /** + * 根据订单id查询最近一条积分过期记录 + * + * @param bizId 订单id + * @return 积分过期记录 + */ + UserScoreGetLog getLogByBizId(@Param("bizId") Long bizId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreLogMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreLogMapper.java new file mode 100644 index 0000000..bfbd8be --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserScoreLogMapper.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserScoreLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户积分记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserScoreLogMapper { + + /** + * 获取保存到mongodb的积分记录 + * @param start + * @param size + * @return + */ + List listToMongodb(@Param("start") int start, @Param("size") int size); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserWithdrawCashMapper.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserWithdrawCashMapper.java new file mode 100644 index 0000000..c4734e6 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/mapper/UserWithdrawCashMapper.java @@ -0,0 +1,58 @@ +package com.tmerclub.cloud.user.mapper; + +import com.tmerclub.cloud.user.model.UserWithdrawCash; +import com.tmerclub.cloud.user.vo.UserWithdrawCashVO; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author gaozijie + * @date 2023-04-24 + */ +public interface UserWithdrawCashMapper { + + /** + * 新增 + * @param withdrawCash + */ + void save(@Param("withdrawCash") UserWithdrawCash withdrawCash); + + /** + * 更新 + * @param withdrawCash + */ + void update(@Param("withdrawCash") UserWithdrawCash withdrawCash); + + /** + * 通过orderNo获取提现记录 + * @param orderNo 订单号 + * @return + */ + UserWithdrawCash getByOrderNo(@Param("orderNo") String orderNo); + + /** + * 统计指定时间内提现次数 + * @param userId 用户id + * @param startTime 起始时间 + * @return + */ + Integer countWithdrawTimes(@Param("userId") Long userId, + @Param("startTime") LocalDateTime startTime); + + /** + * 获取用户提现总金额 + * @param userId + * @return + */ + BigDecimal getTotalWithdrawAmount(@Param("userId") Long userId); + + /** + * 获取用户提现记录 + * @param userId + * @return + */ + List listUserWithdrawCashVOList(@Param("userId") Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/CostPerPopup.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/CostPerPopup.java new file mode 100644 index 0000000..fdb3847 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/CostPerPopup.java @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 弹窗广告 + * @author TRACK + */ +public class CostPerPopup extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 弹窗广告id + */ + private Long popupId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 弹窗名称 + */ + private String popupName; + + /** + * 状态 1.未开始 2.投放中 3.已结束 + */ + private Integer status; + + /** + * 触发页面类型 1.平台首页 2.会员中心 3.支付成功 4.店铺首页 5.商品详情 + */ + private Integer pageType; + + /** + * 弹窗图片 + */ + private String popupPic; + + /** + * 跳转页面 + */ + private String jumpUrl; + + /** + * 推送用户类型 0.所有用户 1.免费会员 2.付费会员 3.店铺客户 + */ + private Integer userType; + + /** + * 推送开始时间 + */ + private Date startTime; + + /** + * 推送结束时间 + */ + private Date endTime; + + /** + * 推送频次 0.永久一次 1.每次进入 2.自定义频次 + */ + private Integer pushFrequency; + + /** + * 按x天推送 + */ + private Integer dayFrequency; + + /** + * 按周推送 eg. 1,2 代表周日,周一 + */ + private String weekFrequency; + + /** + * 关联商品id列表 + */ + private List spuIds; + + /** + * 关联会员等级id列表 + */ + private List userLevelIds; + + public Long getPopupId() { + return popupId; + } + + public void setPopupId(Long popupId) { + this.popupId = popupId; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getPopupName() { + return popupName; + } + + public void setPopupName(String popupName) { + this.popupName = popupName; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getPageType() { + return pageType; + } + + public void setPageType(Integer pageType) { + this.pageType = pageType; + } + + public String getPopupPic() { + return popupPic; + } + + public void setPopupPic(String popupPic) { + this.popupPic = popupPic; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getPushFrequency() { + return pushFrequency; + } + + public void setPushFrequency(Integer pushFrequency) { + this.pushFrequency = pushFrequency; + } + + public Integer getDayFrequency() { + return dayFrequency; + } + + public void setDayFrequency(Integer dayFrequency) { + this.dayFrequency = dayFrequency; + } + + public String getWeekFrequency() { + return weekFrequency; + } + + public void setWeekFrequency(String weekFrequency) { + this.weekFrequency = weekFrequency; + } + + public List getSpuIds() { + return spuIds; + } + + public void setSpuIds(List spuIds) { + this.spuIds = spuIds; + } + + public List getUserLevelIds() { + return userLevelIds; + } + + public void setUserLevelIds(List userLevelIds) { + this.userLevelIds = userLevelIds; + } + + @Override + public String toString() { + return "CostPerPopup{" + + "popupId=" + popupId + + ", shopId=" + shopId + + ", popupName='" + popupName + '\'' + + ", status=" + status + + ", pageType=" + pageType + + ", popupPic='" + popupPic + '\'' + + ", jumpUrl='" + jumpUrl + '\'' + + ", userType=" + userType + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", pushFrequency=" + pushFrequency + + ", dayFrequency=" + dayFrequency + + ", weekFrequency='" + weekFrequency + '\'' + + ", spuIds=" + spuIds + + ", userLevelIds=" + userLevelIds + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/PopupRelate.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/PopupRelate.java new file mode 100644 index 0000000..f07d6e7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/PopupRelate.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +/** + * 弹窗广告关联 + * @author TRACK + */ +public class PopupRelate extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * 关联id + */ + private Long relateId; + + /** + * 弹窗广告id + */ + private Long popupId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 会员等级id + */ + private Long userLevelId; + + public PopupRelate() { + } + + public PopupRelate(Long popupId, Long spuId, Long userLevelId) { + this.popupId = popupId; + this.spuId = spuId; + this.userLevelId = userLevelId; + } + + public Long getRelateId() { + return relateId; + } + + public void setRelateId(Long relateId) { + this.relateId = relateId; + } + + public Long getPopupId() { + return popupId; + } + + public void setPopupId(Long popupId) { + this.popupId = popupId; + } + + public Long getSpuId() { + return spuId; + } + + public void setSpuId(Long spuId) { + this.spuId = spuId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + @Override + public String toString() { + return "PopupRelate{" + + "relateId=" + relateId + + ",popupId=" + popupId + + ",spuId=" + spuId + + ",userLevelId=" + userLevelId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserAddr.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserAddr.java new file mode 100644 index 0000000..6c2e4bf --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserAddr.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户地址 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +public class UserAddr extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + public static final Integer DEFAULT_ADDR = 1; + public static final Integer NOT_DEFAULT_ADDR = 0; + + /** + * ID + */ + private Long addrId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 手机 + */ + private String mobile; + + /** + * 是否默认地址 1是 + */ + private Integer isDefault; + + /** + * 收货人 + */ + private String consignee; + + /** + * 省ID + */ + private Long provinceId; + + /** + * 省 + */ + private String province; + + /** + * 城市ID + */ + private Long cityId; + + /** + * 城市 + */ + private String city; + + /** + * 区ID + */ + private Long areaId; + + /** + * 区 + */ + private String area; + + /** + * 邮编 + */ + private String postCode; + + /** + * 地址 + */ + private String addr; + + /** + * 经度 + */ + private Double lng; + + /** + * 纬度 + */ + private Double lat; + + public Long getAddrId() { + return addrId; + } + + public void setAddrId(Long addrId) { + this.addrId = addrId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public Integer getIsDefault() { + return isDefault; + } + + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + public String getConsignee() { + return consignee; + } + + public void setConsignee(String consignee) { + this.consignee = consignee; + } + + public Long getProvinceId() { + return provinceId; + } + + public void setProvinceId(Long provinceId) { + this.provinceId = provinceId; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public Long getCityId() { + return cityId; + } + + public void setCityId(Long cityId) { + this.cityId = cityId; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public Long getAreaId() { + return areaId; + } + + public void setAreaId(Long areaId) { + this.areaId = areaId; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + @Override + public String toString() { + return "UserAddr{" + + "addrId=" + addrId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",mobile=" + mobile + + ",isDefault=" + isDefault + + ",consignee=" + consignee + + ",provinceId=" + provinceId + + ",province=" + province + + ",cityId=" + cityId + + ",city=" + city + + ",areaId=" + areaId + + ",area=" + area + + ",postCode=" + postCode + + ",addr=" + addr + + ",lng=" + lng + + ",lat=" + lat + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserExtension.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserExtension.java new file mode 100644 index 0000000..f00f986 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserExtension.java @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户扩展信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserExtension extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * + */ + private Long userExtensionId; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户等级 + */ + private Integer level; + + /** + * 等级条件 0 普通会员 1 付费会员 + */ + private Integer levelType; + + /** + * 用户当前成长值 + */ + private Integer growth; + + /** + * 用户积分 + */ + private Long score; + + /** + * 用户总余额 + */ + private Long balance; + + /** + * 用户实际余额 + */ + private Long actualBalance; + + /** + * 通联累计余额 + */ + private Long allinpayBalance; + + /** + * 通联实际余额 + */ + private Long allinpayActualBalance; + + /** + * 通联会员创建(0:否 1:是) + */ + private Integer allinpayCreate; + + /** + * 通联实名认证(0:否 1:是) + */ + private Integer allinpayRealNameSet; + + /** + * 通联手机绑定(0:否 1:是) + */ + private Integer allinpayPhoneBind; + + /** + * 通联支付密码设置(0:否 1:是) + */ + private Integer allinpayPayPwdSet; + + /** + * 通联提现协议签约(0:否 1:是) + */ + private Integer allinpayProtocolSign; + + /** + * 通联支付账户绑定(0:否 1:是) + */ + private Integer allinpayPayAcctBind; + + /** + * 乐观锁 + */ + private Integer version; + + /** + * 连续签到天数 + */ + private Integer signDay; + + /** + * 用户付费会员等级 + */ + private Integer vipLevel; + + public Long getUserExtensionId() { + return userExtensionId; + } + + public void setUserExtensionId(Long userExtensionId) { + this.userExtensionId = userExtensionId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getGrowth() { + return growth; + } + + public void setGrowth(Integer growth) { + this.growth = growth; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Long getActualBalance() { + return actualBalance; + } + + public void setActualBalance(Long actualBalance) { + this.actualBalance = actualBalance; + } + + public Long getAllinpayBalance() { + return allinpayBalance; + } + + public void setAllinpayBalance(Long allinpayBalance) { + this.allinpayBalance = allinpayBalance; + } + + public Long getAllinpayActualBalance() { + return allinpayActualBalance; + } + + public void setAllinpayActualBalance(Long allinpayActualBalance) { + this.allinpayActualBalance = allinpayActualBalance; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public Integer getSignDay() { + return signDay; + } + + public void setSignDay(Integer signDay) { + this.signDay = signDay; + } + + public Integer getVipLevel() { + return vipLevel; + } + + public void setVipLevel(Integer vipLevel) { + this.vipLevel = vipLevel; + } + + public Integer getAllinpayCreate() { + return allinpayCreate; + } + + public void setAllinpayCreate(Integer allinpayCreate) { + this.allinpayCreate = allinpayCreate; + } + + public Integer getAllinpayRealNameSet() { + return allinpayRealNameSet; + } + + public void setAllinpayRealNameSet(Integer allinpayRealNameSet) { + this.allinpayRealNameSet = allinpayRealNameSet; + } + + public Integer getAllinpayPhoneBind() { + return allinpayPhoneBind; + } + + public void setAllinpayPhoneBind(Integer allinpayPhoneBind) { + this.allinpayPhoneBind = allinpayPhoneBind; + } + + public Integer getAllinpayPayPwdSet() { + return allinpayPayPwdSet; + } + + public void setAllinpayPayPwdSet(Integer allinpayPayPwdSet) { + this.allinpayPayPwdSet = allinpayPayPwdSet; + } + + public Integer getAllinpayProtocolSign() { + return allinpayProtocolSign; + } + + public void setAllinpayProtocolSign(Integer allinpayProtocolSign) { + this.allinpayProtocolSign = allinpayProtocolSign; + } + + public Integer getAllinpayPayAcctBind() { + return allinpayPayAcctBind; + } + + public void setAllinpayPayAcctBind(Integer allinpayPayAcctBind) { + this.allinpayPayAcctBind = allinpayPayAcctBind; + } + + @Override + public String toString() { + return "UserExtension{" + + "userExtensionId=" + userExtensionId + + ", userId=" + userId + + ", level=" + level + + ", levelType=" + levelType + + ", growth=" + growth + + ", score=" + score + + ", balance=" + balance + + ", actualBalance=" + actualBalance + + ", allinpayBalance=" + allinpayBalance + + ", allinpayActualBalance=" + allinpayActualBalance + + ", allinpayRealNameSet=" + allinpayRealNameSet + + ", allinpayPhoneBind=" + allinpayPhoneBind + + ", allinpayPayPwdSet=" + allinpayPayPwdSet + + ", allinpayProtocolSign=" + allinpayProtocolSign + + ", allinpayPayAcctBind=" + allinpayPayAcctBind + + ", version=" + version + + ", signDay=" + signDay + + ", vipLevel=" + vipLevel + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevel.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevel.java new file mode 100644 index 0000000..5e452d3 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevel.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 会员等级表 + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevel extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long userLevelId; + + /** + * 等级 + */ + private Integer level; + + /** + * 等级名称 + */ + private String levelName; + + /** + * 等级类型 0:普通会员 1:付费会员 + */ + private Integer levelType; + + /** + * 所需成长值 + */ + private Integer needGrowth; + + /** + * 1:已更新 0:等待更新(等级修改后,用户等级的更新) + */ + private Integer updateStatus; + + /** + * 付费会员,是否可以招募会员;1可以招募,0停止招募 + */ + private Integer recruitStatus; + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public Integer getNeedGrowth() { + return needGrowth; + } + + public void setNeedGrowth(Integer needGrowth) { + this.needGrowth = needGrowth; + } + + public Integer getUpdateStatus() { + return updateStatus; + } + + public void setUpdateStatus(Integer updateStatus) { + this.updateStatus = updateStatus; + } + + public Integer getRecruitStatus() { + return recruitStatus; + } + + public void setRecruitStatus(Integer recruitStatus) { + this.recruitStatus = recruitStatus; + } + + @Override + public String toString() { + return "UserLevel{" + + "userLevelId=" + userLevelId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",level=" + level + + ",levelName=" + levelName + + ",levelType=" + levelType + + ",needGrowth=" + needGrowth + + ",updateStatus=" + updateStatus + + ",recruitStatus=" + recruitStatus + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelRights.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelRights.java new file mode 100644 index 0000000..5bbea5b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelRights.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 等级-权益关联信息 + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelRights extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 等级-权益关联id + */ + private Long levelRightsId; + + /** + * 等级id + */ + private Long userLevelId; + + /** + * 权益id + */ + private Long rightsId; + + public Long getLevelRightsId() { + return levelRightsId; + } + + public void setLevelRightsId(Long levelRightsId) { + this.levelRightsId = levelRightsId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + @Override + public String toString() { + return "UserLevelRights{" + + "levelRightsId=" + levelRightsId + + ",createTime=" + createTime + + ",userLevelId=" + userLevelId + + ",rightsId=" + rightsId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelTerm.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelTerm.java new file mode 100644 index 0000000..9d3809f --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserLevelTerm.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelTerm extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Long levelTermId; + + /** + * 等级id + */ + private Long userLevelId; + + /** + * 期数类型(0:月,1:季,2:年) + */ + private Integer termType; + + /** + * 价格 + */ + private Long needAmount; + + /** + * 状态(0: 禁用1: 启用) + */ + private Integer status; + + public Long getLevelTermId() { + return levelTermId; + } + + public void setLevelTermId(Long levelTermId) { + this.levelTermId = levelTermId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Integer getTermType() { + return termType; + } + + public void setTermType(Integer termType) { + this.termType = termType; + } + + public Long getNeedAmount() { + return needAmount; + } + + public void setNeedAmount(Long needAmount) { + this.needAmount = needAmount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "UserLevelTerm{" + + "levelTermId=" + levelTermId + + ",createTime=" + createTime + + ",userLevelId=" + userLevelId + + ",termType=" + termType + + ",needAmount=" + needAmount + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRechargeCoupon.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRechargeCoupon.java new file mode 100644 index 0000000..b909d63 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRechargeCoupon.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 余额优惠券关联表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserRechargeCoupon extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 充值id + */ + private Long rechargeId; + + /** + * 优惠券id + */ + private Long couponId; + + /** + * 优惠券数量 + */ + private Integer couponNum; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Integer getCouponNum() { + return couponNum; + } + + public void setCouponNum(Integer couponNum) { + this.couponNum = couponNum; + } + + @Override + public String toString() { + return "UserRechargeCoupon{" + + "rechargeId=" + rechargeId + + ",couponId=" + couponId + + ",createTime=" + createTime + + ",couponNum=" + couponNum + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRightsCoupon.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRightsCoupon.java new file mode 100644 index 0000000..4370bd8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserRightsCoupon.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserRightsCoupon extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 权益优惠券关联id + */ + private Long rightsCouponId; + + /** + * 权益id + */ + private Long rightsId; + + /** + * 优惠券id + */ + private Long couponId; + + public Long getRightsCouponId() { + return rightsCouponId; + } + + public void setRightsCouponId(Long rightsCouponId) { + this.rightsCouponId = rightsCouponId; + } + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + @Override + public String toString() { + return "UserRightsCoupon{" + + "rightsCouponId=" + rightsCouponId + + ",createTime=" + createTime + + ",rightsId=" + rightsId + + ",couponId=" + couponId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreGetLog.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreGetLog.java new file mode 100644 index 0000000..536ede1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserScoreGetLog.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户积分获取记录 + * + * @author FrozenWatermelon + * @date 2021-05-17 17:17:14 + */ +public class UserScoreGetLog extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 积分明细表 + */ + private Long userScoreGetLogId; + + /** + * 用户id + */ + private Long userId; + + /** + * 可用积分 + */ + private Long usableScore; + + /** + * 业务id + */ + private String bizId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 状态 -1过期 0订单抵现 1正常 + */ + private Integer status; + + public Long getUserScoreGetLogId() { + return userScoreGetLogId; + } + + public void setUserScoreGetLogId(Long userScoreGetLogId) { + this.userScoreGetLogId = userScoreGetLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getUsableScore() { + return usableScore; + } + + public void setUsableScore(Long usableScore) { + this.usableScore = usableScore; + } + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "UserScoreGetLog{" + + "userScoreGetLogId=" + userScoreGetLogId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",usableScore=" + usableScore + + ",bizId=" + bizId + + ",expireTime=" + expireTime + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserTag.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserTag.java new file mode 100644 index 0000000..6e6f9e3 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserTag.java @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 客户标签 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserTag extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 自增id + */ + private Long userTagId; + + /** + * 标签名字 + */ + private String tagName; + + /** + * 标签类型0手动1条件2系统 + */ + private Integer tagType; + + /** + * 系统标签是否开启 + */ + private Integer isSysTurnOn; + + /** + * 成为客户开始时间 + */ + private Date registerMinTime; + + /** + * 成为客户结束时间 + */ + private Date registerMaxTime; + + /** + * 关注开始时间 + */ + private Date subscribeMinTime; + + /** + * 关注结束时间 + */ + private Date subscribeMaxTime; + + /** + * 成为会员开始时间 + */ + private Date toBeMemberMinTime; + + /** + * 成为会员结束时间 + */ + private Date toBeMemberMaxTime; + + /** + * 最近消费时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天) + */ + private Integer recentPurchaseTime; + + /** + * 消费次数时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天) + */ + private Integer purchaseNumTime; + + /** + * 消费次数最小次数 + */ + private Long purchaseNumMinNum; + + /** + * 消费次数最大次数 + */ + private Long purchaseNumMaxNum; + + /** + * 消费金额时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天) + */ + private Integer purchaseAmountTime; + + /** + * 消费金额最小金额 + */ + private Long purchaseAmountMinAmount; + + /** + * 消费金额最大金额 + */ + private Long purchaseAmountMaxAmount; + + /** + * 订单均价时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天) + */ + private Integer orderAveragePriceTime; + + /** + * 订单均价最小金额 + */ + private Long orderAveragePriceMinAmount; + + /** + * 订单均价最大金额 + */ + private Long orderAveragePriceMaxAmount; + + /** + * 充值金额时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天) + */ + private Integer rechargeAmountTime; + + /** + * 充值金额最小金额 + */ + private Long rechargeAmountMinAmount; + + /** + * 充值金额最大金额 + */ + private Long rechargeAmountMaxAmount; + + /** + * 充值次数时间范围0(不限)1(今天)2(最近7天)3(最近15天)4(最近30天)5(最近45天)6(最近60天)7(最近90天)8(最近180天) + */ + private Integer rechargeNumTime; + + /** + * 充值次数最小次数 + */ + private Long rechargeNumMinNum; + + /** + * 充值次数最大次数 + */ + private Long rechargeNumMaxNum; + + /** + * 符合标签的人数 + */ + private Long userNum; + + /** + * 统计更新时间 + */ + private Date statisticUpdateTime; + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public String getTagName() { + return tagName; + } + + public void setTagName(String tagName) { + this.tagName = tagName; + } + + public Integer getTagType() { + return tagType; + } + + public void setTagType(Integer tagType) { + this.tagType = tagType; + } + + public Integer getIsSysTurnOn() { + return isSysTurnOn; + } + + public void setIsSysTurnOn(Integer isSysTurnOn) { + this.isSysTurnOn = isSysTurnOn; + } + + public Date getRegisterMinTime() { + return registerMinTime; + } + + public void setRegisterMinTime(Date registerMinTime) { + this.registerMinTime = registerMinTime; + } + + public Date getRegisterMaxTime() { + return registerMaxTime; + } + + public void setRegisterMaxTime(Date registerMaxTime) { + this.registerMaxTime = registerMaxTime; + } + + public Date getSubscribeMinTime() { + return subscribeMinTime; + } + + public void setSubscribeMinTime(Date subscribeMinTime) { + this.subscribeMinTime = subscribeMinTime; + } + + public Date getSubscribeMaxTime() { + return subscribeMaxTime; + } + + public void setSubscribeMaxTime(Date subscribeMaxTime) { + this.subscribeMaxTime = subscribeMaxTime; + } + + public Date getToBeMemberMinTime() { + return toBeMemberMinTime; + } + + public void setToBeMemberMinTime(Date toBeMemberMinTime) { + this.toBeMemberMinTime = toBeMemberMinTime; + } + + public Date getToBeMemberMaxTime() { + return toBeMemberMaxTime; + } + + public void setToBeMemberMaxTime(Date toBeMemberMaxTime) { + this.toBeMemberMaxTime = toBeMemberMaxTime; + } + + public Integer getRecentPurchaseTime() { + return recentPurchaseTime; + } + + public void setRecentPurchaseTime(Integer recentPurchaseTime) { + this.recentPurchaseTime = recentPurchaseTime; + } + + public Integer getPurchaseNumTime() { + return purchaseNumTime; + } + + public void setPurchaseNumTime(Integer purchaseNumTime) { + this.purchaseNumTime = purchaseNumTime; + } + + public Long getPurchaseNumMinNum() { + return purchaseNumMinNum; + } + + public void setPurchaseNumMinNum(Long purchaseNumMinNum) { + this.purchaseNumMinNum = purchaseNumMinNum; + } + + public Long getPurchaseNumMaxNum() { + return purchaseNumMaxNum; + } + + public void setPurchaseNumMaxNum(Long purchaseNumMaxNum) { + this.purchaseNumMaxNum = purchaseNumMaxNum; + } + + public Integer getPurchaseAmountTime() { + return purchaseAmountTime; + } + + public void setPurchaseAmountTime(Integer purchaseAmountTime) { + this.purchaseAmountTime = purchaseAmountTime; + } + + public Long getPurchaseAmountMinAmount() { + return purchaseAmountMinAmount; + } + + public void setPurchaseAmountMinAmount(Long purchaseAmountMinAmount) { + this.purchaseAmountMinAmount = purchaseAmountMinAmount; + } + + public Long getPurchaseAmountMaxAmount() { + return purchaseAmountMaxAmount; + } + + public void setPurchaseAmountMaxAmount(Long purchaseAmountMaxAmount) { + this.purchaseAmountMaxAmount = purchaseAmountMaxAmount; + } + + public Integer getOrderAveragePriceTime() { + return orderAveragePriceTime; + } + + public void setOrderAveragePriceTime(Integer orderAveragePriceTime) { + this.orderAveragePriceTime = orderAveragePriceTime; + } + + public Long getOrderAveragePriceMinAmount() { + return orderAveragePriceMinAmount; + } + + public void setOrderAveragePriceMinAmount(Long orderAveragePriceMinAmount) { + this.orderAveragePriceMinAmount = orderAveragePriceMinAmount; + } + + public Long getOrderAveragePriceMaxAmount() { + return orderAveragePriceMaxAmount; + } + + public void setOrderAveragePriceMaxAmount(Long orderAveragePriceMaxAmount) { + this.orderAveragePriceMaxAmount = orderAveragePriceMaxAmount; + } + + public Integer getRechargeAmountTime() { + return rechargeAmountTime; + } + + public void setRechargeAmountTime(Integer rechargeAmountTime) { + this.rechargeAmountTime = rechargeAmountTime; + } + + public Long getRechargeAmountMinAmount() { + return rechargeAmountMinAmount; + } + + public void setRechargeAmountMinAmount(Long rechargeAmountMinAmount) { + this.rechargeAmountMinAmount = rechargeAmountMinAmount; + } + + public Long getRechargeAmountMaxAmount() { + return rechargeAmountMaxAmount; + } + + public void setRechargeAmountMaxAmount(Long rechargeAmountMaxAmount) { + this.rechargeAmountMaxAmount = rechargeAmountMaxAmount; + } + + public Integer getRechargeNumTime() { + return rechargeNumTime; + } + + public void setRechargeNumTime(Integer rechargeNumTime) { + this.rechargeNumTime = rechargeNumTime; + } + + public Long getRechargeNumMinNum() { + return rechargeNumMinNum; + } + + public void setRechargeNumMinNum(Long rechargeNumMinNum) { + this.rechargeNumMinNum = rechargeNumMinNum; + } + + public Long getRechargeNumMaxNum() { + return rechargeNumMaxNum; + } + + public void setRechargeNumMaxNum(Long rechargeNumMaxNum) { + this.rechargeNumMaxNum = rechargeNumMaxNum; + } + + public Long getUserNum() { + return userNum; + } + + public void setUserNum(Long userNum) { + this.userNum = userNum; + } + + public Date getStatisticUpdateTime() { + return statisticUpdateTime; + } + + public void setStatisticUpdateTime(Date statisticUpdateTime) { + this.statisticUpdateTime = statisticUpdateTime; + } + + @Override + public String toString() { + return "UserTag{" + + "userTagId=" + userTagId + + ", tagName='" + tagName + '\'' + + ", tagType=" + tagType + + ", isSysTurnOn=" + isSysTurnOn + + ", registerMaxTime=" + registerMaxTime + + ", registerMinTime=" + registerMinTime + + ", subscribeMinTime=" + subscribeMinTime + + ", subscribeMaxTime=" + subscribeMaxTime + + ", toBeMemberMaxTime=" + toBeMemberMaxTime + + ", toBeMemberMinTime=" + toBeMemberMinTime + + ", recentPurchaseTime=" + recentPurchaseTime + + ", purchaseNumTime=" + purchaseNumTime + + ", purchaseNumMinNum=" + purchaseNumMinNum + + ", purchaseNumMaxNum=" + purchaseNumMaxNum + + ", purchaseAmountTime=" + purchaseAmountTime + + ", purchaseAmountMinAmount=" + purchaseAmountMinAmount + + ", purchaseAmountMaxAmount=" + purchaseAmountMaxAmount + + ", orderAveragePriceTime=" + orderAveragePriceTime + + ", orderAveragePriceMinAmount=" + orderAveragePriceMinAmount + + ", orderAveragePriceMaxAmount=" + orderAveragePriceMaxAmount + + ", rechargeAmountTime=" + rechargeAmountTime + + ", rechargeAmountMinAmount=" + rechargeAmountMinAmount + + ", rechargeAmountMaxAmount=" + rechargeAmountMaxAmount + + ", rechargeNumTime=" + rechargeNumTime + + ", rechargeNumMinNum=" + rechargeNumMinNum + + ", rechargeNumMaxNum=" + rechargeNumMaxNum + + ", userNum=" + userNum + + ", statisticUpdateTime=" + statisticUpdateTime + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserTagUser.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserTagUser.java new file mode 100644 index 0000000..ddff0cf --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/model/UserTagUser.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.model; + +import com.tmerclub.cloud.common.model.BaseModel; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 用户和标签关联表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserTagUser extends BaseModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 自增id + */ + private Long userTagUserId; + + /** + * 标签id + */ + private Long userTagId; + + /** + * 用户id + */ + private Long userId; + + public Long getUserTagUserId() { + return userTagUserId; + } + + public void setUserTagUserId(Long userTagUserId) { + this.userTagUserId = userTagUserId; + } + + public Long getUserTagId() { + return userTagId; + } + + public void setUserTagId(Long userTagId) { + this.userTagId = userTagId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "UserTagUser{" + + "userTagUserId=" + userTagUserId + + ",createTime=" + createTime + + ",userTagId=" + userTagId + + ",userId=" + userId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/PopupRelateService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/PopupRelateService.java new file mode 100644 index 0000000..2a89900 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/PopupRelateService.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.user.model.PopupRelate; + +import java.util.List; + +/** + * 弹窗广告关联 + * @author TRACK + */ +public interface PopupRelateService { + + /** + * 根据弹窗广告id获取弹窗广告关联 + * + * @param popupId 弹窗广告id + * @return 弹窗广告关联 + */ + List getByPopupId(Long popupId); + + /** + * 批量保存 + * @param popupRelates 弹窗广告关联 + */ + void saveBatch(List popupRelates); + + /** + * 批量更新 + * @param popupId + * @param popupRelates + */ + void updateBatch(Long popupId, List popupRelates); + + /** + * 根据弹窗广告id删除弹窗广告关联 + * @param popupId 弹窗广告id + */ + void deleteById(Long popupId); + + /** + * 根据弹窗广告关联id删除弹窗广告关联 + * @param relateIds 弹窗广告关联id + */ + void deleteByRelateIds(List relateIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/ShopCustomerService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/ShopCustomerService.java new file mode 100644 index 0000000..c6e92eb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/ShopCustomerService.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.user.dto.ShopCustomerReqDTO; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.user.dto.ShopCustomerDTO; +import com.tmerclub.cloud.user.model.ShopCustomer; + +import java.util.List; + +/** + * @author FrozenWatermelon + * @date 2023-01-15 15:53:16 + */ +public interface ShopCustomerService { + /** + * 批量添加客户 + * + * @param shopCustomers + */ + void saveBatch(List shopCustomers); + + /** + * 根据条件获取客户列表 + * + * @param shopCustomerDTO + * @return + */ + List listByParam(ShopCustomerDTO shopCustomerDTO); + + + /** + * 批量插入店铺会员 + * @param shopCustomerReqList + */ + void saveBatchByOrders(List shopCustomerReqList); + + /** + * 获取用户是否为店铺客户 + * @param shopId + * @param userId + * @return + */ + Integer getIsShopCustomer(Long shopId, Long userId); + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/ThirdApiAbutmenService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/ThirdApiAbutmenService.java new file mode 100644 index 0000000..5254a96 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/ThirdApiAbutmenService.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + + +import com.tmerclub.cloud.api.auth.dto.ThirdApiAbutmentUserDto; + +/** + * @author xxw + * @version 1.0 + * @description: 第三方接口对接 + * @since 2023/12/18 15:02 + */ +public interface ThirdApiAbutmenService { + + /** + * 注册用户 + * @param thirdApiAbutmentUserDto + */ + void regiserUser(ThirdApiAbutmentUserDto thirdApiAbutmentUserDto); + + /** + * 更新用户 + * @param thirdApiAbutmentUserDto + */ + void updateUser(ThirdApiAbutmentUserDto thirdApiAbutmentUserDto); + + + /** + * 禁用用户 + * @param userId + */ + void disableUser(Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserAddrService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserAddrService.java new file mode 100644 index 0000000..a48c7e7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserAddrService.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.tmerclub.cloud.user.model.UserAddr; + +import java.util.List; + +/** + * 用户地址 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +public interface UserAddrService { + + /** + * 获取用户地址列表 + * @return 用户地址列表数据 + * @param userId + */ + List list(Long userId); + + /** + * 保存用户地址 + * @param userAddr 用户地址 + */ + void save(UserAddr userAddr); + + /** + * 更新用户地址 + * @param userAddr 用户地址 + */ + void update(UserAddr userAddr); + + /** + * 删除地址 + * @param addrId 地址id + * @param userId 用户id + */ + void deleteUserAddrByUserId(Long addrId, Long userId); + + /** + * 根据用户地址id和用户id获取用户地址信息 + * @param addrId 地址id + * @param userId 用户id + * @return 用户地址信息 + */ + UserAddrVO getUserAddrByUserId(Long addrId, Long userId); + + /** + * 用户地址的数量 + * @param userId 用户id + * @return 数量 + */ + int countByUserId(Long userId); + + + /** + * 移除用户默认地址的缓存 + * @param userId 用户id + */ + void removeUserDefaultAddrCacheByUserId(Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserBalanceLogService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserBalanceLogService.java new file mode 100644 index 0000000..6db653c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserBalanceLogService.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.user.bo.BalanceRefundBO; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.vo.UserBalanceLogVO; + +import java.util.Date; +import java.util.List; + +/** + * 余额记录 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public interface UserBalanceLogService { + + /** + * 保存到mongodb + * @param mongoUserBalanceLogBO + */ + void saveToMongdb(MongoUserBalanceLogBO mongoUserBalanceLogBO); + + /** + * 批量保存到mongodb + * @param list + */ + void saveBatchToMongodb(List list); + + /** + * 根据余额记录id获取余额记录 + * + * @param balanceLogId 余额记录id + * @return 余额记录 + */ + MongoUserBalanceLogBO getByBalanceLogId(Long balanceLogId); + + /** + * 分页查询某个用户的余额明细 + * + * @param pageDTO + * @param userId + * @return + */ + PageVO getPageByUserId(PageDTO pageDTO, Long userId); + + /** + * 通过支付单号获取余额记录 + * + * @param payId 支付单号 + * @return 余额记录 + */ + MongoUserBalanceLogBO getByPayId(Long payId); + + /** + * 扣减余额,并将余额记录的支付状态变为已支付 + * + * @param payId 支付单号 + * @param userBalanceLog 余额记录 + */ + void updateToOrderPaySuccess(Long payId, MongoUserBalanceLogBO userBalanceLog); + + /** + * 更新为支付成功 + * @param balanceLogId + * @param payId + * @param payType + */ + void updateToSuccess(Long balanceLogId, Long payId, Integer payType); + + /** + * 执行退款 + * + * @param balanceRefundBO 退款参数 + */ + void doRefund(BalanceRefundBO balanceRefundBO); + + /** + * 分页获取用户余额充值财务详情 + * + * @param pageDTO + * @param financeDetailDTO + * @return + */ + PageVO pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO); + + /** + * 获取用户余额充值财务详情 + * + * @param financeDetailDTO + * @return + */ + List listFinanceDetail(FinanceDetailDTO financeDetailDTO); + + /** + * 获取平台财务信息 + * + * @param startTime + * @param endTime + * @return + */ + ShopAccountDetailVO getPlatformAccountDetail(Date startTime, Date endTime); + + /** + * 获取用户充值,购买会员财务信息 + * + * @param startTime + * @param endTime + * @return + */ + List listPayInfoVO(Date startTime, Date endTime); + + /** + * 分页获取用户充值财务信息 + * @param startTime + * @param endTime + * @param pageDTO + * @return + */ + PageVO pagePayInfoVO(Date startTime, Date endTime, PageDTO pageDTO); + + /** + * 通过支付单号和类型获取余额记录 + * + * @param payId 支付单号 + * @param rechargeType 类型 + * @return 余额记录 + */ + MongoUserBalanceLogBO getByPayIdAndType(Long payId, Integer rechargeType); + + /** + * 初始化用户余额记录到mongodb + */ + void initUserBalanceLogToMongodb(); + + /** + * 根据充值金额,获取用户id列表 + * + * @param isPayed 是否支付 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param minAmount 最小金额 + * @param maxAmount 最大金额 + * @return 用户id列表 + */ + List listUserIdByRechargeAmount(Integer isPayed, Date startDate, Date endDate, Long minAmount, Long maxAmount); + + /** + * 根据充值次数,获取用户id列表 + * + * @param isPayed 是否支付 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param minNum 最小次数 + * @param maxNum 最大次数 + * @return 用户id列表 + */ + List listUserIdByRechargeNum(Integer isPayed, Date startDate, Date endDate, Long minNum, Long maxNum); + + /** + * 补充用户列表余额数据 + * @param userList + * @return + */ + List setUserInfo(List userList); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserExtensionService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserExtensionService.java new file mode 100644 index 0000000..76f8f30 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserExtensionService.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.user.bo.UserOrderScoreBo; +import com.tmerclub.cloud.api.user.dto.UserExtensionDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.vo.UserExtensionVO; +import com.tmerclub.cloud.user.vo.UserRechargeVO; + +import java.util.List; + +/** + * 用户扩展信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserExtensionService { + + /** + * 分页获取用户扩展信息列表 + * + * @param pageDTO 分页参数 + * @return 用户扩展信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据用户扩展信息id获取用户扩展信息 + * + * @param userExtensionId 用户扩展信息id + * @return 用户扩展信息 + */ + UserExtension getByUserExtensionId(Long userExtensionId); + + /** + * 保存用户扩展信息 + * + * @param userExtension 用户扩展信息 + */ + void save(UserExtension userExtension); + + /** + * 更新用户扩展信息 + * + * @param userExtension 用户扩展信息 + */ + void update(UserExtension userExtension); + + /** + * 根据用户扩展信息id删除用户扩展信息 + * + * @param userExtensionId + */ + void deleteById(Long userExtensionId); + + /** + * 根据成长值范围,更新普通用户的等级 + * + * @param level 更新至该等级 + * @param minGrowth 最小成长值 + * @param maxGrowth 最大成长值 + */ + void updateUserLevel(Integer level, int minGrowth, Integer maxGrowth); + + /** + * 更新用户的积分 + * + * @param userIds + * @param score + * @param growth + */ + void updateUserScoreOrGrowth(List userIds, Long score, Integer growth); + + /** + * 根据用户Id列表, 获取用户列表信息 + * + * @param userIds 用户id列表 + * @return + */ + List getByUserIdsAndLevelType(List userIds); + + /** + * 获取用户扩展信息 + * + * @param userId + * @return + */ + UserExtension getByUserId(Long userId); + + /** + * 后台批量修改用户余额 + * + * @param userIds + * @param balance 改变余额 + * @param now + */ + void updateBatchUserBalanceByUserIds(List userIds, Long balance, DateTime now); + + /** + * 过滤已存在的用户拓展信息 + * @param userExtensions + * @return + */ + List filterExistExtensions(List userExtensions); + + /** + * 批量保存用户信息扩展表 + * + * @param userExtensionList 扩展信息 + */ + void saveBatch(List userExtensionList); + + /** + * 更新积分及成长值 + * @param orderId 订单id + */ + void updateScoreAndGrowth(Long orderId); + + /** + * 退还用户下单抵扣使用的积分 + * @param userOrderScoreBo 用户订单退还积分 + */ + void refundScore(UserOrderScoreBo userOrderScoreBo); + + /** + * 积分、成长值、余额日志 + * @param userExtensionList 注册的用户集合 + */ + void registerUserScoreGrowthBalanceLog(List userExtensionList); + + /** + * 通过充值列表进行充值,会送积分成长值之类的 + * + * @param userRechargeVO 充值内容 + * @param userBalanceLog 充值记录 + */ + void updateByUserRecharge(UserRechargeVO userRechargeVO, MongoUserBalanceLogBO userBalanceLog); + + /** + * 通过直接输入金额进行充值 + * + * @param userBalanceLog 充值记录 + */ + void addByUserBalanceLog(MongoUserBalanceLogBO userBalanceLog); + + /** + * 修改通联余额 + * @param userId + * @param balance + * @param type + */ + void changeAllinpayBalance(Long userId, + Long balance, + Integer type); + + /** + * 获取用户拓展信息列表 + * @param userExtensionDTO 用户拓展信息dto + * @return 用户拓展信息列表 + */ + List listUserExtensions(UserExtensionDTO userExtensionDTO); + + /** + * 批量更新拓展信息状态 + * @param userExtensionDTO 用户拓展信息dto + * @param userIds 用户id集合 + */ + void updateBatchStatus(UserExtensionDTO userExtensionDTO, List userIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelLogService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelLogService.java new file mode 100644 index 0000000..57b053a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelLogService.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserLevelLogDTO; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.vo.UserLevelLogVO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 用户等级记录 + * + * @author FrozenWatermelon + * @date 2021-05-14 11:04:52 + */ +public interface UserLevelLogService { + + /** + * 分页获取用户等级记录列表 + * @param pageDTO 分页参数 + * @param userLevelLogDTO + * @return 用户等级记录列表分页数据 + */ + PageVO pageBuyLevelLog(PageDTO pageDTO, UserLevelLogDTO userLevelLogDTO); + + /** + * 根据用户等级记录id获取用户等级记录 + * + * @param levelLogId 用户等级记录id + * @return 用户等级记录 + */ + UserLevelLog getByLevelLogId(Long levelLogId); + + /** + * 保存用户等级记录 + * @param userLevelLog 用户等级记录 + */ + void save(UserLevelLog userLevelLog); + + /** + * 更新用户等级记录 + * @param userLevelLog 用户等级记录 + */ + void update(UserLevelLog userLevelLog); + + /** + * 根据用户等级记录id删除用户等级记录 + * @param levelLogId 用户等级记录id + */ + void deleteById(Long levelLogId); + + /** + * 批量保存用户等级变更日志 + * + * @param userLevelLogs 保存日志列表 + */ + void batchSaveUserLevelLogs(List userLevelLogs); + + /** + * 获取用户最高的等级(普通会员) + * @param userId 用户id + * @return 用户等级 + */ + Integer getMaxLevelByUserId(Long userId); + + /** + * 更新为支付成功状态 + * + * @param levelLogId 日志id + * @param payId 支付id + * @param payType 支付类型 + * @return 影响行数 + */ + int updateToSuccess(Long levelLogId, Long payId, Integer payType); + + /** + * 删除用户等级记录 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 获取指定时间内的用户类型 + * @param userId + * @param createTime + * @return + */ + UserApiVO getUserTypeAndUserNameAtTime(Long userId, Date createTime); + + /** + * 分页获取用户会员购买财务详情 + * @param pageDTO + * @param financeDetailDTO + * @return + */ + PageVO pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO); + + /** + * 获取用户余额充值财务详情 + * @param financeDetailDTO + * @return + */ + List listFinanceDetail(FinanceDetailDTO financeDetailDTO); + + /** + * 获取用户充值,购买会员财务信息 + * @param startTime + * @param endTime + * @return + */ + List listPayInfoVO(Date startTime, Date endTime); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelRightsService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelRightsService.java new file mode 100644 index 0000000..c17fca8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelRightsService.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.user.model.UserLevel; + +import java.util.List; + +/** + * 等级-权益关联信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserLevelRightsService { + + /** + * 保存等级-权益关联信息 + * @param userLevelId + * @param rightIds + */ + void save(Long userLevelId, List rightIds); + + /** + * 更新等级-权益关联信息 + * @param userLevelId 会员等级id + * @param rightIds 权益Id列表 + */ + void update(Long userLevelId, List rightIds); + + /** + * 根据等级id删除等级-权益关联信息 + * @param userLevelId + */ + void deleteByUserLevelId(Long userLevelId); + + /** + * 根据权益id查出拥有此权益的会员等级id列表 + * @param rightId 权益id + * @return 会员等级id列表 + */ + List listUserLevelIdByRightId(Long rightId); + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelService.java new file mode 100644 index 0000000..97bae56 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserLevelService.java @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.user.bo.BuyVipNotifyBO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.dto.UserLevelDTO; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.vo.UserLevelVO; +import com.tmerclub.cloud.user.vo.UserRightsVO; +import com.tmerclub.cloud.user.vo.UserVO; + +import java.util.List; + +/** + * 会员等级表 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserLevelService { + + /** + * 根据用户等级类型,获取会员等级表列表 + * + * @param levelType 等级类型 + * @return 会员等级表列表数据 + */ + List list(Integer levelType); + + /** + * 根据会员等级表id获取会员等级表 + * + * @param userLevelId 会员等级表id + * @return 会员等级表 + */ + UserLevelVO getByUserLevelId(Long userLevelId); + + /** + * 保存会员等级表 + * + * @param userLevelDTO 会员等级数据 + */ + void save(UserLevelDTO userLevelDTO); + + /** + * 更新会员等级表 + * + * @param userLevelDTO 会员等级表 + */ + void update(UserLevelDTO userLevelDTO); + + /** + * 根据会员等级表id删除会员等级表 + * + * @param userLevelId 会员等级表id + */ + void deleteByUserLevelId(Long userLevelId); + + /** + * 更新用户会员等级 + */ + void updateUserLevel(); + + /** + * 批量修改会员成长值 + * + * @param userAdminDTO 会员等级信息 + */ + void batchUpdateGrowth(UserAdminDTO userAdminDTO); + + /** + * 批量修改会员积分 + * + * @param userAdminDTO 会员等级信息 + */ + void batchUserScore(UserAdminDTO userAdminDTO); + + /** + * 等级提升 + * + * @param userLevels 多个等级,奖励发放时 + * @param userLevelLog 等级日志,在购买付费会员时存在 + * @param user 用户详细信息 + * @param phone 用户手机号码 + */ + void levelUp(List userLevels, UserLevelLog userLevelLog, UserExtension user, String phone); + + /** + * 用户信息初始化 + * + * @param userExtension 用户扩展信息 + * @param level 等级 + * @param levelType 等级类型 + * @param phone + * @return + */ + MongoUserScoreLogBO initUserInfoAndLevelInfo(UserExtension userExtension, Integer level, Integer levelType, String phone); + + /** + * 保存or修改会员等级表 + * + * @param userLevelDTO 会员等级数据 + */ + void saveOrUpdate(UserLevelDTO userLevelDTO); + + /** + * 根据会员类型与会员等级获取会员等级数据 + * + * @param levelType 会员类型 + * @param level 会员等级 + * @return 会员等级数据 + */ + UserLevelVO getOneByTypeAndLevel(Integer levelType, Integer level); + + /** + * 删除会员等级缓存 + * + * @param userLevelId 会员等级表id + * @param levelType 会员类型 + * @param level 会员等级 + */ + void removeLevelCache(Long userLevelId, Integer levelType, Integer level); + + /** + * 删除会员等级列表缓存 + * + * @param levelType + */ + void removeLevelListCache(Integer levelType); + + /** + * 删除单个会员等级缓存 + * + * @param userLevelId 会员等级id + */ + void removeLevelById(Long userLevelId); + + /** + * 根据成长值提升/降低用户等级 + * 只修改传入 levelType 的用户等级 + * + * @param userIds 用户id列表 + * @param levelType 会员类型必填, + * @return 每个会员等级变更日志 + */ + List batchLevelUpByGrowthAndUserIds(List userIds, Integer levelType); + + /** + * 增加用户成长值和积分 + * + * @param growthPrice 增加的成长值 + * @param score 增加的积分 + * @param userId 用户id + * @param bizId bizId + * @param userExtension 用户扩展信息 + * @param type 1:等级 2:余额充值 + */ + void addGrowthAndScore(double growthPrice, Long score, Long userId, Long bizId, UserExtension userExtension, Integer type); + + /** + * 订单退款后,成长值也需要回退的 + * + * @param orderId 订单号 + */ + void refundGrowth(Long orderId); + + /** + * 获取当前类型的最大等级 + * + * @param levelType 等级类型 + * @return 最大等级 + */ + int getMaxLevel(Integer levelType); + + /** + * 获取当前用户作为普通会员的等级 + * + * @param growth 用户当前成长值 + * @return + */ + int getUserNormalLevel(Integer growth); + + /** + * 将付费会员变成普通会员 + * 会员等级直接变成普通会员的成长值对应的等级 + * + * @param users 付费会员用户 + */ + void expireVipUsers(List users); + + /** + * 付费会员等级修改招募状态 + * + * @param userLevelDTO 会员等级 + */ + void updateRecruitStatus(UserLevelDTO userLevelDTO); + + /** + * 赠送注册积分 + * + * @param userExtensionList 用户扩展信息集合 + */ + void registerUserScore(List userExtensionList); + + /** + * 导入用户发放对应等级的权益 + * + * @param userExtensionList 用户扩展信息集合 + */ + void registerUserSendRights(List userExtensionList); + + /** + * 根据会员类型获取全部权益列表 + * + * @param levelType 会员类型 + * @param userId + * @return 权益列表 + */ + List listRightsByLevelType(Integer levelType, Long userId); + + /** + * 购买vip成功 + * + * @param userLevelLog 日志信息 + * @param message 消息 + */ + void paySuccess(UserLevelLog userLevelLog, BuyVipNotifyBO message); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRechargeCouponService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRechargeCouponService.java new file mode 100644 index 0000000..a269604 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRechargeCouponService.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.RechargeCouponDTO; +import com.tmerclub.cloud.user.model.UserRechargeCoupon; + +import java.util.List; +import java.util.Set; + +/** + * 余额优惠券关联表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public interface UserRechargeCouponService { + + /** + * 分页获取余额优惠券关联表列表 + * @param pageDTO 分页参数 + * @return 余额优惠券关联表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据余额优惠券关联表id获取余额优惠券关联表 + * + * @param rechargeId 余额优惠券关联表id + * @return 余额优惠券关联表 + */ + UserRechargeCoupon getByRechargeId(Long rechargeId); + + /** + * 保存余额优惠券关联表 + * @param userRechargeCoupon 余额优惠券关联表 + */ + void save(UserRechargeCoupon userRechargeCoupon); + + /** + * 更新余额优惠券关联表 + * @param userRechargeCoupon 余额优惠券关联表 + */ + void update(UserRechargeCoupon userRechargeCoupon); + + /** + * 根据余额优惠券关联表id删除余额优惠券关联表 + * @param rechargeId 余额优惠券关联表id + */ + void deleteById(Long rechargeId); + + /** + * 批量保存充值详情关联的赠送优惠券 + * @param rechargeId + * @param couponList + */ + void insertBatch(Long rechargeId, List couponList); + + /** + * 删除充值表详情中的一些关联优惠券 + * @param rechargeId + * @param couponIdList + */ + void removeByRechargeIdAndCouponId(Long rechargeId, Set couponIdList); + + /** + * 修改充值表详情中的一些关联优惠券 + * @param rechargeId + * @param updateList + */ + void updateBatchByCoupons(Long rechargeId, List updateList); + + /** + * 取消过期优惠券的绑定 + * @param couponIds + */ + void cancelBindingCoupons(List couponIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRechargeService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRechargeService.java new file mode 100644 index 0000000..17ffb42 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserRechargeService.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.dto.UserRechargeDTO; +import com.tmerclub.cloud.user.model.UserRecharge; +import com.tmerclub.cloud.user.vo.UserRechargeVO; + +import java.util.List; + +/** + * 余额充值级别表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public interface UserRechargeService { + + /** + * 分页获取余额充值级别表列表 + * + * @param pageDTO 分页参数 + * @return 余额充值级别表列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据余额充值级别表id获取余额充值级别表 + * + * @param rechargeId 余额充值级别表id + * @return 余额充值级别表 + */ + UserRechargeVO getRechargeInfo(Long rechargeId); + + /** + * 保存余额充值级别表 + * + * @param userRecharge 余额充值级别表 + */ + void save(UserRecharge userRecharge); + + /** + * 更新余额充值级别表 + * + * @param userRecharge 余额充值级别表 + */ + void update(UserRecharge userRecharge); + + /** + * 根据余额充值级别表id删除余额充值级别表 + * + * @param rechargeId 余额充值级别表id + */ + void deleteById(Long rechargeId); + + /** + * 获取余额充值级别表列表 + * + * @return + */ + List list(); + + /** + * 清除缓存 + * + * @param rechargeId + */ + void removeCacheByRechargeId(Long rechargeId); + + /** + * 批量修改用户余额 + * + * @param userAdminDTO + * @return + */ + boolean batchUpdateUserBalance(UserAdminDTO userAdminDTO); + + /** + * 根据余额充值级别表id获取余额充值级别详情 + * + * @param rechargeId + * @param putOnStatus + * @return + */ + UserRechargeVO getRechargeByRechargeId(Long rechargeId, Integer putOnStatus); + + /** + * 保存充值信息 + * + * @param userRechargeDTO + */ + void saveRecharge(UserRechargeDTO userRechargeDTO); + + /** + * 修改充值信息 + * + * @param userRechargeDTO + */ + void updateByRechargeId(UserRechargeDTO userRechargeDTO); + + /** + * 充值成功 + * + * @param message + */ + void rechargeSuccess(RechargeNotifyBO message); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreGetLogService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreGetLogService.java new file mode 100644 index 0000000..6b9669a --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreGetLogService.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.model.UserScoreGetLog; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 用户积分获取记录 + * + * @author FrozenWatermelon + * @date 2021-05-17 17:17:14 + */ +public interface UserScoreGetLogService { + + /** + * 分页获取用户积分获取记录列表 + * + * @param pageDTO 分页参数 + * @return 用户积分获取记录列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据用户积分获取记录id获取用户积分获取记录 + * + * @param userScoreGetLogId 用户积分获取记录id + * @return 用户积分获取记录 + */ + UserScoreGetLog getByUserScoreGetLogId(Long userScoreGetLogId); + + /** + * 保存用户积分获取记录 + * + * @param userScoreGetLog 用户积分获取记录 + */ + void save(UserScoreGetLog userScoreGetLog); + + /** + * 更新用户积分获取记录 + * + * @param userScoreGetLog 用户积分获取记录 + */ + void update(UserScoreGetLog userScoreGetLog); + + /** + * 根据用户积分获取记录id删除用户积分获取记录 + * + * @param userScoreGetLogId 用户积分获取记录id + */ + void deleteById(Long userScoreGetLogId); + + /** + * 批量保存积分明细 + * + * @param userScoreGetLogs + * @return + */ + void saveBatch(List userScoreGetLogs); + + /** + * 根据用户id查询最近一条积分过期记录 + * + * @param userId 用户id + * @return 积分过期记录 + */ + UserScoreGetLog getLogByUserId(Long userId); + + /** + * 删除用户积分记录 + * + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); + + /** + * 查询已经过期但还没标记的积分 + * + * @param userId 用户id + * @param expireTime 过期时间 + * @param status 状态 + * @return 用户积分记录列表 + */ + List listByUserIdAndExpireTimeAndStatus(Long userId, Date expireTime, Integer status); + + /** + * 更新用户积分记录 + * + * @param userScoreGetLogList 用户积分记录列表 + */ + void updateBatchById(List userScoreGetLogList); + + /** + * 查询用户可用积分 + * + * @param userId 用户id + * @param status 状态 + * @param current 开始搜索的索引 + * @param size 分页的大小 + * @return 用户可用积分 + */ + Long sumUsableScoreByPage(Long userId, Integer status, Integer current, Integer size); + + /** + * 查询用户积分详细表数据 + * + * @param userId 用户id + * @param status 状态 + * @return 用户积分详细表数据 + */ + List listByCreateTime(Long userId, Integer status); + + /** + * 查询用户积分记录列表 + * + * @param userId 用户id + * @param status 状态 + * @param current 开始搜索的索引 + * @param size 分页的大小 + * @return + */ + List listByCreateTimeAndPage(Long userId, Integer status, Integer current, Integer size); + + /** + * 获取用户可用的积分明细 + * + * @param userIds 用户id集合 + * @param status 状态 ScoreGetLogStatusEnum + * @return 用户可用的积分明细 + */ + List batchListByCreateTime(List userIds, Integer status); + + /** + * 修改用户过期积分 + * + * @param dateTime 过期时间 + */ + void updateExpireScoreDetail(DateTime dateTime); + + /** + * 根据订单id查询最近一条积分过期记录 + * + * @param bizId 订单id + * @return 积分过期记录 + */ + UserScoreGetLog getLogByBizId(Long bizId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreLockService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreLockService.java new file mode 100644 index 0000000..e9c9bef --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserScoreLockService.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.user.bo.UserScoreBO; +import com.tmerclub.cloud.api.user.dto.UserScoreLockDTO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.model.UserScoreLock; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 积分锁定信息 + * + * @author FrozenWatermelon + * @date 2021-05-19 19:54:55 + */ +public interface UserScoreLockService { + + /** + * 分页获取积分锁定信息列表 + * @param pageDTO 分页参数 + * @return 积分锁定信息列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据积分锁定信息id获取积分锁定信息 + * + * @param id 积分锁定信息id + * @return 积分锁定信息 + */ + UserScoreLock getById(Long id); + + /** + * 保存积分锁定信息 + * @param userScoreLock 积分锁定信息 + */ + void save(UserScoreLock userScoreLock); + + /** + * 更新积分锁定信息 + * @param userScoreLock 积分锁定信息 + */ + void update(UserScoreLock userScoreLock); + + /** + * 根据积分锁定信息id删除积分锁定信息 + * @param id 积分锁定信息id + */ + void deleteById(Long id); + + /** + * 按照订单号锁定积分 + * @param userScoreLocks 订单号和积分的集合 + */ + void lock(List userScoreLocks); + + /** + * 按照订单号解锁积分 + * @param userScoreBo 解锁订单号集合 + */ + void unlock(UserScoreBO userScoreBo); + + /** + * 删除用户积分记录 + * @param userId 用户id + * @return + */ + void deleteByUserId(@Param("userId") Long userId); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserTagService.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserTagService.java new file mode 100644 index 0000000..15bdf23 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/UserTagService.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service; + +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.dto.UserTagDTO; +import com.tmerclub.cloud.user.model.UserTag; +import com.tmerclub.cloud.user.vo.UserTagVO; + +import java.util.List; + +/** + * 客户标签 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public interface UserTagService { + + /** + * 分页获取客户标签列表 + * + * @param pageDTO 分页参数 + * @return 客户标签列表分页数据 + */ + PageVO page(PageDTO pageDTO); + + /** + * 根据客户标签id获取客户标签 + * + * @param userTagId 客户标签id + * @return 客户标签 + */ + UserTag getByUserTagId(Long userTagId); + + /** + * 保存客户标签 + * + * @param userTag 客户标签 + */ + void save(UserTag userTag); + + /** + * 更新客户标签 + * + * @param userTag 客户标签 + */ + void update(UserTag userTag); + + /** + * 根据客户标签id删除客户标签 + * + * @param userTagId + */ + void deleteById(Long userTagId); + + /** + * 获取所有标签列表 + * + * @return 标签列表 + */ + List list(UserTag userTag); + + /** + * 刷新条件标签 + * + * @param userTagId 标签id + * @return 标签详情 + */ + UserTagVO refreshConditionTag(Long userTagId); + + /** + * 批量刷新条件标签 + * @param tagIds 标签id集合 + */ + void batchRefreshConditionTag(List tagIds); + + /** + * 统计已存在的数量 + * + * @param userTag 条件参数 + * @return 数量 + */ + int count(UserTag userTag); + + /** + * 添加标签信息 + * + * @param userTagDTO 标签信息 + */ + void addUserTag(UserTagDTO userTagDTO); + + /** + * 修改标签信息 + * + * @param userTagDTO 标签信息 + */ + void updateUserTag(UserTagDTO userTagDTO); + + /** + * 分页获取标签 + * + * @param pageDTO 分页参数 + * @param userTagDTO 条件查询参数 + * @return 标签分页数据 + */ + PageVO getPage(PageDTO pageDTO, UserTagDTO userTagDTO); + + /** + * 通过标签id集合获取标签集合 + * + * @param tagIds 标签id + * @return 标签列表 + */ + List getUserTagList(List tagIds); +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/PopupRelateServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/PopupRelateServiceImpl.java new file mode 100644 index 0000000..b9126ac --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/PopupRelateServiceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.user.mapper.PopupRelateMapper; +import com.tmerclub.cloud.user.model.PopupRelate; +import com.tmerclub.cloud.user.service.PopupRelateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 弹窗广告关联 + * @author TRACK + */ +@Service +public class PopupRelateServiceImpl implements PopupRelateService { + + @Autowired + private PopupRelateMapper popupRelateMapper; + + @Override + public List getByPopupId(Long popupId) { + return popupRelateMapper.getByPopupId(popupId); + } + + @Override + public void saveBatch(List popupRelates) { + popupRelateMapper.saveBatch(popupRelates); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateBatch(Long popupId, List popupRelates) { + // 先删除后新增 + popupRelateMapper.deleteById(popupId); + if (CollUtil.isEmpty(popupRelates)) { + return; + } + popupRelateMapper.saveBatch(popupRelates); + } + + @Override + public void deleteById(Long popupId) { + popupRelateMapper.deleteById(popupId); + } + + @Override + public void deleteByRelateIds(List relateIds) { + popupRelateMapper.deleteByRelateIds(relateIds); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/PopupUserLogServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/PopupUserLogServiceImpl.java new file mode 100644 index 0000000..6678dcb --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/PopupUserLogServiceImpl.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.user.bo.mongo.MongoPopupUserLogBO; +import com.tmerclub.cloud.user.model.CostPerPopup; +import com.tmerclub.cloud.user.service.PopupUserLogService; +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 java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 弹窗广告用户日志 + * @author TRACK + */ +@Service +public class PopupUserLogServiceImpl implements PopupUserLogService { + + @Autowired + private MongoTemplate mongoTemplate; + private static final String TIME_FORMAT = "yyMMdd"; + + @Override + public void removeByPopupId(Long popupId) { + mongoTemplate.remove(new Query(Criteria.where("popupId").is(popupId)), MongoPopupUserLogBO.class); + } + + @Override + public void save(MongoPopupUserLogBO log) { + log.setCreateTime(DateUtil.format(new Date(), TIME_FORMAT)); + mongoTemplate.save(log); + } + + @Override + public List getByCondition(Long userId, Long uuid, CostPerPopup costPerPopup) { + Criteria criteria = Criteria.where("popupId").is(costPerPopup.getPopupId()); + if (Objects.nonNull(userId)) { + criteria.and("userId").is(userId); + } else { + criteria.and("uuid").is(uuid); + } + if (Objects.nonNull(costPerPopup.getWeekFrequency())) { + String maxTime = DateUtil.format(new Date(), TIME_FORMAT); + String minTime = DateUtil.format(DateUtil.beginOfDay(new Date()), TIME_FORMAT); + // 按周推送校验今天有没有推送过 + criteria.and("createTime").lte(maxTime).gte(minTime); + } + if (Objects.nonNull(costPerPopup.getDayFrequency())) { + // 按天推送校验x天前到今天有没有推送过 + String maxTime = DateUtil.format(new Date(), TIME_FORMAT); + String minTime = DateUtil.format(DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -costPerPopup.getDayFrequency())), TIME_FORMAT); + criteria.and("createTime").lte(maxTime).gte(minTime); + } + return mongoTemplate.find(new Query(criteria), MongoPopupUserLogBO.class); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/ShopCustomerServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/ShopCustomerServiceImpl.java new file mode 100644 index 0000000..34cd8ce --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/ShopCustomerServiceImpl.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.api.user.dto.ShopCustomerReqDTO; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.user.dto.ShopCustomerDTO; +import com.tmerclub.cloud.user.mapper.ShopCustomerMapper; +import com.tmerclub.cloud.user.model.ShopCustomer; +import com.tmerclub.cloud.user.service.ShopCustomerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +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.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2023-01-15 15:53:16 + */ +@Service +public class ShopCustomerServiceImpl implements ShopCustomerService { + + @Autowired + private ShopCustomerMapper shopCustomerMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveBatch(List shopCustomers) { + shopCustomerMapper.saveBatch(shopCustomers); + List keys = new ArrayList<>(shopCustomers.size()); + for (ShopCustomer shopCustomer : shopCustomers) { + keys.add(UserCacheNames.SHOP_CUSTOMER_KEY + shopCustomer.getShopId() + CacheNames.UNION_KEY + shopCustomer.getUserId()); + } + RedisUtil.deleteBatch(keys); + } + + @Override + public List listByParam(ShopCustomerDTO shopCustomerDTO) { + return shopCustomerMapper.listByParam(shopCustomerDTO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveBatchByOrders(List shopCustomerReqList) { + if (CollUtil.isEmpty(shopCustomerReqList)) { + return; + } + List keys = new ArrayList<>(shopCustomerReqList.size()); + Map> shopMap = shopCustomerReqList.stream().collect(Collectors.groupingBy(ShopCustomerReqDTO::getShopId)); + List list = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long shopId : shopMap.keySet()) { + List userIds = shopMap.get(shopId).stream().map(ShopCustomerReqDTO::getUserId).filter(Objects::nonNull).toList(); + if (CollUtil.isEmpty(userIds)) { + continue; + } + List shopCustomers = shopCustomerMapper.listNotExistByShopIdAndUserIds(shopId, userIds); + if (CollUtil.isEmpty(shopCustomers)) { + continue; + } + for (ShopCustomer shopCustomer : shopCustomers) { + shopCustomer.setShopId(shopId); + keys.add(UserCacheNames.SHOP_CUSTOMER_KEY + shopCustomer.getShopId() + CacheNames.UNION_KEY + shopCustomer.getUserId()); + } + list.addAll(shopCustomers); + } + if (CollUtil.isNotEmpty(list)) { + shopCustomerMapper.saveBatch(list); + } + if (CollUtil.isNotEmpty(keys)) { + RedisUtil.deleteBatch(keys); + } + } + + @Override + @Cacheable(value = UserCacheNames.SHOP_CUSTOMER_KEY, key = "#shopId + ':' + #userId") + public Integer getIsShopCustomer(Long shopId, Long userId) { + return shopCustomerMapper.getIsShopCustomer(shopId, userId); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserAddrServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserAddrServiceImpl.java new file mode 100644 index 0000000..a1fc3f2 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserAddrServiceImpl.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.common.order.vo.UserAddrVO; +import com.tmerclub.cloud.user.mapper.UserAddrMapper; +import com.tmerclub.cloud.user.model.UserAddr; +import com.tmerclub.cloud.user.service.UserAddrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 用户地址 + * + * @author FrozenWatermelon + * @date 2020-12-07 15:50:02 + */ +@Service +public class UserAddrServiceImpl implements UserAddrService { + + @Autowired + private UserAddrMapper userAddrMapper; + + @Override + public List list(Long userId) { + return userAddrMapper.list(userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(UserAddr userAddr) { + if (userAddr.getIsDefault().equals(UserAddr.DEFAULT_ADDR)) { + userAddrMapper.removeDefaultUserAddr(userAddr.getUserId()); + } + userAddrMapper.save(userAddr); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(UserAddr userAddr) { + if (userAddr.getIsDefault().equals(UserAddr.DEFAULT_ADDR)) { + userAddrMapper.removeDefaultUserAddr(userAddr.getUserId()); + } + userAddrMapper.update(userAddr); + } + + @Override + public void deleteUserAddrByUserId(Long addrId, Long userId) { + userAddrMapper.deleteById(addrId, userId); + } + + @Override + public UserAddrVO getUserAddrByUserId(Long addrId, Long userId) { + // 获取用户默认地址 + if (addrId == 0) { + return userAddrMapper.getUserDefaultAddrByUserId(userId); + } + return userAddrMapper.getByAddrId(addrId, userId); + } + + @Override + public int countByUserId(Long userId) { + return userAddrMapper.countByUserId(userId); + } + + @Override + @CacheEvict(cacheNames = UserCacheNames.USER_DEFAULT_ADDR, key = "#userId") + public void removeUserDefaultAddrCacheByUserId(Long userId) { + + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserBalanceLogServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserBalanceLogServiceImpl.java new file mode 100644 index 0000000..a8921f1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserBalanceLogServiceImpl.java @@ -0,0 +1,700 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tmerclub.cloud.api.order.feign.OrderRefundFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderSettlementFeignClient; +import com.tmerclub.cloud.api.order.vo.OrderRefundSimpleVO; +import com.tmerclub.cloud.api.order.vo.OrderSettlementSimpleVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.payment.vo.PaySettlementConfigVO; +import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.BalanceRefundBO; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.PayType; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.RechargeIoTypeEnum; +import com.tmerclub.cloud.user.constant.RechargeTypeEnum; +import com.tmerclub.cloud.user.mapper.UserBalanceLogMapper; +import com.tmerclub.cloud.user.mapper.UserExtensionMapper; +import com.tmerclub.cloud.user.mapper.UserLevelLogMapper; +import com.tmerclub.cloud.user.mapper.UserRechargeMapper; +import com.tmerclub.cloud.user.model.UserBalanceLog; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.model.UserRecharge; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.vo.UserBalanceLogVO; +import com.tmerclub.cloud.user.vo.mongo.MongoBalanceFinanceDetailVO; +import com.tmerclub.cloud.user.vo.mongo.MongoBalanceShopAccountDetailVO; +import com.tmerclub.cloud.user.vo.mongo.MongoBalanceUserManagerVO; +import com.tmerclub.cloud.user.vo.mongo.MongoBalanceUserPayInfoVO; +import com.mongodb.client.result.UpdateResult; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 余额记录 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +@Service +public class UserBalanceLogServiceImpl implements UserBalanceLogService { + + private static final Logger logger = LoggerFactory.getLogger(UserBalanceLogServiceImpl.class); + + @Autowired + private UserBalanceLogMapper userBalanceLogMapper; + @Autowired + private UserExtensionMapper userExtensionMapper; + @DubboReference + private OrderSettlementFeignClient orderSettlementFeignClient; + @DubboReference + private OrderRefundFeignClient orderRefundFeignClient; + @Autowired + private UserLevelLogMapper userLevelLogMapper; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private SegmentManager segmentManager; + @Autowired + private MongoPageUtil mongoPageUtil; + @Autowired + private UserRechargeMapper userRechargeMapper; + + @Override + public void saveToMongdb(MongoUserBalanceLogBO mongoUserBalanceLogBO) { + if (Objects.isNull(mongoUserBalanceLogBO) || Objects.isNull(mongoUserBalanceLogBO.getBalanceLogId())) { + throw new LuckException("余额日志信息不全"); + } + mongoUserBalanceLogBO.setCreateTime(new Date()); + mongoUserBalanceLogBO.setUpdateTime(new Date()); + logger.info("保存余额记录到mongodb{}", mongoUserBalanceLogBO); + mongoTemplate.save(mongoUserBalanceLogBO); + } + + @Override + public void saveBatchToMongodb(List list) { + logger.info("批量保存余额记录到mongodb{}", list); + for (MongoUserBalanceLogBO mongoUserBalanceLogBO : list) { + if (Objects.isNull(mongoUserBalanceLogBO) || Objects.isNull(mongoUserBalanceLogBO.getBalanceLogId())) { + throw new LuckException("余额日志信息不全"); + } + mongoUserBalanceLogBO.setCreateTime(new Date()); + mongoUserBalanceLogBO.setUpdateTime(new Date()); + } + mongoTemplate.insertAll(list); + } + + @Override + public MongoUserBalanceLogBO getByBalanceLogId(Long balanceLogId) { + MongoUserBalanceLogBO userBalanceLogBO = mongoTemplate.findById(balanceLogId, MongoUserBalanceLogBO.class); + if (Objects.isNull(userBalanceLogBO)) { + throw new LuckException("余额记录日志不存在"); + } + return userBalanceLogBO; + } + + @Override + public PageVO getPageByUserId(PageDTO pageDTO, Long userId) { + PageVO pageVO = new PageVO<>(); + // 查询支付系统类型(默认 or 通联) + Integer paySysType = this.getPaySysType(); + Query query = new Query(); + query.addCriteria(Criteria.where("paySysType").is(paySysType).and("userId").is(userId) + .orOperator(Criteria.where("type").nin(1, 3, 6), + Criteria.where("type").in(1, 3, 6).and("isPayed").ne(0))); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + PageVO mongoUserBalanceLogPage = mongoPageUtil.doPage(MongoUserBalanceLogBO.class, pageDTO, query); + List userBalanceLogs = BeanUtil.mapAsList(mongoUserBalanceLogPage.getList(), UserBalanceLogVO.class); + // 通过支付单号或者退款单号查询订单号 + List refundIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + List payIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + userBalanceLogs.forEach(item -> { + if (Objects.equals(item.getType(), RechargeTypeEnum.PAY.value()) && Objects.nonNull(item.getPayId())) { + payIds.add(item.getPayId()); + } else if (Objects.equals(item.getType(), RechargeTypeEnum.REFUND.value()) && Objects.nonNull(item.getRefundId())) { + refundIds.add(item.getRefundId()); + } + }); + ServerResponseEntity> orderSettlementRes = orderSettlementFeignClient.listOrderIdsByPayIds(userId, payIds); + ServerResponseEntity> orderRefundRes = orderRefundFeignClient.listOrderIdsByRefundIds(refundIds); + if (orderRefundRes.isSuccess() && orderRefundRes.isSuccess()) { + Map orderSettlementSimpleMap = orderSettlementRes.getData().stream().collect(Collectors.toMap(OrderSettlementSimpleVO::getPayId, orderSettlementSimpleVO -> orderSettlementSimpleVO)); + Map orderRefundSimpleMap = orderRefundRes.getData().stream().collect(Collectors.toMap(OrderRefundSimpleVO::getRefundId, orderRefundSimpleVO -> orderRefundSimpleVO)); + Map> userBalanceLogMap = userBalanceLogs.stream().filter(o -> Objects.nonNull(o.getPayId())).collect(Collectors.groupingBy(UserBalanceLogVO::getPayId)); + userBalanceLogs.forEach(item -> { + if (Objects.equals(item.getType(), RechargeTypeEnum.PAY.value()) && Objects.nonNull(orderSettlementSimpleMap.get(item.getPayId()))) { + OrderSettlementSimpleVO orderSettlementSimpleVO = orderSettlementSimpleMap.get(item.getPayId()); + item.setOrderIds(orderSettlementSimpleVO.getOrderIds()); + if (Objects.nonNull(orderSettlementSimpleVO.getPayIds())) { + // 预售订单要把定金的订单加上 + String[] orderPayIds = orderSettlementSimpleVO.getPayIds().split(Constant.COMMA); + for (String orderPayId : orderPayIds) { + if (Objects.isNull(orderPayId) || StrUtil.equals(orderPayId, "null")) { + continue; + } + if (Objects.equals(orderPayId, item.getPayId().toString())) { + continue; + } + if (CollUtil.isNotEmpty(userBalanceLogMap.get(Long.valueOf(orderPayId)))) { + for (UserBalanceLogVO userBalanceLogVO : userBalanceLogMap.get(Long.valueOf(orderPayId))) { + userBalanceLogVO.setOrderIds(orderSettlementSimpleVO.getOrderIds()); + } + } + } + } + } else if (Objects.equals(item.getType(), RechargeTypeEnum.REFUND.value()) && Objects.nonNull(orderRefundSimpleMap.get(item.getRefundId()))) { + item.setOrderIds(new ArrayList() {{ + this.add(orderRefundSimpleMap.get(item.getRefundId()).getOrderId()); + }}); + } + }); + } + pageVO.setList(userBalanceLogs); + pageVO.setTotal(mongoUserBalanceLogPage.getTotal()); + pageVO.setPages(mongoUserBalanceLogPage.getPages()); + return pageVO; + } + + @Override + public MongoUserBalanceLogBO getByPayId(Long payId) { + Query query = new Query(Criteria.where("payId").is(payId)); + List list = mongoTemplate.find(query, MongoUserBalanceLogBO.class); + if (CollUtil.isEmpty(list)) { + throw new LuckException("余额记录日志不存在"); + } + MongoUserBalanceLogBO userBalanceLogBO = list.get(0); + return userBalanceLogBO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateToOrderPaySuccess(Long payId, MongoUserBalanceLogBO userBalanceLog) { + // 扣减余额 + if (userBalanceLog.getPaySysType().equals(PaySysType.DEFAULT.value())) { + logger.info("扣减默认余额"); + Long userId = userBalanceLog.getUserId(); + boolean updateBalanceStatus = userExtensionMapper.deductionUserBalance(userBalanceLog.getChangeBalance(), userId); + if (!updateBalanceStatus) { + throw new LuckException("余额不足"); + } + } else if (Objects.equals(userBalanceLog.getPaySysType(), PaySysType.ALLINPAY.value())) { + logger.info("扣减通联余额"); + UserExtension userExtension = userExtensionMapper.getByUserId(userBalanceLog.getUserId()); + if (userExtension.getAllinpayActualBalance() < userBalanceLog.getChangeBalance()) { + throw new LuckException("通联余额不足"); + } + userExtension.setAllinpayActualBalance(userExtension.getAllinpayActualBalance() - userBalanceLog.getChangeBalance()); + userExtensionMapper.update(userExtension); + } else { + throw new LuckException("余额记录支付系统类型错误"); + } + // 将余额记录的支付状态变为已支付 + updateToSuccess(userBalanceLog.getBalanceLogId(), userBalanceLog.getPayId(), PayType.BALANCE.value()); + } + + @Override + public void updateToSuccess(Long balanceLogId, Long payId, Integer payType) { + Update update = new Update(); + update.set("isPayed", 1); + update.set("payType", payType); + if (Objects.nonNull(payId)) { + update.set("payId", payId); + } + Query query = new Query(Criteria.where("balanceLogId").is(balanceLogId).and("isPayed").is(0)); + UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MongoUserBalanceLogBO.class); + if (updateResult.getModifiedCount() < 1) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void doRefund(BalanceRefundBO balanceRefundBO) { + Query query = new Query(Criteria.where("refundId").is(balanceRefundBO.getRefundId()).and("refundAmount").is(balanceRefundBO.getRefundNumber())); + long refundCount = mongoTemplate.count(query, MongoUserBalanceLogBO.class); + if (refundCount > 0L) { + return; + } + // 退款记录 + MongoUserBalanceLogBO userBalanceLog = new MongoUserBalanceLogBO(); + userBalanceLog.setBalanceLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_BALANCE_LOG)); + userBalanceLog.setUserId(balanceRefundBO.getUserId()); + userBalanceLog.setChangeBalance(balanceRefundBO.getChangeBalance()); + userBalanceLog.setIoType(RechargeIoTypeEnum.INCOME.value()); + userBalanceLog.setIsPayed(0); + userBalanceLog.setPayId(balanceRefundBO.getPayId()); + userBalanceLog.setRefundId(balanceRefundBO.getRefundId()); + userBalanceLog.setRefundNumber(balanceRefundBO.getRefundNumber()); + userBalanceLog.setType(RechargeTypeEnum.REFUND.value()); + userBalanceLog.setPaySysType(balanceRefundBO.getPaySysType()); + // 余额加钱 + // 扣减余额 + if (userBalanceLog.getPaySysType().equals(PaySysType.DEFAULT.value())) { + logger.info("退款增加默认余额"); + userExtensionMapper.addByUserBalanceLog(userBalanceLog); + } else if (Objects.equals(userBalanceLog.getPaySysType(), PaySysType.ALLINPAY.value())) { + logger.info("退款增加通联余额"); + UserExtension userExtension = userExtensionMapper.getByUserId(userBalanceLog.getUserId()); + userExtension.setAllinpayActualBalance(userExtension.getAllinpayActualBalance() + userBalanceLog.getChangeBalance()); + userExtensionMapper.update(userExtension); + } + saveToMongdb(userBalanceLog); + } + + @Override + public PageVO pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO) { + Criteria criteria = getCriteria(financeDetailDTO); + ProjectionOperation projectionOperation = Aggregation.project("payType", "payId", "userId", "rechargeId", "createTime") + .and("createTime").as("transDate") + .and("createTime").as("placeTime") + .and("_id").as("orderId") + .and("changeBalance").as("transAmount") + .and("payId").as("payIds"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime"); + // 分页数据 + SkipOperation skipOperation = Aggregation.skip((long) pageDTO.getPageSize() * (pageDTO.getPageNum() - 1)); + LimitOperation limitOperation = Aggregation.limit(pageDTO.getPageSize()); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoBalanceFinanceDetailVO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation, + skipOperation, + limitOperation + ); + logger.info("pageFinanceDetail()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoBalanceFinanceDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + + // 总条数 + TypedAggregation aggregation = Aggregation.newAggregation( + MongoBalanceFinanceDetailVO.class, + Aggregation.match(criteria), + projectionOperation + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoBalanceFinanceDetailVO.class); + List mappedResults = aggregate.getMappedResults(); + PageVO pageVO = new PageVO<>(); + pageVO.setTotal((long) mappedResults.size()); + pageVO.setList(new ArrayList<>()); + pageVO.setPages(PageUtil.getPages(mappedResults.size(), pageDTO.getPageSize())); + if (CollUtil.isNotEmpty(list)) { + // 补充数据 + setInfo(financeDetailDTO, list); + List financeList = BeanUtil.mapAsList(list, FinanceDetailVO.class); + pageVO.setList(financeList); + } + return pageVO; + } + + private void setInfo(FinanceDetailDTO financeDetailDTO, List list) { + Set rechargeIds = list.stream().map(MongoBalanceFinanceDetailVO::getRechargeId).collect(Collectors.toSet()); + List userRecharges = userRechargeMapper.listByRechargeIds(rechargeIds); + Map rechargeMap = userRecharges.stream().collect(Collectors.toMap(UserRecharge::getRechargeId, UserRecharge::getRechargeTitle)); + for (MongoBalanceFinanceDetailVO financeDetailVO : list) { + if (Objects.equals(financeDetailDTO.getPaySysType(), PaySysType.ALLINPAY.value())) { + financeDetailVO.setProdName("用户充值余额"); + } else { + String title = rechargeMap.get(financeDetailVO.getRechargeId()); + financeDetailVO.setProdName(Objects.nonNull(title) ? title : "用户充值余额"); + } + financeDetailVO.setShopId(Constant.PLATFORM_SHOP_ID); + financeDetailVO.setBizType(3); + financeDetailVO.setShopName(Constant.PLATFORM_SHOP_NAME); + } + } + + private Criteria getCriteria(FinanceDetailDTO financeDetailDTO) { + Criteria criteria = new Criteria(); + Integer paySysType = getPaySysType(); + criteria.and("type").is(1).and("isPayed").is(1).and("paySysType").is(paySysType); + if (Objects.nonNull(financeDetailDTO.getStartTime()) && Objects.nonNull(financeDetailDTO.getEndTime())) { + criteria.and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(financeDetailDTO.getStartTime()))) + .lte(Objects.requireNonNull(DateUtils.dateToIsoDate(financeDetailDTO.getEndTime()))); + } + if (Objects.nonNull(financeDetailDTO.getPayType()) && financeDetailDTO.getPayType() >= 0) { + criteria.and("payType").is(financeDetailDTO.getPayType()); + } + if (Objects.nonNull(financeDetailDTO.getOrderId())) { + // 不支持模糊查询 + criteria.and("_id").is(financeDetailDTO.getOrderId()); + } + return criteria; + } + + @Override + public List listFinanceDetail(FinanceDetailDTO financeDetailDTO) { + Criteria criteria = getCriteria(financeDetailDTO); + ProjectionOperation projectionOperation = Aggregation.project("payType", "payId", "userId", "rechargeId") + .and("createTime").as("transDate") + .and("createTime").as("placeTime") + .and("_id").as("orderId") + .and("changeBalance").as("transAmount") + .and("payId").as("payIds"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoBalanceFinanceDetailVO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation + ); + logger.info("listFinanceDetail()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoBalanceFinanceDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isNotEmpty(list)) { + // 补充数据 + setInfo(financeDetailDTO, list); + } + return BeanUtil.mapAsList(list, FinanceDetailExcelVO.class); + } + + @Override + public ShopAccountDetailVO getPlatformAccountDetail(Date startTime, Date endTime) { + Integer paySysType = getPaySysType(); + ShopAccountDetailVO levelInfo = userLevelLogMapper.getPlatformAccountDetail(startTime, endTime, paySysType); + if (Objects.isNull(levelInfo)) { + levelInfo = new ShopAccountDetailVO(); + } + // 开启通联支付后,余额充值不归为平台收入 + ShopAccountDetailVO balanceInfo; + if (Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + balanceInfo = new ShopAccountDetailVO(); + } else { + balanceInfo = getPlatformAccountDetail(startTime, endTime, paySysType); + } + if (Objects.isNull(balanceInfo)) { + balanceInfo = new ShopAccountDetailVO(); + } + ShopAccountDetailVO platformInfo = new ShopAccountDetailVO(); + platformInfo.setAlipayAmount(getDefaultValue(levelInfo.getAlipayAmount()) + getDefaultValue(balanceInfo.getAlipayAmount())); + platformInfo.setWechatAmount(getDefaultValue(levelInfo.getWechatAmount()) + getDefaultValue(balanceInfo.getWechatAmount())); + platformInfo.setBalanceAmount(getDefaultValue(levelInfo.getBalanceAmount()) + getDefaultValue(balanceInfo.getBalanceAmount())); + platformInfo.setScoreCount(0L); + platformInfo.setTotal(platformInfo.getAlipayAmount() + platformInfo.getWechatAmount() + platformInfo.getBalanceAmount()); + platformInfo.setShopId(Constant.PLATFORM_SHOP_ID); + platformInfo.setShopName(Constant.PLATFORM_SHOP_NAME); + return platformInfo; + } + + private ShopAccountDetailVO getPlatformAccountDetail(Date startTime, Date endTime, Integer paySysType) { + Criteria criteria = new Criteria(); + criteria.and("type").is(1).and("isPayed").is(1).and("paySysType").is(paySysType); + filterTime(startTime, endTime, criteria); + ProjectionOperation projectionOperation = Aggregation.project() + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$changeBalance").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$changeBalance").otherwise(0)).as("alipayAmount"); + GroupOperation groupOperation = Aggregation.group() + .sum("wechatAmount").as("wechatAmount") + .sum("alipayAmount").as("alipayAmount"); + ProjectionOperation project = Aggregation.project("wechatAmount", "alipayAmount"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoBalanceShopAccountDetailVO.class, + projectionOperation, + groupOperation, + project + ); + logger.info("getPlatformAccountDetail()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoBalanceShopAccountDetailVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ShopAccountDetailVO(); + } + ShopAccountDetailVO shopAccountDetailVO = BeanUtil.map(list.get(0), ShopAccountDetailVO.class); + shopAccountDetailVO.setBalanceAmount(0L); + return shopAccountDetailVO; + } + + private static void filterTime(Date startTime, Date endTime, Criteria criteria) { + if (Objects.nonNull(startTime) && Objects.nonNull(endTime)) { + criteria.and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))) + .lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } else if (Objects.nonNull(startTime)) { + criteria.and("createTime").gte(Objects.requireNonNull(DateUtils.dateToIsoDate(startTime))); + } else if (Objects.nonNull(endTime)){ + criteria.and("createTime").lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endTime))); + } + } + + @Override + public List listPayInfoVO(Date startTime, Date endTime) { + Integer paySysType = getPaySysType(); + Criteria criteria = new Criteria(); + criteria.and("type").is(1).and("isPayed").is(1).and("paySysType").is(paySysType); + filterTime(startTime, endTime, criteria); + ProjectionOperation projectionOperation = Aggregation.project("payId", "payType", "createTime") + .and("_id").as("orderIds") + .and("changeBalance").as("payAmount") + .and("createTime").as("payTime") + .and(ConditionalOperators.when(Criteria.where("payType").in(1, 3, 4, 5, 8)).then("$changeBalance").otherwise(0)).as("wechatAmount") + .and(ConditionalOperators.when(Criteria.where("payType").in(2, 6, 7)).then("$changeBalance").otherwise(0)).as("alipayAmount"); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoBalanceUserPayInfoVO.class, + Aggregation.match(criteria), + projectionOperation, + sortOperation + ); + logger.info("listPayInfoVO()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoBalanceUserPayInfoVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(); + } + List resList = BeanUtil.mapAsList(list, UserPayInfoVO.class); + for (UserPayInfoVO userPayInfoVO : resList) { + userPayInfoVO.setPayEntry(1); + userPayInfoVO.setBalanceAmount(0L); + userPayInfoVO.setScoreCount(0L); + userPayInfoVO.setShopId(Constant.PLATFORM_SHOP_ID); + userPayInfoVO.setShopName(Constant.PLATFORM_SHOP_NAME); + } + return resList; + } + + @Override + public PageVO pagePayInfoVO(Date startTime, Date endTime, PageDTO pageDTO) { + Integer paySysType = getPaySysType(); + PageVO pageVO = new PageVO<>(); + List list = listPayInfoVO(startTime, endTime); + // 总条数 + Criteria criteria = new Criteria(); + criteria.and("type").is(1).and("isPayed").is(1).and("paySysType").is(paySysType); + filterTime(startTime, endTime, criteria); + TypedAggregation aggregation = Aggregation.newAggregation( + MongoBalanceFinanceDetailVO.class, + Aggregation.match(criteria) + ); + AggregationResults aggregate = mongoTemplate.aggregate(aggregation, MongoBalanceFinanceDetailVO.class); + List mappedResults = aggregate.getMappedResults(); + pageVO.setTotal((long) mappedResults.size()); + pageVO.setPages(PageUtil.getPages(mappedResults.size(), pageDTO.getPageSize())); + pageVO.setList(list); + return pageVO; + } + + @Override + public MongoUserBalanceLogBO getByPayIdAndType(Long payId, Integer rechargeType) { + Query query = new Query(Criteria.where("payId").is(payId).and("rechargeType").is(rechargeType).and("isPayed").is(0)); + List list = mongoTemplate.find(query, MongoUserBalanceLogBO.class); + if (CollUtil.isEmpty(list)) { + throw new LuckException("余额记录日志不存在"); + } + MongoUserBalanceLogBO userBalanceLogBO = list.get(0); + return userBalanceLogBO; + } + + @Override + public void initUserBalanceLogToMongodb() { + int start = 0; + int size = 10000; + mongoTemplate.remove(MongoUserBalanceLogBO.class); + while (true) { + // 批量以10000条处理 + List userBalanceLogs = userBalanceLogMapper.listToMongodb(start, size); + if (CollUtil.isEmpty(userBalanceLogs)) { + break; + } + List mongoUserBalanceLogs = BeanUtil.mapAsList(userBalanceLogs, MongoUserBalanceLogBO.class); + mongoTemplate.insertAll(mongoUserBalanceLogs); + if (userBalanceLogs.size() <= size) { + break; + } + start = start + size; + } + } + + @Override + public List listUserIdByRechargeAmount(Integer isPayed, Date startDate, Date endDate, Long minAmount, Long maxAmount) { + Criteria criteria = new Criteria(); + criteria.and("isPayed").is(isPayed) + .and("type").is(1) + .and("changeBalance").gte(minAmount).lte(maxAmount); + filterTime(startDate, endDate, criteria); + // 分组 + GroupOperation groupOperation = Aggregation.group("userId") + .first("userId").as("userId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoUserBalanceLogBO.class, + Aggregation.match(criteria), + groupOperation + ); + logger.info("listUserIdByRechargeAmount()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoUserBalanceLogBO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(); + } + return list.stream().map(MongoUserBalanceLogBO::getUserId).collect(Collectors.toList()); + } + + @Override + public List listUserIdByRechargeNum(Integer isPayed, Date startDate, Date endDate, Long minNum, Long maxNum) { + Criteria criteria = new Criteria(); + criteria.and("isPayed").is(isPayed) + .and("type").is(1); + filterTime(startDate, endDate, criteria); + // 分组 + GroupOperation groupOperation = Aggregation.group("userId") + .count().as("userNum"); + ProjectionOperation projectionOperation = Aggregation.project().and("_id").as("userId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoUserBalanceLogBO.class, + Aggregation.match(criteria), + groupOperation, + Aggregation.match(Criteria.where("userNum").gte(minNum).lte(maxNum)), + projectionOperation + ); + logger.info("listUserIdByRechargeNum()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoUserBalanceLogBO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(); + } + return list.stream().map(MongoUserBalanceLogBO::getUserId).collect(Collectors.toList()); + } + + @Override + public List setUserInfo(List userList) { + List userIds = userList.stream().map(UserManagerVO::getUserId).collect(Collectors.toList()); + if (CollUtil.isEmpty(userIds)) { + return userList; + } + Criteria criteria = new Criteria(); + criteria.and("userId").in(userIds).and("ioType").is(1).and("type").is(1).and("isPayed").is(1); + SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC, "createTime"); + GroupOperation groupOperation = Aggregation.group("userId") + .first("createTime").as("reConsTime") + .sum("changeBalance").as("rechargeAmount") + .count().as("rechargeTimes"); + ProjectionOperation projectionOperation = Aggregation.project("reConsTime", "rechargeAmount", "rechargeTimes") + .and("_id").as("userId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoBalanceUserManagerVO.class, + Aggregation.match(criteria), + sortOperation, + groupOperation, + projectionOperation + ); + logger.info("setUserInfo()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoBalanceUserManagerVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + userList.forEach(user -> { + user.setRechargeAmount(PriceUtil.toDecimalPrice(0L)); + user.setRechargeTimes(0); + }); + return userList; + } + Map userMap = list.stream().collect(Collectors.toMap(MongoBalanceUserManagerVO::getUserId, u -> u)); + for (UserManagerVO userManagerVO : userList) { + MongoBalanceUserManagerVO info = Objects.nonNull(userMap.get(userManagerVO.getUserId())) ? userMap.get(userManagerVO.getUserId()) : new MongoBalanceUserManagerVO(); + userManagerVO.setReConsTime(info.getReConsTime()); + userManagerVO.setRechargeAmount(PriceUtil.toDecimalPrice(info.getRechargeAmount())); + userManagerVO.setRechargeTimes(info.getRechargeTimes()); + } + return userList; + } + + private Long getDefaultValue(Long value) { + if (Objects.isNull(value)) { + return 0L; + } + return value; + } + + private Integer getPaySysType() { + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + return paySettlementConfigVO.getPaySettlementType(); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserConsigneeServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserConsigneeServiceImpl.java new file mode 100644 index 0000000..61d99a8 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserConsigneeServiceImpl.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.user.mapper.UserConsigneeMapper; +import com.tmerclub.cloud.user.model.UserConsignee; +import com.tmerclub.cloud.user.service.UserConsigneeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +/** + * 用户提货人信息 + * + * @author FrozenWatermelon + * @date 2020-12-15 17:18:56 + */ +@Service +public class UserConsigneeServiceImpl implements UserConsigneeService { + + @Autowired + private UserConsigneeMapper userConsigneeMapper; + + @Override + @Cacheable(cacheNames = UserCacheNames.USER_DEFAULT_CONSIGNEE, key = "#userId") + public UserConsignee getByUserId(Long userId) { + return userConsigneeMapper.getByUserId(userId); + } + + @Override + @CacheEvict(cacheNames = UserCacheNames.USER_DEFAULT_CONSIGNEE, key = "#userConsignee.userId") + public void save(UserConsignee userConsignee) { + userConsigneeMapper.save(userConsignee); + } + + @Override + @CacheEvict(cacheNames = UserCacheNames.USER_DEFAULT_CONSIGNEE, key = "#userConsignee.userId") + public void update(UserConsignee userConsignee) { + userConsigneeMapper.update(userConsignee); + } + + @Override + public void deleteByUserId(Long userId) { + userConsigneeMapper.deleteByUserId(userId); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserGrowthLogServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserGrowthLogServiceImpl.java new file mode 100644 index 0000000..8c12bbe --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserGrowthLogServiceImpl.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.mapper.UserGrowthLogMapper; +import com.tmerclub.cloud.user.model.UserGrowthLog; +import com.tmerclub.cloud.user.service.UserGrowthLogService; +import com.tmerclub.cloud.user.vo.UserGrowthLogVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户成长值记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserGrowthLogServiceImpl implements UserGrowthLogService { + + @Autowired + private UserGrowthLogMapper userGrowthLogMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userGrowthLogMapper.list()); + } + + + @Override + public UserGrowthLog getByLogId(Long logId) { + return userGrowthLogMapper.getByLogId(logId); + } + + @Override + public void save(UserGrowthLog userGrowthLog) { + userGrowthLogMapper.save(userGrowthLog); + } + + @Override + public void update(UserGrowthLog userGrowthLog) { + userGrowthLogMapper.update(userGrowthLog); + } + + @Override + public void deleteById(Long logId) { + userGrowthLogMapper.deleteById(logId); + } + + @Override + public void saveBatch(List userGrowthLogs) { + userGrowthLogMapper.saveBatch(userGrowthLogs); + } + + @Override + public PageVO getPageByUserId(PageDTO pageDTO, Long userId) { + return PageUtil.doPage(pageDTO, () -> userGrowthLogMapper.getPageByUserId(userId)); + } + + @Override + public UserGrowthLog getByBizId(Long bizId, Integer ioType) { + return userGrowthLogMapper.getByBizId(bizId, ioType); + } + + @Override + public void deleteByUserId(Long userId) { + userGrowthLogMapper.deleteByUserId(userId); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelLogServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelLogServiceImpl.java new file mode 100644 index 0000000..4616321 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelLogServiceImpl.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import com.tmerclub.cloud.api.payment.vo.PaySettlementConfigVO; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO; +import com.tmerclub.cloud.api.user.vo.FinanceDetailVO; +import com.tmerclub.cloud.api.user.vo.UserApiVO; +import com.tmerclub.cloud.api.user.vo.UserPayInfoVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.dto.UserLevelLogDTO; +import com.tmerclub.cloud.user.mapper.UserLevelLogMapper; +import com.tmerclub.cloud.user.model.UserLevelLog; +import com.tmerclub.cloud.user.service.UserLevelLogService; +import com.tmerclub.cloud.user.vo.UserLevelLogVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 用户等级记录 + * + * @author FrozenWatermelon + * @date 2021-05-14 11:04:52 + */ +@Service +public class UserLevelLogServiceImpl implements UserLevelLogService { + + @Autowired + private UserLevelLogMapper userLevelLogMapper; + @DubboReference + private ConfigFeignClient configFeignClient; + + @Override + public PageVO pageBuyLevelLog(PageDTO pageDTO, UserLevelLogDTO userLevelLogDTO) { + return PageUtil.doPage(pageDTO, () -> userLevelLogMapper.pageBuyLevelLog(userLevelLogDTO)); + } + + @Override + public UserLevelLog getByLevelLogId(Long levelLogId) { + return userLevelLogMapper.getByLevelLogId(levelLogId); + } + + @Override + public void save(UserLevelLog userLevelLog) { + userLevelLogMapper.save(userLevelLog); + } + + @Override + public void update(UserLevelLog userLevelLog) { + userLevelLogMapper.update(userLevelLog); + } + + @Override + public void deleteById(Long levelLogId) { + userLevelLogMapper.deleteById(levelLogId); + } + + @Override + public void batchSaveUserLevelLogs(List userLevelLogs) { + userLevelLogMapper.batchSaveUserLevelLogs(userLevelLogs); + } + + @Override + public Integer getMaxLevelByUserId(Long userId) { + return userLevelLogMapper.getMaxLevelByUserId(userId); + } + + @Override + public int updateToSuccess(Long levelLogId, Long payId, Integer payType) { + return userLevelLogMapper.updateToSuccess(levelLogId, payId, payType); + } + + @Override + public void deleteByUserId(Long userId) { + userLevelLogMapper.deleteByUserId(userId); + } + + @Override + public UserApiVO getUserTypeAndUserNameAtTime(Long userId, Date createTime) { + UserApiVO userVO = userLevelLogMapper.getUserTypeAtTime(userId, createTime); + if (Objects.isNull(userVO)) { + userVO = new UserApiVO(); + } + if (Objects.isNull(userVO.getLevelType())) { + userVO.setLevelType(LevelTypeEnum.ORDINARY_USER.value()); + } + return userVO; + } + + @Override + public PageVO pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO) { + return PageUtil.doPage(pageDTO, () -> userLevelLogMapper.listFinanceDetail(financeDetailDTO)); + } + + @Override + public List listFinanceDetail(FinanceDetailDTO financeDetailDTO) { + return BeanUtil.mapAsList(userLevelLogMapper.listFinanceDetail(financeDetailDTO), FinanceDetailExcelVO.class); + } + + @Override + public List listPayInfoVO(Date startTime, Date endTime) { + Integer paySysType = getPaySysType(); + return userLevelLogMapper.listPayInfo(startTime, endTime, paySysType); + } + + private Integer getPaySysType() { + ServerResponseEntity configResponse = configFeignClient.getConfig(Constant.PAY_SETTLEMENT_CONFIG); + if (!configResponse.isSuccess()) { + throw new LuckException(ResponseEnum.EXCEPTION); + } + PaySettlementConfigVO paySettlementConfigVO = Json.parseObject(configResponse.getData(), PaySettlementConfigVO.class); + return paySettlementConfigVO.getPaySettlementType(); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelRightsServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelRightsServiceImpl.java new file mode 100644 index 0000000..ff70808 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelRightsServiceImpl.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.tmerclub.cloud.user.mapper.UserLevelRightsMapper; +import com.tmerclub.cloud.user.model.UserLevel; +import com.tmerclub.cloud.user.service.UserLevelRightsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 等级-权益关联信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserLevelRightsServiceImpl implements UserLevelRightsService { + + @Autowired + private UserLevelRightsMapper userLevelRightsMapper; + + @Override + public void save(Long userLevelId, List rightIds) { + if (CollectionUtil.isEmpty(rightIds)) { + return; + } + userLevelRightsMapper.saveBatch(userLevelId, rightIds); + } + + @Override + public void update(Long userLevelId, List rightIds) { + userLevelRightsMapper.deleteByUserLevelId(userLevelId); + if (CollUtil.isNotEmpty(rightIds)) { + save(userLevelId, rightIds); + } + } + + @Override + public void deleteByUserLevelId(Long userLevelId) { + userLevelRightsMapper.deleteByUserLevelId(userLevelId); + } + + @Override + public List listUserLevelIdByRightId(Long rightId) { + return userLevelRightsMapper.listUserLevelIdByRightId(rightId); + } + + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelTermServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelTermServiceImpl.java new file mode 100644 index 0000000..a99a259 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserLevelTermServiceImpl.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.dto.UserLevelTermDTO; +import com.tmerclub.cloud.user.mapper.UserLevelTermMapper; +import com.tmerclub.cloud.user.model.UserLevelTerm; +import com.tmerclub.cloud.user.service.UserLevelTermService; +import com.tmerclub.cloud.user.vo.UserLevelTermVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +@Service +public class UserLevelTermServiceImpl implements UserLevelTermService { + + @Autowired + private UserLevelTermMapper userLevelTermMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userLevelTermMapper.list()); + } + + @Override + public UserLevelTerm getByLevelTermId(Long levelTermId) { + return userLevelTermMapper.getByLevelTermId(levelTermId); + } + + @Override + public void updateBatch(Long userLevelId, List userLevelTermDTO) { + List userLevelTermIdsDb = userLevelTermDTO.stream().map(UserLevelTermDTO::getLevelTermId).collect(Collectors.toList()); + List updateList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List saveList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userLevelTermIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserLevelTermDTO levelTermDTO : userLevelTermDTO) { + UserLevelTerm userLevelTerm = BeanUtil.map(levelTermDTO, UserLevelTerm.class); + userLevelTerm.setUserLevelId(userLevelId); + if (userLevelTerm.getLevelTermId() != null && userLevelTermIdsDb.contains(userLevelTerm.getLevelTermId())) { + if (Objects.nonNull(userLevelTerm.getTermType()) || Objects.nonNull(userLevelTerm.getNeedAmount())) { + updateList.add(userLevelTerm); + } + userLevelTermIds.add(userLevelTerm.getLevelTermId()); + continue; + } + saveList.add(userLevelTerm); + } + //保存新增 + if (CollUtil.isNotEmpty(saveList)) { + saveBatch(userLevelId, saveList); + } + //更新 + if (CollUtil.isNotEmpty(updateList)) { + for (UserLevelTerm userLevelTerm : updateList) { + if (userLevelTerm.getTermType() != null) { + userLevelTermMapper.update(userLevelTerm); + } + } + } + //删除 + userLevelTermIdsDb.removeAll(userLevelTermIds); + if (CollUtil.isNotEmpty(userLevelTermIdsDb)) { + userLevelTermMapper.deleteBatch(userLevelTermIdsDb); + } + } + + @Override + public void saveBatch(Long userLevelId, List userLevelTerms) { + if (CollUtil.isEmpty(userLevelTerms)) { + return; + } + for (UserLevelTerm userLevelTerm : userLevelTerms) { + if (Objects.isNull(userLevelTerm.getLevelTermId())) { + userLevelTerm.setLevelTermId(Constant.DEFAULT_ID); + } + if (userLevelTerm.getTermType() != null) { + userLevelTermMapper.save(userLevelTerm); + } + } + // userLevelTermMapper.saveBatch(userLevelTerms); + } + + @Override + public void save(UserLevelTerm userLevelTerm) { + userLevelTermMapper.save(userLevelTerm); + } + + @Override + public void update(UserLevelTerm userLevelTerm) { + userLevelTermMapper.update(userLevelTerm); + } + + @Override + public void deleteById(Long levelTermId) { + userLevelTermMapper.deleteById(levelTermId); + } + + @Override + public void deleteBatch(Long userLevelId) { + List userLevelTerms = userLevelTermMapper.getListByUserLevelId(userLevelId); + List levelTermIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserLevelTerm userLevelTerm : userLevelTerms) { + levelTermIds.add(userLevelTerm.getLevelTermId()); + } + userLevelTermMapper.deleteBatch(levelTermIds); + } + + @Override + public List getListByUserLevelId(Long userLevelId) { + return userLevelTermMapper.getListByUserLevelId(userLevelId); + } + + @Override + public List getAmountAndTypeByUserLevelId(Long userLevelId) { + return userLevelTermMapper.getAmountAndTypeByUserLevelId(userLevelId); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRechargeCouponServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRechargeCouponServiceImpl.java new file mode 100644 index 0000000..b78f175 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRechargeCouponServiceImpl.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.Lists; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.dto.RechargeCouponDTO; +import com.tmerclub.cloud.user.mapper.UserRechargeCouponMapper; +import com.tmerclub.cloud.user.model.UserRechargeCoupon; +import com.tmerclub.cloud.user.service.UserRechargeCouponService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * 余额优惠券关联表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +@Service +public class UserRechargeCouponServiceImpl implements UserRechargeCouponService { + + @Autowired + private UserRechargeCouponMapper userRechargeCouponMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userRechargeCouponMapper.list()); + } + + @Override + public UserRechargeCoupon getByRechargeId(Long rechargeId) { + return userRechargeCouponMapper.getByRechargeId(rechargeId); + } + + @Override + public void save(UserRechargeCoupon userRechargeCoupon) { + userRechargeCouponMapper.save(userRechargeCoupon); + } + + @Override + public void update(UserRechargeCoupon userRechargeCoupon) { + userRechargeCouponMapper.update(userRechargeCoupon); + } + + @Override + public void deleteById(Long rechargeId) { + userRechargeCouponMapper.deleteById(rechargeId); + } + + @Override + public void insertBatch(Long rechargeId, List couponList) { + List userRechargeCouponList = Lists.newArrayList(); + for (RechargeCouponDTO coupon : couponList) { + UserRechargeCoupon rechargeCoupon = new UserRechargeCoupon(); + rechargeCoupon.setRechargeId(rechargeId); + rechargeCoupon.setCouponId(coupon.getCouponId()); + rechargeCoupon.setCouponNum(coupon.getCouponNum()); + userRechargeCouponList.add(rechargeCoupon); + } + userRechargeCouponMapper.saveBatch(userRechargeCouponList); + } + + @Override + public void removeByRechargeIdAndCouponId(Long rechargeId, Set couponIdList) { + userRechargeCouponMapper.removeByRechargeIdAndCouponId(rechargeId, couponIdList); + } + + @Override + public void updateBatchByCoupons(Long rechargeId, List updateList) { + List couponList = BeanUtil.mapAsList(updateList, UserRechargeCoupon.class); + userRechargeCouponMapper.updateBatchByCoupons(rechargeId, couponList); + } + + @Override + public void cancelBindingCoupons(List couponIds) { + List rechargeIds = userRechargeCouponMapper.listRechargeIdByCouponIds(couponIds); + if (CollUtil.isEmpty(rechargeIds)) { + return; + } + userRechargeCouponMapper.removeByCouponIds(couponIds); + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 清除余额充值模板缓存 + for (Long rechargeId : rechargeIds) { + keys.add(CacheNames.USER_RECHARGE_INFO + CacheNames.UNION + rechargeId); + } + keys.add(CacheNames.USER_RECHARGE_LIST); + RedisUtil.deleteBatch(keys); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRechargeServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRechargeServiceImpl.java new file mode 100644 index 0000000..dee14db --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRechargeServiceImpl.java @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.google.common.collect.Lists; +import com.tmerclub.cloud.api.coupon.bo.CouponGiveBO; +import com.tmerclub.cloud.api.coupon.bo.CouponIdAndCountBO; +import com.tmerclub.cloud.api.coupon.feign.CouponFeignClient; +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.api.payment.constant.PaySysType; +import com.tmerclub.cloud.api.platform.feign.ConfigFeignClient; +import com.tmerclub.cloud.api.user.bo.RechargeNotifyBO; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.rocketmq.config.RocketMqConstant; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.common.util.PrincipalUtil; +import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.*; +import com.tmerclub.cloud.user.dto.RechargeCouponDTO; +import com.tmerclub.cloud.user.dto.UserAdminDTO; +import com.tmerclub.cloud.user.dto.UserRechargeDTO; +import com.tmerclub.cloud.user.mapper.UserGrowthLogMapper; +import com.tmerclub.cloud.user.mapper.UserRechargeMapper; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.model.UserGrowthLog; +import com.tmerclub.cloud.user.model.UserRecharge; +import com.tmerclub.cloud.user.service.*; +import com.tmerclub.cloud.user.vo.UserRechargeVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 余额充值级别表 + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +@Service +public class UserRechargeServiceImpl implements UserRechargeService { + + @Autowired + private UserRechargeMapper userRechargeMapper; + @Autowired + private UserExtensionService userExtensionService; + @Autowired + private UserBalanceLogService userBalanceLogService; + @DubboReference + private CouponFeignClient couponFeignClient; + @Autowired + private UserRechargeCouponService userRechargeCouponService; + @Autowired + private RocketMQTemplate couponGiveTemplate; + @Autowired + private UserGrowthLogMapper userGrowthLogMapper; + @Autowired + private UserScoreLogService userScoreLogService; + @DubboReference + private ConfigFeignClient configFeignClient; + @Autowired + private SegmentManager segmentManager; + @Autowired + private RocketMQTemplate addUserBalanceLogTemplate; + @Autowired + private RocketMQTemplate addUserScoreLogTemplate; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userRechargeMapper.list()); + } + + @Override + @Cacheable(cacheNames = CacheNames.USER_RECHARGE_INFO, key = "#rechargeId") + public UserRechargeVO getRechargeInfo(Long rechargeId) { + return userRechargeMapper.getRechargeInfo(rechargeId); + } + + @Override + @CacheEvict(cacheNames = CacheNames.USER_RECHARGE_LIST, allEntries = true) + public void save(UserRecharge userRecharge) { + userRechargeMapper.save(userRecharge); + } + + @Override + public void update(UserRecharge userRecharge) { + userRechargeMapper.update(userRecharge); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(Long rechargeId) { + userRechargeMapper.deleteById(rechargeId); + userRechargeCouponService.deleteById(rechargeId); + } + + @Override + @Cacheable(cacheNames = CacheNames.USER_RECHARGE_LIST) + public List list() { + List list = userRechargeMapper.list(); + List couponIds = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserRechargeVO userRechargeVO : list) { + List couponList = userRechargeVO.getCouponList(); + if (CollUtil.isNotEmpty(couponList)) { + couponIds.addAll(couponList.stream().map(CouponDataVO::getCouponId).collect(Collectors.toList())); + } + } + if (CollUtil.isNotEmpty(couponIds)) { + ServerResponseEntity> couponEntity = couponFeignClient.getCouponListByCouponIds(couponIds); + if (!couponEntity.isSuccess()) { + throw new LuckException(couponEntity.getMsg()); + } + List couponDataVOList = couponEntity.getData(); + Map couponMap = couponDataVOList.stream().collect(Collectors.toMap(CouponDataVO::getCouponId, CouponDataVO::getCouponName)); + for (UserRechargeVO userRechargeVO : list) { + userRechargeVO.setCouponTotalNum(userRechargeVO.getCouponList().size()); + for (CouponDataVO couponDataVO : userRechargeVO.getCouponList()) { + Long couponId = couponDataVO.getCouponId(); + if (couponMap.containsKey(couponId)) { + couponDataVO.setCouponName(couponMap.get(couponId)); + } + } + } + } + return list; + } + + @Override + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.USER_RECHARGE_LIST, allEntries = true), + @CacheEvict(cacheNames = CacheNames.USER_RECHARGE_INFO, key = "#rechargeId")}) + public void removeCacheByRechargeId(Long rechargeId) { + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean batchUpdateUserBalance(UserAdminDTO userAdminDTO) { + Integer paySysType = configFeignClient.getPaySysType().getData(); + if (Objects.equals(paySysType, PaySysType.ALLINPAY.value())) { + throw new LuckException("通联支付不支持手动修改余额"); + } + BigDecimal balance = userAdminDTO.getBalanceValue(); + if (!PrincipalUtil.isMaximumOfTwoDecimal(balance.toString())) { + throw new LuckException("最多是保留两位小数的数值"); + } + // 将元转为分 + long balanceValue = PriceUtil.toLongCent(balance); + List userIds = userAdminDTO.getUserIds(); + if (Objects.equals(0L, balanceValue) || CollUtil.isEmpty(userIds)) { + return false; + } + DateTime now = DateUtil.date(); + // 批量给用户充值 + List extensions = userExtensionService.getByUserIdsAndLevelType(userIds); + List userIdsUpdate = extensions.stream().map(UserExtension::getUserId).collect(Collectors.toList()); + List userBalanceLogs = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userBalanceLogIds = segmentManager.listSegmentId(DistributedIdKey.MALL4CLOUD_USER_BALANCE_LOG, extensions.size()); + int index = 0; + for (UserExtension extension : extensions) { + if (Objects.isNull(extension)) { + continue; + } + // 用户改变的余额数值 + long changeBalance = balanceValue; + long totalBalance = Objects.nonNull(extension.getActualBalance()) ? extension.getActualBalance() : 0L; + int compare = Long.compare(PriceUtil.MAX_CENT - extension.getBalance(), balanceValue); + // 用户余额的balance的最大值为Long.MAX_VALUE,当用户余额 + 新增余额达到这个值的时候,用户将不能在继续充值了 + if (compare < 0 && userIds.size() == 1) { + throw new LuckException("当前用户余额已达到最大限额,剩余可充值余额为:" + PriceUtil.toDecimalPrice(PriceUtil.MAX_CENT - extension.getBalance())); + } else if (compare < 0 && userIds.size() > 1) { + continue; + } + long userBalance = totalBalance + balanceValue; + if (userBalance < 0) { + //修改后的金额 < 0 ,那么减少的金额就是用户原本的余额 + changeBalance = totalBalance; + } else if (userBalance > Constant.MAX_USER_BALANCE) { + changeBalance = Constant.MAX_USER_BALANCE - totalBalance; + } + // 添加日志 + MongoUserBalanceLogBO userBalanceLog = new MongoUserBalanceLogBO(); + userBalanceLog.setBalanceLogId(userBalanceLogIds.get(index)); + userBalanceLog.setUserId(extension.getUserId()); + userBalanceLog.setChangeBalance(Math.abs(changeBalance)); + userBalanceLog.setPaySysType(PaySysType.DEFAULT.value()); + userBalanceLog.setIoType(balanceValue > 0 ? RechargeIoTypeEnum.INCOME.value() : RechargeIoTypeEnum.EXPENDITURE.value()); + userBalanceLog.setType(RechargeTypeEnum.SYSTEM.value()); + userBalanceLogs.add(userBalanceLog); + index++; + } + if (CollUtil.isEmpty(userIdsUpdate)) { + return false; + } + userExtensionService.updateBatchUserBalanceByUserIds(userIdsUpdate, balanceValue, now); + userBalanceLogService.saveBatchToMongodb(userBalanceLogs); + return true; + } + + @Override + public UserRechargeVO getRechargeByRechargeId(Long rechargeId, Integer putOnStatus) { + if (Objects.isNull(userRechargeMapper.getByRechargeId(rechargeId))) { + throw new LuckException("数据状态错误,请刷新重试"); + } + UserRechargeVO userRechargeVO = getRechargeInfo(rechargeId); + List couponDataList = userRechargeVO.getCouponList(); + if (CollUtil.isEmpty(couponDataList)) { + return userRechargeVO; + } + List couponIds = couponDataList.stream().map(CouponDataVO::getCouponId).collect(Collectors.toList()); + // 查询优惠券信息 + ServerResponseEntity> couponResponse = couponFeignClient.getCouponListByCouponIdsAndPutOnStatus(couponIds, putOnStatus); + if (!Objects.equals(couponResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(couponResponse.getMsg()); + } + List couponDataVOList = couponResponse.getData(); + if (CollUtil.isEmpty(couponDataVOList)) { + return userRechargeVO; + } + Map couponDataMap = couponDataList.stream().collect(Collectors.toMap(CouponDataVO::getCouponId, (k) -> k)); + for (CouponDataVO couponDataVO : couponDataVOList) { + CouponDataVO dataVO = couponDataMap.get(couponDataVO.getCouponId()); + couponDataVO.setCouponNum(dataVO.getCouponNum()); + } + userRechargeVO.setCouponList(couponDataVOList); + return userRechargeVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(cacheNames = CacheNames.USER_RECHARGE_LIST, allEntries = true) + public void saveRecharge(UserRechargeDTO userRechargeDTO) { + UserRecharge userRecharge = BeanUtil.map(userRechargeDTO, UserRecharge.class); + userRechargeMapper.save(userRecharge); + if (CollUtil.isEmpty(userRechargeDTO.getCouponList())) { + return; + } + userRechargeCouponService.insertBatch(userRecharge.getRechargeId(), userRechargeDTO.getCouponList()); + } + + @Override + public void updateByRechargeId(UserRechargeDTO userRechargeDTO) { + if (Objects.isNull(userRechargeMapper.getByRechargeId(userRechargeDTO.getRechargeId()))) { + throw new LuckException("数据状态错误,请刷新重试"); + } + UserRecharge userRecharge = BeanUtil.map(userRechargeDTO, UserRecharge.class); + userRechargeMapper.update(userRecharge); + UserRechargeVO userRechargeDb = getRechargeByRechargeId(userRecharge.getRechargeId(), null); + Map mapByCouponId = userRechargeDb.getCouponList().stream().collect(Collectors.toMap(CouponDataVO::getCouponId, c -> c)); + List addCoupon = Lists.newArrayList(); + if (CollUtil.isEmpty(userRechargeDTO.getCouponList()) && CollUtil.isNotEmpty(userRechargeDb.getCouponList())) { + // 之前赠送优惠券,更新为不赠送优惠券 + userRechargeCouponService.deleteById(userRecharge.getRechargeId()); + } else if (CollUtil.isEmpty(userRechargeDb.getCouponList()) && CollUtil.isNotEmpty(userRechargeDTO.getCouponList())) { + // 之前不赠送优惠券,更新为赠送优惠券 + userRechargeCouponService.insertBatch(userRechargeDTO.getRechargeId(), userRechargeDTO.getCouponList()); + } else { + //筛选需要删除的优惠券. + Set couponIdList = mapByCouponId.keySet(); + List updateList = Lists.newArrayList(); + + for (RechargeCouponDTO couponDto : userRechargeDTO.getCouponList()) { + if (!couponIdList.contains(couponDto.getCouponId())) { + addCoupon.add(couponDto); + continue; + } + CouponDataVO couponDb = mapByCouponId.get(couponDto.getCouponId()); + if (Objects.equals(couponDto.getCouponNum(), couponDb.getCouponNum())) { + couponIdList.remove(couponDto.getCouponId()); + continue; + } + updateList.add(couponDto); + couponIdList.remove(couponDto.getCouponId()); + } + if (CollUtil.isNotEmpty(couponIdList)) { + userRechargeCouponService.removeByRechargeIdAndCouponId(userRechargeDTO.getRechargeId(), couponIdList); + } + if (CollUtil.isNotEmpty(addCoupon)) { + userRechargeCouponService.insertBatch(userRechargeDTO.getRechargeId(), addCoupon); + } + if (CollUtil.isNotEmpty(updateList)) { + userRechargeCouponService.updateBatchByCoupons(userRechargeDTO.getRechargeId(), updateList); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void rechargeSuccess(RechargeNotifyBO message) { + Long balanceLogId = message.getBalanceLogId(); + MongoUserBalanceLogBO userBalanceLogDb = userBalanceLogService.getByBalanceLogId(balanceLogId); + if (Objects.equals(userBalanceLogDb.getIsPayed(), 1)) { + return; + } + Long rechargeId = userBalanceLogDb.getRechargeId(); + UserRechargeVO userRechargeVO = null; + if (Objects.nonNull(rechargeId)) { + userRechargeVO = getRechargeInfo(rechargeId); + } + // 更新支付状态 + userBalanceLogService.updateToSuccess(balanceLogId, message.getPayId(), message.getPayType()); + List couponGiveList = null; + if (userRechargeVO != null + && Objects.equals(userBalanceLogDb.getPaySysType(), PaySysType.DEFAULT.value())) { + // 只有默认支付才能享受充值优惠,增加成长值、积分、余额 + userExtensionService.updateByUserRecharge(userRechargeVO, userBalanceLogDb); + couponGiveList = userRechargeVO.getCouponList(); + addPreLog(userBalanceLogDb, userRechargeVO); + } else { + // 更新用户余额 + userExtensionService.addByUserBalanceLog(userBalanceLogDb); + } + + // 没有赠送优惠券,则返回 + if (CollectionUtil.isEmpty(couponGiveList)) { + return; + } + // 处理赠送优惠券 + CouponGiveBO couponGiveBO = new CouponGiveBO(); + + List couponInfos = new ArrayList<>(Constant.INITIAL_CAPACITY); + + + for (CouponDataVO couponDataVO : couponGiveList) { + CouponIdAndCountBO couponIdAndCountBO = new CouponIdAndCountBO(); + couponIdAndCountBO.setCouponId(couponDataVO.getCouponId()); + couponIdAndCountBO.setCount(couponDataVO.getCouponNum()); + couponInfos.add(couponIdAndCountBO); + } + couponGiveBO.setUserId(userBalanceLogDb.getUserId()); + couponGiveBO.setBizId(userBalanceLogDb.getBalanceLogId()); + // 充值送优惠券 + couponGiveBO.setBizType(0); + couponGiveBO.setCouponInfos(couponInfos); + // 发送消息,赠送优惠券 + SendStatus sendStatus = couponGiveTemplate.syncSend(RocketMqConstant.COUPON_GIVE_TOPIC, new GenericMessage<>(couponGiveBO)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + + /** + * 添加余额充值赠送的余额、积分、成长值记录 + * + * @param userBalanceLogDb + * @param userRechargeVO + */ + private void addPreLog(MongoUserBalanceLogBO userBalanceLogDb, UserRechargeVO userRechargeVO) { + // 添加成长值赠送记录 + if (userRechargeVO.getPresGrowth() > 0) { + UserGrowthLog userGrowthLog = new UserGrowthLog(); + userGrowthLog.setUserId(userBalanceLogDb.getUserId()); + userGrowthLog.setSource(GrowthLogSourceEnum.BALANCE.value()); + userGrowthLog.setBizId(userBalanceLogDb.getBalanceLogId()); + userGrowthLog.setChangeGrowth(userRechargeVO.getPresGrowth()); + userGrowthLog.setRemarks("余额充值赠送的成长值"); + userGrowthLogMapper.save(userGrowthLog); + } + // 添加余额赠送记录 + if (userRechargeVO.getPresAmount() > 0) { + MongoUserBalanceLogBO userBalanceLog = new MongoUserBalanceLogBO(); + userBalanceLog.setBalanceLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_BALANCE_LOG)); + userBalanceLog.setUserId(userBalanceLogDb.getUserId()); + userBalanceLog.setChangeBalance(userRechargeVO.getPresAmount()); + userBalanceLog.setIoType(RechargeIoTypeEnum.INCOME.value()); + userBalanceLog.setType(RechargeTypeEnum.PRESENT.value()); + userBalanceLog.setPaySysType(PaySysType.DEFAULT.value()); + SendStatus sendStatus = addUserBalanceLogTemplate.syncSend(RocketMqConstant.ADD_USER_BALANCE_LOG_TOPIC, new GenericMessage<>(Collections.singletonList(userBalanceLog))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + // 添加积分赠送记录 + if (userRechargeVO.getPresScore() > 0) { + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userBalanceLogDb.getUserId()); + userScoreLog.setSource(ScoreLogTypeEnum.BALANCE.value()); + userScoreLog.setScore(userRechargeVO.getPresScore()); + userScoreLog.setBizId(userBalanceLogDb.getBalanceLogId()); + userScoreLog.setIoType(ScoreIoTypeEnum.INCOME.value()); + SendStatus sendStatus = addUserScoreLogTemplate.syncSend(RocketMqConstant.ADD_USER_SCORE_LOG_TOPIC, new GenericMessage<>(Collections.singletonList(userScoreLog))).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new LuckException(ResponseEnum.EXCEPTION); + } + } + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRightsCouponServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRightsCouponServiceImpl.java new file mode 100644 index 0000000..ac8c394 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRightsCouponServiceImpl.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.user.mapper.UserRightsCouponMapper; +import com.tmerclub.cloud.user.model.UserRightsCoupon; +import com.tmerclub.cloud.user.service.UserRightsCouponService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +@Service +public class UserRightsCouponServiceImpl implements UserRightsCouponService { + + @Autowired + private UserRightsCouponMapper userRightsCouponMapper; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userRightsCouponMapper.list()); + } + + @Override + public UserRightsCoupon getByRightsCouponId(Long rightsCouponId) { + return userRightsCouponMapper.getByRightsCouponId(rightsCouponId); + } + + @Override + public void save(UserRightsCoupon userRightsCoupon) { + userRightsCouponMapper.save(userRightsCoupon); + } + + @Override + public void update(UserRightsCoupon userRightsCoupon) { + userRightsCouponMapper.update(userRightsCoupon); + } + + @Override + public void deleteById(Long rightsCouponId) { + userRightsCouponMapper.deleteById(rightsCouponId); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRightsServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRightsServiceImpl.java new file mode 100644 index 0000000..ce99928 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserRightsServiceImpl.java @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.tmerclub.cloud.common.cache.constant.CacheNames; +import com.tmerclub.cloud.common.cache.constant.UserCacheNames; +import com.tmerclub.cloud.common.cache.util.RedisUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.constant.StatusEnum; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.user.constant.LevelTypeEnum; +import com.tmerclub.cloud.user.dto.UserRightsDTO; +import com.tmerclub.cloud.user.mapper.UserLevelMapper; +import com.tmerclub.cloud.user.mapper.UserLevelRightsMapper; +import com.tmerclub.cloud.user.mapper.UserRightsCouponMapper; +import com.tmerclub.cloud.user.mapper.UserRightsMapper; +import com.tmerclub.cloud.user.model.UserLevel; +import com.tmerclub.cloud.user.model.UserRights; +import com.tmerclub.cloud.user.model.UserRightsCoupon; +import com.tmerclub.cloud.user.service.UserLevelRightsService; +import com.tmerclub.cloud.user.service.UserRightsService; +import com.tmerclub.cloud.user.vo.UserRightsVO; +import org.springframework.beans.factory.annotation.Autowired; +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.*; + +/** + * 用户权益信息 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserRightsServiceImpl implements UserRightsService { + + @Autowired + private UserRightsMapper userRightsMapper; + + @Autowired + private UserRightsCouponMapper userRightsCouponMapper; + + @Autowired + private UserLevelRightsMapper userLevelRightsMapper; + + @Autowired + private UserLevelMapper userLevelMapper; + + + @Autowired + private UserLevelRightsService userLevelRightsService; + + + @Override + public PageVO page(PageDTO pageDTO, UserRightsDTO userRightsDTO) { + return PageUtil.doPage(pageDTO, () -> userRightsMapper.list(userRightsDTO)); + } + + @Override + @Cacheable(cacheNames = CacheNames.RIGHT_BY_RIGHTS_ID_KEY, key = "#rightsId") + public UserRightsVO getByRightsId(Long rightsId) { + return userRightsMapper.getByRightsId(rightsId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(UserRightsDTO userRightsDTO) { + // checkIsRepeat(userRightsDTO); + UserRights userRights = BeanUtil.map(userRightsDTO, UserRights.class); + userRights.setStatus(StatusEnum.ENABLE.value()); + userRightsMapper.save(userRights); + userRightsDTO.setRightsId(userRights.getRightsId()); + Long rightsId = userRights.getRightsId(); + List couponIds = userRightsDTO.getCouponIds(); + for (Long couponId : couponIds) { + UserRightsCoupon userRightsCoupon = new UserRightsCoupon(); + userRightsCoupon.setCouponId(couponId); + userRightsCoupon.setRightsId(rightsId); + userRightsCouponMapper.save(userRightsCoupon); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(UserRightsDTO userRightsDTO) { + // checkIsRepeat(userRightsDTO); + UserRights userRights = BeanUtil.map(userRightsDTO, UserRights.class); + userRights.setStatus(StatusEnum.ENABLE.value()); + Long rightsId = userRights.getRightsId(); + userRightsCouponMapper.deleteByRightsId(rightsId); + List couponIds = userRightsDTO.getCouponIds(); + for (Long couponId : couponIds) { + UserRightsCoupon userRightsCoupon = new UserRightsCoupon(); + userRightsCoupon.setCouponId(couponId); + userRightsCoupon.setRightsId(rightsId); + userRightsCouponMapper.save(userRightsCoupon); + } + userRightsMapper.update(userRights); + //删除有该权益的所有等级的权益列表缓存 + List userLevelList = userLevelRightsService.listUserLevelIdByRightId(userRightsDTO.getRightsId()); + removeLevelCache(userLevelList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long rightsId) { + //删除有该权益的所有等级的权益列表缓存 + List userLevelList = userLevelRightsService.listUserLevelIdByRightId(rightsId); + userRightsCouponMapper.deleteByRightsId(rightsId); + userRightsMapper.deleteById(rightsId); + userLevelRightsMapper.deleteByRightId(rightsId); + removeLevelCache(userLevelList); + } + + @Override + public List list(UserRightsDTO userRights) { + return userRightsMapper.list(userRights); + } + + @Override + @CacheEvict(cacheNames = CacheNames.RIGHT_BY_RIGHTS_ID_KEY, key = "#rightsId") + public void removeRightsCache(Long rightsId) { + + } + + @Override + public void removeRightsByLevelTypeCache(Integer levelType) { + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + setRightKeys(keys); + RedisUtil.deleteBatch(keys); + } + + private static void setRightKeys(List keys) { + int maxLevel = 4; + for (int i = 1; i <= maxLevel; i++) { + keys.add(CacheNames.RIGHTS_BY_LEVEL_TYPE + CacheNames.UNION + LevelTypeEnum.ORDINARY_USER.value() + CacheNames.UNION_KEY + i); + keys.add(CacheNames.RIGHTS_BY_LEVEL_TYPE + CacheNames.UNION + LevelTypeEnum.PAY_USER.value() + CacheNames.UNION_KEY + i); + } + } + + @Override + @Cacheable(cacheNames = CacheNames.RIGHTS_BY_LEVEL_TYPE, key = "#levelType +':'+ #nowLevel") + public List listRightsByLevelType(Integer levelType, Integer nowLevel) { + List total = userRightsMapper.listRightsByLevelType(levelType); + // set存放处理过的rightsType + Set haveReadType = new HashSet<>(Constant.INITIAL_CAPACITY); + Set haveReadName = new HashSet<>(Constant.INITIAL_CAPACITY); + //会员等级为key,权益内容为value + Map> res = new HashMap<>(total.size()); + for (UserRightsVO userRightsVO : total) { + //非自定义权益根据类型去重 + if (Objects.equals(userRightsVO.getLevel(), nowLevel)) { + if (!Objects.isNull(userRightsVO.getRightsType()) && userRightsVO.getRightsType() != 0) { + if (haveReadType.contains(userRightsVO.getRightsType())) { + continue; + } + Integer level = userRightsVO.getLevel(); + List list = res.getOrDefault(level, new ArrayList<>(Constant.INITIAL_CAPACITY)); + list.add(userRightsVO); + res.put(level, list); + haveReadType.add(userRightsVO.getRightsType()); + } else { + //自定义类型根据名称去重 + if (haveReadName.contains(userRightsVO.getRightsName())) { + continue; + } + Integer level = userRightsVO.getLevel(); + List list = res.getOrDefault(level, new ArrayList<>(Constant.INITIAL_CAPACITY)); + list.add(userRightsVO); + res.put(level, list); + haveReadName.add(userRightsVO.getRightsName()); + } + } + } + Set>> entries = res.entrySet(); + List returnResult = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Map.Entry> entry : entries) { + List value = entry.getValue(); + returnResult.addAll(value); + } + return returnResult; + } + + @Override + public void cancelBindingCoupons(List couponIds) { + List rightsIds = userRightsCouponMapper.listRightsIdByCouponIds(couponIds); + // 没有要移除过期优惠券的权益 + if (CollUtil.isEmpty(rightsIds)) { + return; + } + // 移除权益中过期的优惠券 + userRightsCouponMapper.deleteByCouponIds(couponIds); + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 清除权益缓存 + for (Long rightsId : rightsIds) { + keys.add(CacheNames.RIGHT_BY_RIGHTS_ID_KEY + CacheNames.UNION + rightsId); + } + setRightKeys(keys); + + // 清除等级缓存 + List userLevels = userLevelMapper.listByCouponIds(rightsIds); + if (CollUtil.isNotEmpty(userLevels)) { + for (UserLevel userLevel : userLevels) { + keys.add(CacheNames.LEVEL_GET_KEY + CacheNames.UNION + userLevel.getUserLevelId()); + keys.add(CacheNames.LEVEL_GET_LIST_KEY + CacheNames.UNION + userLevel.getLevelType() + Constant.CATEGORY_INTERVAL + userLevel.getLevel()); + } + keys.add(CacheNames.LEVEL_LIST_KEY + CacheNames.UNION + LevelTypeEnum.ORDINARY_USER.value()); + keys.add(CacheNames.LEVEL_LIST_KEY + CacheNames.UNION + LevelTypeEnum.PAY_USER.value()); + } + RedisUtil.deleteBatch(keys); + + } + + @Override + public List listRightByLevel(Integer level, Integer levelType) { + return userRightsMapper.listRightByLevel(level, levelType); + } + + private void removeLevelCache(List userLevelList) { + List keys = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (UserLevel userLevel : userLevelList) { + keys.add(UserCacheNames.LEVEL_GET_KEY + CacheNames.UNION + userLevel.getUserLevelId()); + keys.add(UserCacheNames.LEVEL_GET_LIST_KEY + CacheNames.UNION + userLevel.getLevelType() + '-' + userLevel.getLevel()); + } + keys.add(UserCacheNames.LEVEL_LIST_KEY + CacheNames.UNION + LevelTypeEnum.ORDINARY_USER.value()); + keys.add(UserCacheNames.LEVEL_LIST_KEY + CacheNames.UNION + LevelTypeEnum.PAY_USER.value()); + RedisUtil.del(keys); + } + +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreGetLogServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreGetLogServiceImpl.java new file mode 100644 index 0000000..eaa73a2 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreGetLogServiceImpl.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.leaf.manager.SegmentManager; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.constant.DistributedIdKey; +import com.tmerclub.cloud.user.constant.ScoreIoTypeEnum; +import com.tmerclub.cloud.user.constant.ScoreLogTypeEnum; +import com.tmerclub.cloud.user.mapper.UserExtensionMapper; +import com.tmerclub.cloud.user.mapper.UserScoreGetLogMapper; +import com.tmerclub.cloud.user.model.UserExtension; +import com.tmerclub.cloud.user.model.UserScoreGetLog; +import com.tmerclub.cloud.user.service.UserScoreGetLogService; +import com.tmerclub.cloud.user.service.UserScoreLogService; +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 FrozenWatermelon + * @date 2021-05-17 17:17:14 + */ +@Service +public class UserScoreGetLogServiceImpl implements UserScoreGetLogService { + + @Autowired + private UserScoreGetLogMapper userScoreGetLogMapper; + @Autowired + private UserExtensionMapper userExtensionMapper; + @Autowired + private UserScoreLogService userScoreLogService; + @Autowired + private SegmentManager segmentManager; + + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userScoreGetLogMapper.list()); + } + + @Override + public UserScoreGetLog getByUserScoreGetLogId(Long userScoreGetLogId) { + return userScoreGetLogMapper.getByUserScoreGetLogId(userScoreGetLogId); + } + + @Override + public void save(UserScoreGetLog userScoreGetLog) { + userScoreGetLogMapper.save(userScoreGetLog); + } + + @Override + public void update(UserScoreGetLog userScoreGetLog) { + userScoreGetLogMapper.update(userScoreGetLog); + } + + @Override + public void deleteById(Long userScoreGetLogId) { + userScoreGetLogMapper.deleteById(userScoreGetLogId); + } + + @Override + public void saveBatch(List userScoreGetLogs) { + userScoreGetLogMapper.saveBatch(userScoreGetLogs); + } + + @Override + public UserScoreGetLog getLogByUserId(Long userId) { + return userScoreGetLogMapper.getLogByUserId(userId); + } + + @Override + public void deleteByUserId(Long userId) { + userScoreGetLogMapper.deleteByUserId(userId); + } + + @Override + public List listByUserIdAndExpireTimeAndStatus(Long userId, Date expireTime, Integer status) { + return userScoreGetLogMapper.listByUserIdAndExpireTimeAndStatus(userId, expireTime, status); + } + + @Override + public void updateBatchById(List userScoreGetLogList) { + userScoreGetLogMapper.updateBatchById(userScoreGetLogList); + } + + @Override + public Long sumUsableScoreByPage(Long userId, Integer status, Integer current, Integer size) { + return userScoreGetLogMapper.sumUsableScoreByPage(userId, status, current, size); + } + + @Override + public List listByCreateTime(Long userId, Integer status) { + return userScoreGetLogMapper.listByCreateTime(userId, status); + } + + @Override + public List listByCreateTimeAndPage(Long userId, Integer status, Integer current, Integer size) { + return userScoreGetLogMapper.listByCreateTimeAndPage(userId, status, current, size); + } + + @Override + public List batchListByCreateTime(List userIds, Integer status) { + return userScoreGetLogMapper.batchListByCreateTime(userIds, status); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateExpireScoreDetail(DateTime dateTime) { + // 先修改状态为0的积分明细为过期状态 + userScoreGetLogMapper.updateExpireScoreDetail(dateTime); + // 1.查询有积分过期的用户 + List userScoreDetails = userScoreGetLogMapper.listExpireScoreDetail(dateTime); + if (CollUtil.isEmpty(userScoreDetails)) { + return; + } + // 2.修改用户积分信息 + Map> userScoreMap = userScoreDetails.stream().collect(Collectors.groupingBy(UserScoreGetLog::getUserId)); + List logList = new ArrayList<>(Constant.INITIAL_CAPACITY); + List userExtensions = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long userId : userScoreMap.keySet()) { + List detailList = userScoreMap.get(userId); + long expireScore = detailList.stream().mapToLong(UserScoreGetLog::getUsableScore).sum(); + UserExtension userExtension = new UserExtension(); + userExtension.setUserId(userId); + // 减少这么多积分 + userExtension.setScore(-expireScore); + userExtensions.add(userExtension); + + // 添加积分日志 + MongoUserScoreLogBO userScoreLog = new MongoUserScoreLogBO(); + userScoreLog.setLogId(segmentManager.getSegmentId(DistributedIdKey.MALL4CLOUD_USER_SCORE_LOG)); + userScoreLog.setUserId(userId); + userScoreLog.setScore(expireScore); + userScoreLog.setSource(ScoreLogTypeEnum.EXPIRE.value()); + userScoreLog.setIoType(ScoreIoTypeEnum.EXPENDITURE.value()); + logList.add(userScoreLog); + } + // 批量修改用户积分和添加积分日志 + if (CollUtil.isNotEmpty(userExtensions)) { + userExtensionMapper.batchUpdateScore(userExtensions); + } + // 3.修改积分明细 + DateTime now = DateUtil.date(); + for (UserScoreGetLog userScoreDetail : userScoreDetails) { + userScoreDetail.setStatus(-1); + userScoreDetail.setExpireTime(now); + } + userScoreGetLogMapper.updateBatchById(userScoreDetails); + if (CollUtil.isNotEmpty(logList)) { + userScoreLogService.saveBatchToMongodb(logList); + } + } + + @Override + public UserScoreGetLog getLogByBizId(Long bizId) { + return userScoreGetLogMapper.getLogByBizId(bizId); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreLogServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreLogServiceImpl.java new file mode 100644 index 0000000..cf42278 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserScoreLogServiceImpl.java @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import com.tmerclub.cloud.api.order.bo.UserScoreLogOrderBO; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.product.feign.SpuFeignClient; +import com.tmerclub.cloud.api.user.vo.UserManagerVO; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.mongodb.util.MongoPageUtil; +import com.tmerclub.cloud.common.order.vo.OrderItemVO; +import com.tmerclub.cloud.common.product.vo.SpuVO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.security.AuthUserContext; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.DateUtils; +import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO; +import com.tmerclub.cloud.user.mapper.UserScoreLockMapper; +import com.tmerclub.cloud.user.mapper.UserScoreLogMapper; +import com.tmerclub.cloud.user.model.UserScoreLog; +import com.tmerclub.cloud.user.service.UserScoreLogService; +import com.tmerclub.cloud.user.vo.UserScoreLogVO; +import com.tmerclub.cloud.user.vo.mongo.MongoScoreUserManagerVO; +import com.tmerclub.cloud.user.vo.mongo.MongoScoreUserPayInfoVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户积分记录 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserScoreLogServiceImpl implements UserScoreLogService { + private static final Logger logger = LoggerFactory.getLogger(UserScoreLogServiceImpl.class); + + @Autowired + private UserScoreLogMapper userScoreLogMapper; + @DubboReference + private SpuFeignClient spuFeignClient; + @DubboReference + private OrderFeignClient orderFeignClient; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired + private MongoPageUtil mongoPageUtil; + @Autowired + private UserScoreLockMapper userScoreLockMapper; + + @Override + public void saveToMongdb(MongoUserScoreLogBO mongoUserScoreLogBO) { + if (Objects.isNull(mongoUserScoreLogBO) || Objects.isNull(mongoUserScoreLogBO.getLogId())) { + throw new LuckException("积分日志信息不全"); + } + mongoUserScoreLogBO.setCreateTime(new Date()); + mongoUserScoreLogBO.setUpdateTime(new Date()); + logger.info("保存积分记录到mongodb{}", mongoUserScoreLogBO); + mongoTemplate.save(mongoUserScoreLogBO); + } + + @Override + public void saveBatchToMongodb(List list) { + logger.info("批量保存积分记录到mongodb{}", list); + for (MongoUserScoreLogBO mongoUserScoreLogBO : list) { + if (Objects.isNull(mongoUserScoreLogBO) || Objects.isNull(mongoUserScoreLogBO.getLogId())) { + throw new LuckException("积分日志信息不全"); + } + mongoUserScoreLogBO.setCreateTime(new Date()); + mongoUserScoreLogBO.setUpdateTime(new Date()); + } + mongoTemplate.insertAll(list); + } + + @Override + public PageVO pageByIoTypeAndSource(PageDTO pageDTO, Integer ioType, Integer source) { + Long userId = AuthUserContext.get().getUserId(); + Criteria criteria = new Criteria(); + criteria.and("userId").is(userId).and("score").gt(0); + if (Objects.nonNull(ioType)) { + criteria.and("ioType").is(ioType); + } + if (Objects.nonNull(source)) { + criteria.and("source").is(source); + } + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + PageVO mongoUserScoreLogPage = mongoPageUtil.doPage(MongoUserScoreLogBO.class, pageDTO, query); + List userScoreLogs = BeanUtil.mapAsList(mongoUserScoreLogPage.getList(), UserScoreLogVO.class); + PageVO pageVO = new PageVO<>(); + pageVO.setTotal(mongoUserScoreLogPage.getTotal()); + pageVO.setPages(mongoUserScoreLogPage.getPages()); + if (CollUtil.isEmpty(userScoreLogs)) { + pageVO.setList(new ArrayList<>()); + return pageVO; + } + List bizIds = userScoreLogs.stream().map(UserScoreLogVO::getBizId).collect(Collectors.toList()); + if (CollUtil.isEmpty(bizIds)) { + userScoreLogs.forEach(userScoreLog -> userScoreLog.setIsLock(0)); + pageVO.setList(userScoreLogs); + return pageVO; + } + List lockBizIds = userScoreLockMapper.listByBizIds(bizIds); + if (CollUtil.isEmpty(lockBizIds)) { + userScoreLogs.forEach(userScoreLog -> userScoreLog.setIsLock(0)); + pageVO.setList(userScoreLogs); + return pageVO; + } + userScoreLogs.forEach(userScoreLog -> userScoreLog.setIsLock(lockBizIds.contains(userScoreLog.getBizId()) ? 1 : 0)); + pageVO.setList(userScoreLogs); + return pageVO; + } + + @Override + public PageVO pageByUserId(PageDTO pageDTO, Long userId) { + Query query = new Query(Criteria.where("userId").is(userId)); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + PageVO page = mongoPageUtil.doPage(MongoUserScoreLogBO.class, pageDTO, query); + PageVO pageVO = new PageVO<>(); + pageVO.setList(BeanUtil.mapAsList(page.getList(), UserScoreLogVO.class)); + pageVO.setTotal(page.getTotal()); + pageVO.setPages(page.getPages()); + return pageVO; + } + + @Override + public void deleteByUserId(Long userId) { + Query query = new Query(Criteria.where("userId").is(userId)); + mongoTemplate.remove(query, MongoUserScoreLogBO.class); + } + + @Override + public Long countByUserIdAndDateTimeAndType(Integer type, Long userId, DateTime beginOfDay, DateTime endOfDay) { + Query query = new Query(Criteria.where("userId").is(userId).and("source").is(type) + .and("createTime") + .gte(Objects.requireNonNull(DateUtils.dateToIsoDate(beginOfDay))) + .lte(Objects.requireNonNull(DateUtils.dateToIsoDate(endOfDay)))); + return mongoTemplate.count(query, MongoUserScoreLogBO.class); + } + + @Override + public UserScoreLog getOrderScoreLog(Long userId, Long bizId, Integer source, Integer ioType) { + Query query = new Query(Criteria.where("userId").is(userId).and("bizId").is(bizId).and("source").is(source).and("ioType").is(ioType)); + MongoUserScoreLogBO userScoreLogBO = mongoTemplate.findOne(query, MongoUserScoreLogBO.class); + return BeanUtil.map(userScoreLogBO, UserScoreLog.class); + } + + @Override + public PageVO scoreProdPage(PageDTO pageDTO) { + Long userId = AuthUserContext.get().getUserId(); + Query query = new Query(Criteria.where("userId").is(userId).and("source").gte(10).lte(11)); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + PageVO page = mongoPageUtil.doPage(MongoUserScoreLogBO.class, pageDTO, query); + PageVO userScoreLogPage = new PageVO<>(); + userScoreLogPage.setPages(page.getPages()); + userScoreLogPage.setTotal(page.getTotal()); + userScoreLogPage.setList(BeanUtil.mapAsList(page.getList(), UserScoreLogVO.class)); + if (CollUtil.isEmpty(userScoreLogPage.getList())) { + return userScoreLogPage; + } + List orderIds = userScoreLogPage.getList().stream().map(UserScoreLogVO::getBizId).filter(Objects::nonNull).collect(Collectors.toList()); + // 获取订单信息 + ServerResponseEntity> orderResponseEntity = orderFeignClient.listOrderItemByOrderIds(orderIds); + if (!orderResponseEntity.isSuccess()) { + throw new LuckException(orderResponseEntity.getMsg()); + } + //获取订单数据 + ServerResponseEntity> orderResponse = orderFeignClient.getUserScoreLogDetail(new ArrayList<>(orderIds)); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + Map orderScoreMap = orderResponse.getData().stream().collect(Collectors.toMap(UserScoreLogOrderBO::getOrderId, u -> u)); + Map orderMap = new HashMap<>(16); + for (OrderItemVO orderItemVO : orderResponseEntity.getData()) { + // 积分商品只有一个订单项 + orderMap.put(orderItemVO.getOrderId(), orderItemVO.getSpuId()); + } + ServerResponseEntity> prodResponseEntity = spuFeignClient.listSpuBySpuIds(new ArrayList<>(orderMap.values())); + if (!prodResponseEntity.isSuccess()) { + throw new LuckException(prodResponseEntity.getMsg()); + } + Map spuMap = prodResponseEntity.getData().stream().collect(Collectors.toMap(SpuVO::getSpuId, s -> s)); + for (UserScoreLogVO userScoreLogVO : userScoreLogPage.getList()) { + SpuVO spuVO = spuMap.get(orderMap.get(userScoreLogVO.getBizId())); + UserScoreLogOrderBO userScoreLogOrderBO = orderScoreMap.get(userScoreLogVO.getBizId()); + if (Objects.nonNull(userScoreLogOrderBO)) { + userScoreLogVO.setActualTotal(userScoreLogOrderBO.getActualTotal()); + userScoreLogVO.setScoreFee(userScoreLogOrderBO.getScoreFee()); + userScoreLogVO.setAllCount(userScoreLogOrderBO.getAllCount()); + } + if (Objects.isNull(spuVO)) { + continue; + } + userScoreLogVO.setSpuName(spuVO.getName()); + userScoreLogVO.setMainImgUrl(spuVO.getMainImgUrl()); + userScoreLogVO.setSingleScoreFee(spuVO.getScoreFee()); + } + return userScoreLogPage; + } + + @Override + public Long getScoreCountByRefundIds(List refundIds) { + if (CollUtil.isEmpty(refundIds)) { + return 0L; + } + Criteria criteria = new Criteria("source").is(9).and("bizId").in(refundIds); + ProjectionOperation projectionOperation = Aggregation.project() + .and(ConditionalOperators.when(Criteria.where("score").isNull()).then(0).otherwise("$score")).as("score"); + GroupOperation groupOperation = Aggregation.group().sum("score").as("scoreCount"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoScoreUserPayInfoVO.class, + Aggregation.match(criteria), + projectionOperation, + groupOperation + ); + logger.info("getScoreCountByRefundIds()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoScoreUserPayInfoVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + return 0L; + } + return list.get(0).getScoreCount(); + } + + @Override + public UserScoreLog getExpireScoreLogByUserId(Long userId) { + Query query = new Query(Criteria.where("userId").is(userId).and("source").is(5).and("ioType").is(0).and("score").gt(0)); + query.with(Sort.by(Sort.Direction.DESC, "createTime")); + MongoUserScoreLogBO userScoreLogBO = mongoTemplate.findOne(query, MongoUserScoreLogBO.class); + return BeanUtil.map(userScoreLogBO, UserScoreLog.class); + } + + @Override + public void initUserScoreLogToMongodb() { + int start = 0; + int size = 10000; + mongoTemplate.remove(MongoUserScoreLogBO.class); + while (true) { + // 批量以10000条处理 + List userScoreLogs = userScoreLogMapper.listToMongodb(start, size); + if (CollUtil.isEmpty(userScoreLogs)) { + break; + } + List mongoUserScoreLogs = BeanUtil.mapAsList(userScoreLogs, MongoUserScoreLogBO.class); + mongoTemplate.insertAll(mongoUserScoreLogs); + if (userScoreLogs.size() <= size) { + break; + } + start = start + size; + } + } + + @Override + public List setUserInfo(List userList) { + List userIds = userList.stream().map(UserManagerVO::getUserId).collect(Collectors.toList()); + if (CollUtil.isEmpty(userIds)) { + return userList; + } + Criteria criteria = new Criteria(); + criteria.and("userId").in(userIds).and("ioType").is(1); + GroupOperation groupOperation = Aggregation.group("userId") + .sum("score").as("sumScore"); + ProjectionOperation projectionOperation = Aggregation.project("sumScore") + .and("_id").as("userId"); + // 按顺序组合每一个聚合步骤 + TypedAggregation typedAggregation = + Aggregation.newAggregation( + MongoScoreUserManagerVO.class, + Aggregation.match(criteria), + groupOperation, + projectionOperation + ); + logger.info("setUserInfo()的mongodb查询语句: {}", typedAggregation); + + // 执行聚合操作 + AggregationResults aggregationResults = + mongoTemplate.aggregate(typedAggregation, MongoScoreUserManagerVO.class); + // 取出最终结果 + List list = aggregationResults.getMappedResults(); + if (CollUtil.isEmpty(list)) { + userList.forEach(user -> { + user.setSumScore(0L); + }); + return userList; + } + int maxScore = 99999999; + Map userMap = list.stream().collect(Collectors.toMap(MongoScoreUserManagerVO::getUserId, u -> u)); + for (UserManagerVO userManagerVO : userList) { + MongoScoreUserManagerVO info = Objects.nonNull(userMap.get(userManagerVO.getUserId())) ? userMap.get(userManagerVO.getUserId()) : new MongoScoreUserManagerVO(); + userManagerVO.setSumScore(info.getSumScore() > maxScore ? maxScore : info.getSumScore()); + } + return userList; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserTagServiceImpl.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserTagServiceImpl.java new file mode 100644 index 0000000..58e5dfc --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/service/impl/UserTagServiceImpl.java @@ -0,0 +1,626 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.tmerclub.cloud.api.biz.feign.NotifyFeignClient; +import com.tmerclub.cloud.api.feign.SearchOrderFeignClient; +import com.tmerclub.cloud.api.order.feign.OrderFeignClient; +import com.tmerclub.cloud.api.user.vo.UserTagApiVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.database.dto.PageDTO; +import com.tmerclub.cloud.common.database.util.PageUtil; +import com.tmerclub.cloud.common.database.vo.PageVO; +import com.tmerclub.cloud.common.exception.LuckException; +import com.tmerclub.cloud.common.order.dto.OrderSearchDTO; +import com.tmerclub.cloud.common.response.ResponseEnum; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.common.util.BeanUtil; +import com.tmerclub.cloud.common.util.PriceUtil; +import com.tmerclub.cloud.user.constant.RecentDaysTypeEnum; +import com.tmerclub.cloud.user.constant.UserStatusEnum; +import com.tmerclub.cloud.user.dto.UserTagDTO; +import com.tmerclub.cloud.user.mapper.UserLevelLogMapper; +import com.tmerclub.cloud.user.mapper.UserTagMapper; +import com.tmerclub.cloud.user.model.UserTag; +import com.tmerclub.cloud.user.model.UserTagUser; +import com.tmerclub.cloud.user.service.UserBalanceLogService; +import com.tmerclub.cloud.user.service.UserService; +import com.tmerclub.cloud.user.service.UserTagService; +import com.tmerclub.cloud.user.service.UserTagUserService; +import com.tmerclub.cloud.user.vo.UserTagVO; +import com.tmerclub.cloud.user.vo.UserVO; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 客户标签 + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +@Service +public class UserTagServiceImpl implements UserTagService { + + @Autowired + private UserTagMapper userTagMapper; + + @Autowired + private UserTagUserService userTagUserService; + + @Autowired + private UserService userService; + + @Autowired + private UserLevelLogMapper userLevelLogMapper; + + @Autowired + private UserBalanceLogService userBalanceLogService; + + + @DubboReference + private OrderFeignClient orderFeignClient; + + + @DubboReference + private SearchOrderFeignClient searchOrderFeignClient; + + @DubboReference + private NotifyFeignClient notifyFeignClient; + + @Override + public PageVO page(PageDTO pageDTO) { + return PageUtil.doPage(pageDTO, () -> userTagMapper.list(new UserTag())); + } + + @Override + public UserTag getByUserTagId(Long userTagId) { + return userTagMapper.getByUserTagId(userTagId); + } + + @Override + public void save(UserTag userTag) { + userTagMapper.save(userTag); + } + + @Override + public void update(UserTag userTag) { + userTagMapper.update(userTag); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(Long userTagId) { + userTagMapper.deleteById(userTagId); + // 删除用户与标签关联关系 + userTagUserService.deleteByTagId(userTagId); + // 删除推送消息模板与标签关联关系 + ServerResponseEntity notifyDeleteRes = notifyFeignClient.deleteTagByTagId(userTagId); + if (!notifyDeleteRes.isSuccess()) { + throw new LuckException(notifyDeleteRes.getMsg()); + } + } + + @Override + public List list(UserTag userTag) { + return userTagMapper.list(userTag); + } + + @Override + public UserTagVO refreshConditionTag(Long userTagId) { + // 检查标签类型 + UserTag userTag = getByUserTagId(userTagId); + if (Objects.isNull(userTag)) { + // 用户标签不存在 + throw new LuckException("用户标签不存在"); + } + if (userTag.getTagType() != 1) { + // 标签类型不对劲 + throw new LuckException("标签类型不对劲"); + } + if (userTag.getStatisticUpdateTime() != null && DateUtil.date().compareTo(DateUtil.offsetMinute(userTag.getStatisticUpdateTime(), 1)) < 0) { + // 刷新间隔不能小于一分钟 + throw new LuckException("刷新间隔不能小于一分钟"); + } + // 筛选条件 + List> listUserList = new ArrayList<>(Constant.INITIAL_CAPACITY); + // 基础条件 + // 成为客户时间 + if (Objects.nonNull(userTag.getRegisterMinTime()) && Objects.nonNull(userTag.getRegisterMaxTime())) { + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(ZoneId.systemDefault())); + calendar.setTime(userTag.getRegisterMinTime()); + Date startDate = Date.from(calendar.toInstant()); + calendar.setTime(userTag.getRegisterMaxTime()); + Date endDate = Date.from(calendar.toInstant()); + List users = userService.getUserByCreateTimeRange(UserStatusEnum.ENABLE.value(), startDate, endDate); + listUserList.add(users); + } + // 成为会员时间 + if (Objects.nonNull(userTag.getToBeMemberMinTime()) && Objects.nonNull(userTag.getToBeMemberMaxTime())) { + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(ZoneId.systemDefault())); + calendar.setTime(userTag.getToBeMemberMinTime()); + Date startDate = Date.from(calendar.toInstant()); + calendar.setTime(userTag.getToBeMemberMaxTime()); + Date endDate = Date.from(calendar.toInstant()); + List userIds = userLevelLogMapper.listUserIdByEarliestRechargeTime(1, startDate, endDate); + List users = getInitUserVOList(userIds); + listUserList.add(users); + } + // 交易条件-最近消费时间、消费次数、消费金额 + buyTransactionConditionTag(userTag, listUserList); + // 订单均价、充值金额、充值次数 + amountTransactionConditionTag(userTag, listUserList); + // 获取用户id交集 + List userIds; + if (listUserList.isEmpty()) { + userIds = new ArrayList<>(0); + } else { + userIds = listUserList.get(0).stream().map(UserVO::getUserId).collect(Collectors.toList()); + for (int i = 1; i < listUserList.size(); i++) { + userIds = userFilter(userIds, listUserList.get(i)); + if (CollectionUtils.isEmpty(userIds)) { + // 交集为空,直接退出循环 + break; + } + } + } + // 清空关联表 + userTagUserService.removeByUserTagId(userTagId); + // 写入关联表 + List userTagUsers = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long userId : userIds) { + UserTagUser userTagUser = new UserTagUser(); + userTagUser.setUserId(userId); + userTagUser.setUserTagId(userTagId); + userTagUsers.add(userTagUser); + } + if (CollUtil.isNotEmpty(userTagUsers)) { + userTagUserService.saveBatch(userTagUsers); + } + // 更新统计人数,时间 + userTag.setUserNum((long) userTagUsers.size()); + userTag.setStatisticUpdateTime(DateUtil.date()); + update(userTag); + return BeanUtil.map(userTag, UserTagVO.class); + } + + @Override + public void batchRefreshConditionTag(List tagIds) { + if (CollectionUtils.isEmpty(tagIds)) { + return; + } + for (Long tagId : tagIds) { + this.refreshConditionTag(tagId); + } + } + + @Override + public int count(UserTag userTag) { + return userTagMapper.count(userTag); + } + + @Override + public void addUserTag(UserTagDTO userTagDTO) { + UserTag userTag = new UserTag(); + userTag.setTagName(userTagDTO.getTagName()); + userTag.setTagType(userTagDTO.getTagType()); + userTag.setIsSysTurnOn(0); + switch (userTagDTO.getTagType()) { + // 手动标签 + case 0: + //todo 手动标签 + break; + // 条件标签 + case 1: + fillInCustomOptionalCondition(userTagDTO, userTag, false); + break; + default: + } + userTag.setUserNum(0L); + this.save(userTag); + } + + @Override + public void updateUserTag(UserTagDTO userTagDTO) { + UserTag userTag = getByUserTagId(userTagDTO.getUserTagId()); + if (Objects.isNull(userTag)) { + // 用户标签不存在 + throw new LuckException("用户标签不存在"); + } + userTag.setTagName(userTagDTO.getTagName()); + userTag.setUpdateTime(DateUtil.date()); + switch (userTag.getTagType()) { + // 手动标签 + case 0: + //todo 手动标签 + break; + // 条件标签 + case 1: + fillInCustomOptionalCondition(userTagDTO, userTag, true); + break; + default: + } + update(userTag); + } + + @Override + public PageVO getPage(PageDTO pageDTO, UserTagDTO userTagDTO) { + return PageUtil.doPage(pageDTO, () -> userTagMapper.list(BeanUtil.map(userTagDTO, UserTag.class))); + } + + + @Override + public List getUserTagList(List tagIds) { + return userTagMapper.getByUserTagIds(tagIds); + } + + /** + * 填写自定义可选条件 + * + * @param userTagDTO 参数 + * @param userTag 用户标签 + * @param isUpdate true 是修改 false 新增 + */ + private void fillInCustomOptionalCondition(UserTagDTO userTagDTO, UserTag userTag, boolean isUpdate) { + // 基础条件 + baseOptionalCondition(userTagDTO, userTag, isUpdate); + // 交易条件 + transactionOptionalCondition(userTagDTO, userTag, isUpdate); + } + + /** + * 基础条件 + * + * @param userTagDTO 标签信息 + * @param userTag 客户标签 + * @param isUpdate true 是修改 false 新增 + */ + private void baseOptionalCondition(UserTagDTO userTagDTO, UserTag userTag, boolean isUpdate) { + // 成为客户时间 + if (Objects.nonNull(userTagDTO.getRegisterMinTime()) && Objects.nonNull(userTagDTO.getRegisterMaxTime())) { + if (userTagDTO.getRegisterMinTime().after(userTagDTO.getRegisterMaxTime())) { + // 开始时间不能比结束时间晚 + throw new LuckException("开始时间不能比结束时间晚"); + } + userTag.setRegisterMinTime(userTagDTO.getRegisterMinTime()); + userTag.setRegisterMaxTime(userTagDTO.getRegisterMaxTime()); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearRegisterTime()) && userTagDTO.getClearRegisterTime()) { + userTag.setRegisterMinTime(null); + userTag.setRegisterMaxTime(null); + } + // 关注时间 + if (Objects.nonNull(userTagDTO.getSubscribeMinTime()) && Objects.nonNull(userTagDTO.getSubscribeMaxTime())) { + if (userTagDTO.getSubscribeMinTime().after(userTagDTO.getSubscribeMaxTime())) { + // 开始时间不能比结束时间晚 + throw new LuckException("开始时间不能比结束时间晚"); + } + userTag.setSubscribeMinTime(userTagDTO.getSubscribeMinTime()); + userTag.setSubscribeMaxTime(userTagDTO.getSubscribeMaxTime()); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearSubscribeTime()) && userTagDTO.getClearSubscribeTime()) { + userTag.setSubscribeMinTime(null); + userTag.setSubscribeMaxTime(null); + } + // 成为会员时间 + if (Objects.nonNull(userTagDTO.getToBeMemberMinTime()) && Objects.nonNull(userTagDTO.getToBeMemberMaxTime())) { + if (userTagDTO.getToBeMemberMinTime().after(userTagDTO.getToBeMemberMaxTime())) { + // 开始时间不能比结束时间晚 + throw new LuckException("开始时间不能比结束时间晚"); + } + userTag.setToBeMemberMinTime(userTagDTO.getToBeMemberMinTime()); + userTag.setToBeMemberMaxTime(userTagDTO.getToBeMemberMaxTime()); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearToBeMemberTime()) && userTagDTO.getClearToBeMemberTime()) { + userTag.setToBeMemberMinTime(null); + userTag.setToBeMemberMaxTime(null); + } + } + + /** + * 交易条件 + * + * @param userTagDTO 标签信息 + * @param userTag 客户标签 + * @param isUpdate true 是修改 false 新增 + */ + private void transactionOptionalCondition(UserTagDTO userTagDTO, UserTag userTag, boolean isUpdate) { + // 最近消费时间 + if (Objects.nonNull(userTagDTO.getRecentPurchaseTime())) { + userTag.setRecentPurchaseTime(userTagDTO.getRecentPurchaseTime()); + } else { + userTag.setRecentPurchaseTime(null); + } + if (Objects.nonNull(userTagDTO.getClearRecentPurchaseTime()) && userTagDTO.getClearRecentPurchaseTime()) { + userTag.setRecentPurchaseTime(null); + } + // 消费次数 + if (Objects.nonNull(userTagDTO.getPurchaseNumTime()) && Objects.nonNull(userTagDTO.getPurchaseNumMinNum()) && Objects.nonNull(userTagDTO.getPurchaseNumMaxNum())) { + if (userTagDTO.getPurchaseNumMinNum() > userTagDTO.getPurchaseNumMaxNum()) { + // 最小次数不能比最大次数大 + throw new LuckException("最小次数不能比最大次数大"); + } + userTag.setPurchaseNumTime(userTagDTO.getPurchaseNumTime()); + userTag.setPurchaseNumMinNum(userTagDTO.getPurchaseNumMinNum()); + userTag.setPurchaseNumMaxNum(userTagDTO.getPurchaseNumMaxNum()); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearPurchaseNum()) && userTagDTO.getClearPurchaseNum()) { + userTag.setPurchaseNumTime(null); + userTag.setPurchaseNumMinNum(null); + userTag.setPurchaseNumMaxNum(null); + } + // 消费金额 + if (Objects.nonNull(userTagDTO.getPurchaseAmountTime()) && Objects.nonNull(userTagDTO.getPurchaseAmountMinAmount()) && Objects.nonNull(userTagDTO.getPurchaseAmountMaxAmount())) { + if (userTagDTO.getPurchaseAmountMinAmount().compareTo(userTagDTO.getPurchaseAmountMaxAmount()) > 0) { + // 最小金额不能比最大金额大 + throw new LuckException("最小金额不能比最大金额大"); + } + userTag.setPurchaseAmountTime(userTagDTO.getPurchaseAmountTime()); + // 元转分 + userTag.setPurchaseAmountMinAmount(PriceUtil.toLongCent(userTagDTO.getPurchaseAmountMinAmount())); + userTag.setPurchaseAmountMaxAmount(PriceUtil.toLongCent(userTagDTO.getPurchaseAmountMaxAmount())); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearPurchaseAmount()) && userTagDTO.getClearPurchaseAmount()) { + userTag.setPurchaseAmountTime(null); + userTag.setPurchaseAmountMinAmount(null); + userTag.setPurchaseAmountMaxAmount(null); + } + // 订单均价 + if (Objects.nonNull(userTagDTO.getOrderAveragePriceTime()) && Objects.nonNull(userTagDTO.getOrderAveragePriceMinAmount()) && Objects.nonNull(userTagDTO.getOrderAveragePriceMaxAmount())) { + if (userTagDTO.getOrderAveragePriceMinAmount().compareTo(userTagDTO.getOrderAveragePriceMaxAmount()) > 0) { + // 最小金额不能比最大金额大 + throw new LuckException("最小金额不能比最大金额大"); + } + userTag.setOrderAveragePriceTime(userTagDTO.getOrderAveragePriceTime()); + // 元转分 + userTag.setOrderAveragePriceMinAmount(PriceUtil.toLongCent(userTagDTO.getOrderAveragePriceMinAmount())); + userTag.setOrderAveragePriceMaxAmount(PriceUtil.toLongCent(userTagDTO.getOrderAveragePriceMaxAmount())); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearOrderAveragePrice()) && userTagDTO.getClearOrderAveragePrice()) { + userTag.setOrderAveragePriceTime(null); + userTag.setOrderAveragePriceMinAmount(null); + userTag.setOrderAveragePriceMaxAmount(null); + } + // 充值金额 + if (Objects.nonNull(userTagDTO.getRechargeAmountTime()) && Objects.nonNull(userTagDTO.getRechargeAmountMinAmount()) && Objects.nonNull(userTagDTO.getRechargeAmountMaxAmount())) { + if (userTagDTO.getRechargeAmountMinAmount().compareTo(userTagDTO.getRechargeAmountMaxAmount()) > 0) { + // 最小金额不能比最大金额大 + throw new LuckException("最小金额不能比最大金额大"); + } + userTag.setRechargeAmountTime(userTagDTO.getRechargeAmountTime()); + userTag.setRechargeAmountMinAmount(userTagDTO.getRechargeAmountMinAmount()); + userTag.setRechargeAmountMaxAmount(userTagDTO.getRechargeAmountMaxAmount()); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearRechargeAmount()) && userTagDTO.getClearRechargeAmount()) { + userTag.setRechargeAmountTime(null); + userTag.setRechargeAmountMinAmount(null); + userTag.setRechargeAmountMaxAmount(null); + } + // 充值次数 + if (Objects.nonNull(userTagDTO.getRechargeNumTime()) && Objects.nonNull(userTagDTO.getRechargeNumMinNum()) && Objects.nonNull(userTagDTO.getRechargeNumMaxNum())) { + if (userTagDTO.getRechargeNumMinNum() > userTagDTO.getRechargeNumMaxNum()) { + // 最小次数不能比最大次数大 + throw new LuckException("最小次数不能比最大次数大"); + } + userTag.setRechargeNumTime(userTagDTO.getRechargeNumTime()); + userTag.setRechargeNumMinNum(userTagDTO.getRechargeNumMinNum()); + userTag.setRechargeNumMaxNum(userTagDTO.getRechargeNumMaxNum()); + } + if (isUpdate && Objects.nonNull(userTagDTO.getClearRechargeNum()) && userTagDTO.getClearRechargeNum()) { + userTag.setRechargeNumTime(null); + userTag.setRechargeNumMinNum(null); + userTag.setRechargeNumMaxNum(null); + } + } + + /** + * 刷新条件标签统计人数 -交易条件(购买相关) + * + * @param userTag 客户标签 + * @param listUserList 筛选条件 + */ + private void buyTransactionConditionTag(UserTag userTag, List> listUserList) { + // 最近消费时间 + if (Objects.nonNull(userTag.getRecentPurchaseTime())) { + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setIsPayed(1); + orderSearchDTO.setDeleteStatus(0); + // 当0时不限时间 + if (userTag.getRecentPurchaseTime() != 0) { + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); + Date startDate = addDateTimeCondition(userTag.getRecentPurchaseTime(), localDateTime); + orderSearchDTO.setStartTime(startDate); + orderSearchDTO.setEndTime(DateUtil.endOfDay(new Date())); + } + ServerResponseEntity> orderResponse = orderFeignClient.getOrderUserIdsBySearchDTO(orderSearchDTO); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + List userIds = orderResponse.getData(); + List orderUsers = getInitUserVOList(userIds); + listUserList.add(orderUsers); + } + // 消费次数, 只要进行支付了就算一次消费的次数了,不用管订单是否退款,是否完成收货的的问题 + if (Objects.nonNull(userTag.getPurchaseNumTime()) && Objects.nonNull(userTag.getPurchaseNumMinNum()) && Objects.nonNull(userTag.getPurchaseNumMaxNum())) { + List userIds; + if (userTag.getPurchaseNumTime() != 0) { + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); + Date startDate = addDateTimeCondition(userTag.getPurchaseNumTime(), localDateTime); + Date endDate = DateUtil.endOfDay(new Date()); + ServerResponseEntity> orderResponse = orderFeignClient.listUserIdByPurchaseNum(1, 0, startDate, endDate, null, userTag.getPurchaseNumMinNum(), userTag.getPurchaseNumMaxNum()); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + userIds = orderResponse.getData(); + } else { + ServerResponseEntity> orderResponse = orderFeignClient.listUserIdByPurchaseNum(1, 0, null, null, null, userTag.getPurchaseNumMinNum(), userTag.getPurchaseNumMaxNum()); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + userIds = orderResponse.getData(); + } + List users = getInitUserVOList(userIds); + listUserList.add(users); + } + // 消费金额 + if (Objects.nonNull(userTag.getPurchaseAmountTime()) && Objects.nonNull(userTag.getPurchaseAmountMinAmount()) && Objects.nonNull(userTag.getPurchaseAmountMaxAmount())) { + OrderSearchDTO orderSearchDTO = new OrderSearchDTO(); + orderSearchDTO.setIsPayed(1); + orderSearchDTO.setDeleteStatus(0); + orderSearchDTO.setActualTotalMin(userTag.getPurchaseAmountMinAmount()); + orderSearchDTO.setActualTotalMax(userTag.getPurchaseAmountMaxAmount()); + // 当0时不限时间 + if (userTag.getPurchaseAmountTime() != 0) { + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); + Date startDate = addDateTimeCondition(userTag.getPurchaseAmountTime(), localDateTime); + DateTime endTime = DateUtil.endOfDay(new Date()); + orderSearchDTO.setStartTime(startDate); + orderSearchDTO.setEndTime(endTime); + } + ServerResponseEntity> orderUserIdsResponse = orderFeignClient.getOrderUserIdsBySearchDTO(orderSearchDTO); + if (!Objects.equals(orderUserIdsResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderUserIdsResponse.getMsg()); + } + List orderUsers = getInitUserVOList(orderUserIdsResponse.getData()); + listUserList.add(orderUsers); + } + } + + /** + * 刷新条件标签统计人数 -交易条件(金额相关) + * + * @param userTag 客户标签 + * @param listUserList 筛选条件 + */ + private void amountTransactionConditionTag(UserTag userTag, List> listUserList) { + // 订单均价 + if (Objects.nonNull(userTag.getOrderAveragePriceTime()) && Objects.nonNull(userTag.getOrderAveragePriceMinAmount()) && Objects.nonNull(userTag.getOrderAveragePriceMaxAmount())) { + List userIds; + if (userTag.getOrderAveragePriceTime() != 0) { + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); + Date startDate = addDateTimeCondition(userTag.getOrderAveragePriceTime(), localDateTime); + Date endDate = DateUtil.endOfDay(new Date()); + ServerResponseEntity> orderResponse = orderFeignClient.listUserIdByAverageActualTotal(1, 0, startDate, endDate, null, userTag.getOrderAveragePriceMinAmount(), userTag.getOrderAveragePriceMaxAmount()); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + userIds = orderResponse.getData(); + } else { + ServerResponseEntity> orderResponse = orderFeignClient.listUserIdByAverageActualTotal(1, 0, null, null, null, userTag.getOrderAveragePriceMinAmount(), userTag.getOrderAveragePriceMaxAmount()); + if (!Objects.equals(orderResponse.getCode(), ResponseEnum.OK.value())) { + throw new LuckException(orderResponse.getMsg()); + } + userIds = orderResponse.getData(); + } + List orderUsers = getInitUserVOList(userIds); + listUserList.add(orderUsers); + } + // 充值金额 + if (Objects.nonNull(userTag.getRechargeAmountTime()) && Objects.nonNull(userTag.getRechargeAmountMinAmount()) && Objects.nonNull(userTag.getRechargeAmountMaxAmount())) { + List userIds; + if (userTag.getRechargeAmountTime() != 0) { + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); + Date date = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()); + Date startDate = addDateTimeCondition(userTag.getRechargeAmountTime(), localDateTime); + userIds = userBalanceLogService.listUserIdByRechargeAmount(1, startDate, date, userTag.getRechargeAmountMinAmount(), userTag.getRechargeAmountMaxAmount()); + } else { + userIds = userBalanceLogService.listUserIdByRechargeAmount(1, null, null, userTag.getRechargeAmountMinAmount(), userTag.getRechargeAmountMaxAmount()); + } + List users = getInitUserVOList(userIds); + listUserList.add(users); + } + // 充值次数 + if (Objects.nonNull(userTag.getRechargeNumTime()) && Objects.nonNull(userTag.getRechargeNumMinNum()) && Objects.nonNull(userTag.getRechargeNumMaxNum())) { + List userIds; + if (userTag.getRechargeNumTime() != 0) { + LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); + Date date = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()); + Date startDate = addDateTimeCondition(userTag.getRechargeNumTime(), localDateTime); + userIds = userBalanceLogService.listUserIdByRechargeNum(1, startDate, date, userTag.getRechargeNumMinNum(), userTag.getRechargeNumMaxNum()); + } else { + userIds = userBalanceLogService.listUserIdByRechargeNum(1, null, null, userTag.getRechargeNumMinNum(), userTag.getRechargeNumMaxNum()); + } + List users = getInitUserVOList(userIds); + listUserList.add(users); + } + } + + + /** + * 初始化集合 + * + * @param userIds 用户id集合 + * @return 用户信息列表 + */ + private List getInitUserVOList(List userIds) { + List users = new ArrayList<>(Constant.INITIAL_CAPACITY); + for (Long userId : userIds) { + UserVO user = new UserVO(); + user.setUserId(userId); + users.add(user); + } + return users; + } + + /** + * 添加时间条件 + * + * @param timeType 类型 + * @param localDateTime 本地时间 + * @return 时间 + */ + private Date addDateTimeCondition(Integer timeType, LocalDateTime localDateTime) { + Date startDate = null; + switch (timeType) { + case 1: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.TODAY.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + case 2: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.RECENT_SEVEN_DAYS.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + case 3: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.RECENT_FIFTEEN_DAYS.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + case 4: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.RECENT_THIRTY_DAYS.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + case 5: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.RECENT_FORTY_FIVE_DAYS.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + case 6: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.RECENT_SIXTY_DAYS.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + case 7: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.RECENT_NINETY_DAYS.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + case 8: + startDate = Date.from(localDateTime.minusDays(RecentDaysTypeEnum.RECENT_ONE_HUNDRED_AND_EIGHTY_DAYS.value()).atZone(ZoneId.systemDefault()).toInstant()); + break; + default: + } + return startDate; + } + + private List userFilter(List userIds, List users) { + return users.stream().map(UserVO::getUserId).filter(userIds::contains).collect(Collectors.toList()); + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/DateUserWithdrawCashVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/DateUserWithdrawCashVO.java new file mode 100644 index 0000000..72965ec --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/DateUserWithdrawCashVO.java @@ -0,0 +1,46 @@ +package com.tmerclub.cloud.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author gaozijie + * @date 2023-05-09 + */ +public class DateUserWithdrawCashVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "提现年月") + private Date date; + + @Schema(description = "提现记录") + private List withdrawCashVOs; + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public List getWithdrawCashVOs() { + return withdrawCashVOs; + } + + public void setWithdrawCashVOs(List withdrawCashVOs) { + this.withdrawCashVOs = withdrawCashVOs; + } + + @Override + public String toString() { + return "DateWithdrawCashVO{" + + "date=" + date + + ", withdrawCashVOs=" + withdrawCashVOs + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/GrowthCompleteConfigVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/GrowthCompleteConfigVO.java new file mode 100644 index 0000000..48feae9 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/GrowthCompleteConfigVO.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import java.io.Serial; +import java.io.Serializable; +/** + * 成长配置信息 + * @author lth + */ +public class GrowthCompleteConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 成长值获取开关 + */ + private Boolean shopGrowthSwitch; + + private Double buyPrice; + + private Double buyOrder; + + public Boolean getShopGrowthSwitch() { + return shopGrowthSwitch; + } + + public void setShopGrowthSwitch(Boolean shopGrowthSwitch) { + this.shopGrowthSwitch = shopGrowthSwitch; + } + + public Double getBuyPrice() { + return buyPrice; + } + + public void setBuyPrice(Double buyPrice) { + this.buyPrice = buyPrice; + } + + public Double getBuyOrder() { + return buyOrder; + } + + public void setBuyOrder(Double buyOrder) { + this.buyOrder = buyOrder; + } + + @Override + public String toString() { + return "GrowthConfigVO{" + + "shopGrowthSwitch=" + shopGrowthSwitch + + ", buyPrice=" + buyPrice + + ", buyOrder=" + buyOrder + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreCategoryConfigVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreCategoryConfigVO.java new file mode 100644 index 0000000..51dea31 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/ScoreCategoryConfigVO.java @@ -0,0 +1,83 @@ + +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 积分分类关联信息 + * @author lhd + */ +public class ScoreCategoryConfigVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 分类id + */ + private Long categoryId; + + /** + * 分类名称 + */ + private String categoryName; + + /** + * 使用上限比例 + */ + private Double useScoreLimit; + /** + * 获取上限比例 + */ + private Double getScoreLimit; + + public Long getCategoryId() { + return categoryId; + } + + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public Double getUseScoreLimit() { + return useScoreLimit; + } + + public void setUseScoreLimit(Double useScoreLimit) { + this.useScoreLimit = useScoreLimit; + } + + public Double getGetScoreLimit() { + return getScoreLimit; + } + + public void setGetScoreLimit(Double getScoreLimit) { + this.getScoreLimit = getScoreLimit; + } + + @Override + public String toString() { + return "ScoreCategoryConfigVO{" + + "categoryId=" + categoryId + + ", categoryName='" + categoryName + '\'' + + ", useScoreLimit=" + useScoreLimit + + ", getScoreLimit=" + getScoreLimit + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserBalanceLogVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserBalanceLogVO.java new file mode 100644 index 0000000..41414a1 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserBalanceLogVO.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 余额记录VO + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserBalanceLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private Long balanceLogId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "改变金额") + private Long changeBalance; + + @Schema(description = "收支类型 0支出 1收入") + private Integer ioType; + + @Schema(description = "支付编号(用于余额充值)") + private Long payId; + + @Schema(description = "1:充值 2:赠送 3:支付 4:退款 5:平台手动修改 6:vip购买 7:提现") + private Integer type; + + @Schema(description = "1:已支付 0:未支付(用于余额充值)") + private Integer isPayed; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "订单号列表") + private List orderIds; + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public List getOrderIds() { + return orderIds; + } + + public void setOrderIds(List orderIds) { + this.orderIds = orderIds; + } + + public Long getBalanceLogId() { + return balanceLogId; + } + + public void setBalanceLogId(Long balanceLogId) { + this.balanceLogId = balanceLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getChangeBalance() { + return changeBalance; + } + + public void setChangeBalance(Long changeBalance) { + this.changeBalance = changeBalance; + } + + public Integer getIoType() { + return ioType; + } + + public void setIoType(Integer ioType) { + this.ioType = ioType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getIsPayed() { + return isPayed; + } + + public void setIsPayed(Integer isPayed) { + this.isPayed = isPayed; + } + + @Override + public String toString() { + return "UserBalanceLogVO{" + + "balanceLogId=" + balanceLogId + + ", userId=" + userId + + ", changeBalance=" + changeBalance + + ", ioType=" + ioType + + ", payId=" + payId + + ", type=" + type + + ", isPayed=" + isPayed + + ", refundId=" + refundId + + ", orderIds=" + orderIds + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserExcelVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserExcelVO.java new file mode 100644 index 0000000..d9c83e7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserExcelVO.java @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.tmerclub.cloud.common.model.ExcelModel; +import com.tmerclub.cloud.user.converter.LevelTypeConverter; +import com.tmerclub.cloud.user.converter.UserStatusConverter; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户信息导出VO + * + * @author cl + * @date 2021-05-11 09:39:02 + */ +public class UserExcelVO extends ExcelModel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * excel 信息 + */ + public static final String EXCEL_NAME = "用户信息"; + public static final String SHEET_NAME = "sheet"; + /** + * 哪一行开始导出 + */ + public static final int MERGE_ROW_INDEX = 2; + /** + * 需要合并的列数组 + */ + public static final int[] MERGE_COLUMN_INDEX = {}; + + @ExcelProperty(value = {"用户信息", "序号"}, index = 0) + private String seq; + + @ExcelProperty(value = {"用户信息", "用户昵称"}, index = 1) + private String nickName; + + @ExcelProperty(value = {"用户信息", "手机号码"}, index = 2) + private String phone; + + /** + * 0 普通会员 1 付费会员 SeckillSkuMapper.xml + */ + @ExcelProperty(value = {"用户信息", "会员类型"}, index = 3, converter = LevelTypeConverter.class) + private Integer levelType; + + @ExcelProperty(value = {"用户信息", "会员等级"}, index = 4) + private String levelName; + + @ExcelProperty(value = {"用户信息", "付费会员等级"}, index = 5) + private String vipLevelName; + + @ExcelProperty(value = {"用户信息", "积分"}, index = 6) + private Long score; + + @ExcelProperty(value = {"用户信息", "状态"}, index = 7, converter = UserStatusConverter.class) + private Integer status; + + + @ExcelProperty(value = {"用户信息", "会员成长值"}, index = 8) + private Long growth; + + // -----------------------------------------------------以上是user 的信息 + + @ExcelProperty(value = {"用户信息", "消费金额"}, index = 9) + private Double consAmount; + + @ExcelProperty(value = {"用户信息", "实付金额"}, index = 10) + private Double actualAmount; + + @ExcelProperty(value = {"用户信息", "消费次数"}, index = 11) + private Integer consTimes; + + @ExcelProperty(value = {"用户信息", "平均折扣"}, index = 12) + private Double averDiscount; + + @ExcelProperty(value = {"用户信息", "充值金额"}, index = 13) + private Double rechargeAmount; + + @ExcelProperty({"用户信息", "充值次数"}) + private Integer rechargeTimes; + + @ExcelProperty(value = {"用户信息", "售后金额"}, index = 14) + private Double afterSaleAmount; + + @ExcelProperty(value = {"用户信息", "售后次数"}, index = 15) + private Integer afterSaleTimes; + + @ExcelProperty(value = {"用户信息", "当前积分"}, index = 16) + private Long currentScore; + + @ExcelProperty(value = {"用户信息", "累积积分"}, index = 17) + private Long sumScore; + + @ExcelProperty(value = {"用户信息", "当前余额"}, index = 18) + private Double currentBalance; + + @ExcelProperty(value = {"用户信息", "累计余额"}, index = 19) + private Double sumBalance; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = {"用户信息", "注册时间"}, index = 20) + private Date createTime; + + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = {"用户信息", "最近消费时间"}, index = 21) + private Date reConsTime; + + + public String getSeq() { + return seq; + } + + public void setSeq(String seq) { + this.seq = seq; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Long getGrowth() { + return growth; + } + + public void setGrowth(Long growth) { + this.growth = growth; + } + + public Double getConsAmount() { + return consAmount; + } + + public void setConsAmount(Double consAmount) { + this.consAmount = consAmount; + } + + public Double getActualAmount() { + return actualAmount; + } + + public void setActualAmount(Double actualAmount) { + this.actualAmount = actualAmount; + } + + public Integer getConsTimes() { + return consTimes; + } + + public void setConsTimes(Integer consTimes) { + this.consTimes = consTimes; + } + + public Double getAverDiscount() { + return averDiscount; + } + + public void setAverDiscount(Double averDiscount) { + this.averDiscount = averDiscount; + } + + public Double getRechargeAmount() { + return rechargeAmount; + } + + public void setRechargeAmount(Double rechargeAmount) { + this.rechargeAmount = rechargeAmount; + } + + public Integer getRechargeTimes() { + return rechargeTimes; + } + + public void setRechargeTimes(Integer rechargeTimes) { + this.rechargeTimes = rechargeTimes; + } + + public Double getAfterSaleAmount() { + return afterSaleAmount; + } + + public void setAfterSaleAmount(Double afterSaleAmount) { + this.afterSaleAmount = afterSaleAmount; + } + + public Integer getAfterSaleTimes() { + return afterSaleTimes; + } + + public void setAfterSaleTimes(Integer afterSaleTimes) { + this.afterSaleTimes = afterSaleTimes; + } + + public Long getCurrentScore() { + return currentScore; + } + + public void setCurrentScore(Long currentScore) { + this.currentScore = currentScore; + } + + public Long getSumScore() { + return sumScore; + } + + public void setSumScore(Long sumScore) { + this.sumScore = sumScore; + } + + public Double getCurrentBalance() { + return currentBalance; + } + + public void setCurrentBalance(Double currentBalance) { + this.currentBalance = currentBalance; + } + + public Double getSumBalance() { + return sumBalance; + } + + public void setSumBalance(Double sumBalance) { + this.sumBalance = sumBalance; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getReConsTime() { + return reConsTime; + } + + public void setReConsTime(Date reConsTime) { + this.reConsTime = reConsTime; + } + + public String getVipLevelName() { + return vipLevelName; + } + + public void setVipLevelName(String vipLevelName) { + this.vipLevelName = vipLevelName; + } + + @Override + public String toString() { + return "UserExcelVO{" + + "seq='" + seq + '\'' + + ", nickName='" + nickName + '\'' + + ", phone='" + phone + '\'' + + ", levelType=" + levelType + + ", levelName='" + levelName + '\'' + + ", vipLevelName='" + vipLevelName + '\'' + + ", score=" + score + + ", status=" + status + + ", growth=" + growth + + ", consAmount=" + consAmount + + ", actualAmount=" + actualAmount + + ", consTimes=" + consTimes + + ", averDiscount=" + averDiscount + + ", rechargeAmount=" + rechargeAmount + + ", rechargeTimes=" + rechargeTimes + + ", afterSaleAmount=" + afterSaleAmount + + ", afterSaleTimes=" + afterSaleTimes + + ", currentScore=" + currentScore + + ", sumScore=" + sumScore + + ", currentBalance=" + currentBalance + + ", sumBalance=" + sumBalance + + ", createTime=" + createTime + + ", reConsTime=" + reConsTime + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserGrowthLogVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserGrowthLogVO.java new file mode 100644 index 0000000..eb2b262 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserGrowthLogVO.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户成长值记录VO + * + * @author YXF + * @date 2020-12-08 10:16:53 + */ +public class UserGrowthLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "成长值获取记录表") + private Long logId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "来源 1 订单") + private Integer source; + + @Schema(description = "关联业务id") + private Long bizId; + + @Schema(description = "变更成长值") + private Integer changeGrowth; + + @Schema(description = "备注") + private String remarks; + + public Long getLogId() { + return logId; + } + + public void setLogId(Long logId) { + this.logId = logId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Long getBizId() { + return bizId; + } + + public void setBizId(Long bizId) { + this.bizId = bizId; + } + + public Integer getChangeGrowth() { + return changeGrowth; + } + + public void setChangeGrowth(Integer changeGrowth) { + this.changeGrowth = changeGrowth; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + public String toString() { + return "UserGrowthLogVO{" + + "logId=" + logId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",source=" + source + + ",bizId=" + bizId + + ",changeGrowth=" + changeGrowth + + ",remarks=" + remarks + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserInfoVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserInfoVO.java new file mode 100644 index 0000000..0bfebdc --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserInfoVO.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author FrozenWatermelon + * @date 2021/2/25 + */ +public class UserInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 用户积分 + */ + @Schema(description = "用户积分") + private Long score; + /** + * 用户余额 + */ + @Schema(description = "用户余额") + private Long actualBalance; + + /** + * 累计余额 + */ + @Schema(description = "累计余额") + private Long balance; + + @Schema(description = "通联累计余额") + private Long allinpayBalance; + + @Schema(description = "通联实际余额") + private Long allinpayActualBalance; + + /** + * 优惠券数量 + */ + @Schema(description = "优惠券数量") + private Integer couponNum; + /** + * 消息 + */ + @Schema(description = "消息数量") + private Integer notifyNum; + + @Schema(description = "商品收藏数量") + private Integer collections; + + public Long getScore() { + return score; + } + + public void setScore(Long score) { + this.score = score; + } + + + public Integer getCouponNum() { + return couponNum; + } + + public void setCouponNum(Integer couponNum) { + this.couponNum = couponNum; + } + + public Integer getNotifyNum() { + return notifyNum; + } + + public void setNotifyNum(Integer notifyNum) { + this.notifyNum = notifyNum; + } + + public Long getActualBalance() { + return actualBalance; + } + + public void setActualBalance(Long actualBalance) { + this.actualBalance = actualBalance; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public Integer getCollections() { + return collections; + } + + public void setCollections(Integer collections) { + this.collections = collections; + } + + public Long getAllinpayBalance() { + return allinpayBalance; + } + + public void setAllinpayBalance(Long allinpayBalance) { + this.allinpayBalance = allinpayBalance; + } + + public Long getAllinpayActualBalance() { + return allinpayActualBalance; + } + + public void setAllinpayActualBalance(Long allinpayActualBalance) { + this.allinpayActualBalance = allinpayActualBalance; + } + + @Override + public String toString() { + return "UserInfoVO{" + + "score=" + score + + ", actualBalance=" + actualBalance + + ", balance=" + balance + + ", allinpayBalance=" + allinpayBalance + + ", allinpayActualBalance=" + allinpayActualBalance + + ", couponNum=" + couponNum + + ", notifyNum=" + notifyNum + + ", collections=" + collections + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelRightsVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelRightsVO.java new file mode 100644 index 0000000..affafa7 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserLevelRightsVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 等级-权益关联信息VO + * + * @author FrozenWatermelon + * @date 2021-04-25 16:01:58 + */ +public class UserLevelRightsVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "等级-权益关联id") + private Long levelRightsId; + + @Schema(description = "等级id") + private Long userLevelId; + + @Schema(description = "权益id") + private Long rightsId; + + public Long getLevelRightsId() { + return levelRightsId; + } + + public void setLevelRightsId(Long levelRightsId) { + this.levelRightsId = levelRightsId; + } + + public Long getUserLevelId() { + return userLevelId; + } + + public void setUserLevelId(Long userLevelId) { + this.userLevelId = userLevelId; + } + + public Long getRightsId() { + return rightsId; + } + + public void setRightsId(Long rightsId) { + this.rightsId = rightsId; + } + + @Override + public String toString() { + return "UserLevelRightsVO{" + + "levelRightsId=" + levelRightsId + + ",createTime=" + createTime + + ",userLevelId=" + userLevelId + + ",rightsId=" + rightsId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRechargeCouponVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRechargeCouponVO.java new file mode 100644 index 0000000..d0e3a47 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRechargeCouponVO.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 余额优惠券关联表VO + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserRechargeCouponVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值id") + private Long rechargeId; + + @Schema(description = "优惠券id") + private Long couponId; + + @Schema(description = "优惠券数量") + private Integer couponNum; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Integer getCouponNum() { + return couponNum; + } + + public void setCouponNum(Integer couponNum) { + this.couponNum = couponNum; + } + + @Override + public String toString() { + return "UserRechargeCouponVO{" + + "rechargeId=" + rechargeId + + ",couponId=" + couponId + + ",createTime=" + createTime + + ",couponNum=" + couponNum + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRechargeVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRechargeVO.java new file mode 100644 index 0000000..1eeca57 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserRechargeVO.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.api.coupon.vo.CouponDataVO; +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 余额充值级别表VO + * + * @author FrozenWatermelon + * @date 2021-04-27 15:51:36 + */ +public class UserRechargeVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "充值id") + private Long rechargeId; + + @Schema(description = "充值余额标题") + private String rechargeTitle; + + @Schema(description = "充值金额") + private Long rechargeAmount; + + @Schema(description = "背景图片") + private String img; + + @Schema(description = "赠送金额") + private Long presAmount; + + @Schema(description = "赠送积分") + private Long presScore; + + @Schema(description = "赠送成长值") + private Integer presGrowth; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "优惠券信息") + private List couponList; + + @Schema(description = "赠送优惠券的总数量") + private Integer couponTotalNum; + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + public String getRechargeTitle() { + return rechargeTitle; + } + + public void setRechargeTitle(String rechargeTitle) { + this.rechargeTitle = rechargeTitle; + } + + public Long getRechargeAmount() { + return rechargeAmount; + } + + public void setRechargeAmount(Long rechargeAmount) { + this.rechargeAmount = rechargeAmount; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public Long getPresAmount() { + return presAmount; + } + + public void setPresAmount(Long presAmount) { + this.presAmount = presAmount; + } + + public Long getPresScore() { + return presScore; + } + + public void setPresScore(Long presScore) { + this.presScore = presScore; + } + + public Integer getPresGrowth() { + return presGrowth; + } + + public void setPresGrowth(Integer presGrowth) { + this.presGrowth = presGrowth; + } + + public Integer getSeq() { + return seq; + } + + public void setSeq(Integer seq) { + this.seq = seq; + } + + public List getCouponList() { + return couponList; + } + + public void setCouponList(List couponList) { + this.couponList = couponList; + } + + public Integer getCouponTotalNum() { + return couponTotalNum; + } + + public void setCouponTotalNum(Integer couponTotalNum) { + this.couponTotalNum = couponTotalNum; + } + + @Override + public String toString() { + return "UserRechargeVO{" + + "createTime=" + createTime + + ", updateTime=" + updateTime + + ", rechargeId=" + rechargeId + + ", rechargeTitle='" + rechargeTitle + '\'' + + ", rechargeAmount=" + rechargeAmount + + ", img='" + img + '\'' + + ", presAmount=" + presAmount + + ", presScore=" + presScore + + ", presGrowth=" + presGrowth + + ", seq=" + seq + + ", couponList=" + couponList + + ", couponTotalNum=" + couponTotalNum + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserScoreGetLogVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserScoreGetLogVO.java new file mode 100644 index 0000000..7234b21 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserScoreGetLogVO.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户积分获取记录VO + * + * @author FrozenWatermelon + * @date 2021-05-17 17:17:14 + */ +public class UserScoreGetLogVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "积分明细表") + private Long userScoreGetLogId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "可用积分") + private Long usableScore; + + @Schema(description = "业务id") + private String bizId; + + @Schema(description = "过期时间") + private Date expireTime; + + @Schema(description = "状态 -1过期 0订单抵现 1正常") + private Integer status; + + public Long getUserScoreGetLogId() { + return userScoreGetLogId; + } + + public void setUserScoreGetLogId(Long userScoreGetLogId) { + this.userScoreGetLogId = userScoreGetLogId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getUsableScore() { + return usableScore; + } + + public void setUsableScore(Long usableScore) { + this.usableScore = usableScore; + } + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "UserScoreGetLogVO{" + + "userScoreGetLogId=" + userScoreGetLogId + + ",createTime=" + createTime + + ",updateTime=" + updateTime + + ",userId=" + userId + + ",usableScore=" + usableScore + + ",bizId=" + bizId + + ",expireTime=" + expireTime + + ",status=" + status + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserVO.java new file mode 100644 index 0000000..c6ba9d3 --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/UserVO.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo; + +import com.tmerclub.cloud.common.vo.BaseVO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 用户表VO + * + * @author YXF + * @date 2020-12-08 11:18:04 + */ +public class UserVO extends BaseVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "ID") + private Long userId; + + @Schema(description = "用户昵称") + private String nickName; + + @Schema(description = "M(男) or F(女)") + private String sex; + + @Schema(description = "例如:2009-11-27") + private String birthDate; + + @Schema(description = "头像图片路径") + private String pic; + + @Schema(description = "状态 1 正常 0 无效") + private Integer status; + + @Schema(description = "会员等级(冗余字段)") + private Integer level; + + @Schema(description = "vip开始时间" ) + private Date vipStartTime; + + @Schema(description = "vip结束时间" ) + private Date vipEndTime; + + @Schema(description = "等级条件 0 普通会员 1 付费会员") + private Integer levelType; + + @Schema(description = "手机号(冗余)") + private String phone; + + /** + * openId list + */ + private List bizUserIdList; + + public List getBizUserIdList() { + return bizUserIdList; + } + + public void setBizUserIdList(List bizUserIdList) { + this.bizUserIdList = bizUserIdList; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String birthDate) { + this.birthDate = birthDate; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Date getVipEndTime() { + return vipEndTime; + } + + public void setVipEndTime(Date vipEndTime) { + this.vipEndTime = vipEndTime; + } + + public Integer getLevelType() { + return levelType; + } + + public void setLevelType(Integer levelType) { + this.levelType = levelType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Date getVipStartTime() { + return vipStartTime; + } + + public void setVipStartTime(Date vipStartTime) { + this.vipStartTime = vipStartTime; + } + + @Override + public String toString() { + return "UserVO{" + + "userId=" + userId + + ", nickName='" + nickName + '\'' + + ", sex='" + sex + '\'' + + ", birthDate='" + birthDate + '\'' + + ", pic='" + pic + '\'' + + ", status=" + status + + ", level=" + level + + ", vipStartTime=" + vipStartTime + + ", vipEndTime=" + vipEndTime + + ", levelType=" + levelType + + ", phone='" + phone + '\'' + + ", bizUserIdList=" + bizUserIdList + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceFinanceDetailVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceFinanceDetailVO.java new file mode 100644 index 0000000..a03d6ce --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceFinanceDetailVO.java @@ -0,0 +1,217 @@ +package com.tmerclub.cloud.user.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +@Document("user_balance_log") +public class MongoBalanceFinanceDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "交易时间") + private Date transDate; + + @Schema(description = "订单号") + private String orderId; + + @Schema(description = "下单时间") + private Date placeTime; + + @Schema(description = "交易摘要") + private String prodName; + + @Schema(description = "发生渠道") + private String shopName; + + @Schema(description = "资金变更申请人") + private String userName; + + @Schema(description = "业务类型 1.订单支付 2.订单退款 3.余额充值 4.购买会员") + private Integer bizType; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式 -1.不限") + private Integer payType; + + @Schema(description = "收支金额") + private Long transAmount; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "退款单号") + private Long refundId; + + @Schema(description = "支付多单订单号") + private String orderIds; + + @Schema(description = "支付交易单号") + private String payIds; + + @Schema(description = "店铺id") + private Long shopId; + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "余额充值id") + private Long rechargeId; + + public Date getTransDate() { + return transDate; + } + + public void setTransDate(Date transDate) { + this.transDate = transDate; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public Date getPlaceTime() { + return placeTime; + } + + public void setPlaceTime(Date placeTime) { + this.placeTime = placeTime; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getBizType() { + return bizType; + } + + public void setBizType(Integer bizType) { + this.bizType = bizType; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getTransAmount() { + return transAmount; + } + + public void setTransAmount(Long transAmount) { + this.transAmount = transAmount; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getRefundId() { + return refundId; + } + + public void setRefundId(Long refundId) { + this.refundId = refundId; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public String getPayIds() { + return payIds; + } + + public void setPayIds(String payIds) { + this.payIds = payIds; + } + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getRechargeId() { + return rechargeId; + } + + public void setRechargeId(Long rechargeId) { + this.rechargeId = rechargeId; + } + + @Override + public String toString() { + return "MongoBalanceFinanceDetailVO{" + + "transDate=" + transDate + + ", orderId='" + orderId + '\'' + + ", placeTime=" + placeTime + + ", prodName='" + prodName + '\'' + + ", shopName='" + shopName + '\'' + + ", userName='" + userName + '\'' + + ", bizType=" + bizType + + ", payType=" + payType + + ", transAmount=" + transAmount + + ", payId=" + payId + + ", refundId=" + refundId + + ", orderIds='" + orderIds + '\'' + + ", payIds='" + payIds + '\'' + + ", shopId=" + shopId + + ", userId=" + userId + + ", rechargeId=" + rechargeId + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceShopAccountDetailVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceShopAccountDetailVO.java new file mode 100644 index 0000000..f0a762c --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceShopAccountDetailVO.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author TRACK + */ +@Document("user_balance_log") +public class MongoBalanceShopAccountDetailVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "积分数目") + private Long scoreCount; + + @Schema(description = "合计") + private Long total; + + @Schema(description = "数据分析用户数量") + private Integer count; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getTotal() { + return total; + } + + public void setTotal(Long total) { + this.total = total; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + @Override + public String toString() { + return "MongoBalanceShopAccountDetailVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", wechatAmount=" + wechatAmount + + ", alipayAmount=" + alipayAmount + + ", balanceAmount=" + balanceAmount + + ", scoreCount=" + scoreCount + + ", total=" + total + + ", count=" + count + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceUserManagerVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceUserManagerVO.java new file mode 100644 index 0000000..193d53e --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoBalanceUserManagerVO.java @@ -0,0 +1,72 @@ +package com.tmerclub.cloud.user.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.Date; + +/** + * @author TRACK + */ +@Document("user_balance_log") +public class MongoBalanceUserManagerVO { + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "最新充值时间") + private Date reConsTime; + + @Schema(description = "充值金额") + private Long rechargeAmount; + + @Schema(description = "充值次数") + private Integer rechargeTimes; + + public MongoBalanceUserManagerVO() { + this.rechargeAmount = 0L; + this.rechargeTimes = 0; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Date getReConsTime() { + return reConsTime; + } + + public void setReConsTime(Date reConsTime) { + this.reConsTime = reConsTime; + } + + public Long getRechargeAmount() { + return rechargeAmount; + } + + public void setRechargeAmount(Long rechargeAmount) { + this.rechargeAmount = rechargeAmount; + } + + public Integer getRechargeTimes() { + return rechargeTimes; + } + + public void setRechargeTimes(Integer rechargeTimes) { + this.rechargeTimes = rechargeTimes; + } + + @Override + public String toString() { + return "MongoBalanceUserManagerVO{" + + "userId=" + userId + + ", reConsTime=" + reConsTime + + ", rechargeAmount=" + rechargeAmount + + ", rechargeTimes=" + rechargeTimes + + '}'; + } +} diff --git a/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoScoreUserPayInfoVO.java b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoScoreUserPayInfoVO.java new file mode 100644 index 0000000..741461b --- /dev/null +++ b/tmerclub-user/src/main/java/com/tmerclub/cloud/user/vo/mongo/MongoScoreUserPayInfoVO.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.tmerclub.cloud.user.vo.mongo; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author TRACK + */ +@Document("user_score_log") +public class MongoScoreUserPayInfoVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @Schema(description = "店铺id 0是平台") + private Long shopId; + + @Schema(description = "店铺名称 平台是官方店") + private String shopName; + + @Schema(description = "支付时间") + private Date payTime; + + @Schema(description = "支付入口[0订单 1充值 2开通会员]") + private Integer payEntry; + + @Schema(description = "关联订单号") + private String orderIds; + + /** + * @see com.tmerclub.cloud.common.constant.PayType + */ + @Schema(description = "支付方式") + private Integer payType; + + @Schema(description = "支付单号") + private Long payId; + + @Schema(description = "支付积分") + private Long scoreCount; + + @Schema(description = "支付宝金额") + private Long alipayAmount; + + @Schema(description = "微信金额") + private Long wechatAmount; + + @Schema(description = "余额金额") + private Long balanceAmount; + + @Schema(description = "合计") + private Long payAmount; + + public Long getShopId() { + return shopId; + } + + public void setShopId(Long shopId) { + this.shopId = shopId; + } + + public String getShopName() { + return shopName; + } + + public void setShopName(String shopName) { + this.shopName = shopName; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public Integer getPayEntry() { + return payEntry; + } + + public void setPayEntry(Integer payEntry) { + this.payEntry = payEntry; + } + + public String getOrderIds() { + return orderIds; + } + + public void setOrderIds(String orderIds) { + this.orderIds = orderIds; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getScoreCount() { + return scoreCount; + } + + public void setScoreCount(Long scoreCount) { + this.scoreCount = scoreCount; + } + + public Long getAlipayAmount() { + return alipayAmount; + } + + public void setAlipayAmount(Long alipayAmount) { + this.alipayAmount = alipayAmount; + } + + public Long getWechatAmount() { + return wechatAmount; + } + + public void setWechatAmount(Long wechatAmount) { + this.wechatAmount = wechatAmount; + } + + public Long getBalanceAmount() { + return balanceAmount; + } + + public void setBalanceAmount(Long balanceAmount) { + this.balanceAmount = balanceAmount; + } + + public Long getPayAmount() { + return payAmount; + } + + public void setPayAmount(Long payAmount) { + this.payAmount = payAmount; + } + + @Override + public String toString() { + return "MongoScoreUserPayInfoVO{" + + "shopId=" + shopId + + ", shopName='" + shopName + '\'' + + ", payTime=" + payTime + + ", payEntry=" + payEntry + + ", orderIds='" + orderIds + '\'' + + ", payType=" + payType + + ", payId=" + payId + + ", scoreCount=" + scoreCount + + ", alipayAmount=" + alipayAmount + + ", wechatAmount=" + wechatAmount + + ", balanceAmount=" + balanceAmount + + ", payAmount=" + payAmount + + '}'; + } +} diff --git a/tmerclub-user/src/main/resources/bootstrap.yml b/tmerclub-user/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..ac89484 --- /dev/null +++ b/tmerclub-user/src/main/resources/bootstrap.yml @@ -0,0 +1,36 @@ +server: + port: ${MALL4CLOUD_PORT:9105} +spring: + application: + name: @artifactId@ + cloud: + nacos: + discovery: + server-addr: ${NACOS_HOST:192.168.193.128}:${NACOS_PORT:8848} + username: nacos + password: ${NACOS_PASSWORD:hn02le.34lkdLKD} + namespace: ${NACOS_NAMESPACE:} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + shared-configs: + - application.${spring.cloud.nacos.config.file-extension} + username: ${spring.cloud.nacos.discovery.username} + password: ${spring.cloud.nacos.discovery.password} + namespace: ${spring.cloud.nacos.discovery.namespace} +mall4cloud: + user: + thread: + coreSize: 0 + maxSize: 200 + keepAliveTime: 60 + +logging: + tracer: + pattern: '%5p [${spring.application.name:},%X{X-B3-Parent-SpanName},%X{X-B3-TraceId},%X{X-B3-SpanId}]' + +# dubbo端口:默认为服务端口+2000 +dubbo: + protocol: + port: ${MALL4CLOUD_DUBBO_PORT:9505} + diff --git a/tmerclub-user/src/main/resources/mapper/UserAddrMapper.xml b/tmerclub-user/src/main/resources/mapper/UserAddrMapper.xml new file mode 100644 index 0000000..99fc0b6 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserAddrMapper.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + `addr_id`, + `user_id`, + `create_time`, + `update_time`, + `mobile`, + `is_default`, + `consignee`, + `province_id`, + `province`, + `city_id`, + `city`, + `area_id`, + `area`, + `post_code`, + `addr`, + `lng`, + `lat` + + + + + insert into user_addr (`user_id`, `mobile`, `is_default`, `consignee`, `province_id`, `province`, `city_id`, + `city`, `area_id`, `area`, `post_code`, `addr`, `lng`, `lat`) + values (#{userAddr.userId}, #{userAddr.mobile}, #{userAddr.isDefault}, #{userAddr.consignee}, + #{userAddr.provinceId}, #{userAddr.province}, #{userAddr.cityId}, #{userAddr.city}, #{userAddr.areaId}, + #{userAddr.area}, #{userAddr.postCode}, #{userAddr.addr}, #{userAddr.lng}, #{userAddr.lat}); + + + update user_addr + + + `user_id` = #{userAddr.userId}, + + + `mobile` = #{userAddr.mobile}, + + + `is_default` = #{userAddr.isDefault}, + + + `consignee` = #{userAddr.consignee}, + + + `province_id` = #{userAddr.provinceId}, + + + `province` = #{userAddr.province}, + + + `city_id` = #{userAddr.cityId}, + + + `city` = #{userAddr.city}, + + + `area_id` = #{userAddr.areaId}, + + + `area` = #{userAddr.area}, + + + `post_code` = #{userAddr.postCode}, + + + `addr` = #{userAddr.addr}, + + + `lng` = #{userAddr.lng}, + + + `lat` = #{userAddr.lat}, + + + where addr_id = #{userAddr.addrId} + + + delete + from user_addr + where user_id = #{userId} + + and addr_id = #{addrId} + + + + + update user_addr + set is_default = 0 + where user_id = #{userId} and is_default = 1 + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserConsigneeMapper.xml b/tmerclub-user/src/main/resources/mapper/UserConsigneeMapper.xml new file mode 100644 index 0000000..b0b2e20 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserConsigneeMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + `user_consignee_id`,`create_time`,`update_time`,`name`,`mobile`,`user_id` + + + + insert into user_consignee (user_id,`name`,`mobile`) + values (#{userConsignee.name},#{userConsignee.name},#{userConsignee.mobile}); + + + update user_consignee + + + `name` = #{userConsignee.name}, + + + `mobile` = #{userConsignee.mobile}, + + + where user_id = #{userConsignee.userId} + + + + delete from `user_consignee` WHERE user_id = #{userId} + + diff --git a/tmerclub-user/src/main/resources/mapper/UserLevelLogMapper.xml b/tmerclub-user/src/main/resources/mapper/UserLevelLogMapper.xml new file mode 100644 index 0000000..88841b5 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserLevelLogMapper.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + `term_type`,`level_log_id`,`create_time`,`update_time`,`user_id`,`level_io_type`,`level_change_reason`,`before_level`,`before_level_type`,`after_level`,`after_level_type`,`pay_id`,`is_payed`,`pay_amount` + + + + + + insert into user_level_log (`user_id`,`level_io_type`,`level_change_reason`,`term_type`,`before_level`,`before_level_type`,`after_level`,`after_level_type`,`pay_id`,`is_payed`,`pay_amount`, level_name, `pay_sys_type`) + values (#{userLevelLog.userId},#{userLevelLog.levelIoType},#{userLevelLog.levelChangeReason},#{userLevelLog.termType},#{userLevelLog.beforeLevel},#{userLevelLog.beforeLevelType},#{userLevelLog.afterLevel},#{userLevelLog.afterLevelType},#{userLevelLog.payId},#{userLevelLog.isPayed},#{userLevelLog.payAmount}, #{userLevelLog.levelName}, #{userLevelLog.paySysType}); + + + insert into user_level_log (`user_id`,`level_io_type`,`level_change_reason`,`term_type`,`before_level`,`before_level_type`,`after_level`,`after_level_type`,`pay_id`,`is_payed`,`pay_amount`) + values + + (#{userLevelLog.userId},#{userLevelLog.levelIoType},#{userLevelLog.levelChangeReason},#{userLevelLog.termType},#{userLevelLog.beforeLevel},#{userLevelLog.beforeLevelType},#{userLevelLog.afterLevel},#{userLevelLog.afterLevelType},#{userLevelLog.payId},#{userLevelLog.isPayed},#{userLevelLog.payAmount}) + + + + update user_level_log + + + `user_id` = #{userLevelLog.userId}, + + + `level_io_type` = #{userLevelLog.levelIoType}, + + + `level_change_reason` = #{userLevelLog.levelChangeReason}, + + + `before_level` = #{userLevelLog.beforeLevel}, + + + `before_level_type` = #{userLevelLog.beforeLevelType}, + + + `after_level` = #{userLevelLog.afterLevel}, + + + `after_level_type` = #{userLevelLog.afterLevelType}, + + + `pay_id` = #{userLevelLog.payId}, + + + `is_payed` = #{userLevelLog.isPayed}, + + + `pay_amount` = #{userLevelLog.payAmount}, + + + where level_log_id = #{userLevelLog.levelLogId} + + + delete from user_level_log where level_log_id = #{levelLogId} + + + + update user_level_log set pay_id= #{payId} ,is_payed = 1, pay_type = #{payType} + where level_log_id = #{levelLogId} and is_payed = 0 + + + + + + delete from `user_level_log` WHERE user_id = #{userId} + + + + + + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserLevelRightsMapper.xml b/tmerclub-user/src/main/resources/mapper/UserLevelRightsMapper.xml new file mode 100644 index 0000000..42e686f --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserLevelRightsMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + `level_rights_id`,`create_time`,`user_level_id`,`rights_id` + + + + insert into user_level_rights (`user_level_id`,`rights_id`) + values (#{userLevelId},#{rightId}); + + + + delete from user_level_rights where user_level_id = #{userLevelId} + + + delete from user_level_rights where rights_id = #{rightId} + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserLevelTermMapper.xml b/tmerclub-user/src/main/resources/mapper/UserLevelTermMapper.xml new file mode 100644 index 0000000..321af6d --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserLevelTermMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + `level_term_id`,`create_time`,`user_level_id`,`term_type`,`need_amount`,`status` + + + + + insert into user_level_term (`user_level_id`,`term_type`,`need_amount`,`status`) + values (#{userLevelTerm.userLevelId},#{userLevelTerm.termType},#{userLevelTerm.needAmount},#{userLevelTerm.status}); + + + update user_level_term + + + `user_level_id` = #{userLevelTerm.userLevelId}, + + + `need_amount` = #{userLevelTerm.needAmount}, + + + `term_type` = #{userLevelTerm.termType}, + + + `status` = #{userLevelTerm.status}, + + + where level_term_id = #{userLevelTerm.levelTermId} + + + delete from user_level_term where level_term_id in + + #{userLevelTermId} + + + + delete from user_level_term where level_term_id = #{levelTermId} + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserMapper.xml b/tmerclub-user/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..6ea4914 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `user_id`,`create_time`,`update_time`,`nick_name`,`sex`,`birth_date`,`pic`,`status`,`level`,`vip_end_time`,`level_type`,`phone`,`vip_level`,`prod_recommendation` + + + + + + insert into user (`user_id`,`nick_name`,`sex`,`birth_date`,`pic`,`status`,`level`,`vip_end_time`,`level_type`,`phone`,`prod_recommendation`) + values (#{user.userId},#{user.nickName},#{user.sex},#{user.birthDate},#{user.pic},#{user.status},#{user.level},#{user.vipEndTime},#{user.levelType},#{user.phone},#{user.prodRecommendation}); + + + + + + insert into `user` (`user_id`,`nick_name`,`sex`,`birth_date`,`pic`,`status`,`level`,`vip_end_time`,`level_type`,`phone`,`vip_level`) + values + + ( #{user.userId}, #{user.nickName}, #{user.sex}, #{user.birthDate}, #{user.pic}, #{user.status}, #{user.level}, #{user.vipEndTime}, #{user.levelType}, #{user.phone}, #{user.vipLevel} ) + + + + + update user + + + `nick_name` = #{user.nickName}, + + + `sex` = #{user.sex}, + + + `birth_date` = #{user.birthDate}, + + + `pic` = #{user.pic}, + + + `phone` = #{user.phone}, + + + `status` = #{user.status}, + + + `level` = #{user.level}, + + + `prod_recommendation` = #{user.prodRecommendation}, + + + where user_id = #{user.userId} + + + + UPDATE + user + SET + `level` = #{level} + WHERE user_id IN + (SELECT user_id FROM user_extension WHERE level_type = 1 AND growth > #{minGrowth} + + AND growth < #{maxGrowth} + + ) + + + UPDATE `user` u INNER JOIN `user_extension` ue SET u.level = ue.level + WHERE u.user_id = ue.user_id AND + u.user_id IN + + #{userId} + + + + + + + + update user set vip_level = #{afterLevel},level_type = 1,vip_end_time = #{date} where user_id = #{userId} + + + UPDATE `user` u INNER JOIN `user_extension` ue SET u.level = ue.level,u.level_type = ue.level_type,u.vip_level= ue.vip_level + WHERE u.user_id = ue.user_id AND + u.user_id IN + + #{userId} + + + + + + + + + + + + + + + + + + delete from `user` where user_id = #{userId} + + + + + + + + + + + + + + + + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserScoreLockMapper.xml b/tmerclub-user/src/main/resources/mapper/UserScoreLockMapper.xml new file mode 100644 index 0000000..6656579 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserScoreLockMapper.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + `id`, + `create_time`, + `update_time`, + `user_id`, + `order_id`, + `status`, + `score`, + `score_get_log_ids` + + + + + + insert into user_score_lock (`user_id`, `order_id`, `status`, `score`, `score_get_log_ids`) + values (#{userScoreLock.userId}, #{userScoreLock.orderId}, #{userScoreLock.status}, #{userScoreLock.score}, #{userScoreLock.scoreGetLogIds}); + + + update user_score_lock + + + `user_id` = #{userScoreLock.userId}, + + + `order_id` = #{userScoreLock.orderId}, + + + `status` = #{userScoreLock.status}, + + + `score` = #{userScoreLock.score}, + + + `score_get_log_ids` = #{userScoreLock.scoreGetLogIds}, + + + where id = #{userScoreLock.id} + + + delete + from user_score_lock + where id = #{id} + + + + insert into user_score_lock (`user_id`,`order_id`,`status`,`score`,`score_get_log_ids`) + values + + (#{userScoreLock.userId}, #{userScoreLock.orderId}, #{userScoreLock.status}, #{userScoreLock.score}, #{userScoreLock.scoreGetLogIds}) + + + + update user_score_lock + set status = #{status} where id in + + #{userScoreLockId} + + + + + delete from `user_score_lock` WHERE user_id = #{userId} + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserTagMapper.xml b/tmerclub-user/src/main/resources/mapper/UserTagMapper.xml new file mode 100644 index 0000000..432501c --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserTagMapper.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `user_tag_id`,`create_time`,`update_time`,`tag_name`,`tag_type`,`is_sys_turn_on`,`register_min_time`,`register_max_time`,`subscribe_min_time`,`subscribe_max_time`,`to_be_member_min_time`,`to_be_member_max_time`,`recent_purchase_time`,`purchase_num_time`,`purchase_num_min_num`,`purchase_num_max_num`,`purchase_amount_time`,`purchase_amount_min_amount`,`purchase_amount_max_amount`,`order_average_price_time`,`order_average_price_min_amount`,`order_average_price_max_amount`,`recharge_amount_time`,`recharge_amount_min_amount`,`recharge_amount_max_amount`,`recharge_num_time`,`recharge_num_min_num`,`recharge_num_max_num`,`user_num`,`statistic_update_time` + + + + + + + insert into user_tag (`tag_name`,`tag_type`,`is_sys_turn_on`,`register_min_time`,`register_max_time`,`subscribe_min_time`,`subscribe_max_time`,`to_be_member_min_time`,`to_be_member_max_time`,`recent_purchase_time`,`purchase_num_time`,`purchase_num_min_num`,`purchase_num_max_num`,`purchase_amount_time`,`purchase_amount_min_amount`,`purchase_amount_max_amount`,`order_average_price_time`,`order_average_price_min_amount`,`order_average_price_max_amount`,`recharge_amount_time`,`recharge_amount_min_amount`,`recharge_amount_max_amount`,`recharge_num_time`,`recharge_num_min_num`,`recharge_num_max_num`,`user_num`,`statistic_update_time`) + values (#{userTag.tagName},#{userTag.tagType},#{userTag.isSysTurnOn},#{userTag.registerMinTime},#{userTag.registerMaxTime},#{userTag.subscribeMinTime},#{userTag.subscribeMaxTime},#{userTag.toBeMemberMinTime},#{userTag.toBeMemberMaxTime},#{userTag.recentPurchaseTime},#{userTag.purchaseNumTime},#{userTag.purchaseNumMinNum},#{userTag.purchaseNumMaxNum},#{userTag.purchaseAmountTime},#{userTag.purchaseAmountMinAmount},#{userTag.purchaseAmountMaxAmount},#{userTag.orderAveragePriceTime},#{userTag.orderAveragePriceMinAmount},#{userTag.orderAveragePriceMaxAmount},#{userTag.rechargeAmountTime},#{userTag.rechargeAmountMinAmount},#{userTag.rechargeAmountMaxAmount},#{userTag.rechargeNumTime},#{userTag.rechargeNumMinNum},#{userTag.rechargeNumMaxNum},#{userTag.userNum},#{userTag.statisticUpdateTime}); + + + update user_tag + + + `tag_name` = #{userTag.tagName}, + + + `tag_type` = #{userTag.tagType}, + + + `is_sys_turn_on` = #{userTag.isSysTurnOn}, + + `register_min_time` = #{userTag.registerMinTime}, + `register_max_time` = #{userTag.registerMaxTime}, + `subscribe_min_time` = #{userTag.subscribeMinTime}, + `subscribe_max_time` = #{userTag.subscribeMaxTime}, + `to_be_member_min_time` = #{userTag.toBeMemberMinTime}, + `to_be_member_max_time` = #{userTag.toBeMemberMaxTime}, + `recent_purchase_time` = #{userTag.recentPurchaseTime}, + `purchase_num_time` = #{userTag.purchaseNumTime}, + `purchase_num_min_num` = #{userTag.purchaseNumMinNum}, + `purchase_num_max_num` = #{userTag.purchaseNumMaxNum}, + `purchase_amount_time` = #{userTag.purchaseAmountTime}, + `purchase_amount_min_amount` = #{userTag.purchaseAmountMinAmount}, + `purchase_amount_max_amount` = #{userTag.purchaseAmountMaxAmount}, + `order_average_price_time` = #{userTag.orderAveragePriceTime}, + `order_average_price_min_amount` = #{userTag.orderAveragePriceMinAmount}, + `order_average_price_max_amount` = #{userTag.orderAveragePriceMaxAmount}, + `recharge_amount_time` = #{userTag.rechargeAmountTime}, + `recharge_amount_min_amount` = #{userTag.rechargeAmountMinAmount}, + `recharge_amount_max_amount` = #{userTag.rechargeAmountMaxAmount}, + `recharge_num_time` = #{userTag.rechargeNumTime}, + `recharge_num_min_num` = #{userTag.rechargeNumMinNum}, + `recharge_num_max_num` = #{userTag.rechargeNumMaxNum}, + + `user_num` = #{userTag.userNum}, + + + `statistic_update_time` = #{userTag.statisticUpdateTime}, + + + where user_tag_id = #{userTag.userTagId} + + + + UPDATE `user_tag` SET user_num = user_num + #{changeUserNum} where user_tag_id = #{tagId} and #{changeUserNum} + user_num >= 0 + + + + delete from user_tag where user_tag_id = #{userTagId} + + + diff --git a/tmerclub-user/src/main/resources/mapper/UserWithdrawCashMapper.xml b/tmerclub-user/src/main/resources/mapper/UserWithdrawCashMapper.xml new file mode 100644 index 0000000..caea7c0 --- /dev/null +++ b/tmerclub-user/src/main/resources/mapper/UserWithdrawCashMapper.xml @@ -0,0 +1,73 @@ + + + + + + + INSERT INTO user_withdraw_cash(`user_id`, `pay_sys_type`, `order_no`, `biz_order_no`, `amount`, `bank_card_no`, `status`, `pay_fail_message`, `create_time`, `update_time`) + VALUES + (#{withdrawCash.userId}, #{withdrawCash.paySysType}, #{withdrawCash.orderNo}, #{withdrawCash.bizOrderNo}, #{withdrawCash.amount}, #{withdrawCash.bankCardNo}, #{withdrawCash.status}, #{withdrawCash.payFailMessage}, NOW(), NOW()); + + + + UPDATE user_withdraw_cash + SET + + `status` = #{withdrawCash.status}, + + + pay_fail_message = #{withdrawCash.payFailMessage}, + + update_time = NOW() + WHERE + cash_id = #{withdrawCash.cashId} + + + + + + + + + + \ No newline at end of file