Explorar o código

Merge remote-tracking branch 'origin/master'

wangming hai 1 semana
pai
achega
6a8d0e8167

+ 2 - 2
yami-shop-api/src/main/java/com/yami/shop/api/controller/AddrController.java

@@ -26,6 +26,7 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
@@ -188,9 +189,8 @@ public class AddrController {
             throw new GlobalException("该地址已被删除");
         }
         Transport2 transport2 = transportManagerService.calculateTransfeeStart(shopId, userAddr.getLongitude(), userAddr.getLatitude());
-
         UserAddrDto userAddrDto = mapperFacade.map(userAddr, UserAddrDto.class);
-        userAddrDto.setDeliveryAmount(transport2.getAmount());
+        if (ObjectUtils.isNotEmpty(transport2)) userAddrDto.setDeliveryAmount(transport2.getAmount());
         return ResponseEntity.ok(userAddrDto);
     }
 

+ 9 - 15
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java

@@ -14,10 +14,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import com.google.common.collect.Lists;
 import com.yami.shop.bean.app.dto.*;
-import com.yami.shop.bean.app.param.OrderParam;
-import com.yami.shop.bean.app.param.OrderPayInfoParam;
-import com.yami.shop.bean.app.param.OrderShopParam;
-import com.yami.shop.bean.app.param.SubmitOrderParam;
+import com.yami.shop.bean.app.param.*;
 import com.yami.shop.bean.event.ConfirmOrderEvent;
 import com.yami.shop.bean.event.PlatformConfirmOrderEvent;
 import com.yami.shop.bean.event.ScoreConfirmOrderEvent;
@@ -98,8 +95,9 @@ public class OrderController {
         UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId);
         UserAddrDto userAddrDto = mapperFacade.map(userAddr, UserAddrDto.class);
         // 组装获取用户提交的购物车商品项
-        //TODO wangjian 目前是写死的
-        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderParam.getOrderItem(), userId);
+        OrderItemParam orderItem = orderParam.getOrderItem();
+        orderItem.setPlatform(orderParam.getPlatform());
+        List<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderItem, userId);
         if (CollectionUtil.isEmpty(shopCartItems)) {
             throw new GlobalException("请选择您需要的商品加入购物车");
         }
@@ -109,7 +107,6 @@ public class OrderController {
 
         // 将要返回给前端的完整的订单信息
         ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto();
-//        shopCartOrderMergerDto.setDvyType(orderParam.getDvyType());
         shopCartOrderMergerDto.setUserAddr(userAddrDto);
         shopCartOrderMergerDto.setIsScorePay(orderParam.getIsScorePay());
         // 所有店铺的订单信息
@@ -139,7 +136,6 @@ public class OrderController {
                 List<ShopCartItemDto> discountShopCartItems = shopCartItemDiscount.getShopCartItems();
                 shopAllShopCartItems.addAll(discountShopCartItems);
             }
-
             shopCartOrder.setShopCartItemDiscounts(shopCartItemDiscounts);
             allCartItem.addAll(shopAllShopCartItems);
 
@@ -148,11 +144,11 @@ public class OrderController {
             total = Arith.add(total, shopCartOrder.getTotal());
             totalCount = totalCount + shopCartOrder.getTotalCount();
             allOrderReduce = Arith.add(allOrderReduce, shopCartOrder.getShopReduce());
-            //TODO wangjian 计算配送方式,和运费
             totalTransfee = Arith.add(totalTransfee, shopCartOrder.getTransfee());
             weight = Arith.add(weight, shopCartOrder.getTotalWeight());
             shopCartOrders.add(shopCartOrder);
         }
+        shopCartOrderMergerDto.setDvyType(orderParam.getDvyType());
 
         //根据价格进行店铺、满减、商品项的价格升序操作
         for (int n = 0; n < shopCartOrders.size(); n++) {
@@ -165,7 +161,6 @@ public class OrderController {
                 sortShopCartItems = sortShopCartItems.stream().sorted(Comparator.comparing(ProductItemDto::getActualTotal)).collect(Collectors.toList());
                 shopCartItemDiscount.setShopCartItems(sortShopCartItems);
                 double totalAmount = shopCartItemDiscount.getShopCartItems().stream().mapToDouble(ProductItemDto::getActualTotal).sum();
-                //TODO 计算真实总库存
                 shopCartItemDiscount.setTotalAmount(totalAmount);
             }
             // 如果是折扣特别小的情况下,导致实际金额为0是,改变最小支付金额为0.01元,并且优惠金额减去0.01。
@@ -179,7 +174,6 @@ public class OrderController {
             }
             shopCartItemDiscounts = shopCartItemDiscounts.stream().sorted(Comparator.comparing(ShopCartItemDiscountDto::getTotalAmount)).collect(Collectors.toList());
             shopCartOrders.get(n).setShopCartItemDiscounts(shopCartItemDiscounts);
-            //TODO 计算真实总库存
             actualTotal = Arith.add(actualTotal, shopCartOrderDto.getActualTotal());
         }
 
@@ -219,8 +213,8 @@ public class OrderController {
                     orderPlatformAmount = Arith.add(orderPlatformAmount, shopCartItem.getPlatformShareReduce());
                 }
             }
-//            shopCartOrder.setActualTotal(Arith.add(orderActualTotal, shopCartOrder.getTransfee()));
-            shopCartOrder.setActualTotal(100.0);
+            shopCartOrder.setActualTotal(Arith.add(orderActualTotal, shopCartOrder.getTransfee()));
+//            shopCartOrder.setActualTotal(100.0);
             //放入优惠金额
             shopCartOrder.setShopReduce(Arith.add(orderReduceAmount, shopCartOrder.getFreeTransfee()));
             //放入平台优惠金额,如果用户等级免自营店运费也要放进去
@@ -267,8 +261,8 @@ public class OrderController {
                 }
             }
         }
-
-        List<Order> orders = orderService.submit(userId, mergerOrder);
+        mergerOrder.setPlatform(submitOrderParam.getPlatform());
+       List<Order> orders = orderService.submit(userId, mergerOrder);
 
         StringBuilder orderNumbers = new StringBuilder();
         for (Order order : orders) {

+ 2 - 2
yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java

@@ -122,8 +122,8 @@ public class ConfirmOrderListener {
                         //即时配送
                         orderParam.setDvyType(DvyType.NOT_DELIVERY.value());
                     }
-                    //费用按重量计算
-                    double sub = Arith.sub(shopCartOrderDto.getTotalWeight(), 20.0);
+                    //费用按重量计算,数据是g,现在要按kg计算,20是kg单位
+                    double sub = Arith.sub(shopCartOrderDto.getTotalWeight(), Arith.mul(20.0, 1000));
                     transfee = transport2.getFreightFee().doubleValue();
                     if (sub > 0) {
                         //超过重量的安规则计算,累加费用

+ 19 - 20
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -158,13 +158,11 @@ public class SubmitOrderListener {
 
                 }
 
-
                 orderProdName.subSequence(0, Math.min(orderProdName.length() - 1, 100));
                 if (orderProdName.lastIndexOf(",") == orderProdName.length() - 1) {
                     orderProdName.deleteCharAt(orderProdName.length() - 1);
                 }
 
-
                 // 订单信息
                 com.yami.shop.bean.model.Order order = new com.yami.shop.bean.model.Order();
 
@@ -179,13 +177,14 @@ public class SubmitOrderListener {
                 // 实际总额
                 order.setActualTotal(shopCartOrderDto.getActualTotal());
                 order.setStatus(OrderStatus.UNPAY.value());
+                order.setChannelId(Long.valueOf(mergerOrder.getPlatform()));
                 order.setUpdateTime(now);
                 order.setCreateTime(now);
                 order.setIsPayed(0);
                 order.setDeleteStatus(0);
                 order.setProductNums(shopCartOrderDto.getTotalCount());
                 order.setAddrOrderId(addrOrderId);
-                order.setDvyType(1);
+                order.setDvyType(mergerOrder.getDvyType());
                 order.setReduceAmount(shopCartOrderDto.getShopReduce());
                 order.setFreightAmount(shopCartOrderDto.getTransfee());
                 order.setRemarks(shopCartOrderDto.getRemarks());
@@ -220,23 +219,23 @@ public class SubmitOrderListener {
 
 //TODO wangjia 修改本地库存
         // 更新sku库存
-//        skuStocksMap.forEach((key, sku) -> {
-//
-//            if (skuMapper.updateStocks(sku) == 0) {
-//                skuService.removeSkuCacheBySkuId(key, sku.getProdId());
-//                productService.removeProductCacheByProdId(sku.getProdId());
-//                throw new GlobalException("商品:[" + sku.getProdName() + "]库存不足");
-//            }
-//        });
-
-        // 更新商品库存
-//        prodStocksMap.forEach((prodId, prod) -> {
-//
-//            if (productMapper.updateStocks(prod) == 0) {
-//                productService.removeProductCacheByProdId(prodId);
-//                throw new GlobalException("商品:[" + prod.getProdName() + "]库存不足");
-//            }
-//        });
+        skuStocksMap.forEach((key, sku) -> {
+
+            if (skuMapper.updateStocks(sku) == 0) {
+                skuService.removeSkuCacheBySkuId(key, sku.getProdId());
+                productService.removeProductCacheByProdId(sku.getProdId());
+                throw new GlobalException("商品:[" + sku.getProdName() + "]库存不足");
+            }
+        });
+
+//         更新商品库存
+        prodStocksMap.forEach((prodId, prod) -> {
+
+            if (productMapper.updateStocks(prod) == 0) {
+                productService.removeProductCacheByProdId(prodId);
+                throw new GlobalException("商品:[" + prod.getProdName() + "]库存不足");
+            }
+        });
 
     }
 

+ 2 - 2
yami-shop-api/src/main/resources/application.yml

@@ -2,8 +2,8 @@
 spring:
   # 环境 dev|prod|docker
   profiles:
-    active: dev
-#    active: prod
+#    active: dev
+    active: prod
   #文件上传设置
   servlet:
     multipart:

+ 2 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java

@@ -77,6 +77,8 @@ public class ShopCartOrderMergerDto implements Serializable{
     @ApiModelProperty(value = "配送类型 1:快递 2:自提 3:无需快递")
     private Integer dvyType;
 
+    private Integer platform;
+
     private Double weight;
 
 }

+ 2 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderItemParam.java

@@ -40,4 +40,6 @@ public class OrderItemParam {
 
 	@ApiModelProperty(value = "推广员使用的推销卡号")
 	private String distributionCardNo;
+
+	private Integer platform;
 }

+ 3 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/SearchParam.java

@@ -59,4 +59,7 @@ public class SearchParam {
     @ApiModelProperty("距离")
     private String distance;
 
+    @ApiModelProperty("平台")
+    private Integer platform;
+
 }

+ 1 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DvyType.java

@@ -25,7 +25,7 @@ public enum DvyType {
     FETCH(2),
 
     /**
-     * 时配送
+     * 时配送
      */
     NOT_DELIVERY(3)
     ;

+ 11 - 14
yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/service/impl/TransportManagerServiceImpl.java

@@ -31,6 +31,7 @@ import com.yami.shop.service.ProductService;
 import com.yami.shop.service.ShopDetailService;
 import com.yami.shop.service.SkuService;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -255,22 +256,21 @@ public class TransportManagerServiceImpl implements TransportManagerService {
 
     @Override
     public Transport2 calculateTransfeeStart(Long shopId, Double longitude, Double latitude) {
-
-
         if (longitude.equals(0.0)) {
             throw new GlobalException("收货地址经纬度为空");
         }
-
         ShopDetail shopDetailByShopId = shopDetailService.getShopDetailByShopId(shopId);
-        //TODO wangjian NullPointerException
-        double v = calculateDistance(latitude, longitude, Double.valueOf(shopDetailByShopId.getShopLat()), Double.valueOf(shopDetailByShopId.getShopLng()));
-        Transport2 byDistance = transport2Service.findByDistance(shopId, v);
-        if (ObjectUtil.isEmpty(byDistance)) {
-            throw new GlobalException("超出配送范围");
-        }
-        // todo 计算价格
+        if (ObjectUtils.isNotEmpty(shopDetailByShopId)) {
+            double v = calculateDistance(latitude, longitude, Double.valueOf(shopDetailByShopId.getShopLat()), Double.valueOf(shopDetailByShopId.getShopLng()));
+            Transport2 byDistance = transport2Service.findByDistance(shopId, v);
+            if (ObjectUtil.isEmpty(byDistance)) {
+                throw new GlobalException("超出配送范围");
+            }
+            // todo 计算价格
 
-        return byDistance;
+            return byDistance;
+        }
+        return null;
     }
 
 
@@ -526,18 +526,15 @@ public class TransportManagerServiceImpl implements TransportManagerService {
 
     private static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
         final double R = 6371; // 地球半径,单位:公里
-
         // 转为弧度
         double latDistance = Math.toRadians(lat2 - lat1);
         double lonDistance = Math.toRadians(lon2 - lon1);
-
         // Haversine公式
         double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
                 + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
                 * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
 
         double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
-
         return R * c; // 距离单位:公里
     }
 

+ 7 - 6
yami-shop-service/src/main/java/com/yami/shop/service/impl/BasketServiceImpl.java

@@ -34,6 +34,7 @@ import com.yami.shop.service.ProductService;
 import com.yami.shop.service.ShopDetailService;
 import com.yami.shop.service.SkuService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
@@ -96,7 +97,7 @@ public class BasketServiceImpl extends ServiceImpl<BasketMapper, Basket> impleme
     public List<ShopCartItemDto> getShopCartItems(String userId) {
         // 在这个类里面要调用这里的缓存信息,并没有使用aop,所以不使用注解
         List<ShopCartItemDto> shopCartItemDtoList = cacheManagerUtil.getCache("ShopCartItems", userId);
-        if (shopCartItemDtoList != null) {
+        if(ObjectUtils.isNotEmpty(shopCartItemDtoList)){
             return shopCartItemDtoList;
         }
         shopCartItemDtoList = basketMapper.getShopCartItems(userId);
@@ -196,15 +197,17 @@ public class BasketServiceImpl extends ServiceImpl<BasketMapper, Basket> impleme
         List<ShopCartItemDto> dbShopCartItems = getShopCartItems(userId);
 
         // 返回购物车选择的商品信息
-        return dbShopCartItems
+        List<ShopCartItemDto> collect = dbShopCartItems
                 .stream()
                 .filter(shopCartItemDto -> basketId.contains(shopCartItemDto.getBasketId()))
                 .collect(Collectors.toList());
+        return collect;
     }
 
     @Override
     public ShopCartItemDto getShopCartItem(OrderItemParam orderItem) {
-        Sku sku = skuService.getSkuBySkuId(orderItem.getSkuId());
+        //Integer platform, Long shopId
+        Sku sku = skuService.getSkuBySkuId(orderItem.getSkuId(),orderItem.getPlatform(),orderItem.getShopId());
         if (sku == null) {
             throw new RuntimeException("订单包含无法识别的商品");
         }
@@ -228,9 +231,7 @@ public class BasketServiceImpl extends ServiceImpl<BasketMapper, Basket> impleme
         shopCartItemDto.setCategoryId(prod.getCategoryId());
         shopCartItemDto.setPic(StrUtil.isBlank(sku.getPic()) ? prod.getPic() : sku.getPic());
         shopCartItemDto.setProdName(sku.getProdName());
-        //TODO wangjain 空指针 sku.getPrice(),需要去查sku_shop中的价格
-//        shopCartItemDto.setProductTotalAmount(Arith.mul(sku.getPrice(), orderItem.getProdCount()));
-        shopCartItemDto.setProductTotalAmount(Arith.mul(1, orderItem.getProdCount()));
+        shopCartItemDto.setProductTotalAmount(Arith.mul(sku.getPrice(), orderItem.getProdCount()));
         shopCartItemDto.setPrice(sku.getPrice());
         shopCartItemDto.setDistributionCardNo(orderItem.getDistributionCardNo());
         shopCartItemDto.setBasketDate(new Date());

+ 0 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -206,7 +206,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         orderList.forEach(order -> orderMapper.insert(order));
         List<OrderItem> orderItems = orderList.stream()
                 .flatMap(order -> order.getOrderItems().stream()
-                        .peek((o)->o.setPrice(100.0)) //TODO 测试代码,后面需要删掉
                 )
                 .collect(Collectors.toList());
         // 插入订单项,返回主键

+ 0 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/ShopDetailServiceImpl.java

@@ -92,7 +92,6 @@ public class ShopDetailServiceImpl extends ServiceImpl<ShopDetailMapper, ShopDet
     }
 
     @Override
-    @Cacheable(cacheNames = "shop_detail", key = "#shopId")
     public ShopDetail getShopDetailByShopId(Long shopId) {
         return shopDetailMapper.selectShopDetailById(shopId);
     }

+ 39 - 32
yami-shop-service/src/main/resources/mapper/ProductMapper.xml

@@ -131,42 +131,45 @@
     <select id="doGetById" resultType="com.yami.shop.bean.model.Product">
         SELECT
             tp.prod_id,
-            tp.prod_name,
+            MAX(tp.prod_name) AS prod_name,
             tcs.shop_id AS shop_id,
-            tp.brand_id,
-            tp.brand_name,
-            tp.ori_price,
-            tp.price,
-            tp.score_price,
-            tp.brief,
-            tp.video,
-            tp.pic,
-            tp.content,
-            tp.imgs,
-            tp.status,
-            tp.is_delete,
-            tp.shop_category_id,
-            tp.category_id,
-            tp.hb_front_category_id,
-            tp.sold_num,
-            tss.shop_sku_stocks AS total_stocks,
-            tp.delivery_mode,
-            tp.delivery_template_id,
-            tp.create_time,
-            tp.update_time,
-            tp.putaway_time,
-            tp.version,
-            tp.prod_type,
-            tp.activity_id,
-            tp.sup_id,
-            tp.hb_spu_id,
-            tp.hb_status
+            MAX(tp.brand_id) AS brand_id,
+            MAX(tp.brand_name) AS brand_name,
+            MAX(tp.ori_price) AS ori_price,
+            MAX(tss.shop_sku_price) AS price,
+            MAX(tp.score_price) AS score_price,
+            MAX(tp.brief) AS brief,
+            MAX(tp.video) AS video,
+            MAX(tp.pic) AS pic,
+            MAX(tp.content) AS content,
+            MAX(tp.imgs) AS imgs,
+            MAX(tp.status) AS status,
+            MAX(tp.is_delete) AS is_delete,
+            MAX(tp.shop_category_id) AS shop_category_id,
+            MAX(tp.category_id) AS category_id,
+            MAX(tp.hb_front_category_id) AS hb_front_category_id,
+            MAX(tp.sold_num) AS sold_num,
+            SUM(tss.shop_sku_stocks) AS total_stocks,
+            MAX(tp.delivery_mode) AS delivery_mode,
+            MAX(tp.delivery_template_id) AS delivery_template_id,
+            MAX(tp.create_time) AS create_time,
+            MAX(tp.update_time) AS update_time,
+            MAX(tp.putaway_time) AS putaway_time,
+            MAX(tp.version) AS version,
+            MAX(tp.prod_type) AS prod_type,
+            MAX(tp.activity_id) AS activity_id,
+            MAX(tp.sup_id) AS sup_id,
+            MAX(tp.hb_spu_id) AS hb_spu_id,
+            MAX(tp.hb_status) AS hb_status
         FROM tz_prod AS tp
                  LEFT JOIN tz_shop_sku AS tss ON tp.prod_id = tss.spu_id
                  LEFT JOIN tz_channel_shop AS tcs ON tss.shop_id = tcs.shop_id
         WHERE tp.prod_id = #{prodId}
           AND tcs.channel_id = #{platform}
-        GROUP BY tcs.shop_id;
+        GROUP BY
+            tp.prod_id,
+            tcs.shop_id
+        LIMIT 1
     </select>
 
 
@@ -593,7 +596,7 @@
         any_value(p.prod_id) as prod_id,
         any_value(p.imgs) as pic,
         any_value(p.prod_name) as prod_name,
-        any_value(tss.shop_sku_price) as price,
+        MIN(tcp.channel_prod_price) as price,
         any_value(p.brief) as brief,
         any_value ( tss.shop_id ) AS shopId,
         any_value ( tss.self_label_id ) AS selfLabelId,
@@ -608,7 +611,8 @@
         LEFT JOIN tz_prod p ON p.prod_id = tss.spu_id
         LEFT JOIN tz_shop_detail sd ON sd.shop_id = tss.shop_id
         LEFT JOIN tz_prod_comm pc ON p.prod_id = pc.prod_id
-        where 1 = 1 and p.`status` = 1 and tss.shop_id in
+        LEFT JOIN tz_channel_prod tcp ON tss.sku_id = tcp.sku_id
+        where 1 = 1 and p.`status` = 1 and tcp.is_delete=0 and tss.shop_id in
         <foreach collection="list" item="item" separator="," open="(" close=")">
             #{item}
         </foreach>
@@ -618,6 +622,9 @@
         <if test="searchParam.shopId != null">
             and tss.shop_id = #{searchParam.shopId}
         </if>
+        <if test="searchParam.platform != null">
+            and tcp.channel_id = #{searchParam.platform}
+        </if>
 
         <if test="searchParam.categoryId != null">
             and p.category_id = #{searchParam.categoryId}

+ 2 - 0
yami-shop-service/src/main/resources/mapper/SkuMapper.xml

@@ -75,6 +75,7 @@
                  LEFT JOIN tz_channel_prod AS tcp ON ts.sku_id = tcp.sku_id
         WHERE ts.prod_id = #{prodId}
           AND ts.is_delete = 0
+          AND tcp.is_delete = 0
           AND ts.`status` = 1
           AND tss.shop_id = #{shopId}
           AND tcp.channel_id = #{platform}
@@ -110,6 +111,7 @@
                  LEFT JOIN tz_channel_prod AS tcp ON ts.sku_id = tcp.sku_id
         WHERE ts.sku_id = #{skuId}
           AND ts.is_delete = 0
+          AND tcp.is_delete = 0
           AND ts.`status` = 1
           AND tss.shop_id = #{shopId}
           AND tcp.channel_id = #{platform}