From 310f8277826754a0edd91cc968382e08d3a4516f Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Fri, 20 Jun 2025 17:46:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E7=9A=84=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/product/ShopProductBase.java | 2 +- .../modules/product/ShopProductItem.java | 12 +- .../modules/store/ShopStoreActivityBase.java | 27 +- .../service/ShopProductBaseService.java | 9 + .../service/ShopProductItemService.java | 9 + .../impl/ShopProductBaseServiceImpl.java | 25 +- .../impl/ShopProductItemServiceImpl.java | 33 ++ .../controller/SyncThirdDataController.java | 35 +- .../mall/shop/sync/keymanage/RedisKey.java | 3 + .../sync/service/SyncThirdDataService.java | 18 + .../service/impl/SyncBaseThirdSxAbstract.java | 51 ++- .../impl/SyncThirdDataServiceImpl.java | 352 +++++++++++++++++- 12 files changed, 544 insertions(+), 32 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductBase.java index 21edad45..9e70324d 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductBase.java @@ -147,7 +147,7 @@ public class ShopProductBase implements Serializable{ @ApiModelProperty(value = "单价") @TableField(updateStrategy=NOT_EMPTY) - private BigDecimal unit_price; + private BigDecimal unit_price; @ApiModelProperty(value = "商品分类编号,通过type决定规格,但是分类下的规格值都不同") @TableField(exist = false) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductItem.java b/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductItem.java index 8397934c..92593241 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductItem.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/product/ShopProductItem.java @@ -174,13 +174,13 @@ public class ShopProductItem implements Serializable { @ApiModelProperty(value = "乐观锁") private Integer version; -// @ApiModelProperty(value = "产品名称") -// @TableField(exist=false) -// private String productName; + @ApiModelProperty(value = "产品itemId组合 用,分开") + @TableField(exist=false) + private String mergedItemId; -// @ApiModelProperty(value = "商品SKU(JSON):{'uniq_id':[item_id, price, url]}") -// @TableField(exist=false) -// private String product_uniqid; + @ApiModelProperty(value = "产品价格组合 用,分开") + @TableField(exist=false) + private String mergedUnitPrices; } 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 756eec60..7249d400 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,9 +1,6 @@ package com.suisung.mall.common.modules.store; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -15,6 +12,8 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; +import static com.baomidou.mybatisplus.annotation.FieldStrategy.NOT_EMPTY; + /** *

* 活动表-通过插件实现 @@ -37,67 +36,87 @@ public class ShopStoreActivityBase implements Serializable { private Integer activity_id; @ApiModelProperty(value = "店铺编号") + @TableField(updateStrategy = NOT_EMPTY) private Integer store_id; @ApiModelProperty(value = "用户编号") + @TableField(updateStrategy = NOT_EMPTY) private Integer user_id; @ApiModelProperty(value = "活动名称") + @TableField(updateStrategy = NOT_EMPTY) private String activity_name; @ApiModelProperty(value = "活动标题") + @TableField(updateStrategy = NOT_EMPTY) private String activity_title; @ApiModelProperty(value = "活动说明") + @TableField(updateStrategy = NOT_EMPTY) private String activity_remark; @ApiModelProperty(value = "套餐编号") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_combo_id; @ApiModelProperty(value = "活动类型") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_type_id; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @ApiModelProperty(value = "活动开始时间") + @TableField(updateStrategy = NOT_EMPTY) private Date activity_starttime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @ApiModelProperty(value = "活动结束时间") + @TableField(updateStrategy = NOT_EMPTY) private Date activity_endtime; @ApiModelProperty(value = "活动状态(ENUM):0-未开启;1-正常;2-已结束;3-管理员关闭;4-商家关闭") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_state; @ApiModelProperty(value = "活动规则(json):不检索{rule_id:{}, rule_id:{}}") + @TableField(updateStrategy = NOT_EMPTY) private String activity_rule; @ApiModelProperty(value = "参与类型(ENUM):1-免费参与;2-积分参与;3-购买参与") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_type; @ApiModelProperty(value = "排序") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_order; @ApiModelProperty(value = "活动是否完成(ENUM):0-未完成;1-已完成;2-已解散(目前用于团购)") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_is_finish; @ApiModelProperty(value = "单品优惠商品编号") + @TableField(updateStrategy = NOT_EMPTY) private String item_id; @ApiModelProperty(value = "分站id") + @TableField(updateStrategy = NOT_EMPTY) private Integer subsite_id; @ApiModelProperty(value = "活动使用等级(DOT)") + @TableField(updateStrategy = NOT_EMPTY) private String activity_use_level; @ApiModelProperty(value = "发布时间") + @TableField(updateStrategy = NOT_EMPTY) private Date activity_releasetime; @ApiModelProperty(value = "活动是否线上或线下:0:线上,1:线下") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_on_is_off; @ApiModelProperty(value = "分享次数") + @TableField(updateStrategy = NOT_EMPTY) private Integer activity_share_num; @Version diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java index 43ba5b21..e84ca01a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductBaseService.java @@ -289,4 +289,13 @@ public interface ShopProductBaseService extends IBaseService { List> shopProductImageList, List shopProductValidPeriodList, List shopProductAssistIndexList); + + /** + * 加载商品 + * @param store_id + * @return + */ + Map getProductBasicIdByStore(Integer store_id); + + void clearBasicIdByStore(Integer store_id); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductItemService.java b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductItemService.java index fec6422d..0bda568f 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductItemService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/product/service/ShopProductItemService.java @@ -70,4 +70,13 @@ public interface ShopProductItemService extends IBaseService { int lockSkuStock(Long itemId, int cart_quantity); + /** + * 加载商品 + * @param store_id + * @return + */ + Map getProductItemIdByStore(Integer store_id); + + void clearProductItemIdByStore(Integer store_id); + } 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 71bec3a4..2bab11cf 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 @@ -51,6 +51,7 @@ import com.suisung.mall.common.utils.CSVUtils; import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.CommonUtil; import com.suisung.mall.common.utils.I18nUtil; +import com.suisung.mall.core.web.service.RedisService; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.activity.service.ShopActivityGroupbookingService; import com.suisung.mall.shop.base.service.*; @@ -68,6 +69,7 @@ import com.suisung.mall.shop.sixun.service.SxSyncGoodsService; import com.suisung.mall.shop.store.service.*; import com.suisung.mall.shop.sync.Utils.ProductPriceCalculator; import com.suisung.mall.shop.sync.Utils.ShopJsonUtils; +import com.suisung.mall.shop.sync.keymanage.RedisKey; import com.suisung.mall.shop.sync.service.ProductMappingService; import com.suisung.mall.shop.user.service.*; import org.apache.commons.lang3.StringUtils; @@ -211,7 +213,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl queryWrapper=new QueryWrapper(); + queryWrapper.select("product_number","product_id"); + List shopProductBaseList= this.list(queryWrapper); + Map map= shopProductBaseList.stream().collect(Collectors.toMap(shopBase->shopBase.getProduct_number(),shopBase->shopBase.getProduct_id())); + redisService.set(RedisKey.STORESHOPPRODUCTKEY,map,60*10); + return map; + } + @Override + public void clearBasicIdByStore(Integer store_id) { + String key=redisService.get(RedisKey.STORESHOPPRODUCTKEY)+":"+store_id; + if(null!=redisService.get(key)){ + redisService.del(key); + } + } } 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 3107d1f6..3e0702b8 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 @@ -55,6 +55,7 @@ import com.suisung.mall.shop.product.mapper.ShopProductItemMapper; import com.suisung.mall.shop.product.pojo.vo.ProductVo; import com.suisung.mall.shop.product.service.*; import com.suisung.mall.shop.store.service.*; +import com.suisung.mall.shop.sync.keymanage.RedisKey; import com.suisung.mall.shop.user.service.ShopUserFavoritesItemService; import com.suisung.mall.shop.user.service.ShopUserProductBrowseService; import io.seata.spring.annotation.GlobalTransactional; @@ -2243,6 +2244,36 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + /** + * 一对多,如product_id:1002,item_number:120_121;数据格式为item_id,item_id item_unit_price,item_unit_price + * 最终组合item_id,item_id_item_unit_price,item_unit_price + */ + queryWrapper.select("product_id","GROUP_CONCAT(item_id SEPARATOR ',') AS mergedItemId","GROUP_CONCAT(item_unit_price SEPARATOR ',') AS mergedUnitPrices"); + queryWrapper.eq("store_id",store_id); + queryWrapper.groupBy("product_id"); + List shopProductItems= this.list(queryWrapper); + + Map map=shopProductItems.stream().collect(Collectors.toMap(ShopProductItem::getProduct_id,shopProductItem->shopProductItem.getMergedItemId() + +"_"+shopProductItem.getMergedUnitPrices())); + redisService.set(key,map,60*10); + return map; + } + + @Override + public void clearProductItemIdByStore(Integer store_id) { + String key= RedisKey.STORESHOPPRODUCITEMTKEY+":"+store_id; + if(null!=redisService.get(key)){ + redisService.del(key); + } + } + /** * 清理库存缓存 * @@ -2257,4 +2288,6 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl folders, - @RequestParam String appKey, + @RequestParam String appKey, + @RequestParam String sign, + @RequestParam Date refreshDate, + @RequestParam String syncType) { + return syncThirdDataService.fileUploadToOss(appKey,sign,syncType,refreshDate,folders); + } + + /** + * todo test + * 目前只同步满减和折扣 + * @param appKey + * @param sign + * @param activeJsonArray + * @return + */ + @ApiOperation(value = "同步活动数据", notes = "同步商品数据") + @RequestMapping(value = "/syncAtive", method = RequestMethod.POST) + public ThirdApiRes syncAtive(@RequestParam String appKey, @RequestParam String sign, - @RequestParam String syncType) { - return syncThirdDataService.fileUploadToOss(appKey,sign,syncType,folders); + @RequestBody JSONArray activeJsonArray) { + syncThirdDataService.syncActives(appKey,sign,activeJsonArray); + return new ThirdApiRes().success("服务器已执行活动数据操作"); + } + + //todo test + @ApiOperation(value = "同步活动商品数据", notes = "同步活动商品数据") + @RequestMapping(value = "/syncAtiveShop", method = RequestMethod.POST) + public ThirdApiRes syncAtiveShop(@RequestParam String appKey, + @RequestParam String sign, + @RequestBody JSONArray activeJsonArray) { + syncThirdDataService.syncActiveShops(appKey,sign,activeJsonArray); + return new ThirdApiRes().success("服务器已执行活动数据操作"); } 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 da034770..c7658c3a 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 @@ -15,4 +15,7 @@ public class RedisKey { public static final String STOREDATAPRODUCTSPECITEM="storedata:ProductSpecItem"; + public static final String STORESHOPPRODUCTKEY="storedata:shopProductkey"; + + public static final String STORESHOPPRODUCITEMTKEY="storedata:shopProductItemKey"; } 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 e7db8458..51854ab1 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 @@ -136,4 +136,22 @@ public interface SyncThirdDataService { * @return */ ThirdApiRes fileUploadToOss(String appKey, String sign, String syncType, List folders); + + /** + *同步活动 + * @param appKey + * @param sign + * @param activeJsonArray + * @return + */ + void syncActives(String appKey, String sign, JSONArray activeJsonArray); + + /** + *同步活动商品 + * @param appKey + * @param sign + * @param activeJsonArray + * @return + */ + void syncActiveShops(String appKey, String sign, JSONArray activeJsonArray); } 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 bc8bccc7..4bf60520 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 @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -29,10 +30,12 @@ import com.suisung.mall.common.modules.pay.PayUserResource; import com.suisung.mall.common.modules.product.*; import com.suisung.mall.common.modules.sixun.SxSyncGoods; import com.suisung.mall.common.modules.sixun.SxSyncVip; +import com.suisung.mall.common.modules.store.ShopStoreActivityBase; import com.suisung.mall.common.modules.store.ShopStoreBase; import com.suisung.mall.common.pojo.req.SyncThirdMemberReq; import com.suisung.mall.common.utils.DateTimeUtils; import com.suisung.mall.common.utils.I18nUtil; +import com.suisung.mall.common.utils.JsonUtil; import com.suisung.mall.common.utils.StringUtils; import com.suisung.mall.shop.base.service.ShopBaseProductBrandService; import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService; @@ -45,6 +48,7 @@ import com.suisung.mall.shop.product.service.ShopProductItemService; import com.suisung.mall.shop.product.service.impl.ShopProductBaseServiceImpl; import com.suisung.mall.shop.product.service.impl.ShopProductItemServiceImpl; import com.suisung.mall.shop.sixun.dto.SxGoosModel; +import com.suisung.mall.shop.store.service.ShopStoreActivityBaseService; import com.suisung.mall.shop.store.service.ShopStoreBaseService; import com.suisung.mall.shop.sync.service.ProductMappingService; import org.apache.commons.lang3.math.NumberUtils; @@ -89,7 +93,7 @@ public abstract class SyncBaseThirdSxAbstract{ private ShopBaseProductSpecService shopBaseProductSpecService; @Autowired - private ProductMappingService productMappingService; + private ShopStoreActivityBaseService shopStoreActivityBaseService; /** * 对商品分类进行保存 @@ -662,10 +666,9 @@ public abstract class SyncBaseThirdSxAbstract{ shopProductItem.setItem_quantity(99); // 库存 shopProductItem.setItem_weight(new BigDecimal("0"));//切割重量 } - shopProductItem.setItem_quantity_frozen(0); shopProductItem.setItem_number(jsonObj.getStr("product_number"));// SKU商家编码 - shopProductItem.setItem_barcode(jsonObj.getStr("product_number")); // 条形码正常情况下就是货号 + shopProductItem.setItem_barcode(jsonObj.getStr("product_barcode")); // 条形码正常情况下就是货号 shopProductItem.setItem_is_default(1); shopProductItem.setItem_enable(shopProductBase.getProduct_state_id()); @@ -813,4 +816,46 @@ public abstract class SyncBaseThirdSxAbstract{ return shopBaseProductSpecService.list(query); } + /** + * 检查哪些活动已经存在 根据活动名称+活动状态 + */ + public Map checkExistingActive(JSONArray jsonArray,Integer storeId) { + List storeProductPairs = jsonArray.stream() + .map(object->{ + final JSONObject jsonObj= (JSONObject) object; + ShopStoreActivityBase shopStoreActivityBase=new ShopStoreActivityBase(); + shopStoreActivityBase.setActivity_name(jsonObj.getStr("activityName")); + shopStoreActivityBase.setActivity_state(jsonObj.getInt("activityState")); + shopStoreActivityBase.setActivity_starttime(jsonObj.getDate("activityStarttime")); + return shopStoreActivityBase; + }) + .distinct() + .collect(Collectors.toList()); + + List existing = batchGetByAtiveShopBase(storeProductPairs,storeId); + return existing.stream() + .collect(Collectors.toMap( + shopStoreActivityBase -> shopStoreActivityBase.getActivity_title()+"_"+shopStoreActivityBase.getActivity_starttime().getTime()+"_"+shopStoreActivityBase.getActivity_state(), + shopStoreActivityBase->shopStoreActivityBase.getActivity_id()+"_"+shopStoreActivityBase.getActivity_rule() + )); + } + + /** + * 批量根据店铺和货号查询商品 + */ + private List batchGetByAtiveShopBase(List shopStoreActivityBases,Integer storeId) { + if (CollUtil.isEmpty(shopStoreActivityBases)) { + return Collections.emptyList(); + } + QueryWrapper query = new QueryWrapper<>(); + query.select("activity_name", "activity_state"); + shopStoreActivityBases.forEach(shopStoreActivityBase -> { + query.or(q -> q.eq("activity_name", shopStoreActivityBase.getActivity_name()).eq("activity_state",shopStoreActivityBase.getActivity_state()) + .eq("activity_starttime",shopStoreActivityBase.getActivity_starttime()) + .eq("store_id", storeId)); + }); + + return shopStoreActivityBaseService.list(query); + } + } 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 b87cf206..8b7edbad 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 @@ -12,11 +12,13 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -72,6 +74,8 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -827,27 +831,347 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements } @Override - public ThirdApiRes fileUploadToOss(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) - .eq(SyncApp::getApp_secret, sign)); - String storeId = syncApp.getStore_id(); - Date tenMinutesAgo = Date.from(Instant.now().minus(Duration.ofMinutes(5)));//校准误差 - Date date = DateUtil.date(tenMinutesAgo); - if (null == syncApp.getStore_id() || syncApp.getStore_id().isEmpty()) { - logger.info("商品id为空"); - return new ThirdApiRes().fail(250, "商品id为空"); + public ThirdApiRes fileUploadToOss(String appKey, String sign, String syncType,Date refreshDate, List folders) { + if (StrUtil.isBlank(appKey) || StrUtil.isBlank(sign) ) { + return new ThirdApiRes().fail(1003, I18nUtil._("缺少必要参数!")); } - if (folders == null || folders.isEmpty()) { + // 验签、appid,必要参数判断 + SyncApp syncApp = syncAppService.getOne(new LambdaQueryWrapper() + .select(SyncApp::getApp_key, SyncApp::getApp_secret,SyncApp::getStore_id) + .eq(SyncApp::getApp_key, appKey) + .eq(SyncApp::getApp_secret,sign)); + if (syncApp == null) { + return new ThirdApiRes().fail(1001, I18nUtil._("签名有误!")); + } + String storeId = syncApp.getStore_id(); + if(null==syncApp.getStore_id()|| syncApp.getStore_id().isEmpty()){ + logger.info("商店id为空"); + return new ThirdApiRes().fail(250,"商店id为空"); + } + if(folders==null||folders.isEmpty()){ logger.info("没有商品数据"); - return new ThirdApiRes().fail(250, "没有商品数据"); + return new ThirdApiRes().fail(250,"没有商品数据"); } - String newfolder = new FileUtils().getSyncTypeFlag(syncType, clientPath) + storeId + FileUtils.pathSeparator + folders.get(0) + FileUtils.pathSeparator; + String newfolder=new FileUtils().getSyncTypeFlag(syncType,clientPath)+storeId+FileUtils.pathSeparator+folders.get(0)+FileUtils.pathSeparator; upLoadZipToOss(newfolder);//上传文件到cos + //更新当前的获取时间,用户客户端获取 + try { + QueryWrapper storeDbConfigQueryWrapper = new QueryWrapper<>(); + storeDbConfigQueryWrapper.eq("store_id", storeId); + StoreDbConfig storeDbConfig=storeDbConfigService.getOne(storeDbConfigQueryWrapper); + if(ObjectUtil.isNotEmpty(storeDbConfig)){ + storeDbConfig.setRefreshTime(refreshDate); + storeDbConfigService.saveOrUpdate(storeDbConfig); + } + }catch (RuntimeException e){ + logger.error("同步时间失败"+e.getMessage()); + } return new ThirdApiRes().success("上传成功"); } + @Override + public ThirdApiRes fileUploadToOss(String appKey, String sign, String syncType,Date refreshDate, List folders) { + if (StrUtil.isBlank(appKey) || StrUtil.isBlank(sign) ) { + return new ThirdApiRes().fail(1003, I18nUtil._("缺少必要参数!")); + } + // 验签、appid,必要参数判断 + SyncApp syncApp = syncAppService.getOne(new LambdaQueryWrapper() + .select(SyncApp::getApp_key, SyncApp::getApp_secret,SyncApp::getStore_id) + .eq(SyncApp::getApp_key, appKey) + .eq(SyncApp::getApp_secret,sign)); + if (syncApp == null) { + return new ThirdApiRes().fail(1001, I18nUtil._("签名有误!")); + } + String storeId = syncApp.getStore_id(); + if(null==syncApp.getStore_id()|| syncApp.getStore_id().isEmpty()){ + logger.info("商店id为空"); + return new ThirdApiRes().fail(250,"商店id为空"); + } + if(folders==null||folders.isEmpty()){ + logger.info("没有商品数据"); + return new ThirdApiRes().fail(250,"没有商品数据"); + } + + String newfolder=new FileUtils().getSyncTypeFlag(syncType,clientPath)+storeId+FileUtils.pathSeparator+folders.get(0)+FileUtils.pathSeparator; + upLoadZipToOss(newfolder);//上传文件到cos + //更新当前的获取时间,用户客户端获取 + try { + QueryWrapper storeDbConfigQueryWrapper = new QueryWrapper<>(); + storeDbConfigQueryWrapper.eq("store_id", storeId); + StoreDbConfig storeDbConfig=storeDbConfigService.getOne(storeDbConfigQueryWrapper); + if(ObjectUtil.isNotEmpty(storeDbConfig)){ + storeDbConfig.setRefreshTime(refreshDate); + storeDbConfigService.saveOrUpdate(storeDbConfig); + } + }catch (RuntimeException e){ + logger.error("同步时间失败"+e.getMessage()); + } + return new ThirdApiRes().success("上传成功"); + } + + @Override + @Async + public void syncActives(String appKey, String sign, JSONArray activeJsonArray) { + if (StrUtil.isBlank(appKey) || StrUtil.isBlank(sign) || ObjectUtil.isEmpty(activeJsonArray)) { + logger.error("缺少必要参数!"); + return; + } + // 验签、appid,必要参数判断 + SyncApp syncAppO = syncAppService.getOne(new LambdaQueryWrapper() + .select(SyncApp::getApp_key, SyncApp::getApp_secret,SyncApp::getStore_id) + .eq(SyncApp::getApp_key, appKey) + .eq(SyncApp::getApp_secret,sign)); + if (syncAppO == null) { + logger.error("签名有误!"); + return; + } + String storeId = syncAppO.getStore_id(); + //活动逻辑 + batchSaveShopStoreActivityBase(activeJsonArray, Integer.valueOf(storeId)); + } + + /** + * 批量新增或更新活动数据 + * @param jsonArray + */ + private void batchSaveShopStoreActivityBase(JSONArray jsonArray,Integer storeId) { + List addshopStoreActivityBaseList=new ArrayList<>(); + List updateShopStoreActivityBaseList=new ArrayList<>(); + Map stringIntegerMap= checkExistingActive(jsonArray,storeId); + jsonArray.stream().parallel().forEach(object->{ + final JSONObject jsonObj= (JSONObject) object; + String activityName=jsonObj.getStr("activityName"); + Integer activityTypeId=jsonObj.getInt("activityTypeId"); + if(null==activityTypeId){ + return; + } + ShopStoreActivityBase shopStoreActivityBase=new ShopStoreActivityBase(); + if (activityTypeId == 1) { + activityTypeId = StateCode.ACTIVITY_TYPE_LIMITED_DISCOUNT; //限时秒杀 + } + if (activityTypeId == 2) { + activityTypeId = StateCode.ACTIVITY_TYPE_ONE_PIECE_DISCOUNT; //折扣 + } + if (activityTypeId == 3) { + JSONArray activeMaxDesList=jsonObj.getJSONArray("activeMaxDesList"); + activityTypeId = StateCode.ACTIVITY_TYPE_REDUCTION; //满减 + String rules= ActiveShopJsonUtils.getRules(activeMaxDesList); + shopStoreActivityBase.setActivity_rule(rules); + } + Date activityStarttime=jsonObj.getDate("activityStarttime"); + Date activityEndtime=jsonObj.getDate("activityEndtime"); + Integer activityState=jsonObj.getInt("activityState"); + Date activityReleasetime= jsonObj.getDate("activityReleasetime"); + BigDecimal discount=jsonObj.getBigDecimal("discount"); + String key=activityName+"_"+activityStarttime.getTime()+"_"+activityState; + shopStoreActivityBase.setActivity_state(activityState); + shopStoreActivityBase.setActivity_name(activityName); + shopStoreActivityBase.setActivity_type(1);//免费参与 + shopStoreActivityBase.setActivity_releasetime(activityReleasetime); + shopStoreActivityBase.setStore_id(storeId); + shopStoreActivityBase.setActivity_on_is_off(0); + shopStoreActivityBase.setActivity_type_id(activityTypeId); + shopStoreActivityBase.setActivity_starttime(activityStarttime); + shopStoreActivityBase.setActivity_endtime(activityEndtime); + shopStoreActivityBase.setActivity_state(activityState); + shopStoreActivityBase.setSubsite_id(0); + if(stringIntegerMap.containsKey(key)){//更新 + String keyVal= MapUtil.getStr(stringIntegerMap,key); + shopStoreActivityBase.setActivity_id(MapUtil.getInt(stringIntegerMap,keyVal.split("_")[0])); + updateShopStoreActivityBaseList.add(shopStoreActivityBase); + }else { + addshopStoreActivityBaseList.add(shopStoreActivityBase); + } + + }); + if(CollectionUtil.isNotEmpty(addshopStoreActivityBaseList)){ + shopStoreActivityBaseService.saveBatch(addshopStoreActivityBaseList,addshopStoreActivityBaseList.size()); + } + if(CollectionUtil.isNotEmpty(updateShopStoreActivityBaseList)){ + shopStoreActivityBaseService.updateBatchById(updateShopStoreActivityBaseList); + } + + } + + + /** + * 将商品添加到活动 + * 1、找出匹配的活动 + * 2、新增商品到活动列表 + * @param appKey + * @param sign + * @param activeJsonArray + */ + @Override + @Async + public void syncActiveShops(String appKey, String sign, JSONArray activeJsonArray) { + if (StrUtil.isBlank(appKey) || StrUtil.isBlank(sign) || ObjectUtil.isEmpty(activeJsonArray)) { + logger.error("缺少必要参数!"); + return; + } + // 验签、appid,必要参数判断 + SyncApp syncAppO = syncAppService.getOne(new LambdaQueryWrapper() + .select(SyncApp::getApp_key, SyncApp::getApp_secret,SyncApp::getStore_id) + .eq(SyncApp::getApp_key, appKey) + .eq(SyncApp::getApp_secret,sign)); + if (syncAppO == null) { + logger.error("签名有误!"); + return; + } + String storeId = syncAppO.getStore_id(); + //把商品添加到活动的逻辑 + batchAddActiveShopBase(activeJsonArray, Integer.valueOf(storeId)); + } + + /** + * 批量新增或更新活动商品数据 + * @param jsonArray + */ + private void batchAddActiveShopBase(JSONArray jsonArray,Integer storeId) { + List updateShopStoreActivityBaseList=new ArrayList<>(); + Map stringIntegerMap= checkExistingActive(jsonArray,storeId); + Map shopProduckKeyMap=shopProductBaseService.getProductBasicIdByStore(storeId);//获取货架号对应的商品id + Map shopItemKeyMap=shopProductItemService.getProductItemIdByStore(storeId);//获取商品id对应的item的id + Map rulesChe=new HashMap();//存储rule格式activeId:rules,如果不存在则从数据库取,存在则从缓存取数据 + jsonArray.forEach(object->{ + final JSONObject jsonObj= (JSONObject) object; + String activityName=jsonObj.getStr("activityName"); + Integer activityTypeId=jsonObj.getInt("activityTypeId"); + if(null==activityTypeId){ + return; + } + String ruleType=""; + List newItems=new ArrayList<>(); + ShopStoreActivityBase shopStoreActivityBase=new ShopStoreActivityBase(); + Integer productId=null; + String itemNo=jsonObj.getStr("itemNo"); + BigDecimal discount=jsonObj.getBigDecimal("discount"); + if(shopProduckKeyMap.containsKey(itemNo)){ + productId= (Integer) shopProduckKeyMap.get(itemNo); + } + if(null==productId){ + return; + } + + Date activityStarttime=jsonObj.getDate("activityStarttime"); + Integer activityState=jsonObj.getInt("activityState"); + + String key=activityName+"_"+activityStarttime.getTime()+"_"+activityState; + + if(stringIntegerMap.containsKey(key)){//更新 + String keyVal=MapUtil.getStr(stringIntegerMap,key); + String activityId=keyVal.split("_")[0]; + String rules=""; + if(null!=rulesChe.get(activityId)){ + rules=rulesChe.get(activityId); + }else { + rules=keyVal.split("_")[1]; + } + String itemIds= (String) shopItemKeyMap.get(productId); + if(null!=itemIds){ + itemIds= (String) shopItemKeyMap.get(String.valueOf(productId)); + } + assert itemIds != null; + if (activityTypeId == 1) {//限时秒杀 + ruleType=ActiveShopJsonUtils.SECKILL; + BigDecimal oldPrice=jsonObj.getBigDecimal("oldPrice"); + BigDecimal specPrice=jsonObj.getBigDecimal("specPrice"); + if(oldPrice.compareTo(BigDecimal.ZERO)>0&&specPrice.compareTo(BigDecimal.ZERO)>0){ + BigDecimal newDiscout=specPrice.divide(oldPrice,4, RoundingMode.HALF_UP); + newItems.addAll(getFulReduItemList(itemIds,ruleType,newDiscout));//获取满减规则的itemid + } + } + if (activityTypeId == 2) {//折扣 + if(discount.compareTo(BigDecimal.ZERO)<=0){ + logger.error("商品折扣要大于0"); + return; + } + ruleType=ActiveShopJsonUtils.DISCOUNT; + newItems.addAll(getFulReduItemList(itemIds,ruleType,discount));//获取满减规则的itemid + } + if (activityTypeId == 3) {//满减 + ruleType=ActiveShopJsonUtils.FULLREDUCE; + newItems.addAll(getFulReduItemList(itemIds,ruleType,null));//获取满减规则的itemid + } + shopStoreActivityBase.setActivity_id(MapUtil.getInt(stringIntegerMap,activityId)); + String newRules= ActiveShopJsonUtils.buildPromotionRule(ruleType,rules,newItems); + rulesChe.put(activityId,newRules); + shopStoreActivityBase.setActivity_rule(rules); + updateShopStoreActivityBaseList.add(shopStoreActivityBase); + } + + }); + if(CollectionUtil.isNotEmpty(updateShopStoreActivityBaseList)){ + shopStoreActivityBaseService.updateBatchById(updateShopStoreActivityBaseList); + } + + } + + /** + * 一对多,如product_id:1002,item_number:120_121;数据格式为item_id,item_id item_unit_price,item_unit_price + * 最终组合item_id,item_id_item_unit_price,item_unit_price + * 满减的切割规则的itemid + * @param itemPrice + * @return + */ + private List getFulReduItemList(String itemPrice,String activeType,BigDecimal discount){ + List newItems=new ArrayList<>(); + String [] itemPriceArray=itemPrice.split("_"); + String itemIds=itemPriceArray[0]; + String unitPrices=itemPriceArray[1]; + switch (activeType){ + case ActiveShopJsonUtils.DISCOUNT: + if(itemIds.contains(",")){ + String [] itemIdsArray=itemIds.split(","); + for (String itemId : itemIdsArray) { + org.json.JSONObject jsonObject = new org.json.JSONObject(); + jsonObject.put("item_id", itemId); + jsonObject.put("rate", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(100)))); + newItems.add(jsonObject); + } + }else { + org.json.JSONObject jsonObject=new org.json.JSONObject(); + jsonObject.put("item_id",itemIds); + jsonObject.put("rate", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(100)))); + newItems.add(jsonObject); + } + break; + case ActiveShopJsonUtils.FULLREDUCE: + if(itemIds.contains(",")){ + String [] itemIdsArray=itemIds.split(","); + for(String itemId:itemIdsArray){ + org.json.JSONObject jsonObject=new org.json.JSONObject(); + jsonObject.put("item_id",itemId); + newItems.add(jsonObject); + } + }else { + org.json.JSONObject jsonObject=new org.json.JSONObject(); + jsonObject.put("item_id",itemIds); + newItems.add(jsonObject); + } + break; + case ActiveShopJsonUtils.SECKILL: + if(itemIds.contains(",")){ + String [] unitPricesArray=unitPrices.split(","); + String [] itemIdsArray=itemIds.split(","); + for (int i=0;i