Parcourir la source

店铺设置平台价格、比例

zwhui il y a 2 ans
Parent
commit
4e1451bc78

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonSkuMapper.java

@@ -2,6 +2,7 @@ package com.cyksj.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.YhShopGoodsSku;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -13,4 +14,5 @@ import java.util.List;
 public interface GoodsDonSkuMapper  extends BaseMapper<GoodsDonSku> {
 
 	List<Long> selectAIMonthSkuIds(@Param("list") List<Long> goodsIds);
+	List<YhShopGoodsSku> selectSkuShops(@Param("list") List<Long> goodsIds);
 }

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/YhShopGoodsRateMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.YhShopGoodsRate;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 16:45
+ */
+public interface YhShopGoodsRateMapper extends BaseMapper<YhShopGoodsRate> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/shop/YhShopGoodsSkuMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper.shop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.YhShopGoodsSku;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 17:43
+ */
+public interface YhShopGoodsSkuMapper extends BaseMapper<YhShopGoodsSku> {
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/YhShopGoodsRate.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 10:56
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_shop_price")
+public class YhShopGoodsRate extends BaseEntity{
+
+    private Long skuId;
+
+    private Integer rate;
+}

+ 29 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/YhShopGoodsSku.java

@@ -0,0 +1,29 @@
+package com.cyksj.model.entity;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 17:34
+ */
+@Data
+public class YhShopGoodsSku extends BaseEntity{
+    private Long goodsId;
+    private Long skuId;
+
+    /**
+     * 价格
+     */
+    private BigDecimal price;
+    /**
+     * true 上架 / false 下架
+     */
+    private Boolean status;
+    /**
+     * true 存在 / false 删除
+     */
+    private Boolean deleted;
+
+}

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/model/request/GoodsDonShopRateReq.java

@@ -0,0 +1,21 @@
+package com.cyksj.model.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 16:22
+ */
+@Data
+public class GoodsDonShopRateReq {
+    private Integer rate;
+
+    private List<GoodsDonShopRate> list;
+    @Data
+    public static class GoodsDonShopRate{
+        private Long skuId;
+        private Integer rate;
+    }
+}

+ 59 - 0
netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsRateView.java

@@ -0,0 +1,59 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 14:20
+ */
+@Data
+@SearchBean(tables = "goods_don g",
+        where = "g.status = true and g.deleted = true")
+public class YhShopGoodsRateView {
+    @DbField("g.id")
+    private Long id;
+
+    @DbField("g.title")
+    private String title;
+
+    @DbField("g.category")
+    private Integer category;
+
+    @DbIgnore
+    private List<YhShopGoodsSkuRateView> list;
+
+    @Data
+    @SearchBean(tables = "goods_don_sku gs left join yh_shop_goods_rate ysgr on gs.id = ysgr.sku_id",
+            where = "gs.status = true ")
+    public static class YhShopGoodsSkuRateView{
+        @DbField("gs.goods_id")
+        private Long goodsId;
+        @DbField("gs.id")
+        private Long skuId;
+
+        /**
+         * 商品规格 value
+         */
+        @DbField("gs.spec_val")
+        private String specVal;
+
+        @DbField("ysgr.rate")
+        private Integer rate;
+
+        @DbField("gs.price")
+        private BigDecimal price;
+
+        @DbField("IFNULL(CAST((gs.price - gs.price * (ysgr.rate / 100)) as SIGNED),gs.price)")
+        private BigDecimal minPrice;
+
+        @DbField("IFNULL(CAST((gs.price + gs.price * (ysgr.rate / 100)) as SIGNED),gs.price)")
+        private BigDecimal maxPrice;
+
+    }
+}

+ 58 - 0
netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsView.java

@@ -0,0 +1,58 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/9/15 09:42
+ */
+@Data
+@SearchBean(distinct = true,tables = "yh_shop_goods_sku ysgs left join goods_don g on g.id = ysgs.goods_id",
+        where = "g.status = true and g.deleted = true")
+public class YhShopGoodsView {
+    @DbField("g.id")
+    private Long id;
+
+    @DbField("g.title")
+    private String title;
+
+    @DbField("g.category")
+    private Integer category;
+
+    @DbField("ysgs.status")
+    private Boolean status;
+
+    @DbIgnore
+    private List<com.cyksj.model.views.YhShopGoodsView.YhShopGoodsSkuView> list;
+
+    @Data
+    @SearchBean(tables = "goods_don_sku gs left join yh_shop_goods_rate ysgr on gs.id = ysgr.sku_id left join yh_shop_goods_sku ysgs on gs.id = ysgs.sku_id",
+            where = "gs.status = true ")
+    public static class YhShopGoodsSkuView{
+        @DbField("gs.goods_id")
+        private Long goodsId;
+        @DbField("gs.id")
+        private Long skuId;
+
+        /**
+         * 商品规格 value
+         */
+        @DbField("gs.spec_val")
+        private String specVal;
+
+        @DbField("ysgs.price")
+        private BigDecimal shopSkuPrice;
+
+        @DbField("IFNULL(CAST((gs.price - gs.price * (ysgr.rate / 100)) as SIGNED),gs.price)")
+        private BigDecimal minPrice;
+
+        @DbField("IFNULL(CAST((gs.price + gs.price * (ysgr.rate / 100)) as SIGNED),gs.price)")
+        private BigDecimal maxPrice;
+    }
+}

+ 8 - 0
netflix-dao/src/main/resources/mapper/GoodsDonSkuMapper.xml

@@ -9,4 +9,12 @@
         </foreach>
         and `months` = 1
     </select>
+
+    <select id="selectSkuShops" resultType="com.cyksj.model.entity.YhShopGoodsSku">
+        select id as skuId,goods_id from goods_don_sku where goods_id in
+        <foreach collection="list" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        and status = true
+    </select>
 </mapper>

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsYhShopGoodsRateService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.mange;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.YhShopGoodsRate;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 16:48
+ */
+public interface CmsYhShopGoodsRateService extends IService<YhShopGoodsRate> {
+}

+ 7 - 0
netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSpecServiceImpl.java

@@ -10,9 +10,11 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.GoodsDonSpecMapper;
+import com.cyksj.mapper.YhShopGoodsRateMapper;
 import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.GoodsDonSpec;
+import com.cyksj.model.entity.YhShopGoodsRate;
 import com.cyksj.model.manage.request.ReqGoodsSkuInsert;
 import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
 import com.cyksj.model.manage.request.ReqGoodsSpecSingle;
@@ -43,6 +45,8 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 
 	private final GoodsDonSkuMapper goodsDonSkuMapper;
 
+	private final YhShopGoodsRateMapper yhShopGoodsRateMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertOrUpdateSkuSpec(ReqGoodsSkuInsert insert, Boolean isUpdate) throws Exception {
@@ -255,6 +259,9 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 			}
 			goodsDonSkuMapper.insert(goodsDonSku);
 
+			YhShopGoodsRate yhShopGoodsRate = new YhShopGoodsRate();
+			yhShopGoodsRate.setSkuId(goodsDonSku.getId());
+			yhShopGoodsRateMapper.insert(yhShopGoodsRate);
 		}
 	}
 

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsYhShopGoodsRateServiceImpl.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.mange.goods;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.YhShopGoodsRateMapper;
+import com.cyksj.model.entity.YhShopGoodsRate;
+import com.cyksj.service.mange.CmsYhShopGoodsRateService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 16:49
+ */
+@Service
+@RequiredArgsConstructor
+public class CmsYhShopGoodsRateServiceImpl extends ServiceImpl<YhShopGoodsRateMapper, YhShopGoodsRate> implements CmsYhShopGoodsRateService {
+}

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/shop/YhShopGoodsSkuService.java

@@ -0,0 +1,16 @@
+package com.cyksj.service.shop;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.YhShopGoodsSku;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 17:44
+ */
+public interface YhShopGoodsSkuService extends IService<YhShopGoodsSku> {
+    void saveGoods(List<Long> goodsIds);
+
+
+}

+ 27 - 0
netflix-service/src/main/java/com/cyksj/service/shop/impl/YhShopGoodsSkuServiceImpl.java

@@ -0,0 +1,27 @@
+package com.cyksj.service.shop.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
+import com.cyksj.model.entity.YhShopGoodsSku;
+import com.cyksj.service.shop.YhShopGoodsSkuService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 17:44
+ */
+@Service
+@RequiredArgsConstructor
+public class YhShopGoodsSkuServiceImpl extends ServiceImpl<YhShopGoodsSkuMapper, YhShopGoodsSku> implements YhShopGoodsSkuService {
+
+    private final GoodsDonSkuMapper goodsDonSkuMapper;
+    @Override
+    public void saveGoods(List<Long> goodsIds) {
+        List<YhShopGoodsSku> skuShops = goodsDonSkuMapper.selectSkuShops(goodsIds);
+        this.saveOrUpdateBatch(skuShops);
+    }
+}

+ 57 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsYhShopGoodsController.java

@@ -0,0 +1,57 @@
+package com.cyksj.web.controller.manage.goods;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.YhShopGoodsRate;
+import com.cyksj.model.request.GoodsDonShopRateReq;
+import com.cyksj.model.views.YhShopGoodsRateView;
+import com.cyksj.service.mange.CmsYhShopGoodsRateService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 16:42
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/shop")
+public class CmsYhShopGoodsController {
+
+    private final BeanSearcher beanSearcher;
+
+    private final CmsYhShopGoodsRateService yhShopGoodsRateService;
+
+
+    /**
+     * 获取店铺平台价格
+     */
+    @GetMapping("/get/shop/goods")
+    public Result<SearchResult<YhShopGoodsRateView>> shopGoodsList(){
+        SearchResult<YhShopGoodsRateView> search = beanSearcher.search(YhShopGoodsRateView.class, MapUtils.builder().build());
+        search.getDataList().forEach(e -> e.setList(beanSearcher.searchList(YhShopGoodsRateView.YhShopGoodsSkuRateView.class,MapUtils.builder().field(YhShopGoodsRateView.YhShopGoodsSkuRateView::getGoodsId,e.getId()).build())));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
+
+    /**
+     * 设置店铺平台价格浮动比例
+     */
+    @PutMapping("/put/shop/goods/rate")
+    public Result<Void> updShopGoodsRate(@RequestBody GoodsDonShopRateReq req){
+        if (req.getRate() != null){
+            yhShopGoodsRateService.update(Wrappers.lambdaUpdate(YhShopGoodsRate.class).set(YhShopGoodsRate::getRate,req.getRate()));
+        }else {
+            req.getList().forEach(e -> {
+                yhShopGoodsRateService.update(Wrappers.lambdaUpdate(YhShopGoodsRate.class).eq(YhShopGoodsRate::getSkuId,e.getSkuId()).set(YhShopGoodsRate::getRate,e.getRate()));
+            });
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+}

+ 87 - 0
netflix-web/src/main/java/com/cyksj/web/controller/shop/ShopController.java

@@ -0,0 +1,87 @@
+package com.cyksj.web.controller.shop;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.YhShopGoodsSku;
+import com.cyksj.model.views.YhShopGoodsRateView;
+import com.cyksj.model.views.YhShopGoodsView;
+import com.cyksj.service.mange.CmsYhShopGoodsRateService;
+import com.cyksj.service.shop.YhShopGoodsSkuService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/9/14 17:28
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/shop")
+@RequiredArgsConstructor
+public class ShopController {
+
+    private final BeanSearcher beanSearcher;
+
+    private final YhShopGoodsSkuService yhShopGoodsSkuService;
+
+    /**
+     * 新增平台
+     */
+    @PostMapping("/post/goods")
+    public Result<Void> saveGoods(@RequestBody List<Long> goodsIds){
+        yhShopGoodsSkuService.saveGoods(goodsIds);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 设置店铺平台价格
+     */
+    @PutMapping("/put/goods")
+    public Result<Void> updShopGoodsRate(@RequestBody List<YhShopGoodsSku> goodsSkus){
+        goodsSkus.forEach(sku -> {
+            YhShopGoodsRateView.YhShopGoodsSkuRateView yhShopGoodsSkuRateView = beanSearcher.searchFirst(YhShopGoodsRateView.YhShopGoodsSkuRateView.class, MapUtils.builder().field(YhShopGoodsRateView.YhShopGoodsSkuRateView::getSkuId,sku.getSkuId()).build());
+            if (sku.getPrice().compareTo(yhShopGoodsSkuRateView.getMaxPrice()) > 0 || sku.getPrice().compareTo(yhShopGoodsSkuRateView.getMinPrice()) < 0){
+                throw BusinessRuntimeException.getInstance("价格不能超出区间范围");
+            }
+        });
+        yhShopGoodsSkuService.saveOrUpdateBatch(goodsSkus);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 上下架
+     */
+    @PutMapping("/put/goodsStatus/{goodsId}")
+    public Result<Void> updGoodsStatus(@PathVariable Long goodsId,Boolean status){
+        yhShopGoodsSkuService.update(Wrappers.lambdaUpdate(YhShopGoodsSku.class).eq(YhShopGoodsSku::getGoodsId,goodsId).set(YhShopGoodsSku::getStatus,status));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+
+    /**
+     * 删除平台
+     */
+    @PutMapping("/del/goods/{goodsId}")
+    public Result<Void> updGoodsStatus(@PathVariable Long goodsId){
+        yhShopGoodsSkuService.update(Wrappers.lambdaUpdate(YhShopGoodsSku.class).eq(YhShopGoodsSku::getGoodsId,goodsId).set(YhShopGoodsSku::getDeleted,false));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 查询平台
+     */
+    @GetMapping("/get/goods")
+    public Result<SearchResult<YhShopGoodsView>> goodsList(){
+        SearchResult<YhShopGoodsView> search = beanSearcher.search(YhShopGoodsView.class, MapUtils.builder().build());
+        search.getDataList().forEach(e -> e.setList(beanSearcher.searchList(YhShopGoodsView.YhShopGoodsSkuView.class,MapUtils.builder().field(YhShopGoodsView.YhShopGoodsSkuView::getGoodsId,e.getId()).build())));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
+}