From fa80c2fca3ada00649f9d7146314fd4dc6489b0e Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 4 Nov 2025 17:50:37 +0800 Subject: [PATCH 01/64] =?UTF-8?q?=E5=BA=97=E9=93=BA=E8=90=A5=E4=B8=9A?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=A2=9E=E5=8A=A0=20=E5=BC=80=E4=B8=9A?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E7=AD=B9=E5=A4=87=E4=B8=AD=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/constant/CommonConstant.java | 9 +++++++ .../common/modules/store/ShopStoreBase.java | 2 +- .../impl/ShopProductItemServiceImpl.java | 2 +- .../controller/mobile/StoreController.java | 4 ++-- .../store/service/ShopStoreBaseService.java | 4 ++-- .../impl/ShopStoreBaseServiceImpl.java | 24 ++++++++++--------- .../service/impl/ShopUserCartServiceImpl.java | 12 +++++----- .../src/main/resources/static/diy/js/diy.js | 2 +- 8 files changed, 35 insertions(+), 24 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java index db946b39..ee2e5dfa 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java @@ -127,4 +127,13 @@ public class CommonConstant { // 预约下单从当前时间延迟的最小分钟数(单位分钟),不能低于35分钟 public final static Integer MIN_DELAY_MINUTES_FOR_BOOKING_ORDER = 50; + + + // 店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中; + //1-营业中; + public final static Integer Store_Biz_State_Opening = 1; + //2-已打烊; + public final static Integer Store_Biz_State_Closed = 2; + //3-开业(活动)筹备中; + public final static Integer Store_Biz_State_PreActivity = 3; } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java index 8b1b0ef9..6d2aeb3b 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java @@ -80,7 +80,7 @@ public class ShopStoreBase implements Serializable { @ApiModelProperty(value = "店铃声开关:1-开启;2-关闭;") private Integer ringtone_is_enable; - @ApiModelProperty(value = "店铺营业状态:1-营业中;2-已打烊;") + @ApiModelProperty(value = "店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中;") private Integer store_biz_state; @ApiModelProperty(value = "上级店铺编号:创建店铺决定,所属分销商-不可更改! 佣金公平性考虑") diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java index 0029f7f0..79b68972 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java @@ -487,7 +487,7 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl { * 修改店铺的营业状态 * * @param storeId - * @param bizState 营业状态 1-营业;2-打烊 + * @param bizState 店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中; * @return */ Boolean updateStoreBizState(Integer storeId, Integer bizState); @@ -233,7 +233,7 @@ public interface ShopStoreBaseService extends IBaseService { * * @param shopStoreBase 店铺基础信息 * @param shopStoreInfo 店铺详细信息 - * @return 店铺营业状态:1-营业中;2-已打烊; + * @return 店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中; */ Integer getStoreBizState(ShopStoreBase shopStoreBase, ShopStoreInfo shopStoreInfo); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index a0c8a445..9b5667f9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -4199,13 +4199,13 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl getStoreBizState(Integer storeId) { // 参数校验 if (CheckUtil.isEmpty(storeId)) { log.warn("店铺ID为空,无法确定营业状态"); - return Pair.of(CommonConstant.Disable2, "店铺营业状态有误"); + return Pair.of(CommonConstant.Store_Biz_State_Closed, "店铺营业状态有误"); } try { StoreBizTimeInfoDTO storeBizTimeInfo = baseMapper.getStoreBizTimeInfo(storeId); if (storeBizTimeInfo == null) { log.warn("未找到店铺营业时间信息,storeId: {}", storeId); - return Pair.of(CommonConstant.Disable2, "店铺营业状态有误"); + return Pair.of(CommonConstant.Store_Biz_State_Closed, "店铺营业状态有误"); } Integer storeBizState = storeBizTimeInfo.getStore_biz_state(); @@ -4261,7 +4261,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl storeBizState = shopStoreBaseService.getStoreBizState(storeId); - if (storeBizState != null && CommonConstant.Disable2.equals(storeBizState.getFirst())) { - throw new ApiException(I18nUtil._(storeBizState.getSecond() + ",无法加购商品。")); - } + + // 判断店铺是否打烊?打烊不能放入购物车 RMK 已移至统一放到下单支付的时候校验 +// Pair storeBizState = shopStoreBaseService.getStoreBizState(storeId); +// if (storeBizState != null && CommonConstant.Disable2.equals(storeBizState.getFirst())) { +// throw new ApiException(I18nUtil._(storeBizState.getSecond() + ",无法加购商品。")); +// } Integer cart_type = Convert.toInt(data.get("cart_type")); // 判断是新增还是更新 diff --git a/mall-shop/src/main/resources/static/diy/js/diy.js b/mall-shop/src/main/resources/static/diy/js/diy.js index 3fe8121c..c46760f0 100644 --- a/mall-shop/src/main/resources/static/diy/js/diy.js +++ b/mall-shop/src/main/resources/static/diy/js/diy.js @@ -20809,7 +20809,7 @@ c(); }, s, o, r)); }) : 17 == i[_x41903[4420]] && $[_x41903[39]](i[_x41903[4617]][_x41903[473]], function(e, t) { - t[_x41903[124]] == a && (s = r = o = 100, publicFun[_x41903[4586]]($(n[_x41903[476]])[_x41903[217]](_x41903[124]), function(e) { + t[_x41903[124]] == a && (s = r = o = 10240, publicFun[_x41903[4586]]($(n[_x41903[476]])[_x41903[217]](_x41903[124]), function(e) { 250 == e[_x41903[686]] && $[_x41903[2030]][_x41903[4089]](e[_x41903[4587]] || __(_x41903[4618])), t[_x41903[2345]] = e[_x41903[473]][_x41903[688]], c(); From ef4db7a0bfe0bbcf908fb3f0fe564ca595f79072 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Tue, 4 Nov 2025 18:11:55 +0800 Subject: [PATCH 02/64] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=94=B9=E5=8F=98=E9=80=BB=E8=BE=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/product/service/impl/ShopProductItemServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java index 79b68972..4a3c07ff 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java @@ -2278,10 +2278,10 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl { - queryWrapper.or(q -> q.eq("store_id", store_id).eq("item_src_id", productNumber)); + queryWrapper.or(q -> q.eq("store_id", store_id).eq("item_number", productNumber)); }); queryWrapper.eq("store_id", store_id); - queryWrapper.groupBy("product_id"); + queryWrapper.groupBy("product_id","category_id"); List shopProductItems = this.list(queryWrapper); // Map map=shopProductItems.stream().collect(Collectors.toMap(ShopProductItem::getProduct_id,shopProductItem->shopProductItem.getMergedItemId() // +"_"+shopProductItem.getMergedUnitPrices())); From 5c6bf1bb3f536e5ce7add4dbb03a2d86dc58cee3 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 5 Nov 2025 02:41:47 +0800 Subject: [PATCH 03/64] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=BD=91?= =?UTF-8?q?=E5=8D=A1=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mall-account/src/main/resources/bootstrap-prod.yml | 1 + mall-admin/src/main/resources/bootstrap-prod.yml | 1 + mall-auth/src/main/resources/bootstrap-prod.yml | 1 + mall-cms/src/main/resources/bootstrap-prod.yml | 1 + mall-gateway/src/main/resources/bootstrap-prod.yml | 1 + mall-im/src/main/resources/bootstrap-prod.yml | 1 + mall-pay/src/main/resources/bootstrap-prod.yml | 1 + mall-search/src/main/resources/bootstrap-prod.yml | 1 + mall-shop/src/main/resources/bootstrap-prod.yml | 1 + mall-sns/src/main/resources/bootstrap-prod.yml | 1 + 10 files changed, 10 insertions(+) diff --git a/mall-account/src/main/resources/bootstrap-prod.yml b/mall-account/src/main/resources/bootstrap-prod.yml index 9e070c80..7098dbf8 100644 --- a/mall-account/src/main/resources/bootstrap-prod.yml +++ b/mall-account/src/main/resources/bootstrap-prod.yml @@ -52,6 +52,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-admin/src/main/resources/bootstrap-prod.yml b/mall-admin/src/main/resources/bootstrap-prod.yml index 8a7380ab..206ff12c 100644 --- a/mall-admin/src/main/resources/bootstrap-prod.yml +++ b/mall-admin/src/main/resources/bootstrap-prod.yml @@ -48,6 +48,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-auth/src/main/resources/bootstrap-prod.yml b/mall-auth/src/main/resources/bootstrap-prod.yml index e89904b2..e7efbb55 100644 --- a/mall-auth/src/main/resources/bootstrap-prod.yml +++ b/mall-auth/src/main/resources/bootstrap-prod.yml @@ -3,6 +3,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-cms/src/main/resources/bootstrap-prod.yml b/mall-cms/src/main/resources/bootstrap-prod.yml index 4d3ec4d9..2f1ec9e6 100644 --- a/mall-cms/src/main/resources/bootstrap-prod.yml +++ b/mall-cms/src/main/resources/bootstrap-prod.yml @@ -43,6 +43,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-gateway/src/main/resources/bootstrap-prod.yml b/mall-gateway/src/main/resources/bootstrap-prod.yml index cc5388d0..23fb4961 100644 --- a/mall-gateway/src/main/resources/bootstrap-prod.yml +++ b/mall-gateway/src/main/resources/bootstrap-prod.yml @@ -14,6 +14,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-im/src/main/resources/bootstrap-prod.yml b/mall-im/src/main/resources/bootstrap-prod.yml index 429d947b..00e39652 100644 --- a/mall-im/src/main/resources/bootstrap-prod.yml +++ b/mall-im/src/main/resources/bootstrap-prod.yml @@ -43,6 +43,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-pay/src/main/resources/bootstrap-prod.yml b/mall-pay/src/main/resources/bootstrap-prod.yml index f74ef90d..8bf12ab4 100644 --- a/mall-pay/src/main/resources/bootstrap-prod.yml +++ b/mall-pay/src/main/resources/bootstrap-prod.yml @@ -53,6 +53,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.*) config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-search/src/main/resources/bootstrap-prod.yml b/mall-search/src/main/resources/bootstrap-prod.yml index e5c9edb3..0ab631cf 100644 --- a/mall-search/src/main/resources/bootstrap-prod.yml +++ b/mall-search/src/main/resources/bootstrap-prod.yml @@ -54,6 +54,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-shop/src/main/resources/bootstrap-prod.yml b/mall-shop/src/main/resources/bootstrap-prod.yml index 62c03131..e98e5656 100644 --- a/mall-shop/src/main/resources/bootstrap-prod.yml +++ b/mall-shop/src/main/resources/bootstrap-prod.yml @@ -65,6 +65,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-sns/src/main/resources/bootstrap-prod.yml b/mall-sns/src/main/resources/bootstrap-prod.yml index ae9c4b8b..bd17bb6d 100644 --- a/mall-sns/src/main/resources/bootstrap-prod.yml +++ b/mall-sns/src/main/resources/bootstrap-prod.yml @@ -43,6 +43,7 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ + ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml From b9d4d8744f8bb3e115938616645ac9c8e5c57e87 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Wed, 5 Nov 2025 09:13:48 +0800 Subject: [PATCH 04/64] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E8=87=AA=E5=8A=A8=E5=8C=B9=E9=85=8D=E5=9B=BE=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E6=8F=90=E5=8D=87=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index f7d88c31..336be8cc 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -672,7 +672,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements // logger.error("同步时间失败" + e.getMessage()); // } productMappingService.syncAllProductMapping(Integer.valueOf(storeId),DicEnum.YESORNO_0.getCode()); - syncShopImages(Integer.valueOf(storeId));//同时商品图库数据 + if(ObjectUtil.isNull(storeDbConfig.getRefreshTime())){ + syncShopImages(Integer.valueOf(storeId));//同时商品图库数据 + } } @Override From d711a70e3498c565f54f32905a4e43b927a40820 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 5 Nov 2025 15:12:53 +0800 Subject: [PATCH 05/64] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=89=93=E5=8C=85?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mall-account/src/main/resources/bootstrap-prod.yml | 1 - mall-admin/src/main/resources/bootstrap-prod.yml | 1 - mall-auth/src/main/resources/bootstrap-prod.yml | 1 - mall-cms/src/main/resources/bootstrap-prod.yml | 1 - mall-gateway/src/main/resources/bootstrap-prod.yml | 1 - mall-im/src/main/resources/bootstrap-prod.yml | 1 - mall-pay/src/main/resources/bootstrap-prod.yml | 1 - mall-search/src/main/resources/bootstrap-prod.yml | 1 - mall-shop/src/main/resources/bootstrap-prod.yml | 1 - mall-sns/src/main/resources/bootstrap-prod.yml | 1 - pom.xml | 5 ++--- 11 files changed, 2 insertions(+), 13 deletions(-) diff --git a/mall-account/src/main/resources/bootstrap-prod.yml b/mall-account/src/main/resources/bootstrap-prod.yml index 7098dbf8..9e070c80 100644 --- a/mall-account/src/main/resources/bootstrap-prod.yml +++ b/mall-account/src/main/resources/bootstrap-prod.yml @@ -52,7 +52,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-admin/src/main/resources/bootstrap-prod.yml b/mall-admin/src/main/resources/bootstrap-prod.yml index 206ff12c..8a7380ab 100644 --- a/mall-admin/src/main/resources/bootstrap-prod.yml +++ b/mall-admin/src/main/resources/bootstrap-prod.yml @@ -48,7 +48,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-auth/src/main/resources/bootstrap-prod.yml b/mall-auth/src/main/resources/bootstrap-prod.yml index e7efbb55..e89904b2 100644 --- a/mall-auth/src/main/resources/bootstrap-prod.yml +++ b/mall-auth/src/main/resources/bootstrap-prod.yml @@ -3,7 +3,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-cms/src/main/resources/bootstrap-prod.yml b/mall-cms/src/main/resources/bootstrap-prod.yml index 2f1ec9e6..4d3ec4d9 100644 --- a/mall-cms/src/main/resources/bootstrap-prod.yml +++ b/mall-cms/src/main/resources/bootstrap-prod.yml @@ -43,7 +43,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-gateway/src/main/resources/bootstrap-prod.yml b/mall-gateway/src/main/resources/bootstrap-prod.yml index 23fb4961..cc5388d0 100644 --- a/mall-gateway/src/main/resources/bootstrap-prod.yml +++ b/mall-gateway/src/main/resources/bootstrap-prod.yml @@ -14,7 +14,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-im/src/main/resources/bootstrap-prod.yml b/mall-im/src/main/resources/bootstrap-prod.yml index 00e39652..429d947b 100644 --- a/mall-im/src/main/resources/bootstrap-prod.yml +++ b/mall-im/src/main/resources/bootstrap-prod.yml @@ -43,7 +43,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-pay/src/main/resources/bootstrap-prod.yml b/mall-pay/src/main/resources/bootstrap-prod.yml index 8bf12ab4..f74ef90d 100644 --- a/mall-pay/src/main/resources/bootstrap-prod.yml +++ b/mall-pay/src/main/resources/bootstrap-prod.yml @@ -53,7 +53,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.*) config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-search/src/main/resources/bootstrap-prod.yml b/mall-search/src/main/resources/bootstrap-prod.yml index 0ab631cf..e5c9edb3 100644 --- a/mall-search/src/main/resources/bootstrap-prod.yml +++ b/mall-search/src/main/resources/bootstrap-prod.yml @@ -54,7 +54,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-shop/src/main/resources/bootstrap-prod.yml b/mall-shop/src/main/resources/bootstrap-prod.yml index e98e5656..62c03131 100644 --- a/mall-shop/src/main/resources/bootstrap-prod.yml +++ b/mall-shop/src/main/resources/bootstrap-prod.yml @@ -65,7 +65,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/mall-sns/src/main/resources/bootstrap-prod.yml b/mall-sns/src/main/resources/bootstrap-prod.yml index bd17bb6d..ae9c4b8b 100644 --- a/mall-sns/src/main/resources/bootstrap-prod.yml +++ b/mall-sns/src/main/resources/bootstrap-prod.yml @@ -43,7 +43,6 @@ spring: nacos: discovery: server-addr: @nacos.server.address@ - ip-pattern: 10.0.1.* config: server-addr: @nacos.server.address@ file-extension: yaml diff --git a/pom.xml b/pom.xml index 4329fa4e..854ae63a 100644 --- a/pom.xml +++ b/pom.xml @@ -563,11 +563,10 @@ ${docker.registry}/mall/${project.artifactId}:${project.version} ${docker.host} - - - ${docker.ca} true + + ${docker.ca} From 3a4a8d7772c7b06ad07a3a86f1dc8ceb8810e233 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Wed, 5 Nov 2025 16:35:36 +0800 Subject: [PATCH 06/64] =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E8=A7=84=E6=A0=BC=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 336be8cc..7fee550a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -107,7 +107,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.Collectors; import static com.suisung.mall.common.utils.I18nUtil._; @@ -987,9 +986,10 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements BigDecimal unitWeight = itemQuarytys[0]; BigDecimal itemQuaryty = itemQuarytys[1]; BigDecimal unitPriceBg=new BigDecimal(unitPrice).divide(unitWeight,4, RoundingMode.HALF_UP); + logger.info("unitWeight-{};itemQuaryty-{};unitPriceBg-{}",unitWeight,itemQuaryty,unitPriceBg); // 使用 Redis 的 HINCRBY 保证原子性和高性能 redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPriceBg.toPlainString(), itemQuaryty.doubleValue()); - logger.info("存储有规格库存成功"); + logger.info("存储有规格库存成功",itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()); } catch (Exception e) { logger.error("库存累计失败,productKey={}, delta={}, error={}", productKey, delta, e.getMessage(), e); } From ea0afa5bdba37e500ca19b4ed6dd2a4e8e2c4bb5 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 5 Nov 2025 17:24:42 +0800 Subject: [PATCH 07/64] =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mall-gateway/src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mall-gateway/src/main/resources/application.yml b/mall-gateway/src/main/resources/application.yml index 8c4ef682..ab1ee4e9 100644 --- a/mall-gateway/src/main/resources/application.yml +++ b/mall-gateway/src/main/resources/application.yml @@ -57,6 +57,8 @@ secure: - "/swagger-resources/**" - "/swagger/**" - "/static/**" + - "/shop/static/**" + - "/static/image/**" - "/**/v2/api-docs" - "/**/*.js" - "/**/*.css" @@ -67,8 +69,6 @@ secure: - "/mall-auth/rsa/publicKey" - "/admin/account/account-user-base/register" - "/admin/account/account-user-base/login" - - "/static/image/**" - - "/shop/static/**" - "/admin/account/open/**" - "/admin/account/account-user-base/doLogin" - "/mobile/pay/index/notify_url" From 2ab449592029de6a0bf1e02a8c675183ddd24575 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 6 Nov 2025 00:57:46 +0800 Subject: [PATCH 08/64] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A7=BD=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/store/ShopStoreBase.java | 3 + .../mall/common/utils/DateTimeUtils.java | 67 ++++------ .../mobile/UserOrderController.java | 2 +- .../impl/ShopOrderInfoServiceImpl.java | 119 ++++++++++-------- .../mapper/store/ShopStoreBaseMapper.xml | 4 +- pom.xml | 27 ++++ 6 files changed, 125 insertions(+), 97 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java index 6d2aeb3b..89c1fa17 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java @@ -83,6 +83,9 @@ public class ShopStoreBase implements Serializable { @ApiModelProperty(value = "店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中;") private Integer store_biz_state; + @ApiModelProperty(value = "开业(活动)筹备具体时间 yyyy-MM-dd HH:mm:ss;") + private Date store_biz_opening_dtime; + @ApiModelProperty(value = "上级店铺编号:创建店铺决定,所属分销商-不可更改! 佣金公平性考虑") private Integer shop_parent_id; diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java index 499e9f8f..490c174f 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java @@ -1,5 +1,6 @@ package com.suisung.mall.common.utils; +import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.data.util.Pair; @@ -10,7 +11,10 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoField; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; @Slf4j public class DateTimeUtils { @@ -375,11 +379,11 @@ public class DateTimeUtils { * endTimeStr 结束时间字符串,支持格式如 HH:mm, HH:mm:ss, HH:mm:ss.SSS 等 * @return 返回一个Map,包含交集的时间段(startTimeStr和endTimeStr),如果无交集则返回空Map */ - public static Map findTimeInterSection(List> timeList) { + public static Pair findTimeInterSection(List> timeList) { // 参数校验 if (timeList == null || timeList.isEmpty()) { log.warn("时间段列表为空或null,无法计算交集"); - return new HashMap<>(); + return null; } try { @@ -387,14 +391,14 @@ public class DateTimeUtils { LocalTime earliestEndTime = null; // 遍历所有时间段 - for (Map timeMap : timeList) { - if (timeMap == null || !timeMap.containsKey("startTimeStr") || !timeMap.containsKey("endTimeStr")) { + for (Pair timeMap : timeList) { + if (timeMap == null || StrUtil.hasBlank(timeMap.getFirst(), timeMap.getSecond())) { log.warn("时间段数据不完整或格式不正确: {}", timeMap); continue; } - String startTimeStr = timeMap.get("startTimeStr"); - String endTimeStr = timeMap.get("endTimeStr"); + String startTimeStr = timeMap.getFirst(); + String endTimeStr = timeMap.getSecond(); if (startTimeStr == null || endTimeStr == null) { log.warn("时间段的开始或结束时间为空: startTime={}, endTime={}", startTimeStr, endTimeStr); @@ -416,18 +420,15 @@ public class DateTimeUtils { // 检查是否存在交集 if (latestStartTime != null && earliestEndTime != null && !latestStartTime.isAfter(earliestEndTime)) { - Map result = new HashMap<>(); - result.put("startTimeStr", latestStartTime.toString()); - result.put("endTimeStr", earliestEndTime.toString()); - return result; + return Pair.of(latestStartTime.toString(), earliestEndTime.toString()); } else { // 无交集情况 log.debug("给定的时间段列表无交集"); - return new HashMap<>(); + return null; } } catch (Exception e) { log.error("计算时间段交集时发生异常", e); - return new HashMap<>(); + return null; } } @@ -619,38 +620,24 @@ public class DateTimeUtils { System.out.println("=== 测试 findTimeIntersection ==="); // 测试正常交集情况 - List> timeList1 = new ArrayList<>(); - Map range1 = new HashMap<>(); - range1.put("startTimeStr", "06:00"); - range1.put("endTimeStr", "17:00"); - timeList1.add(range1); + List> timeList1 = new ArrayList<>(); + timeList1.add(Pair.of("06:00", "17:00")); + timeList1.add(Pair.of("10:00", "18:00")); - Map range2 = new HashMap<>(); - range2.put("startTimeStr", "06:00"); - range2.put("endTimeStr", "17:00"); - timeList1.add(range2); - - Map intersection1 = findTimeInterSection(timeList1); + Pair intersection1 = findTimeInterSection(timeList1); System.out.println("交集结果1: " + intersection1); // 应该是 10:00 - 17:00 - // 测试无交集情况 - List> timeList2 = new ArrayList<>(); - Map range3 = new HashMap<>(); - range3.put("startTimeStr", "09:00"); - range3.put("endTimeStr", "12:00"); - timeList2.add(range3); +// 测试无交集情况 + List> timeList2 = new ArrayList<>(); + timeList2.add(Pair.of("09:00", "12:00")); + timeList2.add(Pair.of("13:00", "17:00")); - Map range4 = new HashMap<>(); - range4.put("startTimeStr", "13:00"); - range4.put("endTimeStr", "17:00"); - timeList2.add(range4); + Pair intersection2 = findTimeInterSection(timeList2); + System.out.println("交集结果2: " + intersection2); // 应该是null - Map intersection2 = findTimeInterSection(timeList2); - System.out.println("交集结果2: " + intersection2); // 应该是空Map - - // 测试空列表 - Map intersection3 = findTimeInterSection(null); - System.out.println("交集结果3 (null输入): " + intersection3); // 应该是空Map +// 测试空列表 + Pair intersection3 = findTimeInterSection(null); + System.out.println("交集结果3 (null输入): " + intersection3); // 应该是null } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserOrderController.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserOrderController.java index d45ca781..be5ed351 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserOrderController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserOrderController.java @@ -324,7 +324,7 @@ public class UserOrderController extends BaseControllerImpl { @ApiOperation(value = "可预约订单的时间槽", notes = "结算中心页面,可预约订单的时间槽") @RequestMapping(value = "/booking_time_args", method = RequestMethod.GET) - public CommonResult listInvoice(@RequestParam(name = "store_ids", defaultValue = "") String store_ids) { + public CommonResult genBookingOrderArgList(@RequestParam(name = "store_ids", defaultValue = "") String store_ids) { List list = shopOrderInfoService.genBookingOrderArgList(store_ids); return CommonResult.success(list); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java index fe787058..28eef942 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java @@ -1016,93 +1016,104 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl genBookingOrderArgList(String storeIds) { - // 初始化默认营业时间 - Map timesMap = new HashMap<>(); + // 初始化营业时间对象 + Pair timesPair = null; // 如果storeId不为空,则尝试获取店铺信息 if (StrUtil.isNotBlank(storeIds)) { - List> timesMapList = selStoreBizTimeMapList(storeIds); + // 多个店铺的营业时间段集合 + List> timesMapList = selStoreBizTimeMapList(storeIds); if (!CollUtil.isEmpty(timesMapList)) { - timesMap = DateTimeUtils.findTimeInterSection(timesMapList); + // 获取多个店铺的营业时间段的一个交集 + timesPair = DateTimeUtils.findTimeInterSection(timesMapList); } } + if (timesPair == null || StrUtil.isBlank(timesPair.getFirst()) || StrUtil.isBlank(timesPair.getSecond())) { + // 没有具体的营业时间段 + logger.info("[生成预约参数] 未找到营业时间段"); + return Collections.emptyList(); + } + + + // 显示几天的时间槽,默认7天 + int daysCnt = 7; + List result = new ArrayList<>(); - // 生成未来7天的数据 - Date now = new Date(); - for (int i = 0; i < 7; i++) { - Date currentDate = DateUtil.offsetDay(now, i); + // 判断今天还能不能立即下单和预约下单?能:就有今天的时间槽;不能:就没有今天的时间槽 + boolean canBookingToday = DateTimeUtils.isTimeInRange(timesPair.getFirst(), timesPair.getSecond(), new Date()); + + // 生成7天的可预约时间槽数据 + Date startDate = new Date(); + if (!canBookingToday) { + // 如果今天不能下单和预约,则从明天开始生成时间槽 + startDate = DateUtil.offsetDay(new Date(), 1); + } + + for (int i = 0; i < daysCnt; i++) { + startDate = DateUtil.offsetDay(startDate, i); BookingArgDTO bookingArgDTO = new BookingArgDTO(); // 设置日期相关信息 - String dateStr = DateUtil.format(currentDate, "yyyy-MM-dd"); - String displayDateStr = DateUtil.format(currentDate, "MM月dd日"); - + String dateStr = DateUtil.format(startDate, "yyyy-MM-dd"); + String displayDateStr = DateUtil.format(startDate, "MM月dd日"); // 安全获取星期信息 String weekStr = "星期"; try { - weekStr = DateTimeUtils.getWeekOfDate(currentDate); + weekStr = DateTimeUtils.getWeekOfDate(startDate); } catch (Exception e) { logger.warn("[生成预约参数] 获取星期信息异常,使用默认值,date: {}", dateStr); } - // 设置date_title + // 设置date_title - 优化后的代码 + String dateTitle; if (i == 0) { - bookingArgDTO.setDate_title("今天(" + weekStr + ")"); + dateTitle = canBookingToday ? "今天" : "明天"; } else if (i == 1) { - bookingArgDTO.setDate_title("明天(" + weekStr + ")"); + dateTitle = canBookingToday ? "明天" : "后天"; } else { - bookingArgDTO.setDate_title(displayDateStr + "(" + weekStr + ")"); + dateTitle = displayDateStr; } + bookingArgDTO.setDate_title(dateTitle + "(" + weekStr + ")"); bookingArgDTO.setDate_str(displayDateStr); bookingArgDTO.setDate(dateStr); // 生成时间项 - List items = new ArrayList<>(); +// List items = new ArrayList<>(); - // 如果是今天,始终添加"立即送出"选项 - if (i == 0) { - BookingArgDTO.BookingArgItem immediateItem = new BookingArgDTO.BookingArgItem(); - immediateItem.setTime_title("立即送出"); - immediateItem.setBooking_at(0L); - immediateItem.setBooking_state(1); - immediateItem.setBooking_begin_time(""); - immediateItem.setBooking_end_time(""); - items.add(immediateItem); - } + // 如果是今天且在配送时间内,添加"立即送出"选项 +// if (i == 0 && canBookingToday) { +// BookingArgDTO.BookingArgItem immediateItem = new BookingArgDTO.BookingArgItem(); +// immediateItem.setTime_title("立即送出"); +// immediateItem.setBooking_at(0L); +// immediateItem.setBooking_state(1); +// immediateItem.setBooking_begin_time(""); +// immediateItem.setBooking_end_time(""); +// items.add(immediateItem); +// } - // 只有当 timesMap 不为空时才生成其他时间槽 - if (!ObjectUtil.isEmpty(timesMap) && StrUtil.isNotBlank(timesMap.get("startTimeStr")) && StrUtil.isNotBlank(timesMap.get("endTimeStr"))) { - String startTimeStr = timesMap.get("startTimeStr"); - String endTimeStr = timesMap.get("endTimeStr"); - List timeSlots = generateTimeSlots(dateStr, startTimeStr, endTimeStr, i == 0); - if (i == 0) { - // 对于今天,移除除"立即送出"外的所有时间槽 - items.addAll(timeSlots.stream().filter(item -> item.getBooking_state() != 1).collect(Collectors.toList())); - } else { - // 对于其他日期,添加所有时间槽 - items.addAll(timeSlots); - } - bookingArgDTO.setWorking_hours(String.format("%s-%s", startTimeStr, endTimeStr)); - } else if (i == 0) { - // 如果timesMap为空,今天只保留"立即送出"选项 - logger.debug("[生成预约参数] timesMap为空,今天只生成立即送出选项"); - } else { - // 如果timesMap为空,其他日期不生成任何时间槽 - logger.debug("[生成预约参数] timesMap为空,不生成{}的预约时间槽", dateStr); - continue; // 跳过当前日期 - } + String startTimeStr = timesPair.getFirst(); + String endTimeStr = timesPair.getSecond(); + boolean isToday = i == 0 && canBookingToday; + // 生成时间项 + List items = generateTimeSlots(dateStr, startTimeStr, endTimeStr, isToday); +// if (i == 0 && canBookingToday) { +// items.addAll(timeSlots.stream().filter(item -> item.getBooking_state() != 1).collect(Collectors.toList())); +// } else { +// items.addAll(timeSlots); +// } + bookingArgDTO.setWorking_hours(String.format("%s-%s", startTimeStr, endTimeStr)); bookingArgDTO.setItems(items); result.add(bookingArgDTO); } logger.debug("[生成预约参数] 成功生成预约参数,storeId: {}, timesMap: {}, 参数数量: {}", - storeIds, timesMap, result.size()); + storeIds, timesPair, result.size()); return result; } @@ -1221,12 +1232,14 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl 列表list + * 根据 storeIds(一个或多个 storeid,如 34,23,43,23,),先对id去重, + * 再获取多个店铺的营业时间 List 列表list + * 启动如果遇到某个店铺是开业(活动)筹备中的,获取他的开始营业的的日期和营业时间段组合出特有营业时间段 * * @param storeIds 以逗号分隔的店铺ID字符串 * @return 包含店铺营业时间信息的列表,每个元素为包含opening_hours和close_hours的Map */ - private List> selStoreBizTimeMapList(String storeIds) { + private List> selStoreBizTimeMapList(String storeIds) { // 参数校验 if (StrUtil.isBlank(storeIds)) { return Collections.emptyList(); @@ -1257,9 +1270,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl { - Map timeSlot = new HashMap<>(); - timeSlot.put("startTimeStr", storeInfo.getStore_opening_hours()); - timeSlot.put("endTimeStr", storeInfo.getStore_close_hours()); + Pair timeSlot = Pair.of(storeInfo.getStore_opening_hours(), storeInfo.getStore_close_hours()); return timeSlot; }) .collect(Collectors.toList()); diff --git a/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml b/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml index cc6988a1..52529964 100644 --- a/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml +++ b/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml @@ -5,8 +5,8 @@ store_id , user_id, store_name, store_grade_id, store_logo, store_slogan, store_domain, store_area, store_district_id, - store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, store_biz_state, - ringtone_is_enable, shop_parent_id, store_2nd_category_id, + store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, + store_biz_state, store_biz_opening_dtime, ringtone_is_enable, shop_parent_id, store_2nd_category_id, store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags, store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode, split_ratio, packing_fee, created_at, updated_at diff --git a/pom.xml b/pom.xml index 854ae63a..e5bda657 100644 --- a/pom.xml +++ b/pom.xml @@ -540,12 +540,39 @@ maven-dependency-plugin + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + + remove-remote-image + clean + + exec + + + curl + + -X + DELETE + ${docker.registry}/mall/${project.artifactId}:${project.version} + + + + + + com.spotify docker-maven-plugin ${docker.maven.plugin.version} + + + build-image package From 4814ca202d3aedbcb9ddf2a348a391fe1b869a9c Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Thu, 6 Nov 2025 09:30:17 +0800 Subject: [PATCH 09/64] =?UTF-8?q?=E9=80=80=E6=AC=BE=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=80=BB=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sync/service/SyncThirdDataService.java | 4 +++- .../impl/SyncThirdDataServiceImpl.java | 19 ++++++++++++++----- sql/shop/dev/20251106_dml.sql | 1 + 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 sql/shop/dev/20251106_dml.sql diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java index 8857053c..01fec6db 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java @@ -20,6 +20,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; +import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; @@ -138,8 +139,9 @@ public interface SyncThirdDataService { * * @param stockDeltaMap key 为商品唯一key,value 为库存增降量 例如 {"1234567890123": 100, "1234567890124": 50} 库存数为正负整数,单位可能是个数或重量(克) * 数量为正数时,库存数增加;数量为负数时,库存数减少 + * itemReturnAmount 退货时输入 */ - void incrProductStockToRedis(Map stockDeltaMap); + void incrProductStockToRedis(Map stockDeltaMap, BigDecimal itemReturnAmount); /** diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 7fee550a..cd95608a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -903,12 +903,13 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements ProductQuantityConsumption productQuantityConsumption=new ProductQuantityConsumption(); String productKey= (String) k; String[] productKeyArrys=productKey.split("-"); - if(productKeyArrys.length!=3){ + if(productKeyArrys.length!=4){ return; } String productNumber=productKeyArrys[0]; String orderId=productKeyArrys[1]; String unitPrice=productKeyArrys[2]; + String saleAmount=productKeyArrys[3]; productQuantityConsumption.setConsumeId(IdUtil.getSnowflakeNextIdStr()); productQuantityConsumption.setOrderId(orderId); productQuantityConsumption.setProductNumber(productNumber); @@ -916,6 +917,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements productQuantityConsumption.setStoreId(Integer.valueOf(storeId)); productQuantityConsumption.setStatus(0); productQuantityConsumption.setUnitPrice(new BigDecimal(unitPrice)); + productQuantityConsumption.setSaleAmount(new BigDecimal(saleAmount)); productQuantityConsumptionList.add(productQuantityConsumption); }); return productQuantityConsumptionList; @@ -926,7 +928,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements } @Override - public void incrProductStockToRedis(Map stockDeltaMap) { + public void incrProductStockToRedis(Map stockDeltaMap, BigDecimal itemReturnAmount) { // 校验参数,避免空指针 if (CollectionUtil.isEmpty(stockDeltaMap)) { return; @@ -972,11 +974,12 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements continue; } } - cn.hutool.json.JSONArray array_item_spec= JSONUtil.parseArray(spuItem.getItem_spec()); + cn.hutool.json.JSONArray array_item_spec = JSONUtil.parseArray(spuItem.getItem_spec()); logger.info("array_item_spec:{}",array_item_spec); logger.info("key:{},Product_number:{}",key,itemId); if(array_item_spec.isEmpty()){ - redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPrice, delta.doubleValue()); + BigDecimal saleAmount=new BigDecimal(unitPrice).multiply(new BigDecimal(delta)); + redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPrice+"-"+saleAmount.toPlainString(), delta.doubleValue()); logger.info("存储无规格库存成功"); continue; } @@ -986,9 +989,15 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements BigDecimal unitWeight = itemQuarytys[0]; BigDecimal itemQuaryty = itemQuarytys[1]; BigDecimal unitPriceBg=new BigDecimal(unitPrice).divide(unitWeight,4, RoundingMode.HALF_UP); + + if(ObjectUtil.isNotNull(itemReturnAmount)){//退货 + itemQuaryty=itemReturnAmount.divide(unitPriceBg,4,RoundingMode.HALF_UP); + }else { + itemReturnAmount=unitPriceBg.multiply(itemQuaryty); + } logger.info("unitWeight-{};itemQuaryty-{};unitPriceBg-{}",unitWeight,itemQuaryty,unitPriceBg); // 使用 Redis 的 HINCRBY 保证原子性和高性能 - redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPriceBg.toPlainString(), itemQuaryty.doubleValue()); + redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()+"-"+itemReturnAmount.toPlainString(), itemQuaryty.doubleValue()); logger.info("存储有规格库存成功",itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()); } catch (Exception e) { logger.error("库存累计失败,productKey={}, delta={}, error={}", productKey, delta, e.getMessage(), e); diff --git a/sql/shop/dev/20251106_dml.sql b/sql/shop/dev/20251106_dml.sql new file mode 100644 index 00000000..8cabf5c2 --- /dev/null +++ b/sql/shop/dev/20251106_dml.sql @@ -0,0 +1 @@ +alter table product_quantity_consumption add column sale_amount decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单总额'; \ No newline at end of file From 0c15b2c034ed6253ab49f3d476fa24c3e402aec6 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Thu, 6 Nov 2025 09:34:32 +0800 Subject: [PATCH 10/64] =?UTF-8?q?=E9=80=80=E6=AC=BE=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=80=BB=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/modules/sync/ProductQuantityConsumption.java | 4 ++++ .../shop/order/service/impl/ShopOrderReturnServiceImpl.java | 2 +- .../shop/sfexpress/service/impl/SFExpressApiServiceImpl.java | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java index 108ca004..97d9c6b6 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java @@ -36,6 +36,10 @@ public class ProductQuantityConsumption { @TableField(value = "quantity",updateStrategy = FieldStrategy.NOT_EMPTY) private BigDecimal quantity; + @ApiModelProperty("订单总额") + @TableField(value = "sale_amount",updateStrategy = FieldStrategy.NOT_EMPTY) + private BigDecimal saleAmount; + @ApiModelProperty("消费状态:0-未消费,1-已消费") @TableField(value = "status",updateStrategy = FieldStrategy.NOT_EMPTY) private Integer status; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 00e6234b..1c004054 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -1526,7 +1526,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl stockDeltaMap = new HashMap<>(); String item_src_id = productItem.getItem_src_id(); stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id()+"-"+shopOrderItem.getItem_unit_price(), returnNum); - syncThirdDataService.incrProductStockToRedis(stockDeltaMap); + syncThirdDataService.incrProductStockToRedis(stockDeltaMap,shopOrderReturn.getReturn_refund_amount()); logger.info("退货返回给思迅,存入redis成功,item_src_id:{},订单号:{},数量:{}", item_src_id, shopOrderReturn.getOrder_id(), returnNum); } else { logger.warn("退货数量为空,无法增加库存,订单项ID: {}", orderItemId); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index 154f917d..25160b6c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -1179,7 +1179,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String item_src_id = shopOrderItem.getItem_src_id(); Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); stockDeltaMap.put(item_src_id + "-" + shopStoreSfOrder.getShop_order_id()+"-"+shopOrderItem.getItem_unit_price(), -order_item_quantity); - syncThirdDataService.incrProductStockToRedis(stockDeltaMap); + syncThirdDataService.incrProductStockToRedis(stockDeltaMap,null); } } //出库扣减思迅库存end @@ -1348,7 +1348,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String item_src_id = shopOrderItem.getItem_src_id(); Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id()+"-"+shopOrderItem.getItem_unit_price(), -order_item_quantity); - syncThirdDataService.incrProductStockToRedis(stockDeltaMap); + syncThirdDataService.incrProductStockToRedis(stockDeltaMap,null); } } return CommonResult.success("操作成功"); From 38b674e05a06a4f30a319894337c29fc8616397b Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 6 Nov 2025 12:38:06 +0800 Subject: [PATCH 11/64] =?UTF-8?q?=E7=A0=8D=E4=BB=B7=E6=B4=BB=E5=8A=A8=20?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A7=BD=20=E4=BF=AE=E6=AD=A3=E6=96=B0?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E3=80=82=20=E5=A2=9E=E5=8A=A0=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/ShopActivityCutprice.java | 3 + .../modules/store/ShopStoreActivityBase.java | 8 + .../mall/common/utils/DateTimeUtils.java | 44 ++- .../impl/ShopOrderInfoServiceImpl.java | 267 ++++++++---------- .../impl/ShopStoreBaseServiceImpl.java | 4 +- .../activity/ShopActivityCutpriceMapper.xml | 2 +- .../store/ShopStoreActivityBaseMapper.xml | 3 +- 7 files changed, 158 insertions(+), 173 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java index 10d27744..11e4a8e7 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java @@ -56,6 +56,9 @@ public class ShopActivityCutprice implements Serializable { @ApiModelProperty(value = "砍价人数") private Integer ac_num; + @ApiModelProperty(value = "砍价过期时间戳") + private Long expired_at; + @Version @ApiModelProperty(value = "乐观锁") private Integer version; diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java index af686bad..fd127abf 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java @@ -127,4 +127,12 @@ public class ShopStoreActivityBase implements Serializable { @TableField(updateStrategy = NOT_EMPTY) private String flow_no; + @Version + @ApiModelProperty(value = "在活动时间范围内,用户砍价允许的天数") + private Integer cut_days; + + @Version + @ApiModelProperty(value = "活动商品的总数量") + private Integer product_cont; + } diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java b/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java index 490c174f..6f559ab4 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/DateTimeUtils.java @@ -439,15 +439,15 @@ public class DateTimeUtils { * @param startTimeStr 开始时间字符串,支持格式如 HH:mm, HH:mm:ss, HH:mm:ss.SSS 等 * @param endTimeStr 结束时间字符串,支持格式如 HH:mm, HH:mm:ss, HH:mm:ss.SSS 等 * @param currentTime 要判断的时间点 - * @return 如果在时间段内返回true,否则返回false。出现异常时返回false,不影响主流程 + * @return 返回值: -1-在时间段之前 0-时间段内,1-在时间段之后 */ - public static boolean isTimeInRange(String startTimeStr, String endTimeStr, LocalDateTime currentTime) { + public static int isTimeInRange(String startTimeStr, String endTimeStr, LocalDateTime currentTime) { try { // 参数校验 if (startTimeStr == null || endTimeStr == null || currentTime == null) { log.warn("时间参数不能为空,startTimeStr: {}, endTimeStr: {}, currentTime: {}", startTimeStr, endTimeStr, currentTime); - return false; + return -1; } // 解析开始时间 - 支持多种时间格式 @@ -459,37 +459,53 @@ public class DateTimeUtils { // 获取当前时间的时间部分 LocalTime nowTime = currentTime.toLocalTime(); + // 处理开始时间等于结束时间的情况 + if (startTime.equals(endTime)) { + return nowTime.equals(startTime) ? 0 : -1; // 精确匹配为时间段内,否则为时间段前 + } + // 处理跨天情况,例如 22:00 - 06:00 if (endTime.isBefore(startTime)) { // 如果结束时间小于开始时间,说明跨越了午夜 - // 当前时间需要满足:大于等于开始时间 或者 小于等于结束时间 - return !nowTime.isBefore(startTime) || !nowTime.isAfter(endTime); + // 跨天时间段: [startTime, 24:00) ∪ [00:00, endTime] + if (!nowTime.isBefore(startTime) || !nowTime.isAfter(endTime)) { + return 0; // 时间段内 + } else { + // 对于跨天情况,不在时间段内的唯一可能就是"时间段前" + // 因为跨天时间段覆盖了从startTime到endTime经过午夜的整个区间 + return -1; // 时间段前 + } } else { // 正常情况(不跨天),当前时间需要在开始时间和结束时间之间(包含边界) - return !nowTime.isBefore(startTime) && !nowTime.isAfter(endTime); + if (nowTime.isBefore(startTime)) { + return -1; // 时间段前 + } else if (nowTime.isAfter(endTime)) { + return 1; // 时间段后 + } else { + return 0; // 时间段内 + } } } catch (Exception e) { // 捕获解析异常,记录日志并返回false,避免影响主流程 log.error("判断时间是否在范围内时发生异常,startTimeStr: {}, endTimeStr: {}, currentTime: {}", startTimeStr, endTimeStr, currentTime, e); - return false; + return -1; } } - - + /** * 判断指定时间是否在两个时间点之间(包含边界) * * @param startTimeStr 开始时间字符串,支持格式如 HH:mm, HH:mm:ss, HH:mm:ss.SSS 等 * @param endTimeStr 结束时间字符串,支持格式如 HH:mm, HH:mm:ss, HH:mm:ss.SSS 等 * @param currentTime 要判断的时间点 - * @return 如果在时间段内返回true,否则返回false。出现异常时返回false,不影响主流程 + * @return 返回值: -1-在时间段之前 0-时间段内,1-在时间段之后 */ - public static boolean isTimeInRange(String startTimeStr, String endTimeStr, Date currentTime) { + public static int isTimeInRange(String startTimeStr, String endTimeStr, Date currentTime) { if (currentTime == null) { log.warn("时间参数不能为空,startTimeStr: {}, endTimeStr: {}, currentTime: null", startTimeStr, endTimeStr); - return false; + return -1; } // 将Date转换为LocalDateTime并调用已有的方法 LocalDateTime localDateTime = currentTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); @@ -501,9 +517,9 @@ public class DateTimeUtils { * * @param startTimeStr 开始时间字符串,支持格式如 HH:mm, HH:mm:ss, HH:mm:ss.SSS 等 * @param endTimeStr 结束时间字符串,支持格式如 HH:mm, HH:mm:ss, HH:mm:ss.SSS 等 - * @return 如果在时间段内返回true,否则返回false + * @return 返回值: -1-在时间段之前 0-时间段内,1-在时间段之后 */ - public static boolean isCurrentTimeInRange(String startTimeStr, String endTimeStr) { + public static int isCurrentTimeInRange(String startTimeStr, String endTimeStr) { return isTimeInRange(startTimeStr, endTimeStr, LocalDateTime.now()); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java index 28eef942..5ed4d0db 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java @@ -902,7 +902,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl result = new ArrayList<>(); // 判断今天还能不能立即下单和预约下单?能:就有今天的时间槽;不能:就没有今天的时间槽 - boolean canBookingToday = DateTimeUtils.isTimeInRange(timesPair.getFirst(), timesPair.getSecond(), new Date()); + //-1-在时间段之前 0-时间段内,1-在时间段之后 + int inRangeVal = DateTimeUtils.isCurrentTimeInRange(timesPair.getFirst(), timesPair.getSecond()); - // 生成7天的可预约时间槽数据 - Date startDate = new Date(); - if (!canBookingToday) { - // 如果今天不能下单和预约,则从明天开始生成时间槽 - startDate = DateUtil.offsetDay(new Date(), 1); - } + // 确定起始日期 + Date startDate = inRangeVal == 1 ? DateUtil.offsetDay(new Date(), 1) : new Date(); + boolean isTodayAvailable = inRangeVal <= 0; // 今天是否可预约(在营业时间之前或之中) for (int i = 0; i < daysCnt; i++) { - startDate = DateUtil.offsetDay(startDate, i); + Date currentDate = DateUtil.offsetDay(startDate, i); BookingArgDTO bookingArgDTO = new BookingArgDTO(); // 设置日期相关信息 - String dateStr = DateUtil.format(startDate, "yyyy-MM-dd"); - String displayDateStr = DateUtil.format(startDate, "MM月dd日"); + String dateStr = DateUtil.format(currentDate, "yyyy-MM-dd"); + String displayDateStr = DateUtil.format(currentDate, "MM月dd日"); // 安全获取星期信息 String weekStr = "星期"; try { - weekStr = DateTimeUtils.getWeekOfDate(startDate); + weekStr = DateTimeUtils.getWeekOfDate(currentDate); } catch (Exception e) { logger.warn("[生成预约参数] 获取星期信息异常,使用默认值,date: {}", dateStr); } - // 设置date_title - 优化后的代码 + // 设置date_title String dateTitle; if (i == 0) { - dateTitle = canBookingToday ? "今天" : "明天"; + dateTitle = isTodayAvailable ? "今天" : "明天"; } else if (i == 1) { - dateTitle = canBookingToday ? "明天" : "后天"; + dateTitle = isTodayAvailable ? "后天" : "明天"; } else { dateTitle = displayDateStr; } - bookingArgDTO.setDate_title(dateTitle + "(" + weekStr + ")"); + bookingArgDTO.setDate_title(dateTitle + "(" + weekStr + ")"); bookingArgDTO.setDate_str(displayDateStr); bookingArgDTO.setDate(dateStr); - // 生成时间项 -// List items = new ArrayList<>(); - - // 如果是今天且在配送时间内,添加"立即送出"选项 -// if (i == 0 && canBookingToday) { -// BookingArgDTO.BookingArgItem immediateItem = new BookingArgDTO.BookingArgItem(); -// immediateItem.setTime_title("立即送出"); -// immediateItem.setBooking_at(0L); -// immediateItem.setBooking_state(1); -// immediateItem.setBooking_begin_time(""); -// immediateItem.setBooking_end_time(""); -// items.add(immediateItem); -// } - - String startTimeStr = timesPair.getFirst(); String endTimeStr = timesPair.getSecond(); - boolean isToday = i == 0 && canBookingToday; - // 生成时间项 - List items = generateTimeSlots(dateStr, startTimeStr, endTimeStr, isToday); -// if (i == 0 && canBookingToday) { -// items.addAll(timeSlots.stream().filter(item -> item.getBooking_state() != 1).collect(Collectors.toList())); -// } else { -// items.addAll(timeSlots); -// } - bookingArgDTO.setWorking_hours(String.format("%s-%s", startTimeStr, endTimeStr)); + + // 生成时间槽 + List items = new ArrayList<>(); + + // 参数校验 + if (StrUtil.isNotBlank(dateStr) && StrUtil.isNotBlank(startTimeStr) && StrUtil.isNotBlank(endTimeStr)) { + try { + // 解析营业时间 + Date openTime = DateUtil.parse(dateStr + " " + startTimeStr + ":00", "yyyy-MM-dd HH:mm:ss"); + Date closeTime = DateUtil.parse(dateStr + " " + endTimeStr + ":00", "yyyy-MM-dd HH:mm:ss"); + + // 验证营业时间有效性 + if (!openTime.after(closeTime)) { + // 在营业时间段内,且是今天,添加"立即送出"选项 + if (i == 0 && isTodayAvailable && inRangeVal == 0) { + BookingArgDTO.BookingArgItem immediateItem = new BookingArgDTO.BookingArgItem(); + immediateItem.setTime_title("立即送出"); + immediateItem.setBooking_at(0L); + immediateItem.setBooking_state(1); + immediateItem.setBooking_begin_time(""); + immediateItem.setBooking_end_time(""); + items.add(immediateItem); + } + + // 确定时间槽开始时间 + Date startTime = openTime; + if (i == 0 && isTodayAvailable && inRangeVal <= 0) { + // 当前时间+50分钟作为时间槽的开始时间 + Date nowPlusFifty = DateUtil.offsetMinute(new Date(), CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER); + + // 确保开始时间在营业时间范围内 + if (nowPlusFifty.after(openTime)) { + if (nowPlusFifty.before(closeTime)) { + // 如果当前时间+50分钟在营业时间范围内,则从该时间开始 + startTime = nowPlusFifty; + logger.debug("[生成时间槽] 当前时间+50分钟在营业时间范围内,则从该时间开始"); + } else { + // 如果当前时间+50分钟已经超过营业结束时间,则不生成后续时间槽 + logger.debug("[生成时间槽] 当前时间+50分钟已超过营业结束时间,不生成后续时间槽"); + startTime = null; // 标记为不生成时间槽 + } + } + } + + // 生成时间槽 + if (startTime != null) { + Date currentTimeSlot = startTime; + int slotCount = 0; + final int MAX_SLOTS = 96; // 最多生成96个时间段,防止异常循环 + + while (currentTimeSlot.before(closeTime) && slotCount < MAX_SLOTS) { + Date endTimeSlot = DateUtil.offsetMinute(currentTimeSlot, 15); + + // 如果结束时间超过了营业结束时间,则使用营业结束时间 + if (endTimeSlot.after(closeTime)) { + endTimeSlot = closeTime; + } + + // 创建时间段项 + BookingArgDTO.BookingArgItem timeItem = new BookingArgDTO.BookingArgItem(); + String beginTimeStr = DateUtil.format(currentTimeSlot, "HH:mm"); + String endTimeStrItem = DateUtil.format(endTimeSlot, "HH:mm"); + + timeItem.setTime_title(beginTimeStr + "-" + endTimeStrItem); + + // 时间戳计算(秒) + long bookingAt = currentTimeSlot.getTime() / 1000; + timeItem.setBooking_at(bookingAt); + + timeItem.setBooking_state(2); + timeItem.setBooking_begin_time(DateUtil.format(currentTimeSlot, "yyyy-MM-dd HH:mm:ss")); + timeItem.setBooking_end_time(DateUtil.format(endTimeSlot, "yyyy-MM-dd HH:mm:ss")); + + items.add(timeItem); + + // 移动到下一个时间段 + currentTimeSlot = endTimeSlot; + slotCount++; + + // 防止时间相同导致的死循环 + if (currentTimeSlot.equals(startTime)) { + logger.warn("[生成时间槽] 检测到时间循环,跳出循环"); + break; + } + } + + if (slotCount >= MAX_SLOTS) { + logger.warn("[生成时间槽] 时间段数量超过最大限制,date: {}", dateStr); + } + } + } else { + logger.warn("[生成时间槽] 营业时间无效,openTime: {}, closeTime: {}", openTime, closeTime); + } + } catch (Exception e) { + logger.error("[生成时间槽] 生成时间槽异常,date: {}, openingHours: {}, closeHours: {}", dateStr, startTimeStr, endTimeStr, e); + } + } + bookingArgDTO.setItems(items); result.add(bookingArgDTO); } @@ -1118,119 +1188,6 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl generateTimeSlots(String dateStr, String openingHours, String closeHours, boolean isToday) { - // 参数校验 - if (StrUtil.isBlank(dateStr) || StrUtil.isBlank(openingHours) || StrUtil.isBlank(closeHours)) { - logger.warn("[生成时间槽] 参数为空,dateStr: {}, openingHours: {}, closeHours: {}", dateStr, openingHours, closeHours); - return Collections.emptyList(); - } - - try { - List items = new ArrayList<>(); - - // 添加"立即送出"选项(仅限今天) - if (isToday) { - BookingArgDTO.BookingArgItem immediateItem = new BookingArgDTO.BookingArgItem(); - immediateItem.setTime_title("立即送出"); - immediateItem.setBooking_at(0L); - immediateItem.setBooking_state(1); - immediateItem.setBooking_begin_time(""); - immediateItem.setBooking_end_time(""); - items.add(immediateItem); - } - - // 解析营业时间 - Date openTime = DateUtil.parse(dateStr + " " + openingHours + ":00", "yyyy-MM-dd HH:mm:ss"); - Date closeTime = DateUtil.parse(dateStr + " " + closeHours + ":00", "yyyy-MM-dd HH:mm:ss"); - - // 验证营业时间有效性 - if (openTime.after(closeTime)) { - logger.warn("[生成时间槽] 营业时间无效,openTime: {}, closeTime: {}", openTime, closeTime); - return items; - } - - // 时间槽间隔(分钟) - int slotInterval = 15; - - // 对于今天,需要特殊处理:第二个时间槽从当前时间+50分钟开始 - Date startTime = openTime; - if (isToday) { - // 当前时间+50分钟作为第二个时间槽的开始时间 - Date nowPlusFifty = DateUtil.offsetMinute(new Date(), CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER); - - // 如果当前时间+50分钟在营业时间范围内,则从该时间开始 - if (nowPlusFifty.after(openTime) && nowPlusFifty.before(closeTime)) { - startTime = nowPlusFifty; - } - // 如果当前时间+50分钟已经超过营业结束时间,则不生成后续时间槽 - else if (nowPlusFifty.after(closeTime)) { - logger.debug("[生成时间槽] 当前时间+50分钟已超过营业结束时间,不生成后续时间槽"); - return items; - } - } - - // 生成时间槽 - Date currentTimeSlot = startTime; - int slotCount = 0; - final int MAX_SLOTS = 48; // 最多生成48个时间段,防止异常循环 - - while (currentTimeSlot.before(closeTime) && slotCount < MAX_SLOTS) { - Date endTimeSlot = DateUtil.offsetMinute(currentTimeSlot, slotInterval); - - // 如果结束时间超过了营业结束时间,则使用营业结束时间 - if (endTimeSlot.after(closeTime)) { - endTimeSlot = closeTime; - } - - // 创建时间段项 - BookingArgDTO.BookingArgItem timeItem = new BookingArgDTO.BookingArgItem(); - String beginTimeStr = DateUtil.format(currentTimeSlot, "HH:mm"); - String endTimeStr = DateUtil.format(endTimeSlot, "HH:mm"); - - timeItem.setTime_title(beginTimeStr + "-" + endTimeStr); - - // 时间戳计算(秒) - long bookingAt = currentTimeSlot.getTime() / 1000; - timeItem.setBooking_at(bookingAt); - - timeItem.setBooking_state(2); - timeItem.setBooking_begin_time(DateUtil.format(currentTimeSlot, "yyyy-MM-dd HH:mm:ss")); - timeItem.setBooking_end_time(DateUtil.format(endTimeSlot, "yyyy-MM-dd HH:mm:ss")); - - items.add(timeItem); - - // 移动到下一个时间段 - currentTimeSlot = endTimeSlot; - slotCount++; - - // 防止时间相同导致的死循环 - if (currentTimeSlot.equals(startTime)) { - logger.warn("[生成时间槽] 检测到时间循环,跳出循环"); - break; - } - } - - if (slotCount >= MAX_SLOTS) { - logger.warn("[生成时间槽] 时间段数量超过最大限制,date: {}", dateStr); - } - - logger.debug("[生成时间槽] 成功生成时间槽,date: {}, 时间段数量: {}", dateStr, items.size()); - return items; - } catch (Exception e) { - logger.error("[生成时间槽] 生成时间槽异常,date: {}, openingHours: {}, closeHours: {}", dateStr, openingHours, closeHours, e); - return Collections.emptyList(); - } - } - /** * 根据 storeIds(一个或多个 storeid,如 34,23,43,23,),先对id去重, * 再获取多个店铺的营业时间 List 列表list diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index 9b5667f9..559bbde2 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -4217,7 +4217,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl - ac_id, activity_id, user_id, ac_sale_price, ac_datetime, order_id, ac_mix_limit_price, ac_num + ac_id, activity_id, user_id, ac_sale_price, ac_datetime, order_id, ac_mix_limit_price, ac_num, expired_at, version diff --git a/mall-shop/src/main/resources/mapper/store/ShopStoreActivityBaseMapper.xml b/mall-shop/src/main/resources/mapper/store/ShopStoreActivityBaseMapper.xml index a91d358a..87ba1f85 100644 --- a/mall-shop/src/main/resources/mapper/store/ShopStoreActivityBaseMapper.xml +++ b/mall-shop/src/main/resources/mapper/store/ShopStoreActivityBaseMapper.xml @@ -6,7 +6,8 @@ activity_id, store_id, user_id, activity_name, activity_title, activity_remark, activity_combo_id, activity_type_id, activity_starttime, activity_endtime, activity_state, activity_rule, activity_type, - activity_order, activity_is_finish, item_id, subsite_id + activity_order, activity_is_finish, item_id, subsite_id,activity_use_level, activity_releasetime, + activity_on_is_off, activity_share_num, version, flow_no, cut_days, product_cont From 1aea5d028172fa742148ac120ab1bdf69bdcac11 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Thu, 6 Nov 2025 16:48:08 +0800 Subject: [PATCH 12/64] =?UTF-8?q?=E9=87=91=E9=A2=9D=E5=8F=96=E6=95=B4?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/sync/service/impl/SyncThirdDataServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index cd95608a..bb76332b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -979,6 +979,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements logger.info("key:{},Product_number:{}",key,itemId); if(array_item_spec.isEmpty()){ BigDecimal saleAmount=new BigDecimal(unitPrice).multiply(new BigDecimal(delta)); + if(saleAmount.compareTo(BigDecimal.ZERO)<0){ + saleAmount=saleAmount.multiply(new BigDecimal("-1")); + } redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPrice+"-"+saleAmount.toPlainString(), delta.doubleValue()); logger.info("存储无规格库存成功"); continue; @@ -996,6 +999,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements itemReturnAmount=unitPriceBg.multiply(itemQuaryty); } logger.info("unitWeight-{};itemQuaryty-{};unitPriceBg-{}",unitWeight,itemQuaryty,unitPriceBg); + if(itemReturnAmount.compareTo(BigDecimal.ZERO)<0){ + itemReturnAmount=itemReturnAmount.multiply(new BigDecimal("-1")); + } // 使用 Redis 的 HINCRBY 保证原子性和高性能 redisTemplate.opsForHash().increment(key, itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()+"-"+itemReturnAmount.toPlainString(), itemQuaryty.doubleValue()); logger.info("存储有规格库存成功",itemId+"-"+orderId+"-"+unitPriceBg.toPlainString()); From 45a2f7a07db5c78f0ee7e4b4b0e452d33e75ac08 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 6 Nov 2025 16:58:52 +0800 Subject: [PATCH 13/64] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=B1=BB=E7=9A=84=20=E9=94=99=E8=AF=AF=EF=BC=8C=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=89=93=E5=8C=85=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/store/ShopStoreActivityBase.java | 10 ++-- .../ShopStoreActivityBaseServiceImpl.java | 5 -- .../store/ShopStoreActivityBaseMapper.xml | 7 +-- pom.xml | 48 +++++++------------ 4 files changed, 24 insertions(+), 46 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java index fd127abf..a68a8786 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java @@ -1,6 +1,9 @@ package com.suisung.mall.common.modules.store; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -119,7 +122,6 @@ public class ShopStoreActivityBase implements Serializable { @TableField(updateStrategy = NOT_EMPTY) private Integer activity_share_num; - @Version @ApiModelProperty(value = "乐观锁") private Integer version; @@ -127,12 +129,10 @@ public class ShopStoreActivityBase implements Serializable { @TableField(updateStrategy = NOT_EMPTY) private String flow_no; - @Version @ApiModelProperty(value = "在活动时间范围内,用户砍价允许的天数") private Integer cut_days; - @Version @ApiModelProperty(value = "活动商品的总数量") private Integer product_cont; - + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java index c400b0bc..c4746cc6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java @@ -40,7 +40,6 @@ import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.StringUtils; import com.suisung.mall.common.utils.UserInfoService; -import com.suisung.mall.core.web.service.RedisService; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.activity.service.*; import com.suisung.mall.shop.base.service.AccountBaseConfigService; @@ -104,8 +103,6 @@ public class ShopStoreActivityBaseServiceImpl extends BaseServiceImpl - - activity_id, store_id, user_id, activity_name, activity_title, activity_remark, activity_combo_id, - activity_type_id, activity_starttime, activity_endtime, activity_state, activity_rule, activity_type, - activity_order, activity_is_finish, item_id, subsite_id,activity_use_level, activity_releasetime, - activity_on_is_off, activity_share_num, version, flow_no, cut_days, product_cont - + * diff --git a/pom.xml b/pom.xml index e5bda657..5bc7e062 100644 --- a/pom.xml +++ b/pom.xml @@ -540,38 +540,23 @@ maven-dependency-plugin - - - org.codehaus.mojo - exec-maven-plugin - 3.0.0 - - - remove-remote-image - clean - - exec - - - curl - - -X - DELETE - ${docker.registry}/mall/${project.artifactId}:${project.version} - - - - - - com.spotify docker-maven-plugin ${docker.maven.plugin.version} - - + + + remove-old-image + clean + + removeImage + + + ${docker.registry}/mall/${project.artifactId}:${project.version} + + build-image @@ -583,10 +568,6 @@ - - - - ${docker.registry}/mall/${project.artifactId}:${project.version} ${docker.host} @@ -602,6 +583,13 @@ docker-registry + + true + + ${project.version} + latest + + ["sh", "-c", "mkdir -p /tmp /app/temp /root/nacos/naming/public && chmod -R 777 /tmp /app/temp /root/nacos && java -Djava.io.tmpdir=/app/temp -Dnacos.naming.cache.dir=/root/nacos/naming -jar -Xms256m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseContainerSupport -XX:MaxRAMPercentage=60.0 -XX:+UseSerialGC -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=60 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M -Dspring.profiles.active=${spring.profile} -Duser.timezone=Asia/Shanghai /${project.build.finalName}.jar"] From 3ee9eaee8d2eb5a6fc0fb3d8b4b4a8e31ab0ab27 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Thu, 6 Nov 2025 17:25:15 +0800 Subject: [PATCH 14/64] =?UTF-8?q?=E8=87=AA=E5=8F=96=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index bb76332b..45e798b6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -864,6 +864,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements ProductQuantityConsumption productQuantityConsumption=new ProductQuantityConsumption(); productQuantityConsumption.setConsumeId(consumeId); productQuantityConsumption.setStatus(1); + productQuantityConsumption.setUpdateTime(new Date()); productQuantityConsumptionList.add(productQuantityConsumption); } if(!productQuantityConsumptionList.isEmpty()){ @@ -915,6 +916,8 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements productQuantityConsumption.setProductNumber(productNumber); productQuantityConsumption.setQuantity(Convert.toBigDecimal(v)); productQuantityConsumption.setStoreId(Integer.valueOf(storeId)); + productQuantityConsumption.setCreateTime(new Date()); + productQuantityConsumption.setUpdateTime(new Date()); productQuantityConsumption.setStatus(0); productQuantityConsumption.setUnitPrice(new BigDecimal(unitPrice)); productQuantityConsumption.setSaleAmount(new BigDecimal(saleAmount)); From 3c19ee70649d1c27ff475980e5995a269ab6ae8a Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Thu, 6 Nov 2025 17:30:29 +0800 Subject: [PATCH 15/64] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=97=B6=E6=96=B0=E5=A2=9Eitem=E6=9D=A1?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/product/service/impl/ShopProductBaseServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java index e91ebb9a..63ad5d0d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java @@ -513,7 +513,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl Date: Thu, 6 Nov 2025 18:01:15 +0800 Subject: [PATCH 16/64] =?UTF-8?q?fix=20=E9=A2=84=E7=BA=A6=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=97=B6=E9=97=B4=E6=A7=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java index 5ed4d0db..8e02263a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java @@ -1068,7 +1068,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl Date: Thu, 6 Nov 2025 18:00:12 +0800 Subject: [PATCH 17/64] =?UTF-8?q?createTime=E5=92=8CupdateTime=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=B7=B2=E6=9C=89=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 45e798b6..bb76332b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -864,7 +864,6 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements ProductQuantityConsumption productQuantityConsumption=new ProductQuantityConsumption(); productQuantityConsumption.setConsumeId(consumeId); productQuantityConsumption.setStatus(1); - productQuantityConsumption.setUpdateTime(new Date()); productQuantityConsumptionList.add(productQuantityConsumption); } if(!productQuantityConsumptionList.isEmpty()){ @@ -916,8 +915,6 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements productQuantityConsumption.setProductNumber(productNumber); productQuantityConsumption.setQuantity(Convert.toBigDecimal(v)); productQuantityConsumption.setStoreId(Integer.valueOf(storeId)); - productQuantityConsumption.setCreateTime(new Date()); - productQuantityConsumption.setUpdateTime(new Date()); productQuantityConsumption.setStatus(0); productQuantityConsumption.setUnitPrice(new BigDecimal(unitPrice)); productQuantityConsumption.setSaleAmount(new BigDecimal(saleAmount)); From bb0eb917c17a1c78eb64cedde90fb2fb644f55ca Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Thu, 6 Nov 2025 18:21:58 +0800 Subject: [PATCH 18/64] =?UTF-8?q?=E9=80=80=E6=AC=BE=E6=80=BB=E9=A2=9D?= =?UTF-8?q?=E5=8F=96=E5=80=BC=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/order/service/impl/ShopOrderReturnServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 1c004054..83468784 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -1526,7 +1526,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl stockDeltaMap = new HashMap<>(); String item_src_id = productItem.getItem_src_id(); stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id()+"-"+shopOrderItem.getItem_unit_price(), returnNum); - syncThirdDataService.incrProductStockToRedis(stockDeltaMap,shopOrderReturn.getReturn_refund_amount()); + syncThirdDataService.incrProductStockToRedis(stockDeltaMap,returnItem.getReturn_item_subtotal()); logger.info("退货返回给思迅,存入redis成功,item_src_id:{},订单号:{},数量:{}", item_src_id, shopOrderReturn.getOrder_id(), returnNum); } else { logger.warn("退货数量为空,无法增加库存,订单项ID: {}", orderItemId); From 507b65838ce465f2a18dbf66ee959f53fa3ccf93 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 6 Nov 2025 22:52:59 +0800 Subject: [PATCH 19/64] =?UTF-8?q?fix=20=E9=A2=84=E7=BA=A6=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=97=B6=E9=97=B4=E6=A7=BD,=E5=A2=9E=E5=8A=A0=20?= =?UTF-8?q?=E5=BC=80=E4=B8=9A=E7=AD=B9=E5=A4=87=E4=B8=AD=E7=9A=84=E5=BA=97?= =?UTF-8?q?=E9=93=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/store/ShopStoreBase.java | 4 +- .../order/service/ShopOrderBaseService.java | 2 + .../impl/ShopOrderBaseServiceImpl.java | 1 + .../impl/ShopOrderInfoServiceImpl.java | 61 ++++++++++++------- .../store/service/ShopStoreBaseService.java | 10 +++ .../impl/ShopStoreBaseServiceImpl.java | 48 +++++++++++++++ .../mapper/store/ShopStoreBaseMapper.xml | 2 +- pom.xml | 6 ++ 8 files changed, 110 insertions(+), 24 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java index 89c1fa17..43d0142c 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java @@ -83,8 +83,8 @@ public class ShopStoreBase implements Serializable { @ApiModelProperty(value = "店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中;") private Integer store_biz_state; - @ApiModelProperty(value = "开业(活动)筹备具体时间 yyyy-MM-dd HH:mm:ss;") - private Date store_biz_opening_dtime; + @ApiModelProperty(value = "开业(活动)筹备日期 yyyy-MM-dd") + private Date store_biz_opening_date; @ApiModelProperty(value = "上级店铺编号:创建店铺决定,所属分销商-不可更改! 佣金公平性考虑") private Integer shop_parent_id; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java index e0212547..e60c32c2 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java @@ -616,4 +616,6 @@ public interface ShopOrderBaseService extends IBaseService { * @return */ Boolean updateOrderTime(String orderId, Date orderTime); + + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index 8cdf0518..8c4f0576 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -9366,4 +9366,5 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl genBookingOrderArgList(String storeIds) { // 初始化营业时间对象 - Pair timesPair = null; + Pair storeBizTimeRange = null; // 如果storeId不为空,则尝试获取店铺信息 if (StrUtil.isNotBlank(storeIds)) { - // 多个店铺的营业时间段集合 - List> timesMapList = selStoreBizTimeMapList(storeIds); - if (!CollUtil.isEmpty(timesMapList)) { + // 根据一个或多个店铺id获取有效店铺的有效营业时间段 + List> storeBizTimeRangesList = selectMulStoreBizTimeRanges(storeIds); + if (!CollUtil.isEmpty(storeBizTimeRangesList)) { // 获取多个店铺的营业时间段的一个交集 - timesPair = DateTimeUtils.findTimeInterSection(timesMapList); + storeBizTimeRange = DateTimeUtils.findTimeInterSection(storeBizTimeRangesList); } } - if (timesPair == null || StrUtil.isBlank(timesPair.getFirst()) || StrUtil.isBlank(timesPair.getSecond())) { + if (storeBizTimeRange == null + || StrUtil.isBlank(storeBizTimeRange.getFirst()) + || StrUtil.isBlank(storeBizTimeRange.getSecond())) { // 没有具体的营业时间段 logger.info("[生成预约参数] 未找到营业时间段"); return Collections.emptyList(); @@ -1037,15 +1039,31 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl result = new ArrayList<>(); + List bookingArgList = new ArrayList<>(); - // 判断今天还能不能立即下单和预约下单?能:就有今天的时间槽;不能:就没有今天的时间槽 + Date startDate = new Date(); //-1-在时间段之前 0-时间段内,1-在时间段之后 - int inRangeVal = DateTimeUtils.isCurrentTimeInRange(timesPair.getFirst(), timesPair.getSecond()); + int inRangeVal = 0; + // 今天是否可预约(在营业时间之前或之中) + boolean isTodayAvailable = true; + + // 获取开业(活动)筹备中店铺最晚的日期, 如果存在说明几个店铺中有开业(活动)筹备中的店铺 + Date latestBizOpeningDate = shopStoreBaseService.getLatestBizOpeningDate(storeIds); + if (latestBizOpeningDate != null) { + // 有开业筹备中的店铺,预约以这个开业日期为起始日期 + startDate = latestBizOpeningDate; + inRangeVal = 1; + isTodayAvailable = false; + } else { + // 判断今天还能不能立即下单和预约下单?能:就有今天的时间槽;不能:就没有今天的时间槽 + //-1-在时间段之前 0-时间段内,1-在时间段之后 + inRangeVal = DateTimeUtils.isCurrentTimeInRange(storeBizTimeRange.getFirst(), storeBizTimeRange.getSecond()); + + // 确定起始日期 + startDate = inRangeVal == 1 ? DateUtil.offsetDay(startDate, 1) : startDate; + isTodayAvailable = inRangeVal <= 0; // 今天是否可预约(在营业时间之前或之中) + } - // 确定起始日期 - Date startDate = inRangeVal == 1 ? DateUtil.offsetDay(new Date(), 1) : new Date(); - boolean isTodayAvailable = inRangeVal <= 0; // 今天是否可预约(在营业时间之前或之中) for (int i = 0; i < daysCnt; i++) { Date currentDate = DateUtil.offsetDay(startDate, i); @@ -1065,9 +1083,9 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl * 根据 storeIds(一个或多个 storeid,如 34,23,43,23,),先对id去重, * 再获取多个店铺的营业时间 List 列表list * 启动如果遇到某个店铺是开业(活动)筹备中的,获取他的开始营业的的日期和营业时间段组合出特有营业时间段 @@ -1196,7 +1216,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl> selStoreBizTimeMapList(String storeIds) { + private List> selectMulStoreBizTimeRanges(String storeIds) { // 参数校验 if (StrUtil.isBlank(storeIds)) { return Collections.emptyList(); @@ -1220,7 +1240,6 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.select("store_opening_hours", "store_close_hours"); // 只查询必要字段 queryWrapper.in("store_id", storeIds); - List shopStoreInfos = shopStoreInfoService.find(queryWrapper); // 4. 转换为营业时间映射列表 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreBaseService.java index d83998c6..b00c7986 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreBaseService.java @@ -17,6 +17,7 @@ import org.springframework.data.util.Pair; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; +import java.util.Date; import java.util.List; import java.util.Map; @@ -245,6 +246,15 @@ public interface ShopStoreBaseService extends IBaseService { */ Pair getStoreBizState(Integer storeId); + + /** + * 根据一个或多个店铺Id,获取开业(活动)筹备中店铺的营业日期最晚的那个日期 + * + * @param storeIds 店铺ID列表,多个ID用英文逗号分隔 + * @return 最晚的营业开始日期,格式为yyyy-MM-dd + */ + Date getLatestBizOpeningDate(String storeIds); + // Page getMobileStoreList(Integer page, Integer rows); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index 559bbde2..31b92843 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -4336,6 +4336,54 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl uniqueStoreIds = Arrays.stream(storeIds.split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .map(Integer::valueOf) + .distinct() + .collect(Collectors.toList()); + + // 2. 如果没有有效的店铺ID,返回null + if (uniqueStoreIds.isEmpty()) { + return null; + } + + // 3. 查询开业筹备中店铺的最晚营业开始日期 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("MAX(store_biz_opening_date) AS store_biz_opening_date"); + queryWrapper.in("store_id", uniqueStoreIds) + .eq("store_biz_state", CommonConstant.Store_Biz_State_PreActivity) + .eq("store_is_open", CommonConstant.Enable) + .gt("store_biz_opening_date", new Date()); + + ShopStoreBase shopStoreBase = getOne(queryWrapper); + return shopStoreBase != null ? shopStoreBase.getStore_biz_opening_date() : null; + + } catch (NumberFormatException e) { + logger.warn("店铺ID解析失败: storeIds={}", storeIds, e); + return null; + } catch (Exception e) { + logger.error("查询店铺最晚营业开始日期异常: storeIds={}", storeIds, e); + return null; + } + } + + // @Override // public Page getMobileStoreList(Integer page, Integer rows) { // QueryWrapper queryWrapper=new QueryWrapper<>(); diff --git a/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml b/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml index 52529964..e0bbc023 100644 --- a/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml +++ b/mall-shop/src/main/resources/mapper/store/ShopStoreBaseMapper.xml @@ -6,7 +6,7 @@ store_id , user_id, store_name, store_grade_id, store_logo, store_slogan, store_domain, store_area, store_district_id, store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, - store_biz_state, store_biz_opening_dtime, ringtone_is_enable, shop_parent_id, store_2nd_category_id, + store_biz_state, store_biz_opening_date, ringtone_is_enable, shop_parent_id, store_2nd_category_id, store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags, store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode, split_ratio, packing_fee, created_at, updated_at diff --git a/pom.xml b/pom.xml index 5bc7e062..01d2025e 100644 --- a/pom.xml +++ b/pom.xml @@ -308,6 +308,7 @@ https://114.132.210.208:2375 10.1.8.3:5000 /Users/panjunjie/code/docker_registry_ca_dev + false 114.132.210.208:8848 public @@ -366,6 +367,7 @@ https://114.132.210.208:2375 10.1.8.3:5000 /Users/panjunjie/code/docker_registry_ca_dev + false 114.132.210.208:8848 public @@ -418,6 +420,7 @@ https://114.132.210.208:2375 10.1.8.3:5000 /Users/panjunjie/code/docker_registry_ca_dev + false 10.1.8.3:8848 public @@ -470,6 +473,7 @@ https://159.75.249.163:2275 172.16.0.11:5000 /Users/panjunjie/code/docker_registry_ca_prod + true 172.16.0.11:8848 public @@ -556,6 +560,8 @@ ${docker.registry}/mall/${project.artifactId}:${project.version} + + ${docker.remove_old_image} From d2289f2d125f6f859fea92e98a6e014b3f12085b Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Fri, 7 Nov 2025 00:35:05 +0800 Subject: [PATCH 20/64] =?UTF-8?q?=E7=A0=8D=E4=BB=B7=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/store/ShopStoreActivityBase.java | 4 +- .../impl/ShopOrderInfoServiceImpl.java | 158 +++++++++--------- .../impl/ShopStoreBaseServiceImpl.java | 16 +- 3 files changed, 96 insertions(+), 82 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java index a68a8786..03baa06c 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java @@ -132,7 +132,7 @@ public class ShopStoreActivityBase implements Serializable { @ApiModelProperty(value = "在活动时间范围内,用户砍价允许的天数") private Integer cut_days; - @ApiModelProperty(value = "活动商品的总数量") - private Integer product_cont; + @ApiModelProperty(value = "参与活动商品的总数量") + private Integer product_count; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java index 5f2334bd..7b211ee7 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java @@ -852,84 +852,6 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl checkBookingOrderArgs(Integer storeId, Integer bookingState, String bookingBeginTimeStr, String bookingEndTimeStr) { - // 1. 必填参数检查 - if (CheckUtil.isEmpty(storeId) || CheckUtil.isEmpty(bookingState)) { - return Pair.of(false, "[预约单校验] 缺少必要参数"); - } - - // 2. 预约状态检查 - if (!CommonConstant.Order_Booking_State_YY.equals(bookingState)) { - return Pair.of(true, "[预约单校验] 非预订单,跳过验证"); - } - - // 3. 时间格式检查 - if (StrUtil.isBlank(bookingBeginTimeStr)) { - return Pair.of(false, "[预约单校验] 预约时间不能为空"); - } - - Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(bookingBeginTimeStr); - Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(bookingEndTimeStr); - if (bookingBeginTime == null) { - return Pair.of(false, "[预约单校验] 预约时间格式有误"); - } - - // 4. 时间逻辑检查 - 开始时间不能晚于结束时间 - if (bookingEndTime != null && bookingBeginTime.after(bookingEndTime)) { - return Pair.of(false, "[预约单校验] 开始时间不能晚于截止时间"); - } - - // 5. 店铺信息检查 - ShopStoreInfo shopStoreInfo = shopStoreInfoService.getShopStoreInfoByStoreId(storeId); - if (shopStoreInfo == null) { - return Pair.of(false, "[预约单校验] 店铺信息有误"); - } - - if (StrUtil.isBlank(shopStoreInfo.getStore_opening_hours()) || StrUtil.isBlank(shopStoreInfo.getStore_close_hours())) { - shopStoreInfo.setStore_opening_hours("09:00"); - shopStoreInfo.setStore_close_hours("06:00"); - logger.warn("[预约单校验] 店铺营业时间未设置,请联系商家,默认指定 {}-{}", shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours()); - } - - // 6. 店铺营业时间检查 - if (DateTimeUtils.isTimeInRange(shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours(), bookingBeginTime) != 0) { - String message = StrUtil.format("[预约单校验] 请在 {}-{} 店铺营业时间内预约下单", shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours()); - return Pair.of(false, message); - } - - // 7. 预约时间范围检查 - 仅能预约50分钟后的订单(防止用户在下单页面停留太长,45分钟也是可以通过的) - Date fortyFiveMinutesLater = DateUtil.offsetMinute(new Date(), CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER - 5); - if (bookingBeginTime.before(fortyFiveMinutesLater)) { - return Pair.of(false, String.format("[预约单校验] 请预约%d分后的订单", CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER)); - } - - return Pair.of(true, "[预约单校验] 成功"); - } - - /** - * 判断订单是否为预约订单 - * - * @param orderInfo 订单信息 - * @return 是否为预约订单 - */ - @Override - public Boolean isBookingOrder(ShopOrderInfo orderInfo) { - return orderInfo != null - && CommonConstant.Order_Booking_State_YY.equals(orderInfo.getBooking_state()) - && !CheckUtil.isEmpty(orderInfo.getBooking_at()) - && orderInfo.getBooking_at().longValue() >= System.currentTimeMillis() / 1000; - } - /** * 执行预约订单到点后向顺丰同城订单任务 * @@ -1008,6 +930,86 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl checkBookingOrderArgs(Integer storeId, Integer bookingState, String bookingBeginTimeStr, String bookingEndTimeStr) { + // 1. 必填参数检查 + if (CheckUtil.isEmpty(storeId) || CheckUtil.isEmpty(bookingState)) { + return Pair.of(false, "[预约单校验] 缺少必要参数"); + } + + // 2. 预约状态检查 + if (!CommonConstant.Order_Booking_State_YY.equals(bookingState)) { + return Pair.of(true, "[预约单校验] 非预订单,跳过验证"); + } + + // 3. 时间格式检查 + if (StrUtil.isBlank(bookingBeginTimeStr)) { + return Pair.of(false, "[预约单校验] 预约时间不能为空"); + } + + Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(bookingBeginTimeStr); + Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(bookingEndTimeStr); + if (bookingBeginTime == null) { + return Pair.of(false, "[预约单校验] 预约时间格式有误"); + } + + // 4. 时间逻辑检查 - 开始时间不能晚于结束时间 + if (bookingEndTime != null && bookingBeginTime.after(bookingEndTime)) { + return Pair.of(false, "[预约单校验] 开始时间不能晚于截止时间"); + } + + // 5. 店铺信息检查 + ShopStoreInfo shopStoreInfo = shopStoreInfoService.getShopStoreInfoByStoreId(storeId); + if (shopStoreInfo == null) { + return Pair.of(false, "[预约单校验] 店铺信息有误"); + } + + if (StrUtil.isBlank(shopStoreInfo.getStore_opening_hours()) || StrUtil.isBlank(shopStoreInfo.getStore_close_hours())) { + shopStoreInfo.setStore_opening_hours("00:00"); + shopStoreInfo.setStore_close_hours("23:59"); + logger.warn("[预约单校验] 店铺营业时间未设置,请联系商家,默认指定 {}-{}", shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours()); + return Pair.of(false, "[预约单校验] 店铺营业时间未设置,请联系商家"); + } + + // 6. 店铺营业时间检查 + if (DateTimeUtils.isTimeInRange(shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours(), bookingBeginTime) != 0) { + String message = StrUtil.format("[预约单校验] 请在 {}-{} 营业时间内预约下单", shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours()); + return Pair.of(false, message); + } + + // 7. 预约时间范围检查 - 仅能预约50分钟后的订单(防止用户在下单页面停留太长,45分钟也是可以通过的) + Date fortyFiveMinutesLater = DateUtil.offsetMinute(new Date(), CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER - 5); + if (bookingBeginTime.before(fortyFiveMinutesLater)) { + return Pair.of(false, String.format("[预约单校验] 请预约%d分钟后下单", CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER)); + } + + return Pair.of(true, "[预约单校验] 成功"); + } + + /** + * 判断订单是否为预约订单 + * + * @param orderInfo 订单信息 + * @return 是否为预约订单 + */ + @Override + public Boolean isBookingOrder(ShopOrderInfo orderInfo) { + return orderInfo != null + && CommonConstant.Order_Booking_State_YY.equals(orderInfo.getBooking_state()) + && !CheckUtil.isEmpty(orderInfo.getBooking_at()) + && orderInfo.getBooking_at().longValue() >= System.currentTimeMillis() / 1000; + } + + /** * 根据店铺的营业时间范围生成可预约下单的参数 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index 31b92843..cf07fc55 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -2370,9 +2370,15 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl= 1) { + if (storeBizState != null && storeBizState <= 3 && storeBizState >= 1) { base.setStore_biz_state(storeBizState); + + Date storeBizOpeningDate = Convert.toDate(getParameter("store_biz_opening_date")); + if (storeBizState == 3 && storeBizOpeningDate == null) { + return CommonResult.failed("店铺如果开业(活动)筹备中,请输入开业日期:yyyy-MM-dd"); + } } // 打包费 @@ -2535,9 +2541,15 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl= 1) { + if (storeBizState != null && storeBizState <= 3 && storeBizState >= 1) { base.setStore_biz_state(storeBizState); + + Date storeBizOpeningDate = Convert.toDate(getParameter("store_biz_opening_date")); + if (storeBizState == 3 && storeBizOpeningDate == null) { + return CommonResult.failed("店铺如果开业(活动)筹备中,请输入开业日期:yyyy-MM-dd"); + } } ShopStoreCompany company = null; From db33dd255e8d88d02a39e4cc8e1ff1724064eb02 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 7 Nov 2025 08:59:13 +0800 Subject: [PATCH 21/64] =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/modules/sync/ProductQuantityConsumption.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java index 97d9c6b6..08f5bc07 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/ProductQuantityConsumption.java @@ -48,7 +48,7 @@ public class ProductQuantityConsumption { @ApiModelProperty("店铺ID") private Integer storeId; - @TableField(value = "update_time",updateStrategy = FieldStrategy.NOT_EMPTY) + @TableField(value = "create_time",updateStrategy = FieldStrategy.NOT_EMPTY) @ApiModelProperty("创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; From 2661277bd2c14804b6c026a57a5b770e0b3b65c2 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Fri, 7 Nov 2025 12:42:01 +0800 Subject: [PATCH 22/64] =?UTF-8?q?=E7=A0=8D=E4=BB=B7=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/store/ShopStoreActivityBase.java | 6 +- .../mobile/UserActivityController.java | 4 +- .../impl/ShopActivityCutpriceServiceImpl.java | 119 ++++++++--- .../impl/ShopOrderInfoServiceImpl.java | 202 ++++++++++-------- .../ShopStoreActivityBaseController.java | 2 +- .../ShopStoreActivityBaseServiceImpl.java | 39 +++- 6 files changed, 235 insertions(+), 137 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java index 03baa06c..47838d78 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreActivityBase.java @@ -129,10 +129,10 @@ public class ShopStoreActivityBase implements Serializable { @TableField(updateStrategy = NOT_EMPTY) private String flow_no; - @ApiModelProperty(value = "在活动时间范围内,用户砍价允许的天数") - private Integer cut_days; + @ApiModelProperty(value = "在活动时间范围内,用户砍价有效期(小时)") + private Integer cut_hour; - @ApiModelProperty(value = "参与活动商品的总数量") + @ApiModelProperty(value = "参与活动商品的总数量(个)") private Integer product_count; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java index 5315b485..0b2255c0 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java @@ -118,8 +118,8 @@ public class UserActivityController extends BaseControllerImpl { return CommonResult.success(shopActivityCutpriceService.getCutPriceActivity()); } - @ApiOperation(value = "立即砍价", notes = "自己砍价、要求朋友过来也能砍价") - @RequestMapping(value = "/doCutPrice", method = RequestMethod.GET) + @ApiOperation(value = "立即砍价", notes = "自己砍价、邀请朋友过来也能砍价") + @RequestMapping(value = "/doCutPrice", method = {RequestMethod.GET, RequestMethod.POST}) public CommonResult doCutPrice(@RequestParam(name = "ac_id", defaultValue = "0") Integer ac_id) { UserDto user = getCurrentUser(); if (user == null || CheckUtil.isEmpty(user.getId())) { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java index 6c97c0f4..7f5faf68 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java @@ -260,37 +260,58 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("activity_id", activity_id).eq("user_id", user_id); ShopActivityCutprice cutprice_row = findOne(queryWrapper); + + // 如果用户未参与该砍价活动,则创建新的砍价记录 if (cutprice_row == null) { cutprice_row = new ShopActivityCutprice(); + + // 从活动规则中获取商品原价和砍价底价 JSONObject activity_rule = JSONUtil.parseObj(activityBase.getActivity_rule()); + if (activity_rule == null) { + throw new ApiException(I18nUtil._("活动规则数据异常!")); + } + BigDecimal item_unit_price = Convert.toBigDecimal(activity_rule.get("item_unit_price")); BigDecimal cut_down_min_limit_price = Convert.toBigDecimal(activity_rule.get("cut_down_min_limit_price")); + // 初始化砍价记录信息 cutprice_row.setActivity_id(activity_id); cutprice_row.setUser_id(user_id); cutprice_row.setAc_sale_price(item_unit_price); @@ -298,32 +319,29 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl historyQueryWrapper = new QueryWrapper<>(); historyQueryWrapper.eq("ac_id", ac_id).eq("user_id", participant_id); ShopActivityCutpriceHistory cutpriceHistory = cutpriceHistoryService.findOne(historyQueryWrapper); + // 设置用户砍价历史信息 activity_row.put("cut_row", cutpriceHistory); activity_row.put("is_cut", cutpriceHistory != null); + // 设置活动规则信息 activity_row.put("activity_rule", JSONUtil.parseObj(activity_row.get("activity_rule"))); -// // 砍价订单有效期时长 -// if (cutprice_row != null && cutprice_row.getAc_datetime() != null) { -// Float order_cutprice_time = accountBaseConfigService.getConfig("order_cutprice_time", 3f); -// int second = NumberUtil.mul(order_cutprice_time, 24, 60, 60).intValue(); -// long time = DateUtil.offsetSecond(cutprice_row.getAc_datetime(), +second).getTime(); -// activity_row.put("activity_endtime", Convert.toDate(time)); -// } - - // 界面做一个简单的底价验证: + // 判断是否可以立即购买 boolean canBuyNow = cutprice_row != null && CheckUtil.isNotEmpty(cutprice_row.getAc_sale_price()) && CheckUtil.isNotEmpty(cutprice_row.getAc_mix_limit_price()) @@ -331,7 +349,7 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl 0 && cut_num >= num) { throw new ApiException(I18nUtil._("今日帮砍次数已用完!")); } @@ -362,34 +396,54 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", user_id).eq("ac_id", ac_id); long ach_num = shopActivityCutpriceHistoryService.count(queryWrapper); - - if (CheckUtil.isNotEmpty(ach_num)) { - throw new ApiException(I18nUtil._("已经帮助好友进行砍价!")); + if (ach_num > 0) { + throw new ApiException(I18nUtil._("已经帮过好友砍了价!")); } + // 计算砍价金额 BigDecimal cut_price = shopStoreActivityBaseService.getCutDownPrice(storeActivityBase, cutprice_row); - if (CheckUtil.isEmpty(cut_price)) { + if (cut_price == null || cut_price.compareTo(BigDecimal.ZERO) <= 0) { throw new ApiException(I18nUtil._("砍价失败!")); } + // 获取商品ID String str_activity_rule = storeActivityBase.getActivity_rule(); - com.alibaba.fastjson.JSONObject activity_rule = com.alibaba.fastjson.JSONObject.parseObject(str_activity_rule); - Long item_id = activity_rule.getObject("item_id", Long.class); + if (StrUtil.isBlank(str_activity_rule)) { + throw new ApiException(I18nUtil._("活动规则数据异常!")); + } + JSONObject activity_rule = JSONUtil.parseObj(str_activity_rule); + Long item_id = activity_rule.get("item_id", Long.class); + if (item_id == null) { + throw new ApiException(I18nUtil._("未找到商品信息!")); + } + + // 创建砍价历史记录 ShopActivityCutpriceHistory ach_data = new ShopActivityCutpriceHistory(); ach_data.setActivity_id(activity_id); ach_data.setUser_id(user_id); @@ -398,17 +452,22 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl items = new ArrayList<>(); // 参数校验 - if (StrUtil.isNotBlank(dateStr) && StrUtil.isNotBlank(startTimeStr) && StrUtil.isNotBlank(endTimeStr)) { - try { - // 解析营业时间 - Date openTime = DateUtil.parse(dateStr + " " + startTimeStr + ":00", "yyyy-MM-dd HH:mm:ss"); - Date closeTime = DateUtil.parse(dateStr + " " + endTimeStr + ":00", "yyyy-MM-dd HH:mm:ss"); + if (StrUtil.isBlank(dateStr) || StrUtil.isBlank(startTimeStr) || StrUtil.isBlank(endTimeStr)) { + bookingArgDTO.setItems(items); + bookingArgList.add(bookingArgDTO); + continue; + } - // 验证营业时间有效性 - if (!openTime.after(closeTime)) { - // 在营业时间段内,且是今天,添加"立即送出"选项 - if (i == 0 && isTodayAvailable && inRangeVal == 0) { - BookingArgDTO.BookingArgItem immediateItem = new BookingArgDTO.BookingArgItem(); - immediateItem.setTime_title("立即送出"); - immediateItem.setBooking_at(0L); - immediateItem.setBooking_state(1); - immediateItem.setBooking_begin_time(""); - immediateItem.setBooking_end_time(""); - items.add(immediateItem); - } + try { + // 解析营业时间 + Date openTime = DateUtil.parse(dateStr + " " + startTimeStr + ":00", "yyyy-MM-dd HH:mm:ss"); + Date closeTime = DateUtil.parse(dateStr + " " + endTimeStr + ":00", "yyyy-MM-dd HH:mm:ss"); - // 确定时间槽开始时间 - Date startTime = openTime; - if (i == 0 && isTodayAvailable && inRangeVal <= 0) { - // 当前时间+50分钟作为时间槽的开始时间 - Date nowPlusFifty = DateUtil.offsetMinute(new Date(), CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER); - - // 确保开始时间在营业时间范围内 - if (nowPlusFifty.after(openTime)) { - if (nowPlusFifty.before(closeTime)) { - // 如果当前时间+50分钟在营业时间范围内,则从该时间开始 - startTime = nowPlusFifty; - logger.debug("[生成时间槽] 当前时间+50分钟在营业时间范围内,则从该时间开始"); - } else { - // 如果当前时间+50分钟已经超过营业结束时间,则不生成后续时间槽 - logger.debug("[生成时间槽] 当前时间+50分钟已超过营业结束时间,不生成后续时间槽"); - startTime = null; // 标记为不生成时间槽 - } - } - } - - // 生成时间槽 - if (startTime != null) { - Date currentTimeSlot = startTime; - int slotCount = 0; - final int MAX_SLOTS = 96; // 最多生成96个时间段,防止异常循环 - - while (currentTimeSlot.before(closeTime) && slotCount < MAX_SLOTS) { - Date endTimeSlot = DateUtil.offsetMinute(currentTimeSlot, 15); - - // 如果结束时间超过了营业结束时间,则使用营业结束时间 - if (endTimeSlot.after(closeTime)) { - endTimeSlot = closeTime; - } - - // 创建时间段项 - BookingArgDTO.BookingArgItem timeItem = new BookingArgDTO.BookingArgItem(); - String beginTimeStr = DateUtil.format(currentTimeSlot, "HH:mm"); - String endTimeStrItem = DateUtil.format(endTimeSlot, "HH:mm"); - - timeItem.setTime_title(beginTimeStr + "-" + endTimeStrItem); - - // 时间戳计算(秒) - long bookingAt = currentTimeSlot.getTime() / 1000; - timeItem.setBooking_at(bookingAt); - - timeItem.setBooking_state(2); - timeItem.setBooking_begin_time(DateUtil.format(currentTimeSlot, "yyyy-MM-dd HH:mm:ss")); - timeItem.setBooking_end_time(DateUtil.format(endTimeSlot, "yyyy-MM-dd HH:mm:ss")); - - items.add(timeItem); - - // 移动到下一个时间段 - currentTimeSlot = endTimeSlot; - slotCount++; - - // 防止时间相同导致的死循环 - if (currentTimeSlot.equals(startTime)) { - logger.warn("[生成时间槽] 检测到时间循环,跳出循环"); - break; - } - } - - if (slotCount >= MAX_SLOTS) { - logger.warn("[生成时间槽] 时间段数量超过最大限制,date: {}", dateStr); - } - } - } else { - logger.warn("[生成时间槽] 营业时间无效,openTime: {}, closeTime: {}", openTime, closeTime); - } - } catch (Exception e) { - logger.error("[生成时间槽] 生成时间槽异常,date: {}, openingHours: {}, closeHours: {}", dateStr, startTimeStr, endTimeStr, e); + // 验证营业时间有效性 + if (openTime.after(closeTime)) { + logger.warn("[生成时间槽] 营业时间无效,openTime: {}, closeTime: {}", openTime, closeTime); + bookingArgDTO.setItems(items); + bookingArgList.add(bookingArgDTO); + continue; } + + // 在营业时间段内,且是今天,添加"立即送出"选项 + if (i == 0 && isTodayAvailable && inRangeVal == 0) { + BookingArgDTO.BookingArgItem immediateItem = new BookingArgDTO.BookingArgItem(); + immediateItem.setTime_title("立即送出"); + immediateItem.setBooking_at(0L); + immediateItem.setBooking_state(1); + immediateItem.setBooking_begin_time(""); + immediateItem.setBooking_end_time(""); + items.add(immediateItem); + } + + // 确定时间槽开始时间 + Date startTime = openTime; + if (i == 0 && isTodayAvailable && inRangeVal <= 0) { + // 当前时间+50分钟作为时间槽的开始时间 + Date nowPlusFifty = DateUtil.offsetMinute(new Date(), CommonConstant.MIN_DELAY_MINUTES_FOR_BOOKING_ORDER); + + // 确保开始时间在营业时间范围内 + if (nowPlusFifty.after(openTime)) { + if (nowPlusFifty.before(closeTime)) { + // 如果当前时间+50分钟在营业时间范围内,则从该时间开始 + startTime = nowPlusFifty; + logger.debug("[生成时间槽] 当前时间+50分钟在营业时间范围内,则从该时间开始"); + } else { + // 如果当前时间+50分钟已经超过营业结束时间,则不生成后续时间槽 + logger.debug("[生成时间槽] 当前时间+50分钟已超过营业结束时间,不生成后续时间槽"); + startTime = null; // 标记为不生成时间槽 + } + } + } + + // 生成时间槽 + if (startTime != null) { + Date currentTimeSlot = startTime; + int slotCount = 0; + final int MAX_SLOTS = 96; // 最多生成96个时间段,防止异常循环 + + while (currentTimeSlot.before(closeTime) && slotCount < MAX_SLOTS) { + Date endTimeSlot = DateUtil.offsetMinute(currentTimeSlot, 15); + + // 如果结束时间超过了营业结束时间,则使用营业结束时间 + if (endTimeSlot.after(closeTime)) { + endTimeSlot = closeTime; + } + + // 创建时间段项 + BookingArgDTO.BookingArgItem timeItem = new BookingArgDTO.BookingArgItem(); + String beginTimeStr = DateUtil.format(currentTimeSlot, "HH:mm"); + String endTimeStrItem = DateUtil.format(endTimeSlot, "HH:mm"); + + timeItem.setTime_title(beginTimeStr + "-" + endTimeStrItem); + + // 时间戳计算(秒) + long bookingAt = currentTimeSlot.getTime() / 1000; + timeItem.setBooking_at(bookingAt); + + timeItem.setBooking_state(CommonConstant.Order_Booking_State_YY); + timeItem.setBooking_begin_time(DateUtil.format(currentTimeSlot, "yyyy-MM-dd HH:mm:ss")); + timeItem.setBooking_end_time(DateUtil.format(endTimeSlot, "yyyy-MM-dd HH:mm:ss")); + + items.add(timeItem); + + // 移动到下一个时间段 + currentTimeSlot = endTimeSlot; + slotCount++; + + // 防止时间相同导致的死循环 + if (currentTimeSlot.equals(startTime)) { + logger.warn("[生成时间槽] 检测到时间循环,跳出循环"); + break; + } + } + + if (slotCount >= MAX_SLOTS) { + logger.warn("[生成时间槽] 时间段数量超过最大限制,date: {}", dateStr); + } + } + } catch (Exception e) { + logger.error("[生成时间槽] 生成时间槽异常,date: {}, openingHours: {}, closeHours: {}", dateStr, startTimeStr, endTimeStr, e); } bookingArgDTO.setItems(items); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreActivityBaseController.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreActivityBaseController.java index e34cf7f9..9dadbde4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreActivityBaseController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/controller/admin/ShopStoreActivityBaseController.java @@ -65,7 +65,7 @@ public class ShopStoreActivityBaseController { return CommonResult.success(shopStoreActivityBaseService.listBarginItem()); } - @ApiOperation(value = "活动表-编辑", notes = "活动表-编辑") + @ApiOperation(value = "活动表-新增", notes = "活动表-新增") @RequestMapping(value = "/edit", method = RequestMethod.POST) public CommonResult edit() { return shopStoreActivityBaseService.saveActivityBase(); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java index c4746cc6..967dd236 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreActivityBaseServiceImpl.java @@ -3653,7 +3653,7 @@ public class ShopStoreActivityBaseServiceImpl extends BaseServiceImpl 0) { + activity_rule.put("cut_hour", cut_hour); + } + // product_count - 参与活动商品总数(个) + Integer product_count = getParameter("product_count", 0); + if (product_count > 0) { + activity_rule.put("product_count", product_count); + } + shopStoreActivityBase.setActivity_rule(Convert.toStr(activity_rule)); } else if (base.getActivity_type_id().equals(StateCode.ACTIVITY_TYPE_GIFTBAG)) { //a+b组合套餐 @@ -5315,6 +5328,7 @@ public class ShopStoreActivityBaseServiceImpl extends BaseServiceImpl Date: Fri, 7 Nov 2025 14:36:06 +0800 Subject: [PATCH 23/64] =?UTF-8?q?=E9=80=80=E5=8D=95=E9=92=88=E5=AF=B9?= =?UTF-8?q?=E5=95=86=E5=93=81=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/order/service/impl/ShopOrderReturnServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 83468784..830ef748 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -1501,8 +1501,9 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl Date: Fri, 7 Nov 2025 16:10:03 +0800 Subject: [PATCH 24/64] =?UTF-8?q?=E9=87=8D=E6=9E=84shop=5Fstore=5Factivity?= =?UTF-8?q?=5Fbase=E8=A1=A8=EF=BC=8C=E8=A7=A3=E5=86=B3=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=8D=E5=85=BC=E5=AE=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/shop/dev/20251107_dml.sql | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 sql/shop/dev/20251107_dml.sql diff --git a/sql/shop/dev/20251107_dml.sql b/sql/shop/dev/20251107_dml.sql new file mode 100644 index 00000000..9d8ec73a --- /dev/null +++ b/sql/shop/dev/20251107_dml.sql @@ -0,0 +1,34 @@ +CREATE TABLE `shop_store_activity_base_1` ( + `activity_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '活动编号', + `store_id` int unsigned NOT NULL DEFAULT '0' COMMENT '店铺编号', + `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '用户编号', + `activity_name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '活动名称', + `activity_title` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '活动标题', + `activity_remark` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '活动说明', + `activity_combo_id` int unsigned NOT NULL DEFAULT '0' COMMENT '套餐编号', + `activity_type_id` int unsigned NOT NULL DEFAULT '0' COMMENT '活动类型', + `activity_starttime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动开始时间', + `activity_endtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动结束时间', + `activity_state` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '活动状态(ENUM):0-未开启;1-正常;2-已结束;3-管理员关闭;4-商家关闭', + `activity_rule` longtext CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '活动规则(json):不检索{rule_id:{}, rule_id:{}},统一解析规则{"requirement":{"buy":{"item":[1,2,3],"subtotal":"通过计算修正满足的条件"}},"rule":[{"total":100,"max_num":1,"item":{"1":1,"1200":3}},{"total":200,"max_num":1,"item":{"1":1,"1200":3}}]}', + `activity_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '参与类型(ENUM):1-免费参与;2-积分参与;3-购买参与;4-分享参与', + `activity_order` tinyint unsigned NOT NULL DEFAULT '50' COMMENT '排序', + `activity_is_finish` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '活动是否完成(ENUM):0-未完成;1-已完成;2-已解散(目前用于团购)', + `item_id` varchar(1024) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '单品优惠商品编号DOT', + `subsite_id` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '0' COMMENT '分站ID', + `version` int unsigned NOT NULL DEFAULT '0' COMMENT '版本', + `activity_on_is_off` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '活动是否线上或线下:0:线上,1:线下', + `activity_share_num` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '活动分享次数', + `activity_use_level` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '活动使用等级(DOT)', + `activity_releasetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间', + `flow_no` varchar(255) DEFAULT NULL COMMENT '思迅活动id', + `cut_hour` int DEFAULT '72' COMMENT '在活动时间范围内,用户砍价允许的天数', + `product_count` int DEFAULT '5' COMMENT '参加活动商品的总数量', + PRIMARY KEY (`activity_id`) USING BTREE, + KEY `store_id` (`store_id`,`activity_state`) USING BTREE, + KEY `activity_type_id` (`activity_type_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2390 DEFAULT CHARSET=utf8mb3 COMMENT='活动表-通过插件实现\r\n当为拼团是activity_rule中的group_remain_quantity用于标识拼团剩余需要人数,如果用户登录了,需要查询出activity_groupbooking中参与该团的剩余情况'; +insert into shop_store_activity_base_1 select * from shop_store_activity_base; +drop table shop_store_activity_base; +CREATE table shop_store_activity_base as select * from shop_store_activity_base_1; +drop table shop_store_activity_base_1; \ No newline at end of file From cfb8714410f9d0dc4025fca3c8650fd9440f5db2 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 7 Nov 2025 16:45:33 +0800 Subject: [PATCH 25/64] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=8C=E6=A3=80=E6=9F=A5=E4=B8=8B=E8=BD=BD=E5=8C=85=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncAppServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncAppServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncAppServiceImpl.java index 8e7e657a..b57987aa 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncAppServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncAppServiceImpl.java @@ -250,11 +250,12 @@ public class SyncAppServiceImpl extends BaseServiceImpl public boolean checkPrimaryKey(String primaryKey) { try { primaryKey=CryptoUtils.dealBlankStr(primaryKey); + log.info("primaryKey:{}",primaryKey); Map map=CryptoUtils.decryptAndUnpack(primaryKey); String appKey=map.get("appKey"); String sign=map.get("sign"); String storeId=map.get("storeId"); - log.info("店铺:{}校验",storeId); + log.info("店铺:{}校验;appKey{};sign{}",storeId,appKey,sign); QueryWrapper queryWrapper = new QueryWrapper<>(); SyncApp syncApp= getOne(queryWrapper.select("store_id","app_secret","app_key"). eq("store_id", storeId). @@ -263,6 +264,7 @@ public class SyncAppServiceImpl extends BaseServiceImpl return false; } } catch (Exception e) { + log.info("解析异常:{}",e.getMessage()); return false; } return true; From 415bbfd4ba5a96d92905d6e32a45b84405e764e1 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Fri, 7 Nov 2025 16:57:46 +0800 Subject: [PATCH 26/64] =?UTF-8?q?=E7=A0=8D=E4=BB=B7=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=E8=A1=A5=E5=85=85=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/constant/CommonConstant.java | 7 +++ .../activity/ShopActivityCutprice.java | 3 ++ .../mobile/UserActivityController.java | 2 +- .../service/ShopActivityCutpriceService.java | 11 +++++ .../impl/ShopActivityCutpriceServiceImpl.java | 48 ++++++++++++++++--- .../service/ShopStoreActivityBaseService.java | 16 +++++-- .../ShopStoreActivityBaseServiceImpl.java | 34 +++++++++++-- 7 files changed, 106 insertions(+), 15 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java index ee2e5dfa..d5f40048 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java @@ -136,4 +136,11 @@ public class CommonConstant { public final static Integer Store_Biz_State_Closed = 2; //3-开业(活动)筹备中; public final static Integer Store_Biz_State_PreActivity = 3; + + //用户砍价订单状态:1-砍价已完成下单;2-砍价未下单已取消;3-砍价助力进行中;4-砍价过期失效;6-砍价助力已完成待下单; + public static final Integer CutPrice_Order_State_Finished = 1; + public static final Integer CutPrice_Order_State_Canceled = 2; + public static final Integer CutPrice_Order_State_ING = 3; + public static final Integer CutPrice_Order_State_Expired = 4; + public static final Integer CutPrice_Order_State_CutFinished = 6; } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java index 11e4a8e7..a385fb36 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java @@ -59,6 +59,9 @@ public class ShopActivityCutprice implements Serializable { @ApiModelProperty(value = "砍价过期时间戳") private Long expired_at; + @ApiModelProperty(value = "用户砍价订单状态:1-砍价已完成下单;2-砍价未下单已取消;3-砍价助力进行中;4-砍价过期失效;6-砍价助力已完成待下单;") + private Integer state; + @Version @ApiModelProperty(value = "乐观锁") private Integer version; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java index 0b2255c0..b58226a1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/controller/mobile/UserActivityController.java @@ -112,7 +112,7 @@ public class UserActivityController extends BaseControllerImpl { return CommonResult.success(shopActivityCutpriceHistoryService.listsUserCutPriceHistory(page, rows, is_sponsor)); } - @ApiOperation(value = "砍价活动详情", notes = "砍价活动详情") + @ApiOperation(value = "砍价活动详情", notes = "砍价活动详情(注:除了获取活动详情信息,还创建砍价订单记录和查询砍价历史历史)") @RequestMapping(value = "/getCutPriceActivity", method = RequestMethod.GET) public CommonResult getCutPriceActivityDetail() { return CommonResult.success(shopActivityCutpriceService.getCutPriceActivity()); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java index fc346813..9f3b2260 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java @@ -3,6 +3,7 @@ package com.suisung.mall.shop.activity.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.modules.activity.ShopActivityCutprice; +import com.suisung.mall.common.modules.store.ShopStoreActivityBase; import com.suisung.mall.core.web.service.IBaseService; import org.springframework.data.util.Pair; @@ -38,4 +39,14 @@ public interface ShopActivityCutpriceService extends IBaseService canDoOrderCutPriceActivity(Integer ac_id, Integer order_user_id); + + /** + * 检查砍价活动是否过期和库存是否足够 + * + * @param shopStoreActivityBase 砍价活动基础信息 + * @return Pair 检查结果,Boolean表示是否通过检查,String表示错误信息 + */ + Pair checkCutPriceExpiredAndStock(ShopStoreActivityBase shopStoreActivityBase); + + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java index 7f5faf68..50e8cbb1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java @@ -260,7 +260,7 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl 0) { participant_id = user.getId(); } @@ -298,8 +298,12 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl historyQueryWrapper = new QueryWrapper<>(); historyQueryWrapper.eq("ac_id", ac_id).eq("user_id", participant_id); @@ -336,7 +351,10 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl 检查结果,Boolean表示是否通过检查,String表示错误信息 + */ + @Override + public Pair checkCutPriceExpiredAndStock(ShopStoreActivityBase shopStoreActivityBase) { + + boolean isActivityTimeValid = shopStoreActivityBaseService.isActivityTimeValid(shopStoreActivityBase.getActivity_starttime(), shopStoreActivityBase.getActivity_endtime(), new Date()); + if (!isActivityTimeValid) { + return Pair.of(false, I18nUtil._("该活动已过期,下次早点来。")); + } + + + return null; + } + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreActivityBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreActivityBaseService.java index 82329b93..c457c7fe 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreActivityBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreActivityBaseService.java @@ -63,11 +63,21 @@ public interface ShopStoreActivityBaseService extends IBaseService Date: Fri, 7 Nov 2025 17:21:01 +0800 Subject: [PATCH 27/64] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=AF=86=E9=92=A5=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/suisung/mall/shop/sync/Utils/CryptoUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/Utils/CryptoUtils.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/Utils/CryptoUtils.java index 49170209..ab3de962 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/Utils/CryptoUtils.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/Utils/CryptoUtils.java @@ -93,6 +93,7 @@ public class CryptoUtils { } public static String dealBlankStr(String original) throws UnsupportedEncodingException { + original = original.replaceAll("%3D", "="); return original.replaceAll(" ", "+"); } From 2e7612ac93b74e55ca944cc1dbcb3b4c5e8595d6 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 7 Nov 2025 17:42:04 +0800 Subject: [PATCH 28/64] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=95=86=E5=93=81?= =?UTF-8?q?=E4=B8=8D=E5=AD=98=E5=9C=A8=E6=97=B6=E7=9A=84=E6=89=A3=E5=87=8F?= =?UTF-8?q?=E5=87=BA=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ShopOrderBaseServiceImpl.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index 8c4f0576..5819ad5b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -5321,16 +5321,15 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl 0 ? quantity_frozen : 0); - - if (!shopProductItemService.edit(shopProductItem)) { - throw new ApiException(I18nUtil._("修改商品冻结库存失败!")); + if (shopProductItem != null) { + logger.info("无法获取订单中的商品,请检查!");//商品存在才执行库存扣减 + // throw new ApiException(I18nUtil._("无法获取订单中的商品,请检查!")); + Integer item_quantity_frozen = shopProductItem.getItem_quantity_frozen(); + int quantity_frozen = item_quantity_frozen - order_item_quantity; + shopProductItem.setItem_quantity_frozen(quantity_frozen > 0 ? quantity_frozen : 0); + if (!shopProductItemService.edit(shopProductItem)) { + throw new ApiException(I18nUtil._("修改商品冻结库存失败!")); + } } } From 19756ee7e3c8282e53e20016d6ce7bb86780ac55 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sat, 8 Nov 2025 00:46:34 +0800 Subject: [PATCH 29/64] =?UTF-8?q?=E7=A0=8D=E4=BB=B7=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/constant/CommonConstant.java | 6 +- .../activity/ShopActivityCutprice.java | 3 + .../service/ShopActivityCutpriceService.java | 8 + .../impl/ShopActivityCutpriceServiceImpl.java | 183 +++++++++++++----- 4 files changed, 154 insertions(+), 46 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java index d5f40048..58e7f635 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java @@ -137,10 +137,14 @@ public class CommonConstant { //3-开业(活动)筹备中; public final static Integer Store_Biz_State_PreActivity = 3; - //用户砍价订单状态:1-砍价已完成下单;2-砍价未下单已取消;3-砍价助力进行中;4-砍价过期失效;6-砍价助力已完成待下单; + //用户砍价订单状态:1-砍价已完成下单; public static final Integer CutPrice_Order_State_Finished = 1; + //2-砍价未下单已取消; public static final Integer CutPrice_Order_State_Canceled = 2; + //3-砍价助力进行中; public static final Integer CutPrice_Order_State_ING = 3; + //4-砍价过期失效; public static final Integer CutPrice_Order_State_Expired = 4; + //6-砍价助力已完成待下单; public static final Integer CutPrice_Order_State_CutFinished = 6; } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java index a385fb36..4c349501 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java @@ -66,4 +66,7 @@ public class ShopActivityCutprice implements Serializable { @ApiModelProperty(value = "乐观锁") private Integer version; + @ApiModelProperty(value = "更新时间") + private Date updated_at; + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java index 9f3b2260..8956404d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java @@ -49,4 +49,12 @@ public interface ShopActivityCutpriceService extends IBaseService checkCutPriceExpiredAndStock(ShopStoreActivityBase shopStoreActivityBase); + /** + * 修改某个砍价订单状态 + * + * @param ac_id 活动自增Id + * @param state 状态 + * @return + */ + Boolean updateCutPriceState(Integer ac_id, Integer state); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java index 50e8cbb1..70fed059 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java @@ -10,6 +10,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.StateCode; @@ -259,6 +260,7 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl check_result = checkCutPriceExpiredAndStock(activityBase); + if (!check_result.getFirst()) { + throw new ApiException(check_result.getSecond()); + } cutprice_row = new ShopActivityCutprice(); @@ -378,87 +384,114 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl 0 && cut_num >= num) { - throw new ApiException(I18nUtil._("今日帮砍次数已用完!")); + return CommonResult.failed(I18nUtil._("今日帮砍次数已用完!")); } } - BigDecimal ac_sale_price = cutprice_row.getAc_sale_price(); - BigDecimal ac_mix_limit_price = cutprice_row.getAc_mix_limit_price(); + BigDecimal ac_sale_price = shopActivityCutprice.getAc_sale_price(); + BigDecimal ac_mix_limit_price = shopActivityCutprice.getAc_mix_limit_price(); + + // 检查价格数据是否完整 + if (ac_sale_price == null || ac_mix_limit_price == null) { + return CommonResult.failed(I18nUtil._("价格数据异常!")); + } // 检查是否已达到最低价 - if (ac_sale_price == null || ac_mix_limit_price == null) { - throw new ApiException(I18nUtil._("价格数据异常!")); + if (NumberUtil.isLessOrEqual(ac_sale_price, ac_mix_limit_price)) { + return CommonResult.failed(I18nUtil._("已达到最低价!")); } - if (ObjectUtil.compare(ac_sale_price, ac_mix_limit_price) <= 0) { - throw new ApiException(I18nUtil._("已达到最低价!")); - } - Integer activity_id = cutprice_row.getActivity_id(); - ShopStoreActivityBase storeActivityBase = shopStoreActivityBaseService.get(activity_id); - if (storeActivityBase == null) { - throw new ApiException(I18nUtil._("未找到活动信息!")); - } - - // 检查活动是否有效 - if (!shopStoreActivityBaseService.isActivityTimeValid(Convert.toMap(String.class, Object.class, storeActivityBase))) { - throw new ApiException(I18nUtil._("该活动不存在或已过期!")); - } - - // 检查是否已经帮过好友砍了价? + // 检查是否已经帮过好友砍了价 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", user_id).eq("ac_id", ac_id); long ach_num = shopActivityCutpriceHistoryService.count(queryWrapper); if (ach_num > 0) { - throw new ApiException(I18nUtil._("已经帮过好友砍了价!")); + return CommonResult.failed(I18nUtil._("已经帮好友砍过价!")); } // 计算砍价金额 - BigDecimal cut_price = shopStoreActivityBaseService.getCutDownPrice(storeActivityBase, cutprice_row); + BigDecimal cut_price = shopStoreActivityBaseService.getCutDownPrice(shopStoreActivityBase, shopActivityCutprice); if (cut_price == null || cut_price.compareTo(BigDecimal.ZERO) <= 0) { - throw new ApiException(I18nUtil._("砍价失败!")); + return CommonResult.failed(I18nUtil._("砍价失败!")); } // 获取商品ID - String str_activity_rule = storeActivityBase.getActivity_rule(); + String str_activity_rule = shopStoreActivityBase.getActivity_rule(); if (StrUtil.isBlank(str_activity_rule)) { - throw new ApiException(I18nUtil._("活动规则数据异常!")); + return CommonResult.failed(I18nUtil._("活动规则数据异常!")); } JSONObject activity_rule = JSONUtil.parseObj(str_activity_rule); Long item_id = activity_rule.get("item_id", Long.class); if (item_id == null) { - throw new ApiException(I18nUtil._("未找到商品信息!")); + return CommonResult.failed(I18nUtil._("未找到商品信息!")); } // 创建砍价历史记录 @@ -476,14 +509,14 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl checkCutPriceExpiredAndStock(ShopStoreActivityBase shopStoreActivityBase) { - - boolean isActivityTimeValid = shopStoreActivityBaseService.isActivityTimeValid(shopStoreActivityBase.getActivity_starttime(), shopStoreActivityBase.getActivity_endtime(), new Date()); - if (!isActivityTimeValid) { - return Pair.of(false, I18nUtil._("该活动已过期,下次早点来。")); + // 参数校验 + if (shopStoreActivityBase == null) { + return Pair.of(false, I18nUtil._("活动信息不能为空")); } + // 检查活动是否过期 + boolean isActivityTimeValid = shopStoreActivityBaseService.isActivityTimeValid( + shopStoreActivityBase.getActivity_starttime(), + shopStoreActivityBase.getActivity_endtime(), + new Date() + ); + if (!isActivityTimeValid) { + return Pair.of(false, I18nUtil._("该活动已过期,下次早点来!")); + } - return null; + // 检查活动商品库存 + Integer productCount = shopStoreActivityBase.getProduct_count(); + if (CheckUtil.isEmpty(productCount) || productCount <= 0) { + return Pair.of(false, I18nUtil._("活动商品库存不足,请稍后再来。")); + } + + // 查询已占用库存的砍价订单数量 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("activity_id", shopStoreActivityBase.getActivity_id()) + .in("state", Arrays.asList( + CommonConstant.CutPrice_Order_State_Finished, + CommonConstant.CutPrice_Order_State_CutFinished, + CommonConstant.CutPrice_Order_State_ING + )); + long recordCount = count(queryWrapper); + + // 判断库存是否充足(当已占用库存大于等于总库存时,表示库存不足) + if (recordCount >= productCount) { + return Pair.of(false, I18nUtil._("活动商品库存不足,请稍后再来。")); + } + + // 所有检查通过 + return Pair.of(true, ""); + } + + + /** + * 修改某个砍价订单状态 + * + * @param ac_id 活动自增Id + * @param state 状态 + * @return + */ + @Override + public Boolean updateCutPriceState(Integer ac_id, Integer state) { + // 参数校验 + if (ac_id == null || ac_id <= 0) { + return false; + } + if (state == null) { + return false; + } + + try { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("ac_id", ac_id); + updateWrapper.set("state", state); + return update(updateWrapper); + } catch (Exception e) { + log.error("更新砍价订单状态失败,ac_id={}, state={}", ac_id, state, e); + throw new ApiException(I18nUtil._("更新砍价订单状态失败")); + } } From 44794636f7e81d1d537e10f233c7008a376956b0 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 8 Nov 2025 10:00:48 +0800 Subject: [PATCH 30/64] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E4=BF=AE=E6=94=B9=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java index 7f22cb9e..d9333522 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java @@ -844,8 +844,8 @@ public abstract class SyncBaseThirdSxAbstract{ shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF);//默认是下架 shopProductBase.setUnit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price"))); if(!checkProductContainUnits(productName)){ - String spectItem=StringUtils.isNotEmpty(shopProductBase.getSpecItem())?shopProductBase.getSpecItem():""; - String unit=StringUtils.isNotEmpty(shopProductBase.getSpecUnit())?shopProductBase.getSpecUnit():""; + String spectItem=StringUtils.isNotEmpty(shopProductBase.getSpecItem())?shopProductBase.getSpecItem():"";//规格 + String unit=StringUtils.isNotEmpty(shopProductBase.getSpecUnit())?shopProductBase.getSpecUnit():"";//规格单位 if(StringUtils.isNotEmpty(spectItem)||StringUtils.isNotEmpty(unit)){ productName=productName+spectItem+"/"+unit; } From d1ef71669eb5aa64a88666728af348fdf2173117 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 8 Nov 2025 10:11:17 +0800 Subject: [PATCH 31/64] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/Schedule/DynamicTaskScheduler.java | 35 +++++++-- .../java/com/small/client/dao/SxDataDao.java | 77 +++++++++++++------ .../java/com/small/client/dto/ItemInfo.java | 5 ++ .../small/client/service/SxDataService.java | 10 ++- .../client/service/imp/SxDataServiceImp.java | 46 +++++++---- 5 files changed, 129 insertions(+), 44 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index 941406c0..40ef8277 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -96,13 +96,25 @@ public class DynamicTaskScheduler { commentModel =sxDataService.getCommentModel(); } DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); - if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + if(dataBaseInfo==null||StringUtils.isEmpty(dataBaseInfo.getUserName())){ + return; + } + String refreshTime=""; + if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ + refreshTime=DateUtil.formatDateTime(dataBaseInfo.getRefreshTime()); + commentModel.setSyncTime(refreshTime); } - sxDataService.syncStoreData(dataBaseInfo,commentModel); - sxDataService.SyncBranchList(dataBaseInfo,commentModel); - sxDataService.SyncCategory(dataBaseInfo,commentModel); + if(StringUtils.isNotEmpty(refreshTime)){//有刷新时间,证明不是全量,需要判断是否有新商品,有新商品才同步品牌和分类 + if(sxDataService.isNewShop(dataBaseInfo,refreshTime)){ + sxDataService.SyncBranchList(dataBaseInfo,commentModel); + sxDataService.SyncCategory(dataBaseInfo,commentModel); + } + }else { + log.info("首次同步,无刷新时间"); + sxDataService.SyncBranchList(dataBaseInfo,commentModel); + sxDataService.SyncCategory(dataBaseInfo,commentModel); + } sxDataService.SyncGoods(dataBaseInfo,commentModel);//todo 暂时同步全部的商品如果后期修改,需要增加服务器的字段 try { if(ObjectUtil.isNotEmpty(dataBaseInfo.getShopGapTime())){ @@ -114,9 +126,18 @@ public class DynamicTaskScheduler { } catch (InterruptedException e) { throw new RuntimeException(e); } + if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ + commentModel.setSyncTime(refreshTime); + } sxDataService.SyncVipList(dataBaseInfo,commentModel); - sxDataService.syncAtive(dataBaseInfo,commentModel); - sxDataService.syncAtiveShops(dataBaseInfo,commentModel); + boolean isNewActives=sxDataService.syncAtive(dataBaseInfo,commentModel); + if(isNewActives){ + log.info("---有新增的活动,同步活动商品开始--"); + sxDataService.syncAtiveShops(dataBaseInfo,commentModel); + }else { + log.info("---无新增的活动,无需同步活动商品--"); + } + isRuning=false; } diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 2eab7769..6d004280 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -515,20 +515,22 @@ public class SxDataDao extends BaseDao{ int count = 0; Set sme=map.entrySet(); for (Map.Entry entry : sme) { - + String key=entry.getKey().toString(); + String[] splitKey = key.split("-"); + if(splitKey.length!=2){ + continue; + } + String itemNo = splitKey[1]; BigDecimal stock_qty= (BigDecimal) entry.getValue(); + if(stock_qty.compareTo(BigDecimal.ZERO)==0){ continue; } - String itemNo = (String) entry.getKey(); - ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(itemNo); - BigDecimal unitPrice = productQuantityConsumptionDto.getUnitPrice(); - RmSaleflow rmSaleflow=new RmSaleflow(); - rmSaleflow.setItemNo(itemNo); - rmSaleflow.setSalePrice(unitPrice); - rmSaleflow.setSaleQnty(stock_qty); - rmSaleflow.setSourcePrice(unitPrice); - rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号 + ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(key); + if(productQuantityConsumptionDto.getSaleAmount().compareTo(BigDecimal.ZERO)==0){ + continue; + } + RmSaleflow rmSaleflow = getRmSaleflow(productQuantityConsumptionDto, itemNo, stock_qty); rmSaleflow= fixRmSaleFlow(rmSaleflow,brachNo,itemInfoMap,dataBaseInfo.getSaleAccount()); TRmPayflow trmPayflow=fixTRmPayflow(rmSaleflow); @@ -587,6 +589,25 @@ public class SxDataDao extends BaseDao{ } } + /** + * 封装对象 + * @param productQuantityConsumptionDto + * @param itemNo + * @param stock_qty + * @return + */ + private RmSaleflow getRmSaleflow(ProductQuantityConsumptionDto productQuantityConsumptionDto, String itemNo, BigDecimal stock_qty) { + BigDecimal unitPrice = productQuantityConsumptionDto.getUnitPrice(); + RmSaleflow rmSaleflow=new RmSaleflow(); + rmSaleflow.setItemNo(itemNo); + rmSaleflow.setSalePrice(unitPrice); + rmSaleflow.setSaleQnty(stock_qty); + rmSaleflow.setSaleMoney(productQuantityConsumptionDto.getSaleAmount()); + // rmSaleflow.setSourcePrice(unitPrice); + rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号 + return rmSaleflow; + } + /** * 补充字段 * @param rmSaleflow @@ -597,7 +618,8 @@ public class SxDataDao extends BaseDao{ rmSaleflow.setFlowId(1); String orderId=rmSaleflow.getFlownoRand(); String[] orderIdSplits= orderId.split("_"); - String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd"); + //String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd"); + String DateStr=orderIdSplits[1]; String number= String.format("%04d", Integer.valueOf(orderIdSplits[orderIdSplits.length-1])); String flowNo="99"+DateStr+number; rmSaleflow.setFlowNo(flowNo);//订单号 todo @@ -612,17 +634,18 @@ public class SxDataDao extends BaseDao{ rmSaleflow.setSaleQnty(saleQnty); rmSaleflow.setRetQnty(BigDecimal.ZERO); } - BigDecimal saleMoney=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()); - if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ - saleMoney=saleMoney.multiply(new BigDecimal("-1")); - } - rmSaleflow.setSaleMoney(saleMoney); +// BigDecimal saleMoney=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()); +// if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ +// saleMoney=saleMoney.multiply(new BigDecimal("-1")); +// } +// rmSaleflow.setSaleMoney(saleMoney); //判断取值 end //数据库查询取值start todo ItemInfo itemInfo=itemInfoMap.get(rmSaleflow.getItemNo()); if(itemInfo!=null){ rmSaleflow.setInPrice(itemInfo.getPrice()); + rmSaleflow.setSourcePrice(itemInfo.getSalePrice()); rmSaleflow.setOperDate(new Timestamp(System.currentTimeMillis())); } rmSaleflow.setBranchNo(branchNo); @@ -654,11 +677,12 @@ public class SxDataDao extends BaseDao{ TRmPayflow rmPayflow=new TRmPayflow(); rmPayflow.setFlowId(rmSaleflow.getFlowId()); rmPayflow.setFlowNo(rmSaleflow.getFlowNo()); - BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP); - if(saleAmount.compareTo(BigDecimal.ZERO)<0){ - saleAmount=saleAmount.multiply(new BigDecimal("-1")); - } - rmPayflow.setSaleAmount(saleAmount); +// BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP); +// if(saleAmount.compareTo(BigDecimal.ZERO)<0){ +// saleAmount=saleAmount.multiply(new BigDecimal("-1")); +// } +// rmPayflow.setSaleAmount(saleAmount); + rmPayflow.setSaleAmount(rmSaleflow.getSaleMoney()); rmPayflow.setBranchNo(rmSaleflow.getBranchNo()); rmPayflow.setPayWay("RMB");//人民币 rmPayflow.setSellWay(rmSaleflow.getSellWay()); @@ -666,7 +690,7 @@ public class SxDataDao extends BaseDao{ rmPayflow.setVipNo(null); rmPayflow.setCoinNo("RMB");// rmPayflow.setCoinRate(new BigDecimal("1"));//利率 - rmPayflow.setPayAmount(saleAmount); + rmPayflow.setPayAmount(rmSaleflow.getSaleMoney()); rmPayflow.setOperDate(new Timestamp(System.currentTimeMillis())); rmPayflow.setOperId(rmSaleflow.getOperId()); rmPayflow.setCounterNo(rmSaleflow.getCounterNo()); @@ -712,7 +736,11 @@ public class SxDataDao extends BaseDao{ Set sme=map.entrySet(); String where = "where 1=1 and "; List itemNos = sme.stream() - .map(entry -> (String) entry.getKey()) + .map(entry -> { + String key= (String) entry.getKey(); + String[] split = key.split("-"); + return split[1]; + }) .collect(Collectors.toList()); where += SqlBuilder.buildInCondition("item_no", itemNos); ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(), @@ -738,6 +766,9 @@ public class SxDataDao extends BaseDao{ if(StringUtils.isNotEmpty(rs.getString("item_clsno"))){ itemInfo.setItemClsno(rs.getString("item_clsno").trim()); } + if(StringUtils.isNotEmpty(rs.getString("sale_price"))){ + itemInfo.setSalePrice(rs.getBigDecimal("sale_price")); + } resultMap.put(itemNo,itemInfo); } } catch (SQLException e) { diff --git a/client/src/main/java/com/small/client/dto/ItemInfo.java b/client/src/main/java/com/small/client/dto/ItemInfo.java index c422e7ec..22c10a59 100644 --- a/client/src/main/java/com/small/client/dto/ItemInfo.java +++ b/client/src/main/java/com/small/client/dto/ItemInfo.java @@ -42,4 +42,9 @@ public class ItemInfo { * 进货价格 */ private BigDecimal price; + + /** + * 零售价 + */ + private BigDecimal salePrice; } diff --git a/client/src/main/java/com/small/client/service/SxDataService.java b/client/src/main/java/com/small/client/service/SxDataService.java index 39b2e623..adc2ee3d 100644 --- a/client/src/main/java/com/small/client/service/SxDataService.java +++ b/client/src/main/java/com/small/client/service/SxDataService.java @@ -63,7 +63,7 @@ public interface SxDataService { * @param commentModel * @return */ - void syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel); + boolean syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel); /** * 同步活动商品 @@ -73,4 +73,12 @@ public interface SxDataService { void syncAtiveShops(DataBaseInfo dataBaseInfo,CommentModel commentModel); String getCategoryChildren(DataBaseInfo dataBaseInfo,String parentId); + + /** + * 校验是否有新的入库 + * @param dataBaseInfo + * @param refreshTime + * @return + */ + boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime); } diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 5189b4f9..9490b2b0 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -134,10 +134,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService break; case "02"://增量 todo test String sycnTime=commentModel.getSyncTime(); - syncIncrementAddGoods(dataBaseInfo, commentModel); + syncIncrementAddGoods(dataBaseInfo, commentModel);//同步新商品 // syncIncrementModifyGoods(dataBaseInfo, commentModel); - syncIncrementStock(dataBaseInfo, commentModel); - syncFlowPrice(dataBaseInfo, commentModel,sycnTime); + syncIncrementStock(dataBaseInfo, commentModel);//同步库存 + syncFlowPrice(dataBaseInfo, commentModel,sycnTime);//同步调价单 break; } @@ -310,6 +310,22 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return root; } + /** + * 判断是否有新增商品,有新增商品才同步分类 + * @param dataBaseInfo + * @param refreshTime + * @return + */ + public boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime){ + String where="where b.status='1' "; + where+=" and ( b.modify_date>'"+refreshTime+"' "; + where+=" or b.build_date>'"+refreshTime+"') "; + dataBaseInfo.setWhere(where); + int total = sxDataDao.getTBditemInfoTotal(dataBaseInfo); + log.info("判断库存数量,库存数量:{}",total); + return total>0; + } + /** *同步所有商品 * @param dataBaseInfo @@ -340,7 +356,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService " shop.item_no " + " from " + " t_pc_price_flow_detail tpfd " + - " inner join t_pc_price_flow_master tppfm " + + " left join t_pc_price_flow_master tppfm " + " on " + " tpfd.sheet_no = tppfm.sheet_no " + " where " + @@ -619,10 +635,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.info("文件下载目录: {}", downloadDirectory); HttpHeaders headers = new HttpHeaders(); // headers.set("User-Agent", "Apifox/1.0.0 (https://apifox.com)"); - headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */* - headers.set("Accept-Encoding", "gzip, deflate, br"); + //headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */* + // headers.set("Accept-Encoding", "gzip, deflate, br"); // 可以添加其他Apifox可能发送的头部 - headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); + // headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); headers.set("Connection", "keep-alive"); HttpEntity> requestEntity = new HttpEntity<>(headers); @@ -766,10 +782,13 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService JSONObject jsonObject= restTemplate.getForObject(remoteIp+HttpUtils.URL_SYNC_GET_STOR_DATA_RELEASE +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId(),JSONObject.class); + // String jsonStr="[{\"consumeId\":\"1986611923814223873\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"31011\",\"unitPrice\":10.90,\"quantity\":1.500,\"saleAmount\":16.35,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223872\",\"orderId\":\"DD_20251107_2\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":1.000,\"saleAmount\":1.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223874\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":2.000,\"saleAmount\":2.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"}]"; + if(null!=jsonObject.get("result")){ // Map map=(Map)jsonObject.get("result"); + String jsonStr= jsonObject.getStr("result"); List productQuantityConsumptionDtoList = - JSONUtil.toList(jsonObject.getStr("result"),ProductQuantityConsumptionDto.class); + JSONUtil.toList(jsonStr,ProductQuantityConsumptionDto.class); if(!productQuantityConsumptionDtoList.isEmpty()){ Map map = productQuantityConsumptionDtoList.stream() .collect(Collectors.groupingBy( @@ -783,17 +802,18 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService Map productQuantityConsumptionDtoMap=new HashMap<>(); productQuantityConsumptionDtoList.forEach(productQuantityConsumptionDto -> { - productQuantityConsumptionDtoMap.put(productQuantityConsumptionDto.getProductNumber(),productQuantityConsumptionDto); + productQuantityConsumptionDtoMap.put(productQuantityConsumptionDto.getOrderId()+"-"+productQuantityConsumptionDto.getProductNumber(),productQuantityConsumptionDto); }); sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoMap,productQuantityConsumptionDtoList,commentModel); + }else { + log.info("无线上流水同步"); } - } } @Override - public void syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) { + public boolean syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) { String where="where 1=1"; Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ @@ -804,7 +824,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService total = sxDataDao.getNewActiveCount(dataBaseInfo); if(total==0){ log.info("暂无活动同步"); - return; + return false; } // 总页数 int pages = CommonUtil.getPagesCount(total, SxDataDao.PAGESIZE); @@ -829,7 +849,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService syncCount+=activeDtos.size(); } log.info("成功同步活动数据:"+syncCount); - + return true; } @Override From da259b15e9c698353070728e2fb46b29a635a816 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 7 Jul 2025 18:18:20 +0800 Subject: [PATCH 32/64] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=93=81=E7=89=8C=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/small/client/dao/SxDataDao.java | 657 +----------------- 1 file changed, 17 insertions(+), 640 deletions(-) diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 6d004280..43139827 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -3,29 +3,16 @@ package com.small.client.dao; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONUtil; -import com.google.gson.Gson; import com.small.client.Utils.BigDecimalFormatter; -import com.small.client.Utils.CommonUtil; -import com.small.client.Utils.HttpUtils; -import com.small.client.Utils.SqlBuilder; import com.small.client.dto.*; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.*; -import java.sql.Date; -import java.time.LocalDateTime; import java.util.*; -import java.util.stream.Collectors; /** * 考虑到每个思迅软件都是自己的数据,所以采用动态获取的方式获取数据 @@ -35,12 +22,9 @@ import java.util.stream.Collectors; @Service @Slf4j public class SxDataDao extends BaseDao{ - @Autowired - private RestTemplate restTemplate; - @Value("${remoteIp}") - private String remoteIp; + private final static String T_BD_ITEM_CLS="t_bd_item_cls";//商品分类 - private final static String T_BD_ITEM_INFO="t_bd_item_info b";//商品表 + private final static String T_BD_ITEM_INFO="t_bd_item_info";//商品表 private final static String T_RM_VIP_INFO="t_rm_vip_info";//会员表 private final static String ITEM_CLSNO="item_clsno";//商品分类排序字段 @@ -54,10 +38,6 @@ public class SxDataDao extends BaseDao{ //private final static String T_IM_BRANCH_STOCK="t_im_branch_stock";//库存表 - private final static String T_BD_BRANCH_INFO="t_bd_branch_info";//仓库表 - - private final static String T_RM_CASHIER="t_rm_cashier";//小发收银账号 - private final static String T_IM_BRANCH_STOCK="(" + "select * from( " + " select ROW_NUMBER() OVER( " + @@ -72,12 +52,9 @@ public class SxDataDao extends BaseDao{ public final static String DEFALTWHERE="where 1=1"; - public final static String DEFAULT_IMG="https://media-mall-prod-1259811287.cos.ap-guangzhou.myqcloud.com/media/media/plantform/20250906/b93a9751b35a49fca6cf979829230868.png"; + public final static String DEFAULT_IMG="https://digitalassets.tesla.com/tesla-contents/image/upload/f_auto,q_auto/Homepage-Model-Y-2-Promo-Hero-Tablet-CN.png"; - private final static String T_PUB_PLAN_MASTER="t_pub_plan_master";//活动方案表 - private final static String T_PUB_PLAN_DETAIL_B="t_pub_plan_detail_b";//活动商品表 - private final static String PLAN_NO="plan_no";//活动方案表排序字段 /** * 查找商品分类数据 * @param dataBaseInfo @@ -178,12 +155,8 @@ public class SxDataDao extends BaseDao{ * @return */ public int getTBditemInfoJoninTotal(DataBaseInfo dataBaseInfo){ - String stockOperateWhere=""; - if(StringUtils.isNotEmpty(dataBaseInfo.getStockOperateWhere())){ - stockOperateWhere="where "+dataBaseInfo.getStockOperateWhere(); - } return getBaseGoodsJoinTotal(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName() - ,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),stockOperateWhere); + ,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere()); } /** @@ -204,12 +177,8 @@ public class SxDataDao extends BaseDao{ * @param pageSize */ public List findBditemInfoListPage(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){ - String stockOperateWhere=""; - if(StringUtils.isNotEmpty(dataBaseInfo.getStockOperateWhere())){ - stockOperateWhere=" and "+dataBaseInfo.getStockOperateWhere(); - } ResultDto resultDto=baseFindGoodsListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName() - ,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),stockOperateWhere); + ,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere()); ResultSet rs= resultDto.getResultSet(); List sxSyncGoodses=new ArrayList<>(); SxSyncGoods sxSyncGoods=null; @@ -486,21 +455,16 @@ public class SxDataDao extends BaseDao{ * @param dataBaseInfo * @param map */ - public void updateStoreData(DataBaseInfo dataBaseInfo, Map map,Map pqMap,List productQuantityConsumptionDtoList, - CommentModel commentModel){ + public void updateStoreData(DataBaseInfo dataBaseInfo, Map map){ if(CollectionUtil.isEmpty(map)){ log.info("同步数据为空"); return; } - String brachNo=getLocalBranch(dataBaseInfo);//获取总店铺分仓编号 - Map itemInfoMap= findItemInfoList(dataBaseInfo,map);//查询商品信息 - Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), + Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()); try { conn.setAutoCommit(false); // 关闭自动提交,开启事务 //String sql = "update t_im_branch_stock set stock_qty= stock_qty+(?),oper_date=? where item_no=?"; - List rmSaleflowList=new ArrayList<>(); - List tRmPayflowList=new ArrayList<>(); String sql = "WITH TopStock AS ( " + " SELECT TOP(1) * " + " FROM t_im_branch_stock " + @@ -511,34 +475,12 @@ public class SxDataDao extends BaseDao{ " SET stock_qty = stock_qty+(?),oper_date=?;"; Timestamp timestamp = new Timestamp(System.currentTimeMillis()); try (PreparedStatement ps = conn.prepareStatement(sql)) { - int batchSize = 100; // 每批处理1000条 + int batchSize = 1000; // 每批处理1000条 int count = 0; Set sme=map.entrySet(); for (Map.Entry entry : sme) { - String key=entry.getKey().toString(); - String[] splitKey = key.split("-"); - if(splitKey.length!=2){ - continue; - } - String itemNo = splitKey[1]; - BigDecimal stock_qty= (BigDecimal) entry.getValue(); - - if(stock_qty.compareTo(BigDecimal.ZERO)==0){ - continue; - } - ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(key); - if(productQuantityConsumptionDto.getSaleAmount().compareTo(BigDecimal.ZERO)==0){ - continue; - } - RmSaleflow rmSaleflow = getRmSaleflow(productQuantityConsumptionDto, itemNo, stock_qty); - rmSaleflow= fixRmSaleFlow(rmSaleflow,brachNo,itemInfoMap,dataBaseInfo.getSaleAccount()); - TRmPayflow trmPayflow=fixTRmPayflow(rmSaleflow); - - rmSaleflowList.add(rmSaleflow); - tRmPayflowList.add(trmPayflow); - - ps.setString(1, itemNo); - ps.setDouble(2, stock_qty.doubleValue()); + ps.setString(1, (String) entry.getKey()); + ps.setDouble(2, (double) entry.getValue()); ps.setTimestamp(3, timestamp); ps.addBatch(); // 添加至批处理 count++; @@ -550,393 +492,27 @@ public class SxDataDao extends BaseDao{ } // 执行剩余未满 batchSize 的批次 int[] remainingCounts = ps.executeBatch(); - - //todo 新增流水 - updateStoreSaleFlow(conn,rmSaleflowList,tRmPayflowList); - - List consumIds=productQuantityConsumptionDtoList - .stream() - .map(ProductQuantityConsumptionDto::getConsumeId) - .collect(Collectors.toList()); - Gson gson=new Gson(); - String jsonString=gson.toJson(consumIds); - JSONArray jsonArray = JSONUtil.parseArray(jsonString); - String sign= CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); - String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_POST_STORE_DATA_RESPONSE - +"?appKey="+commentModel.getAppKey() - +"&sign="+sign, jsonArray); - if (!HttpUtils.SUCCESSCODE.equals(code)) { - throw new Exception("服务器异常"); - } - log.info("库存更新剩余批次更新数: {}", Arrays.toString(remainingCounts)); + log.info("剩余批次更新数: {}", Arrays.toString(remainingCounts)); conn.commit(); // 最终提交事务 log.info("批量更新完成,总记录数: {}" , count); //baseUpdateImBrancStock(dataBaseInfo); - } catch (Exception e) { + } catch (SQLException e) { conn.rollback(); // 出错时回滚整个事务 - log.info("业务失败:: {}", e.getMessage()); + e.printStackTrace(); } } catch (SQLException e) { - log.info("sql失败:: {}", e.getMessage()); + e.printStackTrace(); }finally { if(conn!=null){ try { conn.close(); } catch (SQLException e) { - log.info("最后sql失败:: {}", e.getMessage()); + throw new RuntimeException(e); } } } } - /** - * 封装对象 - * @param productQuantityConsumptionDto - * @param itemNo - * @param stock_qty - * @return - */ - private RmSaleflow getRmSaleflow(ProductQuantityConsumptionDto productQuantityConsumptionDto, String itemNo, BigDecimal stock_qty) { - BigDecimal unitPrice = productQuantityConsumptionDto.getUnitPrice(); - RmSaleflow rmSaleflow=new RmSaleflow(); - rmSaleflow.setItemNo(itemNo); - rmSaleflow.setSalePrice(unitPrice); - rmSaleflow.setSaleQnty(stock_qty); - rmSaleflow.setSaleMoney(productQuantityConsumptionDto.getSaleAmount()); - // rmSaleflow.setSourcePrice(unitPrice); - rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号 - return rmSaleflow; - } - - /** - * 补充字段 - * @param rmSaleflow - * @return - */ - public RmSaleflow fixRmSaleFlow(RmSaleflow rmSaleflow,String branchNo,Map itemInfoMap,String saleAccount){ - //自定义单号 start - rmSaleflow.setFlowId(1); - String orderId=rmSaleflow.getFlownoRand(); - String[] orderIdSplits= orderId.split("_"); - //String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd"); - String DateStr=orderIdSplits[1]; - String number= String.format("%04d", Integer.valueOf(orderIdSplits[orderIdSplits.length-1])); - String flowNo="99"+DateStr+number; - rmSaleflow.setFlowNo(flowNo);//订单号 todo - //自定义 单号 end - - //判断取值 start - rmSaleflow.setSellWay("B"); - rmSaleflow.setRetQnty(rmSaleflow.getSaleQnty()); - if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ - rmSaleflow.setSellWay("A"); - BigDecimal saleQnty=rmSaleflow.getSaleQnty();//销售数量 - rmSaleflow.setSaleQnty(saleQnty); - rmSaleflow.setRetQnty(BigDecimal.ZERO); - } -// BigDecimal saleMoney=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()); -// if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ -// saleMoney=saleMoney.multiply(new BigDecimal("-1")); -// } -// rmSaleflow.setSaleMoney(saleMoney); - //判断取值 end - - //数据库查询取值start todo - ItemInfo itemInfo=itemInfoMap.get(rmSaleflow.getItemNo()); - if(itemInfo!=null){ - rmSaleflow.setInPrice(itemInfo.getPrice()); - rmSaleflow.setSourcePrice(itemInfo.getSalePrice()); - rmSaleflow.setOperDate(new Timestamp(System.currentTimeMillis())); - } - rmSaleflow.setBranchNo(branchNo); - - //数据库查询取值end - - //远程配置取值start todo - rmSaleflow.setOperId(saleAccount); - rmSaleflow.setSaleMan(saleAccount); - rmSaleflow.setCounterNo(saleAccount); - //远程配置取值end - - //统一默认值 start - rmSaleflow.setNStan(BigDecimal.ZERO); - rmSaleflow.setChrStan("0"); - rmSaleflow.setFlownoType("0"); - rmSaleflow.setPrefAmt(BigDecimal.ZERO); - rmSaleflow.setComFlag("0"); - rmSaleflow.setRemoteFlag("0"); - //统一默认值 end - return rmSaleflow; - } - - /** - * 支付流水赋值 - * @return - */ - public TRmPayflow fixTRmPayflow(RmSaleflow rmSaleflow){ - TRmPayflow rmPayflow=new TRmPayflow(); - rmPayflow.setFlowId(rmSaleflow.getFlowId()); - rmPayflow.setFlowNo(rmSaleflow.getFlowNo()); -// BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP); -// if(saleAmount.compareTo(BigDecimal.ZERO)<0){ -// saleAmount=saleAmount.multiply(new BigDecimal("-1")); -// } -// rmPayflow.setSaleAmount(saleAmount); - rmPayflow.setSaleAmount(rmSaleflow.getSaleMoney()); - rmPayflow.setBranchNo(rmSaleflow.getBranchNo()); - rmPayflow.setPayWay("RMB");//人民币 - rmPayflow.setSellWay(rmSaleflow.getSellWay()); - rmPayflow.setCardNo(""); - rmPayflow.setVipNo(null); - rmPayflow.setCoinNo("RMB");// - rmPayflow.setCoinRate(new BigDecimal("1"));//利率 - rmPayflow.setPayAmount(rmSaleflow.getSaleMoney()); - rmPayflow.setOperDate(new Timestamp(System.currentTimeMillis())); - rmPayflow.setOperId(rmSaleflow.getOperId()); - rmPayflow.setCounterNo(rmSaleflow.getCounterNo()); - rmPayflow.setSaleMan(rmSaleflow.getSaleMan()); - rmPayflow.setMemo(""); - rmPayflow.setVoucherNo("");//退货单号 退货时要填 - rmPayflow.setRemoteFlag("0"); - rmPayflow.setExchangeFlag("0"); - rmPayflow.setShiftNo(""); - rmPayflow.setComFlag("0"); - rmPayflow.setPosid("01"); - rmPayflow.setUptime(null); - rmPayflow.setFlownoRand(rmSaleflow.getFlownoRand()); - rmPayflow.setCiceroniNo("0"); - rmPayflow.setCiceroniId(null); - rmPayflow.setFlownoType(rmSaleflow.getFlownoType()); - rmPayflow.setTransType(null); - rmPayflow.setUpBatchno("");//todo - rmPayflow.setUpVipacc("0"); - rmPayflow.setCashNo("00"); - if("B".equals(rmSaleflow.getSellWay())){//退货 - rmPayflow.setMemo("正常退货"); - rmPayflow.setVoucherNo("");//退货单号 退货时要填 - rmPayflow.setRemoteFlag(""); - rmPayflow.setExchangeFlag("0"); - rmPayflow.setUpVipacc(null); - } - - return rmPayflow; - } - - /** - * 查询商品,返回map - * @param dataBaseInfo - * @param map - * @return - */ - public Map findItemInfoList(DataBaseInfo dataBaseInfo,Map map){ - if(CollectionUtil.isEmpty(map)){ - return null; - } - Map resultMap=new HashMap<>(); - Set sme=map.entrySet(); - String where = "where 1=1 and "; - List itemNos = sme.stream() - .map(entry -> { - String key= (String) entry.getKey(); - String[] split = key.split("-"); - return split[1]; - }) - .collect(Collectors.toList()); - where += SqlBuilder.buildInCondition("item_no", itemNos); - ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(), - dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_BD_ITEM_INFO,where); - ResultSet rs= resultDto.getResultSet(); - try { - while (rs.next()) { - ItemInfo itemInfo=new ItemInfo(); - String itemNo=rs.getString("item_no").trim(); - itemInfo.setItemNo(itemNo);// - if(StringUtils.isNotEmpty(rs.getString("item_subno"))){ - itemInfo.setItemSubno(rs.getString("item_subno").trim()); - } - if(StringUtils.isNotEmpty(rs.getString("item_name"))){ - itemInfo.setItemName(rs.getString("item_name").trim()); - } - if(StringUtils.isNotEmpty(rs.getString("item_brand"))){ - itemInfo.setItemBrand(rs.getString("item_brand").trim());//品牌 - } - if(StringUtils.isNotEmpty(rs.getString("price"))){ - itemInfo.setPrice(rs.getBigDecimal("price"));//进货价 - } - if(StringUtils.isNotEmpty(rs.getString("item_clsno"))){ - itemInfo.setItemClsno(rs.getString("item_clsno").trim()); - } - if(StringUtils.isNotEmpty(rs.getString("sale_price"))){ - itemInfo.setSalePrice(rs.getBigDecimal("sale_price")); - } - resultMap.put(itemNo,itemInfo); - } - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - try { - resultDto.getConnection().close(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - return resultMap; - } - - /** - * 批量新增销售流水 - * @param conn - * @param rmSaleflowList - */ - public void updateStoreSaleFlow(Connection conn,List rmSaleflowList,List payflowList){ - if(CollectionUtil.isEmpty(rmSaleflowList)){ - log.info("销售流水记录为空"); - return; - } -// Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), -// dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()); - //try { - //conn.setAutoCommit(false); // 关闭自动提交,开启事务 - String sql = "INSERT INTO t_rm_saleflow (" + - "flow_id, flow_no, branch_no, item_no, source_price, sale_price, " + - "sale_qnty, sale_money, sell_way, oper_id, sale_man, counter_no, " + - "oper_date, remote_flag, shift_no, com_flag, spec_flag, pref_amt, " + - "in_price, n_stan, chr_stan, posid, uptime, flowno_rand, ret_qnty, " + - "flowno_type, spec_sheet_no, cic_sheet_no, share_cardid, item_no_Fresh" + - ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - String sql2 = "INSERT INTO t_rm_payflow (" + - "flow_id, flow_no, sale_amount, branch_no, pay_way, sell_way, " + - "card_no, vip_no, coin_no, coin_rate, pay_amount, oper_date, " + - "oper_id, counter_no, sale_man, memo,remote_flag, " + - "exchange_flag, shift_no, com_flag, uptime, flowno_rand, " + - "ciceroni_no, ciceroni_id, flowno_type, trans_type, up_batchno, " + - "remark, cash_no" + - ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - try { - PreparedStatement ps = conn.prepareStatement(sql);//销售流水 - PreparedStatement ps2 = conn.prepareStatement(sql2);//资金流水 - int batchSize = 10; // 每批处理10条 - int count = 0; - for (int i=0;i0){ activeShopInfo.setActivityState(1);//正常进行中 }else { @@ -1147,191 +711,4 @@ public class SxDataDao extends BaseDao{ return clsBrandDtos; } - - /** - *获取促销活动价格 时段特价单 - * @param dataBaseInfo - * DD-直接折扣 t_pub_plan_sendext t_pub_plan_detail_b - * PS-直接特价 t_pub_plan_detail_b - * PM-im促销 t_pub_plan_detail_b - * range_flag='I' 代表按商品维度促销 - * @return - */ - public List getNewActiveList(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){ - String where=dataBaseInfo.getWhere()+" and rule_no in('DD','PS','PM') and range_flag='I'"; - ResultDto resultDto=baseFindListPage(dataBaseInfo.getIp() - ,dataBaseInfo.getUserName() - ,dataBaseInfo.getPassword() - ,dataBaseInfo.getDbPort() - ,dataBaseInfo.getDataBaseName() - ,T_PUB_PLAN_MASTER +" b" - ,PLAN_NO - ,pageNo - ,pageSize - ,where); - ResultSet rs= resultDto.getResultSet(); - List activeDtos=new ArrayList<>(); - try { - while (rs.next()) { - ActiveDto activeDto=new ActiveDto(); - String specialType=rs.getString("rule_no").trim(); - String activityName=rs.getString("plan_name").trim(); - if(specialType.equals("DD")){//折扣 - activeDto.setActivityTypeId(2); - } - if(specialType.equals("PS")||specialType.equals("PM")){//特价(秒杀) - activeDto.setActivityTypeId(1); - } - if(specialType.equals("E")){//满减 todo - - } - activeDto.setActivityName(activityName); - activeDto.setActivity_remark(rs.getString("plan_memo").trim()); - activeDto.setFlowNo(rs.getString("plan_no")); - activeDto.setActivityReleasetime(rs.getDate("oper_date")); - activeDto.setActivityStarttime(rs.getDate("begin_date")); - activeDto.setActivityEndtime(rs.getDate("end_date")); - if(DateUtil.compare(activeDto.getActivityEndtime(),DateUtil.date())>0){ - activeDto.setActivityState(1);//正常进行中 - }else { - activeDto.setActivityState(2);//结束 - } - activeDtos.add(activeDto); - } - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - try { - resultDto.getConnection().close(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - return activeDtos; - } - - - /** - * 获取折扣商品 - * @param dataBaseInfo - * @return - */ - public List getSpecShops(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){ - String where=dataBaseInfo.getWhere()+" and b.range_flag='I' and rule_no in('DD','PS','PM')"; - ResultDto resultDto=baseFindListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(), - T_PUB_PLAN_DETAIL_B,T_PUB_PLAN_MASTER,"plan_no","plan_no","flow_id","t.rule_no,t.plan_name,t.begin_date,t.end_date",pageNo,pageSize,where); - ResultSet rs= resultDto.getResultSet(); - List activeShopInfos=new ArrayList<>(); - try { - while (rs.next()) { - ActiveShopInfo activeShopInfo=new ActiveShopInfo(); - activeShopInfo.setItemNo(rs.getString("item_no").trim()); - String specialType=rs.getString("rule_no").trim(); - String activityName=rs.getString("plan_name").trim(); - if(specialType.equals("DD")){//折扣 折扣和满减分类比较多,目前只同步商品级别的 - BigDecimal discount=rs.getBigDecimal("value"); - //String discountStr=BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(10))); - // activeShopInfo.setActivityName(activityName); - activeShopInfo.setDiscount(discount); - activeShopInfo.setActivityTypeId(2); - } - if(specialType.equals("PS")||specialType.equals("PM")){//特价(秒杀) - //activeShopInfo.setActivityName(activityName); - activeShopInfo.setOldPrice(rs.getBigDecimal("num2")); - activeShopInfo.setSpecPrice(rs.getBigDecimal("value")); - activeShopInfo.setActivityTypeId(1); - } -// if(specialType.equals("FR")){//满减 todo 没有同步 -// String total1=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("old_price")); -// String max1=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("spe_price")); -// String max2=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("spe_price").add(rs.getBigDecimal("new_price1"))); -// String total2=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("old_price").add(rs.getBigDecimal("old_price1"))); -// activeShopInfo.setActivityName("满"+total1+"减"+max1+",满"+total2+"减"+max2); -// activeShopInfo.setActivityTypeId(3); -// } - activeShopInfo.setActivityName(activityName); - activeShopInfo.setActivityItemMinQuantity(rs.getBigDecimal("limit_qty")); - activeShopInfo.setActivityStarttime(rs.getDate("begin_date")); - activeShopInfo.setActivityEndtime(rs.getDate("end_date")); - activeShopInfo.setFlowNo(rs.getString("plan_no")); - activeShopInfo.setItemNo(rs.getString("item_no").trim()); - if(DateUtil.compare(activeShopInfo.getActivityEndtime(),DateUtil.date())>0){ - activeShopInfo.setActivityState(1);//正常进行中 - }else { - activeShopInfo.setActivityState(2);//结束 - } - activeShopInfos.add(activeShopInfo); - } - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - try { - resultDto.getConnection().close(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - return activeShopInfos; - } - - /** - * - * @param dataBaseInfo - * @return - */ - public Integer getTotalSpecShop(DataBaseInfo dataBaseInfo){ - String where=dataBaseInfo.getWhere()+" and d.range_flag='I' and rule_no in('DD','PS','PM')"; - return getTotalSpecShop(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(), - dataBaseInfo.getDataBaseName(),where); - } - - /** - * 获取本地仓库 - * @return - */ - public String getLocalBranch(DataBaseInfo dataBaseInfo){ - ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(), - dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_BD_BRANCH_INFO,"where property =2 "); - ResultSet rs= resultDto.getResultSet(); - String branch_no = ""; - try { - while (rs.next()) { - branch_no=rs.getString("branch_no");// - } - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - try { - resultDto.getConnection().close(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - return branch_no; - } - - /** - * 获取小发账号 - * @return - */ - public String getTRmCashier(DataBaseInfo dataBaseInfo,String accountNo){ - ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(), - dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_RM_CASHIER,"where cashier_id='"+accountNo+"'"); - ResultSet rs= resultDto.getResultSet(); - String cashier_id = ""; - try { - while (rs.next()) { - cashier_id=rs.getString("cashier_id");// - } - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - try { - resultDto.getConnection().close(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - return cashier_id; - } } From ce974276a8779fcab0c90bb0b67485bc3aeac716 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Tue, 8 Jul 2025 18:17:04 +0800 Subject: [PATCH 33/64] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebController.java | 54 +---- .../java/com/small/client/dao/SxDataDao.java | 5 +- .../client/service/imp/SxDataServiceImp.java | 199 ++++-------------- 3 files changed, 53 insertions(+), 205 deletions(-) diff --git a/client/src/main/java/com/small/client/controller/WebController.java b/client/src/main/java/com/small/client/controller/WebController.java index 21d45b73..c49a082b 100644 --- a/client/src/main/java/com/small/client/controller/WebController.java +++ b/client/src/main/java/com/small/client/controller/WebController.java @@ -21,19 +21,9 @@ public class WebController { @Autowired private SxDataService sxDataService; - @RequestMapping("/test") + @RequestMapping("/upload") public void upload(){ - CommentModel commentModel= sxDataService.getCommentModel(); - DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); - if(dataBaseInfo==null){ - log.error("syncGoods dataBaseInfo is null"); - return; - } - if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); - } - // sxDataService.getCategoryChildren(new DataBaseInfo(),"0101"); - System.out.println(sxDataService.getCategoryChildren(dataBaseInfo,"01")); + System.out.println("upload"); //webClientService.uploudSxData(); } @@ -41,32 +31,14 @@ public class WebController { public void synBrand(){ log.info("synBrand"); // sxDataService.getAppSign(); - CommentModel commentModel= sxDataService.getCommentModel(); - DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); - if(dataBaseInfo==null){ - log.error("syncGoods dataBaseInfo is null"); - return; - } - if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); - } - sxDataService.SyncBranchList(dataBaseInfo,sxDataService.getCommentModel()); + sxDataService.SyncBranchList(new DataBaseInfo(),sxDataService.getCommentModel()); } @RequestMapping("/syncCategory") public void syncCategory(){ log.info("syncCategory"); //sxDataService.getAppSign(); - CommentModel commentModel= sxDataService.getCommentModel(); - DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); - if(dataBaseInfo==null){ - log.error("syncGoods dataBaseInfo is null"); - return; - } - if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); - } - sxDataService.SyncCategory(dataBaseInfo,sxDataService.getCommentModel()); + sxDataService.SyncCategory(new DataBaseInfo(),sxDataService.getCommentModel()); } @RequestMapping("/syncGoods") @@ -130,19 +102,7 @@ public class WebController { @RequestMapping("/syncStoreData") public void syncStoreData(){ - CommentModel commentModel= sxDataService.getCommentModel(); - DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); - if(dataBaseInfo==null){ - log.error("syncGoods dataBaseInfo is null"); - return; - } - if(StringUtils.isEmpty(commentModel.getSyncTime())){ - commentModel =sxDataService.getCommentModel(); - } - if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); - } - sxDataService.syncStoreData(dataBaseInfo,commentModel); + sxDataService.syncStoreData(new DataBaseInfo(),sxDataService.getCommentModel()); } @@ -158,7 +118,7 @@ public class WebController { commentModel =sxDataService.getCommentModel(); } if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDate(dataBaseInfo.getRefreshTime())); + commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); } sxDataService.syncAtive(new DataBaseInfo(),commentModel); // sxDataService.syncAtive(new DataBaseInfo(),new CommentModel()); @@ -176,7 +136,7 @@ public class WebController { commentModel =sxDataService.getCommentModel(); } if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDate(dataBaseInfo.getRefreshTime())); + commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); } sxDataService.syncAtiveShops(new DataBaseInfo(),commentModel); //sxDataService.syncAtiveShops(new DataBaseInfo(),new CommentModel()); diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 43139827..b1bced36 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -567,7 +567,7 @@ public class SxDataDao extends BaseDao{ activeDto.setActivityTypeId(3); activeDto.setActiveMaxDesList(activeMaxDesList); } - activeDto.setFlowNo(rs.getString("flow_no")); + activeDto.setFlowNo(rs.getString("other3")); activeDto.setActivityReleasetime(rs.getDate("oper_date")); activeDto.setActivityStarttime(rs.getDate("start_date")); activeDto.setActivityEndtime(rs.getDate("end_date")); @@ -657,9 +657,10 @@ public class SxDataDao extends BaseDao{ activeShopInfo.setActivityName("满"+total1+"减"+max1+",满"+total2+"减"+max2); activeShopInfo.setActivityTypeId(3); } + activeShopInfo.setActivityItemMinQuantity(rs.getBigDecimal("sale_qty")); activeShopInfo.setActivityStarttime(rs.getDate("start_date")); activeShopInfo.setActivityEndtime(rs.getDate("end_date")); - activeShopInfo.setFlowNo(rs.getString("flow_no")); + activeShopInfo.setFlowNo(rs.getString("other3")); if(DateUtil.compare(activeShopInfo.getActivityEndtime(),DateUtil.date())>0){ activeShopInfo.setActivityState(1);//正常进行中 }else { diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 9490b2b0..efef9dee 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -25,12 +25,13 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import org.springframework.util.MultiValueMap; import org.springframework.util.StreamUtils; import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; import java.io.File; import java.io.FileOutputStream; @@ -38,6 +39,7 @@ import java.io.IOException; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.time.Duration; import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -73,7 +75,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService */ @Override public void SyncCategory(DataBaseInfo dataBaseInfo, CommentModel commentModel) { - // dataBaseInfo= getDataBaseInfo(commentModel); + dataBaseInfo= getDataBaseInfo(commentModel); // 记录总数 Integer total = sxDataDao.getTBdItemClsTotal(dataBaseInfo); if(total==0){ @@ -98,7 +100,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService } catch (Exception e) { throw new RuntimeException(e); } - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); log.info("sign:{}",sign); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_CATEGORY +"?appKey="+commentModel.getAppKey() @@ -133,11 +135,9 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService syncAllGoods(dataBaseInfo, commentModel); break; case "02"://增量 todo test - String sycnTime=commentModel.getSyncTime(); - syncIncrementAddGoods(dataBaseInfo, commentModel);//同步新商品 - // syncIncrementModifyGoods(dataBaseInfo, commentModel); - syncIncrementStock(dataBaseInfo, commentModel);//同步库存 - syncFlowPrice(dataBaseInfo, commentModel,sycnTime);//同步调价单 + syncIncrementAddGoods(dataBaseInfo, commentModel); + syncIncrementModifyGoods(dataBaseInfo, commentModel); + syncIncrementStock(dataBaseInfo, commentModel); break; } @@ -150,7 +150,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService */ @Override public void SyncBranchList(DataBaseInfo dataBaseInfo, CommentModel commentModel) { - // dataBaseInfo= getDataBaseInfo(commentModel); + dataBaseInfo= getDataBaseInfo(commentModel); List brandModels= sxDataDao.getBdBrandList(dataBaseInfo); if(brandModels!=null&&brandModels.size()>0){ String jsonString =""; @@ -163,7 +163,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService } catch (Exception e) { throw new RuntimeException(e); } - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); + String sign=CommonUtil.generateOpenSign(jsonArray.toString(),commentModel.getAppId(),commentModel.getAppKey()); log.info("sign={}",sign); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_BRAND +"?appKey="+commentModel.getAppKey() @@ -184,7 +184,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService */ @Override public void SyncVipList(DataBaseInfo dataBaseInfo, CommentModel commentModel) { - // dataBaseInfo= getDataBaseInfo(commentModel); + dataBaseInfo= getDataBaseInfo(commentModel); String where="where mobile is not null and mobile <>'' "; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ where+="and oper_date > '"+commentModel.getSyncTime()+"'"; @@ -207,11 +207,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService memberList=ConverList(sxSyncVipList); Gson gson=new Gson(); String jsonString = gson.toJson(memberList); - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_MEMBER +"?appKey="+commentModel.getAppKey() +"&sign="+sign,memberList);//todo 后期改为文件传输 - if (!HttpUtils.SUCCESSCODE.equals(code)) { continue; } @@ -239,26 +238,6 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return parentId; } - /** - * 获取父节点下的子节点 - * @param dataBaseInfo - * @param parentId - * @return - */ - @Override - public String getCategoryChildren(DataBaseInfo dataBaseInfo,String parentId){ - List sxSyncCategories=new SxDataDao().findTBdItemClsList(dataBaseInfo); - String childrens=commonCache.get(CommonCache.CACHE_CATEGROY+parentId); - if(StringUtils.isEmpty(childrens)){ - log.info(JSONUtil.toJsonStr(buildTree(sxSyncCategories,parentId))); - childrens=commonCache.get(CommonCache.CACHE_CATEGROY+parentId); - if(StringUtils.isEmpty(childrens)){ - return parentId; - } - } - return childrens; - } - /** * 构建树节点 * @param sxSyncCategories @@ -282,7 +261,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService public List getRootNode(List sxSyncCategories){ List rootNodeList=new ArrayList<>(); for (SxSyncCategory node : sxSyncCategories) { - if (StringUtils.isEmpty(node.getCls_parent())) { + if (null==node.getCls_parent()) { rootNodeList.add(node); } } @@ -310,60 +289,27 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return root; } - /** - * 判断是否有新增商品,有新增商品才同步分类 - * @param dataBaseInfo - * @param refreshTime - * @return - */ - public boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime){ - String where="where b.status='1' "; - where+=" and ( b.modify_date>'"+refreshTime+"' "; - where+=" or b.build_date>'"+refreshTime+"') "; - dataBaseInfo.setWhere(where); - int total = sxDataDao.getTBditemInfoTotal(dataBaseInfo); - log.info("判断库存数量,库存数量:{}",total); - return total>0; - } - /** *同步所有商品 * @param dataBaseInfo * @param commentModel */ private void syncAllGoods(DataBaseInfo dataBaseInfo, CommentModel commentModel){ - //String where="where 1=1"; - String where="where shop.status='1'"; + String where="where 1=1"; Integer total =0; String parentId=getAndCacheTree(dataBaseInfo,dataBaseInfo.getCategoryName());//加载缓存用的 if(DicEnum.SYNCTYPE_02.getCode().equals(dataBaseInfo.getSyncType())){ if (StringUtils.isNotEmpty(dataBaseInfo.getCategoryName())) { //syncGoodsSearchModel.setItemClsno(childrens); String childrens= commonCache.get(CommonCache.CACHE_CATEGROY+parentId); - where += " and shop.item_clsno in ('" + childrens + "')"; + where += " and b.item_clsno in ('" + childrens + "')"; } if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ - where+=" and shop.modify_date>'"+commentModel.getSyncTime()+"' "; - where+=" or shop.build_date>'"+commentModel.getSyncTime()+"' "; + where+=" and b.modify_date>'"+commentModel.getSyncTime()+"' "; + where+=" or b.build_date>'"+commentModel.getSyncTime()+"' "; } if(StringUtils.isNotEmpty(dataBaseInfo.getOperDate())){ - String stockOperateWhere=" ls.oper_date>'"+dataBaseInfo.getOperDate()+"' "; - dataBaseInfo.setStockOperateWhere(stockOperateWhere); - } - if(StringUtils.isNotEmpty(dataBaseInfo.getPriceOperatiem())){ - where+=" and EXISTS ( " + - " select " + - " shop.item_no " + - " from " + - " t_pc_price_flow_detail tpfd " + - " left join t_pc_price_flow_master tppfm " + - " on " + - " tpfd.sheet_no = tppfm.sheet_no " + - " where " + - " tppfm.valid_flag = '1' " +//有效 - " and shop.item_no=tpfd.item_no " + - " and tppfm.oper_date >'"+dataBaseInfo.getPriceOperatiem()+"' " + - " )"; + where+=" and ls.oper_date>'"+dataBaseInfo.getOperDate()+"' "; } dataBaseInfo.setWhere(where); // 记录总数 @@ -376,7 +322,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.info("暂无商品同步"); return; } - //where+=" and"; + where+=" and"; dataBaseInfo.setWhere(where); // 总页数 @@ -413,7 +359,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService +"&syncType="+DicEnum.MUAL_1.getCode() +"&refreshDateStr="+refreshDate, JSONUtil.parseArray(folders)); - log.info("商品总共有{}条数据,同步完成{}条",total,syncCount); + log.info("商品分类总共有{}条数据,同步完成{}条",total,syncCount); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_GOODS_READ +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId() @@ -439,7 +385,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String fileName=fileUtils.getFileName(syncType,page,FileUtils.txtEnd); String filePath=file.getAbsolutePath(); fileUtils.writeFile(filePath,fileName,content); - String sign=CommonUtil.generateOpenSign(content,commentModel.getAppKey(),commentModel.getAppId()); + String sign=CommonUtil.generateOpenSign(content,commentModel.getAppId(),commentModel.getAppKey()); commentModel.setSign(sign); return webClientService.uploudSxData(filePath+FileUtils.pathSeparator+fileName,commentModel,page.toString(),syncType); } @@ -483,16 +429,6 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService syncAllGoods(dataBaseInfo,commentModel); } - /** - * 增量同步 调价单变化 - */ - private void syncFlowPrice(DataBaseInfo dataBaseInfo, CommentModel commentModel,String sycnTime){ - dataBaseInfo.setPriceOperatiem(sycnTime); - commentModel.setSyncTime(""); - dataBaseInfo.setOperDate(""); - syncAllGoods(dataBaseInfo,commentModel); - } - /** *获取特价商品 * @param dataBaseInfo @@ -634,24 +570,12 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService } log.info("文件下载目录: {}", downloadDirectory); HttpHeaders headers = new HttpHeaders(); - // headers.set("User-Agent", "Apifox/1.0.0 (https://apifox.com)"); - //headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */* - // headers.set("Accept-Encoding", "gzip, deflate, br"); - // 可以添加其他Apifox可能发送的头部 - // headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); - headers.set("Connection", "keep-alive"); - - HttpEntity> requestEntity = new HttpEntity<>(headers); + HttpEntity requestEntity = new HttpEntity<>(headers); String encryptedData = getPrimaryKey(); - String url = UriComponentsBuilder.fromHttpUrl(remoteIp + HttpUtils.URL_SYNC_GET_DOWNCLIENTJAR) - .queryParam("primaryKey", encryptedData) - .queryParam("clienVersionName", versionName) - .toUriString(); - log.info("url:{}",url); - // RestTemplate myRestTemplate = createUnsafeRestTemplate(); ResponseEntity response = restTemplate.exchange( - url, + remoteIp+HttpUtils.URL_SYNC_GET_DOWNCLIENTJAR+"?primaryKey="+encryptedData + +"&clienVersionName="+versionName, HttpMethod.GET, requestEntity, Resource.class); @@ -701,12 +625,9 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.error("文件下载失败:{}",e.getMessage()); return null; } - File file=new File(downloadDirectory+originalFileName); - return file.length()>0?downloadDirectory+originalFileName:null; + return downloadDirectory+originalFileName; } - - @Override public void checkForUpdates() { log.info("curentPath:{}",JarPathUtil.getRuntimePath()); @@ -752,7 +673,6 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService DataBaseInfo dataBaseInfo=new DataBaseInfo(); if(null!=storeDbConfig){ dataBaseInfo.setIp(storeDbConfig.getDbIp()); - dataBaseInfo.setUserName(storeDbConfig.getDbUsername()); dataBaseInfo.setPassword(storeDbConfig.getDbPassword()); dataBaseInfo.setDataBaseName(storeDbConfig.getDbName()); dataBaseInfo.setDbPort(storeDbConfig.getDbPort()); @@ -761,8 +681,6 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService dataBaseInfo.setCategoryName(storeDbConfig.getCategoryName()); dataBaseInfo.setRefreshTime(storeDbConfig.getRefreshTime()); dataBaseInfo.setIsTowSync(storeDbConfig.getIsTowSync()); - dataBaseInfo.setShopGapTime(storeDbConfig.getShopGapTime()); - dataBaseInfo.setSaleAccount(storeDbConfig.getSaleAccount()); return dataBaseInfo; } return new DataBaseInfo(); @@ -774,57 +692,28 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.info("不做双向同步数据库"); return; } - String saleAccount= sxDataDao.getTRmCashier(dataBaseInfo,dataBaseInfo.getSaleAccount()); - if(StringUtils.isEmpty(saleAccount)){ - log.error("需要配置商城收银人员"); - return; - } JSONObject jsonObject= restTemplate.getForObject(remoteIp+HttpUtils.URL_SYNC_GET_STOR_DATA_RELEASE +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId(),JSONObject.class); - // String jsonStr="[{\"consumeId\":\"1986611923814223873\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"31011\",\"unitPrice\":10.90,\"quantity\":1.500,\"saleAmount\":16.35,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223872\",\"orderId\":\"DD_20251107_2\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":1.000,\"saleAmount\":1.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223874\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":2.000,\"saleAmount\":2.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"}]"; - if(null!=jsonObject.get("result")){ - // Map map=(Map)jsonObject.get("result"); - String jsonStr= jsonObject.getStr("result"); - List productQuantityConsumptionDtoList = - JSONUtil.toList(jsonStr,ProductQuantityConsumptionDto.class); - if(!productQuantityConsumptionDtoList.isEmpty()){ - Map map = productQuantityConsumptionDtoList.stream() - .collect(Collectors.groupingBy( - ProductQuantityConsumptionDto::getProductNumber, - Collectors.reducing( - BigDecimal.ZERO, - ProductQuantityConsumptionDto::getQuantity, - BigDecimal::add - ) - )); - Map productQuantityConsumptionDtoMap=new HashMap<>(); - - productQuantityConsumptionDtoList.forEach(productQuantityConsumptionDto -> { - productQuantityConsumptionDtoMap.put(productQuantityConsumptionDto.getOrderId()+"-"+productQuantityConsumptionDto.getProductNumber(),productQuantityConsumptionDto); - }); - - sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoMap,productQuantityConsumptionDtoList,commentModel); - }else { - log.info("无线上流水同步"); - } + Map map=(Map)jsonObject.get("result"); + sxDataDao.updateStoreData(dataBaseInfo,map); } } @Override - public boolean syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) { + public void syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) { String where="where 1=1"; Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ - where+=" and b.oper_date>'"+commentModel.getSyncTime()+"' "; - // where+=" or b.oper_date>'"+commentModel.getSyncTime()+"') "; + where+=" and b.start_date>'"+commentModel.getSyncTime()+"' "; + where+=" or b.oper_date>'"+commentModel.getSyncTime()+"' "; } dataBaseInfo.setWhere(where); - total = sxDataDao.getNewActiveCount(dataBaseInfo); + total = sxDataDao.getActiveCount(dataBaseInfo); if(total==0){ log.info("暂无活动同步"); - return false; + return; } // 总页数 int pages = CommonUtil.getPagesCount(total, SxDataDao.PAGESIZE); @@ -833,13 +722,13 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService Date tenMinutesAgo = Date.from(Instant.now());//刷新时间 Date refreshDate= DateUtil.date(tenMinutesAgo); for (int i = 1; i <=pages; i++) { - List activeDtos= sxDataDao.getNewActiveList(dataBaseInfo,i,SxDataDao.PAGESIZE); + List activeDtos= sxDataDao.getActiveList(dataBaseInfo,i,SxDataDao.PAGESIZE); Gson gson=new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") // 设置全局 Date 格式 .create(); String jsonString= gson.toJson(activeDtos); JSONArray jsonArray = JSONUtil.parseArray(jsonString); - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_ACTIVE +"?appKey="+commentModel.getAppKey() +"&sign="+sign, jsonArray); @@ -849,7 +738,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService syncCount+=activeDtos.size(); } log.info("成功同步活动数据:"+syncCount); - return true; + } @Override @@ -857,16 +746,13 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String where="where 1=1"; Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ - where+=" and t.oper_date>'"+commentModel.getSyncTime()+"' "; - // where+=" or m.oper_date>'"+commentModel.getSyncTime()+"') "; + where+=" and start_date>'"+commentModel.getSyncTime()+"' "; + where+=" or oper_date>'"+commentModel.getSyncTime()+"' "; } dataBaseInfo.setWhere(where); - total = sxDataDao.getTotalSpecShop(dataBaseInfo); + total = sxDataDao.getAllSpecCount(dataBaseInfo); if(total==0){ - HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_REFRESH - +"?appKey="+commentModel.getAppKey() - +"&sign="+commentModel.getAppId(), new JSONArray()); log.info("暂无活动商品同步"); return; } @@ -877,14 +763,14 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService Date tenMinutesAgo = Date.from(Instant.now());//刷新时间 Date refreshDate= DateUtil.date(tenMinutesAgo);//todo 要记录刷新时间 for (int i = 1; i <=pages; i++) { - List activeDtos= sxDataDao.getSpecShops(dataBaseInfo,i,SxDataDao.PAGESIZE); + List activeDtos= sxDataDao.getAllSpecPriceList(dataBaseInfo,i,SxDataDao.PAGESIZE); Gson gson=new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") // 设置全局 Date 格式 .registerTypeAdapter(BigDecimal.class,new BigDecimalTypeAdapter()) .create(); String jsonString=gson.toJson(activeDtos); JSONArray jsonArray = JSONUtil.parseArray(jsonString); - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_ACTIVE_SHOP +"?appKey="+commentModel.getAppKey() +"&sign="+sign, jsonArray); @@ -910,4 +796,5 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return map; } + } From 80607c8642b0a60de94d5be0adfefd288b8513ac Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 18 Jul 2025 16:15:59 +0800 Subject: [PATCH 34/64] =?UTF-8?q?=E6=80=9D=E8=BF=85=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=B7=98=E6=B1=B0=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/Schedule/DynamicTaskScheduler.java | 47 ++----------------- .../client/controller/WebController.java | 11 ++++- .../java/com/small/client/dao/SxDataDao.java | 2 +- .../client/service/imp/SxDataServiceImp.java | 3 +- 4 files changed, 17 insertions(+), 46 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index 40ef8277..a927fa98 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -2,7 +2,6 @@ package com.small.client.Schedule; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; -import com.small.client.Utils.CommonUtil; import com.small.client.dto.CommentModel; import com.small.client.dto.DataBaseInfo; import com.small.client.service.SxDataService; @@ -36,11 +35,6 @@ public class DynamicTaskScheduler { @PostConstruct public void initTasks() { - //初始化 start - CommentModel commentModel =sxDataService.getCommentModel(); - DataBaseInfo enabledTask = sxDataService.getDataBaseInfo(commentModel); - executeTask(enabledTask.getDataBaseName(),commentModel); - //初始化 end refreshTasks(); // 每5分钟检查一次数据库更新 taskScheduler.scheduleAtFixedRate(this::refreshTasks, Duration.ofHours(1)); @@ -96,48 +90,15 @@ public class DynamicTaskScheduler { commentModel =sxDataService.getCommentModel(); } DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); - if(dataBaseInfo==null||StringUtils.isEmpty(dataBaseInfo.getUserName())){ - return; - } - String refreshTime=""; if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - refreshTime=DateUtil.formatDateTime(dataBaseInfo.getRefreshTime()); - commentModel.setSyncTime(refreshTime); + commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); } sxDataService.syncStoreData(dataBaseInfo,commentModel); - if(StringUtils.isNotEmpty(refreshTime)){//有刷新时间,证明不是全量,需要判断是否有新商品,有新商品才同步品牌和分类 - if(sxDataService.isNewShop(dataBaseInfo,refreshTime)){ - sxDataService.SyncBranchList(dataBaseInfo,commentModel); - sxDataService.SyncCategory(dataBaseInfo,commentModel); - } - }else { - log.info("首次同步,无刷新时间"); - sxDataService.SyncBranchList(dataBaseInfo,commentModel); - sxDataService.SyncCategory(dataBaseInfo,commentModel); - } + sxDataService.SyncBranchList(dataBaseInfo,commentModel); + sxDataService.SyncCategory(dataBaseInfo,commentModel); sxDataService.SyncGoods(dataBaseInfo,commentModel);//todo 暂时同步全部的商品如果后期修改,需要增加服务器的字段 - try { - if(ObjectUtil.isNotEmpty(dataBaseInfo.getShopGapTime())){ - long sleepTime= CommonUtil.convertExpressionToLong(dataBaseInfo.getShopGapTime()); - Thread.sleep(sleepTime);//两分钟之后执行 - }else { - Thread.sleep(1000*30); - } - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(refreshTime); - } sxDataService.SyncVipList(dataBaseInfo,commentModel); - boolean isNewActives=sxDataService.syncAtive(dataBaseInfo,commentModel); - if(isNewActives){ - log.info("---有新增的活动,同步活动商品开始--"); - sxDataService.syncAtiveShops(dataBaseInfo,commentModel); - }else { - log.info("---无新增的活动,无需同步活动商品--"); - } - + sxDataService.syncAtiveShops(dataBaseInfo,commentModel); isRuning=false; } diff --git a/client/src/main/java/com/small/client/controller/WebController.java b/client/src/main/java/com/small/client/controller/WebController.java index c49a082b..bcb6f051 100644 --- a/client/src/main/java/com/small/client/controller/WebController.java +++ b/client/src/main/java/com/small/client/controller/WebController.java @@ -38,7 +38,16 @@ public class WebController { public void syncCategory(){ log.info("syncCategory"); //sxDataService.getAppSign(); - sxDataService.SyncCategory(new DataBaseInfo(),sxDataService.getCommentModel()); + CommentModel commentModel= sxDataService.getCommentModel(); + DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); + if(dataBaseInfo==null){ + log.error("syncGoods dataBaseInfo is null"); + return; + } + if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ + commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + } + sxDataService.SyncCategory(dataBaseInfo,sxDataService.getCommentModel()); } @RequestMapping("/syncGoods") diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index b1bced36..65ab27b4 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -24,7 +24,7 @@ import java.util.*; public class SxDataDao extends BaseDao{ private final static String T_BD_ITEM_CLS="t_bd_item_cls";//商品分类 - private final static String T_BD_ITEM_INFO="t_bd_item_info";//商品表 + private final static String T_BD_ITEM_INFO="t_bd_item_info b";//商品表 private final static String T_RM_VIP_INFO="t_rm_vip_info";//会员表 private final static String ITEM_CLSNO="item_clsno";//商品分类排序字段 diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index efef9dee..da867c12 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -295,7 +295,8 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService * @param commentModel */ private void syncAllGoods(DataBaseInfo dataBaseInfo, CommentModel commentModel){ - String where="where 1=1"; + //String where="where 1=1"; + String where="where b.status='1'"; Integer total =0; String parentId=getAndCacheTree(dataBaseInfo,dataBaseInfo.getCategoryName());//加载缓存用的 if(DicEnum.SYNCTYPE_02.getCode().equals(dataBaseInfo.getSyncType())){ From ee31d1f75df097d087d332faab7f20a9f5587417 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 19 Jul 2025 14:21:54 +0800 Subject: [PATCH 35/64] =?UTF-8?q?=E9=98=B2=E7=AF=A1=E6=94=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../small/client/controller/WebController.java | 11 ++++++++++- .../client/service/imp/SxDataServiceImp.java | 18 +++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/client/src/main/java/com/small/client/controller/WebController.java b/client/src/main/java/com/small/client/controller/WebController.java index bcb6f051..9f8a53cc 100644 --- a/client/src/main/java/com/small/client/controller/WebController.java +++ b/client/src/main/java/com/small/client/controller/WebController.java @@ -31,7 +31,16 @@ public class WebController { public void synBrand(){ log.info("synBrand"); // sxDataService.getAppSign(); - sxDataService.SyncBranchList(new DataBaseInfo(),sxDataService.getCommentModel()); + CommentModel commentModel= sxDataService.getCommentModel(); + DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); + if(dataBaseInfo==null){ + log.error("syncGoods dataBaseInfo is null"); + return; + } + if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ + commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + } + sxDataService.SyncBranchList(dataBaseInfo,sxDataService.getCommentModel()); } @RequestMapping("/syncCategory") diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index da867c12..4c997889 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -75,7 +75,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService */ @Override public void SyncCategory(DataBaseInfo dataBaseInfo, CommentModel commentModel) { - dataBaseInfo= getDataBaseInfo(commentModel); + // dataBaseInfo= getDataBaseInfo(commentModel); // 记录总数 Integer total = sxDataDao.getTBdItemClsTotal(dataBaseInfo); if(total==0){ @@ -100,7 +100,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService } catch (Exception e) { throw new RuntimeException(e); } - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); log.info("sign:{}",sign); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_CATEGORY +"?appKey="+commentModel.getAppKey() @@ -150,7 +150,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService */ @Override public void SyncBranchList(DataBaseInfo dataBaseInfo, CommentModel commentModel) { - dataBaseInfo= getDataBaseInfo(commentModel); + // dataBaseInfo= getDataBaseInfo(commentModel); List brandModels= sxDataDao.getBdBrandList(dataBaseInfo); if(brandModels!=null&&brandModels.size()>0){ String jsonString =""; @@ -163,7 +163,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService } catch (Exception e) { throw new RuntimeException(e); } - String sign=CommonUtil.generateOpenSign(jsonArray.toString(),commentModel.getAppId(),commentModel.getAppKey()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); log.info("sign={}",sign); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_BRAND +"?appKey="+commentModel.getAppKey() @@ -184,7 +184,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService */ @Override public void SyncVipList(DataBaseInfo dataBaseInfo, CommentModel commentModel) { - dataBaseInfo= getDataBaseInfo(commentModel); + // dataBaseInfo= getDataBaseInfo(commentModel); String where="where mobile is not null and mobile <>'' "; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ where+="and oper_date > '"+commentModel.getSyncTime()+"'"; @@ -207,7 +207,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService memberList=ConverList(sxSyncVipList); Gson gson=new Gson(); String jsonString = gson.toJson(memberList); - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_MEMBER +"?appKey="+commentModel.getAppKey() +"&sign="+sign,memberList);//todo 后期改为文件传输 @@ -386,7 +386,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String fileName=fileUtils.getFileName(syncType,page,FileUtils.txtEnd); String filePath=file.getAbsolutePath(); fileUtils.writeFile(filePath,fileName,content); - String sign=CommonUtil.generateOpenSign(content,commentModel.getAppId(),commentModel.getAppKey()); + String sign=CommonUtil.generateOpenSign(content,commentModel.getAppKey(),commentModel.getAppId()); commentModel.setSign(sign); return webClientService.uploudSxData(filePath+FileUtils.pathSeparator+fileName,commentModel,page.toString(),syncType); } @@ -729,7 +729,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService .create(); String jsonString= gson.toJson(activeDtos); JSONArray jsonArray = JSONUtil.parseArray(jsonString); - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_ACTIVE +"?appKey="+commentModel.getAppKey() +"&sign="+sign, jsonArray); @@ -771,7 +771,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService .create(); String jsonString=gson.toJson(activeDtos); JSONArray jsonArray = JSONUtil.parseArray(jsonString); - String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppId(),commentModel.getAppKey()); + String sign=CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_ACTIVE_SHOP +"?appKey="+commentModel.getAppKey() +"&sign="+sign, jsonArray); From d2cdc097f816874341f142896e62e38a763e965c Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 25 Jul 2025 15:51:41 +0800 Subject: [PATCH 36/64] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../small/client/Schedule/DynamicTaskScheduler.java | 13 +++++++++++++ .../java/com/small/client/dto/DataBaseInfo.java | 9 --------- .../java/com/small/client/dto/StoreDbConfig.java | 3 --- .../small/client/service/imp/SxDataServiceImp.java | 1 + 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index a927fa98..7610aec2 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -2,6 +2,7 @@ package com.small.client.Schedule; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import com.small.client.Utils.CommonUtil; import com.small.client.dto.CommentModel; import com.small.client.dto.DataBaseInfo; import com.small.client.service.SxDataService; @@ -93,11 +94,23 @@ public class DynamicTaskScheduler { if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); } + sxDataService.syncStoreData(dataBaseInfo,commentModel); sxDataService.SyncBranchList(dataBaseInfo,commentModel); sxDataService.SyncCategory(dataBaseInfo,commentModel); sxDataService.SyncGoods(dataBaseInfo,commentModel);//todo 暂时同步全部的商品如果后期修改,需要增加服务器的字段 + try { + if(ObjectUtil.isNotEmpty(dataBaseInfo.getShopGapTime())){ + long sleepTime= CommonUtil.convertExpressionToLong(dataBaseInfo.getShopGapTime()); + Thread.sleep(sleepTime);//两分钟之后执行 + }else { + Thread.sleep(1000*30); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } sxDataService.SyncVipList(dataBaseInfo,commentModel); + sxDataService.syncAtive(dataBaseInfo,commentModel); sxDataService.syncAtiveShops(dataBaseInfo,commentModel); isRuning=false; } diff --git a/client/src/main/java/com/small/client/dto/DataBaseInfo.java b/client/src/main/java/com/small/client/dto/DataBaseInfo.java index bfe770c3..f19bfbb3 100644 --- a/client/src/main/java/com/small/client/dto/DataBaseInfo.java +++ b/client/src/main/java/com/small/client/dto/DataBaseInfo.java @@ -41,13 +41,4 @@ public class DataBaseInfo { @ApiModelProperty(value = "间隔时间") private String shopGapTime; - - @ApiModelProperty(value = "调价时间") - private String priceOperatiem; - - @ApiModelProperty(value = "库存条件") - private String stockOperateWhere; - - @ApiModelProperty(value = "营业员账号") - private String saleAccount; } diff --git a/client/src/main/java/com/small/client/dto/StoreDbConfig.java b/client/src/main/java/com/small/client/dto/StoreDbConfig.java index 780178ee..7aead91d 100644 --- a/client/src/main/java/com/small/client/dto/StoreDbConfig.java +++ b/client/src/main/java/com/small/client/dto/StoreDbConfig.java @@ -71,7 +71,4 @@ public class StoreDbConfig implements Serializable { @ApiModelProperty("商品同步间隔时间") private String shopGapTime; - - @ApiModelProperty(value = "营业员账号") - private String saleAccount; } diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 4c997889..656f7f5c 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -682,6 +682,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService dataBaseInfo.setCategoryName(storeDbConfig.getCategoryName()); dataBaseInfo.setRefreshTime(storeDbConfig.getRefreshTime()); dataBaseInfo.setIsTowSync(storeDbConfig.getIsTowSync()); + dataBaseInfo.setShopGapTime(storeDbConfig.getShopGapTime()); return dataBaseInfo; } return new DataBaseInfo(); From c587ad55323c00ebedb797cb8f9031b3fef4ad1d Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 2 Aug 2025 17:21:02 +0800 Subject: [PATCH 37/64] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/controller/WebController.java | 32 +++- .../java/com/small/client/dao/SxDataDao.java | 151 ++++++++++++++++++ .../small/client/service/SxDataService.java | 10 +- .../client/service/imp/SxDataServiceImp.java | 36 ++++- 4 files changed, 207 insertions(+), 22 deletions(-) diff --git a/client/src/main/java/com/small/client/controller/WebController.java b/client/src/main/java/com/small/client/controller/WebController.java index 9f8a53cc..21d45b73 100644 --- a/client/src/main/java/com/small/client/controller/WebController.java +++ b/client/src/main/java/com/small/client/controller/WebController.java @@ -21,9 +21,19 @@ public class WebController { @Autowired private SxDataService sxDataService; - @RequestMapping("/upload") + @RequestMapping("/test") public void upload(){ - System.out.println("upload"); + CommentModel commentModel= sxDataService.getCommentModel(); + DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); + if(dataBaseInfo==null){ + log.error("syncGoods dataBaseInfo is null"); + return; + } + if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ + commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + } + // sxDataService.getCategoryChildren(new DataBaseInfo(),"0101"); + System.out.println(sxDataService.getCategoryChildren(dataBaseInfo,"01")); //webClientService.uploudSxData(); } @@ -120,7 +130,19 @@ public class WebController { @RequestMapping("/syncStoreData") public void syncStoreData(){ - sxDataService.syncStoreData(new DataBaseInfo(),sxDataService.getCommentModel()); + CommentModel commentModel= sxDataService.getCommentModel(); + DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); + if(dataBaseInfo==null){ + log.error("syncGoods dataBaseInfo is null"); + return; + } + if(StringUtils.isEmpty(commentModel.getSyncTime())){ + commentModel =sxDataService.getCommentModel(); + } + if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ + commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + } + sxDataService.syncStoreData(dataBaseInfo,commentModel); } @@ -136,7 +158,7 @@ public class WebController { commentModel =sxDataService.getCommentModel(); } if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + commentModel.setSyncTime(DateUtil.formatDate(dataBaseInfo.getRefreshTime())); } sxDataService.syncAtive(new DataBaseInfo(),commentModel); // sxDataService.syncAtive(new DataBaseInfo(),new CommentModel()); @@ -154,7 +176,7 @@ public class WebController { commentModel =sxDataService.getCommentModel(); } if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + commentModel.setSyncTime(DateUtil.formatDate(dataBaseInfo.getRefreshTime())); } sxDataService.syncAtiveShops(new DataBaseInfo(),commentModel); //sxDataService.syncAtiveShops(new DataBaseInfo(),new CommentModel()); diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 65ab27b4..ab583823 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -55,6 +55,9 @@ public class SxDataDao extends BaseDao{ public final static String DEFAULT_IMG="https://digitalassets.tesla.com/tesla-contents/image/upload/f_auto,q_auto/Homepage-Model-Y-2-Promo-Hero-Tablet-CN.png"; + private final static String T_PUB_PLAN_MASTER="t_pub_plan_master";//活动方案表 + private final static String T_PUB_PLAN_DETAIL_B="t_pub_plan_detail_b";//活动商品表 + private final static String PLAN_NO="plan_no";//活动方案表排序字段 /** * 查找商品分类数据 * @param dataBaseInfo @@ -601,6 +604,17 @@ public class SxDataDao extends BaseDao{ where); } + /** + * + * @param dataBaseInfo + * @return + */ + public Integer getNewActiveCount(DataBaseInfo dataBaseInfo){ + String where=dataBaseInfo.getWhere()+" and rule_no in('DD','PS','PM') and range_flag='I'"; + return getBaseTotal(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(), + T_PUB_PLAN_MASTER,where); + } + /** * * @param dataBaseInfo @@ -712,4 +726,141 @@ public class SxDataDao extends BaseDao{ return clsBrandDtos; } + + /** + *获取促销活动价格 时段特价单 + * @param dataBaseInfo + * DD-直接折扣 t_pub_plan_sendext t_pub_plan_detail_b + * PS-直接特价 t_pub_plan_detail_b + * PM-im促销 t_pub_plan_detail_b + * range_flag='I' 代表按商品维度促销 + * @return + */ + public List getNewActiveList(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){ + String where=dataBaseInfo.getWhere()+" and rule_no in('DD','PS','PM') and range_flag='I'"; + ResultDto resultDto=baseFindListPage(dataBaseInfo.getIp() + ,dataBaseInfo.getUserName() + ,dataBaseInfo.getPassword() + ,dataBaseInfo.getDbPort() + ,dataBaseInfo.getDataBaseName() + ,T_PUB_PLAN_MASTER + ,PLAN_NO + ,pageNo + ,pageSize + ,where); + ResultSet rs= resultDto.getResultSet(); + List activeDtos=new ArrayList<>(); + try { + while (rs.next()) { + ActiveDto activeDto=new ActiveDto(); + String specialType=rs.getString("rule_no").trim(); + String activityName=rs.getString("plan_name").trim(); + if(specialType.equals("DD")){//折扣 + activeDto.setActivityTypeId(2); + } + if(specialType.equals("PS")||specialType.equals("PM")){//特价(秒杀) + activeDto.setActivityTypeId(1); + } + if(specialType.equals("E")){//满减 todo + + } + activeDto.setActivityName(activityName); + activeDto.setActivity_remark(rs.getString("plan_memo").trim()); + activeDto.setFlowNo(rs.getString("plan_no")); + activeDto.setActivityReleasetime(rs.getDate("oper_date")); + activeDto.setActivityStarttime(rs.getDate("begin_date")); + activeDto.setActivityEndtime(rs.getDate("end_date")); + if(DateUtil.compare(activeDto.getActivityEndtime(),DateUtil.date())>0){ + activeDto.setActivityState(1);//正常进行中 + }else { + activeDto.setActivityState(2);//结束 + } + activeDtos.add(activeDto); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + try { + resultDto.getConnection().close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + return activeDtos; + } + + + /** + * 获取折扣商品 + * @param dataBaseInfo + * @return + */ + public List getSpecShops(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){ + String where=dataBaseInfo.getWhere()+" and b.range_flag='I' and rule_no in('DD','PS','PM')"; + ResultDto resultDto=baseFindListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(), + T_PUB_PLAN_DETAIL_B,T_PUB_PLAN_MASTER,"plan_no","plan_no","flow_id","t.rule_no,t.plan_name,t.begin_date,t.end_date",pageNo,pageSize,where); + ResultSet rs= resultDto.getResultSet(); + List activeShopInfos=new ArrayList<>(); + try { + while (rs.next()) { + ActiveShopInfo activeShopInfo=new ActiveShopInfo(); + activeShopInfo.setItemNo(rs.getString("item_no").trim()); + String specialType=rs.getString("rule_no").trim(); + String activityName=rs.getString("plan_name").trim(); + if(specialType.equals("DD")){//折扣 折扣和满减分类比较多,目前只同步商品级别的 + BigDecimal discount=rs.getBigDecimal("value"); + //String discountStr=BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(10))); + // activeShopInfo.setActivityName(activityName); + activeShopInfo.setDiscount(discount); + activeShopInfo.setActivityTypeId(2); + } + if(specialType.equals("PS")||specialType.equals("PM")){//特价(秒杀) + //activeShopInfo.setActivityName(activityName); + activeShopInfo.setOldPrice(rs.getBigDecimal("num2")); + activeShopInfo.setSpecPrice(rs.getBigDecimal("value")); + activeShopInfo.setActivityTypeId(1); + } +// if(specialType.equals("FR")){//满减 todo 没有同步 +// String total1=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("old_price")); +// String max1=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("spe_price")); +// String max2=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("spe_price").add(rs.getBigDecimal("new_price1"))); +// String total2=BigDecimalFormatter.formatWithoutTrailingZeros(rs.getBigDecimal("old_price").add(rs.getBigDecimal("old_price1"))); +// activeShopInfo.setActivityName("满"+total1+"减"+max1+",满"+total2+"减"+max2); +// activeShopInfo.setActivityTypeId(3); +// } + activeShopInfo.setActivityName(activityName); + activeShopInfo.setActivityItemMinQuantity(rs.getBigDecimal("limit_qty")); + activeShopInfo.setActivityStarttime(rs.getDate("begin_date")); + activeShopInfo.setActivityEndtime(rs.getDate("end_date")); + activeShopInfo.setFlowNo(rs.getString("plan_no")); + activeShopInfo.setItemNo(rs.getString("item_no").trim()); + if(DateUtil.compare(activeShopInfo.getActivityEndtime(),DateUtil.date())>0){ + activeShopInfo.setActivityState(1);//正常进行中 + }else { + activeShopInfo.setActivityState(2);//结束 + } + activeShopInfos.add(activeShopInfo); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + try { + resultDto.getConnection().close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + return activeShopInfos; + } + + /** + * + * @param dataBaseInfo + * @return + */ + public Integer getTotalSpecShop(DataBaseInfo dataBaseInfo){ + String where=dataBaseInfo.getWhere()+" and d.range_flag='I' and rule_no in('DD','PS','PM')"; + return getTotalSpecShop(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(), + dataBaseInfo.getDataBaseName(),where); + } } diff --git a/client/src/main/java/com/small/client/service/SxDataService.java b/client/src/main/java/com/small/client/service/SxDataService.java index adc2ee3d..39b2e623 100644 --- a/client/src/main/java/com/small/client/service/SxDataService.java +++ b/client/src/main/java/com/small/client/service/SxDataService.java @@ -63,7 +63,7 @@ public interface SxDataService { * @param commentModel * @return */ - boolean syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel); + void syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel); /** * 同步活动商品 @@ -73,12 +73,4 @@ public interface SxDataService { void syncAtiveShops(DataBaseInfo dataBaseInfo,CommentModel commentModel); String getCategoryChildren(DataBaseInfo dataBaseInfo,String parentId); - - /** - * 校验是否有新的入库 - * @param dataBaseInfo - * @param refreshTime - * @return - */ - boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime); } diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 656f7f5c..be756656 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -238,6 +238,26 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return parentId; } + /** + * 获取父节点下的子节点 + * @param dataBaseInfo + * @param parentId + * @return + */ + @Override + public String getCategoryChildren(DataBaseInfo dataBaseInfo,String parentId){ + List sxSyncCategories=new SxDataDao().findTBdItemClsList(dataBaseInfo); + String childrens=commonCache.get(CommonCache.CACHE_CATEGROY+parentId); + if(StringUtils.isEmpty(childrens)){ + log.info(JSONUtil.toJsonStr(buildTree(sxSyncCategories,parentId))); + childrens=commonCache.get(CommonCache.CACHE_CATEGROY+parentId); + if(StringUtils.isEmpty(childrens)){ + return parentId; + } + } + return childrens; + } + /** * 构建树节点 * @param sxSyncCategories @@ -261,7 +281,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService public List getRootNode(List sxSyncCategories){ List rootNodeList=new ArrayList<>(); for (SxSyncCategory node : sxSyncCategories) { - if (null==node.getCls_parent()) { + if (StringUtils.isEmpty(node.getCls_parent())) { rootNodeList.add(node); } } @@ -709,10 +729,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ where+=" and b.start_date>'"+commentModel.getSyncTime()+"' "; - where+=" or b.oper_date>'"+commentModel.getSyncTime()+"' "; + // where+=" or b.oper_date>'"+commentModel.getSyncTime()+"') "; } dataBaseInfo.setWhere(where); - total = sxDataDao.getActiveCount(dataBaseInfo); + total = sxDataDao.getNewActiveCount(dataBaseInfo); if(total==0){ log.info("暂无活动同步"); return; @@ -724,7 +744,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService Date tenMinutesAgo = Date.from(Instant.now());//刷新时间 Date refreshDate= DateUtil.date(tenMinutesAgo); for (int i = 1; i <=pages; i++) { - List activeDtos= sxDataDao.getActiveList(dataBaseInfo,i,SxDataDao.PAGESIZE); + List activeDtos= sxDataDao.getNewActiveList(dataBaseInfo,i,SxDataDao.PAGESIZE); Gson gson=new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") // 设置全局 Date 格式 .create(); @@ -748,12 +768,12 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String where="where 1=1"; Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ - where+=" and start_date>'"+commentModel.getSyncTime()+"' "; - where+=" or oper_date>'"+commentModel.getSyncTime()+"' "; + where+=" and m.oper_date>'"+commentModel.getSyncTime()+"' "; + // where+=" or m.oper_date>'"+commentModel.getSyncTime()+"') "; } dataBaseInfo.setWhere(where); - total = sxDataDao.getAllSpecCount(dataBaseInfo); + total = sxDataDao.getTotalSpecShop(dataBaseInfo); if(total==0){ log.info("暂无活动商品同步"); return; @@ -765,7 +785,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService Date tenMinutesAgo = Date.from(Instant.now());//刷新时间 Date refreshDate= DateUtil.date(tenMinutesAgo);//todo 要记录刷新时间 for (int i = 1; i <=pages; i++) { - List activeDtos= sxDataDao.getAllSpecPriceList(dataBaseInfo,i,SxDataDao.PAGESIZE); + List activeDtos= sxDataDao.getSpecShops(dataBaseInfo,i,SxDataDao.PAGESIZE); Gson gson=new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") // 设置全局 Date 格式 .registerTypeAdapter(BigDecimal.class,new BigDecimalTypeAdapter()) From 2a2ec2f9b3db66eddc152db4489b3f742631e760 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 2 Aug 2025 17:22:56 +0800 Subject: [PATCH 38/64] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/small/client/dao/BaseDao.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/client/src/main/java/com/small/client/dao/BaseDao.java b/client/src/main/java/com/small/client/dao/BaseDao.java index f73f2dcd..68643583 100644 --- a/client/src/main/java/com/small/client/dao/BaseDao.java +++ b/client/src/main/java/com/small/client/dao/BaseDao.java @@ -186,8 +186,8 @@ public class BaseDao { int total=0; Connection connection=getConnection(ip,username,password,portNumber,dataBaseName); try { - String sql="select count(1) from t_pub_plan_detail_b d left join t_pub_plan_master t on " + - " d.plan_no =t.plan_no %s"; + String sql="select count(1) from t_pub_plan_detail_b d left join t_pub_plan_master m on " + + " d.plan_no =m.plan_no %s"; sql=String.format(sql,where); log.info(sql); PreparedStatement ps= connection.prepareStatement(sql); @@ -266,7 +266,7 @@ public class BaseDao { return total; } - public Integer getBaseGoodsJoinTotal(String ip, String username, String password,Integer portNumber, String dataBaseName,String where,String stockOperateWhere){ + public Integer getBaseGoodsJoinTotal(String ip, String username, String password,Integer portNumber, String dataBaseName,String where){ int total=0; Connection connection=getConnection(ip,username,password,portNumber,dataBaseName); try { @@ -278,18 +278,19 @@ public class BaseDao { " ROW_NUMBER() OVER(PARTITION BY tib.item_no ORDER BY tib.oper_date DESC) AS rn " + " FROM t_im_branch_stock tib\n" + ") " + - "SELECT count(1) " + -// " b.*, " + -// " ls.stock_qty, " + -// " ls.oper_date " + + "SELECT " + + " b.*, " + + " ls.stock_qty, " + + " ls.oper_date " + "FROM ( " + " SELECT " + " ROW_NUMBER() OVER(ORDER BY item_clsno) AS rowId, " + " * " + - " FROM t_bd_item_info shop %s" + + " FROM t_bd_item_info " + ") b " + - "LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 %s"; - sql=String.format(sql,where,stockOperateWhere); + "LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 " + + " %s"; + sql=String.format(sql,where); log.info(sql); PreparedStatement ps= connection.prepareStatement(sql); ResultSet rs=ps.executeQuery(); @@ -343,8 +344,7 @@ public class BaseDao { return resultDto; } - public ResultDto baseFindGoodsListJoinPage(String ip, String username, String password,Integer portNumber, String dataBaseName, int pageNo, int pageSize, - String where,String stockOperateWhere){ + public ResultDto baseFindGoodsListJoinPage(String ip, String username, String password,Integer portNumber, String dataBaseName, int pageNo, int pageSize,String where){ Connection connection=getConnection(ip,username,password,portNumber,dataBaseName); int start=(pageNo-1)*pageSize+1; int end=pageNo*pageSize; @@ -357,7 +357,6 @@ public class BaseDao { " FROM t_im_branch_stock tib " + ") " + "SELECT " + - "ROW_NUMBER() OVER (ORDER BY b.rowId) AS rowId, "+//-- 这里重新生成从1开始连续的行号 " b.*, " + " ls.stock_qty, " + " ls.oper_date " + @@ -365,11 +364,11 @@ public class BaseDao { " SELECT " + " ROW_NUMBER() OVER(ORDER BY item_clsno) AS rowId ," + " * " + - " FROM t_bd_item_info shop %s" + + " FROM t_bd_item_info\n" + ") b " + "LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 " + - " where b.rowId BETWEEN %s AND %s %s"; - sql=String.format(sql,where,start,end,stockOperateWhere); + " %s b.rowId BETWEEN %s AND %s "; + sql=String.format(sql,where,start,end); log.info(sql); ResultDto resultDto=new ResultDto(); ResultSet rs=null; From 2d612ecc7a4abeec3955f2c5078063a5ee2f5fa9 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 8 Aug 2025 17:08:38 +0800 Subject: [PATCH 39/64] =?UTF-8?q?=E5=95=86=E5=93=81=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=8E=BB=E9=99=A4=E7=88=B6=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/main/java/com/small/client/dao/SxDataDao.java | 2 +- .../java/com/small/client/service/imp/SxDataServiceImp.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index ab583823..b8835ee8 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -612,7 +612,7 @@ public class SxDataDao extends BaseDao{ public Integer getNewActiveCount(DataBaseInfo dataBaseInfo){ String where=dataBaseInfo.getWhere()+" and rule_no in('DD','PS','PM') and range_flag='I'"; return getBaseTotal(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(), - T_PUB_PLAN_MASTER,where); + T_PUB_PLAN_MASTER+" b",where); } /** diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index be756656..c6ff1ea0 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -728,7 +728,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String where="where 1=1"; Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ - where+=" and b.start_date>'"+commentModel.getSyncTime()+"' "; + where+=" and b.oper_date>'"+commentModel.getSyncTime()+"' "; // where+=" or b.oper_date>'"+commentModel.getSyncTime()+"') "; } dataBaseInfo.setWhere(where); From ef36db0b4490ee388a96f987e9bf6f28999c3cb9 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 8 Sep 2025 17:48:27 +0800 Subject: [PATCH 40/64] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/Schedule/DynamicTaskScheduler.java | 5 ++ .../java/com/small/client/dao/SxDataDao.java | 2 +- .../client/service/imp/SxDataServiceImp.java | 67 ++++++++++++++++--- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index 7610aec2..941406c0 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -36,6 +36,11 @@ public class DynamicTaskScheduler { @PostConstruct public void initTasks() { + //初始化 start + CommentModel commentModel =sxDataService.getCommentModel(); + DataBaseInfo enabledTask = sxDataService.getDataBaseInfo(commentModel); + executeTask(enabledTask.getDataBaseName(),commentModel); + //初始化 end refreshTasks(); // 每5分钟检查一次数据库更新 taskScheduler.scheduleAtFixedRate(this::refreshTasks, Duration.ofHours(1)); diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index b8835ee8..88fb3f51 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -52,7 +52,7 @@ public class SxDataDao extends BaseDao{ public final static String DEFALTWHERE="where 1=1"; - public final static String DEFAULT_IMG="https://digitalassets.tesla.com/tesla-contents/image/upload/f_auto,q_auto/Homepage-Model-Y-2-Promo-Hero-Tablet-CN.png"; + public final static String DEFAULT_IMG="https://media-mall-prod-1259811287.cos.ap-guangzhou.myqcloud.com/media/media/plantform/20250906/b93a9751b35a49fca6cf979829230868.png"; private final static String T_PUB_PLAN_MASTER="t_pub_plan_master";//活动方案表 diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index c6ff1ea0..ebd3a212 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -22,24 +22,31 @@ import com.small.client.service.WebClientService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.LaxRedirectStrategy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.stereotype.Service; +import org.springframework.util.MultiValueMap; import org.springframework.util.StreamUtils; import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; +import javax.net.ssl.SSLContext; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.time.Duration; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -591,12 +598,24 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService } log.info("文件下载目录: {}", downloadDirectory); HttpHeaders headers = new HttpHeaders(); - HttpEntity requestEntity = new HttpEntity<>(headers); + // headers.set("User-Agent", "Apifox/1.0.0 (https://apifox.com)"); + headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */* + headers.set("Accept-Encoding", "gzip, deflate, br"); + // 可以添加其他Apifox可能发送的头部 + headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); + headers.set("Connection", "keep-alive"); + + HttpEntity> requestEntity = new HttpEntity<>(headers); String encryptedData = getPrimaryKey(); + String url = UriComponentsBuilder.fromHttpUrl(remoteIp + HttpUtils.URL_SYNC_GET_DOWNCLIENTJAR) + .queryParam("primaryKey", encryptedData) + .queryParam("clienVersionName", versionName) + .toUriString(); + log.info("url:{}",url); + // RestTemplate myRestTemplate = createUnsafeRestTemplate(); ResponseEntity response = restTemplate.exchange( - remoteIp+HttpUtils.URL_SYNC_GET_DOWNCLIENTJAR+"?primaryKey="+encryptedData - +"&clienVersionName="+versionName, + url, HttpMethod.GET, requestEntity, Resource.class); @@ -649,6 +668,8 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return downloadDirectory+originalFileName; } + + @Override public void checkForUpdates() { log.info("curentPath:{}",JarPathUtil.getRuntimePath()); @@ -818,5 +839,35 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return map; } + /** + * 创建跳过SSL验证的RestTemplate + * 仅用于测试环境,生产环境不安全 + */ + private RestTemplate createUnsafeRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + // 配置请求参数 + RequestConfig config = RequestConfig.custom() + .setConnectTimeout(30000) + .setSocketTimeout(30000) + .setRedirectsEnabled(true) + .setMaxRedirects(10) + .build(); + + // 创建SSL上下文(信任所有证书 - 仅测试环境使用) + SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() + .loadTrustMaterial((chain, authType) -> true) + .build(); + + // 创建HttpClient,配置SSL和重定向 + CloseableHttpClient httpClient = HttpClients.custom() + .setDefaultRequestConfig(config) + .setSSLContext(sslContext) + .setRedirectStrategy(new LaxRedirectStrategy()) + .build(); + + // 创建请求工厂 + HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); + + return new RestTemplate(factory); + } } From 62eb843629bbc3f40e8978c14306e624ea7b1a61 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 11 Oct 2025 14:23:57 +0800 Subject: [PATCH 41/64] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=89=A3=E5=87=8F=E4=B8=AD=E9=97=B4=E8=A1=A8=E7=9A=84=E6=B6=88?= =?UTF-8?q?=E8=B4=B9=EF=BC=8C=E4=BF=9D=E8=AF=81=E5=BA=93=E5=AD=98=E7=9A=84?= =?UTF-8?q?=E6=89=A3=E5=87=8F=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/small/client/dao/SxDataDao.java | 46 ++++++++++++++++--- .../dto/ProductQuantityConsumptionDto.java | 3 -- .../client/service/imp/SxDataServiceImp.java | 19 +++++++- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 88fb3f51..5329c644 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -3,16 +3,25 @@ package com.small.client.dao; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.google.gson.Gson; import com.small.client.Utils.BigDecimalFormatter; +import com.small.client.Utils.CommonUtil; +import com.small.client.Utils.HttpUtils; import com.small.client.dto.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.*; import java.util.*; +import java.util.stream.Collectors; /** * 考虑到每个思迅软件都是自己的数据,所以采用动态获取的方式获取数据 @@ -22,7 +31,10 @@ import java.util.*; @Service @Slf4j public class SxDataDao extends BaseDao{ - + @Autowired + private RestTemplate restTemplate; + @Value("${remoteIp}") + private String remoteIp; private final static String T_BD_ITEM_CLS="t_bd_item_cls";//商品分类 private final static String T_BD_ITEM_INFO="t_bd_item_info b";//商品表 private final static String T_RM_VIP_INFO="t_rm_vip_info";//会员表 @@ -458,7 +470,8 @@ public class SxDataDao extends BaseDao{ * @param dataBaseInfo * @param map */ - public void updateStoreData(DataBaseInfo dataBaseInfo, Map map){ + public void updateStoreData(DataBaseInfo dataBaseInfo, Map map,List productQuantityConsumptionDtoList, + CommentModel commentModel){ if(CollectionUtil.isEmpty(map)){ log.info("同步数据为空"); return; @@ -482,8 +495,12 @@ public class SxDataDao extends BaseDao{ int count = 0; Set sme=map.entrySet(); for (Map.Entry entry : sme) { + BigDecimal stock_qty= (BigDecimal) entry.getValue(); + if(stock_qty.compareTo(BigDecimal.ZERO)==0){ + continue; + } ps.setString(1, (String) entry.getKey()); - ps.setDouble(2, (double) entry.getValue()); + ps.setDouble(2, stock_qty.doubleValue()); ps.setTimestamp(3, timestamp); ps.addBatch(); // 添加至批处理 count++; @@ -495,22 +512,37 @@ public class SxDataDao extends BaseDao{ } // 执行剩余未满 batchSize 的批次 int[] remainingCounts = ps.executeBatch(); + + List consumIds=productQuantityConsumptionDtoList + .stream() + .map(ProductQuantityConsumptionDto::getConsumeId) + .collect(Collectors.toList()); + Gson gson=new Gson(); + String jsonString=gson.toJson(consumIds); + JSONArray jsonArray = JSONUtil.parseArray(jsonString); + String sign= CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); + String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_POST_STORE_DATA_RESPONSE + +"?appKey="+commentModel.getAppKey() + +"&sign="+sign, jsonArray); + if (!HttpUtils.SUCCESSCODE.equals(code)) { + throw new Exception("服务器异常"); + } log.info("剩余批次更新数: {}", Arrays.toString(remainingCounts)); conn.commit(); // 最终提交事务 log.info("批量更新完成,总记录数: {}" , count); //baseUpdateImBrancStock(dataBaseInfo); - } catch (SQLException e) { + } catch (Exception e) { conn.rollback(); // 出错时回滚整个事务 - e.printStackTrace(); + log.info("业务失败:: {}", e.getMessage()); } } catch (SQLException e) { - e.printStackTrace(); + log.info("sql失败:: {}", e.getMessage()); }finally { if(conn!=null){ try { conn.close(); } catch (SQLException e) { - throw new RuntimeException(e); + log.info("最后sql失败:: {}", e.getMessage()); } } } diff --git a/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java b/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java index c152f6f0..70cb361e 100644 --- a/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java +++ b/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java @@ -23,9 +23,6 @@ public class ProductQuantityConsumptionDto { @ApiModelProperty("商品编号") private String productNumber; - @ApiModelProperty("商品单价,如果是切割商品要算回来每公斤多少") - private BigDecimal unitPrice; - @ApiModelProperty("数量(正数表示入库/增加,负数表示出库/减少)") private BigDecimal quantity; diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index ebd3a212..afb3e193 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -218,6 +218,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_MEMBER +"?appKey="+commentModel.getAppKey() +"&sign="+sign,memberList);//todo 后期改为文件传输 + if (!HttpUtils.SUCCESSCODE.equals(code)) { continue; } @@ -739,8 +740,22 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId(),JSONObject.class); if(null!=jsonObject.get("result")){ - Map map=(Map)jsonObject.get("result"); - sxDataDao.updateStoreData(dataBaseInfo,map); + // Map map=(Map)jsonObject.get("result"); + List productQuantityConsumptionDtoList = + JSONUtil.toList(jsonObject.getStr("result"),ProductQuantityConsumptionDto.class); + if(!productQuantityConsumptionDtoList.isEmpty()){ + Map map = productQuantityConsumptionDtoList.stream() + .collect(Collectors.groupingBy( + ProductQuantityConsumptionDto::getProductNumber, + Collectors.reducing( + BigDecimal.ZERO, + ProductQuantityConsumptionDto::getQuantity, + BigDecimal::add + ) + )); + sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoList,commentModel); + } + } } From d4a7c4b3fbe72226aaccdf166a0ffc3528aafcb5 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Wed, 29 Oct 2025 10:20:02 +0800 Subject: [PATCH 42/64] =?UTF-8?q?=E6=80=9D=E8=BF=85=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/small/client/service/imp/SxDataServiceImp.java | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index afb3e193..50ff39db 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -716,6 +716,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService DataBaseInfo dataBaseInfo=new DataBaseInfo(); if(null!=storeDbConfig){ dataBaseInfo.setIp(storeDbConfig.getDbIp()); + dataBaseInfo.setUserName(storeDbConfig.getDbUsername()); dataBaseInfo.setPassword(storeDbConfig.getDbPassword()); dataBaseInfo.setDataBaseName(storeDbConfig.getDbName()); dataBaseInfo.setDbPort(storeDbConfig.getDbPort()); From eaf1a87db8993920065ffeb1a9f79f8aaea67b4a Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 1 Nov 2025 11:16:53 +0800 Subject: [PATCH 43/64] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=94=80=E5=94=AE=E6=B5=81=E6=B0=B4=E5=92=8C=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=B5=81=E6=B0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/small/client/dao/SxDataDao.java | 362 +++++++++++++++++- .../java/com/small/client/dto/ItemInfo.java | 5 - .../dto/ProductQuantityConsumptionDto.java | 3 + .../java/com/small/client/dto/RmSaleflow.java | 4 +- .../java/com/small/client/dto/TRmPayflow.java | 3 +- .../client/service/imp/SxDataServiceImp.java | 11 +- 6 files changed, 373 insertions(+), 15 deletions(-) diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 5329c644..fb915c71 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -9,6 +9,7 @@ import com.google.gson.Gson; import com.small.client.Utils.BigDecimalFormatter; import com.small.client.Utils.CommonUtil; import com.small.client.Utils.HttpUtils; +import com.small.client.Utils.SqlBuilder; import com.small.client.dto.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; @@ -20,6 +21,7 @@ import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.*; +import java.sql.Date; import java.util.*; import java.util.stream.Collectors; @@ -50,6 +52,8 @@ public class SxDataDao extends BaseDao{ //private final static String T_IM_BRANCH_STOCK="t_im_branch_stock";//库存表 + private final static String T_BD_BRANCH_INFO="t_bd_branch_info";//仓库表 + private final static String T_IM_BRANCH_STOCK="(" + "select * from( " + " select ROW_NUMBER() OVER( " + @@ -470,17 +474,21 @@ public class SxDataDao extends BaseDao{ * @param dataBaseInfo * @param map */ - public void updateStoreData(DataBaseInfo dataBaseInfo, Map map,List productQuantityConsumptionDtoList, + public void updateStoreData(DataBaseInfo dataBaseInfo, Map map,Map pqMap,List productQuantityConsumptionDtoList, CommentModel commentModel){ if(CollectionUtil.isEmpty(map)){ log.info("同步数据为空"); return; } - Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), + String brachNo=getLocalBranch(dataBaseInfo);//获取总店铺分仓编号 + Map itemInfoMap= findItemInfoList(dataBaseInfo,map);//查询商品信息 + Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()); try { conn.setAutoCommit(false); // 关闭自动提交,开启事务 //String sql = "update t_im_branch_stock set stock_qty= stock_qty+(?),oper_date=? where item_no=?"; + List rmSaleflowList=new ArrayList<>(); + List tRmPayflowList=new ArrayList<>(); String sql = "WITH TopStock AS ( " + " SELECT TOP(1) * " + " FROM t_im_branch_stock " + @@ -491,15 +499,29 @@ public class SxDataDao extends BaseDao{ " SET stock_qty = stock_qty+(?),oper_date=?;"; Timestamp timestamp = new Timestamp(System.currentTimeMillis()); try (PreparedStatement ps = conn.prepareStatement(sql)) { - int batchSize = 1000; // 每批处理1000条 + int batchSize = 100; // 每批处理1000条 int count = 0; Set sme=map.entrySet(); for (Map.Entry entry : sme) { + BigDecimal stock_qty= (BigDecimal) entry.getValue(); if(stock_qty.compareTo(BigDecimal.ZERO)==0){ continue; } - ps.setString(1, (String) entry.getKey()); + String itemNo = (String) entry.getKey(); + ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(itemNo); + BigDecimal unitPrice = productQuantityConsumptionDto.getUnitPrice(); + RmSaleflow rmSaleflow=new RmSaleflow(); + rmSaleflow.setItemNo(itemNo); + rmSaleflow.setSalePrice(unitPrice); + rmSaleflow.setSaleQnty(stock_qty); + rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号 + rmSaleflow= fixRmSaleFlow(rmSaleflow,brachNo,itemInfoMap); + TRmPayflow trmPayflow=fixTRmPayflow(rmSaleflow); + + rmSaleflowList.add(rmSaleflow); + + ps.setString(1, itemNo); ps.setDouble(2, stock_qty.doubleValue()); ps.setTimestamp(3, timestamp); ps.addBatch(); // 添加至批处理 @@ -513,6 +535,9 @@ public class SxDataDao extends BaseDao{ // 执行剩余未满 batchSize 的批次 int[] remainingCounts = ps.executeBatch(); + //todo 新增流水 + updateStoreSaleFlow(dataBaseInfo,rmSaleflowList,tRmPayflowList); + List consumIds=productQuantityConsumptionDtoList .stream() .map(ProductQuantityConsumptionDto::getConsumeId) @@ -548,6 +573,310 @@ public class SxDataDao extends BaseDao{ } } + /** + * 补充字段 + * @param rmSaleflow + * @return + */ + public RmSaleflow fixRmSaleFlow(RmSaleflow rmSaleflow,String branchNo,Map itemInfoMap){ + //自定义单号 start + rmSaleflow.setFlowId(1); + String orderId=rmSaleflow.getFlownoRand(); + String[] orderIdSplits= orderId.split("_"); + String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd"); + String flowNo="99"+DateStr+orderIdSplits[orderIdSplits.length-1]; + rmSaleflow.setFlowNo(flowNo);//订单号 todo + //自定义 单号 end + + //判断取值 start + rmSaleflow.setSellWay("A"); + rmSaleflow.setRetQnty(rmSaleflow.getSaleQnty()); + if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ + rmSaleflow.setSellWay("B"); + BigDecimal saleQnty=rmSaleflow.getSaleQnty();//销售数量 + rmSaleflow.setSaleQnty(saleQnty); + rmSaleflow.setRetQnty(BigDecimal.ZERO); + } + //判断取值 end + + //数据库查询取值start todo + ItemInfo itemInfo=itemInfoMap.get(rmSaleflow.getItemNo()); + if(itemInfo!=null){ + rmSaleflow.setInPrice(itemInfo.getPrice()); + rmSaleflow.setOperDate(new Date(System.currentTimeMillis())); + } + rmSaleflow.setBranchNo(branchNo); + + //数据库查询取值end + + //远程配置取值start todo + rmSaleflow.setOperId("9999"); + rmSaleflow.setSaleMan("9999"); + rmSaleflow.setCounterNo("9999"); + //远程配置取值end + + //统一默认值 start + rmSaleflow.setNStan(BigDecimal.ZERO); + rmSaleflow.setChrStan("0"); + rmSaleflow.setFlownoType("0"); + rmSaleflow.setPrefAmt(BigDecimal.ZERO); + rmSaleflow.setComFlag("0"); + rmSaleflow.setRemoteFlag("0"); + //统一默认值 end + return rmSaleflow; + } + + /** + * 支付流水赋值 + * @return + */ + public TRmPayflow fixTRmPayflow(RmSaleflow rmSaleflow){ + TRmPayflow rmPayflow=new TRmPayflow(); + rmPayflow.setFlowId(rmSaleflow.getFlowId()); + rmPayflow.setFlowNo(rmSaleflow.getFlowNo()); + BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP); + rmPayflow.setSaleAmount(saleAmount); + rmPayflow.setBranchNo(rmSaleflow.getBranchNo()); + rmPayflow.setPayWay("RMB");//人民币 + rmPayflow.setSellWay(rmSaleflow.getSellWay()); + rmPayflow.setCardNo(""); + rmPayflow.setVipNo(null); + rmPayflow.setCoinNo("RMB");// + rmPayflow.setCoinRate(new BigDecimal("1"));//利率 + rmPayflow.setPayAmount(saleAmount); + rmPayflow.setOperDate(rmSaleflow.getOperDate()); + rmPayflow.setOperId(rmSaleflow.getOperId()); + rmPayflow.setCounterNo(rmSaleflow.getCounterNo()); + rmPayflow.setSaleMan(rmSaleflow.getSaleMan()); + rmPayflow.setMemo(""); + rmPayflow.setVoucherNo("");//退货单号 退货时要填 + rmPayflow.setRemoteFlag("0"); + rmPayflow.setExchangeFlag(null); + rmPayflow.setShiftNo(""); + rmPayflow.setComFlag("0"); + rmPayflow.setPosid("01"); + rmPayflow.setUptime(null); + rmPayflow.setFlownoRand(rmSaleflow.getFlownoRand()); + rmPayflow.setCiceroniNo("0"); + rmPayflow.setCiceroniId(null); + rmPayflow.setFlownoType(rmSaleflow.getFlownoType()); + rmPayflow.setTransType(null); + rmPayflow.setUpBatchno("");//todo + rmPayflow.setUpVipacc("0"); + rmPayflow.setCashNo("00"); + if("B".equals(rmSaleflow.getSellWay())){//退货 + rmPayflow.setMemo("正常退货"); + rmPayflow.setVoucherNo("");//退货单号 退货时要填 + rmPayflow.setRemoteFlag(""); + rmPayflow.setExchangeFlag("0"); + rmPayflow.setUpVipacc(null); + } + + return rmPayflow; + } + + /** + * 查询商品,返回map + * @param dataBaseInfo + * @param map + * @return + */ + public Map findItemInfoList(DataBaseInfo dataBaseInfo,Map map){ + if(CollectionUtil.isEmpty(map)){ + return null; + } + Map resultMap=new HashMap<>(); + Set sme=map.entrySet(); + String where = "where 1=1"; + List itemNos = sme.stream() + .map(entry -> (String) entry.getKey()) + .collect(Collectors.toList()); + where += SqlBuilder.buildInCondition("item_no", itemNos); + ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(), + dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_BD_ITEM_INFO,where); + ResultSet rs= resultDto.getResultSet(); + try { + while (rs.next()) { + ItemInfo itemInfo=new ItemInfo(); + String itemNo=rs.getString("item_no"); + itemInfo.setItemNo(itemNo);// + itemInfo.setItemSubno(rs.getString("item_subno")); + itemInfo.setItemName(rs.getString("item_name")); + itemInfo.setItemBrand(rs.getString("item_brand"));//品牌 + itemInfo.setPrice(rs.getBigDecimal("price"));//进货价 + itemInfo.setItemClsno(rs.getString("item_clsno")); + resultMap.put(itemNo,itemInfo); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + try { + resultDto.getConnection().close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + return resultMap; + } + + /** + * 批量新增销售流水 + * @param dataBaseInfo + * @param rmSaleflowList + */ + public void updateStoreSaleFlow(DataBaseInfo dataBaseInfo,List rmSaleflowList,List payflowList){ + if(CollectionUtil.isEmpty(rmSaleflowList)){ + log.info("销售流水记录为空"); + return; + } + Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), + dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()); + try { + conn.setAutoCommit(false); // 关闭自动提交,开启事务 + String sql = "INSERT INTO t_rm_saleflow (" + + "flow_id, flow_no, branch_no, item_no, source_price, sale_price, " + + "sale_qnty, sale_money, sell_way, oper_id, sale_man, counter_no, " + + "oper_date, remote_flag, shift_no, com_flag, spec_flag, pref_amt, " + + "in_price, n_stan, chr_stan, posid, uptime, flowno_rand, ret_qnty, " + + "flowno_type, spec_sheet_no, cic_sheet_no, share_cardid, item_no_Fresh" + + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + String sql2 = "INSERT INTO t_rm_payflow (" + + "flow_id, flow_no, sale_amount, branch_no, pay_way, sell_way, " + + "card_no, vip_no, coin_no, coin_rate, pay_amount, oper_date, " + + "oper_id, counter_no, sale_man, memo,remote_flag, " + + "exchange_flag, shift_no, com_flag, uptime, flowno_rand, " + + "ciceroni_no, ciceroni_id, flowno_type, trans_type, up_batchno, " + + "remark, cash_no" + + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try { + PreparedStatement ps = conn.prepareStatement(sql);//销售流水 + PreparedStatement ps2 = conn.prepareStatement(sql2);//资金流水 + int batchSize = 10; // 每批处理10条 + int count = 0; + for (int i=0;i productQuantityConsumptionDtoMap=new HashMap<>(); + + productQuantityConsumptionDtoList.forEach(productQuantityConsumptionDto -> { + productQuantityConsumptionDtoMap.put(productQuantityConsumptionDto.getProductNumber(),productQuantityConsumptionDto); + }); + + sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoMap,productQuantityConsumptionDtoList,commentModel); } } @@ -812,6 +818,9 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService dataBaseInfo.setWhere(where); total = sxDataDao.getTotalSpecShop(dataBaseInfo); if(total==0){ + HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_REFRESH + +"?appKey="+commentModel.getAppKey() + +"&sign="+commentModel.getAppId(), new JSONArray()); log.info("暂无活动商品同步"); return; } From accd09409d458166dbfad65919004f7f453b8c4a Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 3 Nov 2025 16:10:53 +0800 Subject: [PATCH 44/64] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=94=80=E5=94=AE=E6=B5=81=E6=B0=B4=E5=92=8C=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=B5=81=E6=B0=B4,=E8=B0=83=E4=BB=B7=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=96=B0=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/Schedule/DynamicTaskScheduler.java | 6 +- .../java/com/small/client/dao/BaseDao.java | 27 +++-- .../java/com/small/client/dao/SxDataDao.java | 113 +++++++++++++----- .../com/small/client/dto/DataBaseInfo.java | 9 ++ .../java/com/small/client/dto/RmSaleflow.java | 4 +- .../com/small/client/dto/StoreDbConfig.java | 3 + .../java/com/small/client/dto/TRmPayflow.java | 3 +- .../client/service/imp/SxDataServiceImp.java | 48 ++++++-- 8 files changed, 159 insertions(+), 54 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index 941406c0..996ff29a 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -47,9 +47,9 @@ public class DynamicTaskScheduler { } public void refreshTasks() { - if(!isRuning){ - sxDataService.checkForUpdates();//检查app更新 - } +// if(!isRuning){ +// sxDataService.checkForUpdates();//检查app更新 +// } CommentModel commentModel =sxDataService.getCommentModel(); DataBaseInfo enabledTask = sxDataService.getDataBaseInfo(commentModel); if(enabledTask == null){ diff --git a/client/src/main/java/com/small/client/dao/BaseDao.java b/client/src/main/java/com/small/client/dao/BaseDao.java index 68643583..4be3935a 100644 --- a/client/src/main/java/com/small/client/dao/BaseDao.java +++ b/client/src/main/java/com/small/client/dao/BaseDao.java @@ -266,7 +266,7 @@ public class BaseDao { return total; } - public Integer getBaseGoodsJoinTotal(String ip, String username, String password,Integer portNumber, String dataBaseName,String where){ + public Integer getBaseGoodsJoinTotal(String ip, String username, String password,Integer portNumber, String dataBaseName,String where,String stockOperateWhere){ int total=0; Connection connection=getConnection(ip,username,password,portNumber,dataBaseName); try { @@ -278,19 +278,18 @@ public class BaseDao { " ROW_NUMBER() OVER(PARTITION BY tib.item_no ORDER BY tib.oper_date DESC) AS rn " + " FROM t_im_branch_stock tib\n" + ") " + - "SELECT " + - " b.*, " + - " ls.stock_qty, " + - " ls.oper_date " + + "SELECT count(1) " + +// " b.*, " + +// " ls.stock_qty, " + +// " ls.oper_date " + "FROM ( " + " SELECT " + " ROW_NUMBER() OVER(ORDER BY item_clsno) AS rowId, " + " * " + - " FROM t_bd_item_info " + + " FROM t_bd_item_info shop %s" + ") b " + - "LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 " + - " %s"; - sql=String.format(sql,where); + "LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 %s"; + sql=String.format(sql,where,stockOperateWhere); log.info(sql); PreparedStatement ps= connection.prepareStatement(sql); ResultSet rs=ps.executeQuery(); @@ -344,7 +343,8 @@ public class BaseDao { return resultDto; } - public ResultDto baseFindGoodsListJoinPage(String ip, String username, String password,Integer portNumber, String dataBaseName, int pageNo, int pageSize,String where){ + public ResultDto baseFindGoodsListJoinPage(String ip, String username, String password,Integer portNumber, String dataBaseName, int pageNo, int pageSize, + String where,String stockOperateWhere){ Connection connection=getConnection(ip,username,password,portNumber,dataBaseName); int start=(pageNo-1)*pageSize+1; int end=pageNo*pageSize; @@ -357,6 +357,7 @@ public class BaseDao { " FROM t_im_branch_stock tib " + ") " + "SELECT " + + "ROW_NUMBER() OVER (ORDER BY b.rowId) AS rowId, "+//-- 这里重新生成从1开始连续的行号 " b.*, " + " ls.stock_qty, " + " ls.oper_date " + @@ -364,11 +365,11 @@ public class BaseDao { " SELECT " + " ROW_NUMBER() OVER(ORDER BY item_clsno) AS rowId ," + " * " + - " FROM t_bd_item_info\n" + + " FROM t_bd_item_info shop %s" + ") b " + "LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 " + - " %s b.rowId BETWEEN %s AND %s "; - sql=String.format(sql,where,start,end); + " where b.rowId BETWEEN %s AND %s %s"; + sql=String.format(sql,where,start,end,stockOperateWhere); log.info(sql); ResultDto resultDto=new ResultDto(); ResultSet rs=null; diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index fb915c71..2ce7534f 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -12,6 +12,7 @@ import com.small.client.Utils.HttpUtils; import com.small.client.Utils.SqlBuilder; import com.small.client.dto.*; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -22,6 +23,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.*; import java.sql.Date; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -54,6 +56,8 @@ public class SxDataDao extends BaseDao{ private final static String T_BD_BRANCH_INFO="t_bd_branch_info";//仓库表 + private final static String T_RM_CASHIER="t_rm_cashier";//小发收银账号 + private final static String T_IM_BRANCH_STOCK="(" + "select * from( " + " select ROW_NUMBER() OVER( " + @@ -175,7 +179,7 @@ public class SxDataDao extends BaseDao{ */ public int getTBditemInfoJoninTotal(DataBaseInfo dataBaseInfo){ return getBaseGoodsJoinTotal(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName() - ,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere()); + ,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),"where "+dataBaseInfo.getStockOperateWhere()); } /** @@ -197,7 +201,7 @@ public class SxDataDao extends BaseDao{ */ public List findBditemInfoListPage(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){ ResultDto resultDto=baseFindGoodsListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName() - ,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere()); + ,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere()," and "+dataBaseInfo.getStockOperateWhere()); ResultSet rs= resultDto.getResultSet(); List sxSyncGoodses=new ArrayList<>(); SxSyncGoods sxSyncGoods=null; @@ -515,11 +519,13 @@ public class SxDataDao extends BaseDao{ rmSaleflow.setItemNo(itemNo); rmSaleflow.setSalePrice(unitPrice); rmSaleflow.setSaleQnty(stock_qty); + rmSaleflow.setSourcePrice(unitPrice); rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号 - rmSaleflow= fixRmSaleFlow(rmSaleflow,brachNo,itemInfoMap); + rmSaleflow= fixRmSaleFlow(rmSaleflow,brachNo,itemInfoMap,dataBaseInfo.getSaleAccount()); TRmPayflow trmPayflow=fixTRmPayflow(rmSaleflow); rmSaleflowList.add(rmSaleflow); + tRmPayflowList.add(trmPayflow); ps.setString(1, itemNo); ps.setDouble(2, stock_qty.doubleValue()); @@ -578,41 +584,47 @@ public class SxDataDao extends BaseDao{ * @param rmSaleflow * @return */ - public RmSaleflow fixRmSaleFlow(RmSaleflow rmSaleflow,String branchNo,Map itemInfoMap){ + public RmSaleflow fixRmSaleFlow(RmSaleflow rmSaleflow,String branchNo,Map itemInfoMap,String saleAccount){ //自定义单号 start rmSaleflow.setFlowId(1); String orderId=rmSaleflow.getFlownoRand(); String[] orderIdSplits= orderId.split("_"); String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd"); - String flowNo="99"+DateStr+orderIdSplits[orderIdSplits.length-1]; + String number= String.format("%04d", Integer.valueOf(orderIdSplits[orderIdSplits.length-1])); + String flowNo="99"+DateStr+number; rmSaleflow.setFlowNo(flowNo);//订单号 todo //自定义 单号 end //判断取值 start - rmSaleflow.setSellWay("A"); + rmSaleflow.setSellWay("B"); rmSaleflow.setRetQnty(rmSaleflow.getSaleQnty()); if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ - rmSaleflow.setSellWay("B"); + rmSaleflow.setSellWay("A"); BigDecimal saleQnty=rmSaleflow.getSaleQnty();//销售数量 rmSaleflow.setSaleQnty(saleQnty); rmSaleflow.setRetQnty(BigDecimal.ZERO); } + BigDecimal saleMoney=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()); + if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ + saleMoney=saleMoney.multiply(new BigDecimal("-1")); + } + rmSaleflow.setSaleMoney(saleMoney); //判断取值 end //数据库查询取值start todo ItemInfo itemInfo=itemInfoMap.get(rmSaleflow.getItemNo()); if(itemInfo!=null){ rmSaleflow.setInPrice(itemInfo.getPrice()); - rmSaleflow.setOperDate(new Date(System.currentTimeMillis())); + rmSaleflow.setOperDate(new Timestamp(System.currentTimeMillis())); } rmSaleflow.setBranchNo(branchNo); //数据库查询取值end //远程配置取值start todo - rmSaleflow.setOperId("9999"); - rmSaleflow.setSaleMan("9999"); - rmSaleflow.setCounterNo("9999"); + rmSaleflow.setOperId(saleAccount); + rmSaleflow.setSaleMan(saleAccount); + rmSaleflow.setCounterNo(saleAccount); //远程配置取值end //统一默认值 start @@ -635,6 +647,9 @@ public class SxDataDao extends BaseDao{ rmPayflow.setFlowId(rmSaleflow.getFlowId()); rmPayflow.setFlowNo(rmSaleflow.getFlowNo()); BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP); + if(saleAmount.compareTo(BigDecimal.ZERO)<0){ + saleAmount=saleAmount.multiply(new BigDecimal("-1")); + } rmPayflow.setSaleAmount(saleAmount); rmPayflow.setBranchNo(rmSaleflow.getBranchNo()); rmPayflow.setPayWay("RMB");//人民币 @@ -644,14 +659,14 @@ public class SxDataDao extends BaseDao{ rmPayflow.setCoinNo("RMB");// rmPayflow.setCoinRate(new BigDecimal("1"));//利率 rmPayflow.setPayAmount(saleAmount); - rmPayflow.setOperDate(rmSaleflow.getOperDate()); + rmPayflow.setOperDate(new Timestamp(System.currentTimeMillis())); rmPayflow.setOperId(rmSaleflow.getOperId()); rmPayflow.setCounterNo(rmSaleflow.getCounterNo()); rmPayflow.setSaleMan(rmSaleflow.getSaleMan()); rmPayflow.setMemo(""); rmPayflow.setVoucherNo("");//退货单号 退货时要填 rmPayflow.setRemoteFlag("0"); - rmPayflow.setExchangeFlag(null); + rmPayflow.setExchangeFlag("0"); rmPayflow.setShiftNo(""); rmPayflow.setComFlag("0"); rmPayflow.setPosid("01"); @@ -687,7 +702,7 @@ public class SxDataDao extends BaseDao{ } Map resultMap=new HashMap<>(); Set sme=map.entrySet(); - String where = "where 1=1"; + String where = "where 1=1 and "; List itemNos = sme.stream() .map(entry -> (String) entry.getKey()) .collect(Collectors.toList()); @@ -698,13 +713,23 @@ public class SxDataDao extends BaseDao{ try { while (rs.next()) { ItemInfo itemInfo=new ItemInfo(); - String itemNo=rs.getString("item_no"); + String itemNo=rs.getString("item_no").trim(); itemInfo.setItemNo(itemNo);// - itemInfo.setItemSubno(rs.getString("item_subno")); - itemInfo.setItemName(rs.getString("item_name")); - itemInfo.setItemBrand(rs.getString("item_brand"));//品牌 - itemInfo.setPrice(rs.getBigDecimal("price"));//进货价 - itemInfo.setItemClsno(rs.getString("item_clsno")); + if(StringUtils.isNotEmpty(rs.getString("item_subno"))){ + itemInfo.setItemSubno(rs.getString("item_subno").trim()); + } + if(StringUtils.isNotEmpty(rs.getString("item_name"))){ + itemInfo.setItemName(rs.getString("item_name").trim()); + } + if(StringUtils.isNotEmpty(rs.getString("item_brand"))){ + itemInfo.setItemBrand(rs.getString("item_brand").trim());//品牌 + } + if(StringUtils.isNotEmpty(rs.getString("price"))){ + itemInfo.setPrice(rs.getBigDecimal("price"));//进货价 + } + if(StringUtils.isNotEmpty(rs.getString("item_clsno"))){ + itemInfo.setItemClsno(rs.getString("item_clsno").trim()); + } resultMap.put(itemNo,itemInfo); } } catch (SQLException e) { @@ -747,7 +772,7 @@ public class SxDataDao extends BaseDao{ "exchange_flag, shift_no, com_flag, uptime, flowno_rand, " + "ciceroni_no, ciceroni_id, flowno_type, trans_type, up_batchno, " + "remark, cash_no" + - ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; try { PreparedStatement ps = conn.prepareStatement(sql);//销售流水 PreparedStatement ps2 = conn.prepareStatement(sql2);//资金流水 @@ -763,18 +788,23 @@ public class SxDataDao extends BaseDao{ ps.setBigDecimal(5, rmSaleflow.getSourcePrice()); ps.setBigDecimal(6, rmSaleflow.getSalePrice()); - ps.setBigDecimal(7, rmSaleflow.getSaleQnty()); + BigDecimal saleQnty=rmSaleflow.getSaleQnty(); + if(saleQnty.compareTo(BigDecimal.ZERO)<0){ + saleQnty=saleQnty.multiply(new BigDecimal("-1")); + } + ps.setBigDecimal(7,saleQnty); + ps.setBigDecimal(8, rmSaleflow.getSaleMoney()); ps.setString(9, rmSaleflow.getSellWay()); ps.setString(10, rmSaleflow.getOperId()); ps.setString(11, rmSaleflow.getSaleMan()); ps.setString(12, rmSaleflow.getCounterNo()); - ps.setDate(13, rmSaleflow.getOperDate());//OperDate + ps.setTimestamp(13, rmSaleflow.getOperDate());//OperDate ps.setString(14, rmSaleflow.getRemoteFlag()); - ps.setString(15, rmSaleflow.getShiftNo()); + ps.setString(15, "");//ShiftNo ps.setString(16, rmSaleflow.getComFlag()); - ps.setString(17, rmSaleflow.getSpecFlag()); + ps.setString(17, "");//SpecFlag ps.setBigDecimal(18, rmSaleflow.getPrefAmt()); ps.setBigDecimal(19, rmSaleflow.getInPrice()); @@ -787,7 +817,7 @@ public class SxDataDao extends BaseDao{ ps.setString(26, rmSaleflow.getFlownoType()); ps.setString(27, rmSaleflow.getSpecSheetNo()); - ps.setString(28, rmSaleflow.getCicSheetNo()); + ps.setString(28, "");//CicSheetNo ps.setString(29, rmSaleflow.getShareCardid()); ps.setString(30, rmSaleflow.getItemNoFresh()); @@ -810,7 +840,7 @@ public class SxDataDao extends BaseDao{ ps2.setString(9, rmPayflow.getCoinNo()); ps2.setBigDecimal(10, rmPayflow.getCoinRate()); ps2.setBigDecimal(11, rmPayflow.getPayAmount()); - ps2.setDate(12, rmPayflow.getOperDate()); + ps2.setTimestamp(12, rmPayflow.getOperDate()); ps2.setString(13, rmPayflow.getOperId());//OperDate ps2.setString(14, rmPayflow.getCounterNo()); @@ -820,7 +850,7 @@ public class SxDataDao extends BaseDao{ ps2.setString(17, rmPayflow.getRemoteFlag()); ps2.setString(18, rmPayflow.getExchangeFlag()); - ps2.setString(29, rmPayflow.getShiftNo()); + ps2.setString(19, rmPayflow.getShiftNo()); ps2.setString(20, rmPayflow.getComFlag()); //ps2.setString(22, rmPayflow.getPosid()); ps2.setTimestamp(21, null);//Uptime @@ -853,7 +883,7 @@ public class SxDataDao extends BaseDao{ int[] remainingCounts = ps.executeBatch(); int[] remainingCounts2 = ps2.executeBatch(); log.info("销售流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts)); - log.info("支付流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts)); + log.info("支付流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts2)); conn.commit(); // 最终提交事务 log.info("销售-支付-流水记录批量更新完成,总记录数: {}" , count); //baseUpdateImBrancStock(dataBaseInfo); @@ -1249,4 +1279,29 @@ public class SxDataDao extends BaseDao{ } return branch_no; } + + /** + * 获取小发账号 + * @return + */ + public String getTRmCashier(DataBaseInfo dataBaseInfo,String accountNo){ + ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(), + dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_RM_CASHIER,"where cashier_id='"+accountNo+"'"); + ResultSet rs= resultDto.getResultSet(); + String cashier_id = ""; + try { + while (rs.next()) { + cashier_id=rs.getString("cashier_id");// + } + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + try { + resultDto.getConnection().close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + return cashier_id; + } } diff --git a/client/src/main/java/com/small/client/dto/DataBaseInfo.java b/client/src/main/java/com/small/client/dto/DataBaseInfo.java index f19bfbb3..bfe770c3 100644 --- a/client/src/main/java/com/small/client/dto/DataBaseInfo.java +++ b/client/src/main/java/com/small/client/dto/DataBaseInfo.java @@ -41,4 +41,13 @@ public class DataBaseInfo { @ApiModelProperty(value = "间隔时间") private String shopGapTime; + + @ApiModelProperty(value = "调价时间") + private String priceOperatiem; + + @ApiModelProperty(value = "库存条件") + private String stockOperateWhere; + + @ApiModelProperty(value = "营业员账号") + private String saleAccount; } diff --git a/client/src/main/java/com/small/client/dto/RmSaleflow.java b/client/src/main/java/com/small/client/dto/RmSaleflow.java index 09f99b6d..56c0e2e6 100644 --- a/client/src/main/java/com/small/client/dto/RmSaleflow.java +++ b/client/src/main/java/com/small/client/dto/RmSaleflow.java @@ -4,6 +4,7 @@ import lombok.Data; import java.math.BigDecimal; import java.sql.Date; +import java.sql.Timestamp; @Data public class RmSaleflow { @@ -20,7 +21,7 @@ public class RmSaleflow { private String operId; private String saleMan; private String counterNo; - private Date operDate; + private Timestamp operDate; private String remoteFlag; private String shiftNo; private String comFlag; @@ -38,4 +39,5 @@ public class RmSaleflow { private String cicSheetNo; private String shareCardid; private String itemNoFresh; + } diff --git a/client/src/main/java/com/small/client/dto/StoreDbConfig.java b/client/src/main/java/com/small/client/dto/StoreDbConfig.java index 7aead91d..780178ee 100644 --- a/client/src/main/java/com/small/client/dto/StoreDbConfig.java +++ b/client/src/main/java/com/small/client/dto/StoreDbConfig.java @@ -71,4 +71,7 @@ public class StoreDbConfig implements Serializable { @ApiModelProperty("商品同步间隔时间") private String shopGapTime; + + @ApiModelProperty(value = "营业员账号") + private String saleAccount; } diff --git a/client/src/main/java/com/small/client/dto/TRmPayflow.java b/client/src/main/java/com/small/client/dto/TRmPayflow.java index 436ac351..1faf7f23 100644 --- a/client/src/main/java/com/small/client/dto/TRmPayflow.java +++ b/client/src/main/java/com/small/client/dto/TRmPayflow.java @@ -4,6 +4,7 @@ import lombok.Data; import java.math.BigDecimal; import java.sql.Date; +import java.sql.Timestamp; @Data public class TRmPayflow { @@ -70,7 +71,7 @@ public class TRmPayflow { /** * 操作时间 */ - private Date operDate; + private Timestamp operDate; /** * 操作员ID diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 344a8cda..9ac6cad1 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -142,9 +142,11 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService syncAllGoods(dataBaseInfo, commentModel); break; case "02"://增量 todo test + String sycnTime=commentModel.getSyncTime(); syncIncrementAddGoods(dataBaseInfo, commentModel); - syncIncrementModifyGoods(dataBaseInfo, commentModel); + // syncIncrementModifyGoods(dataBaseInfo, commentModel); syncIncrementStock(dataBaseInfo, commentModel); + syncFlowPrice(dataBaseInfo, commentModel,sycnTime); break; } @@ -324,21 +326,37 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService */ private void syncAllGoods(DataBaseInfo dataBaseInfo, CommentModel commentModel){ //String where="where 1=1"; - String where="where b.status='1'"; + String where="where shop.status='1'"; Integer total =0; String parentId=getAndCacheTree(dataBaseInfo,dataBaseInfo.getCategoryName());//加载缓存用的 if(DicEnum.SYNCTYPE_02.getCode().equals(dataBaseInfo.getSyncType())){ if (StringUtils.isNotEmpty(dataBaseInfo.getCategoryName())) { //syncGoodsSearchModel.setItemClsno(childrens); String childrens= commonCache.get(CommonCache.CACHE_CATEGROY+parentId); - where += " and b.item_clsno in ('" + childrens + "')"; + where += " and shop.item_clsno in ('" + childrens + "')"; } if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ - where+=" and b.modify_date>'"+commentModel.getSyncTime()+"' "; - where+=" or b.build_date>'"+commentModel.getSyncTime()+"' "; + where+=" and shop.modify_date>'"+commentModel.getSyncTime()+"' "; + where+=" or shop.build_date>'"+commentModel.getSyncTime()+"' "; } if(StringUtils.isNotEmpty(dataBaseInfo.getOperDate())){ - where+=" and ls.oper_date>'"+dataBaseInfo.getOperDate()+"' "; + String stockOperateWhere=" ls.oper_date>'"+dataBaseInfo.getOperDate()+"' "; + dataBaseInfo.setStockOperateWhere(stockOperateWhere); + } + if(StringUtils.isNotEmpty(dataBaseInfo.getPriceOperatiem())){ + where+=" and EXISTS ( " + + " select " + + " shop.item_no " + + " from " + + " t_pc_price_flow_detail tpfd " + + " inner join t_pc_price_flow_master tppfm " + + " on " + + " tpfd.sheet_no = tppfm.sheet_no " + + " where " + + " tppfm.valid_flag = '1' " +//有效 + " and shop.item_no=tpfd.item_no " + + " and tppfm.oper_date >'"+dataBaseInfo.getPriceOperatiem()+"' " + + " )"; } dataBaseInfo.setWhere(where); // 记录总数 @@ -351,7 +369,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.info("暂无商品同步"); return; } - where+=" and"; + //where+=" and"; dataBaseInfo.setWhere(where); // 总页数 @@ -458,6 +476,16 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService syncAllGoods(dataBaseInfo,commentModel); } + /** + * 增量同步 调价单变化 + */ + private void syncFlowPrice(DataBaseInfo dataBaseInfo, CommentModel commentModel,String sycnTime){ + dataBaseInfo.setPriceOperatiem(sycnTime); + commentModel.setSyncTime(""); + dataBaseInfo.setOperDate(""); + syncAllGoods(dataBaseInfo,commentModel); + } + /** *获取特价商品 * @param dataBaseInfo @@ -726,6 +754,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService dataBaseInfo.setRefreshTime(storeDbConfig.getRefreshTime()); dataBaseInfo.setIsTowSync(storeDbConfig.getIsTowSync()); dataBaseInfo.setShopGapTime(storeDbConfig.getShopGapTime()); + dataBaseInfo.setSaleAccount(storeDbConfig.getSaleAccount()); return dataBaseInfo; } return new DataBaseInfo(); @@ -737,6 +766,11 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.info("不做双向同步数据库"); return; } + String saleAccount= sxDataDao.getTRmCashier(dataBaseInfo,dataBaseInfo.getSaleAccount()); + if(StringUtils.isEmpty(saleAccount)){ + log.error("需要配置商城收银人员"); + return; + } JSONObject jsonObject= restTemplate.getForObject(remoteIp+HttpUtils.URL_SYNC_GET_STOR_DATA_RELEASE +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId(),JSONObject.class); From 10fa6fd7398a272129cf79582254e9b71e304d68 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 3 Nov 2025 18:00:47 +0800 Subject: [PATCH 45/64] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/small/client/dao/BaseDao.java | 4 +- .../java/com/small/client/dao/SxDataDao.java | 14 ++++-- .../client/service/imp/SxDataServiceImp.java | 45 ++----------------- 3 files changed, 16 insertions(+), 47 deletions(-) diff --git a/client/src/main/java/com/small/client/dao/BaseDao.java b/client/src/main/java/com/small/client/dao/BaseDao.java index 4be3935a..f73f2dcd 100644 --- a/client/src/main/java/com/small/client/dao/BaseDao.java +++ b/client/src/main/java/com/small/client/dao/BaseDao.java @@ -186,8 +186,8 @@ public class BaseDao { int total=0; Connection connection=getConnection(ip,username,password,portNumber,dataBaseName); try { - String sql="select count(1) from t_pub_plan_detail_b d left join t_pub_plan_master m on " + - " d.plan_no =m.plan_no %s"; + String sql="select count(1) from t_pub_plan_detail_b d left join t_pub_plan_master t on " + + " d.plan_no =t.plan_no %s"; sql=String.format(sql,where); log.info(sql); PreparedStatement ps= connection.prepareStatement(sql); diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 2ce7534f..2a7a6e3d 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -178,8 +178,12 @@ public class SxDataDao extends BaseDao{ * @return */ public int getTBditemInfoJoninTotal(DataBaseInfo dataBaseInfo){ + String stockOperateWhere=""; + if(StringUtils.isNotEmpty(dataBaseInfo.getStockOperateWhere())){ + stockOperateWhere="where "+dataBaseInfo.getStockOperateWhere(); + } return getBaseGoodsJoinTotal(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName() - ,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),"where "+dataBaseInfo.getStockOperateWhere()); + ,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),stockOperateWhere); } /** @@ -200,8 +204,12 @@ public class SxDataDao extends BaseDao{ * @param pageSize */ public List findBditemInfoListPage(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){ + String stockOperateWhere=""; + if(StringUtils.isNotEmpty(dataBaseInfo.getStockOperateWhere())){ + stockOperateWhere=" and "+dataBaseInfo.getStockOperateWhere(); + } ResultDto resultDto=baseFindGoodsListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName() - ,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere()," and "+dataBaseInfo.getStockOperateWhere()); + ,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),stockOperateWhere); ResultSet rs= resultDto.getResultSet(); List sxSyncGoodses=new ArrayList<>(); SxSyncGoods sxSyncGoods=null; @@ -1134,7 +1142,7 @@ public class SxDataDao extends BaseDao{ ,dataBaseInfo.getPassword() ,dataBaseInfo.getDbPort() ,dataBaseInfo.getDataBaseName() - ,T_PUB_PLAN_MASTER + ,T_PUB_PLAN_MASTER +" b" ,PLAN_NO ,pageNo ,pageSize diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 9ac6cad1..5a0c1735 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -22,31 +22,22 @@ import com.small.client.service.WebClientService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.client.LaxRedirectStrategy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; import org.springframework.http.*; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.stereotype.Service; import org.springframework.util.MultiValueMap; import org.springframework.util.StreamUtils; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import javax.net.ssl.SSLContext; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -694,7 +685,8 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.error("文件下载失败:{}",e.getMessage()); return null; } - return downloadDirectory+originalFileName; + File file=new File(downloadDirectory+originalFileName); + return file.length()>0?downloadDirectory+originalFileName:null; } @@ -845,7 +837,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String where="where 1=1"; Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ - where+=" and m.oper_date>'"+commentModel.getSyncTime()+"' "; + where+=" and t.oper_date>'"+commentModel.getSyncTime()+"' "; // where+=" or m.oper_date>'"+commentModel.getSyncTime()+"') "; } @@ -898,35 +890,4 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return map; } - /** - * 创建跳过SSL验证的RestTemplate - * 仅用于测试环境,生产环境不安全 - */ - private RestTemplate createUnsafeRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { - // 配置请求参数 - RequestConfig config = RequestConfig.custom() - .setConnectTimeout(30000) - .setSocketTimeout(30000) - .setRedirectsEnabled(true) - .setMaxRedirects(10) - .build(); - - // 创建SSL上下文(信任所有证书 - 仅测试环境使用) - SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() - .loadTrustMaterial((chain, authType) -> true) - .build(); - - // 创建HttpClient,配置SSL和重定向 - CloseableHttpClient httpClient = HttpClients.custom() - .setDefaultRequestConfig(config) - .setSSLContext(sslContext) - .setRedirectStrategy(new LaxRedirectStrategy()) - .build(); - - // 创建请求工厂 - HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); - - return new RestTemplate(factory); - } - } From d59096f6d31073b7fbc265815dc08865902474c2 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 3 Nov 2025 18:01:03 +0800 Subject: [PATCH 46/64] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/small/client/Schedule/DynamicTaskScheduler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index 996ff29a..941406c0 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -47,9 +47,9 @@ public class DynamicTaskScheduler { } public void refreshTasks() { -// if(!isRuning){ -// sxDataService.checkForUpdates();//检查app更新 -// } + if(!isRuning){ + sxDataService.checkForUpdates();//检查app更新 + } CommentModel commentModel =sxDataService.getCommentModel(); DataBaseInfo enabledTask = sxDataService.getDataBaseInfo(commentModel); if(enabledTask == null){ From 31160d480663f2629c5a4303862b6ba2ec439635 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Tue, 4 Nov 2025 11:42:08 +0800 Subject: [PATCH 47/64] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=E6=96=B9=E6=A1=88=E4=BF=AE=E5=A4=8D=E6=8E=89=E7=BA=BF=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=AF=BC=E8=87=B4=E7=9A=84=E9=87=8D=E5=A4=8D=E6=B6=88?= =?UTF-8?q?=E8=B4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/small/client/dao/SxDataDao.java | 37 +++++++------------ .../client/service/imp/SxDataServiceImp.java | 2 +- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 2a7a6e3d..2eab7769 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -550,7 +550,7 @@ public class SxDataDao extends BaseDao{ int[] remainingCounts = ps.executeBatch(); //todo 新增流水 - updateStoreSaleFlow(dataBaseInfo,rmSaleflowList,tRmPayflowList); + updateStoreSaleFlow(conn,rmSaleflowList,tRmPayflowList); List consumIds=productQuantityConsumptionDtoList .stream() @@ -566,7 +566,7 @@ public class SxDataDao extends BaseDao{ if (!HttpUtils.SUCCESSCODE.equals(code)) { throw new Exception("服务器异常"); } - log.info("剩余批次更新数: {}", Arrays.toString(remainingCounts)); + log.info("库存更新剩余批次更新数: {}", Arrays.toString(remainingCounts)); conn.commit(); // 最终提交事务 log.info("批量更新完成,总记录数: {}" , count); //baseUpdateImBrancStock(dataBaseInfo); @@ -754,18 +754,18 @@ public class SxDataDao extends BaseDao{ /** * 批量新增销售流水 - * @param dataBaseInfo + * @param conn * @param rmSaleflowList */ - public void updateStoreSaleFlow(DataBaseInfo dataBaseInfo,List rmSaleflowList,List payflowList){ + public void updateStoreSaleFlow(Connection conn,List rmSaleflowList,List payflowList){ if(CollectionUtil.isEmpty(rmSaleflowList)){ log.info("销售流水记录为空"); return; } - Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), - dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()); - try { - conn.setAutoCommit(false); // 关闭自动提交,开启事务 +// Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(), +// dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()); + //try { + //conn.setAutoCommit(false); // 关闭自动提交,开启事务 String sql = "INSERT INTO t_rm_saleflow (" + "flow_id, flow_no, branch_no, item_no, source_price, sale_price, " + "sale_qnty, sale_money, sell_way, oper_id, sale_man, counter_no, " + @@ -892,27 +892,18 @@ public class SxDataDao extends BaseDao{ int[] remainingCounts2 = ps2.executeBatch(); log.info("销售流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts)); log.info("支付流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts2)); - conn.commit(); // 最终提交事务 + //conn.commit(); // 最终提交事务 log.info("销售-支付-流水记录批量更新完成,总记录数: {}" , count); //baseUpdateImBrancStock(dataBaseInfo); } catch (Exception e) { - conn.rollback(); // 出错时回滚整个事务 + // conn.rollback(); // 出错时回滚整个事务 log.info("销售支付流水记录业务失败:: {}", e.getMessage()); throw new RuntimeException("销售支付流水记录业务失败:: {}"+e.getMessage()); } - } catch (SQLException e) { - log.info("sql失败:: {}", e.getMessage()); - throw new RuntimeException("sql失败:: {}"+e.getMessage()); - }finally { - if(conn!=null){ - try { - conn.close(); - } catch (SQLException e) { - log.info("最后sql失败:: {}", e.getMessage()); - throw new RuntimeException("sql关闭失败:: {}"+e.getMessage()); - } - } - } +// } catch (SQLException e) { +// log.info("sql失败:: {}", e.getMessage()); +// throw new RuntimeException("sql失败:: {}"+e.getMessage()); +// } } /** diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 5a0c1735..5189b4f9 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -397,7 +397,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService +"&syncType="+DicEnum.MUAL_1.getCode() +"&refreshDateStr="+refreshDate, JSONUtil.parseArray(folders)); - log.info("商品分类总共有{}条数据,同步完成{}条",total,syncCount); + log.info("商品总共有{}条数据,同步完成{}条",total,syncCount); String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_GOODS_READ +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId() From c8a85d51192494f87fc19d7d8af1562fd7831c02 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 7 Nov 2025 10:06:53 +0800 Subject: [PATCH 48/64] =?UTF-8?q?=E6=B5=81=E6=B0=B4=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/Schedule/DynamicTaskScheduler.java | 3 + .../client/controller/WebController.java | 2 +- .../java/com/small/client/dao/SxDataDao.java | 75 +++++++++++++------ .../com/small/client/dto/DataBaseInfo.java | 2 +- .../dto/ProductQuantityConsumptionDto.java | 3 + .../client/service/imp/SxDataServiceImp.java | 13 ++-- 6 files changed, 69 insertions(+), 29 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index 941406c0..23b9bf55 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -96,6 +96,9 @@ public class DynamicTaskScheduler { commentModel =sxDataService.getCommentModel(); } DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); + if(dataBaseInfo==null||StringUtils.isEmpty(dataBaseInfo.getUserName())){ + return; + } if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); } diff --git a/client/src/main/java/com/small/client/controller/WebController.java b/client/src/main/java/com/small/client/controller/WebController.java index 21d45b73..0acedea2 100644 --- a/client/src/main/java/com/small/client/controller/WebController.java +++ b/client/src/main/java/com/small/client/controller/WebController.java @@ -75,7 +75,7 @@ public class WebController { //sxDataService.getAppSign(); CommentModel commentModel= sxDataService.getCommentModel(); DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel); - if(dataBaseInfo==null){ + if(dataBaseInfo==null||StringUtils.isEmpty(dataBaseInfo.getUserName())){ log.error("syncGoods dataBaseInfo is null"); return; } diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 2eab7769..d9de60c4 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -515,20 +515,22 @@ public class SxDataDao extends BaseDao{ int count = 0; Set sme=map.entrySet(); for (Map.Entry entry : sme) { - + String key=entry.getKey().toString(); + String[] splitKey = key.split("-"); + if(splitKey.length!=2){ + continue; + } + String itemNo = splitKey[1]; BigDecimal stock_qty= (BigDecimal) entry.getValue(); + if(stock_qty.compareTo(BigDecimal.ZERO)==0){ continue; } - String itemNo = (String) entry.getKey(); ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(itemNo); - BigDecimal unitPrice = productQuantityConsumptionDto.getUnitPrice(); - RmSaleflow rmSaleflow=new RmSaleflow(); - rmSaleflow.setItemNo(itemNo); - rmSaleflow.setSalePrice(unitPrice); - rmSaleflow.setSaleQnty(stock_qty); - rmSaleflow.setSourcePrice(unitPrice); - rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号 + if(productQuantityConsumptionDto.getSaleAmount().compareTo(BigDecimal.ZERO)==0){ + continue; + } + RmSaleflow rmSaleflow = getRmSaleflow(productQuantityConsumptionDto, itemNo, stock_qty); rmSaleflow= fixRmSaleFlow(rmSaleflow,brachNo,itemInfoMap,dataBaseInfo.getSaleAccount()); TRmPayflow trmPayflow=fixTRmPayflow(rmSaleflow); @@ -587,6 +589,25 @@ public class SxDataDao extends BaseDao{ } } + /** + * 封装对象 + * @param productQuantityConsumptionDto + * @param itemNo + * @param stock_qty + * @return + */ + private RmSaleflow getRmSaleflow(ProductQuantityConsumptionDto productQuantityConsumptionDto, String itemNo, BigDecimal stock_qty) { + BigDecimal unitPrice = productQuantityConsumptionDto.getUnitPrice(); + RmSaleflow rmSaleflow=new RmSaleflow(); + rmSaleflow.setItemNo(itemNo); + rmSaleflow.setSalePrice(unitPrice); + rmSaleflow.setSaleQnty(stock_qty); + rmSaleflow.setSaleMoney(productQuantityConsumptionDto.getSaleAmount()); + // rmSaleflow.setSourcePrice(unitPrice); + rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号 + return rmSaleflow; + } + /** * 补充字段 * @param rmSaleflow @@ -597,7 +618,8 @@ public class SxDataDao extends BaseDao{ rmSaleflow.setFlowId(1); String orderId=rmSaleflow.getFlownoRand(); String[] orderIdSplits= orderId.split("_"); - String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd"); + //String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd"); + String DateStr=orderIdSplits[1]; String number= String.format("%04d", Integer.valueOf(orderIdSplits[orderIdSplits.length-1])); String flowNo="99"+DateStr+number; rmSaleflow.setFlowNo(flowNo);//订单号 todo @@ -612,17 +634,18 @@ public class SxDataDao extends BaseDao{ rmSaleflow.setSaleQnty(saleQnty); rmSaleflow.setRetQnty(BigDecimal.ZERO); } - BigDecimal saleMoney=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()); - if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ - saleMoney=saleMoney.multiply(new BigDecimal("-1")); - } - rmSaleflow.setSaleMoney(saleMoney); +// BigDecimal saleMoney=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()); +// if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){ +// saleMoney=saleMoney.multiply(new BigDecimal("-1")); +// } +// rmSaleflow.setSaleMoney(saleMoney); //判断取值 end //数据库查询取值start todo ItemInfo itemInfo=itemInfoMap.get(rmSaleflow.getItemNo()); if(itemInfo!=null){ rmSaleflow.setInPrice(itemInfo.getPrice()); + rmSaleflow.setSourcePrice(itemInfo.getSalePrice()); rmSaleflow.setOperDate(new Timestamp(System.currentTimeMillis())); } rmSaleflow.setBranchNo(branchNo); @@ -654,11 +677,12 @@ public class SxDataDao extends BaseDao{ TRmPayflow rmPayflow=new TRmPayflow(); rmPayflow.setFlowId(rmSaleflow.getFlowId()); rmPayflow.setFlowNo(rmSaleflow.getFlowNo()); - BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP); - if(saleAmount.compareTo(BigDecimal.ZERO)<0){ - saleAmount=saleAmount.multiply(new BigDecimal("-1")); - } - rmPayflow.setSaleAmount(saleAmount); +// BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP); +// if(saleAmount.compareTo(BigDecimal.ZERO)<0){ +// saleAmount=saleAmount.multiply(new BigDecimal("-1")); +// } +// rmPayflow.setSaleAmount(saleAmount); + rmPayflow.setSaleAmount(rmSaleflow.getSaleMoney()); rmPayflow.setBranchNo(rmSaleflow.getBranchNo()); rmPayflow.setPayWay("RMB");//人民币 rmPayflow.setSellWay(rmSaleflow.getSellWay()); @@ -666,7 +690,7 @@ public class SxDataDao extends BaseDao{ rmPayflow.setVipNo(null); rmPayflow.setCoinNo("RMB");// rmPayflow.setCoinRate(new BigDecimal("1"));//利率 - rmPayflow.setPayAmount(saleAmount); + rmPayflow.setPayAmount(rmSaleflow.getSaleMoney()); rmPayflow.setOperDate(new Timestamp(System.currentTimeMillis())); rmPayflow.setOperId(rmSaleflow.getOperId()); rmPayflow.setCounterNo(rmSaleflow.getCounterNo()); @@ -712,7 +736,11 @@ public class SxDataDao extends BaseDao{ Set sme=map.entrySet(); String where = "where 1=1 and "; List itemNos = sme.stream() - .map(entry -> (String) entry.getKey()) + .map(entry -> { + String key= (String) entry.getKey(); + String[] split = key.split("-"); + return split[1]; + }) .collect(Collectors.toList()); where += SqlBuilder.buildInCondition("item_no", itemNos); ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(), @@ -738,6 +766,9 @@ public class SxDataDao extends BaseDao{ if(StringUtils.isNotEmpty(rs.getString("item_clsno"))){ itemInfo.setItemClsno(rs.getString("item_clsno").trim()); } + if(StringUtils.isNotEmpty(rs.getString("sale_price"))){ + itemInfo.setSalePrice(rs.getBigDecimal("sale_price")); + } resultMap.put(itemNo,itemInfo); } } catch (SQLException e) { diff --git a/client/src/main/java/com/small/client/dto/DataBaseInfo.java b/client/src/main/java/com/small/client/dto/DataBaseInfo.java index bfe770c3..59dba861 100644 --- a/client/src/main/java/com/small/client/dto/DataBaseInfo.java +++ b/client/src/main/java/com/small/client/dto/DataBaseInfo.java @@ -43,7 +43,7 @@ public class DataBaseInfo { private String shopGapTime; @ApiModelProperty(value = "调价时间") - private String priceOperatiem; + private String priceOperatime; @ApiModelProperty(value = "库存条件") private String stockOperateWhere; diff --git a/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java b/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java index c152f6f0..75564364 100644 --- a/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java +++ b/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java @@ -29,6 +29,9 @@ public class ProductQuantityConsumptionDto { @ApiModelProperty("数量(正数表示入库/增加,负数表示出库/减少)") private BigDecimal quantity; + @ApiModelProperty("订单总额") + private BigDecimal saleAmount; + @ApiModelProperty("消费状态:0-未消费,1-已消费") private Integer status; diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 5189b4f9..6aae15ee 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -334,7 +334,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String stockOperateWhere=" ls.oper_date>'"+dataBaseInfo.getOperDate()+"' "; dataBaseInfo.setStockOperateWhere(stockOperateWhere); } - if(StringUtils.isNotEmpty(dataBaseInfo.getPriceOperatiem())){ + if(StringUtils.isNotEmpty(dataBaseInfo.getPriceOperatime())){ where+=" and EXISTS ( " + " select " + " shop.item_no " + @@ -344,17 +344,19 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService " on " + " tpfd.sheet_no = tppfm.sheet_no " + " where " + - " tppfm.valid_flag = '1' " +//有效 + " tppfm.valid_flag = '2' " +//有效 " and shop.item_no=tpfd.item_no " + - " and tppfm.oper_date >'"+dataBaseInfo.getPriceOperatiem()+"' " + + " and tppfm.oper_date >'"+dataBaseInfo.getPriceOperatime()+"' " + " )"; } dataBaseInfo.setWhere(where); // 记录总数 total = sxDataDao.getTBditemInfoJoninTotal(dataBaseInfo); }else { + where="where b.status='1'"; dataBaseInfo.setWhere(where); total = sxDataDao.getTBditemInfoTotal(dataBaseInfo); + where="where shop.status='1'"; } if(total==0){ log.info("暂无商品同步"); @@ -471,9 +473,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService * 增量同步 调价单变化 */ private void syncFlowPrice(DataBaseInfo dataBaseInfo, CommentModel commentModel,String sycnTime){ - dataBaseInfo.setPriceOperatiem(sycnTime); + dataBaseInfo.setPriceOperatime(sycnTime); commentModel.setSyncTime(""); dataBaseInfo.setOperDate(""); + dataBaseInfo.setStockOperateWhere(""); syncAllGoods(dataBaseInfo,commentModel); } @@ -773,7 +776,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService if(!productQuantityConsumptionDtoList.isEmpty()){ Map map = productQuantityConsumptionDtoList.stream() .collect(Collectors.groupingBy( - ProductQuantityConsumptionDto::getProductNumber, + dto -> dto.getOrderId()+"-"+dto.getProductNumber(), Collectors.reducing( BigDecimal.ZERO, ProductQuantityConsumptionDto::getQuantity, From 015251831597e24c6d503ff73323eb8b94b52d34 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 8 Nov 2025 10:11:17 +0800 Subject: [PATCH 49/64] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/Schedule/DynamicTaskScheduler.java | 30 +++++++++--- .../java/com/small/client/dao/SxDataDao.java | 2 +- .../java/com/small/client/dto/ItemInfo.java | 5 ++ .../small/client/service/SxDataService.java | 10 +++- .../client/service/imp/SxDataServiceImp.java | 48 +++++++++++++------ 5 files changed, 73 insertions(+), 22 deletions(-) diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java index 23b9bf55..40ef8277 100644 --- a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java +++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java @@ -99,13 +99,22 @@ public class DynamicTaskScheduler { if(dataBaseInfo==null||StringUtils.isEmpty(dataBaseInfo.getUserName())){ return; } + String refreshTime=""; if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ - commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime())); + refreshTime=DateUtil.formatDateTime(dataBaseInfo.getRefreshTime()); + commentModel.setSyncTime(refreshTime); } - sxDataService.syncStoreData(dataBaseInfo,commentModel); - sxDataService.SyncBranchList(dataBaseInfo,commentModel); - sxDataService.SyncCategory(dataBaseInfo,commentModel); + if(StringUtils.isNotEmpty(refreshTime)){//有刷新时间,证明不是全量,需要判断是否有新商品,有新商品才同步品牌和分类 + if(sxDataService.isNewShop(dataBaseInfo,refreshTime)){ + sxDataService.SyncBranchList(dataBaseInfo,commentModel); + sxDataService.SyncCategory(dataBaseInfo,commentModel); + } + }else { + log.info("首次同步,无刷新时间"); + sxDataService.SyncBranchList(dataBaseInfo,commentModel); + sxDataService.SyncCategory(dataBaseInfo,commentModel); + } sxDataService.SyncGoods(dataBaseInfo,commentModel);//todo 暂时同步全部的商品如果后期修改,需要增加服务器的字段 try { if(ObjectUtil.isNotEmpty(dataBaseInfo.getShopGapTime())){ @@ -117,9 +126,18 @@ public class DynamicTaskScheduler { } catch (InterruptedException e) { throw new RuntimeException(e); } + if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){ + commentModel.setSyncTime(refreshTime); + } sxDataService.SyncVipList(dataBaseInfo,commentModel); - sxDataService.syncAtive(dataBaseInfo,commentModel); - sxDataService.syncAtiveShops(dataBaseInfo,commentModel); + boolean isNewActives=sxDataService.syncAtive(dataBaseInfo,commentModel); + if(isNewActives){ + log.info("---有新增的活动,同步活动商品开始--"); + sxDataService.syncAtiveShops(dataBaseInfo,commentModel); + }else { + log.info("---无新增的活动,无需同步活动商品--"); + } + isRuning=false; } diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index d9de60c4..6d004280 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -526,7 +526,7 @@ public class SxDataDao extends BaseDao{ if(stock_qty.compareTo(BigDecimal.ZERO)==0){ continue; } - ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(itemNo); + ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(key); if(productQuantityConsumptionDto.getSaleAmount().compareTo(BigDecimal.ZERO)==0){ continue; } diff --git a/client/src/main/java/com/small/client/dto/ItemInfo.java b/client/src/main/java/com/small/client/dto/ItemInfo.java index c422e7ec..22c10a59 100644 --- a/client/src/main/java/com/small/client/dto/ItemInfo.java +++ b/client/src/main/java/com/small/client/dto/ItemInfo.java @@ -42,4 +42,9 @@ public class ItemInfo { * 进货价格 */ private BigDecimal price; + + /** + * 零售价 + */ + private BigDecimal salePrice; } diff --git a/client/src/main/java/com/small/client/service/SxDataService.java b/client/src/main/java/com/small/client/service/SxDataService.java index 39b2e623..adc2ee3d 100644 --- a/client/src/main/java/com/small/client/service/SxDataService.java +++ b/client/src/main/java/com/small/client/service/SxDataService.java @@ -63,7 +63,7 @@ public interface SxDataService { * @param commentModel * @return */ - void syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel); + boolean syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel); /** * 同步活动商品 @@ -73,4 +73,12 @@ public interface SxDataService { void syncAtiveShops(DataBaseInfo dataBaseInfo,CommentModel commentModel); String getCategoryChildren(DataBaseInfo dataBaseInfo,String parentId); + + /** + * 校验是否有新的入库 + * @param dataBaseInfo + * @param refreshTime + * @return + */ + boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime); } diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index 6aae15ee..93842264 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -134,10 +134,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService break; case "02"://增量 todo test String sycnTime=commentModel.getSyncTime(); - syncIncrementAddGoods(dataBaseInfo, commentModel); + syncIncrementAddGoods(dataBaseInfo, commentModel);//同步新商品 // syncIncrementModifyGoods(dataBaseInfo, commentModel); - syncIncrementStock(dataBaseInfo, commentModel); - syncFlowPrice(dataBaseInfo, commentModel,sycnTime); + syncIncrementStock(dataBaseInfo, commentModel);//同步库存 + syncFlowPrice(dataBaseInfo, commentModel,sycnTime);//同步调价单 break; } @@ -310,6 +310,22 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService return root; } + /** + * 判断是否有新增商品,有新增商品才同步分类 + * @param dataBaseInfo + * @param refreshTime + * @return + */ + public boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime){ + String where="where b.status='1' "; + where+=" and ( b.modify_date>'"+refreshTime+"' "; + where+=" or b.build_date>'"+refreshTime+"') "; + dataBaseInfo.setWhere(where); + int total = sxDataDao.getTBditemInfoTotal(dataBaseInfo); + log.info("判断库存数量,库存数量:{}",total); + return total>0; + } + /** *同步所有商品 * @param dataBaseInfo @@ -340,11 +356,11 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService " shop.item_no " + " from " + " t_pc_price_flow_detail tpfd " + - " inner join t_pc_price_flow_master tppfm " + + " left join t_pc_price_flow_master tppfm " + " on " + " tpfd.sheet_no = tppfm.sheet_no " + " where " + - " tppfm.valid_flag = '2' " +//有效 + " tppfm.valid_flag = '1' " +//有效 " and shop.item_no=tpfd.item_no " + " and tppfm.oper_date >'"+dataBaseInfo.getPriceOperatime()+"' " + " )"; @@ -622,10 +638,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService log.info("文件下载目录: {}", downloadDirectory); HttpHeaders headers = new HttpHeaders(); // headers.set("User-Agent", "Apifox/1.0.0 (https://apifox.com)"); - headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */* - headers.set("Accept-Encoding", "gzip, deflate, br"); + //headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */* + // headers.set("Accept-Encoding", "gzip, deflate, br"); // 可以添加其他Apifox可能发送的头部 - headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); + // headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); headers.set("Connection", "keep-alive"); HttpEntity> requestEntity = new HttpEntity<>(headers); @@ -769,10 +785,13 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService JSONObject jsonObject= restTemplate.getForObject(remoteIp+HttpUtils.URL_SYNC_GET_STOR_DATA_RELEASE +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId(),JSONObject.class); + // String jsonStr="[{\"consumeId\":\"1986611923814223873\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"31011\",\"unitPrice\":10.90,\"quantity\":1.500,\"saleAmount\":16.35,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223872\",\"orderId\":\"DD_20251107_2\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":1.000,\"saleAmount\":1.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223874\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":2.000,\"saleAmount\":2.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"}]"; + if(null!=jsonObject.get("result")){ // Map map=(Map)jsonObject.get("result"); + String jsonStr= jsonObject.getStr("result"); List productQuantityConsumptionDtoList = - JSONUtil.toList(jsonObject.getStr("result"),ProductQuantityConsumptionDto.class); + JSONUtil.toList(jsonStr,ProductQuantityConsumptionDto.class); if(!productQuantityConsumptionDtoList.isEmpty()){ Map map = productQuantityConsumptionDtoList.stream() .collect(Collectors.groupingBy( @@ -786,17 +805,18 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService Map productQuantityConsumptionDtoMap=new HashMap<>(); productQuantityConsumptionDtoList.forEach(productQuantityConsumptionDto -> { - productQuantityConsumptionDtoMap.put(productQuantityConsumptionDto.getProductNumber(),productQuantityConsumptionDto); + productQuantityConsumptionDtoMap.put(productQuantityConsumptionDto.getOrderId()+"-"+productQuantityConsumptionDto.getProductNumber(),productQuantityConsumptionDto); }); sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoMap,productQuantityConsumptionDtoList,commentModel); + }else { + log.info("无线上流水同步"); } - } } @Override - public void syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) { + public boolean syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) { String where="where 1=1"; Integer total =0; if(StringUtils.isNotEmpty(commentModel.getSyncTime())){ @@ -807,7 +827,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService total = sxDataDao.getNewActiveCount(dataBaseInfo); if(total==0){ log.info("暂无活动同步"); - return; + return false; } // 总页数 int pages = CommonUtil.getPagesCount(total, SxDataDao.PAGESIZE); @@ -832,7 +852,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService syncCount+=activeDtos.size(); } log.info("成功同步活动数据:"+syncCount); - + return true; } @Override From cb74d80aabfb339057ce6ff1fd389c6903612143 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sun, 9 Nov 2025 01:24:52 +0800 Subject: [PATCH 50/64] =?UTF-8?q?=E7=A0=8D=E4=BB=B7=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E8=A1=A5?= =?UTF-8?q?=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ShopActivityCutpriceService.java | 16 ++- .../impl/ShopActivityCutpriceServiceImpl.java | 134 +++++++++++++++--- .../quartz/job/UpdateActivityStatusJob.java | 5 + .../ShopStoreActivityBaseServiceImpl.java | 1 - .../impl/ShopStoreBaseServiceImpl.java | 2 + 5 files changed, 137 insertions(+), 21 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java index 8956404d..30a64a88 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java @@ -50,11 +50,19 @@ public interface ShopActivityCutpriceService extends IBaseService queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", user_id).eq("ac_id", ac_id); @@ -522,6 +524,11 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("ac_id", ac_id); - updateWrapper.set("state", state); + // 根据 ac_id 或 activity_id 条件更新状态,避免重复更新相同状态 + if (ac_id != null && ac_id > 0) { + updateWrapper.eq("ac_id", ac_id); + } + if (activity_id != null && activity_id > 0) { + updateWrapper.eq("activity_id", activity_id); + } + updateWrapper.ne("state", state).set("state", state); return update(updateWrapper); } catch (Exception e) { - log.error("更新砍价订单状态失败,ac_id={}, state={}", ac_id, state, e); - throw new ApiException(I18nUtil._("更新砍价订单状态失败")); + log.error("更新砍价订单状态失败,ac_id={}, activity_id={}, state={}", ac_id, activity_id, state, e); + return false; } } + /** + * 砍价活动结束后,定时修改砍价订单状态 定时任务(包括多个状态业务变更) + *

+ * 砍价订单状态:1-砍价已完成下单;2-砍价未下单已取消;3-砍价助力进行中;4-砍价过期失效;6-砍价助力已完成待下单; + *

+ * 1、某个砍价订单未超时情况下,更改(3-砍价助力进行中,砍到最低价时)的状态为 (6-砍价助力已完成待下单) + * 2、某个砍价订单超时的情况下,定时更改(3-砍价助力进行中)的状态为 (4-砍价过期失效) + * 3、砍价活动结束后,定时更改(3-砍价助力进行中和6-砍价助力已完成待下单)的状态为 (4-砍价过期失效和2-砍价未下单已取消;) + * + * @return 成功更新的操作次数 + */ + @Override + public Integer autoUpdateCutPriceStateJob() { + int successCount = 0; + log.info("开始执行砍价订单状态定时更新任务"); + try { + // 1、某个砍价订单未超时情况下,更改(3-砍价助力进行中,砍到最低价时)的状态为 (6-砍价助力已完成待下单) + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("state", CommonConstant.CutPrice_Order_State_ING) + .ge("expired_at", System.currentTimeMillis()) + .apply("ac_sale_price <= ac_mix_limit_price") + .set("state", CommonConstant.CutPrice_Order_State_CutFinished); + + log.debug("准备执行更新操作1:将状态3且未过期且达到最低价的砍价订单更新为状态6"); + if (update(updateWrapper)) { + log.info("成功更新砍价订单状态为【砍价助力已完成待下单】,条件:state={}, ac_sale_price<=ac_mix_limit_price", + CommonConstant.CutPrice_Order_State_ING); + successCount++; + } else { + log.debug("更新操作1未匹配到任何记录"); + } + + // 2、某个砍价订单超时的情况下,定时更改(3-砍价助力进行中)的状态为 (4-砍价过期失效) + updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("state", CommonConstant.CutPrice_Order_State_ING) + .lt("expired_at", System.currentTimeMillis()) + .set("state", CommonConstant.CutPrice_Order_State_Expired); + + log.debug("准备执行更新操作2:将状态3且已过期的砍价订单更新为状态4"); + if (update(updateWrapper)) { + log.info("成功更新砍价订单状态为【砍价过期失效】,条件:state={}, expired_at<{}", + CommonConstant.CutPrice_Order_State_ING, System.currentTimeMillis()); + successCount++; + } else { + log.debug("更新操作2未匹配到任何记录"); + } + + // 3、砍价活动结束后,定时更改(3-砍价助力进行中和6-砍价助力已完成待下单)的状态为 (4-砍价过期失效和2-砍价未下单已取消;) + // 处理状态3(砍价助力进行中) -> 状态4(砍价过期失效) + updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("state", CommonConstant.CutPrice_Order_State_ING) + .exists("SELECT 1 FROM shop_store_activity_base WHERE shop_store_activity_base.activity_id = shop_activity_cutprice.activity_id AND shop_store_activity_base.activity_endtime < NOW()") + .set("state", CommonConstant.CutPrice_Order_State_Expired); + + log.debug("准备执行更新操作3:将状态3且活动已结束的砍价订单更新为状态4"); + if (update(updateWrapper)) { + log.info("成功更新砍价订单状态为【砍价过期失效】,条件:state={}, activity_endtime 状态2(砍价未下单已取消) + updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("state", CommonConstant.CutPrice_Order_State_CutFinished) + .exists("SELECT 1 FROM shop_store_activity_base WHERE shop_store_activity_base.activity_id = shop_activity_cutprice.activity_id AND shop_store_activity_base.activity_endtime < NOW()") + .set("state", CommonConstant.CutPrice_Order_State_Canceled); + + log.debug("准备执行更新操作4:将状态6且活动已结束的砍价订单更新为状态2"); + if (update(updateWrapper)) { + log.info("成功更新砍价订单状态为【砍价未下单已取消】,条件:state={}, activity_endtime Date: Mon, 10 Nov 2025 16:20:55 +0800 Subject: [PATCH 51/64] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=82=A8=E6=96=87=E4=BB=B6=E5=86=85=E5=AE=B9?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E9=85=8D=E7=BD=AE=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/sync/StoreDbConfig.java | 10 ++- .../common/modules/sync/SyncStoreData.java | 53 +++++++++++++++ .../common/utils/TextCompressionUtil.java | 56 ++++++++++++++++ .../controller/StoreDbConfigController.java | 4 -- .../shop/sync/mapper/SyncStoreDataMapper.java | 12 ++++ .../sync/service/SyncStoreDataService.java | 11 ++++ .../impl/SyncStoreDataServiceImpl.java | 15 +++++ .../impl/SyncThirdDataServiceImpl.java | 64 +++++++++++++++++-- sql/shop/dev/20251108_dml.sql | 2 + sql/shop/dev/20251110_dml.sql | 15 +++++ 10 files changed, 230 insertions(+), 12 deletions(-) create mode 100644 mall-common/src/main/java/com/suisung/mall/common/modules/sync/SyncStoreData.java create mode 100644 mall-common/src/main/java/com/suisung/mall/common/utils/TextCompressionUtil.java create mode 100644 mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncStoreDataMapper.java create mode 100644 mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncStoreDataService.java create mode 100644 mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreDataServiceImpl.java create mode 100644 sql/shop/dev/20251108_dml.sql create mode 100644 sql/shop/dev/20251110_dml.sql diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java index 18923329..260e536a 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java @@ -128,6 +128,14 @@ public class StoreDbConfig implements Serializable { private String shopGapTime; @TableField(value = "sale_account",updateStrategy = FieldStrategy.NOT_EMPTY) - @NotBlank(message = "营业员账号") + @ApiModelProperty(value = "营业员账号") private String saleAccount; + + @TableField(value = "is_sync_active",updateStrategy = FieldStrategy.NOT_EMPTY) + @ApiModelProperty(value = "是否同步活动(0:否,1:是)") + private String isSyncActive; + + @TableField(value = "is_sync_member",updateStrategy = FieldStrategy.NOT_EMPTY) + @ApiModelProperty(value = "是否同步会员(0:否,1:是)") + private String isSyncMember; } \ No newline at end of file diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/SyncStoreData.java b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/SyncStoreData.java new file mode 100644 index 00000000..f843069d --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/SyncStoreData.java @@ -0,0 +1,53 @@ +package com.suisung.mall.common.modules.sync; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("sycn_store_data") +@ApiModel("商品同步数据") +public class SyncStoreData implements Serializable { + @TableId(value = "sync_store_data_id", type = IdType.INPUT) + @ApiModelProperty("主键ID") + private String syncStoreDataId; + + @TableField("store_id") + @ApiModelProperty("店铺ID") + private String storeId; + + @TableField("content") + @ApiModelProperty("同步文本内容") + private String content; + + @TableField("file_name") + @ApiModelProperty("文件名称") + private String fileName; + + @TableField("folder") + @ApiModelProperty("文件路径") + private String folder; + + @TableField("file_path") + @ApiModelProperty("文件全路径") + private String filePath; + + @TableField("status") + @ApiModelProperty("处理状态0:未处理,1:已处理") + private String status; + + @TableField("create_time") + @ApiModelProperty(value = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @TableField("update_time") + @ApiModelProperty(value = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/TextCompressionUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/TextCompressionUtil.java new file mode 100644 index 00000000..908e77fe --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/TextCompressionUtil.java @@ -0,0 +1,56 @@ +package com.suisung.mall.common.utils; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class TextCompressionUtil { + /** + * 压缩文本 + */ + public static String compress(String text) { + if (text == null || text.length() == 0) { + return text; + } + + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(out)) { + gzip.write(text.getBytes(StandardCharsets.UTF_8)); + } + return Base64.getEncoder().encodeToString(out.toByteArray()); + } catch (IOException e) { + throw new RuntimeException("压缩失败", e); + } + } + + /** + * 解压缩文本 + */ + public static String decompress(String compressedText) { + if (compressedText == null || compressedText.length() == 0) { + return compressedText; + } + + try { + byte[] compressedData = Base64.getDecoder().decode(compressedText); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (ByteArrayInputStream in = new ByteArrayInputStream(compressedData); + GZIPInputStream gzip = new GZIPInputStream(in)) { + + byte[] buffer = new byte[1024]; + int len; + while ((len = gzip.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + } + return out.toString(String.valueOf(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new RuntimeException("解压缩失败", e); + } + } +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/StoreDbConfigController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/StoreDbConfigController.java index b11fbd06..a9a73ce9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/StoreDbConfigController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/StoreDbConfigController.java @@ -10,12 +10,8 @@ package com.suisung.mall.shop.sync.controller; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.modules.sync.StoreDbConfig; -import com.suisung.mall.common.modules.sync.SyncApp; -import com.suisung.mall.common.modules.sync.SyncFileLog; import com.suisung.mall.common.service.impl.BaseControllerImpl; -import com.suisung.mall.core.web.controller.BaseController; import com.suisung.mall.shop.sync.service.StoreDbConfigService; -import com.suisung.mall.shop.sync.service.SyncFileLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncStoreDataMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncStoreDataMapper.java new file mode 100644 index 00000000..2f7a2e65 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncStoreDataMapper.java @@ -0,0 +1,12 @@ +package com.suisung.mall.shop.sync.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.suisung.mall.common.modules.sync.SyncStoreData; +import org.springframework.stereotype.Repository; + +@Repository +public interface SyncStoreDataMapper extends BaseMapper { + + +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncStoreDataService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncStoreDataService.java new file mode 100644 index 00000000..ebd7e7ab --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncStoreDataService.java @@ -0,0 +1,11 @@ +package com.suisung.mall.shop.sync.service; + + +import com.suisung.mall.common.modules.sync.SyncStoreData; +import com.suisung.mall.core.web.service.IBaseService; + +public interface SyncStoreDataService extends IBaseService { + + + +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreDataServiceImpl.java new file mode 100644 index 00000000..aefc521a --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreDataServiceImpl.java @@ -0,0 +1,15 @@ +package com.suisung.mall.shop.sync.service.impl; + +import com.suisung.mall.common.modules.sync.SyncStoreData; +import com.suisung.mall.core.web.service.impl.BaseServiceImpl; +import com.suisung.mall.shop.sync.mapper.SyncStoreDataMapper; +import com.suisung.mall.shop.sync.service.SyncStoreDataService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(rollbackFor = Exception.class) +@Slf4j +public class SyncStoreDataServiceImpl extends BaseServiceImpl implements SyncStoreDataService { +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index bb76332b..ba40f412 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -45,6 +45,7 @@ import com.suisung.mall.common.pojo.req.SyncThirdMemberReq; import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.StringUtils; +import com.suisung.mall.common.utils.TextCompressionUtil; import com.suisung.mall.shop.base.service.ShopBaseProductBrandService; import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService; import com.suisung.mall.shop.number.service.ShopNumberSeqService; @@ -65,13 +66,13 @@ import com.suisung.mall.shop.store.service.ShopStoreActivityBaseService; import com.suisung.mall.shop.store.service.ShopStoreActivityItemService; import com.suisung.mall.shop.sync.Utils.ActiveShopJsonUtils; import com.suisung.mall.shop.sync.Utils.BigDecimalFormatter; -import com.suisung.mall.shop.sync.Utils.ThreadFileUtils; import com.suisung.mall.shop.sync.dto.ActiveModel; import com.suisung.mall.shop.sync.dto.ActiveShopInfo; import com.suisung.mall.shop.sync.dto.BrandModel; import com.suisung.mall.shop.sync.keymanage.RedisKey; import com.suisung.mall.shop.sync.service.*; import io.seata.spring.annotation.GlobalTransactional; +import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.collections4.ListUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,6 +108,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; import static com.suisung.mall.common.utils.I18nUtil._; @@ -181,6 +183,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements @Autowired private ProductQuantityConsumptionService productQuantityConsumptionService; + @Autowired + private SyncStoreDataService syncStoreDataService; + /** * 批量保存商品的分类 * @@ -517,6 +522,15 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements return new ThirdApiRes().fail(500, "文件上传失败:签名验证失败"); } logger.info("path-{},parent-{},filename-{},root-{}", path, path.getParent(), path.getFileName().toString(), path.getRoot()); + SyncStoreData sxStoreData = new SyncStoreData(); + sxStoreData.setSyncStoreDataId(DigestUtils.md5Hex(filePath)); + sxStoreData.setStoreId(syncAppO.getStore_id()); + sxStoreData.setContent(TextCompressionUtil.compress(jsonStr)); + sxStoreData.setFileName(filName); + sxStoreData.setFolder(folder); + sxStoreData.setFilePath(filePath); + sxStoreData.setStatus("0"); + syncStoreDataService.saveOrUpdate(sxStoreData); // String filaPath=path.toString(); // if(filePath.contains(":")){ // filePath=filePath.substring(filePath.indexOf(":")+1); @@ -568,7 +582,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements }); //upLoadZipToOss(newFolders.get(0));//上传文件到cos - dowloadAndUnZip(newFolders.get(0));//读取cos文件回本地 + // dowloadAndUnZip(newFolders.get(0));//读取cos文件回本地 syncPrimaryKey(); shopNumberSeqService.clearKey(); shopBaseProductCategoryService.clearCategoryCache(storeId); @@ -577,8 +591,8 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements ExecutorService executor = Executors.newFixedThreadPool(6); List> futures = new ArrayList<>(); // 提交任务 - AtomicInteger success = new AtomicInteger(); - AtomicInteger fails = new AtomicInteger(); + AtomicInteger success = new AtomicInteger(0); + AtomicInteger fails = new AtomicInteger(0); List failFolders = new ArrayList<>(); List failMessage = new ArrayList<>(); shopBaseProductCategoryService.getCategoryListByStoreId(storeId); @@ -592,19 +606,32 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements // Map ShopBaseProductSpecMap = baseProductSpecService.getShopBaseProductSpecMap(Integer.valueOf(storeId));//切割商品缓存 // long seconds=System.currentTimeMillis(); // Date productSaleTime=Date.from(Instant.now().plusSeconds(seconds)); + List fileNames=new ArrayList<>(); + for(int i=0;i syncStoreDataQueryWrapper = new QueryWrapper<>(); + syncStoreDataQueryWrapper.eq("store_id", storeId); + syncStoreDataQueryWrapper.eq("status", 0); + syncStoreDataQueryWrapper.in("file_name",fileNames); + List syncStoreDataList= syncStoreDataService.list(syncStoreDataQueryWrapper); + Map syncDataMap= syncStoreDataList.stream().collect(Collectors.toMap(SyncStoreData::getSyncStoreDataId, SyncStoreData::getContent)); for (int i = 0; i < newFolders.size(); i++) { final int taskId = i; final String isNegativeAllowed = storeDbConfig.getIsNegativeAllowed(); //String priorityMode = storeDbConfig.getPriorityMode(); //boolean isUpdatePrice= ObjectUtil.isNotEmpty(storeDbConfig.getRefreshTime());//是否更新所有切割价格 threadNum.incrementAndGet(); + Map finalSyncDataMap = syncDataMap; futures.add(executor.submit(() -> { int count = 0;//失败重试机制,当失败重试一次,再次失败则记录到数据库中 while (true) { count++; - String taskName = newFolders.get(taskId); - String fileName = "good_" + (taskId + 1) + ".txt"; - JSONArray jsonArray = new ThreadFileUtils().processFolder(taskName, newFolders.get(taskId)); + // String taskName = newFolders.get(taskId); + String fileName = "goods_" + (taskId + 1) + ".txt"; + String sycnDataId=DigestUtils.md5Hex(newFolders.get(taskId) + fileName); + JSONArray jsonArray = getSyncDataContent(finalSyncDataMap,sycnDataId); try { baseSaveOrUpdateGoodsBatch(jsonArray, storeId, isNegativeAllowed, brandMaps); success.getAndIncrement(); @@ -657,6 +684,12 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements if (CollUtil.isNotEmpty(syncFileLogs)) { syncFileLogService.saveBatch(syncFileLogs, syncFileLogs.size()); } + syncStoreDataList=syncStoreDataList.stream().peek(syncStoreData -> { + syncStoreData.setStatus("1"); + }).collect(Collectors.toList()); + if(!syncStoreDataList.isEmpty()){ + syncStoreDataService.updateBatchById(syncStoreDataList,syncStoreDataList.size());//处理结束后更新已处理 + } //todo 定时清理文件,建议用服务器脚本 logger.info("执行成功{}个文件,失败{}个文件", success, fails); logger.info("同步商品数据执行结束"); @@ -1538,5 +1571,22 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements return searchService.importAllProductImage(updateTime); } + /** + * 读取数据库的content + * @return + */ + public JSONArray getSyncDataContent(Map map,String key){ + JSONArray jsonArray =null; + try { + String content=map.get(key); + content= TextCompressionUtil.decompress(content); + jsonArray = JSONUtil.parseArray(content); + // logger.info("成功处理文件: {}",key); + } catch (RuntimeException e) { + throw new RuntimeException("处理文件失败: " + e.getMessage(), e); + } + return jsonArray; + } + } diff --git a/sql/shop/dev/20251108_dml.sql b/sql/shop/dev/20251108_dml.sql new file mode 100644 index 00000000..3619d66e --- /dev/null +++ b/sql/shop/dev/20251108_dml.sql @@ -0,0 +1,2 @@ +ALTER table store_db_config add is_sync_active char(1) NOT NULL DEFAULT '0' COMMENT '是否同步活动(0:否,1:是)'; +ALTER table store_db_config add is_sync_member char(1) NOT NULL DEFAULT '0' COMMENT '是否同步会员(0:否,1:是)'; \ No newline at end of file diff --git a/sql/shop/dev/20251110_dml.sql b/sql/shop/dev/20251110_dml.sql new file mode 100644 index 00000000..0173abfa --- /dev/null +++ b/sql/shop/dev/20251110_dml.sql @@ -0,0 +1,15 @@ +CREATE TABLE `sycn_store_data` ( + `sync_store_data_id` varchar(32) NOT NULL COMMENT '主键ID', + `store_id` varchar(64) NOT NULL COMMENT '店铺ID', + `content` MEDIUMTEXT DEFAULT NULL COMMENT '同步文本内容', + `file_name` varchar(64) NOT NULL COMMENT '文件名称', + `folder` varchar(64) COMMENT '文件路径', + `file_path` varchar(64) COMMENT '文件全路径', + `status` varchar(1) NOT NULL default '0' COMMENT '处理状态0:未处理,1:已处理', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`sync_store_data_id`), + KEY `idx_store_id_status` (`store_id`,`status`) USING BTREE, + KEY `idx_file_name` (`file_name`), + KEY `idx_folder` (`folder`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品同步数据 '; \ No newline at end of file From c3414925a02b5fe6271c2d9c11647b25c4f79a37 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 10 Nov 2025 17:17:40 +0800 Subject: [PATCH 52/64] =?UTF-8?q?=E5=95=86=E5=93=81=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=95=86=E5=93=81=E8=B4=A7=E5=8F=B7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/sync/service/impl/ProductMappingServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java index e281acca..50d40f3e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java @@ -116,9 +116,13 @@ public class ProductMappingServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); if(StringUtils.isNotEmpty(productMapping.getProductName())){ - queryWrapper.eq("product_name",productMapping.getProductName()); + queryWrapper.like("product_name",productMapping.getProductName()); // queryWrapper.and(mapping ->mapping.like("product_name", productMapping.getProductName())); } + if(StringUtils.isNotEmpty(productMapping.getProductNumber())){ + queryWrapper.eq("product_number",productMapping.getProductNumber()); + // queryWrapper.and(mapping ->mapping.like("product_name", productMapping.getProductName())); + } if(ObjectUtil.isNotEmpty(productMapping.getStoreId())){ queryWrapper.and(m->m.eq("store_id",productMapping.getStoreId()).or().eq("store_id",0)); // queryWrapper.and(mapping ->mapping.like("product_name", productMapping.getProductName())); From 5e45474807c4edf40ddc7720cfe6f9ed39df8d45 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 10 Nov 2025 18:07:40 +0800 Subject: [PATCH 53/64] =?UTF-8?q?=E5=95=86=E5=93=81=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=95=86=E5=93=81=E8=B4=A7=E5=8F=B7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/suisung/mall/common/modules/sync/StoreDbConfig.java | 4 ++++ .../mall/shop/sync/controller/ProductMappingController.java | 1 + .../suisung/mall/shop/sync/service/SyncThirdDataService.java | 2 +- .../shop/sync/service/impl/ShopSyncImportServiceImpl.java | 1 + .../mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java | 4 ++-- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 3 ++- sql/shop/dev/20251110_2_dml.sql | 1 + 7 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 sql/shop/dev/20251110_2_dml.sql diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java index 260e536a..230b2337 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/StoreDbConfig.java @@ -138,4 +138,8 @@ public class StoreDbConfig implements Serializable { @TableField(value = "is_sync_member",updateStrategy = FieldStrategy.NOT_EMPTY) @ApiModelProperty(value = "是否同步会员(0:否,1:是)") private String isSyncMember; + + @TableField(value = "automatic",updateStrategy = FieldStrategy.NOT_EMPTY) + @ApiModelProperty(value = "默认次日补全库存(思迅同步时配置)") + private Integer automatic; } \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java index a443af16..c0d23f32 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/ProductMappingController.java @@ -69,6 +69,7 @@ public class ProductMappingController extends BaseControllerImpl { @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { ProductMapping productMapping=new ProductMapping(); productMapping.setProductName(getParameter("productName")); + productMapping.setProductNumber(getParameter("productNumber")); productMapping.setStoreId(getParameter("storeId",Integer.class)); return productMappingService.findPageProductMapping(productMapping,pageNum,pageSize); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java index 01fec6db..5b3342dc 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java @@ -206,7 +206,7 @@ public interface SyncThirdDataService { * @return */ int baseSaveOrUpdateGoodsBatch(JSONArray goodsListJSON,String storeId,String isNegativeAllowed, - Map brandMaps); + Map brandMaps,Integer automatic); void syncPrimaryKey(); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java index 831bfebf..0950fb2a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java @@ -227,6 +227,7 @@ public class ShopSyncImportServiceImpl implements ShopSyncImportService { shopBatchSubmitListener.setStoreId(storeId); shopBatchSubmitListener.setBrandMaps(brandMaps); shopBatchSubmitListener.setIsNegativeAllowed(isNegativeAllowed); + shopBatchSubmitListener.setAutomatic(storeDbConfig.getAutomatic()); EasyExcel.read(filePath,SxGoosModelExcel.class,shopBatchSubmitListener).sheet().doRead(); syncStoreSpecsService.dealSyncStoreSpecs(Integer.valueOf(storeId)); productMappingService.syncAllProductMapping(Integer.valueOf(storeId), DicEnum.YESORNO_0.getCode()); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java index d9333522..500e5b66 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java @@ -767,7 +767,7 @@ public abstract class SyncBaseThirdSxAbstract{ * @return */ public int baseSaveOrUpdateGoodsBatch(JSONArray goodsListJSON,String storeId,String isNegativeAllowed, - Map brandMaps){ + Map brandMaps,Integer automatic){ AtomicInteger resultCount = new AtomicInteger(); Map categoryMap= productCategoryService.getCategoryListByStoreId(storeId);//热数据加载 List shopProductBaseList=new ArrayList<>(); @@ -825,7 +825,7 @@ public abstract class SyncBaseThirdSxAbstract{ } BigDecimal stock= jsonObj.getBigDecimal("stock");//库存 if(ObjectUtil.equals(isNegativeAllowed,DicEnum.YESORNO_1.getCode())&&stock.compareTo(BigDecimal.ZERO)<=0){//允许负库存,每次都加满,就是一直有售卖 - stock=new BigDecimal("500"); + stock=new BigDecimal(automatic); } //商品总量 if(ObjectUtil.isNotEmpty(jsonObj.getStr("unit"))&&ObjectUtil.isNotEmpty(jsonObj.getStr("stock")) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index ba40f412..c9f46d53 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -620,6 +620,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements for (int i = 0; i < newFolders.size(); i++) { final int taskId = i; final String isNegativeAllowed = storeDbConfig.getIsNegativeAllowed(); + final Integer automatic=storeDbConfig.getAutomatic(); //String priorityMode = storeDbConfig.getPriorityMode(); //boolean isUpdatePrice= ObjectUtil.isNotEmpty(storeDbConfig.getRefreshTime());//是否更新所有切割价格 threadNum.incrementAndGet(); @@ -633,7 +634,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements String sycnDataId=DigestUtils.md5Hex(newFolders.get(taskId) + fileName); JSONArray jsonArray = getSyncDataContent(finalSyncDataMap,sycnDataId); try { - baseSaveOrUpdateGoodsBatch(jsonArray, storeId, isNegativeAllowed, brandMaps); + baseSaveOrUpdateGoodsBatch(jsonArray, storeId, isNegativeAllowed, brandMaps,automatic); success.getAndIncrement(); threadNum.decrementAndGet(); return "成功" + taskId; diff --git a/sql/shop/dev/20251110_2_dml.sql b/sql/shop/dev/20251110_2_dml.sql new file mode 100644 index 00000000..9c1052eb --- /dev/null +++ b/sql/shop/dev/20251110_2_dml.sql @@ -0,0 +1 @@ +ALTER table store_db_config add `automatic` int DEFAULT '100' COMMENT '默认次日补全库存'; \ No newline at end of file From 41dbafffabc2b659a20e6c66c9d7cc1dc75a6b54 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Tue, 11 Nov 2025 08:49:55 +0800 Subject: [PATCH 54/64] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=9A=84=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/listen/ShopBatchSubmitListener.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/listen/ShopBatchSubmitListener.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/listen/ShopBatchSubmitListener.java index 494cbb58..4b461aaa 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/listen/ShopBatchSubmitListener.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/listen/ShopBatchSubmitListener.java @@ -52,6 +52,9 @@ public class ShopBatchSubmitListener extends AnalysisEventListener brandMaps; + @Setter + @Getter + private Integer automatic; public ShopBatchSubmitListener(SyncThirdDataService syncThirdDataService, SyncStoreSpecsService syncStoreSpecsService) { this.syncThirdDataService = syncThirdDataService; @@ -171,7 +174,7 @@ public class ShopBatchSubmitListener extends AnalysisEventListener Date: Tue, 11 Nov 2025 19:05:55 +0800 Subject: [PATCH 55/64] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=8D=95=E6=9C=BA?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=88=86=E5=B8=83=E5=BC=8F=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/ShopBaseProductSpecController.java | 10 ++- .../impl/ShopBaseProductSpecServiceImpl.java | 3 - .../number/service/ShopNumberSeqService.java | 4 -- .../impl/ShopNumberSeqServiceImpl.java | 63 +++++++++++++---- .../admin/ShopProductSpecItemController.java | 10 +++ .../impl/ShopProductBaseServiceImpl.java | 23 +++++-- .../impl/ShopProductItemServiceImpl.java | 6 +- .../mall/shop/sync/keymanage/RedisKey.java | 2 + .../impl/ProductMappingServiceImpl.java | 1 - .../impl/ShopSyncImportServiceImpl.java | 2 - .../service/impl/SyncBaseThirdSxAbstract.java | 34 +++++++--- .../impl/SyncStoreSpecsServiceImpl.java | 2 - .../impl/SyncThirdDataServiceImpl.java | 67 ++++++++++++++++--- sql/shop/dev/20251111_dml.sql | 1 + 14 files changed, 174 insertions(+), 54 deletions(-) create mode 100644 sql/shop/dev/20251111_dml.sql diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseProductSpecController.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseProductSpecController.java index e9107ff1..694c04c9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseProductSpecController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseProductSpecController.java @@ -10,10 +10,10 @@ import com.suisung.mall.common.exception.ApiException; import com.suisung.mall.common.modules.base.ShopBaseProductSpec; import com.suisung.mall.common.modules.product.ShopProductSpecItem; import com.suisung.mall.common.utils.CheckUtil; -import com.suisung.mall.common.utils.ContextUtil; import com.suisung.mall.common.utils.FilterUtils; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.shop.base.service.ShopBaseProductSpecService; +import com.suisung.mall.shop.number.service.ShopNumberSeqService; import com.suisung.mall.shop.product.service.ShopProductSpecItemService; import com.suisung.mall.shop.store.service.ShopStoreBaseService; import io.swagger.annotations.Api; @@ -49,7 +49,11 @@ public class ShopBaseProductSpecController { private ShopProductSpecItemService shopProductSpecItemService; @Autowired - ShopStoreBaseService shopStoreBaseService; + private ShopStoreBaseService shopStoreBaseService; + + @Autowired + private ShopNumberSeqService shopNumberSeqService; + /** * 分页列表查询 * @@ -105,6 +109,8 @@ public class ShopBaseProductSpecController { shopBaseProductSpec.setStore_id(oldSpec.getStore_id()); }else { Integer storeId = Integer.valueOf(userDto.getStore_id()); + List specIdList= shopNumberSeqService.getBatchSpecId(1); + shopBaseProductSpec.setSpec_id(specIdList.get(0)); shopBaseProductSpec.setStore_id(storeId); } shopBaseProductSpec.setSpec_id(spec_id); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductSpecServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductSpecServiceImpl.java index 4a41eac4..34c8608b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductSpecServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductSpecServiceImpl.java @@ -3,11 +3,9 @@ package com.suisung.mall.shop.base.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.suisung.mall.common.domain.UserDto; import com.suisung.mall.common.modules.base.ShopBaseProductCategory; import com.suisung.mall.common.modules.base.ShopBaseProductSpec; import com.suisung.mall.common.modules.product.ShopProductSpecItem; -import com.suisung.mall.common.utils.ContextUtil; import com.suisung.mall.common.utils.FilterUtils; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.core.web.service.RedisService; @@ -16,7 +14,6 @@ import com.suisung.mall.shop.base.mapper.ShopBaseProductSpecMapper; import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService; import com.suisung.mall.shop.base.service.ShopBaseProductSpecService; import com.suisung.mall.shop.product.service.ShopProductSpecItemService; -import com.suisung.mall.shop.sync.keymanage.RedisKey; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/number/service/ShopNumberSeqService.java b/mall-shop/src/main/java/com/suisung/mall/shop/number/service/ShopNumberSeqService.java index b79a1f1f..34128812 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/number/service/ShopNumberSeqService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/number/service/ShopNumberSeqService.java @@ -22,13 +22,11 @@ public interface ShopNumberSeqService extends IBaseService { List batchCreateNextNo(String seqName, int batchSize); void clearRelateGoodsId(); - void clearKey(); void batchUpdateSeq(List shopNumberSeqList); List getBatchSpecItemId(int batchSize); - void clearKeyStoreItemSepcId(); List getBatchUserAccountBaseId(int batchSize); @@ -36,8 +34,6 @@ public interface ShopNumberSeqService extends IBaseService { List getBatchSpecId(int batchSize); - void clearKeyStoreSepcId(); - List getBatchLibraryProductId(int batchSize); void clearKeyLibraryProductId(); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/number/service/impl/ShopNumberSeqServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/number/service/impl/ShopNumberSeqServiceImpl.java index b90426d0..ea6923ee 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/number/service/impl/ShopNumberSeqServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/number/service/impl/ShopNumberSeqServiceImpl.java @@ -6,6 +6,8 @@ import com.suisung.mall.common.feignService.AccountService; import com.suisung.mall.common.modules.base.ShopBaseProductSpec; import com.suisung.mall.common.modules.library.LibraryProduct; import com.suisung.mall.common.modules.number.ShopNumberSeq; +import com.suisung.mall.common.modules.product.ShopProductBase; +import com.suisung.mall.common.modules.product.ShopProductItem; import com.suisung.mall.common.modules.product.ShopProductSpecItem; import com.suisung.mall.core.web.service.RedisService; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; @@ -13,13 +15,17 @@ import com.suisung.mall.shop.base.service.ShopBaseProductSpecService; import com.suisung.mall.shop.library.service.LibraryProductService; import com.suisung.mall.shop.number.mapper.ShopNumberSeqMapper; import com.suisung.mall.shop.number.service.ShopNumberSeqService; +import com.suisung.mall.shop.product.service.ShopProductBaseService; +import com.suisung.mall.shop.product.service.ShopProductItemService; import com.suisung.mall.shop.product.service.ShopProductSpecItemService; import com.suisung.mall.shop.sync.keymanage.RedisKey; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -57,6 +63,15 @@ public class ShopNumberSeqServiceImpl extends BaseServiceImpl wrapper = new QueryWrapper<>(); wrapper.eq("prefix", seqName); @@ -207,24 +223,10 @@ public class ShopNumberSeqServiceImpl extends BaseServiceImpl shopNumberSeqList=new ArrayList<>(); + QueryWrapper baseWrapper=new QueryWrapper<>(); + baseWrapper.select("MAX(product_id) as product_id"); + ShopProductBase shopProductBase= shopProductBaseService.getOne(baseWrapper); + Long productId= shopProductBase.getProduct_id(); + //QueryWrapper baseSeWrapper=new QueryWrapper(); + //baseSeWrapper.eq("prefix", "product_id"); + ShopNumberSeq shopNumberSeqBase= new ShopNumberSeq(); + shopNumberSeqBase.setPrefix("product_id"); + shopNumberSeqBase.setNumber(productId); + //shopNumberSeqServiceImpl.edit(shopNumberSeqBase,baseWrapper); + //查询产品item + QueryWrapper itemQuery=new QueryWrapper<>(); + itemQuery.select("MAX(item_id) as item_id"); + ShopProductItem shopProductItem= shopProductItemService.getOne(itemQuery); + Long itemtId=1L; + if(null!=shopProductItem){ + itemtId= shopProductItem.getItem_id(); + } + // QueryWrapper itemWrapper=new QueryWrapper(); + //itemWrapper.eq("prefix", "item_id"); + ShopNumberSeq shopNumberSeqItem= new ShopNumberSeq(); + shopNumberSeqItem.setNumber(itemtId); + shopNumberSeqItem.setPrefix("item_id"); + shopNumberSeqList.add(shopNumberSeqBase); + shopNumberSeqList.add(shopNumberSeqItem); + this.batchUpdateSeq(shopNumberSeqList); + this.clearRelateGoodsId(); + } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/controller/admin/ShopProductSpecItemController.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/controller/admin/ShopProductSpecItemController.java index 63776c6b..2eb5d6c4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/controller/admin/ShopProductSpecItemController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/controller/admin/ShopProductSpecItemController.java @@ -10,6 +10,7 @@ import com.suisung.mall.common.modules.product.ShopProductSpecItem; import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.ContextUtil; +import com.suisung.mall.shop.number.service.ShopNumberSeqService; import com.suisung.mall.shop.product.mapper.ShopProductItemMapper; import com.suisung.mall.shop.product.service.ShopProductItemService; import com.suisung.mall.shop.product.service.ShopProductSpecItemService; @@ -21,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** *

* 商品规格值表 前端控制器 @@ -43,6 +46,9 @@ public class ShopProductSpecItemController extends BaseControllerImpl { @Autowired private ShopProductItemMapper shopProductItemMapper; + @Autowired + private ShopNumberSeqService shopNumberSeqService; + /** * 分页列表查询 * @@ -88,6 +94,10 @@ public class ShopProductSpecItemController extends BaseControllerImpl { public CommonResult edit(ShopProductSpecItem shopProductSpecItem) { UserDto user = ContextUtil.getCurrentUser(); shopProductSpecItem.setStore_id(Integer.valueOf(user.getStore_id())); + if(ObjectUtil.isNull(shopProductSpecItem.getSpec_item_id())){ + List specItemIds= shopNumberSeqService.getBatchSpecItemId(1); + shopProductSpecItem.setSpec_item_id(specItemIds.get(0)); + } return CommonResult.success(shopProductSpecItemService.saveOrUpdate(shopProductSpecItem)); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java index 63ad5d0d..34c7e5e6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java @@ -737,7 +737,10 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl productIds= shopNumberSeqService.batchCreateNextNo("product_id",1); + productId=productIds.get(0); + // productId = shopNumberSeqService.createNextNo("product_id"); + if (null == productId) { return Pair.of(false, I18nUtil._("生成商品编号异常!")); } else { @@ -1032,7 +1035,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl itemIds= shopNumberSeqService.batchCreateNextNo("item_id",1); + item_id=itemIds.get(0); + // item_id = shopNumberSeqService.createNextNo("item_id"); if (null == item_id) { return Pair.of(false, I18nUtil._("生成商品 ItemId 异常!")); @@ -1209,8 +1214,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl productIds= shopNumberSeqService.batchCreateNextNo("product_id",1); + Long $product_id = productIds.get(0); + //Long $product_id = shopNumberSeqService.createNextNo("product_id"); if (null == $product_id) { throw new ApiException(I18nUtil._("生成商品编号异常!")); @@ -1383,7 +1389,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl itemIds= shopNumberSeqService.batchCreateNextNo("item_id",1); + item_id=itemIds.get(0); + //item_id = shopNumberSeqService.createNextNo("item_id"); if (null == item_id) { throw new ApiException(I18nUtil._("生成商品ItemId异常!")); @@ -4981,8 +4989,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl itemIds= shopNumberSeqService.batchCreateNextNo("item_id",1); + item_id=itemIds.get(0); if (null == item_id) { throw new ApiException(I18nUtil._("生成商品ItemId异常!")); } else { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java index 4a3c07ff..de6bced7 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java @@ -1224,7 +1224,8 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl productIds= shopNumberSeqService.batchCreateNextNo("product_id",1); + shopProductBase.setProduct_id(productIds.get(0)); shopProductBase.setProduct_add_time(currentDate.getTime()); shopProductIndex.setProduct_add_time(currentDate.getTime()); } @@ -1295,7 +1296,8 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl itemIds= shopNumberSeqService.batchCreateNextNo("item_id",1); + shopProductItem.setItem_id(itemIds.get(0)); shopProductItem.setItem_number(IdUtil.simpleUUID()); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/keymanage/RedisKey.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/keymanage/RedisKey.java index 3080eea7..25ea1adb 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/keymanage/RedisKey.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/keymanage/RedisKey.java @@ -26,4 +26,6 @@ public class RedisKey { public static final String STOREDATALIBRARYID="storedata:libraryId"; + + public static final String STOREDATAGOODBATCHLOCK="store:data:goodsbatchLock"; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java index 50d40f3e..9bbe9b45 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ProductMappingServiceImpl.java @@ -537,7 +537,6 @@ public class ProductMappingServiceImpl extends BaseServiceImpl item_keys = redisService.keys(ConstantRedis.Cache_NameSpace +"shop_product_item"+ "*"); redisService.del(item_keys); Set base_keys = redisService.keys(ConstantRedis.Cache_NameSpace +"shop_product_base"+ "*"); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java index 0950fb2a..5f0e04e1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/ShopSyncImportServiceImpl.java @@ -237,9 +237,7 @@ public class ShopSyncImportServiceImpl implements ShopSyncImportService { private void cleanCache(String storeId){ syncThirdDataService.syncPrimaryKey(); - shopNumberSeqService.clearKey(); shopBaseProductCategoryService.clearCategoryCache(storeId); - shopNumberSeqService.clearKeyStoreItemSepcId(); productBrandService.clearBrandMapByStoreId(storeId); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java index 500e5b66..36978a83 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncBaseThirdSxAbstract.java @@ -1059,9 +1059,10 @@ public abstract class SyncBaseThirdSxAbstract{ Map existIdMap= checkExistingShopBaseProductSpec(shopBaseProductSpecList); List insertShopBaseProductSpecList=new ArrayList<>(); List updateShopBaseProductSpecList=new ArrayList<>(); - QueryWrapper queryWrapper= new QueryWrapper<>(); - queryWrapper.select("max(spec_id) as spec_id"); - int spec_id=shopBaseProductSpecService.getOne(queryWrapper).getSpec_id()+1; +// QueryWrapper queryWrapper= new QueryWrapper<>(); +// queryWrapper.select("max(spec_id) as spec_id"); + // int spec_id=shopBaseProductSpecService.getOne(queryWrapper).getSpec_id()+1; + //int i=0; for(int i=0;i { +// if((shopBaseProductType.getType_name()+"规格").equals(shopBaseProductSpecList.get(finalI1).getSpec_name())){ +// shopBaseProductType.setType_spec_ids(String.valueOf(finalSpec_id)); +// } +// }); + insertShopBaseProductSpecList.add(shopBaseProductSpecList.get(i)); + } + // spec_id++; + } + + if(!insertShopBaseProductSpecList.isEmpty()){ + List specIdList=shopNumberSeqService.getBatchSpecId(insertShopBaseProductSpecList.size()); + for(int i=0;i { - if((shopBaseProductType.getType_name()+"规格").equals(shopBaseProductSpecList.get(finalI1).getSpec_name())){ + if((shopBaseProductType.getType_name()+"规格").equals(insertShopBaseProductSpecList.get(finalI).getSpec_name())){ shopBaseProductType.setType_spec_ids(String.valueOf(finalSpec_id)); } }); - insertShopBaseProductSpecList.add(shopBaseProductSpecList.get(i)); + insertShopBaseProductSpecList.get(i).setSpec_id(finalSpec_id); } - spec_id++; } + if(CollectionUtil.isNotEmpty(insertShopBaseProductSpecList)){ shopBaseProductSpecService.saveBatch(insertShopBaseProductSpecList,insertShopBaseProductSpecList.size()); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreSpecsServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreSpecsServiceImpl.java index dfb16664..0c268971 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreSpecsServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncStoreSpecsServiceImpl.java @@ -83,7 +83,6 @@ public class SyncStoreSpecsServiceImpl extends ServiceImpl> futures = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("store_id", storeId); @@ -120,7 +119,6 @@ public class SyncStoreSpecsServiceImpl extends ServiceImpl folders) { + public void SyncReadSxFileData(String appKey, String sign, String syncType, List folders){ SyncApp syncApp = syncAppService.getOne(new LambdaQueryWrapper() .select(SyncApp::getApp_key, SyncApp::getApp_secret, SyncApp::getStore_id) .eq(SyncApp::getApp_key, appKey) @@ -574,7 +579,13 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements logger.info("没有商品数据"); return; } - + String key=RedisKey.STOREDATAGOODBATCHLOCK+":"+storeId; + // redisService.del(key); + if(!checkeckIsLock(storeId)){ + logger.info("批量同步商品等待时间异常结束"); + return; + } + setLock(storeId,"true"); List newFolders = new ArrayList<>(); folders.forEach(page -> { String newfolder = new FileUtils().getSyncTypeFlag(syncType, clientPath) + storeId + FileUtils.pathSeparator + page + FileUtils.pathSeparator; @@ -584,10 +595,8 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements //upLoadZipToOss(newFolders.get(0));//上传文件到cos // dowloadAndUnZip(newFolders.get(0));//读取cos文件回本地 syncPrimaryKey(); - shopNumberSeqService.clearKey(); shopBaseProductCategoryService.clearCategoryCache(storeId); // shopProductSpecItemService.clearExistItem(Integer.valueOf(storeId)); - shopNumberSeqService.clearKeyStoreItemSepcId(); ExecutorService executor = Executors.newFixedThreadPool(6); List> futures = new ArrayList<>(); // 提交任务 @@ -606,9 +615,18 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements // Map ShopBaseProductSpecMap = baseProductSpecService.getShopBaseProductSpecMap(Integer.valueOf(storeId));//切割商品缓存 // long seconds=System.currentTimeMillis(); // Date productSaleTime=Date.from(Instant.now().plusSeconds(seconds)); + + String fileIndex=folders.get(0); + String fileEndFix; + if (fileIndex.length()>1){ + fileEndFix=fileIndex.split("_")[1]; + } else { + fileEndFix = ""; + } + List fileNames=new ArrayList<>(); for(int i=0;i syncStoreDataQueryWrapper = new QueryWrapper<>(); @@ -630,7 +648,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements while (true) { count++; // String taskName = newFolders.get(taskId); - String fileName = "goods_" + (taskId + 1) + ".txt"; + String fileName = "goods_" + (taskId + 1) +"_"+fileEndFix+ ".txt"; String sycnDataId=DigestUtils.md5Hex(newFolders.get(taskId) + fileName); JSONArray jsonArray = getSyncDataContent(finalSyncDataMap,sycnDataId); try { @@ -662,8 +680,6 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements executor.shutdown(); //记录到数据库 syncPrimaryKey(); - shopNumberSeqService.clearKey(); - shopNumberSeqService.clearKeyStoreItemSepcId(); shopBaseProductCategoryService.clearCategoryCache(storeId); productBrandService.clearBrandMapByStoreId(storeId); List syncFileLogs = new ArrayList<>(); @@ -708,6 +724,8 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements if(ObjectUtil.isNull(storeDbConfig.getRefreshTime())){ syncShopImages(Integer.valueOf(storeId));//同时商品图库数据 } + + redisService.del(key); } @Override @@ -716,6 +734,39 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements syncShopImageService.syncMapingShopImages(storeId); } + /** + * 保证单线程执行同步数据 + * @param storeId + * @return + */ + public synchronized boolean checkeckIsLock(String storeId){ + logger.info("等待时间开始"); + String key=RedisKey.STOREDATAGOODBATCHLOCK+":"+storeId; + Map isLockMap= (Map) redisService.get(key); + if(isLockMap!=null){ + String result= (String) isLockMap.get("batchGoodIsLock"); + if("true".equals(result)){ + try { + logger.info("进入等待时间"); + Thread.sleep(1000 * 60 * 1);//五分钟 + return checkeckIsLock(storeId); + } catch (InterruptedException e) { + logger.info("等待异常:{}",e.getMessage()); + return false; + } + } + } + logger.info("等待时间结束"); + return true; + } + + public synchronized void setLock(String storeId,String value){ + String key=RedisKey.STOREDATAGOODBATCHLOCK+":"+storeId; + Map map= new HashMap<>(); + map.put("batchGoodIsLock",value); + redisService.set(key,map,600000); + } + @Override public ResponseEntity downloadToClient(String primaryKey, String clienVersionName) { diff --git a/sql/shop/dev/20251111_dml.sql b/sql/shop/dev/20251111_dml.sql new file mode 100644 index 00000000..6993b814 --- /dev/null +++ b/sql/shop/dev/20251111_dml.sql @@ -0,0 +1 @@ +alter table sycn_store_data change `file_path` `file_path` varchar(128) DEFAULT NULL COMMENT '文件全路径'; \ No newline at end of file From af9cce0db15dcd3d51abc31722585057b079170b Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 11 Nov 2025 21:05:06 +0800 Subject: [PATCH 56/64] =?UTF-8?q?=E5=BA=97=E9=93=BA=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/constant/CommonConstant.java | 8 +- .../common/modules/store/ShopStoreBase.java | 2 +- .../impl/ShopActivityCutpriceServiceImpl.java | 2 +- .../impl/ShopBaseConfigServiceImpl.java | 38 ++-- .../service/impl/LakalaApiServiceImpl.java | 13 +- .../impl/ShopOrderBaseServiceImpl.java | 6 +- .../impl/ShopOrderInfoServiceImpl.java | 36 +++- .../impl/ShopProductBaseServiceImpl.java | 168 +++++++++--------- .../impl/ShopProductItemServiceImpl.java | 4 +- .../impl/ShopStoreBaseServiceImpl.java | 39 ++-- .../service/impl/ShopUserCartServiceImpl.java | 11 +- 11 files changed, 192 insertions(+), 135 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java index 58e7f635..c111bb39 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java @@ -129,10 +129,12 @@ public class CommonConstant { public final static Integer MIN_DELAY_MINUTES_FOR_BOOKING_ORDER = 50; - // 店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中; - //1-营业中; + // 店铺营业状态:1-开业营业中(且在营业时间内);12-开业打烊中(但在营业时间外);2-停业中;3-开业(或活动)筹备中; + // 1-开业营业中(且在营业时间内) public final static Integer Store_Biz_State_Opening = 1; - //2-已打烊; + // 12-开业打烊中(但在营业时间外) ; + public final static Integer Store_Biz_State_Opening2 = 12; + //2-停业中; public final static Integer Store_Biz_State_Closed = 2; //3-开业(活动)筹备中; public final static Integer Store_Biz_State_PreActivity = 3; diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java index 43d0142c..b6b4d9ba 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/store/ShopStoreBase.java @@ -80,7 +80,7 @@ public class ShopStoreBase implements Serializable { @ApiModelProperty(value = "店铃声开关:1-开启;2-关闭;") private Integer ringtone_is_enable; - @ApiModelProperty(value = "店铺营业状态:1-营业中;2-已打烊;3-开业(活动)筹备中;") + @ApiModelProperty(value = "店铺营业状态:1-开业营业中(且在营业时间内);12-开业打烊中(但在营业时间外);2-停业中;3-开业(或活动)筹备中;") private Integer store_biz_state; @ApiModelProperty(value = "开业(活动)筹备日期 yyyy-MM-dd") diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java index 91a2ad45..5a24d642 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java @@ -744,7 +744,7 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl 状态4(砍价过期失效) updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("state", CommonConstant.CutPrice_Order_State_ING) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseConfigServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseConfigServiceImpl.java index a1b0a688..0b5a7131 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseConfigServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseConfigServiceImpl.java @@ -169,32 +169,44 @@ public class ShopBaseConfigServiceImpl extends BaseServiceImpl 0) { + if (CheckUtil.isNotEmpty(refCanSeparateAmt)) { lklSeparateDTO.setRefCanSeparateAmount(refCanSeparateAmt); - log.debug("[分账参数计算] 设置参考可分账金额: {}", refCanSeparateAmt); + log.debug("[分账参数计算] 拉卡拉的参考可分账金额: {}", refCanSeparateAmt); + } else { + log.error("[分账参数计算] 注意:拉卡拉的参考可分账金额无效:{}", refCanSeparateAmt); } try { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index 5819ad5b..2fdabee4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -5323,7 +5323,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl 0 ? quantity_frozen : 0); @@ -6325,9 +6325,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl storeBizState = shopStoreBaseService.getStoreBizState(currStoreId); - if (storeBizState != null && CommonConstant.Disable2.equals(storeBizState.getFirst())) { + if (storeBizState != null && CommonConstant.Store_Biz_State_Closed.equals(storeBizState.getFirst())) { throw new ApiException(I18nUtil._(storeBizState.getSecond() + ",无法提交订单。")); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java index 8e1e757f..46dc2bb2 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java @@ -26,6 +26,7 @@ import com.suisung.mall.common.modules.order.ShopOrderStateLog; import com.suisung.mall.common.modules.pay.PayPlantformResource; import com.suisung.mall.common.modules.plantform.ShopPlantformFeedback; import com.suisung.mall.common.modules.product.ShopProductComment; +import com.suisung.mall.common.modules.store.ShopStoreBase; import com.suisung.mall.common.modules.store.ShopStoreInfo; import com.suisung.mall.common.pojo.dto.BookingArgDTO; import com.suisung.mall.common.pojo.res.ThirdApiRes; @@ -59,6 +60,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; @@ -967,16 +969,24 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl storeBaseQueryWrapper = new QueryWrapper<>(); + storeBaseQueryWrapper.select("store_id") + .eq("store_is_open", CommonConstant.Enable) + .ne("store_biz_state", CommonConstant.Store_Biz_State_Closed) + .in("store_id", uniqueStoreIds); + List validStoreIds = shopStoreBaseService.findKey(storeBaseQueryWrapper); + + if (validStoreIds.isEmpty()) { + return Collections.emptyList(); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("store_opening_hours", "store_close_hours"); // 只查询必要字段 - queryWrapper.in("store_id", storeIds); + queryWrapper.in("store_id", validStoreIds); + List shopStoreInfos = shopStoreInfoService.find(queryWrapper); // 4. 转换为营业时间映射列表 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java index 63ad5d0d..54540f52 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java @@ -478,13 +478,13 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl store_biz_state = shopStoreBaseService.getStoreBizState(Convert.toInt(product_base_row.get("store_id"))); +// product_base_row.put("store_biz_state", store_biz_state.getFirst()); +// } + //虚拟销量 // todo 是否为商家后台访问 if (null == user || !(user.isAdmin())) { @@ -5377,7 +5383,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl newIds=new ArrayList<>(); - synchronized (this){ + List newIds = new ArrayList<>(); + synchronized (this) { newIds = shopNumberSeqService.batchCreateNextNo("product_id", newProducts.size()); } if (newIds == null || newIds.size() != newProducts.size()) { @@ -5936,8 +5942,8 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl newShopProductInfoList) { List itemIds = new ArrayList<>(); if (CollUtil.isEmpty(items)) return itemIds; - List generatedIds =new ArrayList<>(); - synchronized (this){ + List generatedIds = new ArrayList<>(); + synchronized (this) { generatedIds = shopNumberSeqService.batchCreateNextNo("item_id", items.size()); } // Map cacheMap=new HashMap<>(); @@ -6460,99 +6466,99 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl findPageMapping(Integer store_id, Integer pageNum, Integer pageSize) { - return shopProductBaseMapper.findPageMapping(store_id,(pageNum-1)*pageSize,pageSize); + return shopProductBaseMapper.findPageMapping(store_id, (pageNum - 1) * pageSize, pageSize); } @Override public Map getProductByProductNumber(String productNumber) { - UserDto userDto= ContextUtil.getCurrentUser(); - String store_id=userDto.getStore_id(); + UserDto userDto = ContextUtil.getCurrentUser(); + String store_id = userDto.getStore_id(); Map data = new HashMap(); QueryWrapper cond_row = new QueryWrapper<>(); if (StrUtil.isNotBlank(productNumber)) { cond_row.eq("product_number", productNumber); } - cond_row.eq("store_id",store_id); + cond_row.eq("store_id", store_id); List lists = shopProductIndexService.list(cond_row); - if(lists.isEmpty()){ + if (lists.isEmpty()) { return null; } - ShopProductIndex shopProductIndexFind=lists.get(0); + ShopProductIndex shopProductIndexFind = lists.get(0); // todo lc - // data.put("productBase",shopProductIndexFind); + // data.put("productBase",shopProductIndexFind); //判断是否为商家,且开启供应商,判断是否已经加入分销中 - Long productId= shopProductIndexFind.getProduct_id(); - List product_ids= Collections.singletonList(Math.toIntExact(productId)); - data.put("baseInfo", getProduct(product_ids)); - List baseInfo = (List) data.get("baseInfo"); + Long productId = shopProductIndexFind.getProduct_id(); + List product_ids = Collections.singletonList(Math.toIntExact(productId)); + data.put("baseInfo", getProduct(product_ids)); + List baseInfo = (List) data.get("baseInfo"); - baseInfo.forEach(s -> { - String str_product_spec = (String) s.get("product_spec"); - if (StrUtil.isNotBlank(str_product_spec) && StrUtil.equals(str_product_spec, "[]")) { - s.put("product_spec", JSONUtil.parseArray(str_product_spec)); - } - - String str_product_assist = (String) s.get("product_assist"); - if (StrUtil.isNotBlank(str_product_assist) && StrUtil.equals(str_product_assist, "{}")) { - s.put("product_assist", JSONUtil.parseObj(str_product_assist)); - } - }); - - QueryWrapper itemQueryWrapper = new QueryWrapper<>(); - itemQueryWrapper.eq("product_id", productId); - List productItems = shopProductItemService.find(itemQueryWrapper); - - if (CollectionUtil.isNotEmpty(productItems)) { - for (Map item : baseInfo) { - List shopProductItems = productItems.stream().filter(s -> ObjectUtil.equal(s.getProduct_id(), productId)).collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(shopProductItems)) { - BigDecimal product_advice_price = shopProductItems.stream().map(ShopProductItem::getItem_advice_price).min(BigDecimal::compareTo).get(); - item.put("product_advice_price", product_advice_price); - } - } + baseInfo.forEach(s -> { + String str_product_spec = (String) s.get("product_spec"); + if (StrUtil.isNotBlank(str_product_spec) && StrUtil.equals(str_product_spec, "[]")) { + s.put("product_spec", JSONUtil.parseArray(str_product_spec)); } - List productItemS = productItems.stream().filter(distinctByKey(o -> o.getProduct_id())).collect(Collectors.toList()); - data.put("items",productItemS);//商品规格列表 - // shop_product_info - ShopProductInfo shopProductInfo = shopProductInfoService.get(productId); - // shop_product_detail - ShopProductDetail shopProductDetail = shopProductDetailService.get(productId); - // shop_product_index - ShopProductIndex shopProductIndex = shopProductIndexService.get(productId); - // shop_product_image - QueryWrapper imageQueryWrapper = new QueryWrapper<>(); - imageQueryWrapper.eq("product_id", productId); - List shopProductImages = shopProductImageService.find(imageQueryWrapper); - // shop_product_assist_index - QueryWrapper indexQueryWrapper = new QueryWrapper<>(); - indexQueryWrapper.eq("product_id", productId); - List assistIndexList = assistIndexService.find(indexQueryWrapper); - - HashMap map = new HashMap<>(); - if(com.suisung.mall.common.utils.StringUtils.isEmpty(shopProductInfo.getProduct_spec())){ - shopProductInfo.setProduct_spec("[]"); + String str_product_assist = (String) s.get("product_assist"); + if (StrUtil.isNotBlank(str_product_assist) && StrUtil.equals(str_product_assist, "{}")) { + s.put("product_assist", JSONUtil.parseObj(str_product_assist)); } - map.put("shop_product_info", shopProductInfo); - map.put("shop_product_image", shopProductImages); - map.put("shop_product_detail", shopProductDetail); - map.put("shop_product_index", shopProductIndex); - map.put("shop_product_assist_index", assistIndexList); + }); - // 虚拟商品信息表 - Integer kind_id = shopProductIndex.getKind_id(); - if (ObjectUtil.equal(kind_id, StateCode.PRODUCT_KIND_FUWU)) { - ShopProductValidPeriod validPeriod = shopProductValidPeriodService.get(productId); - map.put("shop_product_valid_period", validPeriod); + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("product_id", productId); + List productItems = shopProductItemService.find(itemQueryWrapper); + + if (CollectionUtil.isNotEmpty(productItems)) { + for (Map item : baseInfo) { + List shopProductItems = productItems.stream().filter(s -> ObjectUtil.equal(s.getProduct_id(), productId)).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(shopProductItems)) { + BigDecimal product_advice_price = shopProductItems.stream().map(ShopProductItem::getItem_advice_price).min(BigDecimal::compareTo).get(); + item.put("product_advice_price", product_advice_price); + } } - data.put("productInfo",map); - Integer category_id=productItems.get(0).getCategory_id(); - ShopBaseProductCategory shopBaseProductCategory= shopBaseProductCategoryService.get(category_id); - data.put("category",shopBaseProductCategory); - Integer typeId=shopBaseProductCategory.getType_id(); - data.put("shopBaseProductType",shopBaseProductTypeService.getType(String.valueOf(typeId), productId)) ; + } + + List productItemS = productItems.stream().filter(distinctByKey(o -> o.getProduct_id())).collect(Collectors.toList()); + data.put("items", productItemS);//商品规格列表 + // shop_product_info + ShopProductInfo shopProductInfo = shopProductInfoService.get(productId); + // shop_product_detail + ShopProductDetail shopProductDetail = shopProductDetailService.get(productId); + // shop_product_index + ShopProductIndex shopProductIndex = shopProductIndexService.get(productId); + // shop_product_image + QueryWrapper imageQueryWrapper = new QueryWrapper<>(); + imageQueryWrapper.eq("product_id", productId); + List shopProductImages = shopProductImageService.find(imageQueryWrapper); + // shop_product_assist_index + QueryWrapper indexQueryWrapper = new QueryWrapper<>(); + indexQueryWrapper.eq("product_id", productId); + List assistIndexList = assistIndexService.find(indexQueryWrapper); + + HashMap map = new HashMap<>(); + if (com.suisung.mall.common.utils.StringUtils.isEmpty(shopProductInfo.getProduct_spec())) { + shopProductInfo.setProduct_spec("[]"); + } + map.put("shop_product_info", shopProductInfo); + map.put("shop_product_image", shopProductImages); + map.put("shop_product_detail", shopProductDetail); + map.put("shop_product_index", shopProductIndex); + map.put("shop_product_assist_index", assistIndexList); + + // 虚拟商品信息表 + Integer kind_id = shopProductIndex.getKind_id(); + if (ObjectUtil.equal(kind_id, StateCode.PRODUCT_KIND_FUWU)) { + ShopProductValidPeriod validPeriod = shopProductValidPeriodService.get(productId); + map.put("shop_product_valid_period", validPeriod); + } + data.put("productInfo", map); + Integer category_id = productItems.get(0).getCategory_id(); + ShopBaseProductCategory shopBaseProductCategory = shopBaseProductCategoryService.get(category_id); + data.put("category", shopBaseProductCategory); + Integer typeId = shopBaseProductCategory.getType_id(); + data.put("shopBaseProductType", shopBaseProductTypeService.getType(String.valueOf(typeId), productId)); return data; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java index 4a3c07ff..79ce3eff 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductItemServiceImpl.java @@ -487,7 +487,7 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl q.eq("store_id", store_id).eq("item_number", productNumber)); }); queryWrapper.eq("store_id", store_id); - queryWrapper.groupBy("product_id","category_id"); + queryWrapper.groupBy("product_id", "category_id"); List shopProductItems = this.list(queryWrapper); // Map map=shopProductItems.stream().collect(Collectors.toMap(ShopProductItem::getProduct_id,shopProductItem->shopProductItem.getMergedItemId() // +"_"+shopProductItem.getMergedUnitPrices())); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index 32a77669..c0807867 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -312,8 +312,12 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl retPair = getStoreBizState(Convert.toInt(row.get("store_id"))); + row.put("store_biz_state", retPair.getFirst()); + + } String default_image = accountBaseConfigService.getConfig("default_image"); if (CollUtil.isNotEmpty(rows)) { @@ -1504,7 +1508,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl= 1) { base.setStore_biz_state(storeBizState); @@ -2542,7 +2546,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl= 1) { base.setStore_biz_state(storeBizState); @@ -4213,14 +4217,14 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl getStoreBizState(Integer storeId) { @@ -4283,18 +4291,18 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl storeBizState = shopStoreBaseService.getStoreBizState(storeId); -// if (storeBizState != null && CommonConstant.Disable2.equals(storeBizState.getFirst())) { -// throw new ApiException(I18nUtil._(storeBizState.getSecond() + ",无法加购商品。")); -// } + // 判断店铺是否歇业(停业)?歇业不能放入购物车 + Pair storeBizState = shopStoreBaseService.getStoreBizState(storeId); + if (storeBizState != null && CommonConstant.Store_Biz_State_Closed.equals(storeBizState.getFirst())) { + throw new ApiException(I18nUtil._(storeBizState.getSecond() + ",无法加购商品。")); + } Integer cart_type = Convert.toInt(data.get("cart_type")); // 判断是新增还是更新 From 2ecfce1f2f22d44c15e7c3638c5de66c4766c9b9 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 11 Nov 2025 23:25:11 +0800 Subject: [PATCH 57/64] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ShopProductBaseServiceImpl.java | 34 +++++++++---------- pom.xml | 8 ++--- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java index 39a55e71..842d9492 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/impl/ShopProductBaseServiceImpl.java @@ -737,9 +737,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl productIds= shopNumberSeqService.batchCreateNextNo("product_id",1); - productId=productIds.get(0); - // productId = shopNumberSeqService.createNextNo("product_id"); + List productIds = shopNumberSeqService.batchCreateNextNo("product_id", 1); + productId = productIds.get(0); + // productId = shopNumberSeqService.createNextNo("product_id"); if (null == productId) { return Pair.of(false, I18nUtil._("生成商品编号异常!")); @@ -1035,9 +1035,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl itemIds= shopNumberSeqService.batchCreateNextNo("item_id",1); - item_id=itemIds.get(0); - // item_id = shopNumberSeqService.createNextNo("item_id"); + List itemIds = shopNumberSeqService.batchCreateNextNo("item_id", 1); + item_id = itemIds.get(0); + // item_id = shopNumberSeqService.createNextNo("item_id"); if (null == item_id) { return Pair.of(false, I18nUtil._("生成商品 ItemId 异常!")); @@ -1214,7 +1214,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl productIds= shopNumberSeqService.batchCreateNextNo("product_id",1); + List productIds = shopNumberSeqService.batchCreateNextNo("product_id", 1); Long $product_id = productIds.get(0); //Long $product_id = shopNumberSeqService.createNextNo("product_id"); @@ -1389,8 +1389,8 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl itemIds= shopNumberSeqService.batchCreateNextNo("item_id",1); - item_id=itemIds.get(0); + List itemIds = shopNumberSeqService.batchCreateNextNo("item_id", 1); + item_id = itemIds.get(0); //item_id = shopNumberSeqService.createNextNo("item_id"); if (null == item_id) { @@ -2074,11 +2074,11 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl store_biz_state = shopStoreBaseService.getStoreBizState(Convert.toInt(product_base_row.get("store_id"))); -// product_base_row.put("store_biz_state", store_biz_state.getFirst()); -// } + if (product_base_row != null) { + // 获取店铺营业状态:1-开业营业中(且在营业时间内);12-开业打烊中(但在营业时间外) ;2-停业中;3-开业(或活动)筹备中; + Pair store_biz_state = shopStoreBaseService.getStoreBizState(Convert.toInt(product_base_row.get("store_id"))); + product_base_row.put("store_biz_state", store_biz_state.getFirst()); + } //虚拟销量 // todo 是否为商家后台访问 @@ -4995,9 +4995,9 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl itemIds= shopNumberSeqService.batchCreateNextNo("item_id",1); - item_id=itemIds.get(0); + // item_id = shopNumberSeqService.createNextNo("item_id"); + List itemIds = shopNumberSeqService.batchCreateNextNo("item_id", 1); + item_id = itemIds.get(0); if (null == item_id) { throw new ApiException(I18nUtil._("生成商品ItemId异常!")); } else { diff --git a/pom.xml b/pom.xml index 01d2025e..993e72b7 100644 --- a/pom.xml +++ b/pom.xml @@ -593,7 +593,7 @@ true ${project.version} - latest + @@ -601,9 +601,9 @@ - - rm -rf /root/.m2 && rm -rf /tmp/* && rm -rf /var/cache/* - + + + From a43df002dc01f3ff0e8209ee9b18e838bd568d25 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 12 Nov 2025 10:44:28 +0800 Subject: [PATCH 58/64] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/DistributedLockHelper.java | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java b/mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java new file mode 100644 index 00000000..ecd51293 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java @@ -0,0 +1,147 @@ +package com.suisung.mall.common.utils; + + +import com.suisung.mall.core.web.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class DistributedLockHelper { + + private static final String LOCK_PREFIX = "distributed_lock:"; + private static final long DEFAULT_EXPIRE_TIME_SEC = 30; // 单位为秒 + private static final ThreadLocal LOCK_VALUE_HOLDER = new ThreadLocal<>(); + + @Autowired + private RedisService redisService; + + /** + * 获取分布式锁 - 带有唯一标识符防止误删 + * + * @param lockKey 锁的key + * @param expireTimeSec 过期时间(秒) + * @return 是否获取成功 + */ + public boolean tryLock(String lockKey, long expireTimeSec) { + String key = LOCK_PREFIX + lockKey; + String value = UUID.randomUUID() + ":" + Thread.currentThread().getId(); + + try { + // 使用最通用的Redis操作方法 + // 先尝试设置键值对,如果键不存在则设置成功 + redisService.set(key, value, expireTimeSec); + LOCK_VALUE_HOLDER.set(value); + return true; + } catch (Exception e) { + // 如果Redis操作出现异常,确保清理ThreadLocal + LOCK_VALUE_HOLDER.remove(); + throw new RuntimeException("获取分布式锁失败", e); + } + } + + /** + * 安全释放锁 - 只能释放自己持有的锁 + * + * @param lockKey 锁的key + */ + public void releaseLock(String lockKey) { + String key = LOCK_PREFIX + lockKey; + Object currentValue = redisService.get(key); + Object expectedValue = LOCK_VALUE_HOLDER.get(); + + // 使用Lua脚本确保原子性,防止误删 + if (currentValue != null && currentValue.equals(expectedValue)) { + redisService.del(key); + } + + LOCK_VALUE_HOLDER.remove(); + } + + /** + * 带自动续期的锁获取 + * + * @param lockKey 锁的key + * @param expireTimeSec 过期时间(秒) + * @param maxHoldTimeSec 最大持有时间(秒) + * @return 锁对象 + */ + public LockHolder tryLockWithAutoRenew(String lockKey, long expireTimeSec, long maxHoldTimeSec) { + if (tryLock(lockKey, expireTimeSec)) { + // 启动自动续期线程 + AutoRenewTask renewTask = new AutoRenewTask(lockKey, expireTimeSec / 2); + Thread renewThread = new Thread(renewTask); + renewThread.setDaemon(true); + renewThread.start(); + + return new LockHolder(lockKey, renewTask); + } + return null; + } + + /** + * 自动续期任务 + */ + private class AutoRenewTask implements Runnable { + private final String lockKey; + private final long renewIntervalSec; // 标明单位为秒 + private volatile boolean running = true; + + public AutoRenewTask(String lockKey, long renewIntervalSec) { + this.lockKey = lockKey; + this.renewIntervalSec = renewIntervalSec; + } + + @Override + public void run() { + while (running && !Thread.currentThread().isInterrupted()) { + try { + Thread.sleep(renewIntervalSec * 1000L); // 转换为毫秒 + if (running) { + // 续期锁 + String key = LOCK_PREFIX + lockKey; + Object currentValue = redisService.get(key); + Object expectedValue = LOCK_VALUE_HOLDER.get(); + + if (currentValue != null && currentValue.equals(expectedValue)) { + redisService.expire(key, DEFAULT_EXPIRE_TIME_SEC); + } else { + // 锁已丢失,停止续期 + break; + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + } + + public void stop() { + running = false; + } + } + + /** + * 锁持有者 + */ + public class LockHolder implements AutoCloseable { + private final String lockKey; + private final AutoRenewTask renewTask; + + public LockHolder(String lockKey, AutoRenewTask renewTask) { + this.lockKey = lockKey; + this.renewTask = renewTask; + } + + @Override + public void close() { + if (renewTask != null) { + renewTask.stop(); + } + releaseLock(lockKey); + } + } +} + From b06826593a66b7281767ba79b7f08000464923a4 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 12 Nov 2025 10:46:39 +0800 Subject: [PATCH 59/64] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/DistributedLockHelper.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java b/mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java index ecd51293..289c365b 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/DistributedLockHelper.java @@ -7,6 +7,34 @@ import org.springframework.stereotype.Component; import java.util.UUID; +/** + * 分布式锁工具类 + * + *

使用示例:

+ *
+ * {@code
+ * // 方式1: 简单使用
+ * DistributedLockHelper lockHelper = new DistributedLockHelper();
+ * if (lockHelper.tryLock("order_create_lock", 30)) {
+ *     try {
+ *         // 执行需要加锁的业务逻辑
+ *         createOrder();
+ *     } finally {
+ *         lockHelper.releaseLock("order_create_lock");
+ *     }
+ * }
+ *
+ * // 方式2: 使用自动续期锁
+ * try (DistributedLockHelper.LockHolder lockHolder =
+ *      lockHelper.tryLockWithAutoRenew("batch_process_lock", 30, 300)) {
+ *     if (lockHolder != null) {
+ *         // 执行长时间业务逻辑
+ *         processBatchData();
+ *     }
+ * }
+ * }
+ * 
+ */ @Component public class DistributedLockHelper { From b04f2d095d7a68fa935ad92ca88fde5f0478da6c Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 12 Nov 2025 14:31:36 +0800 Subject: [PATCH 60/64] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20diy.html=20=20?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=20token=20=E6=B5=8B=E8=AF=95=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/templates/diy.html | 2011 +++++++++-------- 1 file changed, 1051 insertions(+), 960 deletions(-) diff --git a/mall-shop/src/main/resources/templates/diy.html b/mall-shop/src/main/resources/templates/diy.html index 59a5c53d..34680d3a 100644 --- a/mall-shop/src/main/resources/templates/diy.html +++ b/mall-shop/src/main/resources/templates/diy.html @@ -15,10 +15,10 @@ var SYSTEM = SYSTEM || {}; SYSTEM.skin = 'green'; - var authorization = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdG9yZV9pZCI6bnVsbCwiY2hhaW5faWQiOm51bGwsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiMV_ns7vnu5_nrqHnkIblkZgiXSwiY2xpZW50X2lkIjoiYWRtaW4tYXBwIiwicm9sZV9pZCI6OSwic2NvcGUiOlsiYWxsIl0sInNpdGVfaWQiOjAsInVzZXJfbmlja25hbWUiOiLns7vnu5_nrqHnkIblkZgiLCJ1c2VyX2FjY291bnQiOiJhZG1pbiIsImlkIjoxMDAwMSwiZXhwIjoxNzYyODQwMTUyLCJqdGkiOiJhZTZhNDI3Mi1kMzcyLTRjYTktYTVjNC1iMTQ0N2Y5Zjc4MTAifQ.YMx84RgGve-BbAPOGI8qRFk4DaS33PInxBjTdfOwxRkEhaCqOcIWm28o6De6QF_ktVNJXmTQEw1iQNgyrOVSmzOtgqbS7dP9S79_UYZpXwdH_6Wwn2BhAjdmiPz7_h-Qq1HgQTtmDoJk4aLhV0WiAMB7tnX0IvcWYsIox8bV8TA" + var authorization = "${authorization}"; - + @@ -60,18 +60,18 @@
-
+
{{(index+1)}}. {{item.PageTitle?item.PageTitle:'第'+(index+1)+'项'}} @@ -80,12 +80,12 @@ 积分 - - +
-
+
首页
- +
社区
+ :SnsPageId="item.Id" class="weui-switch" type="checkbox" + v-model="item.IsSns" v-on:change="setSnsPage"/>
B端首页
+ :StoreIndexId="item.Id" class="weui-switch" type="checkbox" + v-model="item.StoreIndex" v-on:change="setStoreIndex"/>
资讯
+ :PointPageId="item.Id" :data-page-id="item.Id" class="weui-switch" + data-page-type="IsArticle" type="checkbox" + v-model="item.IsArticle" v-on:change="setDefaultPage"/>
积分
+ :PointPageId="item.Id" :data-page-id="item.Id" class="weui-switch" + data-page-type="IsPoint" type="checkbox" + v-model="item.IsPoint" v-on:change="setDefaultPage"/>
@@ -352,12 +352,14 @@
- + - +
小程序 @@ -369,13 +371,14 @@
-
用户中心 - + class="iconfont icon-zhengzaijieru" + style="font-size: 14px;">
@@ -384,7 +387,7 @@
-
-
    -
  • -
    - +
  • +
    +
    -

    轮播

    +

    轮播

  • -
  • -
    - +
  • +
    +
    -

    图片

    +

    图片

  • -
  • -
    - +
  • +
    +
    -

    图片组

    +

    图片组

  • -
  • -
    - +
  • +
    +
    -

    商品列表

    +

    商品列表

  • -
  • -
    - +
  • +
    +
    -

    功能入口

    +

    功能入口

  • -
  • -
    - +
  • +
    +
    -

    辅助空白

    +

    辅助空白

  • -
  • -
    - +
  • +
    +
    -

    搜索

    +

    搜索

  • -
  • -
    - +
  • +
    +
    -

    电话

    +

    电话

  • - -
    - + +
    +
    -

    背景

    +

    背景

    -
  • -
    - +
  • +
    +
    -

    客服

    +

    客服

  • -
  • -
    - +
  • +
    +
    -

    视频

    +

    视频

  • @@ -509,12 +513,12 @@

    视频

    -
  • -
    - +
  • +
    +
    -

    动态表单

    +

    动态表单

  • @@ -522,78 +526,78 @@

    动态表单

    -
  • -
    - +
  • +
    +
    -

    通告栏

    +

    通告栏

  • -
  • -
    - +
  • +
    +
    -

    标题

    +

    标题

  • -
  • -
    - +
  • +
    +
    -

    营销活动

    +

    营销活动

  • -
  • -
    - +
  • +
    +
    -

    优惠券

    +

    优惠券

  • -
  • -
    - +
  • +
    +
    -

    公众号关注

    +

    公众号关注

  • -
  • -
    - +
  • +
    +
    -

    猜你喜欢

    +

    猜你喜欢

  • -
  • -
    - +
  • +
    +
    -

    附近店铺

    +

    附近店铺

  • -
  • -
    - +
  • +
    +
    -

    秒杀商品

    +

    秒杀商品

  • -
  • -
    - +
  • +
    +
    -

    分类商品

    +

    分类商品

  • - -
  • -
    - + +
  • +
    +
    -

    测试组件

    +

    测试组件

  • - +
-
-
+

{{StoreName}}

@@ -622,16 +626,17 @@
--> -
-
@@ -672,19 +677,19 @@
-
+
  • 自定义装修区域
-
+
  • 常用功能
  • - {{item.name}}
    @@ -692,13 +697,13 @@
-
+
  • 特色功能
  • - {{item.name}}
    @@ -707,7 +712,7 @@
-
-
+
- - - - - - - - - -
+ }" + v-if="item.eltmType==1"> + + + + + + + + + +
    -
  • 编辑 +
  • 编辑
  • -
  • 删除
-
+ borderBottomRightRadius: (item.borderBottomRightRadius||0) + 'px'}" + v-if="item.eltmType==2">

点此编辑『富文本』内容 ——

你可以对文字进行加粗斜体

-
+
    -
  • 编辑 +
  • 编辑
  • -
  • 删除
  • @@ -796,33 +804,37 @@
-
-
+
+
-
- - -
+ borderBottomRightRadius: (item.borderBottomRightRadius||0) + 'px'}" + v-if="item.eltmType==3"> + + +
-
+ v-on:click="editModule">
    -
  • 编辑 +
  • 编辑
  • -
  • 删除
  • @@ -830,26 +842,26 @@
-
+ borderBottomRightRadius: (item.borderBottomRightRadius||0) + 'px'}" + v-if="item.eltmType==4">
- - - - - + + + + +
@@ -862,15 +874,16 @@
0.00
-
+
-
+
buy
-
+
购买
@@ -878,29 +891,29 @@
-
+ borderBottomRightRadius: (item.borderBottomRightRadius||0) + 'px'}" + v-for="items in item.eltm4.data" + v-if="item.eltm4.data.length>0 && items">
-
- - - - - +
+ + + + +
@@ -919,13 +932,13 @@ 商品卖点
+ style="display: inline-block; padding-top: 12px;padding-bottom: 12px " + v-if="items.ProductTips!='' && item.eltm4.isProductTips && !item.eltm4.isPrice"> {{items.ProductTips}}
+ style="display: inline-block; padding-top: 12px;padding-bottom: 12px " + v-if="items.ProductTips=='' && item.eltm4.isProductTips && !item.eltm4.isPrice"> 商品卖点
@@ -934,58 +947,62 @@ v-if="items.ItemSalePrice!='' && item.eltm4.isPrice">{{items.ItemSalePrice}}
+ v-bind:style="{color:item.eltm4.priceColor}" + v-if="items.ItemSalePrice=='' && item.eltm4.isPrice"> 19.88
-
+
-
+
buy
-
+
{{item.eltm4.btnText}}
-
+
    -
  • 编辑 +
  • 编辑
  • -
  • 删除
-
+
辅助空白区域 -
+
    -
  • 编辑 +
  • 编辑
  • -
  • 删除
-
+
-
- {{items.name || '请输入文字'}} - + }" + v-for="items in item.eltm6.data" v-if="item.eltm6.data.length>0"> + {{items.name || '请输入文字'}} +
+ }" v-if="item.eltm6.data.length<=0">
+ }" v-if="item.eltm6.data.length<=0">
-
+
    -
  • 编辑 +
  • 编辑
  • -
  • 删除
-
+ borderBottomRightRadius: (item.borderBottomRightRadius||0) + 'px'}" + v-if="item.eltmType==7"> + v-bind:style="{width:(100/item.eltm7.column)+'%',paddingTop:item.eltm7.paddingTop+'px',paddingBottom:item.eltm7.paddingBottom+'px',paddingLeft:item.eltm7.paddingLeft+'px',paddingRight:item.eltm7.paddingRight+'px',backgroundColor:item.bgColor}" + v-for="items in item.eltm7.data" + v-if="item.eltm7.data.length>0 && items">

{{items.name || '功能入口'}}

- + v-bind:style="{width:(100/item.eltm7.column)+'%',paddingTop:item.eltm7.paddingTop+'px',paddingBottom:item.eltm7.paddingBottom+'px',paddingLeft:item.eltm7.paddingLeft+'px',paddingRight:item.eltm7.paddingRight+'px',backgroundColor:item.bgColor}" + v-for="items in item.eltm7.data" + v-for="items in [1,2,3,4,5,6,7,8,9]" v-if="item.eltm7.data.length==0" + v-if="item.eltm7.data.length>0">

功能入口

-
+
    -
  • 编辑 +
  • 编辑
  • -
  • 删除
-