diff --git a/.gitignore b/.gitignore
index 8575d42..e3a09bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,51 +1,36 @@
-######################################################################
-# Build Tools
+*.class
+.DS_Store
-.gradle
-/build/
-!gradle/wrapper/gradle-wrapper.jar
+# Package Files #
+*.jar
+*.war
+*.ear
+**/target/
+**/**/target/
-target/
-!.mvn/wrapper/maven-wrapper.jar
+# eclipse
+.settings/
+.classpath
+.project
+logs/
-######################################################################
-# IDE
+# idea
+.idea/
+*.iml
+.murphy.yml
+
+*velocity.log*
### STS ###
.apt_generated
-.classpath
.factorypath
-.project
-.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
-*.iml
*.ipr
-
-### NetBeans ###
-nbproject/private/
-build/*
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
-
-######################################################################
-# Others
*.log
-*.xml.versionsBackup
-*.swp
-
-!*/build/*.java
-!*/build/*.html
-!*/build/*.xml
-
-### JRebel ###
-rebel.xml
-
-application-my.yaml
-
-/yshop-ui-app/unpackage/
+tmp/
+!DmJdbcDriver18.jar
+!kingbase8-8.6.0.jar
diff --git a/sql/yshop_pro.sql b/sql/yshop_pro.sql
index a4047c8..8255f6e 100644
--- a/sql/yshop_pro.sql
+++ b/sql/yshop_pro.sql
@@ -7542,7 +7542,7 @@ CREATE TABLE `yshop_store_product_attr_bak` (
`attr_values` varchar(256) NOT NULL COMMENT '属性值',
PRIMARY KEY (`id`) USING BTREE,
KEY `store_id` (`product_id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=538 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性表备份';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性表备份';
-- ----------------------------
-- Records of yshop_store_product_attr_bak
@@ -7561,7 +7561,7 @@ CREATE TABLE `yshop_store_product_attr_result` (
`change_time` datetime NOT NULL COMMENT '上次修改时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `product_id` (`product_id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=349 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表';
-- ----------------------------
-- Records of yshop_store_product_attr_result
@@ -7634,7 +7634,7 @@ CREATE TABLE `yshop_store_product_attr_result_bak` (
`change_time` datetime NOT NULL COMMENT '上次修改时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `product_id` (`product_id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=346 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表备份';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性详情表备份';
-- ----------------------------
-- Records of yshop_store_product_attr_result_bak
@@ -7670,7 +7670,7 @@ CREATE TABLE `yshop_store_product_attr_value` (
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `unique` (`unique`,`sku`) USING BTREE,
KEY `store_id` (`product_id`,`sku`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=515 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表';
-- ----------------------------
-- Records of yshop_store_product_attr_value
@@ -7862,7 +7862,7 @@ CREATE TABLE `yshop_store_product_attr_value_bak` (
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `unique` (`unique`,`sku`) USING BTREE,
KEY `store_id` (`product_id`,`sku`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=515 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表备份';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品属性值表备份';
-- ----------------------------
-- Records of yshop_store_product_attr_value_bak
@@ -8087,7 +8087,7 @@ CREATE TABLE `yshop_store_product_bak` (
KEY `sales` (`sales`) USING BTREE,
KEY `add_time` (`create_time`) USING BTREE,
KEY `is_postage` (`is_postage`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品表';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品表';
-- ----------------------------
-- Records of yshop_store_product_bak
@@ -8113,7 +8113,7 @@ CREATE TABLE `yshop_store_product_brand` (
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌';
-- ----------------------------
-- Records of yshop_store_product_brand
@@ -8144,7 +8144,7 @@ CREATE TABLE `yshop_store_product_brand_bak` (
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌备份';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品品牌备份';
-- ----------------------------
-- Records of yshop_store_product_brand_bak
@@ -8176,7 +8176,7 @@ CREATE TABLE `yshop_store_product_category` (
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类';
-- ----------------------------
-- Records of yshop_store_product_category
@@ -8230,7 +8230,7 @@ CREATE TABLE `yshop_store_product_category_bak` (
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类备份';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类备份';
-- ----------------------------
-- Records of yshop_store_product_category_bak
@@ -8354,7 +8354,7 @@ CREATE TABLE `yshop_store_product_coupon_relation_bak` (
`deleted` bit(1) DEFAULT b'0' COMMENT '删除',
`tenant_id` bigint(20) DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品优惠券关联表备份';
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='商品优惠券关联表备份';
-- ----------------------------
-- Records of yshop_store_product_coupon_relation_bak
@@ -8642,3 +8642,182 @@ INSERT INTO `yshop_wechat_template` (`id`, `tempkey`, `name`, `content`, `tempid
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
+
+
+-- ----------------------------
+-- Table structure for yshop_material_bak 2023/11/24 素材库备份表
+-- ----------------------------
+DROP TABLE IF EXISTS `yshop_material_bak`;
+CREATE TABLE `yshop_material_bak` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `creator` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '创建者',
+ `type` char(2) COLLATE utf8mb4_bin NOT NULL COMMENT '类型1、图片;2、视频',
+ `group_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分组ID',
+ `name` varchar(200) COLLATE utf8mb4_bin NOT NULL COMMENT '素材名',
+ `url` varchar(500) COLLATE utf8mb4_bin DEFAULT '' COMMENT '素材链接',
+ `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='素材库备份表';
+
+SET FOREIGN_KEY_CHECKS = 1;
+
+
+-- ----------------------------
+-- Table structure for yshop_material_group_bak
+-- ----------------------------
+DROP TABLE IF EXISTS `yshop_material_group_bak`;
+CREATE TABLE `yshop_material_group_bak` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `creator` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '创建者',
+ `name` varchar(200) COLLATE utf8mb4_bin NOT NULL COMMENT '分组名',
+ `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='素材分组备份表';
+
+SET FOREIGN_KEY_CHECKS = 1;
+
+-- 2024-1-15
+CREATE TABLE `yshop_campaign_info` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '营销活动id',
+ `name` varchar(50) NOT NULL COMMENT '活动名称',
+ `type` tinyint(4) NOT NULL COMMENT '活动类型:1、拼团,2、秒杀,3、限时折扣',
+ `remark` varchar(255) DEFAULT NULL COMMENT '备注',
+ `start_time` varchar(20) NOT NULL COMMENT '活动开始时间',
+ `end_time` varchar(20) NOT NULL COMMENT '活动结束时间',
+ `if_limit` tinyint(1) NOT NULL COMMENT '商品限购 1-不限购 2-限购',
+ `limit_number` int(11) DEFAULT NULL COMMENT '限购几件/人',
+ `if_enable` tinyint(1) NOT NULL COMMENT '活动预热 1-停用 2-启用',
+ `enable_time` int(11) DEFAULT NULL COMMENT '预热几分钟前',
+ `state` tinyint(1) DEFAULT NULL COMMENT '活动状态 0-未开始 1-进行中 2-已结束',
+ `person` int(11) DEFAULT NULL COMMENT '成团人数',
+ `effective_time` int(11) DEFAULT NULL COMMENT '成团有效时间几(分钟)',
+ `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='活动信息表';
+
+CREATE TABLE `yshop_campaign_detail` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '营销活动明细id',
+ `campaign_id` bigint(20) NOT NULL COMMENT '营销活动id',
+ `product_id` bigint(20) NOT NULL COMMENT '商品id',
+ `sku_id` bigint(20) NOT NULL COMMENT '规格id',
+ `original_price` decimal(15,2) NOT NULL COMMENT '原价',
+ `price` decimal(15,2) NOT NULL COMMENT '活动价格',
+ `discount` decimal(4,2) DEFAULT NULL COMMENT '折扣比例',
+ `stock` int(11) NOT NULL COMMENT '活动库存剩余数量',
+ `total` int(11) NOT NULL COMMENT '活动库存总数量',
+ `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='营销活动明细表';
+
+-- 订单表新增字段
+ALTER TABLE yshop_store_order ADD `campaign_detail_id` bigint(20) DEFAULT NULL COMMENT '营销活动明细id';
+ALTER TABLE yshop_store_order ADD `campaign_type` tinyint(4) DEFAULT NULL COMMENT '活动类型:1、拼团,2、秒杀,3、限时折扣';
+
+CREATE TABLE `yshop_store_order_detail` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单明细id',
+ `oid` bigint(20) NOT NULL COMMENT '订单id',
+ `order_cart_id` bigint(20) NOT NULL COMMENT '订单购物详情id',
+ `product_id` bigint(20) NOT NULL COMMENT '商品ID',
+ `sku_id` bigint(20) NOT NULL COMMENT '规格id',
+ `product_attr_unique` varchar(50) NOT NULL DEFAULT '' COMMENT '唯一id',
+ `original_price` decimal(15,2) NOT NULL COMMENT '原价',
+ `price` decimal(15,2) NOT NULL COMMENT '实际价格',
+ `postage_price` decimal(8,2) DEFAULT '0.00' COMMENT '邮费金额',
+ `state` tinyint(1) DEFAULT '0' COMMENT '状态:1、正常,2、售后中,3、售后完成',
+ `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单明细表';
+
+CREATE TABLE `yshop_canvas` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '画布id',
+ `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
+ `json` longtext COMMENT '画布json数据',
+ `state` tinyint(1) DEFAULT NULL COMMENT '状态 0-关闭 1-开启',
+ `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='画布信息表';
+
+CREATE TABLE `yshop_popup` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '弹窗id',
+ `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
+ `start_time` varchar(20) NOT NULL COMMENT '开始时间',
+ `end_time` varchar(20) NOT NULL COMMENT '结束时间',
+ `popup_image` text NOT NULL COMMENT '弹窗图',
+ `button_image` text NOT NULL COMMENT '按钮图',
+ `type` tinyint(4) NOT NULL COMMENT '跳转类型:0、不跳转,1、商品,2、分类,3、优惠券,4、小程序',
+ `link` text DEFAULT NULL COMMENT '链接',
+ `state` tinyint(1) DEFAULT NULL COMMENT '状态 0-关闭 1-开启',
+ `creator` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='弹窗表';
+
+-- 2024-1-16 --
+alter table yshop_store_order_detail add `order_id` varchar(32) NOT NULL COMMENT '订单号';
+alter table yshop_store_product add `is_distribution` tinyint(1) DEFAULT '0' COMMENT '是否分销:0-否,1-是';
+alter table yshop_campaign_info add `is_virtually` tinyint(1) DEFAULT '0' COMMENT '是否虚拟成团:0-否,1-是';
+alter table yshop_store_order add `teamwork_id` bigint(20) DEFAULT NULL COMMENT '拼团id';
+
+CREATE TABLE `yshop_teamwork_info` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '拼团id',
+ `campaign_id` bigint(20) NOT NULL COMMENT '拼团活动id',
+ `people` int(11) NOT NULL COMMENT '参团人数',
+ `state` tinyint(1) NOT NULL COMMENT '成团状态 0-拼团中 1-拼团成功 2-拼团失败',
+ `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='拼团信息表'
+
+
+alter table yshop_teamwork_info add `regimental_commander_id` bigint(20) NOT NULL COMMENT '团长id';
+alter table yshop_teamwork_info add `campaign_detail_id` bigint(20) NOT NULL COMMENT '营销活动明细id';
+alter table yshop_canvas add `type` tinyint(1) NOT NULL COMMENT '画布类型 1-首页 2-我的';
+
+CREATE TABLE `yshop_canvas_detail` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '画布明细id',
+ `canvas_id` bigint(20) NOT NULL COMMENT '画布id',
+ `terminal` tinyint(1) NOT NULL COMMENT '终端 1-小程序 2-H5 3-APP',
+ `json` longtext COMMENT '画布json数据',
+ `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='画布明细表';
+
diff --git a/sql/初始化分销商.sql b/sql/初始化分销商.sql
new file mode 100644
index 0000000..9c24309
--- /dev/null
+++ b/sql/初始化分销商.sql
@@ -0,0 +1,7 @@
+TRUNCATE TABLE yshop_distributor;
+TRUNCATE TABLE yshop_distributor_dynamics;
+TRUNCATE TABLE yshop_distributor_order;
+TRUNCATE TABLE yshop_distributor_user;
+TRUNCATE TABLE yshop_distributor_wages;
+TRUNCATE TABLE yshop_distributor_wages_log;
+TRUNCATE TABLE yshop_distributor_withdrawal_method;
\ No newline at end of file
diff --git a/yshop-dependencies/pom.xml b/yshop-dependencies/pom.xml
index 75ea747..1420b88 100644
--- a/yshop-dependencies/pom.xml
+++ b/yshop-dependencies/pom.xml
@@ -72,7 +72,9 @@
4.3.0
1.0.3
2.14.5
+ 3.3.3
+ 4.6.0
@@ -87,6 +89,11 @@
+
+ co.yixiang.boot
+ yshop-module-distributor-biz
+ ${revision}
+
co.yixiang.boot
yshop-spring-boot-starter-banner
@@ -584,12 +591,19 @@
justauth-spring-boot-starter
${justauth.version}
-
+
com.github.binarywang
wx-java-mp-spring-boot-starter
${wx-java-mp.version}
+
+
+ com.github.binarywang
+ weixin-java-cp
+ ${weixin-java-cp.version}
+
+
@@ -635,6 +649,12 @@
pay-java-web-support
${pay.version}
+
+
+ com.google.zxing
+ core
+ ${qrcode.version}
+
diff --git a/yshop-framework/yshop-common/pom.xml b/yshop-framework/yshop-common/pom.xml
index df50609..38c27cc 100644
--- a/yshop-framework/yshop-common/pom.xml
+++ b/yshop-framework/yshop-common/pom.xml
@@ -137,6 +137,10 @@
com.alibaba
transmittable-thread-local
+
+ com.squareup.okhttp3
+ okhttp
+
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java
index efe8c73..1b5cb30 100644
--- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/constant/ShopConstants.java
@@ -194,4 +194,27 @@ public interface ShopConstants {
//快递查询接口Logistic
String KDNIAO_LOGISTIC_QUERY="https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
+
+ /**
+ * redis营销活动状态变更key
+ */
+ String CAMPAIGN_CHANGE = "campaign-change-queue";
+
+ /**
+ * redis广告弹窗状态变更key
+ */
+ String POPUP_CHANGE = "popup-change-queue";
+
+ /**
+ * redis拼团状态变更key
+ */
+ String TEAMWORK_CHANGE = "teamwork-change-queue";
+
+ String DAY_FORMAT_STR = "yyyy-MM-dd";
+
+ /**
+ * redis 订单收货后不可关闭售后 key
+ */
+ String CLOSE_AFTER_SALE_KEY = "close-after-sale-key";
+
}
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/EnableEnum.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/EnableEnum.java
new file mode 100644
index 0000000..d7fff87
--- /dev/null
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/EnableEnum.java
@@ -0,0 +1,22 @@
+package co.yixiang.yshop.framework.common.enums;
+
+import lombok.Getter;
+
+/**
+ * @author pepis
+ * @apiNote 开启关闭枚举
+ **/
+@Getter
+public enum EnableEnum {
+ DISABLE(0,"禁用"),
+ ENABLE(1,"启用"),
+ ;
+ private final Integer value;
+
+ private final String desc;
+
+ EnableEnum(Integer value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+}
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java
index 0185202..913697c 100644
--- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/enums/OrderInfoEnum.java
@@ -20,11 +20,13 @@ public enum OrderInfoEnum {
STATUS_APPLY_REFUND(-1,"申请退款"),
STATUS_REFUND_SUCCESS(-2,"退款成功"),
+ STATUS_GROUP_FAILURE(-4,"成团失败"),
STATUS_DEFAULT(0,"默认"),
STATUS_WAIT_RECEIVED(1,"待收货"),
STATUS_RECEIVED(2,"已收货"),
STATUS_FINISHED(3,"已完成"),
STATUS_CANCEL(4,"取消"),
+ STATUS_WAIT_GROUP(5,"待成团"),
PAY_STATUS_UNPAID(0,"未支付"),
PAY_STATUS_HAVE_PAID(1,"已支付"),
@@ -61,7 +63,9 @@ public enum OrderInfoEnum {
SHIPPING_TYPE_STORE_PICKUP(2,"门店自提"),
UNABLE_AFTER_SALES(0,"不能售后"),
- ABLE_AFTER_SALES(1,"能售后");
+ ABLE_AFTER_SALES(1,"能售后"),
+
+ CAMPAIGN_ORDER(2,"活动订单");
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java
index 2ab53b0..e15cbae 100644
--- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/DateUtils.java
@@ -1,5 +1,6 @@
package co.yixiang.yshop.framework.common.util.date;
+import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.time.*;
@@ -170,4 +171,82 @@ public class DateUtils {
return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now());
}
+
+ /**
+ * 判断当前时间是否处在开始时间和结束时间之间
+ *
+ * @param start
+ * @param end
+ * @return 是否
+ */
+ public static boolean isBelong(LocalDateTime start,LocalDateTime end) {
+ return isBefore(end) && isAfter(start);
+ }
+
+ /**
+ * 判断当前时间是否处在传入时间前
+ *
+ * @param time
+ * @return 是否
+ */
+ public static boolean isBefore(LocalDateTime time) {
+ return toTimeStamp(time) > System.currentTimeMillis();
+ }
+
+ /**
+ * 判断当前时间是否处在传入时间后
+ *
+ * @param time 时间
+ * @return 是否
+ */
+ public static boolean isAfter(LocalDateTime time) {
+ return toTimeStamp(time) < System.currentTimeMillis();
+ }
+
+ /**
+ * 传入时间累加
+ *
+ * @param time 时间
+ * @param
+ * @return
+ */
+ public static LocalDateTime getMoreMinuteAfter(LocalDateTime time, int minute) {
+ return time.plusMinutes(minute);
+ }
+
+ /**
+ * 计算与当前时间的差值(毫秒)
+ *
+ * @param time
+ * @param
+ * @return
+ */
+ public static long getMoreMillisecondAfter(LocalDateTime time) {
+ return toTimeStamp(time) - System.currentTimeMillis();
+ }
+
+ /**
+ * 计算时间戳
+ *
+ * @param time
+ * @param
+ * @return
+ */
+ public static long toTimeStamp(LocalDateTime time) {
+ return time.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
+ }
+
+ /**
+ * 判断两个日期是否同一天
+ * @param date1 /
+ * @param date2 /
+ * @return /
+ */
+ public static Boolean isSameDay(Date date1,Date date2){
+ return DateUtil.formatDate(date1).equals(DateUtil.formatDate(date2));
+ }
+
+
+
+
}
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java
index f007b71..afb8d60 100644
--- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/date/LocalDateTimeUtils.java
@@ -3,10 +3,13 @@ package co.yixiang.yshop.framework.common.util.date;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.time.Duration;
+import java.time.LocalDate;
import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.TemporalAdjusters;
/**
- * 时间工具类,用于 {@link LocalDateTime}
+ * 时间工具类,用于 {@link java.time.LocalDateTime}
*
* @author yshop
*/
@@ -60,4 +63,42 @@ public class LocalDateTimeUtils {
return LocalDateTimeUtil.isIn(LocalDateTime.now(), startTime, endTime);
}
+ /**
+ * 本周开始时间
+ *
+ * @return
+ */
+ public static LocalDateTime weekStartTime() {
+ LocalDate now = LocalDate.now();
+ return LocalDateTime.of(now.minusDays(now.getDayOfWeek().getValue() - 1), LocalTime.MIN);
+ }
+
+ /**
+ * 本周结束时间
+ *
+ * @return
+ */
+ public static LocalDateTime weekEndTime() {
+ LocalDate now = LocalDate.now();
+ return LocalDateTime.of(now.plusDays(7 - now.getDayOfWeek().getValue()), LocalTime.MAX);
+ }
+
+ /**
+ * 本月开始时间
+ *
+ * @return
+ */
+ public static LocalDateTime monthStartTime() {
+ return LocalDateTime.of(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()), LocalTime.MIN);
+ }
+
+ /**
+ * 本月结束时间
+ *
+ * @return
+ */
+ public static LocalDateTime monthEndTime() {
+ return LocalDateTime.of(LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
+ }
+
}
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/distancecalculator/DistanceCalculatorUtil.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/distancecalculator/DistanceCalculatorUtil.java
new file mode 100644
index 0000000..b36435c
--- /dev/null
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/distancecalculator/DistanceCalculatorUtil.java
@@ -0,0 +1,46 @@
+package co.yixiang.yshop.framework.common.util.distancecalculator;
+
+/**
+ * @author pepis
+ * @apiNote
+ **/
+public class DistanceCalculatorUtil {
+ public static void main(String[] args) {
+ double lat1 = 37.7749; // 第一个点的纬度
+ double lon1 = -122.4194; // 第一个点的经度
+
+ double lat2 = 34.0522; // 第二个点的纬度
+ double lon2 = -118.2437; // 第二个点的经度
+
+ double distance = calculateDistance(lat1, lon1, lat2, lon2);
+ System.out.println("Distance: " + distance + " m");
+ }
+
+ /**
+ * 计算两地之间距离
+ * @param lat1 第一个点的纬度
+ * @param lon1 第一个点的经度
+ * @param lat2 第二个点的纬度
+ * @param lon2 第二个点的经度
+ * @return 距离单位 米
+ */
+ public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
+ // 地球半径,单位:千米
+ final double R = 6371.0;
+
+ // 将经纬度转换为弧度
+ double radLat1 = Math.toRadians(lat1);
+ double radLon1 = Math.toRadians(lon1);
+ double radLat2 = Math.toRadians(lat2);
+ double radLon2 = Math.toRadians(lon2);
+
+ // Haversine公式计算距离
+ double dlon = radLon2 - radLon1;
+ double dlat = radLat2 - radLat1;
+ double a = Math.pow(Math.sin(dlat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(dlon / 2), 2);
+ double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+
+ // 计算距离
+ return Math.round(R * c * 1000);
+ }
+}
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java
index 3016a28..92ccb07 100644
--- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/http/HttpUtils.java
@@ -5,11 +5,13 @@ import cn.hutool.core.map.TableMap;
import cn.hutool.core.net.url.UrlBuilder;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
+import okhttp3.*;
import org.springframework.util.StringUtils;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.Map;
@@ -39,12 +41,11 @@ public class HttpUtils {
/**
* 拼接 URL
- *
* copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 append 方法
*
- * @param base 基础 URL
- * @param query 查询参数
- * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射
+ * @param base 基础 URL
+ * @param query 查询参数
+ * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射
* @param fragment URL 的 fragment,即拼接到 # 中
* @return 拼接后的 URL
*/
@@ -109,7 +110,7 @@ public class HttpUtils {
authorization = Base64.decodeStr(authorization);
clientId = StrUtil.subBefore(authorization, ":", false);
clientSecret = StrUtil.subAfter(authorization, ":", false);
- // 再从 Param 中获取
+ // 再从 Param 中获取
} else {
clientId = request.getParameter("client_id");
clientSecret = request.getParameter("client_secret");
@@ -122,5 +123,31 @@ public class HttpUtils {
return null;
}
+ public static String getAppletNoticeToken(String appid, String secret) throws IOException {
+ OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+ Request request = new Request.Builder()
+ .url("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret)
+ .get()
+ .build();
+ Response response = client.newCall(request).execute();
+ assert response.body() != null;
+ return response.body().string();
+ }
+
+ public static String sendAppletNotice(String token,String bodyString) throws IOException {
+ OkHttpClient client = new OkHttpClient().newBuilder()
+ .build();
+ MediaType mediaType = MediaType.parse("text/plain");
+ RequestBody body = RequestBody.create(mediaType, bodyString);
+ Request request = new Request.Builder()
+ .url("https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token="+token)
+ .method("POST", body)
+ .build();
+ Response response = client.newCall(request).execute();
+ assert response.body() != null;
+ return response.body().string();
+ }
+
}
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java
index 28d5b27..55d16fa 100644
--- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/io/IoUtils.java
@@ -7,7 +7,7 @@ import cn.hutool.core.util.StrUtil;
import java.io.InputStream;
/**
- * IO 工具类,用于 {@link IoUtil} 缺失的方法
+ * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法
*
* @author yshop
*/
diff --git a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java
index 1a0d633..5f0a2f1 100644
--- a/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java
+++ b/yshop-framework/yshop-common/src/main/java/co/yixiang/yshop/framework/common/util/object/PageUtils.java
@@ -3,7 +3,7 @@ package co.yixiang.yshop.framework.common.util.object;
import co.yixiang.yshop.framework.common.pojo.PageParam;
/**
- * {@link PageParam} 工具类
+ * {@link co.yixiang.yshop.framework.common.pojo.PageParam} 工具类
*
* @author yshop
*/
diff --git a/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java b/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java
index 49b98a7..8fa8656 100644
--- a/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java
+++ b/yshop-framework/yshop-spring-boot-starter-biz-data-permission/src/main/java/co/yixiang/yshop/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java
@@ -10,7 +10,7 @@ import org.springframework.aop.support.ComposablePointcut;
import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
/**
- * {@link DataPermission} 注解的 Advisor 实现类
+ * {@link co.yixiang.yshop.framework.datapermission.core.annotation.DataPermission} 注解的 Advisor 实现类
*
* @author yshop
*/
diff --git a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java
index b5f550b..d86d7ed 100644
--- a/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java
+++ b/yshop-framework/yshop-spring-boot-starter-biz-sms/src/main/java/co/yixiang/yshop/framework/sms/core/client/impl/SmsClientFactoryImpl.java
@@ -43,7 +43,6 @@ public class SmsClientFactoryImpl implements SmsClientFactory {
/**
* 短信客户端 Map
* key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()}
- *
* 注意,一些场景下,需要获得某个渠道类型的客户端,所以需要使用它。
* 例如说,解析短信接收结果,是相对通用的,不需要使用某个渠道编号的 {@link #channelIdClients}
*/
diff --git a/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramConfig.java b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramConfig.java
new file mode 100644
index 0000000..2f8ce89
--- /dev/null
+++ b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramConfig.java
@@ -0,0 +1,52 @@
+package co.yixiang.yshop.framework.weixin.config;
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 微信小程序配置文件
+ *
+ * @author: moxiangrong
+ **/
+@Configuration
+@ConditionalOnClass(WxMaService.class)
+@EnableConfigurationProperties(WxMiniProgramProperties.class)
+public class WxMiniProgramConfig {
+
+ /*注入小程序相关配置*/
+ @Autowired
+ private WxMiniProgramProperties properties;
+
+ /**
+ * 配置默认参数
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public WxMaConfig wxMaConfig() {
+ WxMaDefaultConfigImpl wxMaDefaultConfig = new WxMaDefaultConfigImpl();
+ //设置默认参数-appid,secret
+ wxMaDefaultConfig.setAppid(this.properties.getAppid());
+ wxMaDefaultConfig.setSecret(this.properties.getSecret());
+ return wxMaDefaultConfig;
+ }
+
+ /**
+ * 配置WxMaService
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public WxMaService wxMaService(WxMaConfig wxMaConfig) {
+ WxMaService wxMaService = new WxMaServiceImpl();
+ wxMaService.setWxMaConfig(wxMaConfig);
+ return wxMaService;
+ }
+
+
+}
diff --git a/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramProperties.java b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramProperties.java
new file mode 100644
index 0000000..4bfc4c1
--- /dev/null
+++ b/yshop-framework/yshop-spring-boot-starter-biz-weixin/src/main/java/co/yixiang/yshop/framework/weixin/config/WxMiniProgramProperties.java
@@ -0,0 +1,18 @@
+package co.yixiang.yshop.framework.weixin.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.validation.annotation.Validated;
+
+@ConfigurationProperties(prefix = "wx.miniapp")
+@Validated
+@Data
+public class WxMiniProgramProperties {
+
+ /*微信小程序app_id*/
+ private String appid;
+
+ /*微信小程序app_secret*/
+ private String secret;
+
+}
diff --git a/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java b/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java
index c663632..ed1102b 100644
--- a/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java
+++ b/yshop-framework/yshop-spring-boot-starter-flowable/src/main/java/co/yixiang/yshop/framework/flowable/config/YshopFlowableConfiguration.java
@@ -13,7 +13,6 @@ public class YshopFlowableConfiguration {
/**
* 参考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean
- *
* 如果不创建,会导致项目启动时,Flowable 报错的问题
*/
@Bean
diff --git a/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java b/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java
index 85beff3..9f28585 100644
--- a/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java
+++ b/yshop-framework/yshop-spring-boot-starter-job/src/main/java/co/yixiang/yshop/framework/quartz/core/scheduler/SchedulerManager.java
@@ -5,7 +5,7 @@ import co.yixiang.yshop.framework.quartz.core.handler.JobHandlerInvoker;
import org.quartz.*;
/**
- * {@link Scheduler} 的管理器,负责创建任务
+ * {@link org.quartz.Scheduler} 的管理器,负责创建任务
*
* 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即:
* 1. Job 的 {@link JobDetail#getKey()}
diff --git a/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java b/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java
index 09c19f3..77d60ca 100644
--- a/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java
+++ b/yshop-framework/yshop-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java
@@ -23,7 +23,7 @@ public class DefaultStreamMessageListenerContainerX> e
/**
* 参考 {@link StreamMessageListenerContainer#create(RedisConnectionFactory, StreamMessageListenerContainerOptions)} 的实现
*/
- public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainerOptions options) {
+ public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainer.StreamMessageListenerContainerOptions options) {
Assert.notNull(connectionFactory, "RedisConnectionFactory must not be null!");
Assert.notNull(options, "StreamMessageListenerContainerOptions must not be null!");
return new DefaultStreamMessageListenerContainerX<>(connectionFactory, options);
diff --git a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java
index bd15d49..0414e02 100644
--- a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java
+++ b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/query/LambdaQueryWrapperX.java
@@ -27,6 +27,20 @@ public class LambdaQueryWrapperX extends LambdaQueryWrapper {
return this;
}
+ public LambdaQueryWrapperX likeRightIfPresent(SFunction column, String val) {
+ if (StringUtils.hasText(val)) {
+ return (LambdaQueryWrapperX) super.likeRight(column, val);
+ }
+ return this;
+ }
+
+ public LambdaQueryWrapperX likeLeftIfPresent(SFunction column, String val) {
+ if (StringUtils.hasText(val)) {
+ return (LambdaQueryWrapperX) super.likeLeft(column, val);
+ }
+ return this;
+ }
+
public LambdaQueryWrapperX inIfPresent(SFunction column, Collection> values) {
if (!CollectionUtils.isEmpty(values)) {
return (LambdaQueryWrapperX) super.in(column, values);
diff --git a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java
index 7cabf91..f50d4be 100644
--- a/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java
+++ b/yshop-framework/yshop-spring-boot-starter-mybatis/src/main/java/co/yixiang/yshop/framework/mybatis/core/type/EncryptTypeHandler.java
@@ -13,7 +13,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
/**
- * 字段字段的 TypeHandler 实现类,基于 {@link AES} 实现
+ * 字段字段的 TypeHandler 实现类,基于 {@link cn.hutool.crypto.symmetric.AES} 实现
* 可通过 jasypt.encryptor.password 配置项,设置密钥
*
* @author yshop
diff --git a/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java
index fa8f5c1..23477e5 100644
--- a/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java
+++ b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/config/YshopRedisAutoConfiguration.java
@@ -1,5 +1,7 @@
package co.yixiang.yshop.framework.redis.config;
+import co.yixiang.yshop.framework.redis.util.RedissonUtil;
+import org.redisson.api.RedissonClient;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
@@ -30,4 +32,14 @@ public class YshopRedisAutoConfiguration {
return template;
}
+ /**
+ * /
+ * @param redissonClient /
+ * @return Redisson 操作工具类
+ */
+ @Bean
+ public RedissonUtil redissonUtil(RedissonClient redissonClient){
+ return new RedissonUtil(redissonClient);
+ }
+
}
diff --git a/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/util/RedissonUtil.java b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/util/RedissonUtil.java
new file mode 100644
index 0000000..2bdda2d
--- /dev/null
+++ b/yshop-framework/yshop-spring-boot-starter-redis/src/main/java/co/yixiang/yshop/framework/redis/util/RedissonUtil.java
@@ -0,0 +1,87 @@
+package co.yixiang.yshop.framework.redis.util;
+
+import co.yixiang.yshop.framework.common.exception.ErrorCode;
+import co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil;
+import org.redisson.api.RBlockingDeque;
+import org.redisson.api.RDelayedQueue;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author pepis
+ * @apiNote Redisson 操作工具类
+ **/
+public class RedissonUtil {
+ private final RedissonClient redissonClient;
+ Logger logger = LoggerFactory.getLogger(RedissonUtil.class);
+
+ public RedissonUtil(RedissonClient redissonClient) {
+ this.redissonClient = redissonClient;
+ }
+
+ /**
+ * 向指定key的延时队列中添加任务
+ * @param key 延时队列
+ * @param v 订单id
+ * @param delay 延时时长
+ * @param timeUnit 延时单位
+ * @param id类型
+ */
+ public void delayedOffer(String key,V v,long delay, TimeUnit timeUnit){
+ try {
+ RBlockingDeque