新增超市商品图库批量匹配功能
This commit is contained in:
parent
4ad20c0f51
commit
0189a7e9cd
@ -39,42 +39,55 @@ public class ShopProductBase implements Serializable{
|
|||||||
private Long product_id;
|
private Long product_id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "产品名称(in=>2,100)")
|
@ApiModelProperty(value = "产品名称(in=>2,100)")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_name;
|
private String product_name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品货号")
|
@ApiModelProperty(value = "商品货号")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_number;
|
private String product_number;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品卖点:商品广告词")
|
@ApiModelProperty(value = "商品卖点:商品广告词")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_tips;
|
private String product_tips;
|
||||||
|
|
||||||
@ApiModelProperty(value = "店铺编号")
|
@ApiModelProperty(value = "店铺编号")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer store_id;
|
private Integer store_id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "店铺名称")
|
@ApiModelProperty(value = "店铺名称")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String store_name;
|
private String store_name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "市场价")
|
@ApiModelProperty(value = "市场价")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private BigDecimal product_market_price;
|
private BigDecimal product_market_price;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品单价")
|
@ApiModelProperty(value = "商品单价")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private BigDecimal product_unit_price;
|
private BigDecimal product_unit_price;
|
||||||
|
|
||||||
@ApiModelProperty(value = "成本价")
|
@ApiModelProperty(value = "成本价")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private BigDecimal product_cost_price;
|
private BigDecimal product_cost_price;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品主图")
|
@ApiModelProperty(value = "商品主图")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_image;
|
private String product_image;
|
||||||
|
|
||||||
@ApiModelProperty(value = "产品视频 ")
|
@ApiModelProperty(value = "产品视频 ")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_video;
|
private String product_video;
|
||||||
|
|
||||||
@ApiModelProperty(value = "选择售卖区域:完成售卖区域及运费设置")
|
@ApiModelProperty(value = "选择售卖区域:完成售卖区域及运费设置")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer transport_type_id;
|
private Integer transport_type_id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "如果启用跳转页面")
|
@ApiModelProperty(value = "如果启用跳转页面")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_seo_url;
|
private String product_seo_url;
|
||||||
|
|
||||||
@ApiModelProperty(value = "专题布局编号")
|
@ApiModelProperty(value = "专题布局编号")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer layout_route_id;
|
private Integer layout_route_id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品审核(ENUM):3001-审核通过;3002-审核中;3000-审核未通过")
|
@ApiModelProperty(value = "商品审核(ENUM):3001-审核通过;3002-审核中;3000-审核未通过")
|
||||||
@ -86,48 +99,63 @@ public class ShopProductBase implements Serializable{
|
|||||||
private Integer product_state_id;
|
private Integer product_state_id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "库存锁定(ENUM):1001-下单锁定;1002-支付锁定;")
|
@ApiModelProperty(value = "库存锁定(ENUM):1001-下单锁定;1002-支付锁定;")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer product_inventory_lock;
|
private Integer product_inventory_lock;
|
||||||
|
|
||||||
@ApiModelProperty(value = "上架时间:预设上架时间,可以动态修正状态")
|
@ApiModelProperty(value = "上架时间:预设上架时间,可以动态修正状态")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Date product_sale_time;
|
private Date product_sale_time;
|
||||||
|
|
||||||
@ApiModelProperty(value = "计量单位")
|
@ApiModelProperty(value = "计量单位")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer unit_id;
|
private Integer unit_id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "原产国")
|
@ApiModelProperty(value = "原产国")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_country;
|
private String product_country;
|
||||||
|
|
||||||
@ApiModelProperty(value = "币值")
|
@ApiModelProperty(value = "币值")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_currency;
|
private String product_currency;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品添加时间")
|
@ApiModelProperty(value = "商品添加时间")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Long product_add_time;
|
private Long product_add_time;
|
||||||
|
|
||||||
@ApiModelProperty(value = "积分单价")
|
@ApiModelProperty(value = "积分单价")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private BigDecimal product_unit_points;
|
private BigDecimal product_unit_points;
|
||||||
|
|
||||||
@ApiModelProperty(value = "资源2单价")
|
@ApiModelProperty(value = "资源2单价")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer product_unit_sp;
|
private Integer product_unit_sp;
|
||||||
|
|
||||||
@ApiModelProperty(value = "排序")
|
@ApiModelProperty(value = "排序")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer product_order;
|
private Integer product_order;
|
||||||
|
|
||||||
@ApiModelProperty(value = "产品来源编号")
|
@ApiModelProperty(value = "产品来源编号")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Long product_src_id;
|
private Long product_src_id;
|
||||||
|
|
||||||
@ApiModelProperty(value = "供应状态(BOOL):1-启用分销;0-禁用分销")
|
@ApiModelProperty(value = "供应状态(BOOL):1-启用分销;0-禁用分销")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer product_fx_enable;
|
private Integer product_fx_enable;
|
||||||
|
|
||||||
@ApiModelProperty(value = "三级分销(BOOL):1-启用分销;0-禁用分销")
|
@ApiModelProperty(value = "三级分销(BOOL):1-启用分销;0-禁用分销")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer product_dist_enable;
|
private Integer product_dist_enable;
|
||||||
|
|
||||||
@ApiModelProperty(value = "平台佣金百分比")
|
@ApiModelProperty(value = "平台佣金百分比")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private BigDecimal product_commission_rate;
|
private BigDecimal product_commission_rate;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品来源(ENUM):1000-发布;1001-天猫;1002-淘宝;1003-阿里巴巴;1004-京东;1005-思迅;")
|
@ApiModelProperty(value = "商品来源(ENUM):1000-发布;1001-天猫;1002-淘宝;1003-阿里巴巴;1004-京东;1005-思迅;")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private Integer product_from;
|
private Integer product_from;
|
||||||
|
|
||||||
@ApiModelProperty(value = "来源网址")
|
@ApiModelProperty(value = "来源网址")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String product_from_url;
|
private String product_from_url;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品表-SKU表数据")
|
@ApiModelProperty(value = "商品表-SKU表数据")
|
||||||
@ -136,6 +164,7 @@ public class ShopProductBase implements Serializable{
|
|||||||
|
|
||||||
//在同步数据的时候,生鲜需要按平台的规格拆分售卖,这些主要记录原始数据,总重量一般为kg,KG,公斤
|
//在同步数据的时候,生鲜需要按平台的规格拆分售卖,这些主要记录原始数据,总重量一般为kg,KG,公斤
|
||||||
@ApiModelProperty(value = "总量单位")
|
@ApiModelProperty(value = "总量单位")
|
||||||
|
@TableField(updateStrategy=NOT_EMPTY)
|
||||||
private String unit_name;
|
private String unit_name;
|
||||||
|
|
||||||
@ApiModelProperty(value = "总重量")
|
@ApiModelProperty(value = "总重量")
|
||||||
|
|||||||
@ -62,5 +62,13 @@ public class ShopProductImage implements Serializable {
|
|||||||
@ApiModelProperty(value = "扩展图片")
|
@ApiModelProperty(value = "扩展图片")
|
||||||
private String item_image_ext_2;
|
private String item_image_ext_2;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品货号同步数据用")
|
||||||
|
private String product_number;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "产品名称同步数据用")
|
||||||
|
private String product_name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品来源(ENUM):1000-发布;1001-天猫;1002-淘宝;1003-阿里巴巴;1004-京东;1005-思迅;同步数据匹配")
|
||||||
|
private String product_from;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
package com.suisung.mall.common.modules.sync;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ImageMappingDto {
|
||||||
|
@ApiModelProperty(value = "商品图片编号")
|
||||||
|
private Long productImageId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "产品编号:product_id-color_id")
|
||||||
|
private Long productId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "店铺编号")
|
||||||
|
private Integer storeId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "合并图库url")
|
||||||
|
private String mergedImageUrl;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "主图")
|
||||||
|
private String thumb;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "图库商品名称")
|
||||||
|
private String imgProductName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 为URL添加域名前缀(如果URL不是以http/https开头)
|
||||||
|
*
|
||||||
|
* @param imageDomain 图片域名
|
||||||
|
* @param url 图片URL
|
||||||
|
* @return 添加域名前缀后的URL
|
||||||
|
*/
|
||||||
|
public String addDomainPrefix(String imageDomain, String url) {
|
||||||
|
if (url == null || url.startsWith("http://") || url.startsWith("https://")) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
return imageDomain + (url.startsWith("/") ? url : "/" + url);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
package com.suisung.mall.common.modules.sync;
|
||||||
|
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 io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
@Data
|
||||||
|
@TableName("shop_image_mapping_temp")
|
||||||
|
@ApiModel("商品图片映射临时表")
|
||||||
|
public class ShopImageMappingTemp {
|
||||||
|
|
||||||
|
@TableId(type = IdType.AUTO)
|
||||||
|
@ApiModelProperty(value = "临时表ID", example = "1")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@TableField("product_image_id")
|
||||||
|
@ApiModelProperty(value = "商品图片编号", example = "1001")
|
||||||
|
private Long productImageId;
|
||||||
|
|
||||||
|
@TableField("product_id")
|
||||||
|
@ApiModelProperty(value = "产品编号(product_id-color_id)", example = "2001-1")
|
||||||
|
private Long productId;
|
||||||
|
|
||||||
|
@TableField("product_name")
|
||||||
|
@ApiModelProperty(value = "产品名称(同步数据用)", example = "夏季新款T恤")
|
||||||
|
private String productName;
|
||||||
|
|
||||||
|
@TableField("store_id")
|
||||||
|
@ApiModelProperty(value = "店铺编号", example = "3001")
|
||||||
|
private Integer storeId;
|
||||||
|
|
||||||
|
@TableField("merged_image_url")
|
||||||
|
@ApiModelProperty(value = "合并后的图片URL", example = "http://example.com/image1.jpg,http://example.com/image2.jpg")
|
||||||
|
private String mergedImageUrl;
|
||||||
|
|
||||||
|
@TableField("name")
|
||||||
|
@ApiModelProperty(value = "图库商品名", example = "夏季男士短袖T恤")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@TableField("thumb")
|
||||||
|
@ApiModelProperty(value = "主图URL", example = "http://example.com/thumb.jpg")
|
||||||
|
private String thumb;
|
||||||
|
|
||||||
|
@TableField("create_time")
|
||||||
|
@ApiModelProperty(value = "创建时间", example = "2023-01-01 00:00:00")
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
@TableField("update_time")
|
||||||
|
@ApiModelProperty(value = "更新时间", example = "2023-01-01 00:00:00")
|
||||||
|
private Date updateTime;
|
||||||
|
}
|
||||||
@ -220,7 +220,8 @@ public class AnalyticsOrderServiceImpl implements AnalyticsOrderService {
|
|||||||
TimeRange range = TimeUtil.today();
|
TimeRange range = TimeUtil.today();
|
||||||
|
|
||||||
//统计没有取消的订单
|
//统计没有取消的订单
|
||||||
List<Integer> orderState = Arrays.asList(StateCode.ORDER_STATE_WAIT_PAY, StateCode.ORDER_STATE_WAIT_PAID, StateCode.ORDER_STATE_WAIT_REVIEW, StateCode.ORDER_STATE_WAIT_FINANCE_REVIEW, StateCode.ORDER_STATE_PICKING, StateCode.ORDER_STATE_WAIT_SHIPPING, StateCode.ORDER_STATE_SHIPPED, StateCode.ORDER_STATE_RECEIVED, StateCode.ORDER_STATE_FINISH, StateCode.ORDER_STATE_SELF_PICKUP);
|
List<Integer> orderState = Arrays.asList(StateCode.ORDER_STATE_WAIT_PAY, StateCode.ORDER_STATE_WAIT_PAID, StateCode.ORDER_STATE_WAIT_REVIEW, StateCode.ORDER_STATE_WAIT_FINANCE_REVIEW, StateCode.ORDER_STATE_PICKING, StateCode.ORDER_STATE_WAIT_SHIPPING, StateCode.ORDER_STATE_SHIPPED, StateCode.ORDER_STATE_RECEIVED, StateCode.ORDER_STATE_FINISH, StateCode.ORDER_STATE_SELF_PICKUP,
|
||||||
|
StateCode.ORDER_STATE_CANCEL);
|
||||||
List<Integer> paidState = Arrays.asList(StateCode.ORDER_PAID_STATE_PART, StateCode.ORDER_PAID_STATE_YES);
|
List<Integer> paidState = Arrays.asList(StateCode.ORDER_PAID_STATE_PART, StateCode.ORDER_PAID_STATE_YES);
|
||||||
|
|
||||||
OrderNumVo todayOrderNum = analyticsOrderDao.getOrderNum(range.getStart(), range.getEnd(), orderState, null, null, null, siteId, storeId);
|
OrderNumVo todayOrderNum = analyticsOrderDao.getOrderNum(range.getStart(), range.getEnd(), orderState, null, null, null, siteId, storeId);
|
||||||
|
|||||||
@ -2,8 +2,13 @@ package com.suisung.mall.shop.product.mapper;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.suisung.mall.common.modules.product.ShopProductImage;
|
import com.suisung.mall.common.modules.product.ShopProductImage;
|
||||||
|
import com.suisung.mall.common.modules.sync.ImageMappingDto;
|
||||||
|
import io.lettuce.core.dynamic.annotation.Param;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* 产品图片表,按照颜色规格 Mapper 接口
|
* 产品图片表,按照颜色规格 Mapper 接口
|
||||||
@ -16,4 +21,18 @@ import org.springframework.stereotype.Repository;
|
|||||||
@Repository
|
@Repository
|
||||||
public interface ShopProductImageMapper extends BaseMapper<ShopProductImage> {
|
public interface ShopProductImageMapper extends BaseMapper<ShopProductImage> {
|
||||||
|
|
||||||
|
Integer mappingByBarCodeCount(@Param("storeId") Integer storeId);
|
||||||
|
|
||||||
|
Integer mappingByProductNameCount(@Param("storeId") Integer storeId);
|
||||||
|
|
||||||
|
Integer mappingByProductShortNameCount(@Param("storeId") Integer storeId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1、条形码匹配
|
||||||
|
* 2、标准名称匹配
|
||||||
|
* 3、产品名称模糊匹配
|
||||||
|
* @param type
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<ImageMappingDto> mappingProductImage(@Param("type") String type,@Param("storeId") Integer storeId,@Param("offset") Integer offset,@Param("limit") Integer limit);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -286,7 +286,7 @@ public interface ShopProductBaseService extends IBaseService<ShopProductBase> {
|
|||||||
Pair<Boolean, String> saveProductBatch(List<ShopProductBase> shopProductBaseList, List<ShopProductIndex> shopProductIndexList,
|
Pair<Boolean, String> saveProductBatch(List<ShopProductBase> shopProductBaseList, List<ShopProductIndex> shopProductIndexList,
|
||||||
List<ShopProductData> shopProductDataList, List<ShopProductDetail> shopProductDetailList,
|
List<ShopProductData> shopProductDataList, List<ShopProductDetail> shopProductDetailList,
|
||||||
List<ShopProductInfo> shopProductInfoList, List<List<ShopProductItem>> shopProductItemList,
|
List<ShopProductInfo> shopProductInfoList, List<List<ShopProductItem>> shopProductItemList,
|
||||||
List<List<ShopProductImage>> shopProductImageList,
|
List<ShopProductImage> shopProductImageList,
|
||||||
List<ShopProductValidPeriod> shopProductValidPeriodList,
|
List<ShopProductValidPeriod> shopProductValidPeriodList,
|
||||||
List<ShopProductAssistIndex> shopProductAssistIndexList);
|
List<ShopProductAssistIndex> shopProductAssistIndexList);
|
||||||
|
|
||||||
|
|||||||
@ -5271,7 +5271,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
public Pair<Boolean, String> saveProductBatch(List<ShopProductBase> shopProductBaseList, List<ShopProductIndex> shopProductIndexList,
|
public Pair<Boolean, String> saveProductBatch(List<ShopProductBase> shopProductBaseList, List<ShopProductIndex> shopProductIndexList,
|
||||||
List<ShopProductData> shopProductDataList, List<ShopProductDetail> shopProductDetailList,
|
List<ShopProductData> shopProductDataList, List<ShopProductDetail> shopProductDetailList,
|
||||||
List<ShopProductInfo> shopProductInfoList, List<List<ShopProductItem>> shopProductItemList,
|
List<ShopProductInfo> shopProductInfoList, List<List<ShopProductItem>> shopProductItemList,
|
||||||
List<List<ShopProductImage>> shopProductImageList, List<ShopProductValidPeriod> shopProductValidPeriodList,
|
List<ShopProductImage> shopProductImageList, List<ShopProductValidPeriod> shopProductValidPeriodList,
|
||||||
List<ShopProductAssistIndex> shopProductAssistIndexList) {
|
List<ShopProductAssistIndex> shopProductAssistIndexList) {
|
||||||
|
|
||||||
// 1. 参数校验
|
// 1. 参数校验
|
||||||
@ -5301,8 +5301,8 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
List<List<ShopProductItem>> newShopProductItemList=new ArrayList<>();
|
List<List<ShopProductItem>> newShopProductItemList=new ArrayList<>();
|
||||||
List<List<ShopProductItem>> updateShopProductItemList=new ArrayList<>();
|
List<List<ShopProductItem>> updateShopProductItemList=new ArrayList<>();
|
||||||
|
|
||||||
List<List<ShopProductImage>> newShopProductImageList=new ArrayList<>();
|
List<ShopProductImage> newShopProductImageList=new ArrayList<>();
|
||||||
List<List<ShopProductImage>> updateShopProductImageList=new ArrayList<>();
|
List<ShopProductImage> updateShopProductImageList=new ArrayList<>();
|
||||||
|
|
||||||
List<ShopProductValidPeriod> newShopProductValidPeriodList=new ArrayList<>();
|
List<ShopProductValidPeriod> newShopProductValidPeriodList=new ArrayList<>();
|
||||||
List<ShopProductValidPeriod> updateShopProductValidPeriodList=new ArrayList<>();
|
List<ShopProductValidPeriod> updateShopProductValidPeriodList=new ArrayList<>();
|
||||||
@ -5429,7 +5429,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
List<ShopProductDetail> newShopProductDetailList, List<ShopProductDetail> updateShopProductDetailList,
|
List<ShopProductDetail> newShopProductDetailList, List<ShopProductDetail> updateShopProductDetailList,
|
||||||
List<ShopProductInfo> newShopProductInfoList, List<ShopProductInfo> updateShopProductInfoList,
|
List<ShopProductInfo> newShopProductInfoList, List<ShopProductInfo> updateShopProductInfoList,
|
||||||
List<List<ShopProductItem>> newShopProductItemList,List<List<ShopProductItem>> udpateShopProductItemList,
|
List<List<ShopProductItem>> newShopProductItemList,List<List<ShopProductItem>> udpateShopProductItemList,
|
||||||
List<List<ShopProductImage>> newShopProductImageList, List<List<ShopProductImage>> udpteShopProductImageList,
|
List<ShopProductImage> newShopProductImageList, List<ShopProductImage> udpteShopProductImageList,
|
||||||
List<ShopProductValidPeriod> newShopProductValidPeriodList, List<ShopProductValidPeriod> updateShopProductValidPeriodList,
|
List<ShopProductValidPeriod> newShopProductValidPeriodList, List<ShopProductValidPeriod> updateShopProductValidPeriodList,
|
||||||
List<ShopProductAssistIndex> newShopProductAssistIndexList, List<ShopProductAssistIndex> udpateShopProductAssistIndexList
|
List<ShopProductAssistIndex> newShopProductAssistIndexList, List<ShopProductAssistIndex> udpateShopProductAssistIndexList
|
||||||
) {
|
) {
|
||||||
@ -5472,16 +5472,6 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
newShopProductDataList.get(i).setProduct_id(productId);
|
newShopProductDataList.get(i).setProduct_id(productId);
|
||||||
newShopProductDetailList.get(i).setProduct_id(productId);
|
newShopProductDetailList.get(i).setProduct_id(productId);
|
||||||
newShopProductInfoList.get(i).setProduct_id(productId);
|
newShopProductInfoList.get(i).setProduct_id(productId);
|
||||||
// newShopProductInfoList.get(i).setProductName(newProducts.get(i).getProduct_name());
|
|
||||||
//计算规格
|
|
||||||
// ShopProductSpecItem shopProductSpecItem=processShopProductSpecItem(base);
|
|
||||||
// if(null!=shopProductSpecItem){
|
|
||||||
// if(shopProductSpecItem.isUpdate()){
|
|
||||||
// updateShopProductSpecItems.add(shopProductSpecItem);
|
|
||||||
// }else {
|
|
||||||
// addShopProductSpecItems.add(shopProductSpecItem);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// 处理商品项
|
// 处理商品项
|
||||||
List<ShopProductItem> items = newShopProductItemList.get(i);
|
List<ShopProductItem> items = newShopProductItemList.get(i);
|
||||||
processProductItems(items, productId, addItemSeqs);
|
processProductItems(items, productId, addItemSeqs);
|
||||||
@ -5489,7 +5479,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
|
|
||||||
// 处理图片
|
// 处理图片
|
||||||
if(CollUtil.isNotEmpty(newShopProductImageList)){
|
if(CollUtil.isNotEmpty(newShopProductImageList)){
|
||||||
processProductImages(newShopProductImageList.get(i), productId,base.getStore_id());
|
processProductImages(newShopProductImageList.get(i), productId,base.getStore_id(),newProducts.get(i).getProduct_number(),newProducts.get(i).getProduct_name());//设置默认属性1
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理辅助属性
|
// 处理辅助属性
|
||||||
@ -5531,26 +5521,15 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
updateShopProductDataList.get(i).setProduct_id(productId);
|
updateShopProductDataList.get(i).setProduct_id(productId);
|
||||||
updateShopProductDetailList.get(i).setProduct_id(productId);
|
updateShopProductDetailList.get(i).setProduct_id(productId);
|
||||||
updateShopProductInfoList.get(i).setProduct_id(productId);
|
updateShopProductInfoList.get(i).setProduct_id(productId);
|
||||||
//updateShopProductInfoList.get(i).setProductName(updateProducts.get(i).getProduct_name());
|
|
||||||
//计算规格
|
//计算规格
|
||||||
// ShopProductSpecItem shopProductSpecItem=processShopProductSpecItem(base);
|
|
||||||
// if(null!=shopProductSpecItem){
|
|
||||||
// if(shopProductSpecItem.isUpdate()){
|
|
||||||
// updateShopProductSpecItems.add(shopProductSpecItem);
|
|
||||||
// }else {
|
|
||||||
// addShopProductSpecItems.add(shopProductSpecItem);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// 处理商品项
|
// 处理商品项
|
||||||
List<ShopProductItem> items = udpateShopProductItemList.get(i);
|
List<ShopProductItem> items = udpateShopProductItemList.get(i);
|
||||||
processProductItems(items, productId, updateItemSeqs);//
|
processProductItems(items, productId, updateItemSeqs);//
|
||||||
updateShopProductItems.addAll(items);
|
updateShopProductItems.addAll(items);
|
||||||
//allItemIds.addAll(itemIds);
|
|
||||||
// productToItemsMap.put(productId, itemIds);
|
|
||||||
|
|
||||||
// 处理图片
|
// 处理图片
|
||||||
if(CollUtil.isNotEmpty(udpteShopProductImageList)){
|
if(CollUtil.isNotEmpty(udpteShopProductImageList)){
|
||||||
processProductImages(udpteShopProductImageList.get(i), productId,base.getStore_id());
|
processProductImages(udpteShopProductImageList.get(i), productId,base.getStore_id(),updateProducts.get(i).getProduct_number(),updateProducts.get(i).getProduct_name());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理辅助属性
|
// 处理辅助属性
|
||||||
@ -5584,7 +5563,7 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
batchProcessOtherTables(newShopProductIndexList,updateShopProductIndexList,newShopProductDataList,updateShopProductDataList,
|
batchProcessOtherTables(newShopProductIndexList,updateShopProductIndexList,newShopProductDataList,updateShopProductDataList,
|
||||||
newShopProductDetailList,updateShopProductDetailList,newShopProductInfoList,updateShopProductInfoList,
|
newShopProductDetailList,updateShopProductDetailList,newShopProductInfoList,updateShopProductInfoList,
|
||||||
newShopProductValidPeriodList,updateShopProductValidPeriodList,addShopProductItems,updateShopProductItems,
|
newShopProductValidPeriodList,updateShopProductValidPeriodList,addShopProductItems,updateShopProductItems,
|
||||||
addAnalyticsList,udpateAnalyticsList,addItemSeqs,updateItemSeqs);
|
addAnalyticsList,udpateAnalyticsList,addItemSeqs,updateItemSeqs,newShopProductImageList,udpteShopProductImageList);
|
||||||
logger.info("处理成功,新增{}条,更新{}条", newProducts.size(), updateProducts.size());
|
logger.info("处理成功,新增{}条,更新{}条", newProducts.size(), updateProducts.size());
|
||||||
|
|
||||||
//计算规格
|
//计算规格
|
||||||
@ -5612,7 +5591,8 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
List<ShopProductValidPeriod> newShopProductValidPeriodList,List<ShopProductValidPeriod> updateShopProductValidPeriodList,
|
List<ShopProductValidPeriod> newShopProductValidPeriodList,List<ShopProductValidPeriod> updateShopProductValidPeriodList,
|
||||||
List<ShopProductItem> newshopProductItemList,List<ShopProductItem> updateshopProductItemList,
|
List<ShopProductItem> newshopProductItemList,List<ShopProductItem> updateshopProductItemList,
|
||||||
List<ShopProductAnalytics> newShopProductAnalyticList,List<ShopProductAnalytics> updateShopProductAnalyticList,
|
List<ShopProductAnalytics> newShopProductAnalyticList,List<ShopProductAnalytics> updateShopProductAnalyticList,
|
||||||
List<ShopProductItemSeq> newShopProductItemSeqList,List<ShopProductItemSeq> updateShopProductItemSeqList) {
|
List<ShopProductItemSeq> newShopProductItemSeqList,List<ShopProductItemSeq> updateShopProductItemSeqList,
|
||||||
|
List<ShopProductImage> addShopProductImageList,List<ShopProductImage> updateShopProductImageList) {
|
||||||
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
||||||
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
|
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
|
||||||
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
|
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
|
||||||
@ -5660,6 +5640,21 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
logger.info("更新updateShopProductDataList-{}条数据耗时:{}",updateShopProductDataList.size(),duration/1000000000);
|
logger.info("更新updateShopProductDataList-{}条数据耗时:{}",updateShopProductDataList.size(),duration/1000000000);
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
if(CollectionUtil.isNotEmpty(addShopProductImageList)){
|
||||||
|
long startTime=System.nanoTime();
|
||||||
|
shopProductImageService.saveBatch(addShopProductImageList,addShopProductImageList.size());
|
||||||
|
long endTime = System.nanoTime();
|
||||||
|
long duration = (endTime - startTime);
|
||||||
|
logger.info("新增addShopProductImageList-{}条数据耗时:{}",addShopProductImageList.size(),duration/1000000000);
|
||||||
|
}
|
||||||
|
// if(CollectionUtil.isNotEmpty(updateShopProductImageList)){
|
||||||
|
// long startTime=System.nanoTime();
|
||||||
|
// // shopProductImageService.batchUpdateByCondition(updateShopProductImageList,"product_id");
|
||||||
|
// // updateBatchById();
|
||||||
|
// long endTime = System.nanoTime();
|
||||||
|
// long duration = (endTime - startTime);
|
||||||
|
// logger.info("更新updateShopProductImageList-{}条数据耗时:{}",updateShopProductImageList.size(),duration/1000000000);
|
||||||
|
// }
|
||||||
}catch (RuntimeException e){
|
}catch (RuntimeException e){
|
||||||
logger.info("批量报错附表失败{}",e.getMessage());
|
logger.info("批量报错附表失败{}",e.getMessage());
|
||||||
}
|
}
|
||||||
@ -6038,79 +6033,22 @@ public class ShopProductBaseServiceImpl extends BaseServiceImpl<ShopProductBaseM
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理商品图片批量操作
|
* 处理商品图片批量操作
|
||||||
* @param productImages 商品图片列表
|
* @param productImage 商品图片列表
|
||||||
* @param productId 商品ID
|
* @param productId 商品ID
|
||||||
*/
|
*/
|
||||||
private void processProductImages(List<ShopProductImage> productImages, Long productId, Integer storeId) {
|
private void processProductImages(ShopProductImage productImage, Long productId, Integer storeId,String productNumber,String productName) {
|
||||||
if (CollUtil.isEmpty(productImages)) {
|
if (ObjectUtil.isEmpty(productImage)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
productImage.setProduct_id(productId);
|
||||||
|
productImage.setStore_id(storeId);
|
||||||
|
|
||||||
// 1. 查询现有图片
|
productImage.setColor_id(0L);
|
||||||
List<ShopProductImage> existingImages = shopProductImageService.getShopProductImageByStoreId(storeId);
|
productImage.setItem_image_default("1");//设置默认属性1,方便查询匹配图库
|
||||||
Map<Long, ShopProductImage> existingImageMap = existingImages.stream()
|
productImage.setProduct_number(productNumber);
|
||||||
.collect(Collectors.toMap(ShopProductImage::getProduct_image_id, Function.identity()));
|
productImage.setProduct_name(productName);
|
||||||
|
|
||||||
// 2. 分离需要新增、更新和删除的图片
|
|
||||||
List<ShopProductImage> toAdd = new ArrayList<>();
|
|
||||||
List<ShopProductImage> toUpdate = new ArrayList<>();
|
|
||||||
List<Long> toDelete = new ArrayList<>();
|
|
||||||
List<String> delBaiduImages = new ArrayList<>();
|
|
||||||
List<String> addBaiduImages = new ArrayList<>();
|
|
||||||
|
|
||||||
for (ShopProductImage newImage : productImages) {
|
|
||||||
newImage.setProduct_id(productId);
|
|
||||||
// 设置默认值
|
|
||||||
newImage.setItem_image_ext_1("");
|
|
||||||
newImage.setItem_image_ext_2("");
|
|
||||||
|
|
||||||
// 判断是新增还是更新
|
|
||||||
if (newImage.getProduct_image_id() == null) {
|
|
||||||
toAdd.add(newImage);
|
|
||||||
if (StrUtil.isNotBlank(newImage.getItem_image_default())) {
|
|
||||||
addBaiduImages.add(newImage.getItem_image_default());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ShopProductImage oldImage = existingImageMap.get(newImage.getProduct_image_id());
|
|
||||||
if (oldImage != null) {
|
|
||||||
// 检查图片是否有变化
|
|
||||||
if (!StrUtil.equals(oldImage.getItem_image_default(), newImage.getItem_image_default())) {
|
|
||||||
if (StrUtil.isNotBlank(oldImage.getItem_image_default())) {
|
|
||||||
delBaiduImages.add(oldImage.getItem_image_default());
|
|
||||||
}
|
|
||||||
if (StrUtil.isNotBlank(newImage.getItem_image_default())) {
|
|
||||||
addBaiduImages.add(newImage.getItem_image_default());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
toUpdate.add(newImage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 找出需要删除的图片(存在但不在新列表中)
|
|
||||||
existingImages.forEach(oldImage -> {
|
|
||||||
boolean stillExists = productImages.stream()
|
|
||||||
.anyMatch(img -> Objects.equals(img.getProduct_image_id(), oldImage.getProduct_image_id()));
|
|
||||||
if (!stillExists) {
|
|
||||||
toDelete.add(oldImage.getProduct_image_id());
|
|
||||||
if (StrUtil.isNotBlank(oldImage.getItem_image_default())) {
|
|
||||||
delBaiduImages.add(oldImage.getItem_image_default());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 3. 执行批量操作
|
|
||||||
if (CollUtil.isNotEmpty(toAdd)) {
|
|
||||||
shopProductImageService.saveBatch(toAdd,toAdd.size());
|
|
||||||
}
|
|
||||||
if (CollUtil.isNotEmpty(toUpdate)) {
|
|
||||||
shopProductImageService.updateBatchById(toUpdate);
|
|
||||||
}
|
|
||||||
if (CollUtil.isNotEmpty(toDelete)) {
|
|
||||||
shopProductImageService.removeByIds(toDelete);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理商品辅助属性批量操作
|
* 处理商品辅助属性批量操作
|
||||||
* @param assistIndices 辅助属性列表
|
* @param assistIndices 辅助属性列表
|
||||||
|
|||||||
@ -6,10 +6,14 @@ import com.google.gson.Gson;
|
|||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
import com.suisung.mall.common.api.CommonResult;
|
import com.suisung.mall.common.api.CommonResult;
|
||||||
import com.suisung.mall.common.api.IErrorCode;
|
import com.suisung.mall.common.api.IErrorCode;
|
||||||
|
import com.suisung.mall.common.domain.UserDto;
|
||||||
import com.suisung.mall.common.modules.sync.ProductMapping;
|
import com.suisung.mall.common.modules.sync.ProductMapping;
|
||||||
|
import com.suisung.mall.common.pojo.res.ThirdApiRes;
|
||||||
import com.suisung.mall.common.service.impl.BaseControllerImpl;
|
import com.suisung.mall.common.service.impl.BaseControllerImpl;
|
||||||
|
import com.suisung.mall.common.utils.ContextUtil;
|
||||||
import com.suisung.mall.shop.sync.exelModel.ImportResult;
|
import com.suisung.mall.shop.sync.exelModel.ImportResult;
|
||||||
import com.suisung.mall.shop.sync.service.ProductMappingService;
|
import com.suisung.mall.shop.sync.service.ProductMappingService;
|
||||||
|
import com.suisung.mall.shop.sync.service.SyncThirdDataService;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -18,6 +22,7 @@ import org.springframework.validation.BindingResult;
|
|||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -39,6 +44,9 @@ public class ProductMappingController extends BaseControllerImpl {
|
|||||||
@Value("${file.upload-dir}")
|
@Value("${file.upload-dir}")
|
||||||
private String uploadDir;
|
private String uploadDir;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SyncThirdDataService syncThirdDataService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页列表查询
|
* 分页列表查询
|
||||||
* @param pageNum
|
* @param pageNum
|
||||||
@ -217,4 +225,18 @@ public class ProductMappingController extends BaseControllerImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "商品图库匹配", notes = "商品图库匹配")
|
||||||
|
@RequestMapping(value = "/syncShopImages", method = RequestMethod.POST)
|
||||||
|
public ThirdApiRes syncShopImages(@RequestParam(required = false) String storeId) {
|
||||||
|
UserDto userDto=ContextUtil.getCurrentUser();
|
||||||
|
assert userDto != null;
|
||||||
|
if(userDto.isStore()){//商店自己同步
|
||||||
|
String shopStoreId=userDto.getStore_id();
|
||||||
|
syncThirdDataService.syncShopImages(Integer.valueOf(shopStoreId));
|
||||||
|
}else {//平台同步
|
||||||
|
syncThirdDataService.syncShopImages(Integer.valueOf(storeId));
|
||||||
|
}
|
||||||
|
return new ThirdApiRes().success("服务器已执行商品图库匹配数据操作");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,15 +10,11 @@ package com.suisung.mall.shop.sync.controller;
|
|||||||
|
|
||||||
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONArray;
|
||||||
import com.suisung.mall.common.api.CommonResult;
|
import com.suisung.mall.common.api.CommonResult;
|
||||||
import com.suisung.mall.common.modules.sync.StoreDbConfig;
|
|
||||||
import com.suisung.mall.common.pojo.req.SyncThirdMemberReq;
|
import com.suisung.mall.common.pojo.req.SyncThirdMemberReq;
|
||||||
import com.suisung.mall.common.pojo.res.ThirdApiRes;
|
import com.suisung.mall.common.pojo.res.ThirdApiRes;
|
||||||
import com.suisung.mall.shop.sync.service.SyncAppService;
|
|
||||||
import com.suisung.mall.shop.sync.service.SyncThirdDataService;
|
import com.suisung.mall.shop.sync.service.SyncThirdDataService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.springframework.http.MediaType;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
@ -26,7 +22,6 @@ import javax.annotation.Resource;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Api(tags = "第三方数据同步")
|
@Api(tags = "第三方数据同步")
|
||||||
@RestController
|
@RestController
|
||||||
@ -185,4 +180,5 @@ public class SyncThirdDataController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.suisung.mall.shop.sync.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.suisung.mall.common.modules.sync.ShopImageMappingTemp;
|
||||||
|
import io.lettuce.core.dynamic.annotation.Param;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface ShopImageMappingTempMapper extends BaseMapper<ShopImageMappingTemp> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 由于模糊匹配数据慢,需要把数据放到临时表
|
||||||
|
* @param storeId
|
||||||
|
*/
|
||||||
|
void mergeShopImageMappingTemp(@Param("storeId") Integer storeId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除临时表数据
|
||||||
|
* @param storeId
|
||||||
|
*/
|
||||||
|
void deleteShopImageMappingTemp(@Param("storeId") Integer storeId);
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package com.suisung.mall.shop.sync.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.suisung.mall.common.modules.sync.ShopImageMappingTemp;
|
||||||
|
public interface ShopImageMappingTempService extends IService<ShopImageMappingTemp> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
package com.suisung.mall.shop.sync.service;
|
||||||
|
|
||||||
|
public interface SyncShopImageService {
|
||||||
|
void syncMapingShopImages(Integer storeId);
|
||||||
|
}
|
||||||
@ -156,4 +156,9 @@ public interface SyncThirdDataService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
void syncActiveShops(String appKey, String sign, JSONArray activeJsonArray);
|
void syncActiveShops(String appKey, String sign, JSONArray activeJsonArray);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步匹配商品图库数据
|
||||||
|
*/
|
||||||
|
void syncShopImages(Integer storeId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,7 +16,6 @@ import cn.hutool.json.JSONObject;
|
|||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.EasyExcel;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.suisung.mall.common.api.CommonResult;
|
import com.suisung.mall.common.api.CommonResult;
|
||||||
import com.suisung.mall.common.api.StateCode;
|
import com.suisung.mall.common.api.StateCode;
|
||||||
@ -165,8 +164,8 @@ public class ProductMappingServiceImpl extends BaseServiceImpl<ProductMappingMap
|
|||||||
for (int i = 0; i < shopProductBaseList.size(); i++){
|
for (int i = 0; i < shopProductBaseList.size(); i++){
|
||||||
ShopProductSpecItem shopProductSpecItem=processShopProductSpecItem(shopProductBaseList.get(i),shopProductItems.get(i).getCategory_id(),shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,null);
|
ShopProductSpecItem shopProductSpecItem=processShopProductSpecItem(shopProductBaseList.get(i),shopProductItems.get(i).getCategory_id(),shopProductSpecItemMap,ShopBaseProductSpecMap,productMappingMap,null);
|
||||||
if(shopProductSpecItem!=null){
|
if(shopProductSpecItem!=null){
|
||||||
shopProductBaseList.get(i).setProduct_state_id(StateCode.PRODUCT_STATE_NORMAL);
|
shopProductBaseList.get(i).setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF);
|
||||||
shopProductItems.get(i).setItem_enable(StateCode.PRODUCT_STATE_NORMAL);
|
shopProductItems.get(i).setItem_enable(StateCode.PRODUCT_STATE_OFF_THE_SHELF);
|
||||||
shopProductItems.get(i).setItem_is_default(1);
|
shopProductItems.get(i).setItem_is_default(1);
|
||||||
if(shopProductSpecItem.isUpdate()){
|
if(shopProductSpecItem.isUpdate()){
|
||||||
shopProductBaseList.get(i).setProduct_unit_price(shopProductSpecItem.getItemPrice());
|
shopProductBaseList.get(i).setProduct_unit_price(shopProductSpecItem.getItemPrice());
|
||||||
|
|||||||
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.suisung.mall.shop.sync.service.impl;
|
||||||
|
|
||||||
|
import com.suisung.mall.common.modules.sync.ShopImageMappingTemp;
|
||||||
|
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
|
||||||
|
import com.suisung.mall.shop.sync.mapper.ShopImageMappingTempMapper;
|
||||||
|
import com.suisung.mall.shop.sync.service.ShopImageMappingTempService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Slf4j
|
||||||
|
public class ShopImageMappingTempServiceImpl extends BaseServiceImpl<ShopImageMappingTempMapper, ShopImageMappingTemp> implements ShopImageMappingTempService {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -32,6 +32,7 @@ import com.suisung.mall.common.modules.sixun.SxSyncGoods;
|
|||||||
import com.suisung.mall.common.modules.sixun.SxSyncVip;
|
import com.suisung.mall.common.modules.sixun.SxSyncVip;
|
||||||
import com.suisung.mall.common.modules.store.ShopStoreActivityBase;
|
import com.suisung.mall.common.modules.store.ShopStoreActivityBase;
|
||||||
import com.suisung.mall.common.modules.store.ShopStoreBase;
|
import com.suisung.mall.common.modules.store.ShopStoreBase;
|
||||||
|
import com.suisung.mall.common.pojo.dto.LibraryProductDTO;
|
||||||
import com.suisung.mall.common.pojo.req.SyncThirdMemberReq;
|
import com.suisung.mall.common.pojo.req.SyncThirdMemberReq;
|
||||||
import com.suisung.mall.common.utils.DateTimeUtils;
|
import com.suisung.mall.common.utils.DateTimeUtils;
|
||||||
import com.suisung.mall.common.utils.I18nUtil;
|
import com.suisung.mall.common.utils.I18nUtil;
|
||||||
@ -41,6 +42,8 @@ import com.suisung.mall.shop.base.service.ShopBaseProductBrandService;
|
|||||||
import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService;
|
import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService;
|
||||||
import com.suisung.mall.shop.base.service.ShopBaseProductSpecService;
|
import com.suisung.mall.shop.base.service.ShopBaseProductSpecService;
|
||||||
import com.suisung.mall.shop.base.service.ShopBaseProductTypeService;
|
import com.suisung.mall.shop.base.service.ShopBaseProductTypeService;
|
||||||
|
import com.suisung.mall.shop.library.service.LibraryProductImageService;
|
||||||
|
import com.suisung.mall.shop.library.service.LibraryProductService;
|
||||||
import com.suisung.mall.shop.number.service.ShopNumberSeqService;
|
import com.suisung.mall.shop.number.service.ShopNumberSeqService;
|
||||||
import com.suisung.mall.shop.number.service.impl.ShopNumberSeqServiceImpl;
|
import com.suisung.mall.shop.number.service.impl.ShopNumberSeqServiceImpl;
|
||||||
import com.suisung.mall.shop.product.service.ShopProductBaseService;
|
import com.suisung.mall.shop.product.service.ShopProductBaseService;
|
||||||
@ -95,6 +98,9 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ShopStoreActivityBaseService shopStoreActivityBaseService;
|
private ShopStoreActivityBaseService shopStoreActivityBaseService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LibraryProductService libraryProductService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对商品分类进行保存
|
* 对商品分类进行保存
|
||||||
* @param list
|
* @param list
|
||||||
@ -114,6 +120,7 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
JSONObject o = (JSONObject) categoryListJSON.get(i);
|
JSONObject o = (JSONObject) categoryListJSON.get(i);
|
||||||
ShopBaseProductType productType=new ShopBaseProductType();
|
ShopBaseProductType productType=new ShopBaseProductType();
|
||||||
productType.setType_is_draft(1);//发布
|
productType.setType_is_draft(1);//发布
|
||||||
|
productType.setStore_id(Integer.valueOf(storeId));
|
||||||
if (o != null) {
|
if (o != null) {
|
||||||
// 重要:分类类型处理(强调共性)
|
// 重要:分类类型处理(强调共性)
|
||||||
Integer typeId = 1001;
|
Integer typeId = 1001;
|
||||||
@ -127,6 +134,7 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
ShopBaseProductType newProductType = new ShopBaseProductType();
|
ShopBaseProductType newProductType = new ShopBaseProductType();
|
||||||
newProductType.setType_name(o.getStr("product_type"));
|
newProductType.setType_name(o.getStr("product_type"));
|
||||||
newProductType.setType_buildin(0);
|
newProductType.setType_buildin(0);
|
||||||
|
newProductType.setStore_id(Integer.valueOf(storeId));
|
||||||
if (productTypeService.save(newProductType)) {
|
if (productTypeService.save(newProductType)) {
|
||||||
typeId = newProductType.getType_id();
|
typeId = newProductType.getType_id();
|
||||||
}
|
}
|
||||||
@ -152,6 +160,10 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
firstCate.setStore_id(storeId);
|
firstCate.setStore_id(storeId);
|
||||||
firstCate.setType_id(typeId);
|
firstCate.setType_id(typeId);
|
||||||
firstCate.setData_source(2);
|
firstCate.setData_source(2);
|
||||||
|
List<LibraryProductDTO> libraryProductDTOS=libraryProductService.matchLibraryProducts(null,o.getStr("first_category_name"),new ArrayList<>());
|
||||||
|
if(CollectionUtil.isNotEmpty(libraryProductDTOS)){
|
||||||
|
firstCate.setCategory_image(libraryProductDTOS.get(0).getThumb());
|
||||||
|
}
|
||||||
if (productCategoryService.saveOrUpdate(firstCate)) {
|
if (productCategoryService.saveOrUpdate(firstCate)) {
|
||||||
// 当前子分类的父类id
|
// 当前子分类的父类id
|
||||||
firstParentId = firstCate.getId();
|
firstParentId = firstCate.getId();
|
||||||
@ -175,6 +187,11 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
secondCate.setStore_id(storeId);
|
secondCate.setStore_id(storeId);
|
||||||
secondCate.setType_id(typeId);
|
secondCate.setType_id(typeId);
|
||||||
secondCate.setData_source(2);
|
secondCate.setData_source(2);
|
||||||
|
List<LibraryProductDTO> libraryProductDTOS=libraryProductService.matchLibraryProducts(null,o.getStr("second_category_name"),new ArrayList<>());
|
||||||
|
if(CollectionUtil.isNotEmpty(libraryProductDTOS)){
|
||||||
|
secondCate.setCategory_image(libraryProductDTOS.get(0).getThumb());
|
||||||
|
}
|
||||||
|
|
||||||
if (productCategoryService.saveOrUpdate(secondCate)) {
|
if (productCategoryService.saveOrUpdate(secondCate)) {
|
||||||
// 当前子分类的第二级父类id
|
// 当前子分类的第二级父类id
|
||||||
list.get(i).setCategory_parent_id(secondCate.getId());
|
list.get(i).setCategory_parent_id(secondCate.getId());
|
||||||
@ -197,6 +214,10 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
List<LibraryProductDTO> libraryProductDTOS=libraryProductService.matchLibraryProducts(null,list.get(i).getCategory_name(),new ArrayList<>());
|
||||||
|
if(CollectionUtil.isNotEmpty(libraryProductDTOS)){
|
||||||
|
list.get(i).setCategory_image(libraryProductDTOS.get(0).getThumb());
|
||||||
|
}
|
||||||
|
|
||||||
if (productCategoryService.saveOrUpdate(list.get(i))) {
|
if (productCategoryService.saveOrUpdate(list.get(i))) {
|
||||||
count++;
|
count++;
|
||||||
@ -541,6 +562,7 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
List<ShopProductDetail> shopProductDetailList=new ArrayList<>(); ;
|
List<ShopProductDetail> shopProductDetailList=new ArrayList<>(); ;
|
||||||
List<ShopProductInfo> shopProductInfoList=new ArrayList<>(); ;
|
List<ShopProductInfo> shopProductInfoList=new ArrayList<>(); ;
|
||||||
List<List<ShopProductItem>> shopProductItemLists=new ArrayList<>();
|
List<List<ShopProductItem>> shopProductItemLists=new ArrayList<>();
|
||||||
|
List<ShopProductImage> shopProductImageList=new ArrayList<>();
|
||||||
ShopStoreBase store_row = shopStoreBaseService.get(storeId);
|
ShopStoreBase store_row = shopStoreBaseService.get(storeId);
|
||||||
if (store_row == null) {
|
if (store_row == null) {
|
||||||
throw new ApiException(I18nUtil._("无法获取店铺信息!"));
|
throw new ApiException(I18nUtil._("无法获取店铺信息!"));
|
||||||
@ -588,7 +610,7 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
shopProductBase.setUnit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
shopProductBase.setUnit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
||||||
}else {
|
}else {
|
||||||
shopProductBase.setShop_weight(jsonObj.getBigDecimal("stock"));
|
shopProductBase.setShop_weight(jsonObj.getBigDecimal("stock"));
|
||||||
shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_NORMAL);
|
shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF);//默认是下架
|
||||||
shopProductBase.setUnit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
shopProductBase.setUnit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
||||||
}
|
}
|
||||||
// ShopProductIndex
|
// ShopProductIndex
|
||||||
@ -653,6 +675,7 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
ShopProductItem shopProductItem = new ShopProductItem();
|
ShopProductItem shopProductItem = new ShopProductItem();
|
||||||
shopProductItem.setStore_id(storeIdInt);
|
shopProductItem.setStore_id(storeIdInt);
|
||||||
shopProductItem.setCategory_id(categoryId);
|
shopProductItem.setCategory_id(categoryId);
|
||||||
|
shopProductItem.setItem_src_id(jsonObj.getLong("product_number"));
|
||||||
//零售价
|
//零售价
|
||||||
shopProductItem.setItem_unit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
shopProductItem.setItem_unit_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
||||||
shopProductItem.setItem_advice_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
shopProductItem.setItem_advice_price(BigDecimal.valueOf(jsonObj.getDouble("retail_price")));
|
||||||
@ -672,6 +695,12 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
shopProductItem.setItem_is_default(1);
|
shopProductItem.setItem_is_default(1);
|
||||||
shopProductItem.setItem_enable(shopProductBase.getProduct_state_id());
|
shopProductItem.setItem_enable(shopProductBase.getProduct_state_id());
|
||||||
|
|
||||||
|
//shopProductImage
|
||||||
|
ShopProductImage shopProductImage = new ShopProductImage();
|
||||||
|
shopProductImage.setStore_id(storeIdInt);
|
||||||
|
shopProductImage.setProduct_name(jsonObj.getStr("product_name"));
|
||||||
|
shopProductImage.setProduct_from("1005");
|
||||||
|
|
||||||
//添加数据到list
|
//添加数据到list
|
||||||
synchronized(shopProductBaseList){
|
synchronized(shopProductBaseList){
|
||||||
shopProductItemList.add(shopProductItem);
|
shopProductItemList.add(shopProductItem);
|
||||||
@ -681,12 +710,13 @@ public abstract class SyncBaseThirdSxAbstract{
|
|||||||
shopProductDetailList.add(shopProductDetail);
|
shopProductDetailList.add(shopProductDetail);
|
||||||
shopProductInfoList.add(shopProductInfo);
|
shopProductInfoList.add(shopProductInfo);
|
||||||
shopProductItemLists.add(shopProductItemList);
|
shopProductItemLists.add(shopProductItemList);
|
||||||
|
shopProductImageList.add(shopProductImage);
|
||||||
}
|
}
|
||||||
resultCount.addAndGet(1);
|
resultCount.addAndGet(1);
|
||||||
});
|
});
|
||||||
// 保存数据
|
// 保存数据
|
||||||
shopProductBaseService.saveProductBatch(shopProductBaseList,shopProductIndexList,shopProductDataList,shopProductDetailList,shopProductInfoList,shopProductItemLists,
|
shopProductBaseService.saveProductBatch(shopProductBaseList,shopProductIndexList,shopProductDataList,shopProductDetailList,shopProductInfoList,shopProductItemLists,
|
||||||
new ArrayList<List<ShopProductImage>>(),
|
shopProductImageList,
|
||||||
new ArrayList<ShopProductValidPeriod>(),
|
new ArrayList<ShopProductValidPeriod>(),
|
||||||
new ArrayList<ShopProductAssistIndex>());
|
new ArrayList<ShopProductAssistIndex>());
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
|
||||||
|
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
|
||||||
|
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
|
||||||
|
* Vestibulum commodo. Ut rhoncus gravida arcu.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.suisung.mall.shop.sync.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import com.suisung.mall.common.api.StateCode;
|
||||||
|
import com.suisung.mall.common.modules.product.ShopProductBase;
|
||||||
|
import com.suisung.mall.common.modules.product.ShopProductImage;
|
||||||
|
import com.suisung.mall.common.modules.product.ShopProductItem;
|
||||||
|
import com.suisung.mall.common.modules.sync.ImageMappingDto;
|
||||||
|
import com.suisung.mall.common.utils.StringUtils;
|
||||||
|
import com.suisung.mall.shop.product.mapper.ShopProductImageMapper;
|
||||||
|
|
||||||
|
import com.suisung.mall.shop.product.service.ShopProductBaseService;
|
||||||
|
import com.suisung.mall.shop.product.service.ShopProductImageService;
|
||||||
|
import com.suisung.mall.shop.product.service.ShopProductItemService;
|
||||||
|
import com.suisung.mall.shop.sixun.utils.CommonUtil;
|
||||||
|
import com.suisung.mall.shop.sync.mapper.ShopImageMappingTempMapper;
|
||||||
|
import com.suisung.mall.shop.sync.service.SyncShopImageService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class SyncShopImageServiceImpl implements SyncShopImageService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ShopProductImageMapper shopProductImageMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ShopImageMappingTempMapper shopImageMappingTempMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ShopProductImageService shopProductImageService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ShopProductItemService shopProductItemService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ShopProductBaseService shopProductBaseService;
|
||||||
|
|
||||||
|
@Value("${project.static_domain}")
|
||||||
|
private String staticDomain;
|
||||||
|
|
||||||
|
private final static Integer BATCH_SIZE=500;
|
||||||
|
private final static String MAPPING_BARCODE="1";//条形码匹配
|
||||||
|
private final static String MAPPING_PRODUCTSHORTNAME="2";//标准名称匹配
|
||||||
|
private final static String MAPPING_PRODUCTNAME="3";//产品名称模糊匹配
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void syncMapingShopImages(Integer storeId) {
|
||||||
|
mappingProductImages(MAPPING_BARCODE,storeId);
|
||||||
|
mappingProductImages(MAPPING_PRODUCTSHORTNAME,storeId);
|
||||||
|
mappingProductImages(MAPPING_PRODUCTNAME,storeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过类型匹配 使用游标方式
|
||||||
|
* 1、条形码匹配
|
||||||
|
* 2、标准名称匹配
|
||||||
|
* 3、产品名称模糊匹配
|
||||||
|
*/
|
||||||
|
public void mappingProductImages(String type,Integer storeId){
|
||||||
|
Integer total=null;
|
||||||
|
String typename="";
|
||||||
|
switch (type){
|
||||||
|
case MAPPING_BARCODE:
|
||||||
|
typename="条形码匹配";
|
||||||
|
total= shopProductImageMapper.mappingByBarCodeCount(storeId);
|
||||||
|
break;
|
||||||
|
case MAPPING_PRODUCTSHORTNAME:
|
||||||
|
typename="标准名称匹配";
|
||||||
|
total= shopProductImageMapper.mappingByProductShortNameCount(storeId);
|
||||||
|
break;
|
||||||
|
case MAPPING_PRODUCTNAME:
|
||||||
|
typename="产品名称模糊匹配";
|
||||||
|
//先把数据查到临时表再查询
|
||||||
|
shopImageMappingTempMapper.deleteShopImageMappingTemp(storeId);//匹配结束,删除临时表数据
|
||||||
|
shopImageMappingTempMapper.mergeShopImageMappingTemp(storeId);
|
||||||
|
total= shopProductImageMapper.mappingByProductNameCount(storeId);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(total!=null&&total<1){
|
||||||
|
log.info("{}无数据",typename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ExecutorService executor = Executors.newFixedThreadPool(6);
|
||||||
|
List<Future<?>> futures = new ArrayList<>();
|
||||||
|
Integer pages= CommonUtil.getPagesCount(total,BATCH_SIZE);
|
||||||
|
|
||||||
|
AtomicInteger success = new AtomicInteger();
|
||||||
|
AtomicInteger fails = new AtomicInteger();
|
||||||
|
for (int i = 1; i <= pages; i++) {
|
||||||
|
List<ImageMappingDto> imageMappingDtos = shopProductImageMapper.mappingProductImage(type,storeId,(i-1)*BATCH_SIZE,BATCH_SIZE);
|
||||||
|
final int finalI = i;
|
||||||
|
futures.add(executor.submit(() -> {
|
||||||
|
try {
|
||||||
|
syncBatchShopImage(imageMappingDtos);
|
||||||
|
success.getAndIncrement();
|
||||||
|
return "成功" + finalI;
|
||||||
|
} catch (Exception e) {
|
||||||
|
fails.getAndIncrement();
|
||||||
|
return "失败"+finalI;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
// 等待所有任务完成
|
||||||
|
for (Future<?> future : futures) {
|
||||||
|
try {
|
||||||
|
log.info("任务结果: " + future.get());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("任务执行异常: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
executor.shutdown();
|
||||||
|
log.info("成功:{}条,失败:{}条",success,fails);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 把匹配的数据更新到商品的图库表
|
||||||
|
* @param imageMappingDtos
|
||||||
|
*/
|
||||||
|
private void syncBatchShopImage(List<ImageMappingDto> imageMappingDtos){
|
||||||
|
if(CollectionUtil.isEmpty(imageMappingDtos)){
|
||||||
|
log.info("没有匹配到图库");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<ShopProductBase> shopProductBaseList=new ArrayList<>();
|
||||||
|
List<ShopProductItem> shopProductItemList=new ArrayList<>();
|
||||||
|
List<ShopProductImage> shopProductImageList=new ArrayList<>();
|
||||||
|
for (ImageMappingDto imageMappingDto:imageMappingDtos){
|
||||||
|
String mergedImageUrl=imageMappingDto.getMergedImageUrl();
|
||||||
|
if(StringUtils.isEmpty(mergedImageUrl)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ShopProductImage shopProductImage=new ShopProductImage();
|
||||||
|
ShopProductBase shopProductBase=new ShopProductBase();
|
||||||
|
ShopProductItem shopProductItem=new ShopProductItem();
|
||||||
|
if(mergedImageUrl.contains(",")){
|
||||||
|
String [] imageUrls= mergedImageUrl.split(",");
|
||||||
|
for (String imageUrl:imageUrls){
|
||||||
|
shopProductImage.setItem_image_other(imageMappingDto.addDomainPrefix(staticDomain,imageUrl));
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
shopProductImage.setItem_image_other(imageMappingDto.addDomainPrefix(staticDomain,mergedImageUrl));
|
||||||
|
}
|
||||||
|
shopProductImage.setProduct_id(imageMappingDto.getProductId());
|
||||||
|
shopProductImage.setProduct_image_id(imageMappingDto.getProductImageId());
|
||||||
|
shopProductImage.setItem_image_default(imageMappingDto.addDomainPrefix(staticDomain,imageMappingDto.getThumb()));
|
||||||
|
shopProductImageList.add(shopProductImage);
|
||||||
|
shopProductBase.setProduct_id(imageMappingDto.getProductId());
|
||||||
|
shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_NORMAL);
|
||||||
|
shopProductBaseList.add(shopProductBase);
|
||||||
|
shopProductItem.setItem_enable(StateCode.PRODUCT_STATE_NORMAL);
|
||||||
|
shopProductItemList.add(shopProductItem);
|
||||||
|
}
|
||||||
|
if(CollectionUtil.isNotEmpty(shopProductImageList)){
|
||||||
|
shopProductImageService.updateBatchById(shopProductImageList);
|
||||||
|
}
|
||||||
|
if(CollectionUtil.isNotEmpty(shopProductBaseList)){
|
||||||
|
shopProductBaseService.updateBatchById(shopProductBaseList);
|
||||||
|
}
|
||||||
|
if(CollectionUtil.isNotEmpty(shopProductItemList)){
|
||||||
|
shopProductItemService.updateBatchById(shopProductItemList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -153,6 +153,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ShopStoreActivityBaseService shopStoreActivityBaseService;
|
private ShopStoreActivityBaseService shopStoreActivityBaseService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SyncShopImageService syncShopImageService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量保存商品的分类
|
* 批量保存商品的分类
|
||||||
*
|
*
|
||||||
@ -609,6 +612,12 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
logger.error("同步时间失败" + e.getMessage());
|
logger.error("同步时间失败" + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
syncShopImages(Integer.valueOf(storeId));//同时商品图库数据
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void syncShopImages(Integer storeId){
|
||||||
|
syncShopImageService.syncMapingShopImages(storeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -771,7 +780,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
for (Map.Entry<String, Integer> entry : stockDeltaMap.entrySet()) {
|
for (Map.Entry<String, Integer> entry : stockDeltaMap.entrySet()) {
|
||||||
String productKey = entry.getKey();
|
String productKey = entry.getKey();
|
||||||
Integer delta = entry.getValue();
|
Integer delta = entry.getValue();
|
||||||
if (StrUtil.isBlank(productKey) || productKey.equals("0") || delta == null || delta.equals(0)) {
|
if (StrUtil.isBlank(productKey) || delta == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -847,41 +856,41 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ThirdApiRes fileUploadToOss(String appKey, String sign, String syncType, Date refreshDate, List<String> folders) {
|
public ThirdApiRes fileUploadToOss(String appKey, String sign, String syncType,Date refreshDate, List<String> folders) {
|
||||||
if (StrUtil.isBlank(appKey) || StrUtil.isBlank(sign)) {
|
if (StrUtil.isBlank(appKey) || StrUtil.isBlank(sign) ) {
|
||||||
return new ThirdApiRes().fail(1003, I18nUtil._("缺少必要参数!"));
|
return new ThirdApiRes().fail(1003, I18nUtil._("缺少必要参数!"));
|
||||||
}
|
}
|
||||||
// 验签、appid,必要参数判断
|
// 验签、appid,必要参数判断
|
||||||
SyncApp syncApp = syncAppService.getOne(new LambdaQueryWrapper<SyncApp>()
|
SyncApp syncApp = syncAppService.getOne(new LambdaQueryWrapper<SyncApp>()
|
||||||
.select(SyncApp::getApp_key, SyncApp::getApp_secret, SyncApp::getStore_id)
|
.select(SyncApp::getApp_key, SyncApp::getApp_secret,SyncApp::getStore_id)
|
||||||
.eq(SyncApp::getApp_key, appKey)
|
.eq(SyncApp::getApp_key, appKey)
|
||||||
.eq(SyncApp::getApp_secret, sign));
|
.eq(SyncApp::getApp_secret,sign));
|
||||||
if (syncApp == null) {
|
if (syncApp == null) {
|
||||||
return new ThirdApiRes().fail(1001, I18nUtil._("签名有误!"));
|
return new ThirdApiRes().fail(1001, I18nUtil._("签名有误!"));
|
||||||
}
|
}
|
||||||
String storeId = syncApp.getStore_id();
|
String storeId = syncApp.getStore_id();
|
||||||
if (null == syncApp.getStore_id() || syncApp.getStore_id().isEmpty()) {
|
if(null==syncApp.getStore_id()|| syncApp.getStore_id().isEmpty()){
|
||||||
logger.info("商店id为空");
|
logger.info("商店id为空");
|
||||||
return new ThirdApiRes().fail(250, "商店id为空");
|
return new ThirdApiRes().fail(250,"商店id为空");
|
||||||
}
|
}
|
||||||
if (folders == null || folders.isEmpty()) {
|
if(folders==null||folders.isEmpty()){
|
||||||
logger.info("没有商品数据");
|
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
|
upLoadZipToOss(newfolder);//上传文件到cos
|
||||||
//更新当前的获取时间,用户客户端获取
|
//更新当前的获取时间,用户客户端获取
|
||||||
try {
|
try {
|
||||||
QueryWrapper<StoreDbConfig> storeDbConfigQueryWrapper = new QueryWrapper<>();
|
QueryWrapper<StoreDbConfig> storeDbConfigQueryWrapper = new QueryWrapper<>();
|
||||||
storeDbConfigQueryWrapper.eq("store_id", storeId);
|
storeDbConfigQueryWrapper.eq("store_id", storeId);
|
||||||
StoreDbConfig storeDbConfig = storeDbConfigService.getOne(storeDbConfigQueryWrapper);
|
StoreDbConfig storeDbConfig=storeDbConfigService.getOne(storeDbConfigQueryWrapper);
|
||||||
if (ObjectUtil.isNotEmpty(storeDbConfig)) {
|
if(ObjectUtil.isNotEmpty(storeDbConfig)){
|
||||||
storeDbConfig.setRefreshTime(refreshDate);
|
storeDbConfig.setRefreshTime(refreshDate);
|
||||||
storeDbConfigService.saveOrUpdate(storeDbConfig);
|
storeDbConfigService.saveOrUpdate(storeDbConfig);
|
||||||
}
|
}
|
||||||
} catch (RuntimeException e) {
|
}catch (RuntimeException e){
|
||||||
logger.error("同步时间失败" + e.getMessage());
|
logger.error("同步时间失败"+e.getMessage());
|
||||||
}
|
}
|
||||||
return new ThirdApiRes().success("上传成功");
|
return new ThirdApiRes().success("上传成功");
|
||||||
}
|
}
|
||||||
@ -895,9 +904,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
}
|
}
|
||||||
// 验签、appid,必要参数判断
|
// 验签、appid,必要参数判断
|
||||||
SyncApp syncAppO = syncAppService.getOne(new LambdaQueryWrapper<SyncApp>()
|
SyncApp syncAppO = syncAppService.getOne(new LambdaQueryWrapper<SyncApp>()
|
||||||
.select(SyncApp::getApp_key, SyncApp::getApp_secret, SyncApp::getStore_id)
|
.select(SyncApp::getApp_key, SyncApp::getApp_secret,SyncApp::getStore_id)
|
||||||
.eq(SyncApp::getApp_key, appKey)
|
.eq(SyncApp::getApp_key, appKey)
|
||||||
.eq(SyncApp::getApp_secret, sign));
|
.eq(SyncApp::getApp_secret,sign));
|
||||||
if (syncAppO == null) {
|
if (syncAppO == null) {
|
||||||
logger.error("签名有误!");
|
logger.error("签名有误!");
|
||||||
return;
|
return;
|
||||||
@ -909,21 +918,20 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量新增或更新活动数据
|
* 批量新增或更新活动数据
|
||||||
*
|
|
||||||
* @param jsonArray
|
* @param jsonArray
|
||||||
*/
|
*/
|
||||||
private void batchSaveShopStoreActivityBase(JSONArray jsonArray, Integer storeId) {
|
private void batchSaveShopStoreActivityBase(JSONArray jsonArray,Integer storeId) {
|
||||||
List<ShopStoreActivityBase> addshopStoreActivityBaseList = new ArrayList<>();
|
List<ShopStoreActivityBase> addshopStoreActivityBaseList=new ArrayList<>();
|
||||||
List<ShopStoreActivityBase> updateShopStoreActivityBaseList = new ArrayList<>();
|
List<ShopStoreActivityBase> updateShopStoreActivityBaseList=new ArrayList<>();
|
||||||
Map<String, String> stringIntegerMap = checkExistingActive(jsonArray, storeId);
|
Map<String, String> stringIntegerMap= checkExistingActive(jsonArray,storeId);
|
||||||
jsonArray.stream().parallel().forEach(object -> {
|
jsonArray.stream().parallel().forEach(object->{
|
||||||
final JSONObject jsonObj = (JSONObject) object;
|
final JSONObject jsonObj= (JSONObject) object;
|
||||||
String activityName = jsonObj.getStr("activityName");
|
String activityName=jsonObj.getStr("activityName");
|
||||||
Integer activityTypeId = jsonObj.getInt("activityTypeId");
|
Integer activityTypeId=jsonObj.getInt("activityTypeId");
|
||||||
if (null == activityTypeId) {
|
if(null==activityTypeId){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ShopStoreActivityBase shopStoreActivityBase = new ShopStoreActivityBase();
|
ShopStoreActivityBase shopStoreActivityBase=new ShopStoreActivityBase();
|
||||||
if (activityTypeId == 1) {
|
if (activityTypeId == 1) {
|
||||||
activityTypeId = StateCode.ACTIVITY_TYPE_LIMITED_DISCOUNT; //限时秒杀
|
activityTypeId = StateCode.ACTIVITY_TYPE_LIMITED_DISCOUNT; //限时秒杀
|
||||||
}
|
}
|
||||||
@ -931,17 +939,17 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
activityTypeId = StateCode.ACTIVITY_TYPE_ONE_PIECE_DISCOUNT; //折扣
|
activityTypeId = StateCode.ACTIVITY_TYPE_ONE_PIECE_DISCOUNT; //折扣
|
||||||
}
|
}
|
||||||
if (activityTypeId == 3) {
|
if (activityTypeId == 3) {
|
||||||
JSONArray activeMaxDesList = jsonObj.getJSONArray("activeMaxDesList");
|
JSONArray activeMaxDesList=jsonObj.getJSONArray("activeMaxDesList");
|
||||||
activityTypeId = StateCode.ACTIVITY_TYPE_REDUCTION; //满减
|
activityTypeId = StateCode.ACTIVITY_TYPE_REDUCTION; //满减
|
||||||
String rules = ActiveShopJsonUtils.getRules(activeMaxDesList);
|
String rules= ActiveShopJsonUtils.getRules(activeMaxDesList);
|
||||||
shopStoreActivityBase.setActivity_rule(rules);
|
shopStoreActivityBase.setActivity_rule(rules);
|
||||||
}
|
}
|
||||||
Date activityStarttime = jsonObj.getDate("activityStarttime");
|
Date activityStarttime=jsonObj.getDate("activityStarttime");
|
||||||
Date activityEndtime = jsonObj.getDate("activityEndtime");
|
Date activityEndtime=jsonObj.getDate("activityEndtime");
|
||||||
Integer activityState = jsonObj.getInt("activityState");
|
Integer activityState=jsonObj.getInt("activityState");
|
||||||
Date activityReleasetime = jsonObj.getDate("activityReleasetime");
|
Date activityReleasetime= jsonObj.getDate("activityReleasetime");
|
||||||
BigDecimal discount = jsonObj.getBigDecimal("discount");
|
BigDecimal discount=jsonObj.getBigDecimal("discount");
|
||||||
String key = activityName + "_" + activityStarttime.getTime() + "_" + activityState;
|
String key=activityName+"_"+activityStarttime.getTime()+"_"+activityState;
|
||||||
shopStoreActivityBase.setActivity_state(activityState);
|
shopStoreActivityBase.setActivity_state(activityState);
|
||||||
shopStoreActivityBase.setActivity_name(activityName);
|
shopStoreActivityBase.setActivity_name(activityName);
|
||||||
shopStoreActivityBase.setActivity_type(1);//免费参与
|
shopStoreActivityBase.setActivity_type(1);//免费参与
|
||||||
@ -953,19 +961,19 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
shopStoreActivityBase.setActivity_endtime(activityEndtime);
|
shopStoreActivityBase.setActivity_endtime(activityEndtime);
|
||||||
shopStoreActivityBase.setActivity_state(activityState);
|
shopStoreActivityBase.setActivity_state(activityState);
|
||||||
shopStoreActivityBase.setSubsite_id(0);
|
shopStoreActivityBase.setSubsite_id(0);
|
||||||
if (stringIntegerMap.containsKey(key)) {//更新
|
if(stringIntegerMap.containsKey(key)){//更新
|
||||||
String keyVal = MapUtil.getStr(stringIntegerMap, key);
|
String keyVal= MapUtil.getStr(stringIntegerMap,key);
|
||||||
shopStoreActivityBase.setActivity_id(MapUtil.getInt(stringIntegerMap, keyVal.split("_")[0]));
|
shopStoreActivityBase.setActivity_id(MapUtil.getInt(stringIntegerMap,keyVal.split("_")[0]));
|
||||||
updateShopStoreActivityBaseList.add(shopStoreActivityBase);
|
updateShopStoreActivityBaseList.add(shopStoreActivityBase);
|
||||||
} else {
|
}else {
|
||||||
addshopStoreActivityBaseList.add(shopStoreActivityBase);
|
addshopStoreActivityBaseList.add(shopStoreActivityBase);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
if (CollectionUtil.isNotEmpty(addshopStoreActivityBaseList)) {
|
if(CollectionUtil.isNotEmpty(addshopStoreActivityBaseList)){
|
||||||
shopStoreActivityBaseService.saveBatch(addshopStoreActivityBaseList, addshopStoreActivityBaseList.size());
|
shopStoreActivityBaseService.saveBatch(addshopStoreActivityBaseList,addshopStoreActivityBaseList.size());
|
||||||
}
|
}
|
||||||
if (CollectionUtil.isNotEmpty(updateShopStoreActivityBaseList)) {
|
if(CollectionUtil.isNotEmpty(updateShopStoreActivityBaseList)){
|
||||||
shopStoreActivityBaseService.updateBatchById(updateShopStoreActivityBaseList);
|
shopStoreActivityBaseService.updateBatchById(updateShopStoreActivityBaseList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -976,7 +984,6 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
* 将商品添加到活动
|
* 将商品添加到活动
|
||||||
* 1、找出匹配的活动
|
* 1、找出匹配的活动
|
||||||
* 2、新增商品到活动列表
|
* 2、新增商品到活动列表
|
||||||
*
|
|
||||||
* @param appKey
|
* @param appKey
|
||||||
* @param sign
|
* @param sign
|
||||||
* @param activeJsonArray
|
* @param activeJsonArray
|
||||||
@ -990,9 +997,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
}
|
}
|
||||||
// 验签、appid,必要参数判断
|
// 验签、appid,必要参数判断
|
||||||
SyncApp syncAppO = syncAppService.getOne(new LambdaQueryWrapper<SyncApp>()
|
SyncApp syncAppO = syncAppService.getOne(new LambdaQueryWrapper<SyncApp>()
|
||||||
.select(SyncApp::getApp_key, SyncApp::getApp_secret, SyncApp::getStore_id)
|
.select(SyncApp::getApp_key, SyncApp::getApp_secret,SyncApp::getStore_id)
|
||||||
.eq(SyncApp::getApp_key, appKey)
|
.eq(SyncApp::getApp_key, appKey)
|
||||||
.eq(SyncApp::getApp_secret, sign));
|
.eq(SyncApp::getApp_secret,sign));
|
||||||
if (syncAppO == null) {
|
if (syncAppO == null) {
|
||||||
logger.error("签名有误!");
|
logger.error("签名有误!");
|
||||||
return;
|
return;
|
||||||
@ -1004,84 +1011,83 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量新增或更新活动商品数据
|
* 批量新增或更新活动商品数据
|
||||||
*
|
|
||||||
* @param jsonArray
|
* @param jsonArray
|
||||||
*/
|
*/
|
||||||
private void batchAddActiveShopBase(JSONArray jsonArray, Integer storeId) {
|
private void batchAddActiveShopBase(JSONArray jsonArray,Integer storeId) {
|
||||||
List<ShopStoreActivityBase> updateShopStoreActivityBaseList = new ArrayList<>();
|
List<ShopStoreActivityBase> updateShopStoreActivityBaseList=new ArrayList<>();
|
||||||
Map<String, String> stringIntegerMap = checkExistingActive(jsonArray, storeId);
|
Map<String, String> stringIntegerMap= checkExistingActive(jsonArray,storeId);
|
||||||
Map shopProduckKeyMap = shopProductBaseService.getProductBasicIdByStore(storeId);//获取货架号对应的商品id
|
Map shopProduckKeyMap=shopProductBaseService.getProductBasicIdByStore(storeId);//获取货架号对应的商品id
|
||||||
Map shopItemKeyMap = shopProductItemService.getProductItemIdByStore(storeId);//获取商品id对应的item的id
|
Map shopItemKeyMap=shopProductItemService.getProductItemIdByStore(storeId);//获取商品id对应的item的id
|
||||||
Map<String, String> rulesChe = new HashMap();//存储rule格式activeId:rules,如果不存在则从数据库取,存在则从缓存取数据
|
Map<String,String> rulesChe=new HashMap();//存储rule格式activeId:rules,如果不存在则从数据库取,存在则从缓存取数据
|
||||||
jsonArray.forEach(object -> {
|
jsonArray.forEach(object->{
|
||||||
final JSONObject jsonObj = (JSONObject) object;
|
final JSONObject jsonObj= (JSONObject) object;
|
||||||
String activityName = jsonObj.getStr("activityName");
|
String activityName=jsonObj.getStr("activityName");
|
||||||
Integer activityTypeId = jsonObj.getInt("activityTypeId");
|
Integer activityTypeId=jsonObj.getInt("activityTypeId");
|
||||||
if (null == activityTypeId) {
|
if(null==activityTypeId){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String ruleType = "";
|
String ruleType="";
|
||||||
List<org.json.JSONObject> newItems = new ArrayList<>();
|
List<org.json.JSONObject> newItems=new ArrayList<>();
|
||||||
ShopStoreActivityBase shopStoreActivityBase = new ShopStoreActivityBase();
|
ShopStoreActivityBase shopStoreActivityBase=new ShopStoreActivityBase();
|
||||||
Integer productId = null;
|
Integer productId=null;
|
||||||
String itemNo = jsonObj.getStr("itemNo");
|
String itemNo=jsonObj.getStr("itemNo");
|
||||||
BigDecimal discount = jsonObj.getBigDecimal("discount");
|
BigDecimal discount=jsonObj.getBigDecimal("discount");
|
||||||
if (shopProduckKeyMap.containsKey(itemNo)) {
|
if(shopProduckKeyMap.containsKey(itemNo)){
|
||||||
productId = (Integer) shopProduckKeyMap.get(itemNo);
|
productId= (Integer) shopProduckKeyMap.get(itemNo);
|
||||||
}
|
}
|
||||||
if (null == productId) {
|
if(null==productId){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Date activityStarttime = jsonObj.getDate("activityStarttime");
|
Date activityStarttime=jsonObj.getDate("activityStarttime");
|
||||||
Integer activityState = jsonObj.getInt("activityState");
|
Integer activityState=jsonObj.getInt("activityState");
|
||||||
|
|
||||||
String key = activityName + "_" + activityStarttime.getTime() + "_" + activityState;
|
String key=activityName+"_"+activityStarttime.getTime()+"_"+activityState;
|
||||||
|
|
||||||
if (stringIntegerMap.containsKey(key)) {//更新
|
if(stringIntegerMap.containsKey(key)){//更新
|
||||||
String keyVal = MapUtil.getStr(stringIntegerMap, key);
|
String keyVal=MapUtil.getStr(stringIntegerMap,key);
|
||||||
String activityId = keyVal.split("_")[0];
|
String activityId=keyVal.split("_")[0];
|
||||||
String rules = "";
|
String rules="";
|
||||||
if (null != rulesChe.get(activityId)) {
|
if(null!=rulesChe.get(activityId)){
|
||||||
rules = rulesChe.get(activityId);
|
rules=rulesChe.get(activityId);
|
||||||
} else {
|
}else {
|
||||||
rules = keyVal.split("_")[1];
|
rules=keyVal.split("_")[1];
|
||||||
}
|
}
|
||||||
String itemIds = (String) shopItemKeyMap.get(productId);
|
String itemIds= (String) shopItemKeyMap.get(productId);
|
||||||
if (null != itemIds) {
|
if(null!=itemIds){
|
||||||
itemIds = (String) shopItemKeyMap.get(String.valueOf(productId));
|
itemIds= (String) shopItemKeyMap.get(String.valueOf(productId));
|
||||||
}
|
}
|
||||||
assert itemIds != null;
|
assert itemIds != null;
|
||||||
if (activityTypeId == 1) {//限时秒杀
|
if (activityTypeId == 1) {//限时秒杀
|
||||||
ruleType = ActiveShopJsonUtils.SECKILL;
|
ruleType=ActiveShopJsonUtils.SECKILL;
|
||||||
BigDecimal oldPrice = jsonObj.getBigDecimal("oldPrice");
|
BigDecimal oldPrice=jsonObj.getBigDecimal("oldPrice");
|
||||||
BigDecimal specPrice = jsonObj.getBigDecimal("specPrice");
|
BigDecimal specPrice=jsonObj.getBigDecimal("specPrice");
|
||||||
if (oldPrice.compareTo(BigDecimal.ZERO) > 0 && specPrice.compareTo(BigDecimal.ZERO) > 0) {
|
if(oldPrice.compareTo(BigDecimal.ZERO)>0&&specPrice.compareTo(BigDecimal.ZERO)>0){
|
||||||
BigDecimal newDiscout = specPrice.divide(oldPrice, 4, RoundingMode.HALF_UP);
|
BigDecimal newDiscout=specPrice.divide(oldPrice,4, RoundingMode.HALF_UP);
|
||||||
newItems.addAll(getFulReduItemList(itemIds, ruleType, newDiscout));//获取满减规则的itemid
|
newItems.addAll(getFulReduItemList(itemIds,ruleType,newDiscout));//获取满减规则的itemid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (activityTypeId == 2) {//折扣
|
if (activityTypeId == 2) {//折扣
|
||||||
if (discount.compareTo(BigDecimal.ZERO) <= 0) {
|
if(discount.compareTo(BigDecimal.ZERO)<=0){
|
||||||
logger.error("商品折扣要大于0");
|
logger.error("商品折扣要大于0");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ruleType = ActiveShopJsonUtils.DISCOUNT;
|
ruleType=ActiveShopJsonUtils.DISCOUNT;
|
||||||
newItems.addAll(getFulReduItemList(itemIds, ruleType, discount));//获取满减规则的itemid
|
newItems.addAll(getFulReduItemList(itemIds,ruleType,discount));//获取满减规则的itemid
|
||||||
}
|
}
|
||||||
if (activityTypeId == 3) {//满减
|
if (activityTypeId == 3) {//满减
|
||||||
ruleType = ActiveShopJsonUtils.FULLREDUCE;
|
ruleType=ActiveShopJsonUtils.FULLREDUCE;
|
||||||
newItems.addAll(getFulReduItemList(itemIds, ruleType, null));//获取满减规则的itemid
|
newItems.addAll(getFulReduItemList(itemIds,ruleType,null));//获取满减规则的itemid
|
||||||
}
|
}
|
||||||
shopStoreActivityBase.setActivity_id(MapUtil.getInt(stringIntegerMap, activityId));
|
shopStoreActivityBase.setActivity_id(MapUtil.getInt(stringIntegerMap,activityId));
|
||||||
String newRules = ActiveShopJsonUtils.buildPromotionRule(ruleType, rules, newItems);
|
String newRules= ActiveShopJsonUtils.buildPromotionRule(ruleType,rules,newItems);
|
||||||
rulesChe.put(activityId, newRules);
|
rulesChe.put(activityId,newRules);
|
||||||
shopStoreActivityBase.setActivity_rule(rules);
|
shopStoreActivityBase.setActivity_rule(rules);
|
||||||
updateShopStoreActivityBaseList.add(shopStoreActivityBase);
|
updateShopStoreActivityBaseList.add(shopStoreActivityBase);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
if (CollectionUtil.isNotEmpty(updateShopStoreActivityBaseList)) {
|
if(CollectionUtil.isNotEmpty(updateShopStoreActivityBaseList)){
|
||||||
shopStoreActivityBaseService.updateBatchById(updateShopStoreActivityBaseList);
|
shopStoreActivityBaseService.updateBatchById(updateShopStoreActivityBaseList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1091,59 +1097,58 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements
|
|||||||
* 一对多,如product_id:1002,item_number:120_121;数据格式为item_id,item_id item_unit_price,item_unit_price
|
* 一对多,如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
|
* 最终组合item_id,item_id_item_unit_price,item_unit_price
|
||||||
* 满减的切割规则的itemid
|
* 满减的切割规则的itemid
|
||||||
*
|
|
||||||
* @param itemPrice
|
* @param itemPrice
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private List<org.json.JSONObject> getFulReduItemList(String itemPrice, String activeType, BigDecimal discount) {
|
private List<org.json.JSONObject> getFulReduItemList(String itemPrice,String activeType,BigDecimal discount){
|
||||||
List<org.json.JSONObject> newItems = new ArrayList<>();
|
List<org.json.JSONObject> newItems=new ArrayList<>();
|
||||||
String[] itemPriceArray = itemPrice.split("_");
|
String [] itemPriceArray=itemPrice.split("_");
|
||||||
String itemIds = itemPriceArray[0];
|
String itemIds=itemPriceArray[0];
|
||||||
String unitPrices = itemPriceArray[1];
|
String unitPrices=itemPriceArray[1];
|
||||||
switch (activeType) {
|
switch (activeType){
|
||||||
case ActiveShopJsonUtils.DISCOUNT:
|
case ActiveShopJsonUtils.DISCOUNT:
|
||||||
if (itemIds.contains(",")) {
|
if(itemIds.contains(",")){
|
||||||
String[] itemIdsArray = itemIds.split(",");
|
String [] itemIdsArray=itemIds.split(",");
|
||||||
for (String itemId : itemIdsArray) {
|
for (String itemId : itemIdsArray) {
|
||||||
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
||||||
jsonObject.put("item_id", itemId);
|
jsonObject.put("item_id", itemId);
|
||||||
jsonObject.put("rate", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(100))));
|
jsonObject.put("rate", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(100))));
|
||||||
newItems.add(jsonObject);
|
newItems.add(jsonObject);
|
||||||
}
|
}
|
||||||
} else {
|
}else {
|
||||||
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
org.json.JSONObject jsonObject=new org.json.JSONObject();
|
||||||
jsonObject.put("item_id", itemIds);
|
jsonObject.put("item_id",itemIds);
|
||||||
jsonObject.put("rate", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(100))));
|
jsonObject.put("rate", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(100))));
|
||||||
newItems.add(jsonObject);
|
newItems.add(jsonObject);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActiveShopJsonUtils.FULLREDUCE:
|
case ActiveShopJsonUtils.FULLREDUCE:
|
||||||
if (itemIds.contains(",")) {
|
if(itemIds.contains(",")){
|
||||||
String[] itemIdsArray = itemIds.split(",");
|
String [] itemIdsArray=itemIds.split(",");
|
||||||
for (String itemId : itemIdsArray) {
|
for(String itemId:itemIdsArray){
|
||||||
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
org.json.JSONObject jsonObject=new org.json.JSONObject();
|
||||||
jsonObject.put("item_id", itemId);
|
jsonObject.put("item_id",itemId);
|
||||||
newItems.add(jsonObject);
|
newItems.add(jsonObject);
|
||||||
}
|
}
|
||||||
} else {
|
}else {
|
||||||
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
org.json.JSONObject jsonObject=new org.json.JSONObject();
|
||||||
jsonObject.put("item_id", itemIds);
|
jsonObject.put("item_id",itemIds);
|
||||||
newItems.add(jsonObject);
|
newItems.add(jsonObject);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActiveShopJsonUtils.SECKILL:
|
case ActiveShopJsonUtils.SECKILL:
|
||||||
if (itemIds.contains(",")) {
|
if(itemIds.contains(",")){
|
||||||
String[] unitPricesArray = unitPrices.split(",");
|
String [] unitPricesArray=unitPrices.split(",");
|
||||||
String[] itemIdsArray = itemIds.split(",");
|
String [] itemIdsArray=itemIds.split(",");
|
||||||
for (int i = 0; i < itemIdsArray.length; i++) {
|
for (int i=0;i<itemIdsArray.length;i++) {
|
||||||
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
||||||
jsonObject.put("item_id", itemIdsArray[i]);
|
jsonObject.put("item_id", itemIdsArray[i]);
|
||||||
jsonObject.put("price", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(unitPricesArray[i]))));
|
jsonObject.put("price", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(unitPricesArray[i]))));
|
||||||
newItems.add(jsonObject);
|
newItems.add(jsonObject);
|
||||||
}
|
}
|
||||||
} else {
|
}else {
|
||||||
org.json.JSONObject jsonObject = new org.json.JSONObject();
|
org.json.JSONObject jsonObject=new org.json.JSONObject();
|
||||||
jsonObject.put("item_id", itemIds);
|
jsonObject.put("item_id",itemIds);
|
||||||
jsonObject.put("price", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(unitPrices))));
|
jsonObject.put("price", BigDecimalFormatter.formatWithoutTrailingZeros(discount.multiply(new BigDecimal(unitPrices))));
|
||||||
newItems.add(jsonObject);
|
newItems.add(jsonObject);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.suisung.mall.shop.sync.mapper.ShopImageMappingTempMapper">
|
||||||
|
|
||||||
|
<!-- 通用查询结果列 -->
|
||||||
|
<sql id="Base_Column_List">
|
||||||
|
id, product_image_id, product_id, product_name, store_id, merged_image_url, thumb,name
|
||||||
|
</sql>
|
||||||
|
<insert id="mergeShopImageMappingTemp">
|
||||||
|
INSERT into shop_image_mapping_temp(product_image_id,product_id,product_name,store_id,merged_image_url,thumb,name)
|
||||||
|
SELECT
|
||||||
|
temp.product_image_id,
|
||||||
|
temp.product_id,
|
||||||
|
temp.product_name,
|
||||||
|
temp.store_id,
|
||||||
|
temp. merged_image_url,
|
||||||
|
temp.thumb,
|
||||||
|
temp.name
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() over(partition by t.product_name
|
||||||
|
order by
|
||||||
|
t.id) rn,
|
||||||
|
t.*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
spi.product_image_id,
|
||||||
|
spi.product_id,
|
||||||
|
spi.product_name,
|
||||||
|
spi.store_id,
|
||||||
|
lpi. merged_image_url,
|
||||||
|
lp.thumb,
|
||||||
|
lp.id,
|
||||||
|
lp.name
|
||||||
|
FROM
|
||||||
|
-- (select * from shop_product_image limit 7500,500) spi
|
||||||
|
shop_product_image spi
|
||||||
|
INNER JOIN library_product lp ON
|
||||||
|
spi.product_name like CONCAT(lp.name,"%")
|
||||||
|
-- MATCH(spi.product_name) AGAINST(CONCAT(lp.name, '*') IN BOOLEAN MODE)
|
||||||
|
-- AND spi.product_name LIKE CONCAT(lp.name, '%') -- 保持精确匹配
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
product_id,
|
||||||
|
GROUP_CONCAT(image_url SEPARATOR ',') AS merged_image_url
|
||||||
|
FROM
|
||||||
|
library_product_image
|
||||||
|
WHERE
|
||||||
|
is_main = '0'
|
||||||
|
GROUP BY
|
||||||
|
product_id ) lpi ON
|
||||||
|
lp.id = lpi.product_id
|
||||||
|
WHERE
|
||||||
|
spi.product_from = '1005'
|
||||||
|
AND spi.item_image_default = '1' )t )temp
|
||||||
|
where
|
||||||
|
temp.rn = 1 and temp.store_id=#{storeId}
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<delete id="deleteShopImageMappingTemp">
|
||||||
|
delete from shop_image_mapping_temp where store_id=#{storeId}
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@ -8,4 +8,249 @@
|
|||||||
item_image_diy, item_video, item_image_ext_1, item_image_ext_2
|
item_image_diy, item_video, item_image_ext_1, item_image_ext_2
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
|
<resultMap id="imageMappingDtoResultMap" type="com.suisung.mall.common.modules.sync.ImageMappingDto">
|
||||||
|
<id property="productImageId" column="product_image_id" />
|
||||||
|
<result property="productId" column="product_id" />
|
||||||
|
<result property="storeId" column="store_id" />
|
||||||
|
<result property="mergedImageUrl" column="merged_image_url"/>
|
||||||
|
<result property="thumb" column="thumb"/>
|
||||||
|
<result property="imgProductName" column="name"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="mappingProductImage" resultMap="imageMappingDtoResultMap">
|
||||||
|
<if test="type!=null and type=='1'.toString()">
|
||||||
|
<include refid="mappingByBarCode"></include>
|
||||||
|
</if>
|
||||||
|
<if test="type!=null and type=='2'.toString()">
|
||||||
|
<include refid="mappingByProductShortName"></include>
|
||||||
|
</if>
|
||||||
|
<if test="type!=null and type=='3'.toString()">
|
||||||
|
<include refid="mappingByProductName"></include>
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="mappingByBarCodeCount" resultType="java.lang.Integer">
|
||||||
|
select count(1)
|
||||||
|
from (
|
||||||
|
SELECT
|
||||||
|
temp.product_image_id,
|
||||||
|
temp.product_id,
|
||||||
|
temp.store_id,
|
||||||
|
temp. merged_image_url,
|
||||||
|
temp.thumb,
|
||||||
|
temp.name
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() over(partition by t.product_name order by t.id) rn,t.*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
spi.product_image_id,
|
||||||
|
spi.product_id,
|
||||||
|
spi.product_name,
|
||||||
|
spi.store_id,
|
||||||
|
lpi. merged_image_url,
|
||||||
|
lp.thumb,
|
||||||
|
lp.id,
|
||||||
|
lp.name
|
||||||
|
FROM
|
||||||
|
shop_product_image spi
|
||||||
|
INNER JOIN
|
||||||
|
library_product lp ON
|
||||||
|
spi.product_number = lp.barcode
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
product_id,
|
||||||
|
GROUP_CONCAT(image_url SEPARATOR ',') AS merged_image_url
|
||||||
|
FROM
|
||||||
|
library_product_image
|
||||||
|
WHERE
|
||||||
|
is_main = '0'
|
||||||
|
GROUP BY
|
||||||
|
product_id
|
||||||
|
) lpi ON
|
||||||
|
lp.id = lpi.product_id
|
||||||
|
WHERE
|
||||||
|
spi.product_from = '1005'
|
||||||
|
AND spi.item_image_default = '1'
|
||||||
|
<![CDATA[ AND lp.barcode <> '' ]]>)t
|
||||||
|
)temp
|
||||||
|
where
|
||||||
|
temp.rn = 1 and temp.store_id=#{storeId}
|
||||||
|
)tt
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<sql id="mappingByBarCode">
|
||||||
|
SELECT
|
||||||
|
temp.product_image_id,
|
||||||
|
temp.product_id,
|
||||||
|
temp.store_id,
|
||||||
|
temp. merged_image_url,
|
||||||
|
temp.thumb,
|
||||||
|
temp.name
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() over(partition by t.product_name order by t.id) rn,t.*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
spi.product_image_id,
|
||||||
|
spi.product_id,
|
||||||
|
spi.product_name,
|
||||||
|
spi.store_id,
|
||||||
|
lpi. merged_image_url,
|
||||||
|
lp.thumb,
|
||||||
|
lp.id,
|
||||||
|
lp.name
|
||||||
|
FROM
|
||||||
|
shop_product_image spi
|
||||||
|
INNER JOIN
|
||||||
|
library_product lp ON
|
||||||
|
spi.product_number = lp.barcode
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
product_id,
|
||||||
|
GROUP_CONCAT(image_url SEPARATOR ',') AS merged_image_url
|
||||||
|
FROM
|
||||||
|
library_product_image
|
||||||
|
WHERE
|
||||||
|
is_main = '0'
|
||||||
|
GROUP BY
|
||||||
|
product_id
|
||||||
|
) lpi ON
|
||||||
|
lp.id = lpi.product_id
|
||||||
|
WHERE
|
||||||
|
spi.product_from = '1005'
|
||||||
|
AND spi.item_image_default = '1'
|
||||||
|
<![CDATA[ AND lp.barcode <> '' ]]>)t
|
||||||
|
)temp
|
||||||
|
where
|
||||||
|
temp.rn = 1 and temp.store_id=#{storeId} limit #{offset},#{limit}
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<select id="mappingByProductShortNameCount" resultType="java.lang.Integer">
|
||||||
|
select count(1)
|
||||||
|
from (
|
||||||
|
SELECT
|
||||||
|
temp.product_image_id,
|
||||||
|
temp.product_id,
|
||||||
|
temp.store_id,
|
||||||
|
temp. merged_image_url,
|
||||||
|
temp.thumb,
|
||||||
|
temp.name
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() over(partition by t.product_name order by t.id) rn,t.*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
spi.product_image_id,
|
||||||
|
spi.product_id,
|
||||||
|
spi.product_name,
|
||||||
|
spi.store_id,
|
||||||
|
lpi. merged_image_url,
|
||||||
|
lp.thumb,
|
||||||
|
lp.id,
|
||||||
|
lp.name
|
||||||
|
FROM
|
||||||
|
shop_product_image spi
|
||||||
|
INNER JOIN
|
||||||
|
library_product lp ON
|
||||||
|
spi.product_short_name = lp.product_short_name
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
product_id,
|
||||||
|
GROUP_CONCAT(image_url SEPARATOR ',') AS merged_image_url
|
||||||
|
FROM
|
||||||
|
library_product_image
|
||||||
|
WHERE
|
||||||
|
is_main = '0'
|
||||||
|
GROUP BY
|
||||||
|
product_id
|
||||||
|
) lpi ON
|
||||||
|
lp.id = lpi.product_id
|
||||||
|
WHERE
|
||||||
|
spi.product_from = '1005'
|
||||||
|
AND spi.item_image_default = '1'
|
||||||
|
<![CDATA[ AND lp.product_short_name <> '' ]]>
|
||||||
|
)t
|
||||||
|
)temp
|
||||||
|
where
|
||||||
|
temp.rn = 1 and temp.store_id=#{storeId}
|
||||||
|
)tt
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<sql id="mappingByProductShortName">
|
||||||
|
SELECT
|
||||||
|
temp.product_image_id,
|
||||||
|
temp.product_id,
|
||||||
|
temp.store_id,
|
||||||
|
temp. merged_image_url,
|
||||||
|
temp.thumb,
|
||||||
|
temp.name
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
ROW_NUMBER() over(partition by t.product_name order by t.id) rn,t.*
|
||||||
|
from
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
spi.product_image_id,
|
||||||
|
spi.product_id,
|
||||||
|
spi.product_name,
|
||||||
|
spi.store_id,
|
||||||
|
lpi. merged_image_url,
|
||||||
|
lp.thumb,
|
||||||
|
lp.id,
|
||||||
|
lp.name
|
||||||
|
FROM
|
||||||
|
shop_product_image spi
|
||||||
|
INNER JOIN
|
||||||
|
library_product lp ON
|
||||||
|
spi.product_short_name = lp.product_short_name
|
||||||
|
LEFT JOIN
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
product_id,
|
||||||
|
GROUP_CONCAT(image_url SEPARATOR ',') AS merged_image_url
|
||||||
|
FROM
|
||||||
|
library_product_image
|
||||||
|
WHERE
|
||||||
|
is_main = '0'
|
||||||
|
GROUP BY
|
||||||
|
product_id
|
||||||
|
) lpi ON
|
||||||
|
lp.id = lpi.product_id
|
||||||
|
WHERE
|
||||||
|
spi.product_from = '1005'
|
||||||
|
AND spi.item_image_default = '1'
|
||||||
|
<![CDATA[ AND lp.product_short_name <> '' ]]>
|
||||||
|
)t
|
||||||
|
)temp
|
||||||
|
where
|
||||||
|
temp.rn = 1 and temp.store_id=#{storeId} limit #{offset},#{limit}
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<select id="mappingByProductNameCount" resultType="java.lang.Integer">
|
||||||
|
select count(1) from shop_image_mapping_temp where store_id=#{storeId}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<sql id="mappingByProductName">
|
||||||
|
select product_image_id,
|
||||||
|
product_id,
|
||||||
|
product_name,
|
||||||
|
store_id,
|
||||||
|
merged_image_url,
|
||||||
|
thumb,name
|
||||||
|
from shop_image_mapping_temp
|
||||||
|
where store_id=#{storeId} limit #{offset},#{limit}
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
33
sql/shop/dev/202506023_ddl.sql
Normal file
33
sql/shop/dev/202506023_ddl.sql
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
alter table shop_product_image add `product_name` varchar(100) DEFAULT '' COMMENT '产品名称同步数据用';
|
||||||
|
alter table shop_product_image add `product_number` varchar(50) DEFAULT '' COMMENT '商品货号同步数据用';
|
||||||
|
|
||||||
|
|
||||||
|
alter table shop_product_image add `product_short_name` varchar(100) DEFAULT '' COMMENT '商品简称,作为匹配关键字';
|
||||||
|
alter table library_product add `product_short_name` varchar(100) DEFAULT '' COMMENT '商品简称,作为匹配关键字';
|
||||||
|
alter table shop_product_base add `product_short_name` varchar(100) DEFAULT '' COMMENT '商品简称,作为匹配关键字';
|
||||||
|
alter table shop_product_image add `product_from` varchar(5) DEFAULT '' COMMENT '商品来源(ENUM):1000-发布;1001-天猫;1002-淘宝;1003-阿里巴巴;1004-京东;1005-思迅;同步数据匹配';
|
||||||
|
|
||||||
|
alter table shop_product_image add index `index_sproduct_short_name` (`product_short_name`) USING BTREE;
|
||||||
|
alter table library_product add index `index_product_short_name` (`product_short_name`) USING BTREE;
|
||||||
|
alter table shop_product_base add index `index_product_short_name` (`product_short_name`) USING BTREE;
|
||||||
|
alter table shop_product_image add index `index_product_from` (`product_from`) USING BTREE;
|
||||||
|
CREATE INDEX idx_shop_product_filter ON shop_product_image(product_from, item_image_default) USING BTREE;
|
||||||
|
|
||||||
|
CREATE TABLE shop_image_mapping_temp (
|
||||||
|
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '临时表id',
|
||||||
|
`product_image_id` bigint unsigned DEFAULT NULL COMMENT '商品图片编号',
|
||||||
|
`product_id` bigint unsigned DEFAULT 0 COMMENT '产品编号:product_id-color_id',
|
||||||
|
`product_name` varchar(100) DEFAULT '' COMMENT '产品名称同步数据用',
|
||||||
|
`store_id` int unsigned DEFAULT NULL COMMENT '店铺编号',
|
||||||
|
`merged_image_url` text COMMENT '合并后的图片URL',
|
||||||
|
`name` varchar(255) DEFAULT '' COMMENT '图库商品名',
|
||||||
|
`thumb` varchar(512) DEFAULT '' COMMENT '主图',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `index_product_name` (`product_name`) USING BTREE,
|
||||||
|
KEY `index_name` (`name`) USING BTREE,
|
||||||
|
KEY `index_store_id` (`store_id`) USING BTREE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品图片映射临时表';
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user