Browse Source

新增api端满减满折功能,以及修改门店商品库存逻辑

hyq 5 years ago
parent
commit
c70c770e69
46 changed files with 4469 additions and 617 deletions
  1. 78 43
      kmall-api/src/main/java/com/kmall/api/api/ApiCartController.java
  2. 2 2
      kmall-api/src/main/java/com/kmall/api/api/ApiCatalogController.java
  3. 6 19
      kmall-api/src/main/java/com/kmall/api/api/ApiCouponController.java
  4. 2 15
      kmall-api/src/main/java/com/kmall/api/api/ApiFootprintController.java
  5. 49 270
      kmall-api/src/main/java/com/kmall/api/api/ApiGoodsController.java
  6. 137 0
      kmall-api/src/main/java/com/kmall/api/api/ApiStoreCampMinusController.java
  7. 9 3
      kmall-api/src/main/java/com/kmall/api/api/ApiStoreTicketDiscountController.java
  8. 2 0
      kmall-api/src/main/java/com/kmall/api/dao/ApiGoodsMapper.java
  9. 2 0
      kmall-api/src/main/java/com/kmall/api/dao/ApiOrderMapper.java
  10. 20 0
      kmall-api/src/main/java/com/kmall/api/dao/ApiUserCampMinusMapper.java
  11. 21 0
      kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreCampMinusGoodsMapper.java
  12. 47 0
      kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreCampMinusLevelMapper.java
  13. 21 0
      kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreCampMinusMapper.java
  14. 7 0
      kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreTopicStatMapper.java
  15. 70 0
      kmall-api/src/main/java/com/kmall/api/dto/CampMinusDto.java
  16. 46 0
      kmall-api/src/main/java/com/kmall/api/dto/CheckOutDto.java
  17. 68 0
      kmall-api/src/main/java/com/kmall/api/dto/GoodsDetailDto.java
  18. 33 0
      kmall-api/src/main/java/com/kmall/api/entity/CartVo.java
  19. 33 0
      kmall-api/src/main/java/com/kmall/api/entity/GoodsVo.java
  20. 23 2
      kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java
  21. 257 0
      kmall-api/src/main/java/com/kmall/api/entity/UserCampMinusVo.java
  22. 205 0
      kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreCampMinusGoodsVo.java
  23. 359 0
      kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreCampMinusLevelVo.java
  24. 438 0
      kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreCampMinusVo.java
  25. 1 1
      kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreTicketDiscountVo.java
  26. 260 41
      kmall-api/src/main/java/com/kmall/api/service/ApiCartService.java
  27. 38 0
      kmall-api/src/main/java/com/kmall/api/service/ApiCategoryService.java
  28. 199 1
      kmall-api/src/main/java/com/kmall/api/service/ApiGoodsService.java
  29. 198 138
      kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java
  30. 43 0
      kmall-api/src/main/java/com/kmall/api/service/ApiUserCampMinusService.java
  31. 9 3
      kmall-api/src/main/java/com/kmall/api/service/ApiUserCouponService.java
  32. 123 0
      kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreCampMinusGoodsService.java
  33. 414 0
      kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreCampMinusService.java
  34. 100 0
      kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreTicketDiscountGoodsService.java
  35. 41 8
      kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreTopicStatService.java
  36. 91 0
      kmall-api/src/main/java/com/kmall/api/util/StockUtil.java
  37. 76 39
      kmall-api/src/main/resources/mybatis/mapper/ApiCartMapper.xml
  38. 96 29
      kmall-api/src/main/resources/mybatis/mapper/ApiGoodsMapper.xml
  39. 25 2
      kmall-api/src/main/resources/mybatis/mapper/ApiOrderMapper.xml
  40. 1 1
      kmall-api/src/main/resources/mybatis/mapper/ApiProductStoreRelaDao.xml
  41. 165 0
      kmall-api/src/main/resources/mybatis/mapper/ApiUserCampMinusMapper.xml
  42. 274 0
      kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreCampMinusGoodsMapper.xml
  43. 188 0
      kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreCampMinusLevelMapper.xml
  44. 159 0
      kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreCampMinusMapper.xml
  45. 3 0
      kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreTicketDiscountMapper.xml
  46. 30 0
      kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreTopicStatMapper.xml

+ 78 - 43
kmall-api/src/main/java/com/kmall/api/api/ApiCartController.java

@@ -4,17 +4,16 @@ import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
 import com.kmall.api.annotation.LoginUser;
 import com.kmall.api.dto.CheckOutDto;
-import com.kmall.api.dto.UserCouponDto;
 import com.kmall.api.entity.mk.MkStorePromOrderRealVo;
 import com.kmall.api.entity.mk.MkStorePromVo;
 import com.kmall.api.service.mk.ApiMkStorePromOrderRealService;
 import com.kmall.api.service.mk.ApiMkStorePromService;
 import com.kmall.api.service.mk.ApiMkStoreTicketDiscountService;
+import com.kmall.api.util.StockUtil;
 import com.kmall.common.constant.Dict;
 import com.kmall.api.entity.*;
 import com.kmall.api.service.*;
 import com.kmall.api.util.ApiBaseAction;
-import com.kmall.common.utils.Constant;
 import com.kmall.common.utils.MapUtils;
 import com.qiniu.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,19 +70,6 @@ public class ApiCartController extends ApiBaseAction {
         return resultObj;
     }
 
-    private Map setIsStockShare(Long storeId){
-        Map param = Maps.newHashMap();
-        StoreVo storeVo = apiStoreService.queryObject(storeId);
-        if(storeVo != null) {
-            ThirdMerchantBizVo thirdMerchantBiz = apiThirdMerchantBizService.getThirdMerchangByCode(storeVo.getThirdPartyMerchCode());
-            if (null == thirdMerchantBiz) {
-                return toResponsFail("第三方商户为空");
-            }
-            param.put("isStockShare", thirdMerchantBiz.getIsStockShare());
-        }
-        return param;
-    }
-
     /**
      * 获取购物车中的数据
      */
@@ -95,25 +81,25 @@ public class ApiCartController extends ApiBaseAction {
         //查询列表数据
         Map param = Maps.newHashMap();
         param.put("user_id", loginUser.getId());
-        storeId = getStoreId();
         param.put("store_id", storeId);
         param.put("merchSn", getMerchSn());
         param.put("checkCart", checkCart);
-        param.putAll(setIsStockShare(storeId));
+//        param.putAll(setIsStockShare(storeId));
+        param.put("isStockShare", StockUtil.getIsStockShareByStore(storeId,apiStoreService,apiThirdMerchantBizService));
         List<CartVo> cartList = cartService.queryList(param);
         List<CartVo> validCartList = cartService.queryValidCartList(param);
         List<CartVo> validCartDataList = new ArrayList<>();
         List<CartVo> cartDataList = new ArrayList<>();
-        String isStockShare = MapUtils.getString("isStockShare", param);
         if(checkCart !=null){
             for(CartVo vo : validCartList){
+                String isStockShare = StockUtil.getIsStockShareByCartVo(vo);
                 if(checkCart.equalsIgnoreCase("00")){
-                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase("1")){
+                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase(Dict.isStockShare.item_1.getItem())){
                         if(vo.getGoodsNumber() != null && vo.getGoodsNumber() == 0) {
                             validCartDataList.add(vo);
                         }
                     }
-                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())&& isStockShare.equalsIgnoreCase("0")){
+                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())&& isStockShare.equalsIgnoreCase(Dict.isStockShare.item_0.getItem())){
                         if(vo.getStockNum() == 0) {
                             validCartDataList.add(vo);
                         }
@@ -127,13 +113,15 @@ public class ApiCartController extends ApiBaseAction {
                 }
             }
             for(CartVo vo : cartList){
+                String isStockShare = StockUtil.getIsStockShareByCartVo(vo);
+                vo.setIsStockShare(isStockShare);
                 if(checkCart.equalsIgnoreCase("00")){
-                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase("1")){
+                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase(Dict.isStockShare.item_1.getItem())){
                         if(vo.getGoodsNumber() > 0 ){
                             cartDataList.add(vo);
                         }
                     }
-                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase("0")){
+                    if(vo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase(Dict.isStockShare.item_0.getItem())){
                         if(vo.getStockNum() > 0 ){
                             cartDataList.add(vo);
                         }
@@ -241,7 +229,8 @@ public class ApiCartController extends ApiBaseAction {
         param.put("user_id", loginUser.getId());
         Long storeId = getStoreId();
         param.put("store_id", storeId);
-        param.putAll(setIsStockShare(storeId));
+//        param.putAll(setIsStockShare(storeId));
+        param.put("isStockShare", StockUtil.getIsStockShareByStore(storeId,apiStoreService,apiThirdMerchantBizService));
         param.put("checked", "1");
         List<CartVo> cartList = cartService.queryList(param);
         //获取购物车统计信息
@@ -303,13 +292,9 @@ public class ApiCartController extends ApiBaseAction {
         if (null == productInfo) {
             return toResponsFail("商品已下架");
         }
-        Integer stockNum = 0;
-        ThirdMerchantBizVo thirdMerchantBizVo = apiThirdMerchantBizService.getThirdMerchangByCode(goodsInfo.getThirdPartyMerchCode());
-        if(null == thirdMerchantBizVo){
-            return toResponsFail("商品已下架");
-        }
         //// TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-        if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())
+        Integer stockNum = StockUtil.setStockNumByGoodsVo(goodsInfo);
+        /*if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())
                 || goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())
                 || goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_10.getItem())){
             stockNum = productInfo.getStock_num();
@@ -321,7 +306,7 @@ public class ApiCartController extends ApiBaseAction {
             if (thirdMerchantBizVo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())){
                 stockNum = productInfo.getStock_num();
             }
-        }
+        }*/
         if(stockNum == null || number > stockNum || stockNum <= 0){
             return toResponsFail("该商品库存不足");
         }
@@ -329,6 +314,7 @@ public class ApiCartController extends ApiBaseAction {
             productInfo.setRetail_price(goodsInfo.getRetail_price());
             productInfo.setMarket_price(goodsInfo.getMarket_price());
         }
+        String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
         //判断购物车中是否存在此规格商品
         Map cartParam = Maps.newHashMap();
         cartParam.put("goods_id", goodsId);
@@ -336,7 +322,7 @@ public class ApiCartController extends ApiBaseAction {
         cartParam.put("user_id", loginUser.getId());
         cartParam.put("store_id", storeId);
         cartParam.put("goodsBizType", goodsInfo.getGoodsBizType());
-        cartParam.put("isStockShare", thirdMerchantBizVo.getIsStockShare());
+        cartParam.put("isStockShare", isStockShare);
         List<CartVo> cartInfoList = cartService.queryList(cartParam);
         CartVo cartInfo = null != cartInfoList && cartInfoList.size() > 0 ? cartInfoList.get(0) : null;
         if (null == cartInfo) {//添加规格名和值
@@ -432,7 +418,8 @@ public class ApiCartController extends ApiBaseAction {
                 return toResponsFail("商品已下架");
             }
             // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-            if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())
+            stockNum = StockUtil.setStockNumByGoodsVo(goodsInfo);
+            /*if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())
                     || goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())
                     || goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_10.getItem())){
                 stockNum = productInfo.getStock_num();
@@ -444,7 +431,7 @@ public class ApiCartController extends ApiBaseAction {
                 if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
                     stockNum = productInfo.getStock_num();
                 }
-            }
+            }*/
             if(stockNum == null || goodsVo.getNumber() > stockNum || stockNum <= 0){
                 return toResponsFail("该商品库存不足");
             }
@@ -467,6 +454,7 @@ public class ApiCartController extends ApiBaseAction {
             cartInfo.setMerchSn(goodsVo.getMerchSn());
             cartInfo.setSku(goodsVo.getSku());
 
+            String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
             Map map = Maps.newHashMap();
             map.put("user_id", getUserId());
             map.put("store_id", getStoreId());
@@ -474,7 +462,7 @@ public class ApiCartController extends ApiBaseAction {
             map.put("product_id",goodsVo.getProduct_id());
             map.put("number",goodsVo.getNumber());
             map.put("goodsBizType", goodsInfo.getGoodsBizType());
-            map.put("isStockShare", goodsInfo.getIsStockShare());
+            map.put("isStockShare", isStockShare);
             List<CartVo> list= cartService.queryList(map);
             if(list != null && list.size() > 0){
                 for (CartVo vo:list) {
@@ -514,6 +502,7 @@ public class ApiCartController extends ApiBaseAction {
         if (thirdMerchantBiz.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())){
             stockNum = productInfo.getStock_num();
         }*/
+        String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
         //判断购物车中是否存在此规格商品
         Map cartParam = Maps.newHashMap();
         cartParam.put("goods_id", goodsId);
@@ -522,7 +511,7 @@ public class ApiCartController extends ApiBaseAction {
         cartParam.put("store_id", storeId);
         cartParam.put("user_id", loginUser.getId());
         cartParam.put("goodsBizType", goodsInfo.getGoodsBizType());
-        cartParam.put("isStockShare", thirdMerchantBiz.getIsStockShare());
+        cartParam.put("isStockShare", isStockShare);
         List<CartVo> cartInfoList = cartService.queryList(cartParam);
         CartVo cartInfo = null != cartInfoList && cartInfoList.size() > 0 ? cartInfoList.get(0) : null;
         int cart_num = 0;
@@ -552,7 +541,6 @@ public class ApiCartController extends ApiBaseAction {
         Integer id = jsonParam.getInteger("id");
         String checkCart = jsonParam.getString("checkCart");
         boolean isAdd = true;
-        Integer stockNum = 0;
         GoodsVo goodsInfo = goodsService.queryObjectByStoreId(Long.valueOf(goodsId), storeId);
         if (null == goodsInfo || goodsInfo.getIs_delete() == 1 || goodsInfo.getIs_on_sale() == 0) {
             return toResponsFail("商品已下架");
@@ -567,7 +555,8 @@ public class ApiCartController extends ApiBaseAction {
             return toResponsFail("商品已下架");
         }
         // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-        if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())
+        Integer stockNum = StockUtil.setStockNumByGoodsVo(goodsInfo);
+        /*if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())
                 || goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())
                 || goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_10.getItem())){
             stockNum = productInfo.getStock_num();//门店库存
@@ -579,7 +568,7 @@ public class ApiCartController extends ApiBaseAction {
             if (thirdMerchantBiz.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())){
                 stockNum = productInfo.getStock_num();
             }
-        }
+        }*/
         if(stockNum == null || number > stockNum || stockNum <= 0){
             return this.toResponsObject(400, "该商品库存不足", getCart(checkCart,storeId));
         }
@@ -599,12 +588,13 @@ public class ApiCartController extends ApiBaseAction {
             return toResponsObject(0, msg, getCart(checkCart,storeId));
         }
 
+        String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
         Map cartParam = Maps.newHashMap();
         cartParam.put("goodsId", goodsId);
         cartParam.put("productId", productId);
         cartParam.put("store_id", storeId);
         cartParam.put("goodsBizType", goodsInfo.getGoodsBizType());
-        cartParam.put("isStockShare", thirdMerchantBiz.getIsStockShare());
+        cartParam.put("isStockShare", isStockShare);
         List<CartVo> cartInfoList = cartService.queryList(cartParam);
         CartVo newcartInfo = null != cartInfoList && cartInfoList.size() > 0 ? cartInfoList.get(0) : null;
         if (null == newcartInfo) {
@@ -684,7 +674,6 @@ public class ApiCartController extends ApiBaseAction {
         Map param = Maps.newHashMap();
         param.put("user_id", loginUser.getId());
         param.put("store_id", storeId);
-        param.putAll(setIsStockShare(storeId));
         //获取购物车统计信息
         Integer goodsCount = cartService.queryCartNumByStoreId(param);
         //
@@ -696,10 +685,11 @@ public class ApiCartController extends ApiBaseAction {
     }
 
     /**
-     * 订单提交前的检验和填写相关订单信息
+     * 订单提交前的检验和填写相关订单信息,微信审核后删除
      */
     @GetMapping("checkout")
-    public Object checkout(@LoginUser UserVo loginUser, String merchSn, String checkCart, Long tickDiscId00, Long tickDiscId02, Long tickDiscId10, Long tickDiscId11) {
+    public Object checkout(@LoginUser UserVo loginUser, String merchSn, String checkCart, Long tickDiscId00, Long tickDiscId02, Long tickDiscId10, Long tickDiscId11,
+                           Integer campId00, Integer campId02, Integer campId10, Integer campId11, Integer isLoadStatus) {
         //获取要购买的商品
         Map<String, Object> cartData = (Map<String, Object>)this.getCartMoney(loginUser,checkCart);
         CheckOutDto checkOutDto = new CheckOutDto();
@@ -709,8 +699,13 @@ public class ApiCartController extends ApiBaseAction {
         checkOutDto.setTickDiscId02(tickDiscId02);
         checkOutDto.setTickDiscId10(tickDiscId10);
         checkOutDto.setTickDiscId11(tickDiscId11);
+        checkOutDto.setCampId00(campId00);
+        checkOutDto.setCampId02(campId02);
+        checkOutDto.setCampId10(campId10);
+        checkOutDto.setCampId11(campId11);
         checkOutDto.setStoreId(getStoreId());
         checkOutDto.setCartData(cartData);
+        checkOutDto.setIsLoadStatus(isLoadStatus);
 
         Map<String, Object> resultObj = cartService.getCheckOut(checkOutDto);
 
@@ -739,6 +734,45 @@ public class ApiCartController extends ApiBaseAction {
     }
 
     /**
+     * 订单提交前的检验和填写相关订单信息
+     */
+    @PostMapping("checkouts")
+    public Object checkout(@LoginUser UserVo loginUser) {
+        JSONObject jsonParam = getJsonRequest();
+
+        CheckOutDto checkOutDto = JSONObject.parseObject(jsonParam.toString(), CheckOutDto.class);
+        //获取要购买的商品
+        Map<String, Object> cartData = (Map<String, Object>)this.getCartMoney(loginUser,checkOutDto.getCheckCart());
+        checkOutDto.setLoginUser(loginUser);
+        checkOutDto.setStoreId(getStoreId());
+        checkOutDto.setCartData(cartData);
+
+        Map<String, Object> resultObj = cartService.getCheckOut(checkOutDto);
+
+        //选择的收货地址
+        Map param = Maps.newHashMap();
+        param.put("is_default", 1);
+        param.put("user_id", loginUser.getId());
+        List<AddressVo> addressEntityList = addressService.queryList(param);
+        if (null != addressEntityList && addressEntityList.size() > 0) {
+            resultObj.put("addressVo", addressEntityList.get(0));
+        } else { // 没有默认地址,选择一个
+            param = Maps.newHashMap();
+            param.put("user_id", loginUser.getId());
+            addressEntityList = addressService.queryList(param);
+            if (null != addressEntityList && addressEntityList.size() > 0) {
+                resultObj.put("addressVo", addressEntityList.get(0));
+            }
+        }
+        UserVo userVo = apiUserService.queryObject(loginUser.getId());
+        if(userVo != null){
+            resultObj.put("idNo", userVo.getIdNo());
+            resultObj.put("userName", userVo.getUsername());
+        }
+
+        return toResponsSuccess(resultObj);
+    }
+    /**
      * 选择优惠券列表,暂时无用
      */
     @GetMapping("checkedCouponList")
@@ -748,7 +782,8 @@ public class ApiCartController extends ApiBaseAction {
         param.put("user_id", loginUser.getId());
         Long storeId = getStoreId();
         param.put("store_id", storeId);
-        param.putAll(setIsStockShare(storeId));
+//        param.putAll(setIsStockShare(storeId));
+        param.put("isStockShare",StockUtil.getIsStockShareByStore(storeId,apiStoreService,apiThirdMerchantBizService));
         List<CartVo> cartList = cartService.queryList(param);
         //获取购物车统计信息
         BigDecimal checkedGoodsAmount = new BigDecimal(0.00);

+ 2 - 2
kmall-api/src/main/java/com/kmall/api/api/ApiCatalogController.java

@@ -37,7 +37,7 @@ public class ApiCatalogController extends ApiBaseAction {
      */
     @IgnoreAuth
     @GetMapping("index")
-    public Object index(@LoginUser UserVo loginUser, Integer id,
+    public Object index(@LoginUser UserVo loginUser, Integer id, Integer storeId,
                         @RequestParam(value = "page", defaultValue = "1") Integer page,
                         @RequestParam(value = "size", defaultValue = "10") Integer size) {
         Map<String, Object> resultObj = Maps.newHashMap();
@@ -47,7 +47,7 @@ public class ApiCatalogController extends ApiBaseAction {
         params.put("sidx", "sort_order");
         params.put("order", "asc");
         params.put("parent_id", 0);
-        params.put("store_id", getStoreId());
+        params.put("store_id", storeId);
         //查询列表数据
         List<CategoryVo> data = categoryService.queryList(params);
         //

+ 6 - 19
kmall-api/src/main/java/com/kmall/api/api/ApiCouponController.java

@@ -130,27 +130,14 @@ public class ApiCouponController extends ApiBaseAction {
             //已过期
             if(discStatus == 2) {
                 discountEntity.setInValidTime(setInvalidTime(discountEntity));
-                if (discountEntity.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_00.getItem())) {
-                    if (DateUtils.compareDate(discountEntity.getFixEndTime(), new Date())) {//结束时间超过当前时间则过期
-                        discountEntity.setIsReceive(1);
-                        discountVoList.add(discountEntity);
-                    }
-                }
-                if (discountEntity.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_01.getItem())) {
-                    String postponeNum = com.kmall.common.utils.StringUtils.isNotEmpty(discountEntity.getPostponeNum()) ? discountEntity.getPostponeNum() : "0";
-                    String validDayNum = com.kmall.common.utils.StringUtils.isNotEmpty(discountEntity.getValidDayNum()) ? discountEntity.getValidDayNum() : "0";
-                    Integer day = Integer.parseInt(postponeNum) + Integer.parseInt(validDayNum);
-                    Date endDate = DateUtils.addDay(discountEntity.getAddTime(), day);
-                    if (DateUtils.compareDate(endDate, new Date())) {//结束时间超过当前时间则过期
-                        discountEntity.setIsReceive(1);
-                        discountVoList.add(discountEntity);
-                    }
-                }
+                discountEntity.setInValidTime(setInvalidTime(discountEntity));
+                discountEntity.setIsReceive(1);//优惠券是否可操作 1:不可操作 0:可操作
+                discountVoList.add(discountEntity);
             }else{
                 if(discStatus == 0) {
                     if (discountEntity.getEffectTimeType().equalsIgnoreCase(Dict.effectTimeType.item_00.getItem())) {
                         if (!DateUtils.compareDate(discountEntity.getFixEndTime(), new Date())) {//有效
-                            discountEntity.setIsReceive(0);
+                            discountEntity.setIsReceive(0);//优惠券是否可操作 1:不可操作 0:可操作
                             discountEntity.setInValidTime(setInvalidTime(discountEntity));
                             discountVoList.add(discountEntity);
                         }
@@ -163,10 +150,10 @@ public class ApiCouponController extends ApiBaseAction {
                         Date validTime = discountEntity.getValidTime();//生效时间,如生效时间>当前时间则优惠券才可用
                         if (!DateUtils.compareDate(endDate, new Date())) {//结束时间超过当前时间则过期
                             if(validTime.getTime() > new Date().getTime()){
-                                discountEntity.setIsReceive(2);
+                                discountEntity.setIsReceive(2);//优惠券是否可操作 1:不可操作 0:可操作 2:暂不可用
                                 discountEntity.setInValidTime(DateUtils.format(validTime,DateUtils.DATE_TIME_PATTERN)+"生效");
                             }else{
-                                discountEntity.setIsReceive(0);
+                                discountEntity.setIsReceive(0);//优惠券是否可操作 1:不可操作 0:可操作
                                 discountEntity.setInValidTime(setInvalidTime(discountEntity));
                             }
                             discountVoList.add(discountEntity);

+ 2 - 15
kmall-api/src/main/java/com/kmall/api/api/ApiFootprintController.java

@@ -3,14 +3,13 @@ package com.kmall.api.api;
 import com.google.common.collect.Maps;
 import com.kmall.api.annotation.LoginUser;
 import com.kmall.api.entity.FootprintVo;
-import com.kmall.api.entity.StoreVo;
-import com.kmall.api.entity.ThirdMerchantBizVo;
 import com.kmall.api.entity.UserVo;
 import com.kmall.api.service.ApiFootprintService;
 import com.kmall.api.service.ApiStoreService;
 import com.kmall.api.service.ApiThirdMerchantBizService;
 import com.kmall.api.util.ApiBaseAction;
 import com.kmall.api.util.ApiPageUtils;
+import com.kmall.api.util.StockUtil;
 import com.kmall.common.utils.DateUtils;
 import com.kmall.common.utils.Query;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -111,18 +110,6 @@ public class ApiFootprintController extends ApiBaseAction {
         return this.toResponsSuccess(resultObj);
     }
 
-    private Map setIsStockShare(Long storeId){
-        Map param = Maps.newHashMap();
-        StoreVo storeVo = apiStoreService.queryObject(storeId);
-        if(storeVo != null) {
-            ThirdMerchantBizVo thirdMerchantBiz = apiThirdMerchantBizService.getThirdMerchangByCode(storeVo.getThirdPartyMerchCode());
-            if (null == thirdMerchantBiz) {
-                return toResponsFail("第三方商户为空");
-            }
-            param.put("isStockShare", thirdMerchantBiz.getIsStockShare());
-        }
-        return param;
-    }
     /**
      * 猜你喜欢
      */
@@ -143,7 +130,7 @@ public class ApiFootprintController extends ApiBaseAction {
         params.put("checkCart", checkCart);
         params.put("page", page);
         params.put("limit", size);
-        params.putAll(setIsStockShare(Long.valueOf(storeId)));
+        params.put("isStockShare", StockUtil.getIsStockShareByStore(Long.valueOf(storeId),apiStoreService,apiThirdMerchantBizService));
         Query query = new Query(params);
         List<FootprintVo> footprintVos = footprintService.queryList(query);
         List<FootprintVo> list = new ArrayList();

+ 49 - 270
kmall-api/src/main/java/com/kmall/api/api/ApiGoodsController.java

@@ -4,24 +4,21 @@ import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
 import com.kmall.api.annotation.IgnoreAuth;
 import com.kmall.api.annotation.LoginUser;
+import com.kmall.api.dto.GoodsDetailDto;
 import com.kmall.api.entity.*;
 import com.kmall.api.entity.mk.MkStorePromStatVo;
-import com.kmall.api.entity.mk.MkStorePromVisitorsVo;
 import com.kmall.api.entity.mk.MkStorePromVo;
-import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
 import com.kmall.api.service.*;
 import com.kmall.api.service.mk.*;
 import com.kmall.api.util.ApiBaseAction;
 import com.kmall.api.util.ApiPageUtils;
+import com.kmall.api.util.StockUtil;
 import com.kmall.common.constant.Dict;
-import com.kmall.common.utils.DateUtils;
 import com.kmall.common.utils.Query;
-import com.kmall.common.utils.enums.CouponTypeEnum;
 import com.qiniu.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.math.BigDecimal;
 import java.util.*;
 
 /**
@@ -41,38 +38,17 @@ public class ApiGoodsController extends ApiBaseAction {
     @Autowired
     private ApiGoodsGalleryService goodsGalleryService;
     @Autowired
-    private ApiGoodsIssueService goodsIssueService;
-    @Autowired
-    private ApiAttributeService attributeService;
-    @Autowired
-    private ApiCommentService commentService;
-    @Autowired
-    private ApiUserService userService;
-    @Autowired
-    private ApiCommentPictureService commentPictureService;
-    @Autowired
-    private ApiCollectService collectService;
-    @Autowired
-    private ApiFootprintService footprintService;
-    @Autowired
     private ApiCategoryService categoryService;
     @Autowired
     private ApiSearchHistoryService searchHistoryService;
     @Autowired
     private ApiRelatedGoodsService relatedGoodsService;
     @Autowired
-    private ApiCouponService apiCouponService;
-    @Autowired
-    private ApiUserCouponService apiUserCouponService;
-    @Autowired
     private ApiCartService cartService;
     @Autowired
     private ApiAdService apiAdService;
     @Autowired
     private ApiBrandService apiBrandService;
-
-    @Autowired
-    private ApiFreightService apiFreightService;
     @Autowired
     private ApiThirdMerchantBizService apiThirdMerchantBizService;
     @Autowired
@@ -82,11 +58,9 @@ public class ApiGoodsController extends ApiBaseAction {
     @Autowired
     private ApiMkStorePromService apiMkStorePromService;
     @Autowired
-    private ApiMkStorePromVisitorsService apiMkStorePromVisitorsService;
-    @Autowired
     private ApiMkStoreTicketDiscountGoodsService apiMkStoreTicketDiscountGoodsService;
     @Autowired
-    private ApiMkStoreTicketDiscountService apiMkStoreTicketDiscountService;
+    private ApiMkStoreCampMinusGoodsService apiMkStoreCampMinusGoodsService;
 
     /**
      */
@@ -123,6 +97,10 @@ public class ApiGoodsController extends ApiBaseAction {
         }else{
             resultObj.put("cartNumber", cartVo.getNumber());
         }
+        if(goodsVo != null){
+            Integer stockNum = StockUtil.setStockNumByGoodsVo(goodsVo);
+            resultObj.put("stockNum", stockNum);
+        }
         resultObj.put("goodsVo", goodsVo);
         resultObj.put("specificationList", goodsSpecificationEntityList);
         resultObj.put("productList", productEntityList);
@@ -145,156 +123,20 @@ public class ApiGoodsController extends ApiBaseAction {
      * */
     @GetMapping("details")
     public Object details(Long id, Long referrer,String merchSn,Long storeId,Integer promId) {
-        Map<String, Object> resultObj = Maps.newHashMap();
         //用户信息
         Long userId = getUserId();
         GoodsVo info = goodsService.queryObjectByStoreId(id, storeId);
         if(info == null){
             return toResponsFail("此商品不存在");
         }
-        BrandVo brand = apiBrandService.queryObject(info.getBrand_id());
-        resultObj.put("brand", brand);
-
-        Map param = Maps.newHashMap();
-        param.put("goods_id", id);
-        param.put("store_id", storeId);
-        List<Map> specificationList = goodsSpecificationService.queryByGoodsIdGroupByNames(id);
-        //查询产品信息
-        List<ProductVo> productEntityList = productService.queryList(param);
-        //团购
-        List<GoodsGalleryVo> gallery = goodsGalleryService.queryList(param);
-        resultObj.put("gallery", gallery);
-
-        Map ngaParam = Maps.newHashMap();
-        ngaParam.put("fields", "nga.value, na.name");
-        ngaParam.put("sidx", "nga.id");
-        ngaParam.put("order", "asc");
-        ngaParam.put("goods_id", id);
-        List<AttributeVo> attribute = attributeService.queryList(ngaParam);
-        //商品问答
-        Map issueParam = Maps.newHashMap();
-        issueParam.put("merch_sn", merchSn);
-        List<GoodsIssueVo> issue = goodsIssueService.queryList(issueParam);
-        //商品评论
-        param.put("value_id", id);
-        param.put("type_id", 0);
-        Integer commentCount = commentService.queryTotal(param);
-        List<CommentVo> hotComment = commentService.queryList(param);
-        Map commentInfo = Maps.newHashMap();
-        if (null != hotComment && hotComment.size() > 0) {
-            UserVo commentUser = userService.queryObject(hotComment.get(0).getUserId());
-            commentInfo.put("content", hotComment.get(0).getContent());
-            commentInfo.put("add_time", DateUtils.timeToStr(hotComment.get(0).getAddTime(), DateUtils.PATTERN_YYYY_MM_DD_HH_MM));
-            commentInfo.put("nickname", commentUser.getNickname());
-            commentInfo.put("avatar", commentUser.getAvatar());
-            Map paramPicture = Maps.newHashMap();
-            paramPicture.put("comment_id", hotComment.get(0).getId());
-            List<CommentPictureVo> commentPictureEntities = commentPictureService.queryList(paramPicture);
-            commentInfo.put("pic_list", commentPictureEntities);
-        }
-        Map comment = Maps.newHashMap();
-        comment.put("count", commentCount);
-        comment.put("data", commentInfo);
-        //当前用户是否收藏
-        Map collectParam = Maps.newHashMap();
-        collectParam.put("user_id", getUserId());
-        collectParam.put("value_id", id);
-        collectParam.put("type_id", 0);
-        Integer userHasCollect = collectService.queryTotal(collectParam);
-        if (userHasCollect > 0) {
-            userHasCollect = 1;
-        }
-        //记录用户的足迹
-        FootprintVo footprintEntity = new FootprintVo();
-        footprintEntity.setAdd_time(System.currentTimeMillis() / 1000);
-        footprintEntity.setGoods_brief(info.getGoods_brief());
-        footprintEntity.setList_pic_url(info.getList_pic_url());
-        footprintEntity.setGoods_id(info.getId());
-        footprintEntity.setName(info.getName());
-        footprintEntity.setRetail_price(info.getRetail_price());
-        footprintEntity.setUser_id(userId);
-        if (null != referrer) {
-            footprintEntity.setReferrer(referrer);
-        } else {
-            footprintEntity.setReferrer(0L);
-        }
-        footprintService.save(footprintEntity);
-
-        Map cartMap= Maps.newHashMap();
-        cartMap.put("user_id",userId);
-        cartMap.put("goods_id",info.getId());
-        cartMap.put("store_id", storeId);
-        cartMap.put("isStockShare", info.getIsStockShare());
-        cartMap.put("goodsBizType", info.getGoodsBizType());
-        List<CartVo> cartVoList = cartService.queryList(cartMap);
-
-        FreightEntity freightEntity = apiFreightService.queryObjectByGoodsId(info.getId(), storeId);
-
-        Integer stockNum = 0;
-        if(info.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
-            if (info.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
-                stockNum = info.getGoods_number();
-//                info.setSell_volume(info.getGoods_sell_volume());
-            }
-            if (info.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
-                stockNum = info.getStockNum();
-            }
-        }else {
-            stockNum = info.getStockNum();
-        }
-        if(com.kmall.common.utils.StringUtils.isNotEmpty(String.valueOf(promId))){
-            MkStorePromVo mkStorePromVo = apiMkStorePromService.queryObject(promId);
-            MkStorePromStatVo mkStorePromStatVo = new MkStorePromStatVo();
-            if(mkStorePromVo != null) {
-                //记录渠道推广浏览量
-                MkStorePromStatVo statVo = apiMkStorePromStatService.queryObjectByPromId(mkStorePromVo.getPromId());
-                //记录推广访客数据
-                MkStorePromVisitorsVo visitorsVo = apiMkStorePromVisitorsService.queryObjectByPromIdAndUserId(promId ,
-                        Integer.parseInt(String.valueOf(userId)));
-                if(visitorsVo == null){
-                    MkStorePromVisitorsVo promVisitorsVo = new MkStorePromVisitorsVo();
-                    promVisitorsVo.setPromId(promId);
-                    promVisitorsVo.setUserId(Integer.parseInt(String.valueOf(userId)));
-                    promVisitorsVo.setIsValid("0");
-                    promVisitorsVo.setCreateTime(new Date());
-                    promVisitorsVo.setModTime(new Date());
-                    apiMkStorePromVisitorsService.save(promVisitorsVo);
-                }
-                Integer visitNum = apiMkStorePromVisitorsService.queryCountByPromId(mkStorePromVo.getPromId());
-                mkStorePromStatVo.setReferrer(Integer.parseInt(String.valueOf(referrer)));
-                mkStorePromStatVo.setVisitPageDeep(1);
-                if(statVo != null){
-                    mkStorePromStatVo.setBrowseNum(statVo.getBrowseNum()+1);
-                    mkStorePromStatVo.setVisitNum(visitNum);
-                    mkStorePromStatVo.setRelaBrowseNum(statVo.getRelaBrowseNum()+1);//连带浏览量
-                    mkStorePromStatVo.setRelaVisitorNum(visitNum);//连带访客量
-                    mkStorePromStatVo.setTransVisitorNum(visitNum);//转发访客量:用户转发了带有推广id的商品,其他的用户点击的访客量
-                    mkStorePromStatVo.setPromStatId(statVo.getPromStatId());
-                    apiMkStorePromStatService.update(mkStorePromStatVo);
-                }else {
-                    mkStorePromStatVo.setStoreId(Integer.parseInt(String.valueOf(storeId)));
-                    mkStorePromStatVo.setPromId(mkStorePromVo.getPromId());
-                    mkStorePromStatVo.setBrowseNum(1);
-                    mkStorePromStatVo.setVisitNum(visitNum);
-                    mkStorePromStatVo.setRelaBrowseNum(1);//连带浏览量
-                    mkStorePromStatVo.setRelaVisitorNum(visitNum);//连带访客量
-                    mkStorePromStatVo.setTransVisitorNum(visitNum);//转发访客量:用户转发了带有推广id的商品,其他的用户点击的访客量
-                    mkStorePromStatVo.setIsValid("0");
-                    apiMkStorePromStatService.save(mkStorePromStatVo);
-                }
-            }
-        }
-        resultObj.put("info", info);
-
-        resultObj.put("attribute", attribute);
-        resultObj.put("userHasCollect", userHasCollect);
-        resultObj.put("issue", issue);
-        resultObj.put("comment", comment);
-        resultObj.put("specificationList", specificationList);
-        resultObj.put("productList", productEntityList);
-        resultObj.put("stockNum", stockNum);
-        resultObj.put("cartNumber", cartVoList.size() != 0 ? cartVoList.get(0).getNumber():0);
-        resultObj.put("defaultFreight", freightEntity != null? freightEntity.getDefaultFreight() :0);
+        GoodsDetailDto detailDto = new GoodsDetailDto();
+        detailDto.setId(id);
+        detailDto.setMerchSn(merchSn);
+        detailDto.setPromId(promId);
+        detailDto.setReferrer(referrer);
+        detailDto.setStoreId(storeId);
+        detailDto.setUserId(userId);
+        Map<String, Object> resultObj = goodsService.detail(info, detailDto);
 
         return toResponsSuccess(resultObj);
     }
@@ -522,7 +364,7 @@ public class ApiGoodsController extends ApiBaseAction {
 
         List<GoodsVo> goodsEntityList = goodsService.queryList(params);
         params.remove("fields");
-        getFilterCategory(goodsEntityList, filterCategory);
+        filterCategory.addAll(categoryService.getFilterCategory(goodsEntityList, filterCategory));
 
         params.put("category_parent_id", categoryId);
         params.put("fields", "a.id,a.name,a.goods_brief,a.list_pic_url,psr1.retail_price," +
@@ -721,7 +563,7 @@ public class ApiGoodsController extends ApiBaseAction {
         //查询列表数据
         Query query = new Query(params);
         List<GoodsVo> goodsList = goodsService.queryCatalogProductList(query);
-        int total = goodsService.queryTotal(query);
+        int total = goodsService.selectCountByCatalogProductList(query);
         if (null != goodsList && goodsList.size() > 0) {
             for (GoodsVo goodsVo : goodsList) {
                 goodsVo.setCart_num(goodsVo.getCart_num()==null?0:goodsVo.getCart_num());
@@ -764,110 +606,47 @@ public class ApiGoodsController extends ApiBaseAction {
         return toResponsSuccess("");
     }
 
+    /**
+     * 门店优惠券商品列表
+     * @param loginUser
+     * @param storeId
+     * @param categoryId
+     * @param tickDiscId
+     * @param page
+     * @param size
+     * @param sort
+     * @param order
+     * @return
+     */
     @GetMapping("getStoreTicketDiscountGoodsList")
     public Object getStoreTicketDiscountGoodsList(@LoginUser UserVo loginUser, Integer storeId, Integer categoryId,Integer tickDiscId,
                                                   @RequestParam(value = "page", defaultValue = "1") Integer
                                                           page, @RequestParam(value = "size", defaultValue = "10") Integer size,
                                                   String sort, String order) {
-        MkStoreTicketDiscountVo discountVo = apiMkStoreTicketDiscountService.queryObject(tickDiscId);
-        if(discountVo == null){
-            return toResponsFail("优惠券信息不存在");
-        }
-        Map reusltObj = Maps.newHashMap();
-        if(storeId == null){
-            return toResponsFail("门店id不能为空");
-        }
-        StoreVo storeVo = apiStoreService.queryObject(Long.valueOf(storeId));
-        ThirdMerchantBizVo thirdMerchantBiz = new ThirdMerchantBizVo();
-        if(storeVo != null) {
-            thirdMerchantBiz = apiThirdMerchantBizService.getThirdMerchangByCode(storeVo.getThirdPartyMerchCode());
-            if (null == thirdMerchantBiz) {
-                return toResponsFail("第三方商户为空");
-            }
-        }
-
-        Map params = Maps.newHashMap();
-        //筛选的分类
-        List<CategoryVo> filterCategory = new ArrayList();
-        CategoryVo rootCategory = new CategoryVo();
-        rootCategory.setId(0);
-        rootCategory.setName("全部");
-        rootCategory.setChecked(false);
-        filterCategory.add(rootCategory);
-        //
-        params.put("fields", "psr1.category_id");
-        params.put("store_id", storeId);
-        params.put("tickDiscId",tickDiscId);
-        params.put("applyType", discountVo.getApplyType());
-        params.put("goodsBizType", discountVo.getGoodsBizType());
-
-        List<GoodsVo> goodsEntityList = goodsService.queryList(params);
-        params.remove("fields");
-        getFilterCategory(goodsEntityList, filterCategory);
-
-        params.put("category_parent_id", categoryId);
-        params.put("fields", "a.id,a.name,a.goods_brief,a.list_pic_url,psr1.retail_price," +
-                "psr1.market_price,b.id as product_id,psr1.stock_num");
-        params.put("is_hot", "1");
-        params.put("is_delete", 0);
-        params.put("store_id", storeId);
-        if (!StringUtils.isNullOrEmpty(sort) && !StringUtils.isNullOrEmpty(order)) {
-            if (sort.equals("price")) {
-                params.put("sidx", "psr1.retail_price");
-                params.put("order", order);
-            }
-        }
-
-        reusltObj.put("filterCategory", filterCategory);
-        params.put("isStockShare", thirdMerchantBiz.getIsStockShare());
-
-        params.put("page", page);
-        params.put("limit", size);
-        Query query = new Query(params);
-        List<GoodsVo> mkStoreTicketDiscountList = apiMkStoreTicketDiscountGoodsService.queryDiscountGoodsList(query);
-        Integer goodsCount = apiMkStoreTicketDiscountGoodsService.queryDiscountGoodsTotal(query);
-        if (null != mkStoreTicketDiscountList && mkStoreTicketDiscountList.size() > 0) {
-            for (GoodsVo goodsVo : mkStoreTicketDiscountList) {
-                goodsVo.setCart_num(goodsVo.getCart_num()==null?0:goodsVo.getCart_num());
-            }
-        }
-        reusltObj.put("goodsList", mkStoreTicketDiscountList);
-        reusltObj.put("goodsCount", goodsCount);
+        Map reusltObj = apiMkStoreTicketDiscountGoodsService.getStoreTicketDiscountGoodsList(storeId,categoryId,tickDiscId,page,size,sort,order);
         return toResponsSuccess(reusltObj);
     }
 
-    private List<CategoryVo> getFilterCategory(List<GoodsVo> goodsEntityList,List<CategoryVo> filterCategory){
 
-        if (null != goodsEntityList && goodsEntityList.size() > 0) {
-            List<Integer> categoryIds = new ArrayList();
-            for (GoodsVo goodsVo : goodsEntityList) {
-                if (null == goodsVo || null == goodsVo.getCategory_id()) {
-                    continue;
-                }
-                categoryIds.add(goodsVo.getCategory_id());
-            }
-            //查找二级分类的parent_id
-            Map categoryParam = Maps.newHashMap();
-            categoryParam.put("ids", categoryIds);
-            categoryParam.put("fields", "parent_id");
-            List<CategoryVo> parentCategoryList = categoryService.queryList(categoryParam);
-            //
-            List<Integer> parentIds = new ArrayList();
-            for (CategoryVo categoryEntity : parentCategoryList) {
-                parentIds.add(categoryEntity.getParent_id());
-            }
-            //一级分类
-            categoryParam = Maps.newHashMap();
-            categoryParam.put("fields", "id,name");
-            categoryParam.put("order", "asc");
-            categoryParam.put("sidx", "sort_order");
-            categoryParam.put("ids", parentIds);
-            List<CategoryVo> parentCategory = categoryService.queryList(categoryParam);
-            if (null != parentCategory) {
-                filterCategory.addAll(parentCategory);
-            }
-        }
-        return filterCategory;
+    /**
+     * 门店满减满折商品列表
+     * @param loginUser
+     * @param storeId
+     * @param categoryId
+     * @param campMinusId
+     * @param page
+     * @param size
+     * @param sort
+     * @param order
+     * @return
+     */
+    @GetMapping("getStoreCampMinusGoodsList")
+    public Object getStoreCampMinusGoodsList(@LoginUser UserVo loginUser, Integer storeId, Integer categoryId,Integer campMinusId,
+                                                  @RequestParam(value = "page", defaultValue = "1") Integer
+                                                          page, @RequestParam(value = "size", defaultValue = "10") Integer size,
+                                                  String sort, String order) {
+        Map reusltObj = apiMkStoreCampMinusGoodsService.getStoreCampMinusGoodsList(storeId,categoryId,campMinusId,page,size,sort,order);
+        return toResponsSuccess(reusltObj);
     }
 
 }

+ 137 - 0
kmall-api/src/main/java/com/kmall/api/api/ApiStoreCampMinusController.java

@@ -0,0 +1,137 @@
+package com.kmall.api.api;
+
+import com.kmall.api.annotation.LoginUser;
+import com.kmall.api.dto.CampMinusDto;
+import com.kmall.api.dto.UserCouponDto;
+import com.kmall.api.entity.CartVo;
+import com.kmall.api.entity.UserCouponVo;
+import com.kmall.api.entity.UserVo;
+import com.kmall.api.entity.mk.MkStoreCampMinusVo;
+import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
+import com.kmall.api.service.ApiCartService;
+import com.kmall.api.service.ApiUserCouponService;
+import com.kmall.api.service.mk.ApiMkStoreCampMinusService;
+import com.kmall.api.service.mk.ApiMkStoreTicketDiscountService;
+import com.kmall.api.service.mk.ApiMkStoreTopicStatService;
+import com.kmall.api.util.ApiBaseAction;
+import com.kmall.common.constant.Dict;
+import com.kmall.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减满折活动Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-07 16:06:28
+ */
+@RestController
+@RequestMapping("/api/campminus")
+public class ApiStoreCampMinusController extends ApiBaseAction {
+    @Autowired
+    private ApiMkStoreCampMinusService apiMkStoreCampMinusService;
+    @Autowired
+    private ApiUserCouponService apiUserCouponService;
+    @Autowired
+    private ApiCartService apiCartService;
+    @Autowired
+    private ApiMkStoreTopicStatService apiMkStoreTopicStatService;
+
+    /**
+     * 查看信息
+     */
+    @GetMapping("detail")
+    public Object info(Long storeId, Integer campMinusId,@LoginUser UserVo loginUser) {
+        MkStoreCampMinusVo mkStoreCampMinusVo = null;
+        if(campMinusId != null){
+            mkStoreCampMinusVo = apiMkStoreCampMinusService.queryObject(campMinusId);
+        }
+        if(mkStoreCampMinusVo != null){
+            String startDate = DateUtils.format(mkStoreCampMinusVo.getCampBegTime(), DateUtils.PATTERN_YYYY_MM_DD_HH_MM);
+            String endDate = DateUtils.format(mkStoreCampMinusVo.getCampEndTime(), DateUtils.PATTERN_YYYY_MM_DD_HH_MM);
+            String inValidDate = startDate + " 至 " + endDate;
+            mkStoreCampMinusVo.setInValidTime(inValidDate);
+
+            Integer storeTopicId = mkStoreCampMinusVo.getStoreTopicId();
+            //记录活动营销统计访客量数据
+            apiMkStoreTopicStatService.saveStoreTopicStatByVisitData(storeTopicId, storeId, getUserId());
+        }
+        return toResponsSuccess(mkStoreCampMinusVo);
+    }
+
+    /**
+     * 详情页查询该商品可支持的满减满折信息
+     */
+    @GetMapping("getStoreCampMinusByGoodsIdList")
+    public Object getStoreCampMinusByGoodsIdList(@LoginUser UserVo loginUser, Integer storeId, Integer goodsId,
+                                           @RequestParam(value = "page", defaultValue = "1") Integer page,
+                                           @RequestParam(value = "size", defaultValue = "10") Integer size) {
+        List<MkStoreCampMinusVo> campMinusVoList = apiMkStoreCampMinusService.queryStoreCampMinusByGoodsId(storeId, getUserId(), goodsId);
+        List<MkStoreCampMinusVo> resultCampMinusList = new ArrayList<>();
+        if(size <= campMinusVoList.size()) {
+            for (int i = 0; i < size; i++) {
+                MkStoreCampMinusVo campMinusVo = campMinusVoList.get(i);
+                resultCampMinusList.add(campMinusVo);
+            }
+        }
+        if(size > campMinusVoList.size()) {
+            for (MkStoreCampMinusVo campMinusVo: campMinusVoList) {
+                resultCampMinusList.add(campMinusVo);
+            }
+        }
+        return toResponsSuccess(resultCampMinusList);
+    }
+
+    /**
+     * 确认订单页,查看订单商品所支持的满减满折列表
+     */
+    @GetMapping("getCampminusByCheckCartList")
+    public Object getCampminusByCheckCartList(@LoginUser UserVo loginUser, Integer storeId, String checkCart, String bizType) {
+        //获取要购买的商品
+        Map<String, Object> cartData = apiCartService.getCartMoney(loginUser, checkCart, Long.valueOf(storeId));
+
+        List<CartVo> checkedGoodsList = new ArrayList();
+        List<CartVo> cartGoodsList = (List<CartVo>) cartData.get("cartList");
+        for (CartVo cartEntity : cartGoodsList) {
+            if (cartEntity.getChecked() == 1) {
+                if(bizType.equalsIgnoreCase(cartEntity.getGoodsBizType())) {
+                    checkedGoodsList.add(cartEntity);
+                }
+            }
+        }
+        //计算订单的费用 商品总价
+        BigDecimal goodsTotalPrice = (BigDecimal) ((HashMap) cartData.get("cartTotal")).get("checkedGoodsAmount");
+        BigDecimal goodsTotalPrice00 = (BigDecimal) ((HashMap) cartData.get("cartTotal")).get("checkedGoodsAmount00");
+        BigDecimal goodsTotalPrice02 = (BigDecimal) ((HashMap) cartData.get("cartTotal")).get("checkedGoodsAmount02");
+        BigDecimal goodsTotalPrice10 = (BigDecimal) ((HashMap) cartData.get("cartTotal")).get("checkedGoodsAmount10");
+        BigDecimal goodsTotalPrice11 = (BigDecimal) ((HashMap) cartData.get("cartTotal")).get("checkedGoodsAmount11");
+        if(bizType.equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
+            goodsTotalPrice = goodsTotalPrice00;
+        }else if(bizType.equalsIgnoreCase(Dict.orderBizType.item_02.getItem())){
+            goodsTotalPrice = goodsTotalPrice02;
+        }else if(bizType.equalsIgnoreCase(Dict.orderBizType.item_10.getItem())){
+            goodsTotalPrice = goodsTotalPrice10;
+        }else if(bizType.equalsIgnoreCase(Dict.orderBizType.item_11.getItem())){
+            goodsTotalPrice = goodsTotalPrice11;
+        }
+        //获取可用的优惠券信息 抵用券
+        UserCouponDto userCouponDto = new UserCouponDto();
+        userCouponDto.setUserId(loginUser.getId());
+        userCouponDto.setStoreId(getStoreId());
+        userCouponDto.setGoodsTotalPrice(goodsTotalPrice);
+        userCouponDto.setCartGoodsList(checkedGoodsList);
+        userCouponDto.setBizType(bizType);
+        List<CampMinusDto> enableCouponList = apiMkStoreCampMinusService.matchUserCampMinusList(userCouponDto);
+        return toResponsSuccess(enableCouponList);
+    }
+}

+ 9 - 3
kmall-api/src/main/java/com/kmall/api/api/ApiStoreTicketDiscountController.java

@@ -51,7 +51,7 @@ public class ApiStoreTicketDiscountController  extends ApiBaseAction {
         Map<String, Object> params = new HashMap<>();
         params.put("storeId", storeId);
         params.put("userId", getUserId());
-        params.put("isPast", "0");
+        params.put("isPast", "0");//未过期
         List<MkStoreTicketDiscountVo> mkStoreTicketDiscountList = apiMkStoreTicketDiscountService.getDiscountByStoreIdList(params);
         for (MkStoreTicketDiscountVo discountEntity : mkStoreTicketDiscountList) {
             discountEntity.setInValidTime(setInvalidTime(discountEntity));
@@ -115,7 +115,7 @@ public class ApiStoreTicketDiscountController  extends ApiBaseAction {
         if(size <= discountVoList.size()) {
             for (int i = 0; i < size; i++) {
                 MkStoreTicketDiscountVo discountEntity = discountVoList.get(i);
-                //是否领取 1:是 0:否
+                //优惠券是否可操作 1:不可操作 0:可操作
                 discountEntity.setIsReceive(getReceive(discountEntity,loginUser));
                 discountEntity.setInValidTime(setInvalidTime(discountEntity));
                 resultDiscountVoList.add(discountEntity);
@@ -123,7 +123,7 @@ public class ApiStoreTicketDiscountController  extends ApiBaseAction {
         }
         if(size > discountVoList.size()) {
             for (MkStoreTicketDiscountVo discountEntity: discountVoList) {
-                //是否领取 1:是 0:否
+                //优惠券是否可操作 1:不可操作 0:可操作
                 discountEntity.setIsReceive(getReceive(discountEntity,loginUser));
                 discountEntity.setInValidTime(setInvalidTime(discountEntity));
                 resultDiscountVoList.add(discountEntity);
@@ -132,6 +132,12 @@ public class ApiStoreTicketDiscountController  extends ApiBaseAction {
         return toResponsSuccess(resultDiscountVoList);
     }
 
+    /**
+     * 优惠券是否可操作 1:不可操作 0:可操作
+     * @param discountEntity
+     * @param loginUser
+     * @return
+     */
     private Integer getReceive(MkStoreTicketDiscountVo discountEntity, UserVo loginUser){
         Integer isReceive;
         if(discountEntity.getTicketNum() == 0){

+ 2 - 0
kmall-api/src/main/java/com/kmall/api/dao/ApiGoodsMapper.java

@@ -28,4 +28,6 @@ public interface ApiGoodsMapper extends BaseDao<GoodsVo> {
      * @return
      */
     void updateGoodsStock(GoodsVo goodsVo);
+
+    Integer selectCountByCatalogProductList(Map<String, Object> params);
 }

+ 2 - 0
kmall-api/src/main/java/com/kmall/api/dao/ApiOrderMapper.java

@@ -50,4 +50,6 @@ public interface ApiOrderMapper extends BaseDao<OrderVo> {
     List<OrderVo> querySubmitNumByStoreTopicId(@Param("storeTopicId")Integer storeTopicId);
 
     Integer querySubmitOrderNumByStoreTopicId(@Param("storeTopicId")Integer storeTopicId);
+
+    Integer queryTopicNumByTopicIdAndUserId(@Param("storeTopicId")Integer storeTopicId, @Param("userId")Long userId);
 }

+ 20 - 0
kmall-api/src/main/java/com/kmall/api/dao/ApiUserCampMinusMapper.java

@@ -0,0 +1,20 @@
+package com.kmall.api.dao;
+
+import com.kmall.api.entity.UserCampMinusVo;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 用户满减满折表Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-06-13 15:19:58
+ */
+public interface ApiUserCampMinusMapper extends BaseDao<UserCampMinusVo> {
+    UserCampMinusVo queryUserCampByOrderId(@Param("orderId") Long orderId);
+
+    int cancelUserCampOrder(UserCampMinusVo vo);
+
+    UserCampMinusVo queryCampByStoreTopicId(@Param("storeTopicId") Long storeTopicId);
+}

+ 21 - 0
kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreCampMinusGoodsMapper.java

@@ -0,0 +1,21 @@
+package com.kmall.api.dao.mk;
+
+import com.kmall.api.entity.GoodsVo;
+import com.kmall.api.entity.mk.MkStoreCampMinusGoodsVo;
+import com.kmall.manager.dao.BaseDao;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动商品,参与满减活动的商品Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public interface ApiMkStoreCampMinusGoodsMapper extends BaseDao<MkStoreCampMinusGoodsVo> {
+    List<GoodsVo> queryCampMinusGoodsList(Map<String, Object> map);
+
+    Integer queryCampMinusGoodsTotal(Map<String, Object> map);
+}

+ 47 - 0
kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreCampMinusLevelMapper.java

@@ -0,0 +1,47 @@
+package com.kmall.api.dao.mk;
+
+import com.kmall.api.entity.mk.MkStoreCampMinusLevelVo;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动层级表,活动减免类型为00:按满足最高层级减一次时增加的活动层级数据Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public interface ApiMkStoreCampMinusLevelMapper extends BaseDao<MkStoreCampMinusLevelVo> {
+
+    List<MkStoreCampMinusLevelVo> queryObjectByCampMinusId(@Param("campMinusId") Integer campMinusId);
+    /**
+     * 查询满元满减的最高优惠,或没满一次减一次的优惠信息
+     * @param campMinusId
+     * @return
+     */
+    MkStoreCampMinusLevelVo queryYuanCondByCampMinusId(@Param("campMinusId") Integer campMinusId, @Param("campMinusType")String campMinusType, @Param("minusMode")String minusMode);
+
+    /**
+     * 查询满件满减的最高优惠,或没满一次减一次的优惠信息
+     * @param campMinusId
+     * @return
+     */
+    MkStoreCampMinusLevelVo queryPieceConfByCampMinusId(@Param("campMinusId") Integer campMinusId, @Param("campMinusType")String campMinusType, @Param("minusMode")String minusMode);
+
+    /**
+     * 查询满元满折的最高优惠
+     * @param campMinusId
+     * @return
+     */
+    MkStoreCampMinusLevelVo queryDiscCondByCampMinusId(@Param("campMinusId") Integer campMinusId);
+
+    /**
+     * 查询满件满折的最高优惠
+     * @param campMinusId
+     * @return
+     */
+    MkStoreCampMinusLevelVo queryDiscConfByCampMinusId(@Param("campMinusId") Integer campMinusId);
+}

+ 21 - 0
kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreCampMinusMapper.java

@@ -0,0 +1,21 @@
+package com.kmall.api.dao.mk;
+
+import com.kmall.api.entity.mk.MkStoreCampMinusVo;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:28
+ */
+public interface ApiMkStoreCampMinusMapper extends BaseDao<MkStoreCampMinusVo> {
+    List<MkStoreCampMinusVo> getCampMinusByStoreIdList(Map<String, Object> map);
+
+    Integer queryOrderCountByUserIdAndCampId(@Param("userId")Long userId,@Param("campMinusId")Integer campMinusId);
+}

+ 7 - 0
kmall-api/src/main/java/com/kmall/api/dao/mk/ApiMkStoreTopicStatMapper.java

@@ -4,6 +4,9 @@ import com.kmall.api.entity.mk.MkStoreTopicStatVo;
 import com.kmall.manager.dao.BaseDao;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 门店活动统计Dao
  *
@@ -15,4 +18,8 @@ public interface ApiMkStoreTopicStatMapper extends BaseDao<MkStoreTopicStatVo> {
     MkStoreTopicStatVo queryObjectByTopicId(@Param("storeTopicId") Integer storeTopicId);
 
     MkStoreTopicStatVo queryStatDataByUserCouponId(@Param("userCouponId") Integer userCouponId);
+
+    MkStoreTopicStatVo queryCampByOrder(@Param("campMinusId")Integer campMinusId);
+
+    List<Map> querySubmitNumByCampOrder(@Param("storeTopicId") Integer storeTopicId);
 }

+ 70 - 0
kmall-api/src/main/java/com/kmall/api/dto/CampMinusDto.java

@@ -0,0 +1,70 @@
+package com.kmall.api.dto;
+
+import java.math.BigDecimal;
+
+/**
+ * @author huangyq
+ * @version 1.0
+ * 2019-06-11 15:35
+ */
+public class CampMinusDto {
+    private String campMinusType;
+
+    private String campName;
+
+    private BigDecimal money;
+
+    private Integer campMinusId;
+
+    private String goodsBizType;
+
+    private Integer storeTopicId;
+
+    public String getCampMinusType() {
+        return campMinusType;
+    }
+
+    public void setCampMinusType(String campMinusType) {
+        this.campMinusType = campMinusType;
+    }
+
+    public String getCampName() {
+        return campName;
+    }
+
+    public void setCampName(String campName) {
+        this.campName = campName;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+
+    public String getGoodsBizType() {
+        return goodsBizType;
+    }
+
+    public void setGoodsBizType(String goodsBizType) {
+        this.goodsBizType = goodsBizType;
+    }
+
+    public Integer getStoreTopicId() {
+        return storeTopicId;
+    }
+
+    public void setStoreTopicId(Integer storeTopicId) {
+        this.storeTopicId = storeTopicId;
+    }
+}

+ 46 - 0
kmall-api/src/main/java/com/kmall/api/dto/CheckOutDto.java

@@ -19,6 +19,52 @@ public class CheckOutDto {
     private Long storeId;
     private Map<String, Object> cartData;
 
+    private Integer campId00;
+    private Integer campId02;
+    private Integer campId10;
+    private Integer campId11;
+    private Integer isLoadStatus;
+
+    public Integer getIsLoadStatus() {
+        return isLoadStatus;
+    }
+
+    public void setIsLoadStatus(Integer isLoadStatus) {
+        this.isLoadStatus = isLoadStatus;
+    }
+
+    public Integer getCampId00() {
+        return campId00;
+    }
+
+    public void setCampId00(Integer campId00) {
+        this.campId00 = campId00;
+    }
+
+    public Integer getCampId02() {
+        return campId02;
+    }
+
+    public void setCampId02(Integer campId02) {
+        this.campId02 = campId02;
+    }
+
+    public Integer getCampId10() {
+        return campId10;
+    }
+
+    public void setCampId10(Integer campId10) {
+        this.campId10 = campId10;
+    }
+
+    public Integer getCampId11() {
+        return campId11;
+    }
+
+    public void setCampId11(Integer campId11) {
+        this.campId11 = campId11;
+    }
+
     public Map<String, Object> getCartData() {
         return cartData;
     }

+ 68 - 0
kmall-api/src/main/java/com/kmall/api/dto/GoodsDetailDto.java

@@ -0,0 +1,68 @@
+package com.kmall.api.dto;
+
+/**
+ * @author huangyq
+ * @version 1.0
+ * 2019-06-11 09:52
+ */
+public class GoodsDetailDto {
+    private Long id;
+
+    private Long referrer;
+
+    private String merchSn;
+
+    private Long storeId;
+
+    private Integer promId;
+
+    private Long userId;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getReferrer() {
+        return referrer;
+    }
+
+    public void setReferrer(Long referrer) {
+        this.referrer = referrer;
+    }
+
+    public String getMerchSn() {
+        return merchSn;
+    }
+
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn;
+    }
+
+    public Long getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Long storeId) {
+        this.storeId = storeId;
+    }
+
+    public Integer getPromId() {
+        return promId;
+    }
+
+    public void setPromId(Integer promId) {
+        this.promId = promId;
+    }
+}

+ 33 - 0
kmall-api/src/main/java/com/kmall/api/entity/CartVo.java

@@ -72,6 +72,39 @@ public class CartVo implements Serializable {
 
     private String isStockShare;
 
+    private String supplierThirdMerchCode;
+
+    private String isStockShareBySuppler;
+
+    /**
+     * 门店第三方商户是否属于供应商模式商品购买
+     */
+    private String isSupplierGoods;
+
+    public String getSupplierThirdMerchCode() {
+        return supplierThirdMerchCode;
+    }
+
+    public void setSupplierThirdMerchCode(String supplierThirdMerchCode) {
+        this.supplierThirdMerchCode = supplierThirdMerchCode;
+    }
+
+    public String getIsStockShareBySuppler() {
+        return isStockShareBySuppler;
+    }
+
+    public void setIsStockShareBySuppler(String isStockShareBySuppler) {
+        this.isStockShareBySuppler = isStockShareBySuppler;
+    }
+
+    public String getIsSupplierGoods() {
+        return isSupplierGoods;
+    }
+
+    public void setIsSupplierGoods(String isSupplierGoods) {
+        this.isSupplierGoods = isSupplierGoods;
+    }
+
     public String getIsStockShare() {
         return isStockShare;
     }

+ 33 - 0
kmall-api/src/main/java/com/kmall/api/entity/GoodsVo.java

@@ -118,6 +118,39 @@ public class GoodsVo implements Serializable {
 
     private String isStockShare;
 
+    private String supplierThirdMerchCode;
+
+    private String isStockShareBySuppler;
+
+    /**
+     * 门店第三方商户是否属于供应商模式商品购买
+     */
+    private String isSupplierGoods;
+
+    public String getIsSupplierGoods() {
+        return isSupplierGoods;
+    }
+
+    public void setIsSupplierGoods(String isSupplierGoods) {
+        this.isSupplierGoods = isSupplierGoods;
+    }
+
+    public String getSupplierThirdMerchCode() {
+        return supplierThirdMerchCode;
+    }
+
+    public void setSupplierThirdMerchCode(String supplierThirdMerchCode) {
+        this.supplierThirdMerchCode = supplierThirdMerchCode;
+    }
+
+    public String getIsStockShareBySuppler() {
+        return isStockShareBySuppler;
+    }
+
+    public void setIsStockShareBySuppler(String isStockShareBySuppler) {
+        this.isStockShareBySuppler = isStockShareBySuppler;
+    }
+
     public void addSellVolume() {
         if (null == sell_volume) {
             sell_volume = 1;

+ 23 - 2
kmall-api/src/main/java/com/kmall/api/entity/OrderVo.java

@@ -123,8 +123,6 @@ public class OrderVo implements Serializable {
     private String order_status_text;
     //可操作的选项
     private Map handleOption;
-    //订单满减
-    private BigDecimal full_cut_price;
     // 订单类型 1:普通订单 2:团购订单
     private String order_type;
     // 活动id
@@ -200,6 +198,29 @@ public class OrderVo implements Serializable {
     private String merchName;
 //    private Long storeId;
 
+    //订单满减
+    private BigDecimal full_cut_price;
+
+    private Integer campMinusId;
+
+    private String campName;
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+
+    public String getCampName() {
+        return campName;
+    }
+
+    public void setCampName(String campName) {
+        this.campName = campName;
+    }
+
     public Integer getCashFee() {
         return cashFee;
     }

+ 257 - 0
kmall-api/src/main/java/com/kmall/api/entity/UserCampMinusVo.java

@@ -0,0 +1,257 @@
+package com.kmall.api.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户满减满折表实体
+ * 表名 mall_user_camp_minus
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-06-13 15:19:58
+ */
+public class UserCampMinusVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户满减满折id
+     */
+    private Integer userCampId;
+    /**
+     * 门店活动id
+     */
+    private Integer storeTopicId;
+    /**
+     * 活动名称
+     */
+    private String campName;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 使用时间
+     */
+    private Date usedTime;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 失效时间
+     */
+    private Date endTime;
+    /**
+     * 活动金额
+     */
+    private BigDecimal money;
+    /**
+     * 是否已使用 0:否;1:是
+     */
+    private String isUsed;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间,yyyy-MM-dd HH:mm:ss
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间,yyyy-MM-dd HH:mm:ss
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    /**
+     * 设置:用户满减满折id
+     */
+    public void setUserCampId(Integer userCampId) {
+        this.userCampId = userCampId;
+    }
+
+    /**
+     * 获取:用户满减满折id
+     */
+    public Integer getUserCampId() {
+        return userCampId;
+    }
+    /**
+     * 设置:门店活动id
+     */
+    public void setStoreTopicId(Integer storeTopicId) {
+        this.storeTopicId = storeTopicId;
+    }
+
+    /**
+     * 获取:门店活动id
+     */
+    public Integer getStoreTopicId() {
+        return storeTopicId;
+    }
+    /**
+     * 设置:活动名称
+     */
+    public void setCampName(String campName) {
+        this.campName = campName;
+    }
+
+    /**
+     * 获取:活动名称
+     */
+    public String getCampName() {
+        return campName;
+    }
+    /**
+     * 设置:用户id
+     */
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 获取:用户id
+     */
+    public Integer getUserId() {
+        return userId;
+    }
+    /**
+     * 设置:使用时间
+     */
+    public void setUsedTime(Date usedTime) {
+        this.usedTime = usedTime;
+    }
+
+    /**
+     * 获取:使用时间
+     */
+    public Date getUsedTime() {
+        return usedTime;
+    }
+    /**
+     * 设置:订单id
+     */
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    /**
+     * 获取:订单id
+     */
+    public Integer getOrderId() {
+        return orderId;
+    }
+    /**
+     * 设置:失效时间
+     */
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    /**
+     * 获取:失效时间
+     */
+    public Date getEndTime() {
+        return endTime;
+    }
+    /**
+     * 设置:活动金额
+     */
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    /**
+     * 获取:活动金额
+     */
+    public BigDecimal getMoney() {
+        return money;
+    }
+    /**
+     * 设置:是否已使用 0:否;1:是
+     */
+    public void setIsUsed(String isUsed) {
+        this.isUsed = isUsed;
+    }
+
+    /**
+     * 获取:是否已使用 0:否;1:是
+     */
+    public String getIsUsed() {
+        return isUsed;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间,yyyy-MM-dd HH:mm:ss
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间,yyyy-MM-dd HH:mm:ss
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间,yyyy-MM-dd HH:mm:ss
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间,yyyy-MM-dd HH:mm:ss
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 205 - 0
kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreCampMinusGoodsVo.java

@@ -0,0 +1,205 @@
+package com.kmall.api.entity.mk;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 门店满减活动商品,参与满减活动的商品实体
+ * 表名 mk_store_camp_minus_goods
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public class MkStoreCampMinusGoodsVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 满减活动商品id
+     */
+    private Integer minusGoodId;
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+    /**
+     * 适用类型,【apply_type,00:全部商品参与,01:指定商品参与,02:指定商品不参与】
+     */
+    private String applyType;
+    /**
+     * 门店商品id,当满减适用类型为00时,门店商品id可以为空,否则必填
+     */
+    private Integer storeRelaId;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private String isValid;
+    /**
+     * 备注
+     */
+    private String note;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    /**
+     * 设置:满减活动商品id
+     */
+    public void setMinusGoodId(Integer minusGoodId) {
+        this.minusGoodId = minusGoodId;
+    }
+
+    /**
+     * 获取:满减活动商品id
+     */
+    public Integer getMinusGoodId() {
+        return minusGoodId;
+    }
+    /**
+     * 设置:满减活动id
+     */
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+
+    /**
+     * 获取:满减活动id
+     */
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+    /**
+     * 设置:适用类型,【apply_type,00:全部商品参与,01:指定商品参与,02:指定商品不参与】
+     */
+    public void setApplyType(String applyType) {
+        this.applyType = applyType;
+    }
+
+    /**
+     * 获取:适用类型,【apply_type,00:全部商品参与,01:指定商品参与,02:指定商品不参与】
+     */
+    public String getApplyType() {
+        return applyType;
+    }
+    /**
+     * 设置:门店商品id,当满减适用类型为00时,门店商品id可以为空,否则必填
+     */
+    public void setStoreRelaId(Integer storeRelaId) {
+        this.storeRelaId = storeRelaId;
+    }
+
+    /**
+     * 获取:门店商品id,当满减适用类型为00时,门店商品id可以为空,否则必填
+     */
+    public Integer getStoreRelaId() {
+        return storeRelaId;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(String isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public String getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:备注
+     */
+    public void setNote(String note) {
+        this.note = note;
+    }
+
+    /**
+     * 获取:备注
+     */
+    public String getNote() {
+        return note;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 359 - 0
kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreCampMinusLevelVo.java

@@ -0,0 +1,359 @@
+package com.kmall.api.entity.mk;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 门店满减活动层级表,活动减免类型为00:按满足最高层级减一次时增加的活动层级数据实体
+ * 表名 mk_store_camp_minus_level
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public class MkStoreCampMinusLevelVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 满减活动层级id
+     */
+    private Integer campMinusLevelId;
+    /**
+     * 减免活动类型, 00:满x元减,01:满x件减,10:满x元折,11:满x件折,减免活动类型为00,01时,减免方式必选
+     */
+    private String campMinusType;
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+    /**
+     * 减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。
+     */
+    private String minusMode;
+    /**
+     * 满元减条件(元)
+     */
+    private BigDecimal yuanMinusCond;
+    /**
+     * 满元减优惠(元)
+     */
+    private BigDecimal yuanMinusPref;
+    /**
+     * 满件减条件(件)
+     */
+    private Integer pieceMinusConf;
+    /**
+     * 满件减优惠(元)
+     */
+    private BigDecimal pieceMinusPref;
+    /**
+     * 满减件每人优惠(元),填0代表不设置上限,减免活动类型为10,且减免方式选择10时,满件每人最多项必填。
+     */
+    private BigDecimal pieceMinusEachDisc;
+    /**
+     * 满元折条件(元),大于等于0的2位小数
+     */
+    private BigDecimal yuanDiscCond;
+    /**
+     * 满元折优惠(折),大于0且小于10的1位小数。
+     */
+    private BigDecimal yuanDiscPref;
+    /**
+     * 满件折条件(件),大于等于0的整数
+     */
+    private Integer pieceDiscConf;
+    /**
+     * 满件折优惠(折),大于0且小于10的数,可带1位小数。
+     */
+    private BigDecimal pieceDiscPref;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private String isValid;
+    /**
+     * 备注
+     */
+    private String note;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+
+    /**
+     * 设置:满减活动层级id
+     */
+    public void setCampMinusLevelId(Integer campMinusLevelId) {
+        this.campMinusLevelId = campMinusLevelId;
+    }
+
+    /**
+     * 获取:满减活动层级id
+     */
+    public Integer getCampMinusLevelId() {
+        return campMinusLevelId;
+    }
+    /**
+     * 设置:减免活动类型, 00:满x元减,01:满x件减,10:满x元折,11:满x件折,减免活动类型为00,01时,减免方式必选
+     */
+    public void setCampMinusType(String campMinusType) {
+        this.campMinusType = campMinusType;
+    }
+
+    /**
+     * 获取:减免活动类型, 00:满x元减,01:满x件减,10:满x元折,11:满x件折,减免活动类型为00,01时,减免方式必选
+     */
+    public String getCampMinusType() {
+        return campMinusType;
+    }
+    /**
+     * 设置:满减活动id
+     */
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+
+    /**
+     * 获取:满减活动id
+     */
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+    /**
+     * 设置:减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。
+     */
+    public void setMinusMode(String minusMode) {
+        this.minusMode = minusMode;
+    }
+
+    /**
+     * 获取:减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。
+     */
+    public String getMinusMode() {
+        return minusMode;
+    }
+    /**
+     * 设置:满元减条件(元)
+     */
+    public void setYuanMinusCond(BigDecimal yuanMinusCond) {
+        this.yuanMinusCond = yuanMinusCond;
+    }
+
+    /**
+     * 获取:满元减条件(元)
+     */
+    public BigDecimal getYuanMinusCond() {
+        return yuanMinusCond;
+    }
+    /**
+     * 设置:满元减优惠(元)
+     */
+    public void setYuanMinusPref(BigDecimal yuanMinusPref) {
+        this.yuanMinusPref = yuanMinusPref;
+    }
+
+    /**
+     * 获取:满元减优惠(元)
+     */
+    public BigDecimal getYuanMinusPref() {
+        return yuanMinusPref;
+    }
+    /**
+     * 设置:满件减条件(件)
+     */
+    public void setPieceMinusConf(Integer pieceMinusConf) {
+        this.pieceMinusConf = pieceMinusConf;
+    }
+
+    /**
+     * 获取:满件减条件(件)
+     */
+    public Integer getPieceMinusConf() {
+        return pieceMinusConf;
+    }
+    /**
+     * 设置:满件减优惠(元)
+     */
+    public void setPieceMinusPref(BigDecimal pieceMinusPref) {
+        this.pieceMinusPref = pieceMinusPref;
+    }
+
+    /**
+     * 获取:满件减优惠(元)
+     */
+    public BigDecimal getPieceMinusPref() {
+        return pieceMinusPref;
+    }
+    /**
+     * 设置:满减件每人优惠(元),填0代表不设置上限,减免活动类型为10,且减免方式选择10时,满件每人最多项必填。
+     */
+    public void setPieceMinusEachDisc(BigDecimal pieceMinusEachDisc) {
+        this.pieceMinusEachDisc = pieceMinusEachDisc;
+    }
+
+    /**
+     * 获取:满减件每人优惠(元),填0代表不设置上限,减免活动类型为10,且减免方式选择10时,满件每人最多项必填。
+     */
+    public BigDecimal getPieceMinusEachDisc() {
+        return pieceMinusEachDisc;
+    }
+    /**
+     * 设置:满元折条件(元),大于等于0的2位小数
+     */
+    public void setYuanDiscCond(BigDecimal yuanDiscCond) {
+        this.yuanDiscCond = yuanDiscCond;
+    }
+
+    /**
+     * 获取:满元折条件(元),大于等于0的2位小数
+     */
+    public BigDecimal getYuanDiscCond() {
+        return yuanDiscCond;
+    }
+    /**
+     * 设置:满元折优惠(折),大于0且小于10的1位小数。
+     */
+    public void setYuanDiscPref(BigDecimal yuanDiscPref) {
+        this.yuanDiscPref = yuanDiscPref;
+    }
+
+    /**
+     * 获取:满元折优惠(折),大于0且小于10的1位小数。
+     */
+    public BigDecimal getYuanDiscPref() {
+        return yuanDiscPref;
+    }
+    /**
+     * 设置:满件折条件(件),大于等于0的整数
+     */
+    public void setPieceDiscConf(Integer pieceDiscConf) {
+        this.pieceDiscConf = pieceDiscConf;
+    }
+
+    /**
+     * 获取:满件折条件(件),大于等于0的整数
+     */
+    public Integer getPieceDiscConf() {
+        return pieceDiscConf;
+    }
+    /**
+     * 设置:满件折优惠(折),大于0且小于10的数,可带1位小数。
+     */
+    public void setPieceDiscPref(BigDecimal pieceDiscPref) {
+        this.pieceDiscPref = pieceDiscPref;
+    }
+
+    /**
+     * 获取:满件折优惠(折),大于0且小于10的数,可带1位小数。
+     */
+    public BigDecimal getPieceDiscPref() {
+        return pieceDiscPref;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(String isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public String getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:备注
+     */
+    public void setNote(String note) {
+        this.note = note;
+    }
+
+    /**
+     * 获取:备注
+     */
+    public String getNote() {
+        return note;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+}

+ 438 - 0
kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreCampMinusVo.java

@@ -0,0 +1,438 @@
+package com.kmall.api.entity.mk;
+
+import com.kmall.common.constant.Dict;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 门店满减活动实体
+ * 表名 mk_store_camp_minus
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:28
+ */
+public class MkStoreCampMinusVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+    /**
+     * 活动名称
+     */
+    private String campName;
+    /**
+     * 第三方商户id
+     */
+    private Integer thirdMerchSn;
+    /**
+     * 门店id
+     */
+    private Integer storeId;
+    /**
+     * 活动id
+     */
+    private Integer storeTopicId;
+    /**
+     * 活动起始时间,yyyy-MM-dd HH:mi
+     */
+    private Date campBegTime;
+    /**
+     * 活动结束时间,yyyy-MM-dd HH:mi
+     */
+    private Date campEndTime;
+    /**
+     * 减免活动类型, 00:满x元减,01:满x件减,10:满x元折,11:满x件折,减免活动类型为00,01时,减免方式必选
+     */
+    private String campMinusType;
+    /**
+     * 减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。
+     */
+    private String minusMode;
+    /**
+     * 适用类型,【apply_type,00:全部商品参与,01:指定商品参与,02:指定商品不参与】
+     */
+    private String applyType;
+    /**
+     * 活动图片url
+     */
+    private String advImgUrl;
+    /**
+     * 活动说明
+     */
+    private String advDesc;
+    /**
+     * 是否有效,0:有效,1:无效
+     */
+    private String isValid;
+    /**
+     * 是否过期,0:否,1:是
+     */
+    private String isPast;
+    /**
+     * 是否展示在小程序门店首页广告栏,0:否,1:是
+     */
+    private String isStoreShow;
+    /**
+     * 备注
+     */
+    private String note;
+    /**
+     * 创建人编号
+     */
+    private String createrSn;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 修改人编号
+     */
+    private String moderSn;
+    /**
+     * 修改时间
+     */
+    private Date modTime;
+    /**
+     * 时间戳
+     */
+    private Date tstm;
+    /**
+     * 货品业务类型, 00:保税备货, 02:保税展示补货,10:保税展示跨境,11:普通商品
+     */
+    private String goodsBizType;
+
+    private String inValidTime;
+
+    private String storeName;
+
+    private Long end_time;
+
+    private Integer goodsId;
+
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    public Long getEnd_time() {//todo 配置结束时间的倒计时时间
+        if (getIsPast().equalsIgnoreCase(Dict.isPast.item_0.getItem()) && getIsValid().equalsIgnoreCase(Dict.isValid.item_0.getItem())) {
+            end_time = getCampEndTime().getTime() + 60 * 15 * 1000;
+        }
+        return end_time;
+    }
+
+    public void setEnd_time(Long end_time) {
+        this.end_time = end_time;
+    }
+
+    public String getInValidTime() {
+        return inValidTime;
+    }
+
+    public void setInValidTime(String inValidTime) {
+        this.inValidTime = inValidTime;
+    }
+
+    public String getStoreName() {
+        return storeName;
+    }
+
+    public void setStoreName(String storeName) {
+        this.storeName = storeName;
+    }
+
+    /**
+     * 设置:满减活动id
+     */
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+
+    /**
+     * 获取:满减活动id
+     */
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+    /**
+     * 设置:活动名称
+     */
+    public void setCampName(String campName) {
+        this.campName = campName;
+    }
+
+    /**
+     * 获取:活动名称
+     */
+    public String getCampName() {
+        return campName;
+    }
+    /**
+     * 设置:第三方商户id
+     */
+    public void setThirdMerchSn(Integer thirdMerchSn) {
+        this.thirdMerchSn = thirdMerchSn;
+    }
+
+    /**
+     * 获取:第三方商户id
+     */
+    public Integer getThirdMerchSn() {
+        return thirdMerchSn;
+    }
+    /**
+     * 设置:门店id
+     */
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
+    /**
+     * 获取:门店id
+     */
+    public Integer getStoreId() {
+        return storeId;
+    }
+    /**
+     * 设置:活动id
+     */
+    public void setStoreTopicId(Integer storeTopicId) {
+        this.storeTopicId = storeTopicId;
+    }
+
+    /**
+     * 获取:活动id
+     */
+    public Integer getStoreTopicId() {
+        return storeTopicId;
+    }
+    /**
+     * 设置:活动起始时间,yyyy-MM-dd HH:mi
+     */
+    public void setCampBegTime(Date campBegTime) {
+        this.campBegTime = campBegTime;
+    }
+
+    /**
+     * 获取:活动起始时间,yyyy-MM-dd HH:mi
+     */
+    public Date getCampBegTime() {
+        return campBegTime;
+    }
+    /**
+     * 设置:活动结束时间,yyyy-MM-dd HH:mi
+     */
+    public void setCampEndTime(Date campEndTime) {
+        this.campEndTime = campEndTime;
+    }
+
+    /**
+     * 获取:活动结束时间,yyyy-MM-dd HH:mi
+     */
+    public Date getCampEndTime() {
+        return campEndTime;
+    }
+    /**
+     * 设置:减免活动类型, 00:满x元减,01:满x件减,10:满x元折,11:满x件折,减免活动类型为00,01时,减免方式必选
+     */
+    public void setCampMinusType(String campMinusType) {
+        this.campMinusType = campMinusType;
+    }
+
+    /**
+     * 获取:减免活动类型, 00:满x元减,01:满x件减,10:满x元折,11:满x件折,减免活动类型为00,01时,减免方式必选
+     */
+    public String getCampMinusType() {
+        return campMinusType;
+    }
+    /**
+     * 设置:减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。
+     */
+    public void setMinusMode(String minusMode) {
+        this.minusMode = minusMode;
+    }
+
+    /**
+     * 获取:减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。
+     */
+    public String getMinusMode() {
+        return minusMode;
+    }
+    /**
+     * 设置:适用类型,【apply_type,00:全部商品参与,01:指定商品参与,02:指定商品不参与】
+     */
+    public void setApplyType(String applyType) {
+        this.applyType = applyType;
+    }
+
+    /**
+     * 获取:适用类型,【apply_type,00:全部商品参与,01:指定商品参与,02:指定商品不参与】
+     */
+    public String getApplyType() {
+        return applyType;
+    }
+    /**
+     * 设置:活动图片url
+     */
+    public void setAdvImgUrl(String advImgUrl) {
+        this.advImgUrl = advImgUrl;
+    }
+
+    /**
+     * 获取:活动图片url
+     */
+    public String getAdvImgUrl() {
+        return advImgUrl;
+    }
+    /**
+     * 设置:活动说明
+     */
+    public void setAdvDesc(String advDesc) {
+        this.advDesc = advDesc;
+    }
+
+    /**
+     * 获取:活动说明
+     */
+    public String getAdvDesc() {
+        return advDesc;
+    }
+    /**
+     * 设置:是否有效,0:有效,1:无效
+     */
+    public void setIsValid(String isValid) {
+        this.isValid = isValid;
+    }
+
+    /**
+     * 获取:是否有效,0:有效,1:无效
+     */
+    public String getIsValid() {
+        return isValid;
+    }
+    /**
+     * 设置:是否过期,0:否,1:是
+     */
+    public void setIsPast(String isPast) {
+        this.isPast = isPast;
+    }
+
+    /**
+     * 获取:是否过期,0:否,1:是
+     */
+    public String getIsPast() {
+        return isPast;
+    }
+    /**
+     * 设置:是否展示在小程序门店首页广告栏,0:否,1:是
+     */
+    public void setIsStoreShow(String isStoreShow) {
+        this.isStoreShow = isStoreShow;
+    }
+
+    /**
+     * 获取:是否展示在小程序门店首页广告栏,0:否,1:是
+     */
+    public String getIsStoreShow() {
+        return isStoreShow;
+    }
+    /**
+     * 设置:备注
+     */
+    public void setNote(String note) {
+        this.note = note;
+    }
+
+    /**
+     * 获取:备注
+     */
+    public String getNote() {
+        return note;
+    }
+    /**
+     * 设置:创建人编号
+     */
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn;
+    }
+
+    /**
+     * 获取:创建人编号
+     */
+    public String getCreaterSn() {
+        return createrSn;
+    }
+    /**
+     * 设置:创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取:创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+    /**
+     * 设置:修改人编号
+     */
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn;
+    }
+
+    /**
+     * 获取:修改人编号
+     */
+    public String getModerSn() {
+        return moderSn;
+    }
+    /**
+     * 设置:修改时间
+     */
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    /**
+     * 获取:修改时间
+     */
+    public Date getModTime() {
+        return modTime;
+    }
+    /**
+     * 设置:时间戳
+     */
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+
+    /**
+     * 获取:时间戳
+     */
+    public Date getTstm() {
+        return tstm;
+    }
+    /**
+     * 设置:货品业务类型, 00:保税备货, 02:保税展示补货,10:保税展示跨境,11:普通商品
+     */
+    public void setGoodsBizType(String goodsBizType) {
+        this.goodsBizType = goodsBizType;
+    }
+
+    /**
+     * 获取:货品业务类型, 00:保税备货, 02:保税展示补货,10:保税展示跨境,11:普通商品
+     */
+    public String getGoodsBizType() {
+        return goodsBizType;
+    }
+}

+ 1 - 1
kmall-api/src/main/java/com/kmall/api/entity/mk/MkStoreTicketDiscountVo.java

@@ -199,7 +199,7 @@ public class MkStoreTicketDiscountVo implements Serializable {
     private String referrer;
 
     /**
-     * 优惠券是否可操作 1:是 0:否
+     * 优惠券是否可操作 1:不可操作 0:可操作 2:暂不可用
      */
     private Integer isReceive;
 

+ 260 - 41
kmall-api/src/main/java/com/kmall/api/service/ApiCartService.java

@@ -3,11 +3,15 @@ package com.kmall.api.service;
 import com.google.common.collect.Maps;
 import com.kmall.api.annotation.LoginUser;
 import com.kmall.api.dao.*;
+import com.kmall.api.dto.CampMinusDto;
 import com.kmall.api.dto.CheckOutDto;
 import com.kmall.api.dto.UserCouponDto;
 import com.kmall.api.entity.*;
+import com.kmall.api.entity.mk.MkStoreCampMinusVo;
+import com.kmall.api.service.mk.ApiMkStoreCampMinusService;
 import com.kmall.common.constant.Dict;
 import com.kmall.common.utils.Constant;
+import com.kmall.common.utils.MapUtils;
 import com.kmall.common.utils.RRException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -42,6 +46,8 @@ public class ApiCartService {
     private ApiFreightMapper apiFreightMapper;
     @Autowired
     private ApiUserCouponService apiUserCouponService;
+    @Autowired
+    private ApiMkStoreCampMinusService apiMkStoreCampMinusService;
 
     public CartVo queryObject(Integer id) {
         return cartDao.queryObject(id);
@@ -267,6 +273,12 @@ public class ApiCartService {
         return cartDao.queryCartNumByStoreId(map);
     }
 
+    /**
+     * 优惠券活动计算实付抵扣
+     * @param checkedCoupon
+     * @param actualPrice
+     * @return
+     */
     public BigDecimal mathActualPrice(UserCouponVo checkedCoupon, BigDecimal actualPrice){
         if(checkedCoupon != null){
             if (checkedCoupon.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())) {
@@ -280,6 +292,30 @@ public class ApiCartService {
         return actualPrice;
     }
 
+    /**
+     * 满减满折活动计算实付满减
+     * @param checkedCampMinus
+     * @param actualPrice
+     * @return
+     */
+    public BigDecimal mathActualPriceByCamp(CampMinusDto checkedCampMinus, BigDecimal actualPrice){
+        if(checkedCampMinus != null){
+            if (checkedCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem()) || checkedCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())) {
+                actualPrice = actualPrice.subtract(checkedCampMinus.getMoney());
+            }
+            if (checkedCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_10.getItem()) || checkedCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_11.getItem())) {
+                //实付金额*(满减满折折扣*0.1) = 折扣后的实付金额
+                actualPrice = actualPrice.multiply(checkedCampMinus.getMoney().multiply(new BigDecimal(0.1))).setScale(2, BigDecimal.ROUND_HALF_UP);//满多少打几折
+            }
+        }
+        return actualPrice;
+    }
+
+    /**
+     * 确认订单页
+     * @param checkOutDto
+     * @return
+     */
     public Map<String, Object> getCheckOut(CheckOutDto checkOutDto){
         Map<String, Object> resultObj = Maps.newHashMap();
         UserVo loginUser = checkOutDto.getLoginUser();
@@ -289,6 +325,10 @@ public class ApiCartService {
         Long tickDiscId02 = checkOutDto.getTickDiscId02();
         Long tickDiscId10 = checkOutDto.getTickDiscId10();
         Long tickDiscId11 = checkOutDto.getTickDiscId11();
+        Integer campId00 = checkOutDto.getCampId00();
+        Integer campId02 = checkOutDto.getCampId02();
+        Integer campId10 = checkOutDto.getCampId10();
+        Integer campId11 = checkOutDto.getCampId11();
         Map<String, Object> cartData = checkOutDto.getCartData();
         List<CartVo> checkedGoodsList = new ArrayList();
         List<CartVo> cartGoodsList = (List<CartVo>) cartData.get("cartList");
@@ -367,21 +407,25 @@ public class ApiCartService {
         }
         //整个订单包含运费的总价,商品总价+运费
         BigDecimal orderTotalPrice = goodsTotalPrice.add(freightPrice00).add(freightPrice02).add(freightPrice10).add(freightPrice11);
-        // 计算优惠券 todo 暂时不计算全场金额满减
-        BigDecimal fullCutCouponDec = Constant.ZERO;
-        Long fullCutCouponId = 0L;
+        // 计算满减 todo 暂时不计算全场金额满减
+//        BigDecimal fullCutCouponDec = Constant.ZERO;
+//        Long fullCutCouponId = 0L;
         /*CouponVo fullSubCoupon = apiCouponService.matchFullSub(loginUser.getId(), goodsTotalPrice);
         if (null != fullSubCoupon && null != fullSubCoupon.getId()) {
             // 满减
             fullCutCouponDec = fullSubCoupon.getType_money();
             fullCutCouponId = fullSubCoupon.getId();
         }*/
-        resultObj.put("fullCutCouponDec", fullCutCouponDec);
-        resultObj.put("fullCutCouponId", fullCutCouponId);
+//        resultObj.put("fullCutCouponDec", fullCutCouponDec);
+//        resultObj.put("fullCutCouponId", fullCutCouponId);
         List<UserCouponVo> couponList00 = null;
         List<UserCouponVo> couponList02 = null;
         List<UserCouponVo> couponList10 = null;
         List<UserCouponVo> couponList11 = null;
+        List<CampMinusDto> campList00 = null;
+        List<CampMinusDto> campList02 = null;
+        List<CampMinusDto> campList10 = null;
+        List<CampMinusDto> campList11 = null;
         //获取每个订单的可用的优惠券信息 抵用券
         if(goodsTotalPrice00.compareTo(new BigDecimal(0)) > 0){
             UserCouponDto userCouponDto00 = new UserCouponDto();
@@ -391,6 +435,7 @@ public class ApiCartService {
             userCouponDto00.setCartGoodsList(cartGoodsList);
             userCouponDto00.setBizType(Dict.orderBizType.item_00.getItem());
             couponList00 = apiUserCouponService.matchUserCouponList(userCouponDto00);
+            campList00 = apiMkStoreCampMinusService.matchUserCampMinusList(userCouponDto00);
         }
         if(goodsTotalPrice02.compareTo(new BigDecimal(0)) > 0) {
             UserCouponDto userCouponDto02 = new UserCouponDto();
@@ -400,6 +445,7 @@ public class ApiCartService {
             userCouponDto02.setCartGoodsList(cartGoodsList);
             userCouponDto02.setBizType(Dict.orderBizType.item_02.getItem());
             couponList02 = apiUserCouponService.matchUserCouponList(userCouponDto02);
+            campList02 = apiMkStoreCampMinusService.matchUserCampMinusList(userCouponDto02);
         }
         if(goodsTotalPrice10.compareTo(new BigDecimal(0)) > 0) {
             UserCouponDto userCouponDto10 = new UserCouponDto();
@@ -409,6 +455,7 @@ public class ApiCartService {
             userCouponDto10.setCartGoodsList(cartGoodsList);
             userCouponDto10.setBizType(Dict.orderBizType.item_10.getItem());
             couponList10 = apiUserCouponService.matchUserCouponList(userCouponDto10);
+            campList10 = apiMkStoreCampMinusService.matchUserCampMinusList(userCouponDto10);
         }
         if(goodsTotalPrice11.compareTo(new BigDecimal(0)) > 0) {
             UserCouponDto userCouponDto11 = new UserCouponDto();
@@ -418,53 +465,49 @@ public class ApiCartService {
             userCouponDto11.setCartGoodsList(cartGoodsList);
             userCouponDto11.setBizType(Dict.orderBizType.item_11.getItem());
             couponList11 = apiUserCouponService.matchUserCouponList(userCouponDto11);
+            campList11 = apiMkStoreCampMinusService.matchUserCampMinusList(userCouponDto11);
         }
+        CampMinusDto campMinusDto00 = null;
+        CampMinusDto campMinusDto02 = null;
+        CampMinusDto campMinusDto10 = null;
+        CampMinusDto campMinusDto11 = null;
+
         UserCouponVo checkedCoupon00 = null;
         UserCouponVo checkedCoupon02 = null;
         UserCouponVo checkedCoupon10 = null;
         UserCouponVo checkedCoupon11 = null;
+        Integer isLoadStatus = checkOutDto.getIsLoadStatus();
         //商品销售价*数量
         BigDecimal actualPrice00 = goodsTotalPrice00;
         BigDecimal actualPrice02 = goodsTotalPrice02;
         BigDecimal actualPrice10 = goodsTotalPrice10;
         BigDecimal actualPrice11 = goodsTotalPrice11;
 
-        if (null != couponList00 && couponList00.size() > 0) {
-            for(UserCouponVo userCouponVo: couponList00) {
-                if (null != tickDiscId00 && tickDiscId00.equals(userCouponVo.getId())) {
-                    checkedCoupon00 = userCouponVo;
-                    //商品销售价*数量-优惠金额
-                    actualPrice00 = mathActualPrice(checkedCoupon00, actualPrice00);
-                }
-            }
-        }
-        if (null != couponList02 && couponList02.size() > 0) {
-            for(UserCouponVo userCouponVo: couponList02) {
-                if (null != tickDiscId02 && tickDiscId02.equals(userCouponVo.getId())) {
-                    checkedCoupon02 = userCouponVo;
-                    //商品销售价*数量-优惠金额
-                    actualPrice02 = mathActualPrice(checkedCoupon02, actualPrice02);
-                }
-            }
-        }
-        if (null != couponList10 && couponList10.size() > 0) {
-            for(UserCouponVo userCouponVo: couponList10) {
-                if (null != tickDiscId10 && tickDiscId10.equals(userCouponVo.getId())) {
-                    checkedCoupon10 = userCouponVo;
-                    //商品销售价*数量-优惠金额
-                    actualPrice10 = mathActualPrice(checkedCoupon10, actualPrice10);
-                }
-            }
-        }
-        if (null != couponList11 && couponList11.size() > 0) {
-            for(UserCouponVo userCouponVo: couponList11) {
-                if (null != tickDiscId11 && tickDiscId11.equals(userCouponVo.getId())) {
-                    checkedCoupon11 = userCouponVo;
-                    //商品销售价*数量-优惠金额
-                    actualPrice11 = mathActualPrice(checkedCoupon11, actualPrice11);
-                }
-            }
-        }
+        Map campMinusMap00 = checkedCampMinus(campList00, campMinusDto00, actualPrice00, campId00, isLoadStatus);
+        Map campMinusMap02 = checkedCampMinus(campList02, campMinusDto02, actualPrice02, campId02, isLoadStatus);
+        Map campMinusMap10 = checkedCampMinus(campList10, campMinusDto10, actualPrice10, campId10, isLoadStatus);
+        Map campMinusMap11 = checkedCampMinus(campList11, campMinusDto11, actualPrice11, campId11, isLoadStatus);
+
+        Map couponMap00 = checkedCoupon(couponList00, checkedCoupon00, tickDiscId00, campMinusMap00, isLoadStatus);
+        Map couponMap02 = checkedCoupon(couponList02, checkedCoupon02, tickDiscId02, campMinusMap02, isLoadStatus);
+        Map couponMap10 = checkedCoupon(couponList10, checkedCoupon10, tickDiscId10, campMinusMap10, isLoadStatus);
+        Map couponMap11 = checkedCoupon(couponList11, checkedCoupon11, tickDiscId11, campMinusMap11, isLoadStatus);
+
+        campMinusDto00 = getCampMinusByMap(campMinusMap00);
+        campMinusDto02 = getCampMinusByMap(campMinusMap02);
+        campMinusDto10 = getCampMinusByMap(campMinusMap10);
+        campMinusDto11 = getCampMinusByMap(campMinusMap11);
+
+        checkedCoupon00 = getUserCouponByMap(couponMap00);
+        checkedCoupon02 = getUserCouponByMap(couponMap02);
+        checkedCoupon10 = getUserCouponByMap(couponMap10);
+        checkedCoupon11 = getUserCouponByMap(couponMap11);
+
+        actualPrice00 = getActualPriceByMap(couponMap00);
+        actualPrice02 = getActualPriceByMap(couponMap02);
+        actualPrice10 = getActualPriceByMap(couponMap10);
+        actualPrice11 = getActualPriceByMap(couponMap11);
+
         //商品销售价*数量-优惠金额+运费
         actualPrice00 = actualPrice00.add(freightPrice00);
         actualPrice02 = actualPrice02.add(freightPrice02);
@@ -481,10 +524,26 @@ public class ApiCartService {
         resultObj.put("checkedCoupon02", checkedCoupon02);
         resultObj.put("checkedCoupon10", checkedCoupon10);
         resultObj.put("checkedCoupon11", checkedCoupon11);
+        resultObj.put("campMinusDto00", campMinusDto00);
+        resultObj.put("campMinusDto02", campMinusDto02);
+        resultObj.put("campMinusDto10", campMinusDto10);
+        resultObj.put("campMinusDto11", campMinusDto11);
         resultObj.put("couponList00", couponList00);
         resultObj.put("couponList02", couponList02);
         resultObj.put("couponList10", couponList10);
         resultObj.put("couponList11", couponList11);
+        resultObj.put("campList00", campList00);
+        resultObj.put("campList02", campList02);
+        resultObj.put("campList10", campList10);
+        resultObj.put("campList11", campList11);
+        resultObj.put("campId00", campMinusDto00 != null ? campMinusDto00.getCampMinusId():0);
+        resultObj.put("campId02", campMinusDto02 != null ? campMinusDto02.getCampMinusId():0);
+        resultObj.put("campId10", campMinusDto10 != null ? campMinusDto10.getCampMinusId():0);
+        resultObj.put("campId11", campMinusDto11 != null ? campMinusDto11.getCampMinusId():0);
+        resultObj.put("tickDiscId00", checkedCoupon00 != null ? checkedCoupon00.getId():0);
+        resultObj.put("tickDiscId02", checkedCoupon02 != null ? checkedCoupon02.getId():0);
+        resultObj.put("tickDiscId10", checkedCoupon10 != null ? checkedCoupon10.getId():0);
+        resultObj.put("tickDiscId11", checkedCoupon11 != null ? checkedCoupon11.getId():0);
 
         BigDecimal couponPrice = new BigDecimal(0.00);  //使用优惠券减免的金额
         resultObj.put("couponPrice", couponPrice);
@@ -506,4 +565,164 @@ public class ApiCartService {
         resultObj.put("isBizType11", isBizType11);
         return resultObj;
     }
+
+    /**
+     * 选择满减满折
+     * @param campList
+     * @param campMinusDto
+     * @param actualPrice
+     * @param campId
+     * @param isLoadStatus 0则为进入页面加载优惠信息,默认选择最高层级促销活动,1为选择促销活动后加载优惠信息,2为选择优惠券时触发,优惠券不能与促销活动同时使用
+     */
+    private Map checkedCampMinus(List<CampMinusDto> campList, CampMinusDto campMinusDto, BigDecimal actualPrice, Integer campId, Integer isLoadStatus){
+        Map campMap = new HashMap();
+        if(campList != null && campList.size() > 0){
+            if(isLoadStatus == 0){ //0则为进入页面加载优惠信息,默认选择最高层级促销活动
+                campMinusDto = campList.get(0);
+                if(campMinusDto.getCampMinusId().compareTo(0) > 0){
+                    //商品销售价*数量-优惠金额
+                    actualPrice = mathActualPriceByCamp(campMinusDto, actualPrice);
+                    campMap.put("actualPrice", actualPrice);
+                    campMap.put("isCamp", true);//满减活动是否满足该次订单
+                }else{
+                    campMap.put("actualPrice", actualPrice);
+                    campMap.put("isCamp", false);
+                }
+                campMap.put("campMinusDto", campMinusDto);
+                return campMap;
+            }else if(isLoadStatus == 1) { //1为选择促销活动后加载优惠信息
+                if (null != campId) {
+                    if (campId == 0) {
+                        //不参与满减活动
+                        setNotCampMinus(campList, actualPrice, campMap);
+                    } else {
+                        for (CampMinusDto dto : campList) {
+                            if (campId.compareTo(dto.getCampMinusId()) == 0) {
+                                campMinusDto = dto;
+                                //商品销售价*数量-优惠金额
+                                actualPrice = mathActualPriceByCamp(campMinusDto, actualPrice);
+                                campMap.put("actualPrice", actualPrice);
+                                campMap.put("isCamp", true);
+                                campMap.put("campMinusDto", campMinusDto);
+                            }
+                        }
+                    }
+                }else{
+                    campMap.put("actualPrice", actualPrice);
+                    campMap.put("isCamp", false);
+                }
+            }else{//2为选择优惠券时触发,优惠券不能与促销活动同时使用
+                setNotCampMinus(campList, actualPrice, campMap);
+            }
+            return campMap;
+        }else{
+            campMap.put("actualPrice", actualPrice);
+            campMap.put("isCamp", false);
+            return campMap;
+        }
+    }
+
+    /**
+     * 选择优惠券
+     * @param couponList
+     * @param checkedCoupon
+     * @param tickDiscId
+     * @param campMinusMap
+     * @param isLoadStatus 0则为进入页面加载优惠信息,默认选择最高层级促销活动,1为选择促销活动后加载优惠信息,2为选择优惠券时触发,优惠券不能与促销活动同时使用
+     */
+    private Map checkedCoupon(List<UserCouponVo> couponList, UserCouponVo checkedCoupon, Long tickDiscId, Map campMinusMap, Integer isLoadStatus){
+        BigDecimal actualPrice = MapUtils.getBigDecimal("actualPrice", campMinusMap);
+        Boolean isCamp = (Boolean)campMinusMap.get("isCamp");
+        Map couponMap = new HashMap();
+        //满减活动不与优惠券同时使用,当isCamp为false时可使用优惠券
+        if(isCamp == false) {
+            if (null != couponList && couponList.size() > 0) {
+                if (isLoadStatus == 0) {
+                    checkedCoupon = couponList.get(0);
+                    couponMap.put("actualPrice", actualPrice);
+                    couponMap.put("checkedCoupon", checkedCoupon);
+                }else if(isLoadStatus == 1) {
+                    //不参与优惠活动
+                    setNotCoupon(couponList,actualPrice,couponMap);
+                }else{
+                    if (null != tickDiscId && tickDiscId == 0) {//不参与优惠活动
+                        setNotCoupon(couponList,actualPrice,couponMap);
+                    } else {
+                        for (UserCouponVo userCouponVo : couponList) {
+                            if (null != tickDiscId && tickDiscId.equals(userCouponVo.getId())) {
+                                checkedCoupon = userCouponVo;
+                                //商品销售价*数量-优惠金额
+                                actualPrice = mathActualPrice(checkedCoupon, actualPrice);
+                                couponMap.put("actualPrice", actualPrice);
+                                couponMap.put("checkedCoupon", checkedCoupon);
+                            }
+                        }
+                    }
+                }
+            }else {
+                couponMap.put("actualPrice", actualPrice);
+            }
+            return couponMap;
+        }else{
+            setNotCoupon(couponList,actualPrice,couponMap);
+            return couponMap;
+        }
+    }
+
+    /**
+     * 不参与满减活动
+     * @return
+     */
+    private void setNotCampMinus(List<CampMinusDto> campList,BigDecimal actualPrice, Map campMap){
+        for (CampMinusDto dto : campList) {
+            if (dto.getCampMinusId().compareTo(0)==0) {
+                CampMinusDto campMinusDto = dto;
+                campMap.put("actualPrice", actualPrice);
+                campMap.put("isCamp", false);
+                campMap.put("campMinusDto", campMinusDto);
+                return;
+            }
+        }
+    }
+
+    /**
+     * 不参与优惠券活动
+     * @return
+     */
+    private void setNotCoupon(List<UserCouponVo> couponList,BigDecimal actualPrice, Map couponMap){
+        if(couponList != null && couponList.size() > 0){
+            for (UserCouponVo userCouponVo : couponList) {
+                if (userCouponVo.getId().compareTo(0L)==0) {
+                    UserCouponVo checkedCoupon = userCouponVo;
+                    couponMap.put("actualPrice", actualPrice);
+                    couponMap.put("checkedCoupon", checkedCoupon);
+                    return;
+                }
+            }
+        }else{
+            couponMap.put("actualPrice", actualPrice);
+            return;
+        }
+    }
+
+    private CampMinusDto getCampMinusByMap(Map campMinusMap){
+        if(campMinusMap.get("campMinusDto") != null){
+            return (CampMinusDto)campMinusMap.get("campMinusDto");
+        }
+        return null;
+    }
+
+    private UserCouponVo getUserCouponByMap(Map couponMap){
+        if(couponMap.get("checkedCoupon") != null){
+            return (UserCouponVo) couponMap.get("checkedCoupon");
+        }
+        return null;
+    }
+
+    private BigDecimal getActualPriceByMap(Map couponMap){
+        if(couponMap.get("actualPrice") != null){
+            return MapUtils.getBigDecimal("actualPrice", couponMap);
+        }
+        return null;
+    }
 }

+ 38 - 0
kmall-api/src/main/java/com/kmall/api/service/ApiCategoryService.java

@@ -1,10 +1,13 @@
 package com.kmall.api.service;
 
+import com.google.common.collect.Maps;
 import com.kmall.api.dao.ApiCategoryMapper;
 import com.kmall.api.entity.CategoryVo;
+import com.kmall.api.entity.GoodsVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -52,4 +55,39 @@ public class ApiCategoryService {
         categoryDao.deleteBatch(ids);
     }
 
+
+    public List<CategoryVo> getFilterCategory(List<GoodsVo> goodsEntityList, List<CategoryVo> filterCategory){
+
+        if (null != goodsEntityList && goodsEntityList.size() > 0) {
+            List<Integer> categoryIds = new ArrayList();
+            for (GoodsVo goodsVo : goodsEntityList) {
+                if (null == goodsVo || null == goodsVo.getCategory_id()) {
+                    continue;
+                }
+                categoryIds.add(goodsVo.getCategory_id());
+            }
+            //查找二级分类的parent_id
+            Map categoryParam = Maps.newHashMap();
+            categoryParam.put("ids", categoryIds);
+            categoryParam.put("fields", "parent_id");
+            List<CategoryVo> parentCategoryList = categoryDao.queryList(categoryParam);
+            //
+            List<Integer> parentIds = new ArrayList();
+            for (CategoryVo categoryEntity : parentCategoryList) {
+                parentIds.add(categoryEntity.getParent_id());
+            }
+            //一级分类
+            categoryParam = Maps.newHashMap();
+            categoryParam.put("fields", "id,name");
+            categoryParam.put("order", "asc");
+            categoryParam.put("sidx", "sort_order");
+            categoryParam.put("ids", parentIds);
+            List<CategoryVo> parentCategory = categoryDao.queryList(categoryParam);
+            if (null != parentCategory) {
+                filterCategory.addAll(parentCategory);
+            }
+        }
+        return filterCategory;
+    }
+
 }

+ 199 - 1
kmall-api/src/main/java/com/kmall/api/service/ApiGoodsService.java

@@ -1,10 +1,21 @@
 package com.kmall.api.service;
 
+import com.google.common.collect.Maps;
 import com.kmall.api.dao.ApiGoodsMapper;
-import com.kmall.api.entity.GoodsVo;
+import com.kmall.api.dto.GoodsDetailDto;
+import com.kmall.api.entity.*;
+import com.kmall.api.entity.mk.MkStorePromStatVo;
+import com.kmall.api.entity.mk.MkStorePromVisitorsVo;
+import com.kmall.api.entity.mk.MkStorePromVo;
+import com.kmall.api.service.mk.ApiMkStorePromService;
+import com.kmall.api.service.mk.ApiMkStorePromStatService;
+import com.kmall.api.service.mk.ApiMkStorePromVisitorsService;
+import com.kmall.api.util.StockUtil;
+import com.kmall.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -13,6 +24,42 @@ import java.util.Map;
 public class ApiGoodsService {
     @Autowired
     private ApiGoodsMapper goodsDao;
+    @Autowired
+    private ApiGoodsIssueService goodsIssueService;
+    @Autowired
+    private ApiAttributeService attributeService;
+    @Autowired
+    private ApiCommentService commentService;
+    @Autowired
+    private ApiUserService userService;
+    @Autowired
+    private ApiCommentPictureService commentPictureService;
+    @Autowired
+    private ApiCollectService collectService;
+    @Autowired
+    private ApiFootprintService footprintService;
+    @Autowired
+    private ApiCouponService apiCouponService;
+    @Autowired
+    private ApiUserCouponService apiUserCouponService;
+    @Autowired
+    private ApiFreightService apiFreightService;
+    @Autowired
+    private ApiMkStorePromVisitorsService apiMkStorePromVisitorsService;
+    @Autowired
+    private ApiBrandService apiBrandService;
+    @Autowired
+    private ApiGoodsSpecificationService goodsSpecificationService;
+    @Autowired
+    private ApiProductService productService;
+    @Autowired
+    private ApiGoodsGalleryService goodsGalleryService;
+    @Autowired
+    private ApiCartService cartService;
+    @Autowired
+    private ApiMkStorePromStatService apiMkStorePromStatService;
+    @Autowired
+    private ApiMkStorePromService apiMkStorePromService;
 
 
     public GoodsVo queryObject(Long id) {
@@ -59,4 +106,155 @@ public class ApiGoodsService {
     public List<GoodsVo> queryCatalogProductList(Map<String, Object> map) {
         return goodsDao.queryCatalogProductList(map);
     }
+
+    public Integer selectCountByCatalogProductList(Map<String, Object> map){
+        return goodsDao.selectCountByCatalogProductList(map);
+    }
+    
+    public Map detail(GoodsVo info, GoodsDetailDto detailDto){
+        Long userId = detailDto.getUserId();
+        Long referrer = detailDto.getReferrer();
+        String merchSn = detailDto.getMerchSn();
+        Long storeId = detailDto.getStoreId();
+        Integer promId = detailDto.getPromId();
+        Long id = detailDto.getId();
+        
+        Map<String, Object> resultObj = Maps.newHashMap();
+        BrandVo brand = apiBrandService.queryObject(info.getBrand_id());
+        resultObj.put("brand", brand);
+
+        List<Map> specificationList = goodsSpecificationService.queryByGoodsIdGroupByNames(id);
+
+        //查询产品信息
+        Map param = Maps.newHashMap();
+        param.put("goods_id", id);
+        param.put("store_id", storeId);
+        List<ProductVo> productEntityList = productService.queryList(param);
+        //团购
+        List<GoodsGalleryVo> gallery = goodsGalleryService.queryList(param);
+        resultObj.put("gallery", gallery);
+
+        Map ngaParam = Maps.newHashMap();
+        ngaParam.put("fields", "nga.value, na.name");
+        ngaParam.put("sidx", "nga.id");
+        ngaParam.put("order", "asc");
+        ngaParam.put("goods_id", id);
+        List<AttributeVo> attribute = attributeService.queryList(ngaParam);
+        //商品问答
+        Map issueParam = Maps.newHashMap();
+        issueParam.put("merch_sn", merchSn);
+        List<GoodsIssueVo> issue = goodsIssueService.queryList(issueParam);
+        //商品评论
+        param.put("value_id", id);
+        param.put("type_id", 0);
+        Integer commentCount = commentService.queryTotal(param);
+        List<CommentVo> hotComment = commentService.queryList(param);
+        Map commentInfo = Maps.newHashMap();
+        if (null != hotComment && hotComment.size() > 0) {
+            UserVo commentUser = userService.queryObject(hotComment.get(0).getUserId());
+            commentInfo.put("content", hotComment.get(0).getContent());
+            commentInfo.put("add_time", DateUtils.timeToStr(hotComment.get(0).getAddTime(), DateUtils.PATTERN_YYYY_MM_DD_HH_MM));
+            commentInfo.put("nickname", commentUser.getNickname());
+            commentInfo.put("avatar", commentUser.getAvatar());
+            Map paramPicture = Maps.newHashMap();
+            paramPicture.put("comment_id", hotComment.get(0).getId());
+            List<CommentPictureVo> commentPictureEntities = commentPictureService.queryList(paramPicture);
+            commentInfo.put("pic_list", commentPictureEntities);
+        }
+        Map comment = Maps.newHashMap();
+        comment.put("count", commentCount);
+        comment.put("data", commentInfo);
+        //当前用户是否收藏
+        Map collectParam = Maps.newHashMap();
+        collectParam.put("user_id", userId);
+        collectParam.put("value_id", id);
+        collectParam.put("type_id", 0);
+        Integer userHasCollect = collectService.queryTotal(collectParam);
+        if (userHasCollect > 0) {
+            userHasCollect = 1;
+        }
+        //记录用户的足迹
+        FootprintVo footprintEntity = new FootprintVo();
+        footprintEntity.setAdd_time(System.currentTimeMillis() / 1000);
+        footprintEntity.setGoods_brief(info.getGoods_brief());
+        footprintEntity.setList_pic_url(info.getList_pic_url());
+        footprintEntity.setGoods_id(id);
+        footprintEntity.setName(info.getName());
+        footprintEntity.setRetail_price(info.getRetail_price());
+        footprintEntity.setUser_id(userId);
+        if (null != referrer) {
+            footprintEntity.setReferrer(referrer);
+        } else {
+            footprintEntity.setReferrer(0L);
+        }
+        footprintService.save(footprintEntity);
+
+        String isStockShare = StockUtil.getIsStockShareByGoodsVo(info);
+        Map cartMap= Maps.newHashMap();
+        cartMap.put("user_id",userId);
+        cartMap.put("goods_id",id);
+        cartMap.put("store_id", storeId);
+        cartMap.put("isStockShare", isStockShare);
+        cartMap.put("goodsBizType", info.getGoodsBizType());
+        List<CartVo> cartVoList = cartService.queryList(cartMap);
+
+        FreightEntity freightEntity = apiFreightService.queryObjectByGoodsId(id, storeId);
+
+        Integer stockNum = StockUtil.setStockNumByGoodsVo(info);
+
+        if(com.kmall.common.utils.StringUtils.isNotEmpty(String.valueOf(promId))){
+            MkStorePromVo mkStorePromVo = apiMkStorePromService.queryObject(promId);
+            MkStorePromStatVo mkStorePromStatVo = new MkStorePromStatVo();
+            if(mkStorePromVo != null) {
+                //记录渠道推广浏览量
+                MkStorePromStatVo statVo = apiMkStorePromStatService.queryObjectByPromId(mkStorePromVo.getPromId());
+                //记录推广访客数据
+                MkStorePromVisitorsVo visitorsVo = apiMkStorePromVisitorsService.queryObjectByPromIdAndUserId(promId ,
+                        Integer.parseInt(String.valueOf(userId)));
+                if(visitorsVo == null){
+                    MkStorePromVisitorsVo promVisitorsVo = new MkStorePromVisitorsVo();
+                    promVisitorsVo.setPromId(promId);
+                    promVisitorsVo.setUserId(Integer.parseInt(String.valueOf(userId)));
+                    promVisitorsVo.setIsValid("0");
+                    promVisitorsVo.setCreateTime(new Date());
+                    promVisitorsVo.setModTime(new Date());
+                    apiMkStorePromVisitorsService.save(promVisitorsVo);
+                }
+                Integer visitNum = apiMkStorePromVisitorsService.queryCountByPromId(mkStorePromVo.getPromId());
+                mkStorePromStatVo.setReferrer(Integer.parseInt(String.valueOf(referrer)));
+                mkStorePromStatVo.setVisitPageDeep(1);
+                if(statVo != null){
+                    mkStorePromStatVo.setBrowseNum(statVo.getBrowseNum()+1);
+                    mkStorePromStatVo.setVisitNum(visitNum);
+                    mkStorePromStatVo.setRelaBrowseNum(statVo.getRelaBrowseNum()+1);//连带浏览量
+                    mkStorePromStatVo.setRelaVisitorNum(visitNum);//连带访客量
+                    mkStorePromStatVo.setTransVisitorNum(visitNum);//转发访客量:用户转发了带有推广id的商品,其他的用户点击的访客量
+                    mkStorePromStatVo.setPromStatId(statVo.getPromStatId());
+                    apiMkStorePromStatService.update(mkStorePromStatVo);
+                }else {
+                    mkStorePromStatVo.setStoreId(Integer.parseInt(String.valueOf(storeId)));
+                    mkStorePromStatVo.setPromId(mkStorePromVo.getPromId());
+                    mkStorePromStatVo.setBrowseNum(1);
+                    mkStorePromStatVo.setVisitNum(visitNum);
+                    mkStorePromStatVo.setRelaBrowseNum(1);//连带浏览量
+                    mkStorePromStatVo.setRelaVisitorNum(visitNum);//连带访客量
+                    mkStorePromStatVo.setTransVisitorNum(visitNum);//转发访客量:用户转发了带有推广id的商品,其他的用户点击的访客量
+                    mkStorePromStatVo.setIsValid("0");
+                    apiMkStorePromStatService.save(mkStorePromStatVo);
+                }
+            }
+        }
+        resultObj.put("info", info);
+
+        resultObj.put("attribute", attribute);
+        resultObj.put("userHasCollect", userHasCollect);
+        resultObj.put("issue", issue);
+        resultObj.put("comment", comment);
+        resultObj.put("specificationList", specificationList);
+        resultObj.put("productList", productEntityList);
+        resultObj.put("stockNum", stockNum);
+        resultObj.put("cartNumber", cartVoList.size() != 0 ? cartVoList.get(0).getNumber():0);
+        resultObj.put("defaultFreight", freightEntity != null? freightEntity.getDefaultFreight() :0);
+        return resultObj;
+    }
 }

+ 198 - 138
kmall-api/src/main/java/com/kmall/api/service/ApiOrderService.java

@@ -3,14 +3,16 @@ package com.kmall.api.service;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
+import com.kmall.api.dao.mk.ApiMkStoreCampMinusMapper;
 import com.kmall.api.dao.mk.ApiMkStoreTicketDiscountMapper;
+import com.kmall.api.dto.CampMinusDto;
 import com.kmall.api.dto.CheckOutDto;
-import com.kmall.api.entity.mk.MkStorePromOrderRealVo;
-import com.kmall.api.entity.mk.MkStorePromStatVo;
+import com.kmall.api.entity.mk.MkStoreCampMinusVo;
 import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
 import com.kmall.api.fromcomm.entity.FormIdsEntity;
 import com.kmall.api.service.mk.ApiMkStorePromStatService;
 import com.kmall.api.service.mk.ApiMkStoreTopicStatService;
+import com.kmall.api.util.StockUtil;
 import com.kmall.common.utils.*;
 import com.kmall.manager.dao.TemplateConfDao;
 import com.kmall.manager.entity.pay.TemplateConfVo;
@@ -42,14 +44,10 @@ import java.util.*;
 public class ApiOrderService {
     private Log logger = LogFactory.getLog(ApiOrderService.class);
     @Autowired
-    private ApiSysPrinterMapper apiSysPrinterMapper;
-    @Autowired
     private ApiProductMapper apiProductMapper;
     @Autowired
     private ApiCartMapper apiCartMapper;
     @Autowired
-    private ApiCouponMapper apiCouponMapper;
-    @Autowired
     private ApiOrderMapper apiOrderMapper;
     @Autowired
     private ApiOrderGoodsMapper apiOrderGoodsMapper;
@@ -60,10 +58,6 @@ public class ApiOrderService {
     @Autowired
     private ApiUserMapper apiUserMapper;
     @Autowired
-    private ApiGoodsGroupOpenMapper apiGoodsGroupOpenMapper;
-    @Autowired
-    private ApiGoodsGroupOpenDetailMapper apiGoodsGroupOpenDetailMapper;
-    @Autowired
     private FormIdsService formIdsService;
     @Autowired
     private ApiGoodsMapper apiGoodsMapper;
@@ -87,6 +81,10 @@ public class ApiOrderService {
     private ApiCartService cartService;
     @Autowired
     private ApiMkStoreTopicStatService apiMkStoreTopicStatService;
+    @Autowired
+    private ApiMkStoreCampMinusMapper apiMkStoreCampMinusMapper;
+    @Autowired
+    private ApiUserCampMinusMapper apiUserCampMinusMapper;
 
     public OrderVo queryObject(Long id) {
         return apiOrderMapper.queryObject(id);
@@ -132,87 +130,13 @@ public class ApiOrderService {
             if (null == goodsInfo || goodsInfo.getIs_delete() == 1 || goodsInfo.getIs_on_sale() == 0) {
                 throw new RRException("订单提交失败:商品不存在");
             }
-            Integer stockNum;
+//            Integer stockNum = StockUtil.setStockNumByGoodsVo(goodsInfo);
+//            String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
             // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-            if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
-                if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
-                    //还原商户商品库存
-                    stockNum = goodsInfo.getGoods_number();
-                    stockNum = stockNum == null? 0 : stockNum;
-                    goodsInfo.setGoods_number(stockNum + orderGoodsVo.getNumber());
-//                    goodsInfo.setSell_volume(goodsInfo.getGoods_sell_volume() - orderGoodsVo.getNumber());
-                    apiGoodsMapper.updateGoodsStock(goodsInfo);
-
-                    productInfo.setSell_volume(productInfo.getSell_volume() - orderGoodsVo.getNumber());
-                    productInfo.setGoods_id(goodsInfo.getId());
-                    apiProductMapper.updateStockNum(productInfo);
-
-                    MngChangeVo mngChangeVo = new MngChangeVo();
-                    mngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
-                    mngChangeVo.setThirdPartyMerchCode(goodsInfo.getThirdPartyMerchCode());
-                    mngChangeVo.setChangeReason("小程序取消订单");
-                    mngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
-                    mngChangeVo.setChangeNum(orderGoodsVo.getNumber());//变化数
-                    mngChangeVo.setOriginalNum(stockNum);//原库存数
-                    mngChangeVo.setValidNum(stockNum + orderGoodsVo.getNumber());//可用数
-                    mngChangeVo.setCreateTime(new Date());
-                    mngChangeVo.setModTime(new Date());
-                    mngChangeVo.setCreaterSn("小程序用户"+userName);
-                    mngChangeVo.setModerSn("小程序用户"+userName);
-                    mngChangeVo.setIsValid(0);
-                    mngChangeVo.setMerchSn(goodsInfo.getMerchSn());
-                    apiMngChangeMapper.save(mngChangeVo);
-                }
-                if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
-                    //还原门店库存
-                    stockNum = productInfo.getStock_num();
-                    stockNum = stockNum == null? 0 : stockNum;
-                    productInfo.setStock_num(stockNum + orderGoodsVo.getNumber());
-                    productInfo.setSell_volume(productInfo.getSell_volume() - orderGoodsVo.getNumber());
-                    productInfo.setGoods_id(goodsInfo.getId());
-                    apiProductMapper.updateStockNum(productInfo);
-
-                    StoreMngChangeVo storeMngChangeVo = new StoreMngChangeVo();
-                    storeMngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
-                    storeMngChangeVo.setChangeReason("小程序取消订单");
-                    storeMngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
-                    storeMngChangeVo.setStoreId(Integer.parseInt(String.valueOf(productInfo.getStore_id())));
-                    storeMngChangeVo.setMerchSn(goodsInfo.getMerchSn());
-                    storeMngChangeVo.setStoreChangeNum(orderGoodsVo.getNumber());
-                    storeMngChangeVo.setStoreOriginalNum(stockNum);
-                    storeMngChangeVo.setStoreValidNum(stockNum + orderGoodsVo.getNumber());
-                    storeMngChangeVo.setCreateTime(new Date());
-                    storeMngChangeVo.setModTime(new Date());
-                    storeMngChangeVo.setCreaterSn("小程序用户"+userName);
-                    storeMngChangeVo.setModerSn("小程序用户"+userName);
-                    storeMngChangeVo.setIsValid(0);
-                    apiStoreMngChangeMapper.save(storeMngChangeVo);
-                }
-            }else {
-                //还原门店库存
-                stockNum = productInfo.getStock_num();
-                stockNum = stockNum == null? 0 : stockNum;
-                productInfo.setStock_num(stockNum + orderGoodsVo.getNumber());
-                productInfo.setGoods_id(goodsInfo.getId());
-                productInfo.setSell_volume(productInfo.getSell_volume() - orderGoodsVo.getNumber());
-                apiProductMapper.updateStockNum(productInfo);
-
-                StoreMngChangeVo storeMngChangeVo = new StoreMngChangeVo();
-                storeMngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
-                storeMngChangeVo.setChangeReason("小程序取消订单");
-                storeMngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
-                storeMngChangeVo.setStoreId(Integer.parseInt(String.valueOf(productInfo.getStore_id())));
-                storeMngChangeVo.setMerchSn(goodsInfo.getMerchSn());
-                storeMngChangeVo.setStoreChangeNum(orderGoodsVo.getNumber());
-                storeMngChangeVo.setStoreOriginalNum(stockNum);
-                storeMngChangeVo.setStoreValidNum(stockNum + orderGoodsVo.getNumber());
-                storeMngChangeVo.setCreateTime(new Date());
-                storeMngChangeVo.setModTime(new Date());
-                storeMngChangeVo.setCreaterSn("小程序用户"+userName);
-                storeMngChangeVo.setModerSn("小程序用户"+userName);
-                storeMngChangeVo.setIsValid(0);
-                apiStoreMngChangeMapper.save(storeMngChangeVo);
-            }
+            //还原门店库存
+            resetStoreGoodsStock(goodsInfo.getStockNum(), productInfo, goodsInfo, orderGoodsVo, userName);
+            //还原商户商品库存
+            resetGoodsStock(goodsInfo.getGoods_number(), productInfo, goodsInfo, orderGoodsVo, userName);
         }
         update(order);
         // 判断是否有优惠券
@@ -220,6 +144,69 @@ public class ApiOrderService {
         if (null != couponVo) {
             apiUserCouponMapper.cancelOrder(couponVo);
         }
+        //释放促销满减券
+        UserCampMinusVo userCampMinusVo = apiUserCampMinusMapper.queryUserCampByOrderId(order.getId());
+        if (null != userCampMinusVo) {
+            apiUserCampMinusMapper.cancelUserCampOrder(userCampMinusVo);
+        }
+    }
+
+    /**
+     * 还原商户商品总库存
+     */
+    private void resetGoodsStock(Integer stockNum, ProductVo productInfo, GoodsVo goodsInfo, OrderGoodsVo orderGoodsVo, String userName){
+        stockNum = stockNum == null? 0 : stockNum;
+        goodsInfo.setGoods_number(stockNum + orderGoodsVo.getNumber());
+//                    goodsInfo.setSell_volume(goodsInfo.getGoods_sell_volume() - orderGoodsVo.getNumber());
+        apiGoodsMapper.updateGoodsStock(goodsInfo);
+
+//        productInfo.setSell_volume(productInfo.getSell_volume() - orderGoodsVo.getNumber());
+//        productInfo.setGoods_id(goodsInfo.getId());
+//        apiProductMapper.updateStockNum(productInfo);
+
+        MngChangeVo mngChangeVo = new MngChangeVo();
+        mngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
+        mngChangeVo.setThirdPartyMerchCode(goodsInfo.getThirdPartyMerchCode());
+        mngChangeVo.setChangeReason("小程序取消订单");
+        mngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
+        mngChangeVo.setChangeNum(orderGoodsVo.getNumber());//变化数
+        mngChangeVo.setOriginalNum(stockNum);//原库存数
+        mngChangeVo.setValidNum(stockNum + orderGoodsVo.getNumber());//可用数
+        mngChangeVo.setCreateTime(new Date());
+        mngChangeVo.setModTime(new Date());
+        mngChangeVo.setCreaterSn("小程序用户"+userName);
+        mngChangeVo.setModerSn("小程序用户"+userName);
+        mngChangeVo.setIsValid(0);
+        mngChangeVo.setMerchSn(goodsInfo.getMerchSn());
+        apiMngChangeMapper.save(mngChangeVo);
+    }
+
+    /**
+     * 还原门店商品库存
+     */
+    private void resetStoreGoodsStock(Integer stockNum, ProductVo productInfo, GoodsVo goodsInfo, OrderGoodsVo orderGoodsVo, String userName){
+        stockNum = stockNum == null? 0 : stockNum;
+
+        productInfo.setStock_num(stockNum + orderGoodsVo.getNumber());
+        productInfo.setGoods_id(goodsInfo.getId());
+        productInfo.setSell_volume(productInfo.getSell_volume() - orderGoodsVo.getNumber());
+        apiProductMapper.updateStockNum(productInfo);
+
+        StoreMngChangeVo storeMngChangeVo = new StoreMngChangeVo();
+        storeMngChangeVo.setChangeType(Dict.changeType.item_0.getItem());
+        storeMngChangeVo.setChangeReason("小程序取消订单");
+        storeMngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsInfo.getId())));
+        storeMngChangeVo.setStoreId(Integer.parseInt(String.valueOf(productInfo.getStore_id())));
+        storeMngChangeVo.setMerchSn(goodsInfo.getMerchSn());
+        storeMngChangeVo.setStoreChangeNum(orderGoodsVo.getNumber());
+        storeMngChangeVo.setStoreOriginalNum(stockNum);
+        storeMngChangeVo.setStoreValidNum(stockNum + orderGoodsVo.getNumber());
+        storeMngChangeVo.setCreateTime(new Date());
+        storeMngChangeVo.setModTime(new Date());
+        storeMngChangeVo.setCreaterSn("小程序用户"+userName);
+        storeMngChangeVo.setModerSn("小程序用户"+userName);
+        storeMngChangeVo.setIsValid(0);
+        apiStoreMngChangeMapper.save(storeMngChangeVo);
     }
 
     public void update(OrderVo order) {
@@ -240,7 +227,6 @@ public class ApiOrderService {
         apiOrderMapper.updateBatch(list);
     }
 
-
     public void delete(Integer id) {
         apiOrderMapper.delete(id);
     }
@@ -271,6 +257,11 @@ public class ApiOrderService {
         Integer tickDiscId02 = jsonParam.getInteger("tickDiscId02");//优惠券id
         Integer tickDiscId10 = jsonParam.getInteger("tickDiscId10");//优惠券id
         Integer tickDiscId11 = jsonParam.getInteger("tickDiscId11");//优惠券id
+        Integer campId00 = jsonParam.getInteger("campId00");//促销id
+        Integer campId02 = jsonParam.getInteger("campId02");//促销id
+        Integer campId10 = jsonParam.getInteger("campId10");//促销id
+        Integer campId11 = jsonParam.getInteger("campId11");//促销id
+        Integer isLoadStatus = jsonParam.getInteger("isLoadStatus");
         UserVo user = apiUserMapper.queryObjectByIdNoAndName(idNo, userName);
         UserVo userVo = new UserVo();
         userVo.setId(loginUser.getId());
@@ -333,6 +324,19 @@ public class ApiOrderService {
         if(tickDiscId11 != null){
             checkOutDto.setTickDiscId11(Long.valueOf(tickDiscId11));
         }
+        if(campId00 != null){
+            checkOutDto.setCampId00(campId00);
+        }
+        if(campId02 != null){
+            checkOutDto.setCampId02(campId02);
+        }
+        if(campId10 != null){
+            checkOutDto.setCampId10(campId10);
+        }
+        if(campId11 != null){
+            checkOutDto.setCampId11(campId11);
+        }
+        checkOutDto.setIsLoadStatus(isLoadStatus);
         checkOutDto.setStoreId(storeId);
         checkOutDto.setCartData(cartData);
         Map<String, Object> cartResultObj = cartService.getCheckOut(checkOutDto);
@@ -410,8 +414,12 @@ public class ApiOrderService {
                         apiMkStorePromStatService.updateMkStorePromStat(orderGoodsVo, orderInfo, loginUser, cartId);
                     }
                 }
-                //记录活动营销统计下单量数据
-                apiMkStoreTopicStatService.saveStoreTopicStatBySubmitData(orderInfo.getCoupon_id());
+                //记录优惠券活动营销统计下单量数据
+                apiMkStoreTopicStatService.saveTicketTopicStatBySubmitData(orderInfo.getCoupon_id());
+
+                //记录促销满减活动营销统计下单量数据
+                apiMkStoreTopicStatService.saveCampTopicStatBySubmitData(orderInfo.getActivity_id(), orderInfo.getCampMinusId());
+
                 OrderProcessRecordEntity entity = new OrderProcessRecordEntity();
                 entity.setOrderSn(orderInfo.getOrder_sn());
                 entity.setUserId(Integer.valueOf(loginUser.getId()+""));
@@ -440,19 +448,23 @@ public class ApiOrderService {
             orderInfoMap.put("orderInfo", orderInfoList);
             resultObj.put("data", orderInfoMap);
 
-            // 优惠券标记已用
+            // 优惠券标记已用,或促销满减活动保存已用
             for (OrderVo orderInfo : orderInfoList) {
                 if(orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
                     updateCoupon(orderInfo);
+                    saveUserCamp(orderInfo);
                 }
                 if(orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_02.getItem())){
                     updateCoupon(orderInfo);
+                    saveUserCamp(orderInfo);
                 }
                 if(orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_10.getItem())){
                     updateCoupon(orderInfo);
+                    saveUserCamp(orderInfo);
                 }
                 if(orderInfo.getOrderBizType().equalsIgnoreCase(Dict.orderBizType.item_11.getItem())){
                     updateCoupon(orderInfo);
+                    saveUserCamp(orderInfo);
                 }
             }
         }
@@ -477,21 +489,46 @@ public class ApiOrderService {
     }
 
     /**
-     * 库存扣减
+     * 订单提交成功后,新增用户促销满减活动信息为已使用
+     * @param orderInfo
+     */
+    private void saveUserCamp(OrderVo orderInfo){
+        if (null != orderInfo.getActivity_id() && 0 != orderInfo.getActivity_id()) {
+            UserCampMinusVo campMinusVo = apiUserCampMinusMapper.queryCampByStoreTopicId(orderInfo.getActivity_id());
+            //如未使用
+            if (null == campMinusVo) {
+                UserCampMinusVo userCampMinusVo = new UserCampMinusVo();
+                userCampMinusVo.setUsedTime(new Date());
+                userCampMinusVo.setOrderId(Integer.parseInt(String.valueOf(orderInfo.getId())));
+                userCampMinusVo.setIsUsed(Dict.isUsed.item_1.getItem());
+                userCampMinusVo.setStoreTopicId(Integer.parseInt(String.valueOf(orderInfo.getActivity_id())));
+                userCampMinusVo.setCreateTime(new Date());
+                userCampMinusVo.setUserId(Integer.parseInt(String.valueOf(orderInfo.getUser_id())));
+                apiUserCampMinusMapper.save(userCampMinusVo);
+            }else {
+                campMinusVo.setUsedTime(new Date());
+                campMinusVo.setOrderId(Integer.parseInt(String.valueOf(orderInfo.getId())));
+                campMinusVo.setIsUsed(Dict.isUsed.item_1.getItem());
+                campMinusVo.setUserId(Integer.parseInt(String.valueOf(orderInfo.getUser_id())));
+                apiUserCampMinusMapper.update(campMinusVo);
+            }
+        }
+    }
+
+    /**
+     * 扣减商户商品总库存
      * @param goodsVo
-     * @param productInfo
-     * @param stockNum
      * @param goodsItem
      * @param userName
      */
-    private void updateGoodsStock(GoodsVo goodsVo,ProductVo productInfo,Integer stockNum,CartVo goodsItem,String userName){
-        goodsVo.setGoods_number(stockNum - goodsItem.getNumber());
+    private void updateGoodsStock(GoodsVo goodsVo, CartVo goodsItem,String userName){
+        goodsVo.setGoods_number(goodsVo.getGoods_number() - goodsItem.getNumber());
         goodsVo.setId(goodsVo.getId());
         apiGoodsMapper.updateGoodsStock(goodsVo);
-        //修改门店商品销量
-        productInfo.setSell_volume(productInfo.getSell_volume() + goodsItem.getNumber());
-        productInfo.setGoods_id(goodsVo.getId());
-        apiProductMapper.updateStockNum(productInfo);
+//        //修改门店商品销量
+//        productInfo.setSell_volume(productInfo.getSell_volume() + goodsItem.getNumber());
+//        productInfo.setGoods_id(goodsVo.getId());
+//        apiProductMapper.updateStockNum(productInfo);
 
         MngChangeVo mngChangeVo = new MngChangeVo();
         mngChangeVo.setGoodsId(Integer.parseInt(String.valueOf(goodsVo.getId())));
@@ -499,8 +536,8 @@ public class ApiOrderService {
         mngChangeVo.setChangeReason("小程序购买商品");
         mngChangeVo.setChangeType(Dict.changeType.item_1.getItem());
         mngChangeVo.setChangeNum(goodsItem.getNumber());//变化数
-        mngChangeVo.setOriginalNum(stockNum);//原库存数
-        mngChangeVo.setValidNum(stockNum - goodsItem.getNumber());//可用数
+        mngChangeVo.setOriginalNum(goodsVo.getGoods_number());//原库存数
+        mngChangeVo.setValidNum(goodsVo.getGoods_number() - goodsItem.getNumber());//可用数
         mngChangeVo.setCreateTime(new Date());
         mngChangeVo.setModTime(new Date());
         mngChangeVo.setCreaterSn("小程序用户"+userName);
@@ -511,7 +548,7 @@ public class ApiOrderService {
     }
 
     /**
-     * 库存扣减
+     * 扣减商户门店商品库存
      * @param productInfo
      * @param goodsVo
      * @param stockNum
@@ -520,8 +557,10 @@ public class ApiOrderService {
      * @param userName
      */
     private void updateStock(ProductVo productInfo,GoodsVo goodsVo,Integer stockNum,CartVo goodsItem,Long storeId,String userName){
+        //修改门店商品库存
         productInfo.setStock_num(stockNum - goodsItem.getNumber());
         productInfo.setStore_id(storeId);
+        //修改门店商品销量
         productInfo.setSell_volume(productInfo.getSell_volume() + goodsItem.getNumber());
         productInfo.setGoods_id(goodsVo.getId());
 //        productVos.add(productInfo);
@@ -565,8 +604,10 @@ public class ApiOrderService {
                     logger.error("订单提交失败:商品已下架");
                     throw new RRException("订单提交失败:商品已下架");
                 }
+//                String isStockShare = StockUtil.getIsStockShareByGoodsVo(goodsInfo);
                 // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-                if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
+                stockNum = StockUtil.setStockNumByGoodsVo(goodsInfo);
+                /*if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
                     if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
                         stockNum = goodsInfo.getGoods_number();
                     }
@@ -575,25 +616,16 @@ public class ApiOrderService {
                     }
                 }else {
                     stockNum = productInfo.getStock_num();
-                }
+                }*/
                 if (null == stockNum || stockNum < goodsItem.getNumber() || stockNum <= 0) {
                     logger.error("订单提交失败:库存不足,仅剩余" + stockNum);
                     throw new RRException("订单提交失败:库存不足,仅剩余" + stockNum);
                 }else{
-                    if(goodsInfo.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
-                        if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
-                            //扣减商户商品库存
-                            productInfo.setStore_id(storeId);
-                            updateGoodsStock(goodsInfo,productInfo,stockNum,goodsItem,userName);
-                        }
-                        if (goodsInfo.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
-                            //扣减门店库存
-                            updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId,userName);
-                        }
-                    }else {
-                        //扣减门店库存
-                        updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId,userName);
-                    }
+                    productInfo.setStore_id(storeId);
+                    //扣减商户商品总库存
+                    updateGoodsStock(goodsInfo, goodsItem, userName);
+                    //扣减门店库存
+                    updateStock(productInfo,goodsInfo,stockNum,goodsItem,storeId,userName);
                 }
             }
         }
@@ -610,6 +642,10 @@ public class ApiOrderService {
     public OrderVo setOrderVo(JSONObject jsonParam, UserVo loginUser, Long storeId, Map<String, Object> cartResultObj, String bizType){
         OrderVo orderInfo = new OrderVo();
         Integer tickDiscId = 0;
+        Integer campId = 0;
+        Long couponId = 0L;
+        Long storeTopicId = 0L;
+        String campName = "";
         BigDecimal fullCutCouponDec = Constant.ZERO;
         BigDecimal cond = Constant.ZERO;
         BigDecimal money = Constant.ZERO;
@@ -617,14 +653,20 @@ public class ApiOrderService {
         BigDecimal freightPrice = Constant.ZERO;
         //实付金额:商品销售价*数量-优惠金额+运费的总和
         BigDecimal actualPrice = new BigDecimal(0.00);
-        Long couponId = 0L;
-        Long storeTopicId = 0L;
+        CampMinusDto campMinusDto = new CampMinusDto();
         Integer tickDiscId00 = jsonParam.getInteger("tickDiscId00");//优惠券id
         Integer tickDiscId02 = jsonParam.getInteger("tickDiscId02");//优惠券id
         Integer tickDiscId10 = jsonParam.getInteger("tickDiscId10");//优惠券id
         Integer tickDiscId11 = jsonParam.getInteger("tickDiscId11");//优惠券id
+        Integer campId00 = jsonParam.getInteger("campId00");//促销满减id
+        Integer campId02 = jsonParam.getInteger("campId02");//促销满减id
+        Integer campId10 = jsonParam.getInteger("campId10");//促销满减id
+        Integer campId11 = jsonParam.getInteger("campId11");//促销满减id
+        CampMinusDto campMinusDto00 = (CampMinusDto)cartResultObj.get("campMinusDto00");
+        CampMinusDto campMinusDto02 = (CampMinusDto)cartResultObj.get("campMinusDto02");
+        CampMinusDto campMinusDto10 = (CampMinusDto)cartResultObj.get("campMinusDto10");
+        CampMinusDto campMinusDto11 = (CampMinusDto)cartResultObj.get("campMinusDto11");
         String postscript = jsonParam.getString("postscript");
-        Long fullCutCouponId = jsonParam.getLong("fullCutCouponId");//满减券
         AddressVo addressVo = jsonParam.getObject("checkedAddress", AddressVo.class);
         Date delivery_date = jsonParam.getDate("delivery_date");
         String merchSn = (String)jsonParam.get("merchSn");
@@ -647,28 +689,36 @@ public class ApiOrderService {
             freightPrice = freightPrice00;
             goodsTotalPrice = goodsTotalPrice00;
             actualPrice = actualPrice00;
+            campId = campId00;
+            campMinusDto = campMinusDto00;
         }
         if(bizType.equalsIgnoreCase(Dict.orderBizType.item_02.getItem())){
             tickDiscId = tickDiscId02;
             freightPrice = freightPrice02;
             goodsTotalPrice = goodsTotalPrice02;
             actualPrice = actualPrice02;
+            campId = campId02;
+            campMinusDto = campMinusDto02;
         }
         if(bizType.equalsIgnoreCase(Dict.orderBizType.item_10.getItem())){
             tickDiscId = tickDiscId10;
             freightPrice = freightPrice10;
             goodsTotalPrice = goodsTotalPrice10;
             actualPrice = actualPrice10;
+            campId = campId10;
+            campMinusDto = campMinusDto10;
         }
         if(bizType.equalsIgnoreCase(Dict.orderBizType.item_11.getItem())){
             tickDiscId = tickDiscId11;
             freightPrice = freightPrice11;
             goodsTotalPrice = goodsTotalPrice11;
             actualPrice = actualPrice11;
+            campId = campId11;
+            campMinusDto = campMinusDto11;
         }
 //        goodsTotalPrice = MapUtils.getBigDecimal("goodsTotalPrice", cartResultObj);//整个订单商品总价,不包含运费和优惠金额
         MkStoreTicketDiscountVo mkStoreTicketDiscountVo = null;
-        if (null != tickDiscId && 0 != tickDiscId) {
+        if (null != tickDiscId && 0 != tickDiscId && campId == 0) {
             //校验该订单所选的优惠券
             mkStoreTicketDiscountVo = apiMkStoreTicketDiscountMapper.queryObject(tickDiscId);
             if(mkStoreTicketDiscountVo != null) {
@@ -688,12 +738,11 @@ public class ApiOrderService {
             }
         }
 
-
         String couponName = "";
         UserCouponVo couponVo = null;
         //扣减金额
         BigDecimal couponPrice = new BigDecimal(0.00);
-        if (null != tickDiscId && 0 != tickDiscId) {
+        if (null != tickDiscId && 0 != tickDiscId && campId == 0) {
             //查询未使用且未过期的优惠券
             List<UserCouponVo> couponVoList = apiUserCouponMapper.queryObjectByIdAndUsed(tickDiscId, loginUser.getId());
             if(couponVoList!= null && couponVoList.size() > 0){
@@ -711,8 +760,7 @@ public class ApiOrderService {
                             if (mkStoreTicketDiscountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_00.getItem())) {
                                 couponPrice = money;
                             }
-                            if (mkStoreTicketDiscountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())) {
-                                //满多少打几折,money为折扣
+                            if (mkStoreTicketDiscountVo.getTickDiscType().equalsIgnoreCase(Dict.tickDiscType.item_01.getItem())) { //折扣
                                 //商品销售价 - 扣减优惠折扣金额后的实付金额 = 订单优惠金额
                                 couponPrice = goodsTotalPrice.subtract(actualPrice);
                             }
@@ -734,12 +782,21 @@ public class ApiOrderService {
             }
         }
 
-        /*
-        //todo 获取优惠信息 满减,暂时不用
-        CouponVo fullCutCoupon = apiCouponMapper.queryObject(fullCutCouponId);
-        if (null != fullCutCoupon) {
-            fullCutCouponDec = fullCutCoupon.getType_money();
-        }*/
+        MkStoreCampMinusVo mkStoreCampMinusVo = null;
+        if(null != campId && 0 != campId){
+            mkStoreCampMinusVo = apiMkStoreCampMinusMapper.queryObject(campId);
+            if(mkStoreCampMinusVo != null) {
+                storeTopicId = Long.valueOf(mkStoreCampMinusVo.getStoreTopicId());
+                campName = mkStoreCampMinusVo.getCampName();
+                if (mkStoreCampMinusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem()) || mkStoreCampMinusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())) {
+                    fullCutCouponDec = campMinusDto.getMoney();
+                }
+                if (mkStoreCampMinusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_10.getItem()) || mkStoreCampMinusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_11.getItem())) {
+                    //商品销售价 - 扣减优惠折扣金额后的实付金额 = 订单优惠金额
+                    fullCutCouponDec = goodsTotalPrice.subtract(actualPrice);
+                }
+            }
+        }
 
         if (null == delivery_date) {
             delivery_date = new Date();
@@ -783,10 +840,13 @@ public class ApiOrderService {
         orderInfo.setCoupon_name(couponName);
         orderInfo.setActivity_id(storeTopicId);
 
+        //使用的促销费用
+        orderInfo.setFull_cut_price(fullCutCouponDec);
+        orderInfo.setCampMinusId(campId);
+        orderInfo.setCampName(campName);
+
         //留言
         orderInfo.setPostscript(postscript);
-        //使用的优惠券
-        orderInfo.setFull_cut_price(fullCutCouponDec);
         orderInfo.setAdd_time(new Date());
         orderInfo.setGoods_price(goodsTotalPrice);
         orderInfo.setOrder_price(orderTotalPrice);

+ 43 - 0
kmall-api/src/main/java/com/kmall/api/service/ApiUserCampMinusService.java

@@ -0,0 +1,43 @@
+package com.kmall.api.service;
+
+import com.kmall.api.dao.ApiUserCampMinusMapper;
+import com.kmall.api.entity.UserCampMinusVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户满减满折表Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-06-13 15:19:58
+ */
+@Service
+public class ApiUserCampMinusService {
+    @Autowired
+    private ApiUserCampMinusMapper apiUserCampMinusMapper;
+
+    public UserCampMinusVo queryObject(Integer userCampId) {
+        return apiUserCampMinusMapper.queryObject(userCampId);
+    }
+
+    public List<UserCampMinusVo> queryList(Map<String, Object> map) {
+        return apiUserCampMinusMapper.queryList(map);
+    }
+
+    public int queryTotal(Map<String, Object> map) {
+        return apiUserCampMinusMapper.queryTotal(map);
+    }
+
+    public int save(UserCampMinusVo userCampMinus) {
+        return apiUserCampMinusMapper.save(userCampMinus);
+    }
+
+    public int update(UserCampMinusVo userCampMinus) {
+        return apiUserCampMinusMapper.update(userCampMinus);
+    }
+
+}

+ 9 - 3
kmall-api/src/main/java/com/kmall/api/service/ApiUserCouponService.java

@@ -133,7 +133,7 @@ public class ApiUserCouponService {
                      cond = discountVo.getExchCond();
                      money = discountVo.getExchCond();
                   }*/
-                if(discountVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())){//全部商品参与
+                if(discountVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())){ //全部商品参与
                     //计算购物车中满足部分商品的销售价
                     BigDecimal totalByGoodsId = getTotalByGoodsId(userCouponDto.getCartGoodsList(),discountVoList,discountVo.getTickDiscId());
                     //销售价>满减价,去重
@@ -143,7 +143,7 @@ public class ApiUserCouponService {
                         switchList.add(discountVo);
                     }
                 }
-                if(!discountVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())) {//部分商品参与
+                if(!discountVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())) { //部分商品参与
                     //计算购物车中满足部分商品的销售价
                     BigDecimal totalByGoodsId = getTotalByGoodsId(userCouponDto.getCartGoodsList(),discountVoList,discountVo.getTickDiscId());
                     //销售价>满减价,去重
@@ -155,6 +155,12 @@ public class ApiUserCouponService {
                     }
                 }
             }
+            UserCouponVo userCouponVo = new UserCouponVo();
+            userCouponVo.setId(0L);
+            userCouponVo.setCouponName("不参与优惠券");
+            userCouponVo.setTypeMoney(Constant.ZERO);
+            userCouponVo.setGoodsBizType(userCouponDto.getBizType());
+            result.add(userCouponVo);
         }
         return result;
     }
@@ -170,7 +176,7 @@ public class ApiUserCouponService {
         BigDecimal total = new BigDecimal(0);
         for (CartVo vo: cartGoodsList) {
             for(MkStoreTicketDiscountVo discountVo: discountVoList){
-                if(discountVo.getTickDiscId() == tickDistId){
+                if(discountVo.getTickDiscId() == tickDistId && discountVo.getGoodsId().compareTo(vo.getGoods_id().intValue()) == 0){
                     total = total.add(vo.getRetail_price().multiply(BigDecimal.valueOf(vo.getNumber())));
                 }
             }

+ 123 - 0
kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreCampMinusGoodsService.java

@@ -0,0 +1,123 @@
+package com.kmall.api.service.mk;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Maps;
+import com.kmall.api.dao.ApiCategoryMapper;
+import com.kmall.api.dao.ApiGoodsMapper;
+import com.kmall.api.dao.ApiStoreMapper;
+import com.kmall.api.dao.ApiThirdMerchantBizMapper;
+import com.kmall.api.dao.mk.ApiMkStoreCampMinusGoodsMapper;
+import com.kmall.api.dao.mk.ApiMkStoreCampMinusMapper;
+import com.kmall.api.entity.*;
+import com.kmall.api.entity.mk.MkStoreCampMinusVo;
+import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
+import com.kmall.api.service.ApiCategoryService;
+import com.kmall.api.service.ApiStoreService;
+import com.kmall.api.service.ApiThirdMerchantBizService;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.RRException;
+import com.qiniu.util.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减满折活动商品Service实现类
+ * @author huangyq
+ * @version 1.0
+ * 2019-06-11 09:32
+ */
+@Service
+public class ApiMkStoreCampMinusGoodsService {
+    private Log logger = LogFactory.getLog(ApiMkStoreCampMinusGoodsService.class);
+    @Autowired
+    private ApiMkStoreCampMinusMapper mkStoreCampMinusMapper;
+    @Autowired
+    private ApiMkStoreCampMinusGoodsMapper apiMkStoreCampMinusGoodsMapper;
+    @Autowired
+    private ApiGoodsMapper apiGoodsMapper;
+    @Autowired
+    private ApiThirdMerchantBizMapper apiThirdMerchantBizMapper;
+    @Autowired
+    private ApiStoreMapper apiStoreMapper;
+    @Autowired
+    private ApiCategoryService categoryService;
+
+    public Map getStoreCampMinusGoodsList(Integer storeId, Integer categoryId, Integer campMinusId,
+                                                 Integer page, Integer size, String sort, String order){
+        MkStoreCampMinusVo storeCampMinusVo = mkStoreCampMinusMapper.queryObject(campMinusId);
+        if(storeCampMinusVo == null){
+            logger.error("满减满折活动信息不存在");
+            throw new RRException("满减满折活动信息不存在");
+        }
+        Map reusltObj = Maps.newHashMap();
+        if(storeId == null){
+            logger.error("门店id不能为空");
+            throw new RRException("门店id不能为空");
+        }
+        StoreVo storeVo = apiStoreMapper.queryObject(Long.valueOf(storeId));
+        ThirdMerchantBizVo thirdMerchantBiz = new ThirdMerchantBizVo();
+        if(storeVo != null) {
+            thirdMerchantBiz = apiThirdMerchantBizMapper.getThirdMerchangByCode(storeVo.getThirdPartyMerchCode());
+            if (null == thirdMerchantBiz) {
+                logger.error("第三方商户不存在");
+                throw new RRException("第三方商户不存在");
+            }
+        }
+
+        Map params = Maps.newHashMap();
+        //筛选的分类
+        List<CategoryVo> filterCategory = new ArrayList();
+        CategoryVo rootCategory = new CategoryVo();
+        rootCategory.setId(0);
+        rootCategory.setName("全部");
+        rootCategory.setChecked(false);
+        filterCategory.add(rootCategory);
+        //
+        params.put("fields", "psr1.category_id");
+        params.put("store_id", storeId);
+        params.put("campMinusId",campMinusId);
+        params.put("applyType", storeCampMinusVo.getApplyType());
+        params.put("goodsBizType", storeCampMinusVo.getGoodsBizType());
+
+        List<GoodsVo> goodsEntityList = apiGoodsMapper.queryList(params);
+        params.remove("fields");
+        filterCategory.addAll(categoryService.getFilterCategory(goodsEntityList, filterCategory));
+
+        params.put("category_parent_id", categoryId);
+        params.put("fields", "a.id,a.name,a.goods_brief,a.list_pic_url,psr1.retail_price," +
+                "psr1.market_price,b.id as product_id,psr1.stock_num");
+        params.put("is_hot", "1");
+        params.put("is_delete", 0);
+        params.put("store_id", storeId);
+        if (!StringUtils.isNullOrEmpty(sort) && !StringUtils.isNullOrEmpty(order)) {
+            if (sort.equals("price")) {
+                params.put("sidx", "psr1.retail_price");
+                params.put("order", order);
+            }
+        }
+
+        reusltObj.put("filterCategory", filterCategory);
+        params.put("isStockShare", thirdMerchantBiz.getIsStockShare());
+
+        params.put("page", page);
+        params.put("limit", size);
+        Query query = new Query(params);
+        List<GoodsVo> mkStoreTicketDiscountList = apiMkStoreCampMinusGoodsMapper.queryCampMinusGoodsList(query);
+        Integer goodsCount = apiMkStoreCampMinusGoodsMapper.queryCampMinusGoodsTotal(query);
+        if (null != mkStoreTicketDiscountList && mkStoreTicketDiscountList.size() > 0) {
+            for (GoodsVo goodsVo : mkStoreTicketDiscountList) {
+                goodsVo.setCart_num(goodsVo.getCart_num()==null?0:goodsVo.getCart_num());
+            }
+        }
+        reusltObj.put("goodsList", mkStoreTicketDiscountList);
+        reusltObj.put("goodsCount", goodsCount);
+
+        return reusltObj;
+    }
+}

+ 414 - 0
kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreCampMinusService.java

@@ -0,0 +1,414 @@
+package com.kmall.api.service.mk;
+
+import com.google.common.collect.Maps;
+import com.kmall.api.dao.ApiGoodsMapper;
+import com.kmall.api.dao.ApiOrderMapper;
+import com.kmall.api.dao.mk.*;
+import com.kmall.api.dto.CampMinusDto;
+import com.kmall.api.dto.UserCouponDto;
+import com.kmall.api.entity.CartVo;
+import com.kmall.api.entity.GoodsVo;
+import com.kmall.api.entity.StoreVo;
+import com.kmall.api.entity.ThirdMerchantBizVo;
+import com.kmall.api.entity.mk.MkStoreCampMinusLevelVo;
+import com.kmall.api.entity.mk.MkStoreCampMinusVo;
+import com.kmall.api.service.ApiStoreService;
+import com.kmall.api.service.ApiThirdMerchantBizService;
+import com.kmall.common.constant.Dict;
+import com.kmall.common.utils.Constant;
+import com.kmall.common.utils.DateUtils;
+import com.kmall.common.utils.RRException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 门店满减满折活动Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-07 16:06:28
+ */
+@Service
+public class ApiMkStoreCampMinusService {
+    private Log logger = LogFactory.getLog(ApiMkStoreCampMinusService.class);
+    @Autowired
+    private ApiMkStoreCampMinusMapper mkStoreCampMinusMapper;
+    @Autowired
+    private ApiMkStoreCampMinusGoodsMapper apiMkStoreCampMinusGoodsMapper;
+    @Autowired
+    private ApiMkStoreCampMinusLevelMapper apiMkStoreCampMinusLevelMapper;
+    @Autowired
+    private ApiGoodsMapper apiGoodsMapper;
+    @Autowired
+    private ApiThirdMerchantBizService apiThirdMerchantBizService;
+    @Autowired
+    private ApiStoreService apiStoreService;
+    @Autowired
+    private ApiOrderMapper apiOrderMapper;
+
+    public MkStoreCampMinusVo queryObject(Integer campMinusId) {
+        MkStoreCampMinusVo mkStoreCampMinusVo = mkStoreCampMinusMapper.queryObject(campMinusId);
+        if(mkStoreCampMinusVo != null){
+            StoreVo storeVo = apiStoreService.queryObject(Long.valueOf(mkStoreCampMinusVo.getStoreId()));
+            if(storeVo != null) {
+                mkStoreCampMinusVo.setStoreName(storeVo.getStoreName());
+            }
+            String invalidTime = DateUtils.format(mkStoreCampMinusVo.getCampBegTime(),DateUtils.DATE_TIME_PATTERN) +
+                    " 至 " + DateUtils.format(mkStoreCampMinusVo.getCampEndTime(),DateUtils.DATE_TIME_PATTERN);
+            mkStoreCampMinusVo.setInValidTime(invalidTime);
+        }
+        return mkStoreCampMinusVo;
+    }
+
+    public List<MkStoreCampMinusVo> queryList(Map<String, Object> map) {
+        return mkStoreCampMinusMapper.queryList(map);
+    }
+
+    public int queryTotal(Map<String, Object> map) {
+        return mkStoreCampMinusMapper.queryTotal(map);
+    }
+
+
+    /**
+     * 查询详情页商品所支持的优惠券
+     * @param storeId
+     * @param userId
+     * @param goodsId
+     * @return
+     */
+    public List<MkStoreCampMinusVo> queryStoreCampMinusByGoodsId(Integer storeId, long userId, Integer goodsId){
+        GoodsVo goodsVo = apiGoodsMapper.queryObjectByStoreId(Long.valueOf(goodsId),Long.valueOf(storeId));
+        if(goodsVo == null){
+            logger.error("商品信息不能为空");
+            throw new RRException("商品信息不能为空");
+        }
+        //查询该门店下的所有满减满折活动
+        Map discountMap = Maps.newHashMap();
+        discountMap.put("storeId", storeId);
+        discountMap.put("goodsBizType", goodsVo.getGoodsBizType());
+        discountMap.put("isPast", "0");//进行中
+        //详情页根据门店id、用户id、业务类型获取当前门店所有的未过期的满减满折信息
+        List<MkStoreCampMinusVo> mkStoreTicketDiscountList = mkStoreCampMinusMapper.getCampMinusByStoreIdList(discountMap);
+        List<MkStoreCampMinusVo> campMinusVos = new ArrayList<>();
+        for (MkStoreCampMinusVo campMinusVo : mkStoreTicketDiscountList) {
+            //查询商品是否满足该满减满折
+            Integer total = queryCampMinusGoodsTotal(storeId, goodsId, campMinusVo);
+            campMinusVo.setGoodsId(goodsId);
+            if(total > 0){
+                campMinusVos.add(campMinusVo);
+            }
+        }
+        return campMinusVos;
+    }
+    /**
+     * 查询商品是否满足该满减满折活动
+     * @param storeId
+     * @param goodsId
+     * @param campMinusVo
+     * @return
+     */
+    public Integer queryCampMinusGoodsTotal(Integer storeId, Integer goodsId, MkStoreCampMinusVo campMinusVo){
+        if(storeId == null){
+            logger.error("门店id不能为空");
+            throw new RRException("门店id不能为空");
+        }
+        StoreVo storeVo = apiStoreService.queryObject(Long.valueOf(storeId));
+        ThirdMerchantBizVo thirdMerchantBiz = new ThirdMerchantBizVo();
+        if(storeVo != null) {
+            thirdMerchantBiz = apiThirdMerchantBizService.getThirdMerchangByCode(storeVo.getThirdPartyMerchCode());
+            if (null == thirdMerchantBiz) {
+                logger.error("第三方商户为空");
+                throw new RRException("第三方商户为空");
+            }
+        }
+        Map params = Maps.newHashMap();
+        params.put("fields", "psr1.category_id");
+        params.put("store_id", storeId);
+        params.put("campMinusId", campMinusVo.getCampMinusId());
+        params.put("applyType", campMinusVo.getApplyType());
+
+        params.remove("fields");
+
+        params.put("fields", "a.id,a.name,a.goods_brief,a.list_pic_url,psr1.retail_price," +
+                "psr1.market_price,b.id as product_id,psr1.stock_num");
+        params.put("is_hot", "1");
+        params.put("is_delete", 0);
+        params.put("store_id", storeId);
+        params.put("isStockShare", thirdMerchantBiz.getIsStockShare());
+        params.put("goodsId", goodsId);
+
+        return apiMkStoreCampMinusGoodsMapper.queryCampMinusGoodsTotal(params);
+    }
+
+    /**
+     * 匹配可使用的满减满折活动
+     *
+     * @param userCouponDto
+     * @return
+     */
+    public List<CampMinusDto> matchUserCampMinusList(UserCouponDto userCouponDto) {
+        List<CampMinusDto> result = new ArrayList();
+        List<MkStoreCampMinusVo> switchList = new ArrayList();
+        List<CartVo> cartVoList = userCouponDto.getCartGoodsList();
+        if(cartVoList == null || cartVoList.size() == 0){
+            return result;
+        }
+        //查询购物车商品所支持的满减满折活动
+        Map map = queryStoreCampMinusByCartGoodsId(userCouponDto);
+        List<MkStoreCampMinusVo> mkStoreCampMinusList = (List<MkStoreCampMinusVo>)map.get("mkStoreCampMinusList");
+        if(mkStoreCampMinusList != null && mkStoreCampMinusList.size() > 0){
+            for (MkStoreCampMinusVo minusVo : mkStoreCampMinusList) {
+                //满元减且满足最高层级减一次,获取最高优惠进行对购物车的比较
+                if(minusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem()) && minusVo.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())){
+                    //查询当前用户是否已用过该促销满减活动,不能大于0,只满足最高层级减一次
+                    Integer checkCampByUserCount = mkStoreCampMinusMapper.queryOrderCountByUserIdAndCampId(userCouponDto.getUserId(),minusVo.getCampMinusId());
+                    if(checkCampByUserCount == 0) {
+                        MkStoreCampMinusLevelVo levelVo = apiMkStoreCampMinusLevelMapper.queryYuanCondByCampMinusId(minusVo.getCampMinusId(), Dict.campMinusType.item_00.getItem(), Dict.minusMode.item_00.getItem());
+                        BigDecimal cond = levelVo.getYuanMinusCond();
+                        BigDecimal money = levelVo.getYuanMinusPref();
+                        //获取购物车中商品支持的优惠活动,对该优惠活动的条件进行比较
+                        getResultByCheckCond(minusVo, cartVoList, cond, money, result, switchList);
+                    }
+                }
+                //满件减且满足最高层级减一次,获取最高优惠进行对购物车的比较
+                if(minusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem()) && minusVo.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())){
+                    //查询当前用户是否已用过该促销满减活动,不能大于0,只满足最高层级减一次
+                    Integer checkCampByUserCount = mkStoreCampMinusMapper.queryOrderCountByUserIdAndCampId(userCouponDto.getUserId(),minusVo.getCampMinusId());
+                    if(checkCampByUserCount == 0) {
+                        MkStoreCampMinusLevelVo levelVo = apiMkStoreCampMinusLevelMapper.queryPieceConfByCampMinusId(minusVo.getCampMinusId(), Dict.campMinusType.item_01.getItem(), Dict.minusMode.item_00.getItem());
+                        Integer pieceConf = levelVo.getPieceMinusConf();//件数
+                        BigDecimal money = levelVo.getPieceMinusPref();
+                        getResultByCheckPieceConf(minusVo, cartVoList, pieceConf, money, result, switchList);
+                    }
+                }
+                //满元减且每满一次减一次,获取最高优惠进行对购物车的比较
+                if(minusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem()) && minusVo.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())){
+                    MkStoreCampMinusLevelVo levelVo = apiMkStoreCampMinusLevelMapper.queryYuanCondByCampMinusId(minusVo.getCampMinusId(), Dict.campMinusType.item_00.getItem(), Dict.minusMode.item_10.getItem());
+                    BigDecimal cond = levelVo.getYuanMinusCond();
+                    BigDecimal money = levelVo.getYuanMinusPref();
+                    BigDecimal moneyEachDisc = levelVo.getPieceMinusEachDisc();//满减件每人优惠
+                    if(moneyEachDisc.compareTo(Constant.ZERO) == 0){
+                        getResultByCheckCond(minusVo, cartVoList, cond, money, result, switchList);
+                    }else {
+                        //获取当前用户用该优惠的订单个数
+                        Integer count = apiOrderMapper.queryTopicNumByTopicIdAndUserId(minusVo.getStoreTopicId(), userCouponDto.getUserId());
+                        BigDecimal totalDisc = Constant.ZERO;
+                        //订单个数*优惠金额 = 该满减活动使用总金额
+                        if (count != 0) {
+                            totalDisc = money.multiply(BigDecimal.valueOf(count));
+                        }
+                        //该满减活动使用总金额<满减活动每人最多优惠金额,则可使用
+                        if (totalDisc.compareTo(moneyEachDisc) < 0) {
+                            getResultByCheckCond(minusVo, cartVoList, cond, money, result, switchList);
+                        }
+                    }
+                }
+                //满件减且每满一次减一次,获取最高优惠进行对购物车的比较
+                if(minusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem()) && minusVo.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())){
+                    MkStoreCampMinusLevelVo levelVo = apiMkStoreCampMinusLevelMapper.queryPieceConfByCampMinusId(minusVo.getCampMinusId(), Dict.campMinusType.item_01.getItem(), Dict.minusMode.item_10.getItem());
+                    Integer pieceConf = levelVo.getPieceMinusConf();
+                    BigDecimal money = levelVo.getPieceMinusPref();
+                    BigDecimal moneyEachDisc = levelVo.getPieceMinusEachDisc();//满减件每人优惠
+                    if(moneyEachDisc.compareTo(Constant.ZERO) == 0){
+                        getResultByCheckPieceConf(minusVo, cartVoList, pieceConf, money, result, switchList);
+                    }else {
+                        //获取当前用户用该优惠的订单个数
+                        Integer count = apiOrderMapper.queryTopicNumByTopicIdAndUserId(minusVo.getStoreTopicId(), userCouponDto.getUserId());
+                        BigDecimal totalDisc = Constant.ZERO;
+                        //订单个数*优惠金额 = 该满减活动使用总金额
+                        if (count != 0) {
+                            totalDisc = money.multiply(BigDecimal.valueOf(count));
+                        }
+                        //该满减活动使用总金额<满减活动每人最多优惠金额,则可使用
+                        if (totalDisc.compareTo(moneyEachDisc) < 0) {
+                            getResultByCheckPieceConf(minusVo, cartVoList, pieceConf, money, result, switchList);
+                        }
+                    }
+                }
+                //满元折,获取最高优惠进行对购物车的比较
+                if(minusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_10.getItem())){
+                    //查询当前用户是否已用过该促销满减活动,不能大于0,只满足最高层级减一次
+                    Integer checkCampByUserCount = mkStoreCampMinusMapper.queryOrderCountByUserIdAndCampId(userCouponDto.getUserId(),minusVo.getCampMinusId());
+                    if(checkCampByUserCount == 0) {
+                        MkStoreCampMinusLevelVo levelVo = apiMkStoreCampMinusLevelMapper.queryDiscCondByCampMinusId(minusVo.getCampMinusId());
+                        BigDecimal cond = levelVo.getYuanDiscCond();
+                        BigDecimal money = levelVo.getYuanDiscPref();
+                        getResultByCheckCond(minusVo, cartVoList, cond, money, result, switchList);
+                    }
+                }
+                //满件折,获取最高优惠进行对购物车的比较
+                if(minusVo.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_11.getItem())){
+                    //查询当前用户是否已用过该促销满减活动,不能大于0,只满足最高层级减一次
+                    Integer checkCampByUserCount = mkStoreCampMinusMapper.queryOrderCountByUserIdAndCampId(userCouponDto.getUserId(),minusVo.getCampMinusId());
+                    if(checkCampByUserCount == 0) {
+                        MkStoreCampMinusLevelVo levelVo = apiMkStoreCampMinusLevelMapper.queryDiscConfByCampMinusId(minusVo.getCampMinusId());
+                        Integer pieceConf = levelVo.getPieceDiscConf();
+                        BigDecimal money = levelVo.getPieceDiscPref();
+                        getResultByCheckPieceConf(minusVo, cartVoList, pieceConf, money, result, switchList);
+                    }
+                }
+            }
+            if(result != null && result.size() > 0) {
+                CampMinusDto campMinusDto = new CampMinusDto();
+                campMinusDto.setCampMinusId(0);
+                campMinusDto.setCampName("不参与满减活动");
+                campMinusDto.setMoney(Constant.ZERO);
+                campMinusDto.setGoodsBizType(userCouponDto.getBizType());
+                result.add(campMinusDto);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 获取购物车中的商品id,判断是否满足满减满折优惠的满元减、折条件,返回满足的list
+     * @param minusVo
+     * @param cartVoList
+     * @param pieceConf
+     * @param result
+     * @param switchList
+     */
+    private void getResultByCheckPieceConf(MkStoreCampMinusVo minusVo,List<CartVo> cartVoList,
+                                           Integer pieceConf, BigDecimal money, List<CampMinusDto> result,List<MkStoreCampMinusVo> switchList){
+        if(minusVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())){//全部商品参与
+            //计算购物车中满足部分商品的销售价
+            BigDecimal totalByGoodsId = getTotalByGoodsId(cartVoList, minusVo);
+            //计算购物车中满足部分商品的件数
+            Integer pieceByGoodsId = getPieceByGoodsId(cartVoList, minusVo);
+            //购物车中件数>满减件,去重
+            if (pieceByGoodsId.compareTo(pieceConf) >= 0 && totalByGoodsId.compareTo(money) > 0 && containsList(switchList,minusVo)) {
+                CampMinusDto campMinusDto = setCampMinus(minusVo, money);
+                result.add(campMinusDto);
+                switchList.add(minusVo);
+            }
+        }
+        if(!minusVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())) {//部分商品参与
+            //计算购物车中满足部分商品的销售价
+            BigDecimal totalByGoodsId = getTotalByGoodsId(cartVoList, minusVo);
+            //计算购物车中满足部分商品的件数
+            Integer pieceByGoodsId = getPieceByGoodsId(cartVoList, minusVo);
+            //购物车中件数>满减件,去重
+            if(pieceByGoodsId.compareTo(pieceConf) >= 0 && totalByGoodsId.compareTo(money) > 0 && containsList(switchList,minusVo)){
+                CampMinusDto campMinusDto = setCampMinus(minusVo, money);
+                result.add(campMinusDto);
+                switchList.add(minusVo);
+            }
+        }
+    }
+
+    /**
+     * 获取购物车中的商品id,判断是否满足满减满折优惠的满件减、折条件,返回满足的list
+     * @param minusVo
+     * @param cartVoList
+     * @param cond
+     * @param money
+     * @param result
+     * @param switchList
+     */
+    private void getResultByCheckCond(MkStoreCampMinusVo minusVo,List<CartVo> cartVoList,
+                                  BigDecimal cond, BigDecimal money, List<CampMinusDto> result,List<MkStoreCampMinusVo> switchList){
+        if(minusVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())){//全部商品参与
+            //计算购物车中满足部分商品的销售价
+            BigDecimal totalByGoodsId = getTotalByGoodsId(cartVoList, minusVo);
+            //销售价>满减价,去重
+            if (totalByGoodsId.compareTo(cond) >= 0 && totalByGoodsId.compareTo(money) > 0 && containsList(switchList,minusVo)) {
+                CampMinusDto campMinusDto = setCampMinus(minusVo, money);
+                result.add(campMinusDto);
+                switchList.add(minusVo);
+            }
+        }
+        if(!minusVo.getApplyType().equalsIgnoreCase(Dict.applyType.item_00.getItem())) {//部分商品参与
+            //计算购物车中满足部分商品的销售价
+            BigDecimal totalByGoodsId = getTotalByGoodsId(cartVoList,minusVo);
+            //销售价>满减价,去重
+            if(totalByGoodsId.compareTo(cond) >= 0 && totalByGoodsId.compareTo(money) > 0 && containsList(switchList,minusVo)){
+                CampMinusDto campMinusDto = setCampMinus(minusVo, money);
+                result.add(campMinusDto);
+                switchList.add(minusVo);
+            }
+        }
+    }
+
+    /**
+     * 获取购物车中满足满减满折优惠的商品件数
+     * @param cartGoodsList
+     * @param minusVo
+     * @return
+     */
+    private Integer getPieceByGoodsId(List<CartVo> cartGoodsList, MkStoreCampMinusVo minusVo){
+        Integer total = 0;
+        for (CartVo vo: cartGoodsList) {
+            if(minusVo.getGoodsId().compareTo(vo.getGoods_id().intValue()) == 0
+                    && minusVo.getStoreId().compareTo(vo.getStore_id().intValue()) == 0 && minusVo.getGoodsBizType().equalsIgnoreCase(vo.getGoodsBizType())){
+                total = total + vo.getNumber();
+            }
+        }
+        return total;
+    }
+
+    /**
+     * 获取可支持满减满折优惠的商品总销售价
+     * @param cartGoodsList
+     * @param minusVo
+     * @return
+     */
+    private BigDecimal getTotalByGoodsId(List<CartVo> cartGoodsList, MkStoreCampMinusVo minusVo){
+        BigDecimal total = new BigDecimal(0);
+        for (CartVo vo: cartGoodsList) {
+            if(minusVo.getGoodsId().compareTo(vo.getGoods_id().intValue()) == 0 && minusVo.getStoreId().compareTo(vo.getStore_id().intValue()) == 0 && minusVo.getGoodsBizType().equalsIgnoreCase(vo.getGoodsBizType())){
+                total = total.add(vo.getRetail_price().multiply(BigDecimal.valueOf(vo.getNumber())));
+            }
+        }
+        return total;
+    }
+    /**
+     * 去重
+     * @param switchList
+     * @param minusVo
+     * @return
+     */
+    private Boolean containsList(List<MkStoreCampMinusVo> switchList, MkStoreCampMinusVo minusVo){
+        for (MkStoreCampMinusVo vo: switchList) {
+            if(vo.getCampMinusId().equals(minusVo.getCampMinusId())){
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private CampMinusDto setCampMinus(MkStoreCampMinusVo minusVo, BigDecimal money){
+        CampMinusDto campMinusDto = new CampMinusDto();
+        campMinusDto.setCampMinusType(minusVo.getCampMinusType());
+        campMinusDto.setCampName(minusVo.getCampName());
+        campMinusDto.setMoney(money);
+        campMinusDto.setCampMinusId(minusVo.getCampMinusId());
+        campMinusDto.setGoodsBizType(minusVo.getGoodsBizType());
+        return campMinusDto;
+    }
+    /**
+     * 查询购物车商品所支持的满减满折活动
+     * @param userCouponDto
+     * @return
+     */
+    public Map queryStoreCampMinusByCartGoodsId(UserCouponDto userCouponDto){
+        Integer storeId = Integer.parseInt(String.valueOf(userCouponDto.getStoreId()));
+        long userId= userCouponDto.getUserId();
+        List<CartVo> cartList = userCouponDto.getCartGoodsList();
+        String bizType = userCouponDto.getBizType();
+        List<MkStoreCampMinusVo> mkStoreCampMinusList = new ArrayList<>();
+        for(CartVo cartVo: cartList){
+            if(bizType.equalsIgnoreCase(cartVo.getGoodsBizType())) {
+                Integer goodsId = Integer.parseInt(String.valueOf(cartVo.getGoods_id()));
+                mkStoreCampMinusList = queryStoreCampMinusByGoodsId(storeId, userId, goodsId);
+            }
+        }
+        Map map = new HashMap();
+        map.put("mkStoreCampMinusList", mkStoreCampMinusList);
+        return map;
+    }
+}

+ 100 - 0
kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreTicketDiscountGoodsService.java

@@ -1,11 +1,27 @@
 package com.kmall.api.service.mk;
 
+import com.google.common.collect.Maps;
+import com.kmall.api.dao.ApiGoodsMapper;
+import com.kmall.api.dao.ApiStoreMapper;
+import com.kmall.api.dao.ApiThirdMerchantBizMapper;
 import com.kmall.api.dao.mk.ApiMkStoreTicketDiscountGoodsMapper;
+import com.kmall.api.dao.mk.ApiMkStoreTicketDiscountMapper;
+import com.kmall.api.entity.CategoryVo;
 import com.kmall.api.entity.GoodsVo;
+import com.kmall.api.entity.StoreVo;
+import com.kmall.api.entity.ThirdMerchantBizVo;
 import com.kmall.api.entity.mk.MkStoreTicketDiscountGoodsVo;
+import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
+import com.kmall.api.service.ApiCategoryService;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.RRException;
+import com.qiniu.util.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -19,8 +35,19 @@ import java.util.Map;
  */
 @Service
 public class ApiMkStoreTicketDiscountGoodsService{
+    private Log logger = LogFactory.getLog(ApiMkStoreTicketDiscountGoodsService.class);
     @Autowired
     private ApiMkStoreTicketDiscountGoodsMapper apiMkStoreTicketDiscountGoodsMapper;
+    @Autowired
+    private ApiGoodsMapper apiGoodsMapper;
+    @Autowired
+    private ApiThirdMerchantBizMapper apiThirdMerchantBizMapper;
+    @Autowired
+    private ApiStoreMapper apiStoreMapper;
+    @Autowired
+    private ApiCategoryService categoryService;
+    @Autowired
+    private ApiMkStoreTicketDiscountMapper apiMkStoreTicketDiscountMapper;
 
     public MkStoreTicketDiscountGoodsVo queryObject(Integer discGoodId) {
         return apiMkStoreTicketDiscountGoodsMapper.queryObject(discGoodId);
@@ -41,4 +68,77 @@ public class ApiMkStoreTicketDiscountGoodsService{
     public Integer queryDiscountGoodsTotal(Map map){
         return apiMkStoreTicketDiscountGoodsMapper.queryDiscountGoodsTotal(map);
     }
+
+    public Map getStoreTicketDiscountGoodsList(Integer storeId, Integer categoryId, Integer tickDiscId,
+                                               Integer page, Integer size, String sort, String order){
+        MkStoreTicketDiscountVo discountVo = apiMkStoreTicketDiscountMapper.queryObject(tickDiscId);
+        if(discountVo == null){
+            logger.error("优惠券信息不存在");
+            throw new RRException("优惠券信息不存在");
+        }
+        Map reusltObj = Maps.newHashMap();
+        if(storeId == null){
+            logger.error("门店id不能为空");
+            throw new RRException("门店id不能为空");
+        }
+        StoreVo storeVo = apiStoreMapper.queryObject(Long.valueOf(storeId));
+        ThirdMerchantBizVo thirdMerchantBiz = new ThirdMerchantBizVo();
+        if(storeVo != null) {
+            thirdMerchantBiz = apiThirdMerchantBizMapper.getThirdMerchangByCode(storeVo.getThirdPartyMerchCode());
+            if (null == thirdMerchantBiz) {
+                logger.error("第三方商户不存在");
+                throw new RRException("第三方商户不存在");
+            }
+        }
+
+        Map params = Maps.newHashMap();
+        //筛选的分类
+        List<CategoryVo> filterCategory = new ArrayList();
+        CategoryVo rootCategory = new CategoryVo();
+        rootCategory.setId(0);
+        rootCategory.setName("全部");
+        rootCategory.setChecked(false);
+        filterCategory.add(rootCategory);
+        //
+        params.put("fields", "psr1.category_id");
+        params.put("store_id", storeId);
+        params.put("tickDiscId",tickDiscId);
+        params.put("applyType", discountVo.getApplyType());
+        params.put("goodsBizType", discountVo.getGoodsBizType());
+
+        List<GoodsVo> goodsEntityList = apiGoodsMapper.queryList(params);
+        params.remove("fields");
+        filterCategory.addAll(categoryService.getFilterCategory(goodsEntityList, filterCategory));
+
+        params.put("category_parent_id", categoryId);
+        params.put("fields", "a.id,a.name,a.goods_brief,a.list_pic_url,psr1.retail_price," +
+                "psr1.market_price,b.id as product_id,psr1.stock_num");
+        params.put("is_hot", "1");
+        params.put("is_delete", 0);
+        params.put("store_id", storeId);
+        if (!StringUtils.isNullOrEmpty(sort) && !StringUtils.isNullOrEmpty(order)) {
+            if (sort.equals("price")) {
+                params.put("sidx", "psr1.retail_price");
+                params.put("order", order);
+            }
+        }
+
+        reusltObj.put("filterCategory", filterCategory);
+        params.put("isStockShare", thirdMerchantBiz.getIsStockShare());
+
+        params.put("page", page);
+        params.put("limit", size);
+        Query query = new Query(params);
+        List<GoodsVo> mkStoreTicketDiscountList = apiMkStoreTicketDiscountGoodsMapper.queryDiscountGoodsList(query);
+        Integer goodsCount = apiMkStoreTicketDiscountGoodsMapper.queryDiscountGoodsTotal(query);
+        if (null != mkStoreTicketDiscountList && mkStoreTicketDiscountList.size() > 0) {
+            for (GoodsVo goodsVo : mkStoreTicketDiscountList) {
+                goodsVo.setCart_num(goodsVo.getCart_num()==null?0:goodsVo.getCart_num());
+            }
+        }
+        reusltObj.put("goodsList", mkStoreTicketDiscountList);
+        reusltObj.put("goodsCount", goodsCount);
+
+        return reusltObj;
+    }
 }

+ 41 - 8
kmall-api/src/main/java/com/kmall/api/service/mk/ApiMkStoreTopicStatService.java

@@ -1,5 +1,6 @@
 package com.kmall.api.service.mk;
 
+import com.google.common.collect.Maps;
 import com.kmall.api.dao.ApiOrderMapper;
 import com.kmall.api.dao.ApiUserCouponMapper;
 import com.kmall.api.dao.mk.ApiMkStoreTopicStatMapper;
@@ -8,10 +9,8 @@ import com.kmall.api.dao.mk.ApiStoreTopicMapper;
 import com.kmall.api.entity.OrderGoodsVo;
 import com.kmall.api.entity.OrderVo;
 import com.kmall.api.entity.UserVo;
-import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
-import com.kmall.api.entity.mk.MkStoreTopicStatVo;
-import com.kmall.api.entity.mk.MkStoreTopicVisitorsVo;
-import com.kmall.api.entity.mk.StoreTopicVo;
+import com.kmall.api.entity.mk.*;
+import com.kmall.common.utils.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -98,9 +97,9 @@ public class ApiMkStoreTopicStatService {
             mkStoreTopicStatVo.setStoreId(Integer.parseInt(String.valueOf(storeId)));
 
             if (storeTopicStatVo != null) {
-                mkStoreTopicStatVo.setBrowseNum(storeTopicStatVo.getBrowseNum()==null?0:storeTopicStatVo.getBrowseNum() + 1);
+                mkStoreTopicStatVo.setBrowseNum(storeTopicStatVo.getBrowseNum()==null?1:storeTopicStatVo.getBrowseNum() + 1);
                 mkStoreTopicStatVo.setVisitNum(visitNum);
-                mkStoreTopicStatVo.setRelaBrowseNum(storeTopicStatVo.getRelaBrowseNum()==null?0:storeTopicStatVo.getRelaBrowseNum() + 1);//连带浏览量
+                mkStoreTopicStatVo.setRelaBrowseNum(storeTopicStatVo.getRelaBrowseNum()==null?1:storeTopicStatVo.getRelaBrowseNum() + 1);//连带浏览量
                 mkStoreTopicStatVo.setRelaVisitorNum(visitNum);//连带访客量
                 mkStoreTopicStatVo.setTransVisitorNum(visitNum);//转发访客量:用户转发了带有推广id的商品,其他的用户点击的访客量
                 mkStoreTopicStatVo.setStoreTopicId(storeTopicVo.getId());
@@ -121,10 +120,10 @@ public class ApiMkStoreTopicStatService {
     }
 
     /**
-     * 记录活动营销统计下单量数据
+     * 记录优惠券活动营销统计下单量数据
      * @param userCouponId
      */
-    public void saveStoreTopicStatBySubmitData(Integer userCouponId){
+    public void saveTicketTopicStatBySubmitData(Integer userCouponId){
         if(userCouponId != null) {
             //根据用户优惠券id查询统计数据
             MkStoreTopicStatVo statVo = apiMkStoreTopicStatMapper.queryStatDataByUserCouponId(userCouponId);
@@ -143,6 +142,40 @@ public class ApiMkStoreTopicStatService {
     }
 
     /**
+     * 记录促销满减活动营销统计下单量数据
+     * @param storeTopicId
+     */
+    public void saveCampTopicStatBySubmitData(Long storeTopicId, Integer campMinusId){
+        if(storeTopicId != null) {
+            StoreTopicVo storeTopicVo = apiStoreTopicMapper.queryObject(storeTopicId);
+            if(storeTopicVo != null) {
+                //根据用户优惠券id查询统计数据
+                MkStoreTopicStatVo statVo = apiMkStoreTopicStatMapper.queryCampByOrder(campMinusId);
+                MkStoreTopicStatVo mkStoretatVo = new MkStoreTopicStatVo();
+                //获取订单表中根据活动id查询下单人数
+                List<Map> submitNumList = apiMkStoreTopicStatMapper.querySubmitNumByCampOrder(storeTopicVo.getId());
+                Integer submitNum = submitNumList != null ? submitNumList.size() : 0;
+                if (statVo != null) {
+                    Integer storeTopicStatId = statVo.getStoreTopicStatId();
+                    Integer submitOrderNum = statVo.getSubmitOrderNum();
+                    mkStoretatVo.setSubmitNum(submitNum == null ? 0 : submitNum);//下单人数
+                    mkStoretatVo.setSubmitOrderNum(submitOrderNum);//下单单数
+                    mkStoretatVo.setStoreTopicStatId(storeTopicStatId);
+                    apiMkStoreTopicStatMapper.update(mkStoretatVo);
+                } else {
+                    mkStoretatVo.setStoreId(storeTopicVo.getStoreId());
+                    mkStoretatVo.setStoreTopicId(storeTopicVo.getId());
+                    mkStoretatVo.setSubmitNum(submitNum == null ? 0 : submitNum);//下单人数
+                    mkStoretatVo.setSubmitOrderNum(1);//下单单数
+                    mkStoretatVo.setIsValid("0");
+                    mkStoretatVo.setVisitPageDeep(1);
+                    apiMkStoreTopicStatMapper.save(mkStoretatVo);
+                }
+            }
+        }
+    }
+
+    /**
      * 记录活动营销统计领取量数据
      * @param userCouponId
      */

+ 91 - 0
kmall-api/src/main/java/com/kmall/api/util/StockUtil.java

@@ -0,0 +1,91 @@
+package com.kmall.api.util;
+
+import com.kmall.api.entity.CartVo;
+import com.kmall.api.entity.GoodsVo;
+import com.kmall.api.entity.StoreVo;
+import com.kmall.api.entity.ThirdMerchantBizVo;
+import com.kmall.api.service.ApiStoreService;
+import com.kmall.api.service.ApiThirdMerchantBizService;
+import com.kmall.common.constant.Dict;
+
+/**
+ * @author hyq
+ * @version 1.0
+ * 2019-06-17 10:52
+ */
+public class StockUtil {
+    /**
+     * 根据规则获取库存
+     * @param info
+     * @return
+     */
+    public static Integer setStockNumByGoodsVo(GoodsVo info){
+        Integer stockNum = 0;
+        if(info.getIsSupplierGoods().equalsIgnoreCase(Dict.isSupplierGoods.item_0.getItem())) {
+            if (info.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
+                if (info.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
+                    stockNum = info.getGoods_number();
+                }
+                if (info.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
+                    stockNum = info.getStockNum();
+                }
+            } else {
+                stockNum = info.getStockNum();
+            }
+        }else{
+            if (info.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
+                if (info.getIsStockShareBySuppler().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
+                    stockNum = info.getGoods_number();
+                }
+                if (info.getIsStockShareBySuppler().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
+                    stockNum = info.getStockNum();
+                }
+            } else {
+                stockNum = info.getStockNum();
+            }
+        }
+        return stockNum;
+    }
+
+    public static String getIsStockShareByGoodsVo(GoodsVo info){
+        String isStockShare = "";
+        if(info.getIsSupplierGoods().equalsIgnoreCase(Dict.isSupplierGoods.item_0.getItem())) {
+            isStockShare = info.getIsStockShare();
+        }else{
+            isStockShare = info.getIsStockShareBySuppler();
+        }
+        return isStockShare;
+    }
+
+
+    public static String getIsStockShareByGoodsEntity(String isSupplierGoods, String goodsIsStockShare, String isStockShareBySuppler){
+        String isStockShare = "";
+        if(isSupplierGoods.equalsIgnoreCase(Dict.isSupplierGoods.item_0.getItem())) {
+            isStockShare = goodsIsStockShare;
+        }else{
+            isStockShare = isStockShareBySuppler;
+        }
+        return isStockShare;
+    }
+
+    public static String getIsStockShareByStore(Long storeId,ApiStoreService apiStoreService,ApiThirdMerchantBizService apiThirdMerchantBizService){
+        StoreVo storeVo = apiStoreService.queryObject(storeId);
+        if(storeVo != null) {
+            ThirdMerchantBizVo thirdMerchantBiz = apiThirdMerchantBizService.getThirdMerchangByCode(storeVo.getThirdPartyMerchCode());
+            if (null != thirdMerchantBiz) {
+                return thirdMerchantBiz.getIsStockShare();
+            }
+        }
+        return "";
+    }
+
+    public static String getIsStockShareByCartVo(CartVo info){
+        String isStockShare = "";
+        if(info.getIsSupplierGoods().equalsIgnoreCase(Dict.isSupplierGoods.item_0.getItem())) {
+            isStockShare = info.getIsStockShare();
+        }else{
+            isStockShare = info.getIsStockShareBySuppler();
+        }
+        return isStockShare;
+    }
+}

+ 76 - 39
kmall-api/src/main/resources/mybatis/mapper/ApiCartMapper.xml

@@ -50,17 +50,32 @@
     </select>
 
     <select id="queryList" resultMap="cartMap">
-        select a.*,
-        b.list_pic_url as list_pic_url,
-        psr.retail_price as retail_product_price,psr.stock_num 'productStockNum',
-        b.goods_number,mb.is_stock_share isStockShare,psr.store_id,b.goods_biz_type,a.goods_id
-        from mall_cart a
-        left join mall_goods b on a.goods_id = b.id
-        left join third_merchant_biz mb on b.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=b.merch_sn
-        left join mall_product c on c.goods_id = a.goods_id and c.id = a.product_id
-        left join mall_product_store_rela psr on psr.product_id = c.id and psr.store_id = #{store_id}
-        where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1
-        <if test="checkCart == null">
+        SELECT
+        mb.third_party_merch_code,
+        mb.is_stock_share isStockShare,
+        mb.is_supplier_goods 'isSupplierGoods',
+        mb2.third_party_merch_code 'supplierThirdMerchCode',
+        mb2.is_stock_share 'isStockShareBySuppler',
+        a.*,
+        b.list_pic_url AS list_pic_url,
+        psr.retail_price AS retail_product_price,
+        psr.stock_num 'productStockNum',
+        b.goods_number,
+        psr.store_id,
+        b.goods_biz_type,
+        a.goods_id
+        FROM
+        mall_cart a
+        LEFT JOIN mall_goods b ON a.goods_id = b.id
+        LEFT JOIN mall_product c ON c.goods_id = a.goods_id
+        AND c.id = a.product_id
+        LEFT JOIN mall_product_store_rela psr ON psr.product_id = c.id
+        AND psr.store_id = #{store_id}
+        LEFT JOIN mall_store s ON s.id = psr.store_id
+        LEFT JOIN third_merchant_biz mb ON s.third_party_merch_code = mb.third_party_merch_code
+        LEFT JOIN third_merchant_biz mb2 ON b.third_party_merch_code = mb2.third_party_merch_code
+        where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1 and psr.stock_num > 0
+        <!--<if test="checkCart == null">
             <if test="isStockShare == 1 and goodsBizType == 00">
                 and b.goods_number > 0
             </if>
@@ -70,7 +85,7 @@
             <if test="isStockShare == 0">
                 and psr.stock_num > 0
             </if>
-        </if>
+        </if>-->
         <!--<if test="isStockShare == 1 and (checkCart != null and checkCart != '11')">-->
             <!--and b.goods_number > 0-->
         <!--</if>-->
@@ -78,7 +93,7 @@
             <!--and psr.stock_num > 0-->
         <!--</if>-->
         <if test="checkCart != null and checkCart == '11'">
-            and psr.stock_num > 0 and b.goods_biz_type = '11'
+            and b.goods_biz_type = '11'
         </if>
         <if test="checkCart != null and checkCart != '11'">
             and b.goods_biz_type != '11'
@@ -111,15 +126,27 @@
         </if>
     </select>
 
-
     <select id="queryValidCartList" resultMap="cartMap">
-        select a.*,
-        b.list_pic_url as list_pic_url,
-        psr.retail_price as retail_product_price,psr.stock_num 'productStockNum',b.goods_number
-        from mall_cart a
-        left join mall_goods b on a.goods_id = b.id
-        left join mall_product c on c.goods_id = a.goods_id and c.id = a.product_id
-        left join mall_product_store_rela psr on psr.product_id = c.id and psr.store_id = #{store_id}
+        SELECT
+        mb.third_party_merch_code,
+        mb.is_stock_share isStockShare,
+        mb.is_supplier_goods 'isSupplierGoods',
+        mb2.third_party_merch_code 'supplierThirdMerchCode',
+        mb2.is_stock_share 'isStockShareBySuppler',
+        a.*,
+        b.list_pic_url AS list_pic_url,
+        psr.retail_price AS retail_product_price,
+        psr.stock_num 'productStockNum',
+        b.goods_number
+        FROM
+        mall_cart a
+        LEFT JOIN mall_goods b ON a.goods_id = b.id
+        LEFT JOIN mall_product c ON c.goods_id = a.goods_id
+        AND c.id = a.product_id
+        LEFT JOIN mall_product_store_rela psr ON psr.product_id = c.id  AND psr.store_id = #{store_id}
+        LEFT JOIN mall_store s ON s.id = psr.store_id
+        LEFT JOIN third_merchant_biz mb ON s.third_party_merch_code = mb.third_party_merch_code
+        LEFT JOIN third_merchant_biz mb2 ON b.third_party_merch_code = mb2.third_party_merch_code
         where 1 = 1
         <!--<if test="isStockShare == 1 and checkCart != null and checkCart != '11'">-->
         <!--and (b.goods_number = 0 or b.is_on_sale = 0)-->
@@ -128,7 +155,10 @@
         <!--and (psr.stock_num = 0 or b.is_on_sale = 0)-->
         <!--</if>-->
         <if test="checkCart != null and checkCart != '11'">
-        and b.goods_biz_type != '11'
+            and b.goods_biz_type != '11'
+        </if>
+        <if test="checkCart != null and checkCart != '11'">
+            and (psr.stock_num = 0 or b.is_on_sale = 0)
         </if>
         <if test="checkCart != null and checkCart == '11'">
             and (psr.stock_num = 0 or b.is_on_sale = 0)
@@ -149,7 +179,7 @@
             AND a.product_id = #{product_id}
         </if>
         <if test="store_id != null">
-            AND psr.store_id = #{store_id}
+            AND a.store_id = #{store_id}
         </if>
         <if test="checked != null">
             AND a.checked = #{checked}
@@ -169,34 +199,40 @@
 
     <select id="queryTotal" resultType="int">
         select count(*)
-        from mall_cart a
-        left join mall_goods b on a.goods_id = b.id
-        left join mall_product c on c.goods_id = a.goods_id and c.id = a.product_id
-        left join mall_product_store_rela psr on psr.product_id = c.id and psr.store_id = #{store_id}
+        FROM
+        mall_cart a
+        LEFT JOIN mall_goods b ON a.goods_id = b.id
+        LEFT JOIN mall_product c ON c.goods_id = a.goods_id
+        AND c.id = a.product_id
+        LEFT JOIN mall_product_store_rela psr ON psr.product_id = c.id
+        AND psr.store_id = #{store_id}
+        LEFT JOIN mall_store s ON s.id = psr.store_id
+        LEFT JOIN third_merchant_biz mb ON s.third_party_merch_code = mb.third_party_merch_code
+        LEFT JOIN third_merchant_biz mb2 ON b.third_party_merch_code = mb2.third_party_merch_code
         where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1
         <if test="checkCart == null">
-            <if test="isStockShare == 1">
+            <if test="isStockShare == 1 and goodsBizType == 00">
                 and b.goods_number > 0
             </if>
+            <if test="isStockShare == 1 and goodsBizType != 00">
+                and psr.stock_num > 0
+            </if>
             <if test="isStockShare == 0">
                 and psr.stock_num > 0
             </if>
         </if>
-        <if test="isStockShare == 1 and checkCart != null and checkCart == '00'">
-            and b.goods_number > 0
-        </if>
-        <if test="isStockShare == 0 and checkCart != null and checkCart == '00'">
-            and psr.stock_num > 0
-        </if>
+        <!--<if test="isStockShare == 1 and (checkCart != null and checkCart != '11')">-->
+        <!--and b.goods_number > 0-->
+        <!--</if>-->
+        <!--<if test="isStockShare == 0 and (checkCart != null and checkCart != '11')">-->
+        <!--and psr.stock_num > 0-->
+        <!--</if>-->
         <if test="checkCart != null and checkCart == '11'">
-            and psr.stock_num > 0
+            and psr.stock_num > 0 and b.goods_biz_type = '11'
         </if>
-        <if test="checkCart != null and checkCart == '00'">
+        <if test="checkCart != null and checkCart != '11'">
             and b.goods_biz_type != '11'
         </if>
-        <if test="checkCart != null and checkCart == '11'">
-            and b.goods_biz_type = '11'
-        </if>
         <if test="user_id != null">
             AND a.user_id = #{user_id}
         </if>
@@ -494,6 +530,7 @@
         left join third_merchant_biz mb on b.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=b.merch_sn
         left join mall_product c on c.goods_id = a.goods_id and c.id = a.product_id
         left join mall_product_store_rela psr on psr.product_id = c.id and psr.store_id = #{store_id}
+        left join mall_store s on s.id = psr.store_id  and s.third_party_merch_code = b.third_party_merch_code
         where 1 = 1  and b.is_delete = 0 and b.is_on_sale = 1
         <if test="isStockShare == 1">
             and b.goods_number > 0

+ 96 - 29
kmall-api/src/main/resources/mybatis/mapper/ApiGoodsMapper.xml

@@ -133,11 +133,18 @@
         psr1.store_id,
         psr1.market_price,
         psr1.stock_num,
-        a.goods_desc,a.goods_biz_type,a.goods_rate,a.third_party_merch_code,mb.is_stock_share isStockShare,a.sell_volume goods_sell_volume,
-        mb.third_party_merch_code
+        a.goods_desc,a.goods_biz_type,a.goods_rate,
+        a.sell_volume goods_sell_volume,
+        mb.third_party_merch_code,
+        mb.is_stock_share isStockShare,
+        mb.is_supplier_goods 'isSupplierGoods',
+        mb2.third_party_merch_code 'supplierThirdMerchCode',
+        mb2.is_stock_share 'isStockShareBySuppler'
         from mall_goods a left join mall_merch m on a.merch_sn = m.merch_sn
-        left join third_merchant_biz mb on a.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=a.merch_sn
         LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id and a.merch_sn = psr1.merch_sn
+        LEFT JOIN mall_store s ON s.id = psr1.store_id
+        LEFT JOIN third_merchant_biz mb on s.third_party_merch_code = mb.third_party_merch_code
+	    LEFT JOIN third_merchant_biz mb2 ON a.third_party_merch_code = mb2.third_party_merch_code
         where a.id = #{id} and psr1.store_id = #{storeId}
     </select>
 
@@ -153,7 +160,8 @@
         ,a.goods_biz_type,a.goods_number,mb.is_stock_share isStockShare,psr1.store_id
         from mall_goods a
         LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id and a.merch_sn = psr1.merch_sn
-        left join third_merchant_biz mb on a.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=a.merch_sn
+        LEFT JOIN mall_store s ON s.id = psr1.store_id
+        left join third_merchant_biz mb on s.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=s.merch_sn
         LEFT JOIN mall_product b ON b.id = psr1.product_id
         left join mall_category c on psr1.category_id = c.id
         where 1 = 1
@@ -230,11 +238,13 @@
         a.third_party_merch_code third_party_merch_code,
         mb.is_stock_share isStockShare,psr1.store_id,
         ( SELECT sum( number ) FROM mall_cart WHERE goods_id = a.id AND store_id = psr1.store_id ) cart_num
-        from mall_goods a
-        LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id and a.merch_sn = psr1.merch_sn
-        LEFT JOIN third_merchant_biz mb on mb.third_party_merch_code = a.third_party_merch_code and mb.merch_sn=a.merch_sn
+        FROM
+        mall_goods a
+        LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id AND a.merch_sn = psr1.merch_sn
+        LEFT JOIN mall_store s ON psr1.store_id = s.id
+        LEFT JOIN third_merchant_biz mb ON s.third_party_merch_code = mb.third_party_merch_code AND mb.merch_sn = s.merch_sn
         LEFT JOIN mall_product b ON b.id = psr1.product_id
-        LEFT JOIN mall_category c on psr1.category_id = c.id
+        LEFT JOIN mall_category c ON psr1.category_id = c.id
         where 1 = 1
         <if test="isStockShare == 1">
             and (a.goods_number > 0  or psr1.stock_num > 0 )
@@ -303,7 +313,8 @@
         FROM
         mall_goods a
         LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id and a.merch_sn = psr1.merch_sn
-        LEFT JOIN third_merchant_biz mb on a.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=a.merch_sn
+        LEFT JOIN mall_store s ON s.id = psr1.store_id
+        LEFT JOIN third_merchant_biz mb on s.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=s.merch_sn
         LEFT JOIN mall_product b ON b.id = psr1.product_id
         <if test="is_group != null and is_group == true">
             LEFT JOIN mall_goods_group gg on gg.goods_id = a.id
@@ -371,18 +382,13 @@
     <select id="queryTotal" resultType="int">
         select count(*)
         from mall_goods a
-        left join mall_product_store_rela s on a.id = s.goods_id and a.merch_sn = s.merch_sn
-        left join third_merchant_biz mb on a.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=a.merch_sn
-        where 1 = 1 and a.is_on_sale = 1
-        <if test="isStockShare == 1">
-          and (a.goods_number > 0  or s.stock_num > 0 )
-        </if>
-        <if test="isStockShare == 0">
-            and s.stock_num > 0
-        </if>
-        <if test="storeId != null and storeId != ''">
-            and s.store_id = #{storeId}
-        </if>
+        LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id and a.merch_sn = psr1.merch_sn
+        LEFT JOIN mall_store s ON s.id = psr1.store_id
+        left join third_merchant_biz mb on s.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=s.merch_sn
+        LEFT JOIN mall_product b ON b.id = psr1.product_id
+        left join mall_category c on psr1.category_id = c.id
+        where 1 = 1
+        and a.is_delete != 1  and a.is_on_sale = 1
         <if test="is_new != null and is_new != ''">
             and a.is_new = #{is_new}
         </if>
@@ -390,10 +396,10 @@
             and a.is_hot = #{is_hot}
         </if>
         <if test="brand_id != null and brand_id != ''">
-            and s.brand_id = #{brand_id}
+            and psr1.brand_id = #{brand_id}
         </if>
         <if test="category_id != null and category_id != ''">
-            and s.category_id = #{category_id}
+            and psr1.category_id = #{category_id}
         </if>
         <if test="keyword != null">
             and a.name like concat('%',#{keyword},'%')
@@ -401,14 +407,77 @@
         <if test="is_delete != null">
             and a.is_delete = #{is_delete}
         </if>
+        <if test="goodsBizType != null">
+            and a.goods_biz_type = #{goodsBizType}
+        </if>
+        <if test="notGoodsBizType == true">
+            and a.goods_biz_type in ('00','11')
+        </if>
+        <if test="categoryIds != null">
+            and psr1.category_id in
+            <foreach item="item" collection="categoryIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="category_parent_id != null and category_parent_id != null and category_parent_id != 0">
+            and FIND_IN_SET(psr1.category_id, getCategoryChildLst(#{category_parent_id}))
+        </if>
+        <if test="category_parent_id != null and category_parent_id != null and category_parent_id == 0">
+            and FIND_IN_SET(c.parent_id, getCategoryChildLst(#{category_parent_id}))
+        </if>
+        <if test="goods_ids != null">
+            and a.id in
+            <foreach item="item" collection="goods_ids" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="store_id != null and store_id != ''">
+            and psr1.store_id = #{store_id}
+            and c.store_id = #{store_id}
+        </if>
+    </select>
+
+    <select id="selectCountByCatalogProductList" resultType="int">
+        SELECT count(*) FROM
+        mall_goods a
+        LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id and a.merch_sn = psr1.merch_sn
+        LEFT JOIN mall_store s ON s.id = psr1.store_id
+        LEFT JOIN third_merchant_biz mb on s.third_party_merch_code = mb.third_party_merch_code and mb.merch_sn=s.merch_sn
+        LEFT JOIN mall_product b ON b.id = psr1.product_id
+        <if test="is_group != null and is_group == true">
+            LEFT JOIN mall_goods_group gg on gg.goods_id = a.id
+        </if>
+        WHERE
+        1 = 1  and b.id > 0 and a.is_delete != 1 and psr1.retail_price is not null and a.is_on_sale = 1
+        <if test="is_new != null and is_new != ''">
+            and a.is_new = #{is_new}
+        </if>
+        <if test="is_hot != null and is_hot != ''">
+            and a.is_hot = #{is_hot}
+        </if>
+        <if test="brand_id != null and brand_id != ''">
+            and psr1.brand_id = #{brand_id}
+        </if>
+        <if test="name != null and name != ''">
+            and a.'name' like concat('%',#{keyword},'%')
+        </if>
+        <if test="category_id != null and category_id != ''">
+            and psr1.category_id = #{category_id}
+        </if>
+        <if test="keyword != null">
+            and a.keywords like concat('%',#{keyword},'%')
+        </if>
+        <if test="is_group != null and is_group == true">
+            and gg.id is not null
+        </if>
         <if test="categoryIds != null">
-            and s.category_id in
+            and psr1.category_id in
             <foreach item="item" collection="categoryIds" open="(" separator="," close=")">
                 #{item}
             </foreach>
         </if>
         <if test="category_parent_id != null and category_parent_id != null">
-            and FIND_IN_SET(s.category_id, getCategoryChildLst(#{category_parent_id}))
+            and FIND_IN_SET(psr1.category_id, getCategoryChildLst(#{category_parent_id}))
         </if>
         <if test="goods_ids != null">
             and a.id in
@@ -417,14 +486,12 @@
             </foreach>
         </if>
         <if test="store_id != null and store_id != ''">
-            and s.store_id = #{store_id}
+            and psr1.store_id = #{store_id}
         </if>
+
         <if test="goodsBizType != null and goodsBizType != ''">
             and a.goods_biz_type = #{goodsBizType}
         </if>
-        <if test="notGoodsBizType == true">
-            and a.goods_biz_type in ('00','11')
-        </if>
     </select>
 
     <update id="updateGoodsStock" parameterType="com.kmall.api.entity.GoodsVo">

+ 25 - 2
kmall-api/src/main/resources/mybatis/mapper/ApiOrderMapper.xml

@@ -40,7 +40,6 @@
         <result property="coupon_id" column="coupon_id"/>
         <result property="coupon_name" column="coupon_name"/>
         <result property="coupon_price" column="coupon_price"/>
-        <result property="full_cut_price" column="full_cut_price"/>
         <result property="order_type" column="order_type"/>
         <result property="activity_id" column="activity_id"/>
         <result property="store_id" column="store_id"/>
@@ -50,6 +49,9 @@
         <result property="latitude" column="latitude"/>
         <result property="longitude" column="longitude"/>
         <result property="comment_count" column="comment_count"/>
+        <result property="full_cut_price" column="full_cut_price"/>
+        <result property="campMinusId" column="camp_minus_id"/>
+        <result property="campName" column="camp_name"/>
 
         <result column="merch_sn" property="merchSn" jdbcType="VARCHAR" />
         <result column="order_biz_type" property="orderBizType" jdbcType="CHAR" />
@@ -222,6 +224,8 @@
 			`coupon_id`,
 			`coupon_price`,
 			`full_cut_price`,
+            camp_minus_id,
+            camp_name,
 			`order_type`,
 			`activity_id`,
 			`store_id`,
@@ -311,6 +315,8 @@
 			#{coupon_id},
 			#{coupon_price},
 			#{full_cut_price},
+            #{campMinusId},
+            #{campName},
 			#{order_type},
 			#{activity_id},
 			#{store_id},
@@ -411,6 +417,8 @@
         `coupon_id`,
         `coupon_price`,
         `full_cut_price`,
+        `camp_minus_id`,
+        `camp_name`,
         `order_type`,
         `activity_id`,
         `store_id`,
@@ -468,6 +476,8 @@
             #{orderInfo.coupon_id},
             #{orderInfo.coupon_price},
             #{orderInfo.full_cut_price},
+            #{orderInfo.campMinusId},
+            #{orderInfo.campName},
             #{orderInfo.order_type},
             #{orderInfo.activity_id},
             #{orderInfo.store_id},
@@ -530,6 +540,8 @@
             <if test="coupon_id != null">`coupon_id` = #{coupon_id},</if>
             <if test="coupon_price != null">`coupon_price` = #{coupon_price},</if>
             <if test="full_cut_price != null">`full_cut_price` = #{full_cut_price},</if>
+            <if test="campMinusId != null">`camp_minus_id` = #{campMinusId},</if>
+            <if test="campName != null">`camp_name` = #{campName},</if>
             <if test="order_type != null">`order_type` = #{order_type},</if>
             <if test="activity_id != null">`activity_id` = #{activity_id},</if>
             <if test="store_id != null">`store_id` = #{store_id},</if>
@@ -592,6 +604,8 @@
                 <if test="oderInfo.coupon_id != null">`coupon_id` = #{oderInfo.coupon_id},</if>
                 <if test="oderInfo.coupon_price != null">`coupon_price` = #{oderInfo.coupon_price},</if>
                 <if test="oderInfo.full_cut_price != null">`full_cut_price` = #{oderInfo.full_cut_price},</if>
+                <if test="oderInfo.campMinusId != null">`camp_minus_id` = #{oderInfo.campMinusId},</if>
+                <if test="oderInfo.campName != null">`camp_name` = #{oderInfo.campName},</if>
                 <if test="oderInfo.order_type != null">`order_type` = #{oderInfo.order_type},</if>
                 <if test="oderInfo.activity_id != null">`activity_id` = #{oderInfo.activity_id},</if>
                 <if test="oderInfo.store_id != null">`store_id` = #{oderInfo.store_id},</if>
@@ -669,6 +683,8 @@
             <if test="coupon_id != null">`coupon_id` = #{coupon_id},</if>
             <if test="coupon_price != null">`coupon_price` = #{coupon_price},</if>
             <if test="full_cut_price != null">`full_cut_price` = #{full_cut_price},</if>
+            <if test="campMinusId != null">`camp_minus_id` = #{campMinusId},</if>
+            <if test="campName != null">`camp_name` = #{campName},</if>
             <if test="order_type != null">`order_type` = #{order_type},</if>
             <if test="activity_id != null">`activity_id` = #{activity_id},</if>
             <if test="store_id != null">`store_id` = #{store_id},</if>
@@ -760,5 +776,12 @@
             activity_id = #{storeTopicId}
     </select>
 
-
+    <select id="queryTopicNumByTopicIdAndUserId" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM
+        mall_order
+        WHERE
+        activity_id = #{storeTopicId} and user_id = #{userId}
+	    AND order_status != '101'
+    </select>
 </mapper>

+ 1 - 1
kmall-api/src/main/resources/mybatis/mapper/ApiProductStoreRelaDao.xml

@@ -99,10 +99,10 @@
 		cg.name categoryName,
 		s.store_name storeName
 		from mall_product_store_rela a
+		left join mall_store s on a.store_id = s.id
 		left join mall_goods b on a.goods_id = b.id and a.merch_sn = b.merch_sn
 		left join mall_product c on a.product_id = c.id
 		LEFT JOIN mall_category cg ON b.category_id = cg.id
-		left join mall_store s on a.store_id = s.id
 		where a.store_id = #{storeId} and a.product_id = #{productId}
 	</select>
 	

+ 165 - 0
kmall-api/src/main/resources/mybatis/mapper/ApiUserCampMinusMapper.xml

@@ -0,0 +1,165 @@
+<?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.kmall.api.dao.ApiUserCampMinusMapper">
+
+    <resultMap type="com.kmall.api.entity.UserCampMinusVo" id="userCampMinusMap">
+        <result property="userCampId" column="user_camp_id"/>
+        <result property="storeTopicId" column="store_topic_id"/>
+        <result property="campName" column="camp_name"/>
+        <result property="userId" column="user_id"/>
+        <result property="usedTime" column="used_time"/>
+        <result property="orderId" column="order_id"/>
+        <result property="endTime" column="end_time"/>
+        <result property="money" column="money"/>
+        <result property="isUsed" column="is_used"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+    </resultMap>
+
+	<select id="queryObject" resultType="com.kmall.api.entity.UserCampMinusVo">
+		select
+			`user_camp_id`,
+			`store_topic_id`,
+			`camp_name`,
+			`user_id`,
+			`used_time`,
+			`order_id`,
+			`end_time`,
+			`money`,
+			`is_used`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`
+		from mall_user_camp_minus
+		where user_camp_id = #{id}
+	</select>
+
+	<select id="queryUserCampByOrderId" resultType="com.kmall.api.entity.UserCampMinusVo">
+		select user_camp_id from mall_user_camp_minus where order_id = #{orderId}
+	</select>
+
+	<select id="queryCampByStoreTopicId" resultType="com.kmall.api.entity.UserCampMinusVo">
+		select * from mall_user_camp_minus where store_topic_id = #{storeTopicId}
+	</select>
+
+	<update id="cancelUserCampOrder" parameterType="com.kmall.api.entity.UserCampMinusVo">
+		update mall_user_camp_minus
+		<set>
+			`used_time` = null,
+			`order_id` = 0,
+			is_used = 0
+		</set>
+		where user_camp_id = #{userCampId}
+	</update>
+
+	<select id="queryList" resultType="com.kmall.api.entity.UserCampMinusVo">
+		select
+    		`user_camp_id`,
+    		`store_topic_id`,
+    		`camp_name`,
+    		`user_id`,
+    		`used_time`,
+    		`order_id`,
+    		`end_time`,
+    		`money`,
+    		`is_used`,
+    		`creater_sn`,
+    		`create_time`,
+    		`moder_sn`,
+    		`mod_time`,
+    		`tstm`
+		from mall_user_camp_minus
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by user_camp_id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mall_user_camp_minus
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.api.entity.UserCampMinusVo" useGeneratedKeys="true" keyProperty="userCampId">
+		insert into mall_user_camp_minus(
+			`store_topic_id`,
+			`camp_name`,
+			`user_id`,
+			`used_time`,
+			`order_id`,
+			`end_time`,
+			`money`,
+			`is_used`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`)
+		values(
+			#{storeTopicId},
+			#{campName},
+			#{userId},
+			#{usedTime},
+			#{orderId},
+			#{endTime},
+			#{money},
+			#{isUsed},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.api.entity.UserCampMinusVo">
+		update mall_user_camp_minus 
+		<set>
+			<if test="storeTopicId != null">`store_topic_id` = #{storeTopicId}, </if>
+			<if test="campName != null">`camp_name` = #{campName}, </if>
+			<if test="userId != null">`user_id` = #{userId}, </if>
+			<if test="usedTime != null">`used_time` = #{usedTime}, </if>
+			<if test="orderId != null">`order_id` = #{orderId}, </if>
+			<if test="endTime != null">`end_time` = #{endTime}, </if>
+			<if test="money != null">`money` = #{money}, </if>
+			<if test="isUsed != null">`is_used` = #{isUsed}, </if>
+			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
+			<if test="createTime != null">`create_time` = #{createTime}, </if>
+			<if test="moderSn != null">`moder_sn` = #{moderSn}, </if>
+			<if test="modTime != null">`mod_time` = #{modTime}, </if>
+			<if test="tstm != null">`tstm` = #{tstm}</if>
+		</set>
+		where user_camp_id = #{userCampId}
+	</update>
+	
+	<delete id="delete">
+		delete from mall_user_camp_minus where user_camp_id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mall_user_camp_minus where user_camp_id in 
+		<foreach item="userCampId" collection="array" open="(" separator="," close=")">
+			#{userCampId}
+		</foreach>
+	</delete>
+
+</mapper>

+ 274 - 0
kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreCampMinusGoodsMapper.xml

@@ -0,0 +1,274 @@
+<?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.kmall.api.dao.mk.ApiMkStoreCampMinusGoodsMapper">
+
+    <resultMap type="com.kmall.api.entity.mk.MkStoreCampMinusGoodsVo" id="mkStoreCampMinusGoodsMap">
+        <result property="minusGoodId" column="minus_good_id"/>
+        <result property="campMinusId" column="camp_minus_id"/>
+        <result property="applyType" column="apply_type"/>
+        <result property="storeRelaId" column="store_rela_id"/>
+        <result property="isValid" column="is_valid"/>
+        <result property="note" column="note"/>
+        <result property="createrSn" column="creater_sn"/>
+        <result property="createTime" column="create_time"/>
+        <result property="moderSn" column="moder_sn"/>
+        <result property="modTime" column="mod_time"/>
+        <result property="tstm" column="tstm"/>
+    </resultMap>
+
+	<!-- 可根据自己的需求,是否要使用 -->
+	<resultMap type="com.kmall.api.entity.GoodsVo" id="goodsMap">
+		<result property="id" column="id"/>
+		<result property="category_id" column="category_id"/>
+		<result property="goods_sn" column="goods_sn"/>
+		<result property="name" column="name"/>
+		<result property="brand_id" column="brand_id"/>
+		<result property="goods_number" column="goods_number"/>
+		<result property="keywords" column="keywords"/>
+		<result property="goods_brief" column="goods_brief"/>
+		<result property="goods_desc" column="goods_desc"/>
+		<result property="is_on_sale" column="is_on_sale"/>
+		<result property="add_time" column="add_time"/>
+		<result property="sort_order" column="sort_order"/>
+		<result property="is_delete" column="is_delete"/>
+		<result property="attribute_category" column="attribute_category"/>
+		<result property="counter_price" column="counter_price"/>
+		<result property="extra_price" column="extra_price"/>
+		<result property="is_new" column="is_new"/>
+		<result property="goods_unit" column="goods_unit"/>
+		<result property="primary_pic_url" column="primary_pic_url"/>
+		<result property="list_pic_url" column="list_pic_url"/>
+		<result property="retail_price" column="retail_price"/>
+		<result property="market_price" column="market_price"/>
+		<result property="sell_volume" column="sell_volume"/>
+		<result property="primary_product_id" column="primary_product_id"/>
+		<result property="unit_price" column="unit_price"/>
+		<result property="promotion_desc" column="promotion_desc"/>
+		<result property="promotion_tag" column="promotion_tag"/>
+		<result property="app_exclusive_price" column="app_exclusive_price"/>
+		<result property="is_app_exclusive" column="is_app_exclusive"/>
+		<result property="is_limited" column="is_limited"/>
+		<result property="is_hot" column="is_hot"/>
+		<result property="product_id" column="product_id"/>
+		<result property="sku" column="sku"/>
+		<result property="goodsBizType" column="goods_biz_type"/>
+		<result column="creater_sn" property="createrSn" jdbcType="VARCHAR" />
+		<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
+		<result column="moder_sn" property="moderSn" jdbcType="VARCHAR" />
+		<result column="mod_time" property="modTime" jdbcType="TIMESTAMP" />
+		<result column="tstm" property="tstm" jdbcType="TIMESTAMP" />
+		<result property="goodsRate" column="goods_rate"/>
+		<result property="stockNum" column="stock_num"/>
+		<result property="storeId" column="store_id"/>
+		<result property="merchSn" column="merch_sn"/>
+		<result property="merchName" column="merch_name"/>
+		<result column="third_party_merch_code" property="thirdPartyMerchCode" />
+		<result column="isStockShare" property="isStockShare" />
+		<result property="goods_sell_volume" column="goods_sell_volume"/>
+	</resultMap>
+
+
+	<select id="queryObject" resultType="com.kmall.api.entity.mk.MkStoreCampMinusGoodsVo">
+		select
+			`minus_good_id`,
+			`camp_minus_id`,
+			`apply_type`,
+			`store_rela_id`,
+			`is_valid`,
+			`note`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`
+		from mk_store_camp_minus_goods
+		where minus_good_id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.api.entity.mk.MkStoreCampMinusGoodsVo">
+		select
+    		`minus_good_id`,
+    		`camp_minus_id`,
+    		`apply_type`,
+    		`store_rela_id`,
+    		`is_valid`,
+    		`note`,
+    		`creater_sn`,
+    		`create_time`,
+    		`moder_sn`,
+    		`mod_time`,
+    		`tstm`
+		from mk_store_camp_minus_goods
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+        <choose>
+            <when test="sidx != null and sidx.trim() != ''">
+                order by ${sidx} ${order}
+            </when>
+			<otherwise>
+                order by minus_good_id desc
+			</otherwise>
+        </choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+	
+ 	<select id="queryTotal" resultType="int">
+		select count(*) from mk_store_camp_minus_goods
+		WHERE 1=1
+        <if test="name != null and name.trim() != ''">
+            AND name LIKE concat('%',#{name},'%')
+        </if>
+	</select>
+
+	<select id="queryCampMinusGoodsList" resultMap="goodsMap">
+		select
+		<if test="fields != null and fields != ''">
+			${fields}
+		</if>
+		<if test="fields == null or fields == ''">
+			a.*,b.id as product_id,psr1.category_id,psr1.brand_id,psr1.attribute_category
+		</if>
+		,a.goods_biz_type,
+		a.goods_number,
+		a.third_party_merch_code third_party_merch_code,
+		mb.is_stock_share isStockShare,psr1.store_id,
+		( SELECT sum( number ) FROM mall_cart WHERE goods_id = a.id AND store_id = psr1.store_id ) cart_num
+		FROM
+		mall_goods a
+		LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id
+		AND a.merch_sn = psr1.merch_sn
+		LEFT JOIN mk_store_camp_minus_goods g ON psr1.id = g.store_rela_id
+		<if test="campMinusId != null and campMinusId != ''">
+			and g.camp_minus_id = #{campMinusId}
+		</if>
+		LEFT JOIN third_merchant_biz mb ON mb.third_party_merch_code = a.third_party_merch_code
+		AND mb.merch_sn = a.merch_sn
+		LEFT JOIN mall_product b ON b.id = psr1.product_id
+		LEFT JOIN mall_category c ON psr1.category_id = c.id
+		WHERE 1 = 1
+		<if test="applyType != null and applyType == '01'">
+			<if test="campMinusId != null and campMinusId != ''">
+				and g.camp_minus_id = #{campMinusId}
+			</if>
+		</if>
+		<if test="applyType != null and applyType == '02'">
+			and psr1.id not in(SELECT store_rela_id FROM mk_store_camp_minus_goods WHERE camp_minus_id = #{campMinusId})
+		</if>
+		<if test="isStockShare == 1">
+			and (a.goods_number > 0  or psr1.stock_num > 0 )
+		</if>
+		<if test="isStockShare == 0">
+			and psr1.stock_num > 0
+		</if>
+		and b.id is not null and a.is_delete != 1 and psr1.retail_price is not null and a.is_on_sale = 1
+		<if test="is_new != null and is_new != ''">
+			and a.is_new = #{is_new}
+		</if>
+		<if test="brand_id != null and brand_id != ''">
+			and psr1.brand_id = #{brand_id}
+		</if>
+		<if test="category_id != null and category_id != ''">
+			and psr1.category_id = #{category_id}
+		</if>
+		<if test="keyword != null">
+			and a.keywords like concat('%',#{keyword},'%')
+		</if>
+		<if test="categoryIds != null">
+			and psr1.category_id in
+			<foreach item="item" collection="categoryIds" open="(" separator="," close=")">
+				#{item}
+			</foreach>
+		</if>
+		<if test="category_parent_id != null and category_parent_id != null and category_parent_id != 0">
+			and FIND_IN_SET(psr1.category_id, getCategoryChildLst(#{category_parent_id}))
+		</if>
+		<if test="goodsId != null and goodsId != ''">
+			and a.id = #{goodsId}
+		</if>
+		<if test="store_id != null and store_id != ''">
+			and psr1.store_id = #{store_id}
+		</if>
+		<if test="goodsBizType != null and goodsBizType != ''">
+			and a.goods_biz_type = #{goodsBizType}
+		</if>
+		<choose>
+			<when test="sidx != null and sidx.trim() != ''">
+				order by ${sidx} ${order}
+			</when>
+			<otherwise>
+				order by a.id desc
+			</otherwise>
+		</choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+
+	<select id="queryCampMinusGoodsTotal" resultType="int">
+		select count(*)
+		FROM
+		mall_goods a
+		LEFT JOIN mall_product_store_rela psr1 ON a.id = psr1.goods_id
+		AND a.merch_sn = psr1.merch_sn
+		LEFT JOIN mk_store_camp_minus_goods g ON psr1.id = g.store_rela_id
+		<if test="campMinusId != null and campMinusId != ''">
+			and g.camp_minus_id = #{campMinusId}
+		</if>
+		LEFT JOIN third_merchant_biz mb ON mb.third_party_merch_code = a.third_party_merch_code
+		AND mb.merch_sn = a.merch_sn
+		LEFT JOIN mall_product b ON b.id = psr1.product_id
+		LEFT JOIN mall_category c ON psr1.category_id = c.id
+		WHERE 1 = 1
+		<if test="applyType != null and applyType == '01'">
+			<if test="campMinusId != null and campMinusId != ''">
+				and g.camp_minus_id = #{campMinusId}
+			</if>
+		</if>
+		<if test="applyType != null and applyType == '02'">
+			and psr1.id not in(SELECT store_rela_id FROM mk_store_camp_minus_goods WHERE camp_minus_id = #{campMinusId})
+		</if>
+		<if test="isStockShare == 1">
+			and (a.goods_number > 0  or psr1.stock_num > 0 )
+		</if>
+		<if test="isStockShare == 0">
+			and psr1.stock_num > 0
+		</if>
+		and b.id is not null and a.is_delete != 1 and psr1.retail_price is not null and a.is_on_sale = 1
+		<if test="is_new != null and is_new != ''">
+			and a.is_new = #{is_new}
+		</if>
+		<if test="brand_id != null and brand_id != ''">
+			and psr1.brand_id = #{brand_id}
+		</if>
+		<if test="category_id != null and category_id != ''">
+			and psr1.category_id = #{category_id}
+		</if>
+		<if test="keyword != null">
+			and a.keywords like concat('%',#{keyword},'%')
+		</if>
+		<if test="categoryIds != null">
+			and psr1.category_id in
+			<foreach item="item" collection="categoryIds" open="(" separator="," close=")">
+				#{item}
+			</foreach>
+		</if>
+		<if test="category_parent_id != null and category_parent_id != null and category_parent_id != 0">
+			and FIND_IN_SET(psr1.category_id, getCategoryChildLst(#{category_parent_id}))
+		</if>
+		<if test="goodsId != null and goodsId != ''">
+			and a.id = #{goodsId}
+		</if>
+		<if test="store_id != null and store_id != ''">
+			and psr1.store_id = #{store_id}
+		</if>
+		<if test="goodsBizType != null and goodsBizType != ''">
+			and a.goods_biz_type = #{goodsBizType}
+		</if>
+	</select>
+
+</mapper>

+ 188 - 0
kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreCampMinusLevelMapper.xml

@@ -0,0 +1,188 @@
+<?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.kmall.api.dao.mk.ApiMkStoreCampMinusLevelMapper">
+
+	<resultMap type="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo" id="mkStoreCampMinusLevelMap">
+		<result property="campMinusLevelId" column="camp_minus_level_id"/>
+		<result property="campMinusType" column="camp_minus_type"/>
+		<result property="campMinusId" column="camp_minus_id"/>
+		<result property="minusMode" column="minus_mode"/>
+		<result property="yuanMinusCond" column="yuan_minus_cond"/>
+		<result property="yuanMinusPref" column="yuan_minus_pref"/>
+		<result property="pieceMinusConf" column="piece_minus_conf"/>
+		<result property="pieceMinusPref" column="piece_minus_pref"/>
+		<result property="pieceMinusEachDisc" column="piece_minus_each_disc"/>
+		<result property="yuanDiscCond" column="yuan_disc_cond"/>
+		<result property="yuanDiscPref" column="yuan_disc_pref"/>
+		<result property="pieceDiscConf" column="piece_disc_conf"/>
+		<result property="pieceDiscPref" column="piece_disc_pref"/>
+		<result property="isValid" column="is_valid"/>
+		<result property="note" column="note"/>
+		<result property="createrSn" column="creater_sn"/>
+		<result property="createTime" column="create_time"/>
+		<result property="moderSn" column="moder_sn"/>
+		<result property="modTime" column="mod_time"/>
+		<result property="tstm" column="tstm"/>
+	</resultMap>
+
+	<select id="queryObject" resultType="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo">
+		select
+		`camp_minus_level_id`,
+		`camp_minus_type`,
+		`camp_minus_id`,
+		`minus_mode`,
+		`yuan_minus_cond`,
+		`yuan_minus_pref`,
+		`piece_minus_conf`,
+		`piece_minus_pref`,
+		`piece_minus_each_disc`,
+		`yuan_disc_cond`,
+		`yuan_disc_pref`,
+		`piece_disc_conf`,
+		`piece_disc_pref`,
+		`is_valid`,
+		`note`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`
+		from mk_store_camp_minus_level
+		where camp_minus_level_id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo">
+		select
+		`camp_minus_level_id`,
+		`camp_minus_type`,
+		`camp_minus_id`,
+		`minus_mode`,
+		`yuan_minus_cond`,
+		`yuan_minus_pref`,
+		`piece_minus_conf`,
+		`piece_minus_pref`,
+		`piece_minus_each_disc`,
+		`yuan_disc_cond`,
+		`yuan_disc_pref`,
+		`piece_disc_conf`,
+		`piece_disc_pref`,
+		`is_valid`,
+		`note`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`
+		from mk_store_camp_minus_level
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+		<choose>
+			<when test="sidx != null and sidx.trim() != ''">
+				order by ${sidx} ${order}
+			</when>
+			<otherwise>
+				order by camp_minus_level_id desc
+			</otherwise>
+		</choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+
+	<select id="queryTotal" resultType="int">
+		select count(*) from mk_store_camp_minus_level
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+	</select>
+
+	<select id="queryObjectByCampMinusId" resultType="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo">
+		select
+		`camp_minus_level_id`,
+		`camp_minus_type`,
+		`camp_minus_id`,
+		`minus_mode`,
+		`yuan_minus_cond`,
+		`yuan_minus_pref`,
+		`piece_minus_conf`,
+		`piece_minus_pref`,
+		`piece_minus_each_disc`,
+		`yuan_disc_cond`,
+		`yuan_disc_pref`,
+		`piece_disc_conf`,
+		`piece_disc_pref`,
+		`is_valid`,
+		`note`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`
+		from mk_store_camp_minus_level
+		where camp_minus_id = #{campMinusId}
+	</select>
+
+	<select id="queryYuanCondByCampMinusId" resultType="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo">
+		SELECT
+		`camp_minus_level_id`,
+		`camp_minus_type`,
+		`camp_minus_id`,
+		`minus_mode`,
+		`yuan_minus_cond`,
+		`yuan_minus_pref`,
+		piece_minus_each_disc,
+		`is_valid`
+		FROM mk_store_camp_minus_level
+		WHERE
+		camp_minus_id = #{campMinusId} AND camp_minus_type = #{campMinusType}
+		AND minus_mode = #{minusMode} ORDER BY yuan_minus_cond DESC LIMIT 1
+	</select>
+
+	<select id="queryPieceConfByCampMinusId" resultType="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo">
+		SELECT
+		`camp_minus_level_id`,
+		`camp_minus_type`,
+		`camp_minus_id`,
+		`minus_mode`,
+		`piece_minus_conf`,
+		`piece_minus_pref`,
+		piece_minus_each_disc,
+		`is_valid`
+		FROM mk_store_camp_minus_level
+		WHERE
+		camp_minus_id = #{campMinusId}  AND camp_minus_type = #{campMinusType}
+		AND minus_mode = #{minusMode} ORDER BY piece_minus_conf DESC LIMIT 1
+	</select>
+
+	<select id="queryDiscCondByCampMinusId" resultType="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo">
+		SELECT
+		`camp_minus_level_id`,
+		`camp_minus_type`,
+		`camp_minus_id`,
+		`minus_mode`,
+		`yuan_disc_cond`,
+		`yuan_disc_pref`,
+		`is_valid`
+		FROM mk_store_camp_minus_level
+		WHERE
+		camp_minus_id = #{campMinusId}  AND camp_minus_type = '10' ORDER BY yuan_disc_cond DESC LIMIT 1
+	</select>
+
+	<select id="queryDiscConfByCampMinusId" resultType="com.kmall.api.entity.mk.MkStoreCampMinusLevelVo">
+		SELECT
+		`camp_minus_level_id`,
+		`camp_minus_type`,
+		`camp_minus_id`,
+		`minus_mode`,
+		`piece_disc_conf`,
+		`piece_disc_pref`,
+		`is_valid`
+		FROM mk_store_camp_minus_level
+		WHERE
+		camp_minus_id = #{campMinusId}  AND camp_minus_type = '11' ORDER BY piece_disc_conf DESC LIMIT 1
+	</select>
+</mapper>

+ 159 - 0
kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreCampMinusMapper.xml

@@ -0,0 +1,159 @@
+<?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.kmall.api.dao.mk.ApiMkStoreCampMinusMapper">
+
+	<resultMap type="com.kmall.api.entity.mk.MkStoreCampMinusVo" id="mkStoreCampMinusMap">
+		<result property="campMinusId" column="camp_minus_id"/>
+		<result property="campName" column="camp_name"/>
+		<result property="thirdMerchSn" column="third_merch_sn"/>
+		<result property="storeId" column="store_id"/>
+		<result property="storeTopicId" column="store_topic_id"/>
+		<result property="campBegTime" column="camp_beg_time"/>
+		<result property="campEndTime" column="camp_end_time"/>
+		<result property="campMinusType" column="camp_minus_type"/>
+		<result property="minusMode" column="minus_mode"/>
+		<result property="applyType" column="apply_type"/>
+		<result property="advImgUrl" column="adv_img_url"/>
+		<result property="advDesc" column="adv_desc"/>
+		<result property="isValid" column="is_valid"/>
+		<result property="isPast" column="is_past"/>
+		<result property="isStoreShow" column="is_store_show"/>
+		<result property="note" column="note"/>
+		<result property="createrSn" column="creater_sn"/>
+		<result property="createTime" column="create_time"/>
+		<result property="moderSn" column="moder_sn"/>
+		<result property="modTime" column="mod_time"/>
+		<result property="tstm" column="tstm"/>
+		<result property="goodsBizType" column="goods_biz_type"/>
+	</resultMap>
+
+	<select id="queryObject" resultType="com.kmall.api.entity.mk.MkStoreCampMinusVo">
+		select
+		`camp_minus_id`,
+		`camp_name`,
+		`third_merch_sn`,
+		`store_id`,
+		`store_topic_id`,
+		`camp_beg_time`,
+		`camp_end_time`,
+		`camp_minus_type`,
+		`minus_mode`,
+		`apply_type`,
+		`adv_img_url`,
+		`adv_desc`,
+		`is_valid`,
+		`is_past`,
+		`is_store_show`,
+		`note`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`,
+		`goods_biz_type`
+		from mk_store_camp_minus
+		where camp_minus_id = #{id}
+	</select>
+
+	<select id="queryList" resultType="com.kmall.api.entity.mk.MkStoreCampMinusVo">
+		select
+		`camp_minus_id`,
+		`camp_name`,
+		`third_merch_sn`,
+		`store_id`,
+		`store_topic_id`,
+		`camp_beg_time`,
+		`camp_end_time`,
+		`camp_minus_type`,
+		`minus_mode`,
+		`apply_type`,
+		`adv_img_url`,
+		`adv_desc`,
+		`is_valid`,
+		`is_past`,
+		`is_store_show`,
+		`note`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`,
+		`goods_biz_type`
+		from mk_store_camp_minus
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+		<choose>
+			<when test="sidx != null and sidx.trim() != ''">
+				order by ${sidx} ${order}
+			</when>
+			<otherwise>
+				order by camp_minus_id desc
+			</otherwise>
+		</choose>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+
+	<select id="queryTotal" resultType="int">
+		select count(*) from mk_store_camp_minus
+		WHERE 1=1
+		<if test="name != null and name.trim() != ''">
+			AND name LIKE concat('%',#{name},'%')
+		</if>
+	</select>
+
+	<select id="getCampMinusByStoreIdList" resultType="com.kmall.api.entity.mk.MkStoreCampMinusVo">
+		select
+		m.`camp_minus_id`,
+		m.`camp_name`,
+		m.`third_merch_sn`,
+		m.`store_id`,
+		m.`store_topic_id`,
+		m.`camp_beg_time`,
+		m.`camp_end_time`,
+		m.`camp_minus_type`,
+		m.`minus_mode`,
+		m.`apply_type`,
+		m.`adv_img_url`,
+		m.`adv_desc`,
+		m.`is_valid`,
+		m.`is_past`,
+		m.`is_store_show`,
+		m.`note`,
+		m.`creater_sn`,
+		m.`create_time`,
+		m.`moder_sn`,
+		m.`mod_time`,
+		m.`tstm`,
+		m.`goods_biz_type`
+		from mk_store_camp_minus m
+		WHERE 1=1
+		<if test="storeId != '' and storeId != null">
+			AND m.store_id = #{storeId}
+		</if>
+		<if test="goodsBizType != '' and goodsBizType != null">
+			AND m.goods_biz_type = #{goodsBizType}
+		</if>
+		<if test="isPast != '' and isPast != null">
+			AND m.is_past = #{isPast}
+		</if>
+	</select>
+
+	<select id="queryOrderCountByUserIdAndCampId" resultType="int">
+		SELECT
+			count(*)
+		FROM
+			mall_order o
+			INNER JOIN mk_store_camp_minus m ON o.activity_id = m.store_topic_id
+			INNER JOIN mall_user_camp_minus uc ON uc.store_topic_id = m.store_topic_id AND o.user_id = uc.user_id
+		WHERE
+			o.user_id = #{userId}
+			AND m.camp_minus_id = #{campMinusId}
+			AND uc.is_used = 1
+	</select>
+
+</mapper>

+ 3 - 0
kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreTicketDiscountMapper.xml

@@ -371,6 +371,9 @@
 		<if test="isPast != null">
 			AND d.is_past = #{isPast}
 		</if>
+		<if test="notIsPast != null">
+			AND d.is_past <![CDATA[ <> ]]> #{notIsPast}
+		</if>
 		)
 	</select>
 	<select id="getTotalByDiscountByStoreId" resultType="int">

+ 30 - 0
kmall-api/src/main/resources/mybatis/mapper/mk/ApiMkStoreTopicStatMapper.xml

@@ -286,4 +286,34 @@
 		</foreach>
 	</delete>
 
+	<select id="queryCampByOrder" resultType="com.kmall.api.entity.mk.MkStoreTopicStatVo">
+		SELECT
+		s.store_topic_stat_id storeTopicStatId,
+		s.store_topic_id storeTopicId,
+		(SELECT count( * ) FROM mall_order WHERE activity_id = s.store_topic_id) 'submitOrderNum'
+		FROM
+		mk_store_topic_stat s
+		INNER JOIN mall_store_topic t ON s.store_topic_id = t.id
+		INNER JOIN mk_store_camp_minus d ON t.id = d.store_topic_id
+		INNER JOIN mall_order o ON s.store_topic_id = o.activity_id
+		WHERE
+		1 = 1
+		AND d.is_valid = 0
+		AND d.is_past = 0
+		AND d.camp_minus_id = #{campMinusId}
+		GROUP BY
+		s.store_topic_id
+	</select>
+
+	<select id="querySubmitNumByCampOrder" resultType="map">
+		SELECT
+		a.user_id
+		FROM
+		mall_store_topic s
+		LEFT JOIN mall_order a ON a.activity_id = s.id
+		WHERE
+		s.id = #{storeTopicId}
+		GROUP BY
+		a.user_id
+	</select>
 </mapper>