Browse Source

新增管理后台满减满折功能,修改门店商品库存逻辑

hyq 5 years ago
parent
commit
38b08f95bd
100 changed files with 8544 additions and 606 deletions
  1. 2 18
      kmall-admin/src/main/java/com/kmall/admin/controller/CategoryController.java
  2. 2 18
      kmall-admin/src/main/java/com/kmall/admin/controller/CommentController.java
  3. 1 9
      kmall-admin/src/main/java/com/kmall/admin/controller/FootprintController.java
  4. 1 9
      kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java
  5. 2 42
      kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java
  6. 84 24
      kmall-admin/src/main/java/com/kmall/admin/controller/ProductStoreRelaController.java
  7. 1 10
      kmall-admin/src/main/java/com/kmall/admin/controller/StoreController.java
  8. 1 9
      kmall-admin/src/main/java/com/kmall/admin/controller/SupplierController.java
  9. 53 12
      kmall-admin/src/main/java/com/kmall/admin/controller/ThirdMerchantBizController.java
  10. 2 10
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/dist/MkDistController.java
  11. 2 18
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/dist/MkDistHierController.java
  12. 3 28
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/dist/MkDistSellStatisController.java
  13. 235 0
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreCampMinusController.java
  14. 126 0
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreCampMinusGoodsController.java
  15. 106 0
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreCampMinusLevelController.java
  16. 34 45
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStorePromController.java
  17. 1 0
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreTicketDiscountController.java
  18. 42 20
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreTicketGoodsTempController.java
  19. 1 0
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreTopicStatController.java
  20. 1 0
      kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/StoreTopicController.java
  21. 1 0
      kmall-admin/src/main/java/com/kmall/admin/dao/AdDao.java
  22. 2 0
      kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java
  23. 16 0
      kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java
  24. 20 0
      kmall-admin/src/main/java/com/kmall/admin/dao/UserCampMinusDao.java
  25. 15 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreCampMinusDao.java
  26. 26 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreCampMinusGoodsDao.java
  27. 34 0
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreCampMinusLevelDao.java
  28. 9 1
      kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreTicketGoodsTempDao.java
  29. 54 0
      kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeDiscPieceAttrDto.java
  30. 54 0
      kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeDiscUnitAttrDto.java
  31. 54 0
      kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypePieceAttrDto.java
  32. 64 0
      kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypePieceModeDto.java
  33. 54 0
      kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeUnitAttrDto.java
  34. 64 0
      kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeUnitModeDto.java
  35. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/AdEntity.java
  36. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/GoodsAttributeEntity.java
  37. 28 0
      kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java
  38. 30 0
      kmall-admin/src/main/java/com/kmall/admin/entity/OrderEntity.java
  39. 31 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ProductStoreRelaEntity.java
  40. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/ThirdMerchantBizEntity.java
  41. 257 0
      kmall-admin/src/main/java/com/kmall/admin/entity/UserCampMinusEntity.java
  42. 517 0
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreCampMinusEntity.java
  43. 276 0
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreCampMinusGoodsEntity.java
  44. 359 0
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreCampMinusLevelEntity.java
  45. 11 1
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreTicketGoodsTempEntity.java
  46. 10 0
      kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreTopicStatEntity.java
  47. 16 0
      kmall-admin/src/main/java/com/kmall/admin/service/ProductStoreRelaService.java
  48. 24 15
      kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java
  49. 108 96
      kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java
  50. 60 8
      kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java
  51. 108 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreCampMinusGoodsServiceImpl.java
  52. 58 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreCampMinusLevelServiceImpl.java
  53. 792 0
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreCampMinusServiceImpl.java
  54. 78 7
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStorePromServiceImpl.java
  55. 23 4
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreTicketDiscountServiceImpl.java
  56. 90 19
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreTicketGoodsTempServiceImpl.java
  57. 16 1
      kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreTopicStatServiceImpl.java
  58. 90 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreCampMinusGoodsService.java
  59. 73 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreCampMinusLevelService.java
  60. 74 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreCampMinusService.java
  61. 2 0
      kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStorePromService.java
  62. 17 8
      kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreTicketGoodsTempService.java
  63. 40 0
      kmall-admin/src/main/java/com/kmall/admin/utils/ParamUtils.java
  64. 21 0
      kmall-admin/src/main/resources/mybatis/mapper/AdDao.xml
  65. 7 1
      kmall-admin/src/main/resources/mybatis/mapper/GoodsAttributeDao.xml
  66. 84 7
      kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml
  67. 34 19
      kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml
  68. 87 10
      kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml
  69. 3 0
      kmall-admin/src/main/resources/mybatis/mapper/StoreDao.xml
  70. 9 1
      kmall-admin/src/main/resources/mybatis/mapper/ThirdMerchantBizDao.xml
  71. 165 0
      kmall-admin/src/main/resources/mybatis/mapper/UserCampMinusDao.xml
  72. 1 1
      kmall-admin/src/main/resources/mybatis/mapper/mk/MkCenterMenuDao.xml
  73. 232 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreCampMinusDao.xml
  74. 208 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreCampMinusGoodsDao.xml
  75. 259 0
      kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreCampMinusLevelDao.xml
  76. 2 2
      kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStorePromDao.xml
  77. 103 28
      kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreTicketGoodsTempDao.xml
  78. 1 1
      kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreTopicStatDao.xml
  79. 860 0
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkstorecampminus.html
  80. 11 8
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkstoreprom.html
  81. 3 2
      kmall-admin/src/main/webapp/WEB-INF/page/mk/mkstoreticketdiscount.html
  82. 1 1
      kmall-admin/src/main/webapp/WEB-INF/page/shop/attribute.html
  83. 20 7
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goods.html
  84. 11 4
      kmall-admin/src/main/webapp/WEB-INF/page/shop/order.html
  85. 142 14
      kmall-admin/src/main/webapp/WEB-INF/page/shop/storeProductStock.html
  86. 10 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/thirdmerchantbiz.html
  87. 28 28
      kmall-admin/src/main/webapp/WEB-INF/page/statis/mkstoretopicstat.html
  88. 10 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/thirdmerchswitch.html
  89. 1 1
      kmall-admin/src/main/webapp/js/mk/mkcentermenu.js
  90. 1 1
      kmall-admin/src/main/webapp/js/mk/mkdist.js
  91. 1 1
      kmall-admin/src/main/webapp/js/mk/mkdistchnl.js
  92. 1 1
      kmall-admin/src/main/webapp/js/mk/mkdistsellallocation.js
  93. 1 1
      kmall-admin/src/main/webapp/js/mk/mkdistsellstatis.js
  94. 1775 0
      kmall-admin/src/main/webapp/js/mk/mkstorecampminus.js
  95. 41 10
      kmall-admin/src/main/webapp/js/mk/mkstoreprom.js
  96. 1 1
      kmall-admin/src/main/webapp/js/mk/mkstorepromtype.js
  97. 14 18
      kmall-admin/src/main/webapp/js/mk/mkstoreticketdiscount.js
  98. 1 1
      kmall-admin/src/main/webapp/js/mk/mkstoreticketdiscountgoods.js
  99. 9 4
      kmall-admin/src/main/webapp/js/mk/storetopic.js
  100. 1 1
      kmall-admin/src/main/webapp/js/shop/ad.js

+ 2 - 18
kmall-admin/src/main/java/com/kmall/admin/controller/CategoryController.java

@@ -33,15 +33,7 @@ public class CategoryController {
     @RequiresPermissions("category:list")
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String categoryName = (String) params.get("categoryName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(categoryName)){
-            try{
-                categoryName = new String(categoryName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("categoryName", categoryName);
-        }
+        ParamUtils.setName(params, "categoryName");
         //查询列表数据
         Query query = new Query(params);
 
@@ -104,15 +96,7 @@ public class CategoryController {
     public R queryAll(@RequestParam Map<String, Object> params) {
 
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String categoryName = (String) params.get("categoryName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(categoryName)){
-            try{
-                categoryName = new String(categoryName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("categoryName", categoryName);
-        }
+        ParamUtils.setName(params, "categoryName");
 
         List<CategoryEntity> list = categoryService.queryList(params);
         //添加顶级菜单

+ 2 - 18
kmall-admin/src/main/java/com/kmall/admin/controller/CommentController.java

@@ -33,24 +33,8 @@ public class CommentController {
     @RequiresPermissions("comment:list")
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String valueName = (String) params.get("valueName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(valueName)){
-            try{
-                valueName = new String(valueName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("valueName", valueName);
-        }
-        String userName = (String) params.get("userName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(userName)){
-            try{
-                userName = new String(userName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("userName", userName);
-        }
+        ParamUtils.setName(params, "valueName");
+        ParamUtils.setName(params, "userName");
         //查询列表数据
         Query query = new Query(params);
 

+ 1 - 9
kmall-admin/src/main/java/com/kmall/admin/controller/FootprintController.java

@@ -32,15 +32,7 @@ public class FootprintController {
     @RequiresPermissions("footprint:list")
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String name = (String) params.get("name");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(name)){
-            try{
-                name = new String(name.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("name", name);
-        }
+        ParamUtils.setName(params, "name");
         //查询列表数据
         Query query = new Query(params);
 

+ 1 - 9
kmall-admin/src/main/java/com/kmall/admin/controller/GoodsController.java

@@ -51,15 +51,7 @@ public class GoodsController {
     @RequiresPermissions("goods:list")
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeKey", "merchSn", "thirdPartyMerchCode");
-        String goodsName = (String) params.get("name");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(goodsName)){
-            try{
-                goodsName = new String(goodsName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("name", goodsName);
-        }
+        ParamUtils.setName(params, "name");
         //查询列表数据
         Query query = new Query(params);
 

+ 2 - 42
kmall-admin/src/main/java/com/kmall/admin/controller/OrderController.java

@@ -73,29 +73,10 @@ public class OrderController {
     @RequiresPermissions("order:list")
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
+        params = ParamUtils.setTimeMap(params);
         //查询列表数据
         Query query = new Query(params);
         query.put("isOnfiilineOrder", Dict.isOnfflineOrder.item_0.getItem());
-        String startTime = (String) params.get("startTime");
-        String endTime = (String) params.get("endTime");
-        if(org.apache.commons.lang.StringUtils.isNotEmpty(startTime)) {
-            try {
-                startTime = new String(startTime.getBytes("iso-8859-1"), "utf-8");
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            startTime = DateUtils.getDate(startTime);
-            query.put("startTime", startTime + " 00:00:00");
-        }
-        if(org.apache.commons.lang.StringUtils.isNotEmpty(endTime)) {
-            try {
-                endTime = new String(endTime.getBytes("iso-8859-1"), "utf-8");
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            endTime = DateUtils.getDate(endTime);
-            query.put("endTime", endTime + " 59:59:59");
-        }
         List<OrderEntity> orderList = orderService.queryList(query);
         int total = orderService.queryTotal(query);
 
@@ -709,30 +690,9 @@ public class OrderController {
     @RequestMapping(value = "export")
     public Object export(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
+        params = ParamUtils.setTimeMap(params);
         //查询列表数据
         params.put("isOnfiilineOrder", Dict.isOnfflineOrder.item_0.getItem());
-
-        String startTime = (String) params.get("startTime");
-        String endTime = (String) params.get("endTime");
-        if(org.apache.commons.lang.StringUtils.isNotEmpty(startTime)) {
-            try {
-                startTime = new String(startTime.getBytes("iso-8859-1"), "utf-8");
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            startTime = DateUtils.getDate(startTime);
-            params.put("startTime", startTime + " 00:00:00");
-        }
-        if(org.apache.commons.lang.StringUtils.isNotEmpty(endTime)) {
-            try {
-                endTime = new String(endTime.getBytes("iso-8859-1"), "utf-8");
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            endTime = DateUtils.getDate(endTime);
-            params.put("endTime", endTime + " 59:59:59");
-        }
-
         List<OrderEntity> orderList = orderService.queryExportList(params);
 
         ExcelExport ee = new ExcelExport("订单信息");

+ 84 - 24
kmall-admin/src/main/java/com/kmall/admin/controller/ProductStoreRelaController.java

@@ -1,22 +1,27 @@
 package com.kmall.admin.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.kmall.admin.entity.ProductStoreRelaEntity;
 import com.kmall.admin.entity.StoreEntity;
 import com.kmall.admin.entity.ThirdMerchantBizEntity;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.service.ProductStoreRelaService;
 import com.kmall.admin.service.StoreService;
 import com.kmall.admin.service.ThirdMerchantBizService;
 import com.kmall.admin.utils.ParamUtils;
+import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.common.constant.Dict;
-import com.kmall.common.utils.PageUtils;
-import com.kmall.common.utils.Query;
-import com.kmall.common.utils.R;
-import com.kmall.common.utils.StringUtils;
+import com.kmall.common.utils.*;
+import com.kmall.common.utils.file.FileUploadUtil;
+import com.kmall.common.utils.wechat.AccessToken;
+import com.kmall.manager.manager.pay.wxpay.WxPayPropertiesBuilder;
+import com.kmall.manager.manager.wechat.wxtemplate.WxTemplateUtil;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -42,20 +47,12 @@ public class ProductStoreRelaController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String goodsName = (String) params.get("goodsName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(goodsName)){
-            try{
-                goodsName = new String(goodsName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("goodsName", goodsName);
-        }
+        ParamUtils.setName(params, "goodsName");
         //查询列表数据
         Query query = new Query(params);
 
         List<ProductStoreRelaEntity> productStoreRelaList = productStoreRelaService.queryList(query);
-        for (ProductStoreRelaEntity pro: productStoreRelaList) {
+        /*for (ProductStoreRelaEntity pro: productStoreRelaList) {
             if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getIsStockShare())) {
                 if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getGoodsBizType())) {
                     if (pro.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
@@ -65,7 +62,7 @@ public class ProductStoreRelaController {
                     }
                 }
             }
-        }
+        }*/
         int total = productStoreRelaService.queryTotal(query);
 
         PageUtils pageUtil = new PageUtils(productStoreRelaList, total, query.getLimit(), query.getPage());
@@ -168,15 +165,7 @@ public class ProductStoreRelaController {
     @ResponseBody
     public R queryGoodsRealListByDiscountTid(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "id", "merchSn", "thirdPartyMerchCode");
-        String goodsName = (String) params.get("goodsName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(goodsName)){
-            try{
-                goodsName = new String(goodsName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("goodsName", goodsName);
-        }
+        ParamUtils.setName(params, "goodsName");
         //查询列表数据
         Query query = new Query(params);
 
@@ -208,4 +197,75 @@ public class ProductStoreRelaController {
 
         return R.ok().put("page", pageUtil);
     }
+
+
+    /**
+     * 根据门店活动id查看门店活动选择商品列表
+     * @param params
+     * @return
+     */
+    @RequestMapping("/queryGoodsRealListByTopicId")
+    @ResponseBody
+    public R queryGoodsRealListByTopicId(@RequestParam Map<String, Object> params) {
+        ParamUtils.setQueryPowerByRoleType(params, "id", "merchSn", "thirdPartyMerchCode");
+        ParamUtils.setName(params, "goodsName");
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<ProductStoreRelaEntity> productStoreRelaList = productStoreRelaService.queryGoodsRealListByTopicId(query);
+        for (ProductStoreRelaEntity pro: productStoreRelaList) {
+            if(pro.getIsCheck()==null){
+                pro.setIsCheck(0);//未选中
+            }else{
+                Integer storeTopicId = Integer.parseInt((String)params.get("storeTopicId"));
+                if(storeTopicId.compareTo(pro.getStoreTopicId())==0) {
+                    pro.setIsCheck(1);
+                }else{
+                    pro.setIsCheck(0);//未选中
+                }
+            }
+            if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getIsStockShare())) {
+                if(org.apache.commons.lang3.StringUtils.isNotEmpty(pro.getGoodsBizType())) {
+                    if (pro.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())) {
+                        if (pro.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
+                            pro.setStockNum(pro.getGoodsNumber());
+                        }
+                    }
+                }
+            }
+        }
+        int total = productStoreRelaService.queryGoodsRealListByTopicIdTotal(query);
+
+        PageUtils pageUtil = new PageUtils(productStoreRelaList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    @RequestMapping("/qrcodeCanvas/{id}")
+//    @RequiresPermissions("mkstoreprom:qrcodeCanvas")
+    @ResponseBody
+    public R qrcodeCanvas(@PathVariable("id") Integer id) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        if (user == null) {
+            throw new RRException("用户登录超时,请重新登录");
+        }
+        ProductStoreRelaEntity productStoreRelaEntity = productStoreRelaService.queryObject(id);
+        if(productStoreRelaEntity==null){
+            throw new RRException("门店商品信息不存在");
+        }
+        AccessToken accessToken = WxTemplateUtil.getAccessToken(WxPayPropertiesBuilder.instance().getAppId(),WxPayPropertiesBuilder.instance().getSecret());
+        if(accessToken == null){
+            throw new RRException("token获取失败");
+        }
+        String token = accessToken.getToken();
+        //构建请求参数
+        Map<Object, Object> params = new HashMap<Object, Object>();
+        params.put("scene", productStoreRelaEntity.getGoodsId()+"&"+productStoreRelaEntity.getStoreId()+"&&"+user.getUserId());//参数
+        params.put("page", "pages/goods/goods");//商品详情页面
+        params.put("width", 430);
+        String mapToXml = JSON.toJSONString(params);
+
+        String url = FileUploadUtil.getUploadUrl(mapToXml, token, id);
+        return R.ok().put("url", url);
+    }
 }

+ 1 - 10
kmall-admin/src/main/java/com/kmall/admin/controller/StoreController.java

@@ -60,16 +60,7 @@ public class StoreController {
     public R list(@RequestParam Map<String, Object> params) {
 
         ParamUtils.setQueryPowerByRoleType(params, "id", "merchSn", "thirdPartyMerchCode");
-
-        String storeName = (String) params.get("storeName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(storeName)){
-            try{
-                storeName = new String(storeName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("storeName", storeName);
-        }
+        ParamUtils.setName(params, "storeName");
         //查询列表数据
         Query query = new Query(params);
 

+ 1 - 9
kmall-admin/src/main/java/com/kmall/admin/controller/SupplierController.java

@@ -35,15 +35,7 @@ public class SupplierController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String name = (String) params.get("name");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(name)){
-            try{
-                name = new String(name.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("name", name);
-        }
+        ParamUtils.setName(params, "name");
         //查询列表数据
         Query query = new Query(params);
 

+ 53 - 12
kmall-admin/src/main/java/com/kmall/admin/controller/ThirdMerchantBizController.java

@@ -1,5 +1,6 @@
 package com.kmall.admin.controller;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -33,8 +34,6 @@ public class ThirdMerchantBizController {
     private ThirdMerchantBizService thirdMerchantBizService;
     @Autowired
     private StoreService storeService;
-    private String  ISO = "iso-8859-1";
-    private String  UTF = "utf-8";
 
     /**
      * 查看列表
@@ -44,16 +43,7 @@ public class ThirdMerchantBizController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeKey", "merchSn", "thirdPartyMerchCode");
-
-        String thirdPartyName = (String) params.get("name");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(thirdPartyName)){
-            try{
-                thirdPartyName = new String(thirdPartyName.getBytes(ISO), UTF);
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("name", thirdPartyName);
-        }
+        ParamUtils.setName(params, "name");
         //查询列表数据
         Query query = new Query(params);
 
@@ -171,4 +161,55 @@ public class ThirdMerchantBizController {
 
         return R.ok().put("list", list);
     }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAlls")
+    @ResponseBody
+    public R queryAlls(@RequestParam Map<String, Object> params) {
+        List<ThirdMerchantBizEntity> list = thirdMerchantBizService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/getIsSupplierShowByThirdSn")
+    @ResponseBody
+    public R getIsSupplierShowByThirdSn(@RequestParam Map<String, Object> params) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        if (user == null) {
+            throw new RRException("用户登录超时,请重新登录");
+        }
+        Boolean isSupplierShow = false;
+        Boolean roleType = false;
+        if (Dict.roleType.item_2.getItem().equals(user.getRoleType())) {
+            ThirdMerchantBizEntity thirdMerchantBizEntity  = thirdMerchantBizService.getThirdMerchangByCode(user.getThirdPartyMerchCode());
+            if(thirdMerchantBizEntity != null){
+                String isSupplierGoods = thirdMerchantBizEntity.getIsSupplierGoods();
+                if(isSupplierGoods.equalsIgnoreCase(Dict.isSupplierGoods.item_1.getItem())){
+                    isSupplierShow = true;
+                }
+            }
+        }
+        if (Dict.roleType.item_3.getItem().equalsIgnoreCase(user.getRoleType()) || Dict.roleType.item_1.getItem().equalsIgnoreCase(user.getRoleType())) {
+            isSupplierShow = true;
+            roleType = true;
+        }
+        if (Dict.roleType.item_4.getItem().equals(user.getRoleType())) {
+            ThirdMerchantBizEntity thirdMerchantBizEntity  = thirdMerchantBizService.getThirdMerchangByCode(user.getThirdPartyMerchCode());
+            if(thirdMerchantBizEntity != null){
+                String isSupplierGoods = thirdMerchantBizEntity.getIsSupplierGoods();
+                if(isSupplierGoods.equalsIgnoreCase(Dict.isSupplierGoods.item_1.getItem())){
+                    isSupplierShow = true;
+                }
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("isSupplierShow", isSupplierShow);
+        map.put("roleType", roleType);
+        return R.ok().put("map", map);
+    }
 }

+ 2 - 10
kmall-admin/src/main/java/com/kmall/admin/controller/mk/dist/MkDistController.java

@@ -35,15 +35,7 @@ public class MkDistController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String distName = (String) params.get("distName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(distName)){
-            try{
-                distName = new String(distName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("distName", distName);
-        }
+        ParamUtils.setName(params, "distName");
         //查询列表数据
         Query query = new Query(params);
         List<MkDistEntity> mkDistList = mkDistService.queryList(query);
@@ -168,7 +160,7 @@ public class MkDistController {
     @RequestMapping("/queryAllByHier")
     @ResponseBody
     public R queryAllByHier(@RequestParam Map<String, Object> params) {
-        ParamUtils.setQueryPowerByRoleType(params, "storeKey", "merchSn", "thirdPartyMerchCode");
+        ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
         params.put("hierLvl", "1");
         List<MkDistEntity> list = mkDistService.queryAllByHier(params);
         return R.ok().put("list", list);

+ 2 - 18
kmall-admin/src/main/java/com/kmall/admin/controller/mk/dist/MkDistHierController.java

@@ -49,15 +49,7 @@ public class MkDistHierController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String distHierName = (String) params.get("distHierName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(distHierName)){
-            try{
-                distHierName = new String(distHierName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("distHierName", distHierName);
-        }
+        ParamUtils.setName(params, "distHierName");
         //查询列表数据
         Query query = new Query(params);
 
@@ -148,15 +140,7 @@ public class MkDistHierController {
     @ResponseBody
     public R queryAll(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String distHierName = (String) params.get("distHierName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(distHierName)){
-            try{
-                distHierName = new String(distHierName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("distHierName", distHierName);
-        }
+        ParamUtils.setName(params, "distHierName");
         List<MkDistHierEntity> list = mkDistHierService.queryList(params);
         for (MkDistHierEntity distHierEntity: list) {
 //            distHierEntity.setName(distHierEntity.getDistName());

+ 3 - 28
kmall-admin/src/main/java/com/kmall/admin/controller/mk/dist/MkDistSellStatisController.java

@@ -45,7 +45,7 @@ public class MkDistSellStatisController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        params = setTimeMap(params);
+        params = ParamUtils.setTimeMap(params);
         //查询列表数据
         Query query = new Query(params);
 
@@ -112,7 +112,7 @@ public class MkDistSellStatisController {
     @ResponseBody
     public R queryAll(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        params = setTimeMap(params);
+        params = ParamUtils.setTimeMap(params);
 
         List<MkDistSellStatisEntity> list = mkDistSellStatisService.queryList(params);
 
@@ -126,7 +126,7 @@ public class MkDistSellStatisController {
     @RequestMapping(value = "export")
     public Object export(@RequestParam Map<String, Object> params, HttpServletResponse response, HttpServletRequest request) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        params = setTimeMap(params);
+        params = ParamUtils.setTimeMap(params);
 
         List<MkDistSellStatisEntity> orderList = mkDistSellStatisService.queryStatisExportList(params);
 
@@ -175,29 +175,4 @@ public class MkDistSellStatisController {
         ee.export(response);
         return R.ok();
     }
-    private Map<String, Object> setTimeMap(Map<String, Object> params){
-        String startTime = (String) params.get("startTime");
-        String endTime = (String) params.get("endTime");
-        if(org.apache.commons.lang.StringUtils.isNotEmpty(startTime)) {
-            try {
-                startTime = new String(startTime.getBytes("iso-8859-1"), "utf-8");
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            startTime = DateUtils.getDate(startTime);
-            params.put("startTime", startTime + " 00:00:00");
-        }
-        if(org.apache.commons.lang.StringUtils.isNotEmpty(endTime)) {
-            try {
-                endTime = new String(endTime.getBytes("iso-8859-1"), "utf-8");
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            endTime = DateUtils.getDate(endTime);
-            params.put("endTime", endTime + " 59:59:59");
-        }
-        return params;
-    }
-
-
 }

+ 235 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreCampMinusController.java

@@ -0,0 +1,235 @@
+package com.kmall.admin.controller.mk.store;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.ImmutableBiMap;
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity;
+import com.kmall.admin.entity.mk.store.StoreTopicEntity;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
+import com.kmall.admin.service.mk.store.StoreTopicService;
+import com.kmall.admin.utils.ParamUtils;
+import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.common.constant.Dict;
+import com.kmall.common.utils.*;
+import com.kmall.common.utils.file.FileUploadUtil;
+import com.kmall.common.utils.wechat.AccessToken;
+import com.kmall.manager.manager.pay.wxpay.WxPayPropertiesBuilder;
+import com.kmall.manager.manager.wechat.wxtemplate.WxTemplateUtil;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 门店满减活动Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:28
+ */
+@Controller
+@RequestMapping("mkstorecampminus")
+public class MkStoreCampMinusController {
+    @Autowired
+    private MkStoreCampMinusService mkStoreCampMinusService;
+    @Autowired
+    private StoreTopicService storeTopicService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("mkstorecampminus:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
+        ParamUtils.setName(params, "campName");
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<MkStoreCampMinusEntity> mkStoreCampMinusList = mkStoreCampMinusService.queryList(query);
+        int total = mkStoreCampMinusService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(mkStoreCampMinusList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{campMinusId}")
+    @RequiresPermissions("mkstorecampminus:info")
+    @ResponseBody
+    public R info(@PathVariable("campMinusId") Integer campMinusId) {
+        MkStoreCampMinusEntity mkStoreCampMinus = mkStoreCampMinusService.queryObject(campMinusId);
+
+        return R.ok().put("mkStoreCampMinus", mkStoreCampMinus);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("mkstorecampminus:save")
+    @ResponseBody
+    public R save(@RequestBody MkStoreCampMinusEntity mkStoreCampMinus) {
+        Map<String, Object> valideDate = MapBeanUtil.fromObject(mkStoreCampMinus);
+        ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+        builder.put("campName", "活动名称");
+        builder.put("campBegTime", "活动起始时间");
+        builder.put("campEndTime", "活动结束时间");
+        builder.put("campMinusType", "减免活动类型");
+        builder.put("thirdMerchSn", "所属三方商户");
+        builder.put("storeId", "所属门店");
+        builder.put("goodsBizType", "货品业务类型");
+        builder.put("applyType", "适用类型");
+        builder.put("advImgUrl", "活动图片url");
+        R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+        if (Integer.valueOf(r.get("code").toString()) != 0) {
+            throw new RRException(r.get("msg").toString());
+        }
+        mkStoreCampMinusService.save(mkStoreCampMinus);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("mkstorecampminus:update")
+    @ResponseBody
+    public R update(@RequestBody MkStoreCampMinusEntity mkStoreCampMinus) {
+        Map<String, Object> valideDate = MapBeanUtil.fromObject(mkStoreCampMinus);
+        ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+        builder.put("campName", "活动名称");
+        builder.put("campBegTime", "活动起始时间");
+        builder.put("campEndTime", "活动结束时间");
+        builder.put("campMinusType", "减免活动类型");
+        builder.put("thirdMerchSn", "所属三方商户");
+        builder.put("storeId", "所属门店");
+        builder.put("goodsBizType", "货品业务类型");
+        builder.put("applyType", "适用类型");
+        builder.put("advImgUrl", "活动图片url");
+        R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+        if (Integer.valueOf(r.get("code").toString()) != 0) {
+            throw new RRException(r.get("msg").toString());
+        }
+        mkStoreCampMinusService.update(mkStoreCampMinus);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("mkstorecampminus:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]campMinusIds) {
+        mkStoreCampMinusService.deleteBatch(campMinusIds);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+        ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
+
+        List<MkStoreCampMinusEntity> list = mkStoreCampMinusService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 结束活动
+     * @param campMinusId
+     * @return
+     */
+    @RequestMapping("/updatePastById")
+//    @RequiresPermissions("mkstorecampminus:updatePastById")
+    @ResponseBody
+    public R updatePastById(@RequestBody Integer campMinusId) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        MkStoreCampMinusEntity campMinusEntity = mkStoreCampMinusService.queryObject(campMinusId);
+        if(campMinusEntity != null) {
+            MkStoreCampMinusEntity entity = new MkStoreCampMinusEntity();
+            entity.setIsPast(Dict.isPast.item_1.getItem());
+            entity.setIsValid(Dict.isValid.item_1.getItem());
+            entity.setCampMinusId(campMinusId);
+            entity.setCampEndTime(new Date());
+            entity.setModTime(new Date());
+            entity.setModerSn(user.getUsername());
+            mkStoreCampMinusService.updatePastById(entity);
+
+            //修改为无效活动
+            StoreTopicEntity storeTopicEntity = new StoreTopicEntity();
+            storeTopicEntity.setId(campMinusEntity.getStoreTopicId());
+            storeTopicEntity.setIsValid(Dict.isValid.item_1.getItem());
+            storeTopicEntity.setModTime(new Date());
+            storeTopicEntity.setModerSn(user.getUsername());
+            storeTopicService.update(storeTopicEntity);
+        }
+        return R.ok();
+    }
+
+    /**
+     * 开始活动
+     * @param campMinusId
+     * @return
+     */
+    @RequestMapping("/updateStartPastById")
+//    @RequiresPermissions("mkstorecampminus:updateStartPastById")
+    @ResponseBody
+    public R updateStartPastById(@RequestBody Integer campMinusId) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        MkStoreCampMinusEntity campMinusEntity = mkStoreCampMinusService.queryObject(campMinusId);
+        if(campMinusEntity != null) {
+            MkStoreCampMinusEntity entity = new MkStoreCampMinusEntity();
+            entity.setIsPast(Dict.isPast.item_0.getItem());
+            entity.setCampMinusId(campMinusId);
+            entity.setCampBegTime(new Date());
+            entity.setModTime(new Date());
+            entity.setModerSn(user.getUsername());
+            mkStoreCampMinusService.updatePastById(entity);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping("/qrcodeCanvasByCampMinus/{campMinusId}")
+//    @RequiresPermissions("mkstorecampminus:qrcodeCanvas")
+    @ResponseBody
+    public R qrcodeCanvasByCampMinus(@PathVariable("campMinusId") Integer campMinusId) {
+        MkStoreCampMinusEntity campMinusEntity = mkStoreCampMinusService.queryObject(campMinusId);
+        if(campMinusEntity==null){
+            throw new RRException("门店满减满折信息不存在");
+        }
+        AccessToken accessToken = WxTemplateUtil.getAccessToken(WxPayPropertiesBuilder.instance().getAppId(),WxPayPropertiesBuilder.instance().getSecret());
+        if(accessToken == null){
+            throw new RRException("token获取失败");
+        }
+        String token = accessToken.getToken();
+
+        //构建请求参数
+        Map<Object, Object> params = new HashMap<Object, Object>();
+        //dictId&storeId&isShare,isShare为0则是分享页进来的
+        params.put("scene", campMinusEntity.getCampMinusId()+"&"+campMinusEntity.getStoreId()+"&0");//参数
+        params.put("page", "pages/ucenter/couponDetail/couponDetail");//优惠券详情页面
+        params.put("width", 430);
+        String mapToXml = JSON.toJSONString(params);
+
+        String url = FileUploadUtil.getUploadUrl(mapToXml, token, campMinusId);
+        return R.ok().put("url", url);
+    }
+}

+ 126 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreCampMinusGoodsController.java

@@ -0,0 +1,126 @@
+package com.kmall.admin.controller.mk.store;
+
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity;
+import com.kmall.admin.service.mk.store.MkStoreCampMinusGoodsService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 门店满减活动商品,参与满减活动的商品Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+@Controller
+@RequestMapping("mkstorecampminusgoods")
+public class MkStoreCampMinusGoodsController {
+    @Autowired
+    private MkStoreCampMinusGoodsService mkStoreCampMinusGoodsService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("mkstorecampminusgoods:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+        List<MkStoreCampMinusGoodsEntity> mkStoreCampMinusGoodsList = mkStoreCampMinusGoodsService.queryList(query);
+        int total = mkStoreCampMinusGoodsService.queryTotal(query);
+        PageUtils pageUtil = new PageUtils(mkStoreCampMinusGoodsList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    @RequestMapping("/queryCampMinusGoodsByIdList")
+    @ResponseBody
+    public R queryCampMinusGoodsByIdList(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+        List<MkStoreCampMinusGoodsEntity> mkStoreCampMinusGoodsList = mkStoreCampMinusGoodsService.queryCampMinusGoodsByIdList(query);
+        int total = mkStoreCampMinusGoodsService.queryCampMinusGoodsByIdTotal(query);
+        PageUtils pageUtil = new PageUtils(mkStoreCampMinusGoodsList, total, query.getLimit(), query.getPage());
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{minusGoodId}")
+    @RequiresPermissions("mkstorecampminusgoods:info")
+    @ResponseBody
+    public R info(@PathVariable("minusGoodId") Integer minusGoodId) {
+        MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods = mkStoreCampMinusGoodsService.queryObject(minusGoodId);
+
+        return R.ok().put("mkStoreCampMinusGoods", mkStoreCampMinusGoods);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("mkstorecampminusgoods:save")
+    @ResponseBody
+    public R save(@RequestBody MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods) {
+        mkStoreCampMinusGoodsService.save(mkStoreCampMinusGoods);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("mkstorecampminusgoods:update")
+    @ResponseBody
+    public R update(@RequestBody MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods) {
+        mkStoreCampMinusGoodsService.update(mkStoreCampMinusGoods);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("mkstorecampminusgoods:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[]minusGoodIds) {
+        mkStoreCampMinusGoodsService.deleteBatch(minusGoodIds);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<MkStoreCampMinusGoodsEntity> list = mkStoreCampMinusGoodsService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+    /**
+     * 保存
+     */
+    @RequestMapping("/batchSaveCampMinusGoods")
+//    @RequiresPermissions("mkstorecampminusgoods:save")
+    @ResponseBody
+    public R batchSaveCampMinusGoods(@RequestBody MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods) {
+        mkStoreCampMinusGoodsService.batchSaveCampMinusGoods(mkStoreCampMinusGoods);
+
+        return R.ok();
+    }
+}

+ 106 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreCampMinusLevelController.java

@@ -0,0 +1,106 @@
+package com.kmall.admin.controller.mk.store;
+
+import java.util.List;
+import java.util.Map;
+
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity;
+import com.kmall.admin.service.mk.store.MkStoreCampMinusLevelService;
+import com.kmall.common.utils.PageUtils;
+import com.kmall.common.utils.Query;
+import com.kmall.common.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 门店满减活动层级表,活动减免类型为00:按满足最高层级减一次时增加的活动层级数据Controller
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+@Controller
+@RequestMapping("mkstorecampminuslevel")
+public class MkStoreCampMinusLevelController {
+    @Autowired
+    private MkStoreCampMinusLevelService mkStoreCampMinusLevelService;
+
+    /**
+     * 查看列表
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("mkstorecampminuslevel:list")
+    @ResponseBody
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<MkStoreCampMinusLevelEntity> mkStoreCampMinusLevelList = mkStoreCampMinusLevelService.queryList(query);
+        int total = mkStoreCampMinusLevelService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(mkStoreCampMinusLevelList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 查看信息
+     */
+    @RequestMapping("/info/{campMinusLevelId}")
+    @RequiresPermissions("mkstorecampminuslevel:info")
+    @ResponseBody
+    public R info(@PathVariable("campMinusId") Integer campMinusLevelId) {
+        MkStoreCampMinusLevelEntity mkStoreCampMinusLevel = mkStoreCampMinusLevelService.queryObject(campMinusLevelId);
+
+        return R.ok().put("mkStoreCampMinusLevel", mkStoreCampMinusLevel);
+    }
+
+    /**
+     * 保存
+     */
+    @RequestMapping("/save")
+    @RequiresPermissions("mkstorecampminuslevel:save")
+    @ResponseBody
+    public R save(@RequestBody MkStoreCampMinusLevelEntity mkStoreCampMinusLevel) {
+        mkStoreCampMinusLevelService.save(mkStoreCampMinusLevel);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping("/update")
+    @RequiresPermissions("mkstorecampminuslevel:update")
+    @ResponseBody
+    public R update(@RequestBody MkStoreCampMinusLevelEntity mkStoreCampMinusLevel) {
+        mkStoreCampMinusLevelService.update(mkStoreCampMinusLevel);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping("/delete")
+    @RequiresPermissions("mkstorecampminuslevel:delete")
+    @ResponseBody
+    public R delete(@RequestBody Integer[] campMinusLevelIds) {
+        mkStoreCampMinusLevelService.deleteBatch(campMinusLevelIds);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看所有列表
+     */
+    @RequestMapping("/queryAll")
+    @ResponseBody
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<MkStoreCampMinusLevelEntity> list = mkStoreCampMinusLevelService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+}

+ 34 - 45
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStorePromController.java

@@ -2,6 +2,7 @@ package com.kmall.admin.controller.mk.store;
 
 import java.io.*;
 import java.nio.file.Files;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -10,8 +11,10 @@ import com.alibaba.fastjson.JSON;
 import com.google.common.collect.ImmutableBiMap;
 import com.kmall.admin.entity.mk.store.MkStorePromChnlEntity;
 import com.kmall.admin.entity.mk.store.MkStorePromEntity;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.admin.service.mk.store.MkStorePromService;
 import com.kmall.admin.utils.ParamUtils;
+import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.common.constant.Dict;
 import com.kmall.common.fileserver.util.FileManager;
 import com.kmall.common.utils.*;
@@ -56,55 +59,12 @@ public class MkStorePromController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
-        String promName = (String) params.get("promName");
-        if(org.apache.commons.lang3.StringUtils.isNotEmpty(promName)){
-            try{
-                promName = new String(promName.getBytes("iso-8859-1"),"utf-8");
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-            params.put("promName", promName);
-        }
+        ParamUtils.setName(params, "promName");
         //查询列表数据
         Query query = new Query(params);
 
         List<MkStorePromEntity> mkStorePromList = mkStorePromService.queryList(query);
-        for (MkStorePromEntity mkStorePromEntity : mkStorePromList) {
-            String promStat = "";
-            String promInfo = "";
-            String promPicUrl = "";
-
-            String browseNum = StringUtils.isNotEmpty(String.valueOf(mkStorePromEntity.getBrowseNum())) ? String.valueOf(mkStorePromEntity.getBrowseNum()) : "0";
-            String payOrderNum = StringUtils.isNotEmpty(String.valueOf(mkStorePromEntity.getPayOrderNum())) ? String.valueOf(mkStorePromEntity.getPayOrderNum()) : "0";
-            String actMoney = StringUtils.isNotEmpty(String.valueOf(mkStorePromEntity.getActMoney())) ? String.valueOf(mkStorePromEntity.getActMoney()) : "0";
-            String startDate = DateUtils.format(mkStorePromEntity.getPromBegTime(), DateUtils.DATE_TIME_PATTERN);
-            String endDate = DateUtils.format(mkStorePromEntity.getPromEndTime(), DateUtils.DATE_TIME_PATTERN);
-            String inValidDate = startDate + " - " + endDate;
-            if(mkStorePromEntity.getPromType().equalsIgnoreCase(Dict.promType.item_00.getItem())){
-                promStat = "浏览量:" + browseNum;
-                promInfo = "<span style=\"font-weight: bolder\">" + mkStorePromEntity.getPromName() + "</span>\n"
-                        + mkStorePromEntity.getTopicTitle() + "\n推广有效期:"
-                        + inValidDate ;
 
-                if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_1.getItem())){
-                    promInfo = promInfo + "&nbsp;&nbsp;&nbsp;&nbsp;<button class='btn btn-outline'style=\"margin-top: -3px;\" onclick='vm.updateFinished(" + mkStorePromEntity.getPromId() + ")'>立即结束</button>";
-                }
-                promPicUrl = mkStorePromEntity.getItemPicUrl();
-            }
-            if(mkStorePromEntity.getPromType().equalsIgnoreCase(Dict.promType.item_10.getItem())){
-                promStat = "浏览量:" + browseNum + "\n支付单数:" + payOrderNum + "\n实收金额:" + actMoney;
-                promInfo = "<span style=\"font-weight: bolder\">" + mkStorePromEntity.getPromName() + "</span>\n"
-                        + mkStorePromEntity.getGoodsName() + "\n推广有效期:"
-                        + inValidDate;
-                if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_1.getItem())){
-                    promInfo = promInfo + "&nbsp;&nbsp;&nbsp;&nbsp;<button class='btn btn-outline'style=\"margin-top: -3px;\" onclick='vm.updateFinished(" + mkStorePromEntity.getPromId() + ")'>立即结束</button>";
-                }
-                promPicUrl = mkStorePromEntity.getListPicUrl();
-            }
-            mkStorePromEntity.setPromStat(promStat);
-            mkStorePromEntity.setPromInfo(promInfo);
-            mkStorePromEntity.setPromPicUrl(promPicUrl);
-        }
         int total = mkStorePromService.queryTotal(query);
         PageUtils pageUtil = new PageUtils(mkStorePromList, total, query.getLimit(), query.getPage());
 
@@ -216,6 +176,7 @@ public class MkStorePromController {
     @RequiresPermissions("mkstoreprom:update")
     @ResponseBody
     public R updateFinished(@RequestBody Integer promId) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
         MkStorePromEntity mkStorePromEntity = mkStorePromService.queryObject(promId);
         if(mkStorePromEntity != null){
             if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_0.getItem())){
@@ -224,7 +185,35 @@ public class MkStorePromController {
                 MkStorePromEntity promEntity = new MkStorePromEntity();
                 promEntity.setPromId(promId);
                 promEntity.setIsFinished(Dict.isFinished.item_0.getItem());
-                mkStorePromService.update(promEntity);
+                promEntity.setPromEndTime(new Date());
+                promEntity.setModTime(new Date());
+                promEntity.setModerSn(user.getUsername());
+                mkStorePromService.updateStartedOrFinished(promEntity);
+            }
+        }
+
+        return R.ok();
+    }
+
+    @RequestMapping("/updateStarted")
+    @RequiresPermissions("mkstoreprom:update")
+    @ResponseBody
+    public R updateStarted(@RequestBody Integer promId) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        MkStorePromEntity mkStorePromEntity = mkStorePromService.queryObject(promId);
+        if(mkStorePromEntity != null){
+            if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_0.getItem())){
+                throw new RRException("该推广信息已结束,不能进行操作!");
+            }else if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_1.getItem())){
+                throw new RRException("该推广信息正在进行中,不能再次操作!");
+            }else{
+                MkStorePromEntity promEntity = new MkStorePromEntity();
+                promEntity.setPromId(promId);
+                promEntity.setIsFinished(Dict.isFinished.item_1.getItem());
+                promEntity.setPromBegTime(new Date());
+                promEntity.setModTime(new Date());
+                promEntity.setModerSn(user.getUsername());
+                mkStorePromService.updateStartedOrFinished(promEntity);
             }
         }
 

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreTicketDiscountController.java

@@ -42,6 +42,7 @@ public class MkStoreTicketDiscountController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
+        ParamUtils.setName(params, "name");
         //查询列表数据
         Query query = new Query(params);
 

+ 42 - 20
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreTicketGoodsTempController.java

@@ -81,25 +81,12 @@ public class MkStoreTicketGoodsTempController {
         mkStoreTicketGoodsTempService.batchSaveDiscountGoods(mkStoreTicketDiscountGoods);
         return R.ok();
     }
-//    /**
-//     * 查看已提交选中的商品
-//     */
-//    @RequestMapping("/queryGoodsTempByGuidAndSubmit")
-//    @ResponseBody
-//    public R queryGoodsTempByGuidAndSubmit(@RequestParam Map<String, Object> params) {
-//        MkStoreTicketGoodsTempEntity mkStoreTicketDiscountGoods = new MkStoreTicketGoodsTempEntity();
-//        String guid = (String)params.get("guid");
-//        String storeId = (String)params.get("storeId");
-//        String applyType = (String)params.get("applyType");
-//        mkStoreTicketDiscountGoods.setStoreId(Integer.parseInt(storeId));
-//        mkStoreTicketDiscountGoods.setIsSubmit(Dict.isSubmit.item_0.getItem());
-//        mkStoreTicketDiscountGoods.setGuid(guid);
-//        mkStoreTicketDiscountGoods.setApplyType(applyType);
-//        List<MkStoreTicketGoodsTempEntity> tempEntityList = mkStoreTicketGoodsTempService.queryGoodsTempByGuidAndIsSubmit(mkStoreTicketDiscountGoods);
-//
-//        return R.ok().put("list", tempEntityList);
-//    }
 
+    /**
+     * 取消选中当前优惠券商品,将商品状态修改为无效
+     * @param mkStoreTicketDiscountGoods
+     * @return
+     */
     @RequestMapping("/updateTempByIsValid")
 //    @RequiresPermissions("mkstoreticketgoodstemp:updateTempByIsValid")
     @ResponseBody
@@ -166,8 +153,9 @@ public class MkStoreTicketGoodsTempController {
         }
         return R.ok();
     }
+
     /**
-     * 触发页面返回按钮时,将返回失效的商品还原为有效
+     * 触发优惠券选择商品页面返回按钮时,将返回失效的商品还原为有效
      * @param mkStoreTicketGoodsTemp
      * @return
      */
@@ -175,9 +163,10 @@ public class MkStoreTicketGoodsTempController {
 //    @RequiresPermissions("mkstoreticketgoodstemp:resetIsValidByTemp")
     @ResponseBody
     public R resetIsValidByTemp(@RequestBody MkStoreTicketGoodsTempEntity mkStoreTicketGoodsTemp) {
-        mkStoreTicketGoodsTempService.resetIsValidByTemp(mkStoreTicketGoodsTemp);
+        mkStoreTicketGoodsTempService.resetDiscTicketIsValidByTemp(mkStoreTicketGoodsTemp);
         return R.ok();
     }
+
     /**
      * 查看所有列表
      */
@@ -206,4 +195,37 @@ public class MkStoreTicketGoodsTempController {
 
         return R.ok().put("page", pageUtil);
     }
+
+    /**
+     * 触发门店活动选择商品页面分页按钮时保存数据
+     * @param mkStoreTicketDiscountGoods
+     * @return
+     */
+    @RequestMapping("/batchSaveStoreTopicGoods")
+//    @RequiresPermissions("mkstoreticketgoodstemp:batchSaveStoreTopicGoods")
+    @ResponseBody
+    public R batchSaveStoreTopicGoods(@RequestBody MkStoreTicketGoodsTempEntity mkStoreTicketDiscountGoods) {
+        mkStoreTicketGoodsTempService.batchSaveStoreTopicGoods(mkStoreTicketDiscountGoods);
+        return R.ok();
+    }
+
+    /**
+     * 取消选中当前门店活动商品,将商品状态修改为无效
+     * @param mkStoreTicketDiscountGoods
+     * @return
+     */
+    @RequestMapping("/updateTempByStoreTopicIsValid")
+//    @RequiresPermissions("mkstoreticketgoodstemp:updateTempByStoreTopicIsValid")
+    @ResponseBody
+    public R updateTempByStoreTopicIsValid(@RequestBody MkStoreTicketGoodsTempEntity mkStoreTicketDiscountGoods) {
+        MkStoreTicketGoodsTempEntity entity = mkStoreTicketGoodsTempService.queryGoodsTempByRealIdAndTopicId(mkStoreTicketDiscountGoods.getStoreRelaId(),
+                mkStoreTicketDiscountGoods.getStoreTopicId());
+        if(entity != null){
+            MkStoreTicketGoodsTempEntity tempEntity = new MkStoreTicketGoodsTempEntity();
+            tempEntity.setDiscGoodTempId(entity.getDiscGoodTempId());
+            tempEntity.setIsValid(Dict.isValid.item_1.getItem());
+            mkStoreTicketGoodsTempService.update(tempEntity);
+        }
+        return R.ok();
+    }
 }

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/MkStoreTopicStatController.java

@@ -8,6 +8,7 @@ import com.kmall.admin.entity.mk.store.MkStoreTopicStatEntity;
 import com.kmall.admin.service.OrderService;
 import com.kmall.admin.service.mk.store.MkStoreTopicStatService;
 import com.kmall.admin.utils.ParamUtils;
+import com.kmall.common.utils.MapUtils;
 import com.kmall.common.utils.PageUtils;
 import com.kmall.common.utils.Query;
 import com.kmall.common.utils.R;

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/controller/mk/store/StoreTopicController.java

@@ -35,6 +35,7 @@ public class StoreTopicController {
     @ResponseBody
     public R list(@RequestParam Map<String, Object> params) {
         ParamUtils.setQueryPowerByRoleType(params, "storeId", "merchSn", "thirdPartyMerchCode");
+        ParamUtils.setName(params, "name");
         //查询列表数据
         Query query = new Query(params);
 

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/AdDao.java

@@ -12,4 +12,5 @@ import com.kmall.manager.dao.BaseDao;
  */
 public interface AdDao extends BaseDao<AdEntity> {
     AdEntity queryAdByTickDiscId(Integer tickDiscId);
+    AdEntity queryAdByStoreTopicId(Integer storeTopicId);
 }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java

@@ -24,4 +24,6 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
     List<GoodsEntity> querySame(Map<String, Object> map);
 
     List<GoodsEntity> queryObjectByProdBarcode(@Param("prodBarcode") String prodBarcode, @Param("merchSn") String merchSn,@Param("goodsId")Long id);
+
+    GoodsEntity queryObjectByStoreId(@Param("id") Long id, @Param("storeId") Long storeId);
 }

+ 16 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/ProductStoreRelaDao.java

@@ -47,4 +47,20 @@ public interface ProductStoreRelaDao extends BaseDao<ProductStoreRelaEntity> {
      * @return 总数
      */
     int queryGoodsRealListByDiscountTidTotal(Map<String, Object> map);
+
+    /**
+     * 根据门店活动临时表查询商品分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<ProductStoreRelaEntity> queryGoodsRealListByTopicId(Map<String, Object> map);
+
+    /**
+     * 根据门店活动临时表查询商品分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryGoodsRealListByTopicIdTotal(Map<String, Object> map);
 }

+ 20 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/UserCampMinusDao.java

@@ -0,0 +1,20 @@
+package com.kmall.admin.dao;
+
+import com.kmall.admin.entity.UserCampMinusEntity;
+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 UserCampMinusDao extends BaseDao<UserCampMinusEntity> {
+    UserCampMinusEntity queryUserCampByOrderId(@Param("orderId") Long orderId);
+
+    int cancelUserCampOrder(UserCampMinusEntity vo);
+
+    UserCampMinusEntity queryCampByStoreTopicId(@Param("storeTopicId") Long storeTopicId);
+}

+ 15 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreCampMinusDao.java

@@ -0,0 +1,15 @@
+package com.kmall.admin.dao.mk.store;
+
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity;
+import com.kmall.manager.dao.BaseDao;
+
+/**
+ * 门店满减活动Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:28
+ */
+public interface MkStoreCampMinusDao extends BaseDao<MkStoreCampMinusEntity> {
+
+}

+ 26 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreCampMinusGoodsDao.java

@@ -0,0 +1,26 @@
+package com.kmall.admin.dao.mk.store;
+
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity;
+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:29
+ */
+public interface MkStoreCampMinusGoodsDao extends BaseDao<MkStoreCampMinusGoodsEntity> {
+
+    List<MkStoreCampMinusGoodsEntity> queryCampMinusGoodsByIdList(Map<String, Object> map);
+
+    int queryCampMinusGoodsByIdTotal(Map<String, Object> map);
+
+    MkStoreCampMinusGoodsEntity queryCampMinusStoreTopicById(@Param("minusGoodId") Integer minusGoodId);
+
+    void deleteMinusGoodsByMinusId(@Param("campMinusId") Integer campMinusId);
+}

+ 34 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreCampMinusLevelDao.java

@@ -0,0 +1,34 @@
+package com.kmall.admin.dao.mk.store;
+
+import com.kmall.admin.dto.*;
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 门店满减活动层级表,活动减免类型为00:按满足最高层级减一次时增加的活动层级数据Dao
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public interface MkStoreCampMinusLevelDao extends BaseDao<MkStoreCampMinusLevelEntity> {
+    List<MkStoreCampMinusLevelEntity> queryLevelByCampMinusId(@Param("campMinusId") Integer campMinusId);
+
+    Integer deleteByCampMinusId(@Param("campMinusId") Integer campMinusId);
+
+//    List<MinusTypeUnitAttrDto> queryUnitLevelBy();
+//
+//    List<MinusTypeUnitModeDto> queryUnitMode10LevelBy();
+//
+//    List<MinusTypePieceAttrDto> queryPieceLevelBy();
+//
+//    List<MinusTypePieceModeDto> queryPieceMode10LevelBy();
+//
+//    List<MinusTypeDiscUnitAttrDto> queryDiscUnitLevelBy();
+//
+//    List<MinusTypeDiscPieceAttrDto> queryDiscPieceLevelBy();
+
+}

+ 9 - 1
kmall-admin/src/main/java/com/kmall/admin/dao/mk/store/MkStoreTicketGoodsTempDao.java

@@ -19,7 +19,7 @@ public interface MkStoreTicketGoodsTempDao extends BaseDao<MkStoreTicketGoodsTem
 
     int queryTotallDiscountByStoreId(Map<String, Object> map);
 
-    MkStoreTicketGoodsTempEntity queryGoodsTempByRealId(@Param("storeRealId") Integer storeRealId, @Param("guid")String guid);
+    MkStoreTicketGoodsTempEntity queryGoodsTempByRealId(@Param("storeRelaId") Integer storeRelaId, @Param("guid")String guid);
 
     List<MkStoreTicketGoodsTempEntity> queryGoodsTempByGuid(@Param("guid")String guid);
 
@@ -35,4 +35,12 @@ public interface MkStoreTicketGoodsTempDao extends BaseDao<MkStoreTicketGoodsTem
     List<MkStoreTicketGoodsTempEntity> queryGoodsTempIdBy(MkStoreTicketGoodsTempEntity entity);
 
     Integer deleteByGuid(@Param("guid")String guid);
+
+    MkStoreTicketGoodsTempEntity queryGoodsTempByRealIdAndTopicId(@Param("storeRelaId") Integer storeRelaId, @Param("storeTopicId")Integer storeTopicId);
+
+    List<MkStoreTicketGoodsTempEntity> queryGoodsTempByTopicId(@Param("storeTopicId")Integer storeTopicId);
+
+    void deleteByStoreTopicIdAndRealId(@Param("storeRelaId") Integer storeRelaId, @Param("storeTopicId")Integer storeTopicId);
+
+    void deleteByStoreTopicId(@Param("storeTopicId")Integer storeTopicId);
 }

+ 54 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeDiscPieceAttrDto.java

@@ -0,0 +1,54 @@
+package com.kmall.admin.dto;
+
+import java.math.BigDecimal;
+
+/**
+ * 满件满折
+ * @author huangyq
+ * @version 1.0
+ * 2019-05-30 17:36
+ */
+public class MinusTypeDiscPieceAttrDto {
+    private Integer pieceDiscConf;
+
+    private String pieceDiscPref;
+
+    private Integer isDelete;
+
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+
+    public Integer getPieceDiscConf() {
+        return pieceDiscConf;
+    }
+
+    public void setPieceDiscConf(Integer pieceDiscConf) {
+        this.pieceDiscConf = pieceDiscConf;
+    }
+
+    public String getPieceDiscPref() {
+        return pieceDiscPref;
+    }
+
+    public void setPieceDiscPref(String pieceDiscPref) {
+        this.pieceDiscPref = pieceDiscPref;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+}

+ 54 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeDiscUnitAttrDto.java

@@ -0,0 +1,54 @@
+package com.kmall.admin.dto;
+
+import java.math.BigDecimal;
+
+/**
+ * 满元满折
+ * @author huangyq
+ * @version 1.0
+ * 2019-05-30 17:36
+ */
+public class MinusTypeDiscUnitAttrDto {
+    private String yuanDiscCond;
+
+    private String yuanDiscPref;
+
+    private Integer isDelete;
+
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+
+    public String getYuanDiscCond() {
+        return yuanDiscCond;
+    }
+
+    public void setYuanDiscCond(String yuanDiscCond) {
+        this.yuanDiscCond = yuanDiscCond;
+    }
+
+    public String getYuanDiscPref() {
+        return yuanDiscPref;
+    }
+
+    public void setYuanDiscPref(String yuanDiscPref) {
+        this.yuanDiscPref = yuanDiscPref;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+}

+ 54 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypePieceAttrDto.java

@@ -0,0 +1,54 @@
+package com.kmall.admin.dto;
+
+import java.math.BigDecimal;
+
+/**
+ * 满件满减
+ * @author huangyq
+ * @version 1.0
+ * 2019-05-30 17:36
+ */
+public class MinusTypePieceAttrDto {
+    private Integer pieceMinusConf;
+
+    private String pieceMinusPref;
+
+    private Integer isDelete;
+
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+
+    public Integer getPieceMinusConf() {
+        return pieceMinusConf;
+    }
+
+    public void setPieceMinusConf(Integer pieceMinusConf) {
+        this.pieceMinusConf = pieceMinusConf;
+    }
+
+    public String getPieceMinusPref() {
+        return pieceMinusPref;
+    }
+
+    public void setPieceMinusPref(String pieceMinusPref) {
+        this.pieceMinusPref = pieceMinusPref;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+}

+ 64 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypePieceModeDto.java

@@ -0,0 +1,64 @@
+package com.kmall.admin.dto;
+
+import java.math.BigDecimal;
+
+/**
+ * 满件满减,且减免类型为每满一次减一次
+ * @author huangyq
+ * @version 1.0
+ * 2019-05-30 17:36
+ */
+public class MinusTypePieceModeDto {
+    private Integer pieceMinusConf;
+
+    private String pieceMinusPref;
+
+    private String pieceMinusEachDisc;
+
+    private Integer isDelete;
+
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+
+    public Integer getPieceMinusConf() {
+        return pieceMinusConf;
+    }
+
+    public void setPieceMinusConf(Integer pieceMinusConf) {
+        this.pieceMinusConf = pieceMinusConf;
+    }
+
+    public String getPieceMinusPref() {
+        return pieceMinusPref;
+    }
+
+    public void setPieceMinusPref(String pieceMinusPref) {
+        this.pieceMinusPref = pieceMinusPref;
+    }
+
+    public String getPieceMinusEachDisc() {
+        return pieceMinusEachDisc;
+    }
+
+    public void setPieceMinusEachDisc(String pieceMinusEachDisc) {
+        this.pieceMinusEachDisc = pieceMinusEachDisc;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+}

+ 54 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeUnitAttrDto.java

@@ -0,0 +1,54 @@
+package com.kmall.admin.dto;
+
+import java.math.BigDecimal;
+
+/**
+ * 满元满减
+ * @author huangyq
+ * @version 1.0
+ * 2019-05-30 17:36
+ */
+public class MinusTypeUnitAttrDto {
+    private String yuanMinusCond;
+
+    private String yuanMinusPref;
+
+    private Integer isDelete;
+
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+
+    public String getYuanMinusCond() {
+        return yuanMinusCond;
+    }
+
+    public void setYuanMinusCond(String yuanMinusCond) {
+        this.yuanMinusCond = yuanMinusCond;
+    }
+
+    public String getYuanMinusPref() {
+        return yuanMinusPref;
+    }
+
+    public void setYuanMinusPref(String yuanMinusPref) {
+        this.yuanMinusPref = yuanMinusPref;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+}

+ 64 - 0
kmall-admin/src/main/java/com/kmall/admin/dto/MinusTypeUnitModeDto.java

@@ -0,0 +1,64 @@
+package com.kmall.admin.dto;
+
+import java.math.BigDecimal;
+
+/**
+ * 满元满减,且减免类型为每满一次减一次
+ * @author huangyq
+ * @version 1.0
+ * 2019-05-30 17:36
+ */
+public class MinusTypeUnitModeDto {
+    private String yuanMinusCond;
+
+    private String yuanMinusPref;
+
+    private String pieceMinusEachDisc;
+
+    private Integer isDelete;
+
+    /**
+     * 满减活动id
+     */
+    private Integer campMinusId;
+
+    public String getYuanMinusCond() {
+        return yuanMinusCond;
+    }
+
+    public void setYuanMinusCond(String yuanMinusCond) {
+        this.yuanMinusCond = yuanMinusCond;
+    }
+
+    public String getYuanMinusPref() {
+        return yuanMinusPref;
+    }
+
+    public void setYuanMinusPref(String yuanMinusPref) {
+        this.yuanMinusPref = yuanMinusPref;
+    }
+
+    public String getPieceMinusEachDisc() {
+        return pieceMinusEachDisc;
+    }
+
+    public void setPieceMinusEachDisc(String pieceMinusEachDisc) {
+        this.pieceMinusEachDisc = pieceMinusEachDisc;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+}

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/AdEntity.java

@@ -51,6 +51,16 @@ public class AdEntity implements Serializable {
      */
     private Integer tickDiscId;
 
+    private Integer storeTopicId;
+
+    public Integer getStoreTopicId() {
+        return storeTopicId;
+    }
+
+    public void setStoreTopicId(Integer storeTopicId) {
+        this.storeTopicId = storeTopicId;
+    }
+
     public Integer getTickDiscId() {
         return tickDiscId;
     }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/GoodsAttributeEntity.java

@@ -30,6 +30,16 @@ public class GoodsAttributeEntity implements Serializable {
 
     private String merchSn;
 
+    private Integer storeId;
+
+    public Integer getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Integer storeId) {
+        this.storeId = storeId;
+    }
+
     public String getMerchSn() {
         return merchSn;
     }

+ 28 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java

@@ -188,6 +188,34 @@ public class GoodsEntity implements Serializable {
     //净重,kg
     private BigDecimal netWeight;
 
+    private String isSupplierGoods;
+    private String goodsIsStockShare;
+    private String isStockShareBySuppler;
+
+    public String getIsSupplierGoods() {
+        return isSupplierGoods;
+    }
+
+    public void setIsSupplierGoods(String isSupplierGoods) {
+        this.isSupplierGoods = isSupplierGoods;
+    }
+
+    public String getGoodsIsStockShare() {
+        return goodsIsStockShare;
+    }
+
+    public void setGoodsIsStockShare(String goodsIsStockShare) {
+        this.goodsIsStockShare = goodsIsStockShare;
+    }
+
+    public String getIsStockShareBySuppler() {
+        return isStockShareBySuppler;
+    }
+
+    public void setIsStockShareBySuppler(String isStockShareBySuppler) {
+        this.isStockShareBySuppler = isStockShareBySuppler;
+    }
+
     public BigDecimal getGrossWeight() {
         return grossWeight;
     }

+ 30 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/OrderEntity.java

@@ -185,6 +185,36 @@ public class OrderEntity implements Serializable {
     private Integer storeTopicId;
 
     private String couponName;
+    //订单满减
+    private BigDecimal fullCutPrice;
+
+    private Integer campMinusId;
+
+    private String campName;
+
+    public Integer getCampMinusId() {
+        return campMinusId;
+    }
+
+    public void setCampMinusId(Integer campMinusId) {
+        this.campMinusId = campMinusId;
+    }
+
+    public BigDecimal getFullCutPrice() {
+        return fullCutPrice;
+    }
+
+    public void setFullCutPrice(BigDecimal fullCutPrice) {
+        this.fullCutPrice = fullCutPrice;
+    }
+
+    public String getCampName() {
+        return campName;
+    }
+
+    public void setCampName(String campName) {
+        this.campName = campName;
+    }
 
     public String getCouponName() {
         return couponName;

+ 31 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/ProductStoreRelaEntity.java

@@ -109,6 +109,7 @@ public class ProductStoreRelaEntity implements Serializable {
 
     private Integer goodsSellVolume;
 
+    //为空则活动商品未选中
     private Integer isCheck;
 
     private String applyType;
@@ -117,6 +118,36 @@ public class ProductStoreRelaEntity implements Serializable {
 
     private String guid;
 
+    private Integer storeTopicId;
+
+    private Integer supplierThirdId;
+
+    private String isOnSale;
+
+    public String getIsOnSale() {
+        return isOnSale;
+    }
+
+    public void setIsOnSale(String isOnSale) {
+        this.isOnSale = isOnSale;
+    }
+
+    public Integer getSupplierThirdId() {
+        return supplierThirdId;
+    }
+
+    public void setSupplierThirdId(Integer supplierThirdId) {
+        this.supplierThirdId = supplierThirdId;
+    }
+
+    public Integer getStoreTopicId() {
+        return storeTopicId;
+    }
+
+    public void setStoreTopicId(Integer storeTopicId) {
+        this.storeTopicId = storeTopicId;
+    }
+
     public String getApplyType() {
         return applyType;
     }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/ThirdMerchantBizEntity.java

@@ -62,6 +62,16 @@ public class ThirdMerchantBizEntity implements Serializable {
 
     private String isDistSellStart;
 
+    private String isSupplierGoods;
+
+    public String getIsSupplierGoods() {
+        return isSupplierGoods;
+    }
+
+    public void setIsSupplierGoods(String isSupplierGoods) {
+        this.isSupplierGoods = isSupplierGoods;
+    }
+
     public String getIsDistSellStart() {
         return isDistSellStart;
     }

+ 257 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/UserCampMinusEntity.java

@@ -0,0 +1,257 @@
+package com.kmall.admin.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 UserCampMinusEntity 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;
+    }
+}

+ 517 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreCampMinusEntity.java

@@ -0,0 +1,517 @@
+package com.kmall.admin.entity.mk.store;
+
+import com.kmall.admin.dto.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 门店满减活动实体
+ * 表名 mk_store_camp_minus
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 17:41:04
+ */
+public class MkStoreCampMinusEntity 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 minusStat;
+
+    private String storeName;
+
+    private Integer submitNum;
+
+    private Integer browseNum;
+
+    private BigDecimal actMoney;
+
+    public Integer getSubmitNum() {
+        return submitNum;
+    }
+
+    public void setSubmitNum(Integer submitNum) {
+        this.submitNum = submitNum;
+    }
+
+    public Integer getBrowseNum() {
+        return browseNum;
+    }
+
+    public void setBrowseNum(Integer browseNum) {
+        this.browseNum = browseNum;
+    }
+
+    public BigDecimal getActMoney() {
+        return actMoney;
+    }
+
+    public void setActMoney(BigDecimal actMoney) {
+        this.actMoney = actMoney;
+    }
+
+    public String getStoreName() {
+        return storeName;
+    }
+
+    public void setStoreName(String storeName) {
+        this.storeName = storeName;
+    }
+
+    public String getInValidTime() {
+        return inValidTime;
+    }
+
+    public void setInValidTime(String inValidTime) {
+        this.inValidTime = inValidTime;
+    }
+
+    public String getMinusStat() {
+        return minusStat;
+    }
+
+    public void setMinusStat(String minusStat) {
+        this.minusStat = minusStat;
+    }
+
+    //满元满减
+    private List<MinusTypeUnitAttrDto> minusTypeUnitAttrList;
+    //满件满减
+    private List<MinusTypePieceAttrDto> minusTypePieceAttrList;
+    //满元满折
+    private List<MinusTypeDiscUnitAttrDto> minusTypeDiscUnitAttrList;
+    //满件满折
+    private List<MinusTypeDiscPieceAttrDto> minusTypeDiscPieceAttrList;
+    //满元满减,且减免类型为每满一次减一次
+    private List<MinusTypeUnitModeDto> minusTypeUnitMode10List;
+    //满件满减,且减免类型为每满一次减一次
+    private List<MinusTypePieceModeDto> minusTypePieceMode10List;
+
+    public List<MinusTypeUnitAttrDto> getMinusTypeUnitAttrList() {
+        return minusTypeUnitAttrList;
+    }
+
+    public void setMinusTypeUnitAttrList(List<MinusTypeUnitAttrDto> minusTypeUnitAttrList) {
+        this.minusTypeUnitAttrList = minusTypeUnitAttrList;
+    }
+
+    public List<MinusTypePieceAttrDto> getMinusTypePieceAttrList() {
+        return minusTypePieceAttrList;
+    }
+
+    public void setMinusTypePieceAttrList(List<MinusTypePieceAttrDto> minusTypePieceAttrList) {
+        this.minusTypePieceAttrList = minusTypePieceAttrList;
+    }
+
+    public List<MinusTypeDiscUnitAttrDto> getMinusTypeDiscUnitAttrList() {
+        return minusTypeDiscUnitAttrList;
+    }
+
+    public void setMinusTypeDiscUnitAttrList(List<MinusTypeDiscUnitAttrDto> minusTypeDiscUnitAttrList) {
+        this.minusTypeDiscUnitAttrList = minusTypeDiscUnitAttrList;
+    }
+
+    public List<MinusTypeDiscPieceAttrDto> getMinusTypeDiscPieceAttrList() {
+        return minusTypeDiscPieceAttrList;
+    }
+
+    public void setMinusTypeDiscPieceAttrList(List<MinusTypeDiscPieceAttrDto> minusTypeDiscPieceAttrList) {
+        this.minusTypeDiscPieceAttrList = minusTypeDiscPieceAttrList;
+    }
+
+    public List<MinusTypeUnitModeDto> getMinusTypeUnitMode10List() {
+        return minusTypeUnitMode10List;
+    }
+
+    public void setMinusTypeUnitMode10List(List<MinusTypeUnitModeDto> minusTypeUnitMode10List) {
+        this.minusTypeUnitMode10List = minusTypeUnitMode10List;
+    }
+
+    public List<MinusTypePieceModeDto> getMinusTypePieceMode10List() {
+        return minusTypePieceMode10List;
+    }
+
+    public void setMinusTypePieceMode10List(List<MinusTypePieceModeDto> minusTypePieceMode10List) {
+        this.minusTypePieceMode10List = minusTypePieceMode10List;
+    }
+
+    /**
+     * 设置:满减活动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;
+    }
+}

+ 276 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreCampMinusGoodsEntity.java

@@ -0,0 +1,276 @@
+package com.kmall.admin.entity.mk.store;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 门店满减活动商品,参与满减活动的商品实体
+ * 表名 mk_store_camp_minus_goods
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public class MkStoreCampMinusGoodsEntity 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;
+
+    private String goodsName;
+
+    private String storeName;
+
+    private BigDecimal retailPrice;
+
+    private BigDecimal marketPrice;
+
+    private BigDecimal actualTotalPrice;
+
+    private String isOnSale;
+
+    private Integer storeTopicId;
+
+    public Integer getStoreTopicId() {
+        return storeTopicId;
+    }
+
+    public void setStoreTopicId(Integer storeTopicId) {
+        this.storeTopicId = storeTopicId;
+    }
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public String getStoreName() {
+        return storeName;
+    }
+
+    public void setStoreName(String storeName) {
+        this.storeName = storeName;
+    }
+
+    public BigDecimal getRetailPrice() {
+        return retailPrice;
+    }
+
+    public void setRetailPrice(BigDecimal retailPrice) {
+        this.retailPrice = retailPrice;
+    }
+
+    public BigDecimal getMarketPrice() {
+        return marketPrice;
+    }
+
+    public void setMarketPrice(BigDecimal marketPrice) {
+        this.marketPrice = marketPrice;
+    }
+
+    public BigDecimal getActualTotalPrice() {
+        return actualTotalPrice;
+    }
+
+    public void setActualTotalPrice(BigDecimal actualTotalPrice) {
+        this.actualTotalPrice = actualTotalPrice;
+    }
+
+    public String getIsOnSale() {
+        return isOnSale;
+    }
+
+    public void setIsOnSale(String isOnSale) {
+        this.isOnSale = isOnSale;
+    }
+
+    /**
+     * 设置:满减活动商品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-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreCampMinusLevelEntity.java

@@ -0,0 +1,359 @@
+package com.kmall.admin.entity.mk.store;
+
+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 17:41:04
+ */
+public class MkStoreCampMinusLevelEntity 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;
+    }
+}

+ 11 - 1
kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreTicketGoodsTempEntity.java

@@ -9,7 +9,7 @@ import java.util.List;
 
 /**
  * 门店优惠券活动商品,临时表
- * 表名 mk_store_ticket_goods_temp
+ * 表名 mk_store_topic_goods_temp
  *
  * @author emato
  * @email admin@qhdswl.com
@@ -75,6 +75,16 @@ public class MkStoreTicketGoodsTempEntity implements Serializable {
 
     private List<Integer> storeRelaIdList;
 
+    private Integer storeTopicId;
+
+    public Integer getStoreTopicId() {
+        return storeTopicId;
+    }
+
+    public void setStoreTopicId(Integer storeTopicId) {
+        this.storeTopicId = storeTopicId;
+    }
+
     public List<Integer> getStoreRelaIdList() {
         return storeRelaIdList;
     }

+ 10 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/mk/store/MkStoreTopicStatEntity.java

@@ -140,6 +140,16 @@ public class MkStoreTopicStatEntity implements Serializable {
 
     private String userName;//用户名称
 
+    private Integer promTypeId;
+
+    public Integer getPromTypeId() {
+        return promTypeId;
+    }
+
+    public void setPromTypeId(Integer promTypeId) {
+        this.promTypeId = promTypeId;
+    }
+
     public String getUserName() {
         return userName;
     }

+ 16 - 0
kmall-admin/src/main/java/com/kmall/admin/service/ProductStoreRelaService.java

@@ -92,4 +92,20 @@ public interface ProductStoreRelaService {
      * @return 总数
      */
     int queryGoodsRealListByDiscountTidTotal(Map<String, Object> map);
+
+    /**
+     * 根据门店活动临时表查询商品分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<ProductStoreRelaEntity> queryGoodsRealListByTopicId(Map<String, Object> map);
+
+    /**
+     * 根据门店活动临时表查询商品分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryGoodsRealListByTopicIdTotal(Map<String, Object> map);
 }

+ 24 - 15
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -29,10 +29,6 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private GoodsDao goodsDao;
     @Autowired
-    private GoodsAttributeDao goodsAttributeDao;
-    @Autowired
-    private AttributeDao attributeDao;
-    @Autowired
     private ProductDao productDao;
     @Autowired
     private GoodsGalleryDao goodsGalleryDao;
@@ -49,16 +45,10 @@ public class GoodsServiceImpl implements GoodsService {
     @Autowired
     private SupplierDao supplierDao;
     @Autowired
-    private BrandDao brandDao;
-    @Autowired
-    private FreightDao freightDao;
-    @Autowired
     private SysCusNationCodeDao sysCusNationCodeDao;
     @Autowired
     private SysCusUnitCodeDao sysCusUnitCodeDao;
     @Autowired
-    private MerchDao merchDao;
-    @Autowired
     private ExportExceptionDataDao exportExceptionDataDao;
     @Autowired
     private CartDao cartDao;
@@ -118,6 +108,7 @@ public class GoodsServiceImpl implements GoodsService {
 //        builder.put("brandId", "品牌");
         builder.put("supplierId", "供应商");
 //        builder.put("freightId", "运费模版");
+        builder.put("goodsNumber", "商品库存");
         builder.put("primaryPicUrl", "商品主图");
         builder.put("listPicUrl", "商品列表图");
         builder.put("goodsDesc", "商品描述");
@@ -146,7 +137,7 @@ public class GoodsServiceImpl implements GoodsService {
                 throw new RRException(r.get("msg").toString());
             }
         }
-        ThirdMerchantBizEntity thirdMerchantBizEntity = thirdMerchantBizDao.getThirdMerchangByCode(goods.getThirdPartyMerchCode());
+        /*ThirdMerchantBizEntity thirdMerchantBizEntity = thirdMerchantBizDao.getThirdMerchangByCode(goods.getThirdPartyMerchCode());
         if(thirdMerchantBizEntity == null){
             throw new RRException("第三方商户信息不存在");
         }
@@ -155,7 +146,7 @@ public class GoodsServiceImpl implements GoodsService {
             if(Dict.isStockShare.item_1.getItem().equalsIgnoreCase(thirdMerchantBizEntity.getIsStockShare())){
                 builder.put("goodsNumber", "商品库存");
             }
-        }
+        }*/
         r = ValidatorUtil.isEmpty(builder.build(), valideDate);
         if (Integer.valueOf(r.get("code").toString()) != 0) {
             throw new RRException(r.get("msg").toString());
@@ -289,6 +280,7 @@ public class GoodsServiceImpl implements GoodsService {
         builder.put("goodsBizType", "货品业务类型");
 //        builder.put("brandId", "品牌");
         builder.put("supplierId", "供应商");
+        builder.put("goodsNumber", "商品库存");
 //        builder.put("freightId", "运费模版");
         builder.put("primaryPicUrl", "商品主图");
         builder.put("listPicUrl", "商品列表图");
@@ -319,17 +311,21 @@ public class GoodsServiceImpl implements GoodsService {
                 throw new RRException(r.get("msg").toString());
             }
         }
+        /*ThirdMerchantBizEntity thirdMerchantBizEntity = thirdMerchantBizDao.getThirdMerchangByCode(goods.getThirdPartyMerchCode());
+        if(thirdMerchantBizEntity == null){
+            throw new RRException("所属第三方商户不存在");
+        }*/
         GoodsEntity goodsEntity = goodsDao.queryObject(goods.getId());
         if(goodsEntity != null){
-            if(Dict.orderBizType.item_00.getItem().equalsIgnoreCase(goods.getGoodsBizType())){
-                if(Dict.isStockShare.item_1.getItem().equalsIgnoreCase(goodsEntity.getIsStockShare())){
+            /*if(Dict.orderBizType.item_00.getItem().equalsIgnoreCase(goods.getGoodsBizType())){
+                if(Dict.isStockShare.item_1.getItem().equalsIgnoreCase(thirdMerchantBizEntity.getIsStockShare())){
                     builder.put("goodsNumber", "商品库存");
                 }
             }
             r = ValidatorUtil.isEmpty(builder.build(), valideDate);
             if (Integer.valueOf(r.get("code").toString()) != 0) {
                 throw new RRException(r.get("msg").toString());
-            }
+            }*/
         }else{
             throw new RRException("商品不存在");
         }
@@ -339,6 +335,16 @@ public class GoodsServiceImpl implements GoodsService {
         if (galleryEntityList == null || galleryEntityList.size() <= 0) {
             throw new RRException("至少保留一张商品轮播图!");
         }
+        Integer goodsNumber = goods.getGoodsNumber();//商品总库存
+        Integer storeTotalGoodsNumber = 0;//商品分配库存
+        List<ProductStoreRelaEntity> proStoreList = productStoreRelaDao.queryByGoodsId(goodsEntity.getId());
+        for(ProductStoreRelaEntity relaEntity: proStoreList){
+            storeTotalGoodsNumber = storeTotalGoodsNumber + relaEntity.getStockNum();
+        }
+        if(goodsNumber < storeTotalGoodsNumber){
+            throw new RRException("该商品已在各门店分配库存"+storeTotalGoodsNumber+",当前商品总库存不能小于分配库存总额!请先修改门店库存!");
+        }
+
         List<GoodsEntity> prodbarGoodsList = goodsDao.queryObjectByProdBarcode(goods.getProdBarcode(),goods.getMerchSn(),goods.getId());
         if(prodbarGoodsList != null && prodbarGoodsList.size() > 0){
             throw new RRException("不能有重复的产品条码信息!");
@@ -369,6 +375,9 @@ public class GoodsServiceImpl implements GoodsService {
         if(goods.getGoodsNumber()==null){
             goods.setGoodsNumber(0);
         }else{
+            if(goodsEntity.getGoodsNumber() == null){
+                goodsEntity.setGoodsNumber(0);
+            }
             MngChangeEntity mngChangeEntity = new MngChangeEntity();
             mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(goods.getId())));
             mngChangeEntity.setThirdPartyMerchCode(goods.getThirdPartyMerchCode());

+ 108 - 96
kmall-admin/src/main/java/com/kmall/admin/service/impl/OrderServiceImpl.java

@@ -73,6 +73,8 @@ public class OrderServiceImpl implements OrderService {
     private ThirdMerchExpressDao thirdMerchExpressDao;
     @Autowired
     private MkStorePromOrderRealDao mkStorePromOrderRealDao;
+    @Autowired
+    private UserCampMinusDao userCampMinusDao;
 
     @Override
     public OrderEntity queryObject(Long id) {
@@ -115,18 +117,22 @@ public class OrderServiceImpl implements OrderService {
         if (order.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
             order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_101.getItem()));
         }
-        // 判断是否有优惠券
-        UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
-        if (null != couponVo) {
-            userCouponDao.cancelOrder(couponVo);
-        }
         orderDao.update(order);
-
         if (!needUpdateStock) {
             return;
         }
         // 更新库存
         updateStock(order, "管理后台取消订单");
+        // 释放优惠券
+        UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
+        if (null != couponVo) {
+            userCouponDao.cancelOrder(couponVo);
+        }
+        //释放促销满减券
+        UserCampMinusEntity userCampMinusVo = userCampMinusDao.queryUserCampByOrderId(order.getId());
+        if (null != userCampMinusVo) {
+            userCampMinusDao.cancelUserCampOrder(userCampMinusVo);
+        }
     }
 
     @Override
@@ -298,7 +304,8 @@ public class OrderServiceImpl implements OrderService {
             }
         }
         orderDao.update(order);//修改为退款中
-        // 判断是否有优惠券
+        // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
+        /*// 判断是否有优惠券
         UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
         if (null != couponVo) {
             userCouponDao.cancelOrder(couponVo);
@@ -308,7 +315,7 @@ public class OrderServiceImpl implements OrderService {
             return;
         }
         // 更新库存
-        updateStock(order, "管理后台订单退款");
+        updateStock(order, "管理后台订单退款");*/
 
         queryStorePromRealUpdateIsScan(order);
     }
@@ -344,7 +351,8 @@ public class OrderServiceImpl implements OrderService {
             orderRefundDao.save(orderRefund);//退款记录
         }
         orderDao.update(order);//修改为退款中
-        // 判断是否有优惠券
+        // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
+        /*// 判断是否有优惠券
         UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
         if (null != couponVo) {
             userCouponDao.cancelOrder(couponVo);
@@ -354,7 +362,7 @@ public class OrderServiceImpl implements OrderService {
             return;
         }
         // 更新库存
-        updateStock(order, "管理后台平安退款订单");
+        updateStock(order, "管理后台平安退款订单");*/
 
         queryStorePromRealUpdateIsScan(order);
     }
@@ -403,7 +411,8 @@ public class OrderServiceImpl implements OrderService {
             orderRefundDao.save(orderRefund);//退款记录
         }
         orderDao.update(order);//修改为退款中
-        // 判断是否有优惠券
+        // TODO: 2019/6/13 定时任务查询退款成功后释放库存、优惠券
+        /*// 判断是否有优惠券
         UserCouponEntity couponVo = userCouponDao.queryByOrderId(order.getId());
         if (null != couponVo) {
             userCouponDao.cancelOrder(couponVo);
@@ -413,7 +422,7 @@ public class OrderServiceImpl implements OrderService {
             return;
         }
         // 更新库存
-        updateStock(order, "管理后台微信国际退款订单");
+        updateStock(order, "管理后台微信国际退款订单");*/
 
         queryStorePromRealUpdateIsScan(order);
     }
@@ -436,94 +445,91 @@ public class OrderServiceImpl implements OrderService {
 
             Integer stockNum = 0;
             // TODO: 2019/3/5  普通商品不受共享库存影响,直接取门店配置库存
-            if(storeRelaEntity.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
-                if (storeRelaEntity.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) {
-                    //还原商户商品库存
-                    stockNum = storeRelaEntity.getGoodsNumber();
-                    GoodsEntity goodsEntity = goodsDao.queryObject(storeRelaEntity.getGoodsId());
-                    if(goodsEntity!=null){
-                        goodsEntity.setGoodsNumber(stockNum + orderGoodsEntity.getNumber());
-//                        goodsEntity.setSellVolume(Integer.parseInt(goodsSellVolume.toString()));
-                        goodsDao.update(goodsEntity);
-
-                        storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
-                        productStoreRelaDao.update(storeRelaEntity);
-                        
-                        MngChangeEntity mngChangeEntity = new MngChangeEntity();
-                        mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(goodsEntity.getId())));
-                        mngChangeEntity.setThirdPartyMerchCode(goodsEntity.getThirdPartyMerchCode());
-                        mngChangeEntity.setChangeReason(changeReason);
-                        mngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
-                        mngChangeEntity.setChangeNum(orderGoodsEntity.getNumber());//变化数
-                        mngChangeEntity.setOriginalNum(stockNum);//原库存数
-                        mngChangeEntity.setValidNum(stockNum + orderGoodsEntity.getNumber());//可用数
-                        mngChangeEntity.setCreateTime(new Date());
-                        mngChangeEntity.setModTime(new Date());
-                        mngChangeEntity.setCreaterSn(user.getUsername());
-                        mngChangeEntity.setModerSn(user.getUsername());
-                        mngChangeEntity.setIsValid(0);
-                        mngChangeEntity.setMerchSn(goodsEntity.getMerchSn());
-                        mngChangeDao.save(mngChangeEntity);
-                    }
-                }
-                if (storeRelaEntity.getIsStockShare().equalsIgnoreCase(Dict.isStockShare.item_0.getItem())) {
-                    //还原门店库存
-                    if (null == storeRelaEntity.getStockNum()) {
-                        stockNum = 0;
-                    }else{
-                        stockNum = storeRelaEntity.getStockNum();
-                    }
-                    storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
-                    storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
-                    productStoreRelaDao.update(storeRelaEntity);
-
-                    StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
-                    storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
-                    storeMngChangeEntity.setChangeReason(changeReason);
-                    storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(storeRelaEntity.getGoodsId())));
-                    storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(storeRelaEntity.getStoreId())));
-                    storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
-                    storeMngChangeEntity.setCreateTime(new Date());
-                    storeMngChangeEntity.setModTime(new Date());
-                    storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
-                    storeMngChangeEntity.setStoreOriginalNum(stockNum);
-                    storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
-                    storeMngChangeEntity.setCreaterSn(user.getUsername());
-                    storeMngChangeEntity.setModerSn(user.getUsername());
-                    storeMngChangeEntity.setIsValid(0);
-                    storeMngChangeDao.save(storeMngChangeEntity);
-                }
-            }else {
+            if (null != storeRelaEntity.getStockNum()) {
+                stockNum = storeRelaEntity.getStockNum();
                 //还原门店库存
-                if (null == storeRelaEntity.getStockNum()) {
-                    stockNum = 0;
-                }else{
-                    stockNum = storeRelaEntity.getStockNum();
-                }
-                storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
-                storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
-                productStoreRelaDao.update(storeRelaEntity);
-
-                StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
-                storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
-                storeMngChangeEntity.setChangeReason(changeReason);
-                storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(storeRelaEntity.getGoodsId())));
-                storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(storeRelaEntity.getStoreId())));
-                storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
-                storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
-                storeMngChangeEntity.setStoreOriginalNum(stockNum);
-                storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
-                storeMngChangeEntity.setCreateTime(new Date());
-                storeMngChangeEntity.setModTime(new Date());
-                storeMngChangeEntity.setCreaterSn(user.getUsername());
-                storeMngChangeEntity.setModerSn(user.getUsername());
-                storeMngChangeEntity.setIsValid(0);
-                storeMngChangeDao.save(storeMngChangeEntity);
+                resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
+            }
+            GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
+            if(goodsEntity != null){
+                stockNum = goodsEntity.getGoodsNumber();
+                //还原商户商品库存
+                resetGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
             }
         }
     }
 
     /**
+     * 还原商品总库存
+     * @param stockNum
+     * @param storeRelaEntity
+     * @param orderGoodsEntity
+     * @param sellVolume
+     * @param changeReason
+     * @param user
+     */
+    private void resetGoodsStock(Integer stockNum, ProductStoreRelaEntity storeRelaEntity,
+                                 OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user){
+        GoodsEntity goodsEntity = goodsDao.queryObject(storeRelaEntity.getGoodsId());
+        if(goodsEntity!=null){
+            goodsEntity.setGoodsNumber(stockNum + orderGoodsEntity.getNumber());
+//                        goodsEntity.setSellVolume(Integer.parseInt(goodsSellVolume.toString()));
+            goodsDao.update(goodsEntity);
+
+//            storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
+//            productStoreRelaDao.update(storeRelaEntity);
+
+            MngChangeEntity mngChangeEntity = new MngChangeEntity();
+            mngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(goodsEntity.getId())));
+            mngChangeEntity.setThirdPartyMerchCode(goodsEntity.getThirdPartyMerchCode());
+            mngChangeEntity.setChangeReason(changeReason);
+            mngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
+            mngChangeEntity.setChangeNum(orderGoodsEntity.getNumber());//变化数
+            mngChangeEntity.setOriginalNum(stockNum);//原库存数
+            mngChangeEntity.setValidNum(stockNum + orderGoodsEntity.getNumber());//可用数
+            mngChangeEntity.setCreateTime(new Date());
+            mngChangeEntity.setModTime(new Date());
+            mngChangeEntity.setCreaterSn(user.getUsername());
+            mngChangeEntity.setModerSn(user.getUsername());
+            mngChangeEntity.setIsValid(0);
+            mngChangeEntity.setMerchSn(goodsEntity.getMerchSn());
+            mngChangeDao.save(mngChangeEntity);
+        }
+    }
+
+    /**
+     * 还原门店商品库存
+     * @param stockNum
+     * @param storeRelaEntity
+     * @param orderGoodsEntity
+     * @param sellVolume
+     * @param changeReason
+     * @param user
+     */
+    private void resetStoreGoodsStock(Integer stockNum, ProductStoreRelaEntity storeRelaEntity,
+                                 OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user){
+        storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
+        storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
+        productStoreRelaDao.update(storeRelaEntity);
+
+        StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
+        storeMngChangeEntity.setChangeType(Dict.changeType.item_0.getItem());
+        storeMngChangeEntity.setChangeReason(changeReason);
+        storeMngChangeEntity.setGoodsId(Integer.parseInt(String.valueOf(storeRelaEntity.getGoodsId())));
+        storeMngChangeEntity.setStoreId(Integer.parseInt(String.valueOf(storeRelaEntity.getStoreId())));
+        storeMngChangeEntity.setMerchSn(storeRelaEntity.getMerchSn());
+        storeMngChangeEntity.setStoreChangeNum(orderGoodsEntity.getNumber());
+        storeMngChangeEntity.setStoreOriginalNum(stockNum);
+        storeMngChangeEntity.setStoreValidNum(stockNum + orderGoodsEntity.getNumber());
+        storeMngChangeEntity.setCreateTime(new Date());
+        storeMngChangeEntity.setModTime(new Date());
+        storeMngChangeEntity.setCreaterSn(user.getUsername());
+        storeMngChangeEntity.setModerSn(user.getUsername());
+        storeMngChangeEntity.setIsValid(0);
+        storeMngChangeDao.save(storeMngChangeEntity);
+    }
+
+    /**
      * 查询该退款订单编号是否是推广渠道订单,是则修改渠道定时扫描状态
      * @param orderInfo
      */
@@ -556,7 +562,7 @@ public class OrderServiceImpl implements OrderService {
             }
             if (refundEntity.getRefundStatus() == 2) {
                 orderInfo.setOrderStatus(401);
-                UserEntity entity = userDao.queryObject(orderInfo.getUserId());
+//                UserEntity entity = userDao.queryObject(orderInfo.getUserId());
             } else {
                 orderInfo.setOrderStatus(201);
             }
@@ -803,7 +809,8 @@ public class OrderServiceImpl implements OrderService {
             }
             // 检查库存和更新库存
             for (OfflineCartEntity cartEntity : offlineCartEntityList) {
-                if (goodsDao.queryObject(cartEntity.getGoodsId()) == null) {
+                GoodsEntity goodsEntity = goodsDao.queryObject(cartEntity.getGoodsId());
+                if (goodsEntity == null) {
                     resultObj.put("errno", 400);
                     resultObj.put("errmsg", "订单提交失败:商品不存在");
                     return resultObj;
@@ -822,6 +829,11 @@ public class OrderServiceImpl implements OrderService {
                         productInfo.setStoreId(Long.valueOf(storeId));
                         productInfo.addSellVolume();
                         productStoreRelaDao.updateStockNum(productInfo);//修改普通商品库存
+
+                        if(goodsEntity != null) {
+                            goodsEntity.setGoodsNumber(goodsEntity.getGoodsNumber() - cartEntity.getNumber());
+                            goodsDao.update(goodsEntity);
+                        }
                     }
                 }
             }

+ 60 - 8
kmall-admin/src/main/java/com/kmall/admin/service/impl/ProductStoreRelaServiceImpl.java

@@ -8,6 +8,7 @@ import com.kmall.admin.entity.*;
 import com.kmall.admin.entity.mk.dist.MkDistSellAllocationEntity;
 import com.kmall.admin.service.ProductStoreRelaService;
 import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.api.util.StockUtil;
 import com.kmall.common.constant.Dict;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
 import com.kmall.common.utils.*;
@@ -62,6 +63,7 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
         ProductStoreRelaEntity productStoreRelaEntity = productStoreRelaDao.queryObject(id);
 
         Map<String, Object> map = new HashMap<String, Object>();
+        map.put("storeId", productStoreRelaEntity.getStoreId());
         map.put("goodsId", productStoreRelaEntity.getGoodsId());
         List<GoodsAttributeEntity> attributeEntities = goodsAttributeDao.queryList(map);
         productStoreRelaEntity.setAttributeEntityList(attributeEntities);
@@ -92,6 +94,7 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
     @Override
     public int save(ProductStoreRelaEntity productStoreRela) {
         GoodsEntity goodsEntity = null;
+        String isStockShare = "";
         Map<String, Object> valideDate = MapBeanUtil.fromObject(productStoreRela);
         ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
         builder.put("storeId", "门店");
@@ -106,8 +109,10 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
             throw new RRException(r.get("msg").toString());
         } else {
             goodsEntity = goodsDao.queryObject(productStoreRela.getGoodsId());
-            if(Dict.orderBizType.item_00.getItem().equalsIgnoreCase(goodsEntity.getGoodsBizType())){
-                if(Dict.isStockShare.item_0.getItem().equalsIgnoreCase(goodsEntity.getIsStockShare())){
+            isStockShare = StockUtil.getIsStockShareByGoodsEntity(goodsEntity.getIsSupplierGoods(),
+                    goodsEntity.getIsStockShare(), goodsEntity.getIsStockShare());
+            if(goodsEntity.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem())){
+                if(isStockShare.equalsIgnoreCase(Dict.isStockShare.item_0.getItem())){
                     builder.put("stockNum", "库存");
                 }
             }else{
@@ -140,9 +145,10 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
         if(!goodsEntity.getMerchSn().equalsIgnoreCase(productStoreRela.getMerchSn())) {
             throw new RRException("该商品所属商户不属于该门店所属商户!");
         }
+        checkStockNum(productStoreRela, goodsEntity, isStockShare);
+
         String storeId = String.valueOf(productStoreRela.getStoreId());
         String goodsId = String.valueOf(goodsEntity.getId());
-
         Map<String, Object> map = Maps.newHashMap();
         map.put("goodsId", goodsId);
         map.put("storeId", storeId);
@@ -198,6 +204,7 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
             for (GoodsAttributeEntity item : attributeEntityList) {
                 if (item.getIsDelete() == 0) {
                     if (item.getId() == null && item.getAttributeId() != null && com.kmall.common.utils.StringUtils.isNotEmpty(item.getValue())) {
+                        item.setStoreId(Integer.parseInt(String.valueOf(productStoreRela.getStoreId())));
                         item.setGoodsId(goodsEntity.getId());
                         item.setMerchSn(goodsEntity.getMerchSn());
                         goodsAttributeDao.save(item);
@@ -246,6 +253,7 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
     @Override
     public int update(ProductStoreRelaEntity productStoreRela) {
         GoodsEntity goodsEntity = null;
+        String isStockShare = "";
         Map<String, Object> valideDate = MapBeanUtil.fromObject(productStoreRela);
         ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
         builder.put("storeId", "门店");
@@ -260,9 +268,11 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
         if (Integer.valueOf(r.get("code").toString()) != 0) {
             throw new RRException(r.get("msg").toString());
         } else {
-            goodsEntity = goodsDao.queryObject(productStoreRela.getGoodsId());
+            goodsEntity = goodsDao.queryObjectByStoreId(productStoreRela.getGoodsId(), productStoreRela.getStoreId());
+            isStockShare = StockUtil.getIsStockShareByGoodsEntity(goodsEntity.getIsSupplierGoods(),
+                    goodsEntity.getIsStockShare(), goodsEntity.getIsStockShareBySuppler());
             if(Dict.orderBizType.item_00.getItem().equalsIgnoreCase(goodsEntity.getGoodsBizType())){
-                if(Dict.isStockShare.item_0.getItem().equalsIgnoreCase(goodsEntity.getIsStockShare())){
+                if(Dict.isStockShare.item_0.getItem().equalsIgnoreCase(isStockShare)){
                     builder.put("stockNum", "库存");
                 }
             }else{
@@ -284,9 +294,10 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
             throw new RRException("该商品所属商户不属于该门店所属商户!");
         }
 
+        checkStockNum(productStoreRela, goodsEntity, isStockShare);
+
         String storeId = String.valueOf(productStoreRela.getStoreId());
         String goodsId = String.valueOf(goodsEntity.getId());
-
         Map<String, Object> map = Maps.newHashMap();
         map.put("goodsId", goodsId);
         map.put("storeId", storeId);
@@ -353,10 +364,12 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
                 if (item.getIsDelete() == 0) {
                     if (item.getId() != null) {
                         item.setMerchSn(goodsEntity.getMerchSn());
+                        item.setStoreId(Integer.parseInt(String.valueOf(productStoreRela.getStoreId())));
                         goodsAttributeDao.update(item);
                     } else if (item.getId() == null && item.getAttributeId() != null && com.kmall.common.utils.StringUtils.isNotEmpty(item.getValue())) {
                         item.setMerchSn(goodsEntity.getMerchSn());
                         item.setGoodsId(goodsEntity.getId());
+                        item.setStoreId(Integer.parseInt(String.valueOf(productStoreRela.getStoreId())));
                         goodsAttributeDao.save(item);
                     } else if (item.getId() == null && item.getAttributeId() != null && com.kmall.common.utils.StringUtils.isNullOrEmpty(item.getValue())) {
                         throw new RRException("商品属性【" + attributeDao.queryObject(item.getAttributeId()).getName() + "】值不能为空!");
@@ -393,8 +406,8 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
         storeMngChangeEntity.setCreaterSn(user.getUsername());
         storeMngChangeEntity.setModerSn(user.getUsername());
 
-        Integer orginalNum = productStoreRelaEntity.getStockNum();//原有库存
-        Integer changeNum = productStoreRela.getStockNum();//前端变化库存
+        Integer orginalNum = productStoreRelaEntity.getStockNum()==null?0:productStoreRelaEntity.getStockNum();//原有库存
+        Integer changeNum = productStoreRela.getStockNum()==null ? 0 : productStoreRela.getStockNum();//前端变化库存
         if(changeNum != orginalNum) {
             if (orginalNum > changeNum) {
                 storeMngChangeEntity.setStoreChangeNum(orginalNum - changeNum);//变化数
@@ -415,6 +428,35 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
         return productStoreRelaDao.update(productStoreRela);
     }
 
+    private void checkStockNum(ProductStoreRelaEntity productStoreRela, GoodsEntity goodsEntity, String isStockShare){
+        if(goodsEntity.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase(Dict.isStockShare.item_1.getItem())){
+            Integer stockNum = productStoreRela.getStockNum();
+            Integer goodsNumber = goodsEntity.getGoodsNumber();//商品总库存
+            if (stockNum.intValue() != goodsNumber.intValue()) {
+                throw new RRException("当前门店商品分配库存不等于商品总库存!当前门店属于共享库存,需与总库存一致,该商品总库存【" + goodsNumber + "】");
+            } else {
+                productStoreRela.setStockNum(goodsEntity.getGoodsNumber());
+            }
+        }
+        if((!goodsEntity.getGoodsBizType().equalsIgnoreCase(Dict.orderBizType.item_00.getItem()) && isStockShare.equalsIgnoreCase(Dict.isStockShare.item_1.getItem())) ||
+                isStockShare.equalsIgnoreCase(Dict.isStockShare.item_0.getItem())){
+            Integer stockNum = productStoreRela.getStockNum();
+            Integer goodsNumber = goodsEntity.getGoodsNumber();//商品总库存
+            Integer storeTotalStockNum = 0;//商品分配库存
+            List<ProductStoreRelaEntity> proStoreList = productStoreRelaDao.queryByGoodsId(goodsEntity.getId());
+            for(ProductStoreRelaEntity relaEntity: proStoreList){
+                if(relaEntity.getStoreId().intValue() != productStoreRela.getStoreId().intValue()) {
+                    storeTotalStockNum = storeTotalStockNum + relaEntity.getStockNum();
+                }
+            }
+            Integer totalStockNum = storeTotalStockNum + stockNum;
+            if(goodsNumber < totalStockNum){
+                throw new RRException("当前门店商品分配库存已超过商品总库存!当前门店商品分配库存【" + stockNum + "】,已在各门店分配库存总额【"+
+                        storeTotalStockNum + "】,该商品总库存【" + goodsNumber + "】");
+            }
+        }
+    }
+
     @Override
     public int delete(Integer id) {
         return productStoreRelaDao.delete(id);
@@ -436,4 +478,14 @@ public class ProductStoreRelaServiceImpl implements ProductStoreRelaService {
         return productStoreRelaDao.queryGoodsRealListByDiscountTidTotal(map);
     }
 
+    @Override
+    public List<ProductStoreRelaEntity> queryGoodsRealListByTopicId(Map<String, Object> map) {
+        return productStoreRelaDao.queryGoodsRealListByTopicId(map);
+    }
+
+    @Override
+    public int queryGoodsRealListByTopicIdTotal(Map<String, Object> map) {
+        return productStoreRelaDao.queryGoodsRealListByTopicIdTotal(map);
+    }
+
 }

+ 108 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreCampMinusGoodsServiceImpl.java

@@ -0,0 +1,108 @@
+package com.kmall.admin.service.impl.mk.store;
+
+import com.kmall.admin.dao.mk.store.MkStoreCampMinusGoodsDao;
+import com.kmall.admin.dao.mk.store.MkStoreTicketGoodsTempDao;
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity;
+import com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.service.mk.store.MkStoreCampMinusGoodsService;
+import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.common.utils.RRException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动商品,参与满减活动的商品Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+@Service("mkStoreCampMinusGoodsService")
+public class MkStoreCampMinusGoodsServiceImpl implements MkStoreCampMinusGoodsService {
+    @Autowired
+    private MkStoreCampMinusGoodsDao mkStoreCampMinusGoodsDao;
+    @Autowired
+    private MkStoreTicketGoodsTempDao mkStoreTicketGoodsTempDao;
+
+    @Override
+    public MkStoreCampMinusGoodsEntity queryObject(Integer minusGoodId) {
+        return mkStoreCampMinusGoodsDao.queryObject(minusGoodId);
+    }
+
+    @Override
+    public List<MkStoreCampMinusGoodsEntity> queryList(Map<String, Object> map) {
+        return mkStoreCampMinusGoodsDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return mkStoreCampMinusGoodsDao.queryTotal(map);
+    }
+
+    @Override
+    public List<MkStoreCampMinusGoodsEntity> queryCampMinusGoodsByIdList(Map<String, Object> map) {
+        return mkStoreCampMinusGoodsDao.queryCampMinusGoodsByIdList(map);
+    }
+
+    @Override
+    public int queryCampMinusGoodsByIdTotal(Map<String, Object> map) {
+        return mkStoreCampMinusGoodsDao.queryCampMinusGoodsByIdTotal(map);
+    }
+
+    @Override
+    public int save(MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods) {
+        return mkStoreCampMinusGoodsDao.save(mkStoreCampMinusGoods);
+    }
+
+    @Override
+    public int update(MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods) {
+        return mkStoreCampMinusGoodsDao.update(mkStoreCampMinusGoods);
+    }
+
+    @Override
+    public int delete(Integer minusGoodId) {
+        return mkStoreCampMinusGoodsDao.delete(minusGoodId);
+    }
+
+    @Transactional
+    @Override
+    public int deleteBatch(Integer[]minusGoodIds) {
+        for(int i=0; i<minusGoodIds.length;i++){
+            MkStoreCampMinusGoodsEntity entity = mkStoreCampMinusGoodsDao.queryCampMinusStoreTopicById(minusGoodIds[i]);
+            if(entity == null){
+                throw new RRException("当前选择的满减满折信息不存在");
+            }
+            mkStoreTicketGoodsTempDao.deleteByStoreTopicIdAndRealId(entity.getStoreRelaId(), entity.getStoreTopicId());
+        }
+        return mkStoreCampMinusGoodsDao.deleteBatch(minusGoodIds);
+    }
+
+    @Transactional
+    @Override
+    public int batchSaveCampMinusGoods(MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+
+        mkStoreCampMinusGoodsDao.deleteMinusGoodsByMinusId(mkStoreCampMinusGoods.getCampMinusId());
+
+        List<MkStoreTicketGoodsTempEntity> tempEntityList = mkStoreTicketGoodsTempDao.queryGoodsTempByTopicId(mkStoreCampMinusGoods.getStoreTopicId());
+        for(MkStoreTicketGoodsTempEntity tempEntity : tempEntityList){
+            MkStoreCampMinusGoodsEntity minusGoodsEntity = new MkStoreCampMinusGoodsEntity();
+            minusGoodsEntity.setCampMinusId(mkStoreCampMinusGoods.getCampMinusId());
+            minusGoodsEntity.setApplyType(tempEntity.getApplyType());
+            minusGoodsEntity.setStoreRelaId(tempEntity.getStoreRelaId());
+            minusGoodsEntity.setIsValid("0");
+            minusGoodsEntity.setCreaterSn(user.getUsername());
+            minusGoodsEntity.setCreateTime(new Date());
+            minusGoodsEntity.setModerSn(user.getUsername());
+            minusGoodsEntity.setModTime(new Date());
+            mkStoreCampMinusGoodsDao.save(minusGoodsEntity);
+        }
+        return 1;
+    }
+}

+ 58 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreCampMinusLevelServiceImpl.java

@@ -0,0 +1,58 @@
+package com.kmall.admin.service.impl.mk.store;
+
+import com.kmall.admin.dao.mk.store.MkStoreCampMinusLevelDao;
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity;
+import com.kmall.admin.service.mk.store.MkStoreCampMinusLevelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动层级表,活动减免类型为00:按满足最高层级减一次时增加的活动层级数据Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+@Service("mkStoreCampMinusLevelService")
+public class MkStoreCampMinusLevelServiceImpl implements MkStoreCampMinusLevelService {
+    @Autowired
+    private MkStoreCampMinusLevelDao mkStoreCampMinusLevelDao;
+
+    @Override
+    public MkStoreCampMinusLevelEntity queryObject(Integer campMinusLevelId) {
+        return mkStoreCampMinusLevelDao.queryObject(campMinusLevelId);
+    }
+
+    @Override
+    public List<MkStoreCampMinusLevelEntity> queryList(Map<String, Object> map) {
+        return mkStoreCampMinusLevelDao.queryList(map);
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return mkStoreCampMinusLevelDao.queryTotal(map);
+    }
+
+    @Override
+    public int save(MkStoreCampMinusLevelEntity mkStoreCampMinusLevel) {
+        return mkStoreCampMinusLevelDao.save(mkStoreCampMinusLevel);
+    }
+
+    @Override
+    public int update(MkStoreCampMinusLevelEntity mkStoreCampMinusLevel) {
+        return mkStoreCampMinusLevelDao.update(mkStoreCampMinusLevel);
+    }
+
+    @Override
+    public int delete(Integer campMinusLevelId) {
+        return mkStoreCampMinusLevelDao.delete(campMinusLevelId);
+    }
+
+    @Override
+    public int deleteBatch(Integer[] campMinusLevelIds) {
+        return mkStoreCampMinusLevelDao.deleteBatch(campMinusLevelIds);
+    }
+}

+ 792 - 0
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreCampMinusServiceImpl.java

@@ -0,0 +1,792 @@
+package com.kmall.admin.service.impl.mk.store;
+
+import com.google.common.collect.ImmutableBiMap;
+import com.kmall.admin.dao.AdDao;
+import com.kmall.admin.dao.OrderDao;
+import com.kmall.admin.dao.StoreDao;
+import com.kmall.admin.dao.UserCouponDao;
+import com.kmall.admin.dao.mk.store.MkStoreCampMinusDao;
+import com.kmall.admin.dao.mk.store.MkStoreCampMinusLevelDao;
+import com.kmall.admin.dao.mk.store.MkStoreTicketGoodsTempDao;
+import com.kmall.admin.dao.mk.store.StoreTopicDao;
+import com.kmall.admin.dto.*;
+import com.kmall.admin.entity.AdEntity;
+import com.kmall.admin.entity.OrderEntity;
+import com.kmall.admin.entity.StoreEntity;
+import com.kmall.admin.entity.UserCouponEntity;
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity;
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity;
+import com.kmall.admin.entity.mk.store.StoreTopicEntity;
+import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
+import com.kmall.admin.utils.ShiroUtils;
+import com.kmall.api.entity.mk.MkStoreCampMinusLevelVo;
+import com.kmall.common.constant.Dict;
+import com.kmall.common.utils.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 门店满减活动Service实现类
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:28
+ */
+@Service("mkStoreCampMinusService")
+public class MkStoreCampMinusServiceImpl implements MkStoreCampMinusService {
+    @Autowired
+    private MkStoreCampMinusDao mkStoreCampMinusDao;
+    @Autowired
+    private MkStoreCampMinusLevelDao mkStoreCampMinusLevelDao;
+    @Autowired
+    private StoreTopicDao storeTopicDao;
+    @Autowired
+    private AdDao adDao;
+    @Autowired
+    private StoreDao storeDao;
+    @Autowired
+    private UserCouponDao userCouponDao;
+    @Autowired
+    private OrderDao orderDao;
+    @Autowired
+    private MkStoreTicketGoodsTempDao mkStoreTicketGoodsTempDao;
+
+    @Override
+    public MkStoreCampMinusEntity queryObject(Integer campMinusId) {
+        MkStoreCampMinusEntity mkStoreCampMinus = mkStoreCampMinusDao.queryObject(campMinusId);
+        if(mkStoreCampMinus == null){
+            throw new RRException("满减满折活动信息不存在");
+        }
+        StoreEntity storeEntity = storeDao.queryObject(mkStoreCampMinus.getStoreId());
+        if(storeEntity == null){
+            throw new RRException("门店信息不存在");
+        }
+        mkStoreCampMinus.setStoreName(storeEntity.getStoreName());
+        String invalidTime = DateUtils.format(mkStoreCampMinus.getCampBegTime(),DateUtils.DATE_TIME_PATTERN) +
+                " - " + DateUtils.format(mkStoreCampMinus.getCampEndTime(),DateUtils.DATE_TIME_PATTERN);
+        mkStoreCampMinus.setInValidTime(invalidTime);
+        List<MinusTypeUnitAttrDto> minusTypeUnitAttrList = new ArrayList<>();
+        List<MinusTypeUnitModeDto> minusTypeUnitMode10List = new ArrayList<>();
+        List<MinusTypePieceAttrDto> minusTypePieceAttrList = new ArrayList<>();
+        List<MinusTypePieceModeDto> minusTypePieceMode10List = new ArrayList<>();
+        List<MinusTypeDiscUnitAttrDto> minusTypeDiscUnitAttrList = new ArrayList<>();
+        List<MinusTypeDiscPieceAttrDto> minusTypeDiscPieceAttrList = new ArrayList<>();
+
+        List<MkStoreCampMinusLevelEntity> levelEntityList = mkStoreCampMinusLevelDao.queryLevelByCampMinusId(campMinusId);
+        for(MkStoreCampMinusLevelEntity levelEntity: levelEntityList) {
+            //满元满减
+            if (levelEntity.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem())
+                    && levelEntity.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())) {
+                MinusTypeUnitAttrDto minusTypeUnitAttrDto = new MinusTypeUnitAttrDto();
+                minusTypeUnitAttrDto.setYuanMinusCond(String.valueOf(levelEntity.getYuanMinusCond()).replace(".00",""));
+                minusTypeUnitAttrDto.setYuanMinusPref(String.valueOf(levelEntity.getYuanMinusPref()).replace(".00",""));
+                minusTypeUnitAttrDto.setIsDelete(0);
+                minusTypeUnitAttrList.add(minusTypeUnitAttrDto);
+            }
+            //满元满减,且减免类型为每满一次减一次
+            if (levelEntity.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem())
+                    && levelEntity.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())) {
+                MinusTypeUnitModeDto unitModeDto = new MinusTypeUnitModeDto();
+                unitModeDto.setYuanMinusCond(String.valueOf(levelEntity.getYuanMinusCond()).replace(".00",""));
+                unitModeDto.setYuanMinusPref(String.valueOf(levelEntity.getYuanMinusPref()).replace(".00",""));
+                unitModeDto.setPieceMinusEachDisc(String.valueOf(levelEntity.getPieceMinusEachDisc()).replace(".00",""));
+                unitModeDto.setIsDelete(0);
+                minusTypeUnitMode10List.add(unitModeDto);
+            }
+            //满件满减
+            if (levelEntity.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())
+                    && levelEntity.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())) {
+                MinusTypePieceAttrDto pieceAttrDto = new MinusTypePieceAttrDto();
+                pieceAttrDto.setPieceMinusConf(levelEntity.getPieceMinusConf());
+                pieceAttrDto.setPieceMinusPref(String.valueOf(levelEntity.getPieceMinusPref()).replace(".00",""));
+                pieceAttrDto.setIsDelete(0);
+                minusTypePieceAttrList.add(pieceAttrDto);
+            }
+            //满件满减,且减免类型为每满一次减一次
+            if (levelEntity.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())
+                    && levelEntity.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())) {
+                MinusTypePieceModeDto pieceModeDto = new MinusTypePieceModeDto();
+                pieceModeDto.setPieceMinusConf(levelEntity.getPieceMinusConf());
+                pieceModeDto.setPieceMinusPref(String.valueOf(levelEntity.getPieceMinusPref()).replace(".00",""));
+                pieceModeDto.setPieceMinusEachDisc(String.valueOf(levelEntity.getPieceMinusEachDisc()).replace(".00",""));
+                pieceModeDto.setIsDelete(0);
+                minusTypePieceMode10List.add(pieceModeDto);
+            }
+            //满元满折
+            if (levelEntity.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_10.getItem())) {
+                MinusTypeDiscUnitAttrDto discUnitAttrDto = new MinusTypeDiscUnitAttrDto();
+                discUnitAttrDto.setYuanDiscCond(String.valueOf(levelEntity.getYuanDiscCond()).replace(".00",""));
+                discUnitAttrDto.setYuanDiscPref(String.valueOf(levelEntity.getYuanDiscPref()).replace(".00",""));
+                discUnitAttrDto.setIsDelete(0);
+                minusTypeDiscUnitAttrList.add(discUnitAttrDto);
+            }
+            //满件满折
+            if (levelEntity.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_11.getItem())) {
+                MinusTypeDiscPieceAttrDto discPieceAttrDto = new MinusTypeDiscPieceAttrDto();
+                discPieceAttrDto.setPieceDiscConf(levelEntity.getPieceDiscConf());
+                discPieceAttrDto.setPieceDiscPref(String.valueOf(levelEntity.getPieceDiscPref()).replace(".00",""));
+                discPieceAttrDto.setIsDelete(0);
+                minusTypeDiscPieceAttrList.add(discPieceAttrDto);
+            }
+        }
+        mkStoreCampMinus.setMinusTypeUnitAttrList(minusTypeUnitAttrList);
+        mkStoreCampMinus.setMinusTypeUnitMode10List(minusTypeUnitMode10List);
+        mkStoreCampMinus.setMinusTypePieceAttrList(minusTypePieceAttrList);
+        mkStoreCampMinus.setMinusTypePieceMode10List(minusTypePieceMode10List);
+        mkStoreCampMinus.setMinusTypeDiscUnitAttrList(minusTypeDiscUnitAttrList);
+        mkStoreCampMinus.setMinusTypeDiscPieceAttrList(minusTypeDiscPieceAttrList);
+        return mkStoreCampMinus;
+    }
+
+    @Override
+    public List<MkStoreCampMinusEntity> queryList(Map<String, Object> map) {
+        List<MkStoreCampMinusEntity> mkStoreCampMinusEntities = mkStoreCampMinusDao.queryList(map);
+        for (MkStoreCampMinusEntity campMinusEntity: mkStoreCampMinusEntities) {
+            String browseNum = StringUtils.isNotEmpty(String.valueOf(campMinusEntity.getBrowseNum())) ? String.valueOf(campMinusEntity.getBrowseNum()) : "0";
+            String submitNum = StringUtils.isNotEmpty(String.valueOf(campMinusEntity.getSubmitNum())) ? String.valueOf(campMinusEntity.getSubmitNum()) : "0";
+            String actMoney = StringUtils.isNotEmpty(String.valueOf(campMinusEntity.getActMoney())) ? String.valueOf(campMinusEntity.getActMoney()) : "0";
+            String invalidTime = DateUtils.format(campMinusEntity.getCampBegTime(),DateUtils.DATE_TIME_PATTERN) +
+                    " - " + DateUtils.format(campMinusEntity.getCampEndTime(),DateUtils.DATE_TIME_PATTERN);
+            String minusStat = "商品浏览量:" + browseNum + "\n下单单数:" + submitNum + "\n实收金额:" + actMoney;
+
+            campMinusEntity.setInValidTime(invalidTime);
+            campMinusEntity.setMinusStat(minusStat);
+        }
+        return mkStoreCampMinusEntities;
+    }
+
+    @Override
+    public int queryTotal(Map<String, Object> map) {
+        return mkStoreCampMinusDao.queryTotal(map);
+    }
+
+    /**
+     * 校验优惠内容活动层级信息
+     * @param mkStoreCampMinus
+     */
+    private void checkMkStoreCampMinusData(MkStoreCampMinusEntity mkStoreCampMinus){
+        //满元满减
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())) {
+            List<MinusTypeUnitAttrDto> minusTypeUnitAttrList = mkStoreCampMinus.getMinusTypeUnitAttrList();
+            if(minusTypeUnitAttrList == null && minusTypeUnitAttrList.size() == 0){
+                throw new RRException("优惠内容活动层级不能为空");
+            }else{
+                List<MinusTypeUnitAttrDto> checkMinusTypeList = minusTypeUnitAttrList;
+                for (int i=0; i < minusTypeUnitAttrList.size(); i++) {
+                    MinusTypeUnitAttrDto item = minusTypeUnitAttrList.get(i);
+                    Map<String, Object> valideDate = MapBeanUtil.fromObject(item);
+                    ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                    builder.put("yuanMinusCond", "满元减条件");
+                    builder.put("yuanMinusPref", "满元减优惠");
+                    R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                    if (Integer.valueOf(r.get("code").toString()) != 0) {
+                        throw new RRException(r.get("msg").toString());
+                    }
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getYuanMinusCond()))){
+                        throw new RRException("满元减条件格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getYuanMinusPref()))){
+                        throw new RRException("满元减优惠格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getYuanMinusPref()) <= 0){
+                        throw new RRException("满元减优惠不能小于等于0");
+                    }
+                    //校验当前满元减条件与下一级条件比较,层级必须递增且不可相同
+                    String yuanMinusCond = "";
+                    if((i+1) < minusTypeUnitAttrList.size()){
+                        yuanMinusCond = minusTypeUnitAttrList.get(i+1).getYuanMinusCond();
+                    }
+                    if(!"".equalsIgnoreCase(yuanMinusCond)) {
+                        if (Double.valueOf(item.getYuanMinusCond()) >= Double.valueOf(yuanMinusCond)) {
+                            throw new RRException("满元减条件格式错误,层级必须递增且不可相同");
+                        }
+                    }
+                }
+            }
+        }
+        //满元满减,且减免类型为每满一次减一次
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())) {
+            List<MinusTypeUnitModeDto> minusTypeUnitMode10List = mkStoreCampMinus.getMinusTypeUnitMode10List();
+            if(minusTypeUnitMode10List == null && minusTypeUnitMode10List.size() == 0){
+                throw new RRException("优惠内容活动层级不能为空");
+            }else{
+                for (MinusTypeUnitModeDto item : minusTypeUnitMode10List) {
+                    Map<String, Object> valideDate = MapBeanUtil.fromObject(item);
+                    ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                    builder.put("yuanMinusCond", "满元减条件");
+                    builder.put("yuanMinusPref", "满元减优惠");
+                    builder.put("pieceMinusEachDisc", "满减件每人优惠");
+                    R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                    if (Integer.valueOf(r.get("code").toString()) != 0) {
+                        throw new RRException(r.get("msg").toString());
+                    }
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getYuanMinusCond()))){
+                        throw new RRException("满元减条件格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getYuanMinusCond()) <= 0){
+                        throw new RRException("满元减条件不能小于等于0");
+                    }
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getYuanMinusPref()))){
+                        throw new RRException("满元减优惠格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getYuanMinusPref()) <= 0){
+                        throw new RRException("满元减优惠不能小于等于0");
+                    }
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getPieceMinusEachDisc()))){
+                        throw new RRException("满减件每人优惠格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getPieceMinusEachDisc()) < 0){
+                        throw new RRException("满减件每人优惠不能小于0");
+                    }
+                }
+            }
+        }
+        //满件满减
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())) {
+            List<MinusTypePieceAttrDto> minusTypePieceAttrList = mkStoreCampMinus.getMinusTypePieceAttrList();
+            if(minusTypePieceAttrList == null && minusTypePieceAttrList.size() == 0){
+                throw new RRException("优惠内容活动层级不能为空");
+            }else{
+                for (int i=0; i<minusTypePieceAttrList.size(); i++) {
+                    MinusTypePieceAttrDto item = minusTypePieceAttrList.get(i);
+                    Map<String, Object> valideDate = MapBeanUtil.fromObject(item);
+                    ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                    builder.put("pieceMinusConf", "满件减条件");
+                    builder.put("pieceMinusPref", "满件减优惠");
+                    R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                    if (Integer.valueOf(r.get("code").toString()) != 0) {
+                        throw new RRException(r.get("msg").toString());
+                    }
+                    if(!StringUtils.checkNumberByInteger(String.valueOf(item.getPieceMinusConf()))){
+                        throw new RRException("满件减条件格式错误,只允许输入大于等于0的整数");
+                    }
+                    if(item.getPieceMinusConf().doubleValue() < 0){
+                        throw new RRException("满件减条件格式错误,只允许输入大于等于0的整数");
+                    }
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getPieceMinusPref()))){
+                        throw new RRException("满件减优惠格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getPieceMinusPref()) <= 0){
+                        throw new RRException("满件减优惠不能小于等于0");
+                    }
+                    //校验当前满件折条件与下一级条件比较,层级必须递增且不可相同
+                    Integer pieceMinusConf = null;
+                    if((i+1) < minusTypePieceAttrList.size()){
+                        pieceMinusConf = minusTypePieceAttrList.get(i+1).getPieceMinusConf();
+                    }
+                    if(pieceMinusConf != null) {
+                        if (item.getPieceMinusConf() >= pieceMinusConf) {
+                            throw new RRException("满件减条件格式错误,层级必须递增且不可相同");
+                        }
+                    }
+                }
+            }
+        }
+        //满件满减,且减免类型为每满一次减一次
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())) {
+            List<MinusTypePieceModeDto> minusTypePieceMode10List = mkStoreCampMinus.getMinusTypePieceMode10List();
+            if(minusTypePieceMode10List == null && minusTypePieceMode10List.size() == 0){
+                throw new RRException("优惠内容活动层级不能为空");
+            }else{
+                for (MinusTypePieceModeDto item : minusTypePieceMode10List) {
+                    Map<String, Object> valideDate = MapBeanUtil.fromObject(item);
+                    ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                    builder.put("pieceMinusConf", "满件减条件");
+                    builder.put("pieceMinusPref", "满件减优惠");
+                    builder.put("pieceMinusEachDisc", "满减件每人优惠");
+                    R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                    if (Integer.valueOf(r.get("code").toString()) != 0) {
+                        throw new RRException(r.get("msg").toString());
+                    }
+                    if(!StringUtils.checkNumberByInteger(String.valueOf(item.getPieceMinusConf()))){
+                        throw new RRException("满件减条件格式错误,只允许输入大于0的整数");
+                    }
+                    if(item.getPieceMinusConf().doubleValue() <= 0){
+                        throw new RRException("满件减条件格式错误,只允许输入大于0的整数");
+                    }
+
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getPieceMinusPref()))){
+                        throw new RRException("满件减优惠格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getPieceMinusPref()) <= 0){
+                        throw new RRException("满件减优惠不能小于等于0");
+                    }
+
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getPieceMinusEachDisc()))){
+                        throw new RRException("满减件每人优惠格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getPieceMinusPref()) < 0){
+                        throw new RRException("满减件每人优惠不能小于0");
+                    }
+                }
+            }
+        }
+        //满元满折
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_10.getItem())) {
+            List<MinusTypeDiscUnitAttrDto> minusTypeDiscUnitAttrList = mkStoreCampMinus.getMinusTypeDiscUnitAttrList();
+            if(minusTypeDiscUnitAttrList == null && minusTypeDiscUnitAttrList.size() == 0){
+                throw new RRException("优惠内容活动层级不能为空");
+            }else{
+                for (int i=0; i<minusTypeDiscUnitAttrList.size(); i++) {
+                    MinusTypeDiscUnitAttrDto item = minusTypeDiscUnitAttrList.get(i);
+                    Map<String, Object> valideDate = MapBeanUtil.fromObject(item);
+                    ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                    builder.put("yuanDiscCond", "满元折条件");
+                    builder.put("yuanDiscPref", "满元折优惠");
+                    R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                    if (Integer.valueOf(r.get("code").toString()) != 0) {
+                        throw new RRException(r.get("msg").toString());
+                    }
+
+                    if(!StringUtils.checkNumberByTwoDecimal(String.valueOf(item.getYuanDiscCond()))){
+                        throw new RRException("满元折条件格式错误,最多只保留小数点后2位的正数");
+                    }
+                    if(Double.valueOf(item.getYuanDiscCond()) < 0){
+                        throw new RRException("满元折条件不能小于0");
+                    }
+
+                    if (!StringUtils.checkNumberByOneDecimal(String.valueOf(item.getYuanDiscPref()))){
+                        throw new RRException("满元折优惠格式错误,最多只保留小数点后1位的正数");
+                    }
+                    if(Double.valueOf(item.getYuanDiscPref()) > 10){
+                        throw new RRException("请输入不大于10的满元折优惠数值");
+                    }
+                    if(Double.valueOf(item.getYuanDiscPref()) <= 0){
+                        throw new RRException("满元折优惠数值不能小于等于0");
+                    }
+                    //校验当前满元减条件与下一级条件比较,层级必须递增且不可相同
+                    String yuanDiscCond = "";
+                    if((i+1) < minusTypeDiscUnitAttrList.size()){
+                        yuanDiscCond = minusTypeDiscUnitAttrList.get(i+1).getYuanDiscCond();
+                    }
+                    if(!"".equalsIgnoreCase(yuanDiscCond)) {
+                        if (Double.valueOf(item.getYuanDiscCond()) >= Double.valueOf(yuanDiscCond)) {
+                            throw new RRException("满元折条件格式错误,层级必须递增且不可相同");
+                        }
+                    }
+                }
+            }
+        }
+        //满件满折
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_11.getItem())) {
+            List<MinusTypeDiscPieceAttrDto> minusTypeDiscPieceAttrList = mkStoreCampMinus.getMinusTypeDiscPieceAttrList();
+            if(minusTypeDiscPieceAttrList == null && minusTypeDiscPieceAttrList.size() == 0){
+                throw new RRException("优惠内容活动层级不能为空");
+            }else{
+                for (int i=0; i < minusTypeDiscPieceAttrList.size(); i++) {
+                    MinusTypeDiscPieceAttrDto item = minusTypeDiscPieceAttrList.get(i);
+                    Map<String, Object> valideDate = MapBeanUtil.fromObject(item);
+                    ImmutableBiMap.Builder builder = new ImmutableBiMap.Builder();
+                    builder.put("pieceDiscConf", "满件折条件");
+                    builder.put("pieceDiscPref", "满件折优惠");
+                    R r = ValidatorUtil.isEmpty(builder.build(), valideDate);
+                    if (Integer.valueOf(r.get("code").toString()) != 0) {
+                        throw new RRException(r.get("msg").toString());
+                    }
+                    if(!StringUtils.checkNumberByInteger(String.valueOf(item.getPieceDiscConf()))){
+                        throw new RRException("满件折条件格式错误,只允许输入大于等于0的整数");
+                    }
+                    if(item.getPieceDiscConf().doubleValue() < 0){
+                        throw new RRException("满件折条件格式错误,只允许输入大于等于0的整数");
+                    }
+
+                    if (!StringUtils.checkNumberByOneDecimal(String.valueOf(item.getPieceDiscPref()))){
+                        throw new RRException("满元折优惠格式错误,最多只保留小数点后1位的正数");
+                    }
+                    if(Double.valueOf(item.getPieceDiscPref()) > 10){
+                        throw new RRException("请输入不大于10的满元折优惠数值");
+                    }
+                    if(Double.valueOf(item.getPieceDiscPref()) <= 0){
+                        throw new RRException("满元折优惠数值不能小于等于0");
+                    }
+                    //校验当前满件折条件与下一级条件比较,层级必须递增且不可相同
+                    Integer pieceDiscConf = null;
+                    if((i+1) < minusTypeDiscPieceAttrList.size()){
+                        pieceDiscConf = minusTypeDiscPieceAttrList.get(i+1).getPieceDiscConf();
+                    }
+                    if(pieceDiscConf != null) {
+                        if (item.getPieceDiscConf() >= pieceDiscConf) {
+                            throw new RRException("满件折条件格式错误,层级必须递增且不可相同");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    @Transactional
+    @Override
+    public int save(MkStoreCampMinusEntity mkStoreCampMinus) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        StoreEntity storeEntity = storeDao.queryObject(mkStoreCampMinus.getStoreId());
+        if(storeEntity == null){
+            throw new RRException("门店信息不存在");
+        }
+        if(!DateUtils.compareDate(mkStoreCampMinus.getCampBegTime(), mkStoreCampMinus.getCampBegTime())){
+            throw new RRException("结束时间不能超过开始时间");
+        }
+        if(mkStoreCampMinus.getCampBegTime().getTime() == mkStoreCampMinus.getCampEndTime().getTime()){
+            throw new RRException("结束时间不能与开始时间相同");
+        }
+        //校验优惠内容活动层级信息
+        checkMkStoreCampMinusData(mkStoreCampMinus);
+
+        StoreTopicEntity storeTopicEntity = saveStoreTopic(mkStoreCampMinus, user);
+        if(storeTopicEntity != null) {
+            //新增满减信息
+            mkStoreCampMinus.setCreaterSn(user.getUsername());
+            mkStoreCampMinus.setCreateTime(new Date());
+            mkStoreCampMinus.setModerSn(user.getUsername());
+            mkStoreCampMinus.setModTime(new Date());
+            mkStoreCampMinus.setIsPast("0");
+            mkStoreCampMinus.setStoreTopicId(storeTopicEntity.getId());
+            //开始时间大于当前时间,则结束状态为未开始
+            if(mkStoreCampMinus.getCampBegTime().getTime() > new Date().getTime()){
+                mkStoreCampMinus.setIsPast(Dict.isPast.item_2.getItem());
+            }
+            //开始时间小于当前时间,则结束状态为进行中
+            if(mkStoreCampMinus.getCampBegTime().getTime() < new Date().getTime()){
+                mkStoreCampMinus.setIsPast(Dict.isPast.item_0.getItem());
+            }
+            mkStoreCampMinusDao.save(mkStoreCampMinus);
+        }
+        //保存或更新满减满折活动层级数据
+        saveOrUpdateCampMinusLevel(mkStoreCampMinus);
+
+        //是否展示在小程序门店首页广告栏,为1则新增广告信息广告位
+        if(mkStoreCampMinus.getIsStoreShow().equalsIgnoreCase("1")) {
+            AdEntity adEntity = new AdEntity();
+            adEntity.setStoreId(mkStoreCampMinus.getStoreId());
+            adEntity.setContent(mkStoreCampMinus.getCampName());
+            adEntity.setMerchSn(storeEntity.getMerchSn());
+            adEntity.setImageUrl(mkStoreCampMinus.getAdvImgUrl());
+            adEntity.setName(mkStoreCampMinus.getCampName());
+            adEntity.setLink("/pages/ucenter/campMinusDetail/campMinusDetail?campMinusId=" + mkStoreCampMinus.getCampMinusId() +
+                    "&&storeId=" + mkStoreCampMinus.getStoreId() + "&&isShare==0");
+            adEntity.setEnabled(1);
+            adEntity.setAdPositionId(1);
+            adEntity.setMediaType(1);
+            adEntity.setStoreTopicId(mkStoreCampMinus.getStoreTopicId());
+            adDao.save(adEntity);
+        }
+        return 1;
+    }
+
+    @Transactional
+    @Override
+    public int update(MkStoreCampMinusEntity mkStoreCampMinus) {
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        MkStoreCampMinusEntity storeCampMinusEntity = queryObject(mkStoreCampMinus.getCampMinusId());
+        if(storeCampMinusEntity == null){
+            throw new RRException("满减满折活动信息不存在");
+        }
+        StoreEntity storeEntity = storeDao.queryObject(mkStoreCampMinus.getStoreId());
+        if(storeEntity == null){
+            throw new RRException("门店信息不存在");
+        }
+        if(!DateUtils.compareDate(mkStoreCampMinus.getCampBegTime(), mkStoreCampMinus.getCampBegTime())){
+            throw new RRException("结束时间不能超过开始时间");
+        }
+        if(mkStoreCampMinus.getCampBegTime().getTime() == mkStoreCampMinus.getCampEndTime().getTime()){
+            throw new RRException("结束时间不能与开始时间相同");
+        }
+        if(mkStoreCampMinus.getCampEndTime()!= null){
+            if(mkStoreCampMinus.getCampEndTime().getTime() < storeCampMinusEntity.getCampEndTime().getTime()){
+                throw new RRException("不可缩短满减满折活动有效期");
+            }
+        }
+        //校验优惠内容活动层级信息
+        checkMkStoreCampMinusData(mkStoreCampMinus);
+        StoreTopicEntity storeTopicEntity = storeTopicDao.queryObject(storeCampMinusEntity.getStoreTopicId());
+        if(storeTopicEntity != null) {
+            storeTopicEntity.setTitle(mkStoreCampMinus.getCampName());
+            storeTopicDao.update(storeTopicEntity);
+            //更新满减信息
+            mkStoreCampMinus.setModerSn(user.getUsername());
+            mkStoreCampMinus.setModTime(new Date());
+            mkStoreCampMinus.setIsPast("0");
+            mkStoreCampMinus.setStoreTopicId(storeTopicEntity.getId());
+            //开始时间大于当前时间,则结束状态为未开始
+            if(mkStoreCampMinus.getCampBegTime().getTime() > new Date().getTime()){
+                mkStoreCampMinus.setIsPast(Dict.isPast.item_2.getItem());
+            }
+            //开始时间小于当前时间,则结束状态为进行中
+            if(mkStoreCampMinus.getCampBegTime().getTime() < new Date().getTime()){
+                mkStoreCampMinus.setIsPast(Dict.isPast.item_0.getItem());
+            }
+            mkStoreCampMinusDao.update(mkStoreCampMinus);
+
+            //保存或更新满减满折活动层级数据
+            saveOrUpdateCampMinusLevel(mkStoreCampMinus);
+
+            AdEntity ad = adDao.queryAdByStoreTopicId(storeCampMinusEntity.getStoreTopicId());
+            //是否展示在小程序门店首页广告栏,为1则新增广告信息广告位
+            if(mkStoreCampMinus.getIsStoreShow().equalsIgnoreCase("1")) {
+                AdEntity adEntity = new AdEntity();
+                adEntity.setContent(mkStoreCampMinus.getCampName());
+                adEntity.setImageUrl(mkStoreCampMinus.getAdvImgUrl());
+                adEntity.setName(mkStoreCampMinus.getCampName());
+                adEntity.setLink("/pages/ucenter/campMinusDetail/campMinusDetail?campMinusId=" + storeCampMinusEntity.getCampMinusId() +
+                        "&&storeId=" + storeCampMinusEntity.getStoreId() + "&&isShare==0");
+                adEntity.setEnabled(1);
+                if(ad != null){
+                    adEntity.setId(ad.getId());
+                    adDao.update(adEntity);
+                }else{
+                    adEntity.setStoreId(storeCampMinusEntity.getStoreId());
+                    adEntity.setMerchSn(storeEntity.getMerchSn());
+                    adEntity.setAdPositionId(1);
+                    adEntity.setMediaType(1);
+                    adEntity.setStoreTopicId(storeCampMinusEntity.getStoreTopicId());
+                    adDao.save(adEntity);
+                }
+            }
+//            为0则将已有的广告位隐藏
+            if(storeCampMinusEntity.getIsStoreShow().equalsIgnoreCase("0")) {
+                if(ad != null) {
+                    AdEntity adEntity = new AdEntity();
+                    adEntity.setEnabled(0);
+                    adEntity.setId(ad.getId());
+                    adDao.update(adEntity);
+                }
+            }
+        }
+        return 1;
+    }
+
+    /**
+     * 保存或更新满减满折活动层级数据
+     * @param mkStoreCampMinus 已保存的满减满折活动信息
+     */
+    private void saveOrUpdateCampMinusLevel(MkStoreCampMinusEntity mkStoreCampMinus){
+        Integer campMinusId = mkStoreCampMinus.getCampMinusId();
+        List<MkStoreCampMinusLevelEntity> minusLevelEntityList = mkStoreCampMinusLevelDao.queryLevelByCampMinusId(campMinusId);
+        List<MkStoreCampMinusLevelEntity> saveMinusLevelList = new ArrayList<>();
+        if(minusLevelEntityList != null && minusLevelEntityList.size() > 0) {
+            //删除该满减满折活动原有的层级活动信息
+            mkStoreCampMinusLevelDao.deleteByCampMinusId(campMinusId);
+        }
+
+        //满元满减
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())) {
+            List<MinusTypeUnitAttrDto> minusTypeUnitAttrList = mkStoreCampMinus.getMinusTypeUnitAttrList();
+            if(minusTypeUnitAttrList != null && minusTypeUnitAttrList.size() > 0) {
+                for (MinusTypeUnitAttrDto unitAttrDto : minusTypeUnitAttrList) {
+                    if (unitAttrDto.getIsDelete() == 0) {
+                        MkStoreCampMinusLevelEntity levelVo = new MkStoreCampMinusLevelEntity();
+                        levelVo.setCampMinusId(campMinusId);
+                        levelVo.setCampMinusType(mkStoreCampMinus.getCampMinusType());
+                        levelVo.setMinusMode(mkStoreCampMinus.getMinusMode());
+                        levelVo.setYuanMinusCond(BigDecimal.valueOf(Double.parseDouble(unitAttrDto.getYuanMinusCond())));
+                        levelVo.setYuanMinusPref(BigDecimal.valueOf(Double.parseDouble(unitAttrDto.getYuanMinusPref())));
+                        levelVo.setIsValid(Dict.isValid.item_0.getItem());
+                        levelVo.setCreaterSn(mkStoreCampMinus.getCreaterSn());
+                        levelVo.setCreateTime(new Date());
+                        levelVo.setModerSn(mkStoreCampMinus.getModerSn());
+                        levelVo.setModTime(new Date());
+                        saveMinusLevelList.add(levelVo);
+                    }
+                }
+            }
+        }
+        //满元满减,且减免类型为每满一次减一次
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_00.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())) {
+            List<MinusTypeUnitModeDto> minusTypeUnitMode10List = mkStoreCampMinus.getMinusTypeUnitMode10List();
+            if(minusTypeUnitMode10List != null && minusTypeUnitMode10List.size() > 0) {
+                for (MinusTypeUnitModeDto unitModeDto : minusTypeUnitMode10List) {
+                    if (unitModeDto.getIsDelete() == 0) {
+                        MkStoreCampMinusLevelEntity levelVo = new MkStoreCampMinusLevelEntity();
+                        levelVo.setCampMinusId(campMinusId);
+                        levelVo.setCampMinusType(mkStoreCampMinus.getCampMinusType());
+                        levelVo.setMinusMode(mkStoreCampMinus.getMinusMode());
+                        levelVo.setYuanMinusCond(BigDecimal.valueOf(Double.parseDouble(unitModeDto.getYuanMinusCond())));
+                        levelVo.setYuanMinusPref(BigDecimal.valueOf(Double.parseDouble(unitModeDto.getYuanMinusPref())));
+                        levelVo.setPieceMinusEachDisc(BigDecimal.valueOf(Double.parseDouble(unitModeDto.getPieceMinusEachDisc())));
+                        levelVo.setIsValid(Dict.isValid.item_0.getItem());
+                        levelVo.setCreaterSn(mkStoreCampMinus.getCreaterSn());
+                        levelVo.setCreateTime(new Date());
+                        levelVo.setModerSn(mkStoreCampMinus.getModerSn());
+                        levelVo.setModTime(new Date());
+                        saveMinusLevelList.add(levelVo);
+                    }
+                }
+            }
+        }
+        //满件满减
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_00.getItem())) {
+            List<MinusTypePieceAttrDto> minusTypePieceAttrList = mkStoreCampMinus.getMinusTypePieceAttrList();
+            if(minusTypePieceAttrList != null && minusTypePieceAttrList.size() > 0) {
+                for (MinusTypePieceAttrDto pieceAttrDto : minusTypePieceAttrList) {
+                    if (pieceAttrDto.getIsDelete() == 0) {
+                        MkStoreCampMinusLevelEntity levelVo = new MkStoreCampMinusLevelEntity();
+                        levelVo.setCampMinusId(campMinusId);
+                        levelVo.setCampMinusType(mkStoreCampMinus.getCampMinusType());
+                        levelVo.setMinusMode(mkStoreCampMinus.getMinusMode());
+                        levelVo.setPieceMinusConf(pieceAttrDto.getPieceMinusConf());
+                        levelVo.setPieceMinusPref(BigDecimal.valueOf(Double.parseDouble(pieceAttrDto.getPieceMinusPref())));
+                        levelVo.setIsValid(Dict.isValid.item_0.getItem());
+                        levelVo.setCreaterSn(mkStoreCampMinus.getCreaterSn());
+                        levelVo.setCreateTime(new Date());
+                        levelVo.setModerSn(mkStoreCampMinus.getModerSn());
+                        levelVo.setModTime(new Date());
+                        saveMinusLevelList.add(levelVo);
+                    }
+                }
+            }
+        }
+        //满件满减,且减免类型为每满一次减一次
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_01.getItem())
+                && mkStoreCampMinus.getMinusMode().equalsIgnoreCase(Dict.minusMode.item_10.getItem())) {
+            List<MinusTypePieceModeDto> minusTypePieceMode10List = mkStoreCampMinus.getMinusTypePieceMode10List();
+            if(minusTypePieceMode10List != null && minusTypePieceMode10List.size() > 0) {
+                for (MinusTypePieceModeDto pieceModeDto : minusTypePieceMode10List) {
+                    if (pieceModeDto.getIsDelete() == 0) {
+                        MkStoreCampMinusLevelEntity levelVo = new MkStoreCampMinusLevelEntity();
+                        levelVo.setCampMinusId(campMinusId);
+                        levelVo.setCampMinusType(mkStoreCampMinus.getCampMinusType());
+                        levelVo.setMinusMode(mkStoreCampMinus.getMinusMode());
+                        levelVo.setPieceMinusConf(pieceModeDto.getPieceMinusConf());
+                        levelVo.setPieceMinusPref(BigDecimal.valueOf(Double.parseDouble(pieceModeDto.getPieceMinusPref())));
+                        levelVo.setPieceMinusEachDisc(BigDecimal.valueOf(Double.parseDouble(pieceModeDto.getPieceMinusEachDisc())));
+                        levelVo.setIsValid(Dict.isValid.item_0.getItem());
+                        levelVo.setCreaterSn(mkStoreCampMinus.getCreaterSn());
+                        levelVo.setCreateTime(new Date());
+                        levelVo.setModerSn(mkStoreCampMinus.getModerSn());
+                        levelVo.setModTime(new Date());
+                        saveMinusLevelList.add(levelVo);
+                    }
+                }
+            }
+        }
+        //满元满折
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_10.getItem())) {
+            List<MinusTypeDiscUnitAttrDto> minusTypeDiscUnitAttrList = mkStoreCampMinus.getMinusTypeDiscUnitAttrList();
+            if(minusTypeDiscUnitAttrList != null && minusTypeDiscUnitAttrList.size() > 0) {
+                for (MinusTypeDiscUnitAttrDto discUnitAttrDto : minusTypeDiscUnitAttrList) {
+                    if (discUnitAttrDto.getIsDelete() == 0) {
+                        MkStoreCampMinusLevelEntity levelVo = new MkStoreCampMinusLevelEntity();
+                        levelVo.setCampMinusId(campMinusId);
+                        levelVo.setCampMinusType(mkStoreCampMinus.getCampMinusType());
+                        levelVo.setMinusMode(mkStoreCampMinus.getMinusMode());
+                        levelVo.setYuanDiscCond(BigDecimal.valueOf(Double.parseDouble(discUnitAttrDto.getYuanDiscCond())));
+                        levelVo.setYuanDiscPref(BigDecimal.valueOf(Double.parseDouble(discUnitAttrDto.getYuanDiscPref())));
+                        levelVo.setIsValid(Dict.isValid.item_0.getItem());
+                        levelVo.setCreaterSn(mkStoreCampMinus.getCreaterSn());
+                        levelVo.setCreateTime(new Date());
+                        levelVo.setModerSn(mkStoreCampMinus.getModerSn());
+                        levelVo.setModTime(new Date());
+                        saveMinusLevelList.add(levelVo);
+                    }
+                }
+            }
+        }
+        //满件满折
+        if (mkStoreCampMinus.getCampMinusType().equalsIgnoreCase(Dict.campMinusType.item_11.getItem())) {
+            List<MinusTypeDiscPieceAttrDto> minusTypeDiscPieceAttrList = mkStoreCampMinus.getMinusTypeDiscPieceAttrList();
+            if(minusTypeDiscPieceAttrList != null && minusTypeDiscPieceAttrList.size() > 0) {
+                for (MinusTypeDiscPieceAttrDto discPieceAttrDto : minusTypeDiscPieceAttrList) {
+                    if (discPieceAttrDto.getIsDelete() == 0) {
+                        MkStoreCampMinusLevelEntity levelVo = new MkStoreCampMinusLevelEntity();
+                        levelVo.setCampMinusId(campMinusId);
+                        levelVo.setCampMinusType(mkStoreCampMinus.getCampMinusType());
+                        levelVo.setMinusMode(mkStoreCampMinus.getMinusMode());
+                        levelVo.setPieceDiscConf(discPieceAttrDto.getPieceDiscConf());
+                        levelVo.setPieceDiscPref(BigDecimal.valueOf(Double.parseDouble(discPieceAttrDto.getPieceDiscPref())));
+                        levelVo.setIsValid(Dict.isValid.item_0.getItem());
+                        levelVo.setCreaterSn(mkStoreCampMinus.getCreaterSn());
+                        levelVo.setCreateTime(new Date());
+                        levelVo.setModerSn(mkStoreCampMinus.getModerSn());
+                        levelVo.setModTime(new Date());
+                        saveMinusLevelList.add(levelVo);
+                    }
+                }
+            }
+        }
+        //层级信息不为空
+        if(saveMinusLevelList != null && saveMinusLevelList.size() > 0) {
+            mkStoreCampMinusLevelDao.saveBatch(saveMinusLevelList);
+        }
+    }
+
+    /**
+     * 新增门店活动
+     * @param mkStoreCampMinus
+     * @param user
+     * @return
+     */
+    private StoreTopicEntity saveStoreTopic(MkStoreCampMinusEntity mkStoreCampMinus, SysUserEntity user){
+        StoreTopicEntity storeTopicEntity = new StoreTopicEntity();
+        storeTopicEntity.setTitle(mkStoreCampMinus.getCampName());
+        storeTopicEntity.setContent(mkStoreCampMinus.getAdvDesc());
+        storeTopicEntity.setSubtitle(mkStoreCampMinus.getCampName());
+        storeTopicEntity.setStoreId(mkStoreCampMinus.getStoreId());
+        storeTopicEntity.setThirdMerchSn(mkStoreCampMinus.getThirdMerchSn());
+        storeTopicEntity.setIsValid("0");
+        storeTopicEntity.setCreateTime(new Date());
+        storeTopicEntity.setCreaterSn(user.getUsername());
+        storeTopicEntity.setModTime(new Date());
+        storeTopicEntity.setModerSn(user.getUsername());
+        storeTopicEntity.setPromTypeId(7);
+        storeTopicDao.save(storeTopicEntity);
+        return storeTopicEntity;
+    }
+
+    @Override
+    public int delete(Integer campMinusId) {
+        return mkStoreCampMinusDao.delete(campMinusId);
+    }
+
+    @Transactional
+    @Override
+    public int deleteBatch(Integer[]campMinusIds) {
+        if(campMinusIds != null && campMinusIds.length > 0) {
+            Integer[] storeTopicIds = new Integer[campMinusIds.length];
+            for (int i = 0; i < campMinusIds.length; i++) {
+                MkStoreCampMinusEntity campMinusEntity = mkStoreCampMinusDao.queryObject(campMinusIds[i]);
+                if (campMinusEntity != null) {
+                    storeTopicIds[i] = campMinusEntity.getStoreTopicId();
+                    List<UserCouponEntity> userCouponEntityList = userCouponDao.queryByStoreTopicId(campMinusEntity.getStoreTopicId());
+                    if (userCouponEntityList != null && userCouponEntityList.size() > 0){
+                        if(userCouponEntityList.size() > 0){
+                            throw new RRException("该优惠券【"+campMinusEntity.getCampName()+"】已有"+userCouponEntityList.size()+"个用户领取,不能删除");
+                        }
+                    }
+                    List<OrderEntity> orderEntityList = orderDao.queryObjectByActivityId(campMinusEntity.getStoreTopicId());
+                    if (orderEntityList != null && orderEntityList.size() > 0){
+                        if(orderEntityList.size() > 0){
+                            throw new RRException("该优惠券【"+campMinusEntity.getCampName()+"】已生成"+orderEntityList.size()+"条订单信息,不能删除");
+                        }
+                    }
+                    mkStoreCampMinusLevelDao.deleteByCampMinusId(campMinusIds[i]);
+
+                    mkStoreTicketGoodsTempDao.deleteByStoreTopicId(campMinusEntity.getStoreTopicId());
+
+                    //修改为无效活动
+                    StoreTopicEntity storeTopicEntity = new StoreTopicEntity();
+                    storeTopicEntity.setId(campMinusEntity.getStoreTopicId());
+                    storeTopicEntity.setIsValid(Dict.isValid.item_1.getItem());
+                    storeTopicDao.update(storeTopicEntity);
+                }
+            }
+//            storeTopicDao.deleteBatch(storeTopicIds);
+        }
+        return mkStoreCampMinusDao.deleteBatch(campMinusIds);
+    }
+
+    @Override
+    public int updatePastById(MkStoreCampMinusEntity mkStoreCampMinus){
+        return mkStoreCampMinusDao.update(mkStoreCampMinus);
+    }
+}

+ 78 - 7
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStorePromServiceImpl.java

@@ -19,6 +19,7 @@ import com.kmall.common.utils.RRException;
 import com.kmall.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
 import java.util.List;
@@ -70,7 +71,47 @@ public class MkStorePromServiceImpl implements MkStorePromService {
 
     @Override
     public List<MkStorePromEntity> queryList(Map<String, Object> map) {
-        return mkStorePromDao.queryList(map);
+        List<MkStorePromEntity> mkStorePromList = mkStorePromDao.queryList(map);
+        for (MkStorePromEntity mkStorePromEntity : mkStorePromList) {
+            String promStat = "";
+            String promInfo = "";
+            String promPicUrl = "";
+
+            String browseNum = StringUtils.isNotEmpty(String.valueOf(mkStorePromEntity.getBrowseNum())) ? String.valueOf(mkStorePromEntity.getBrowseNum()) : "0";
+            String payOrderNum = StringUtils.isNotEmpty(String.valueOf(mkStorePromEntity.getPayOrderNum())) ? String.valueOf(mkStorePromEntity.getPayOrderNum()) : "0";
+            String actMoney = StringUtils.isNotEmpty(String.valueOf(mkStorePromEntity.getActMoney())) ? String.valueOf(mkStorePromEntity.getActMoney()) : "0";
+            String startDate = DateUtils.format(mkStorePromEntity.getPromBegTime(), DateUtils.DATE_TIME_PATTERN);
+            String endDate = DateUtils.format(mkStorePromEntity.getPromEndTime(), DateUtils.DATE_TIME_PATTERN);
+            String inValidDate = startDate + " - " + endDate;
+            if(mkStorePromEntity.getPromType().equalsIgnoreCase(Dict.promType.item_00.getItem())){
+                promStat = "浏览量:" + browseNum;
+                promInfo = "<span style=\"font-weight: bolder\">" + mkStorePromEntity.getPromName() + "</span>\n"
+                        + mkStorePromEntity.getTopicTitle() + "\n推广有效期:"
+                        + inValidDate ;
+
+                /*if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_1.getItem())){
+                    promInfo = promInfo + "&nbsp;&nbsp;&nbsp;&nbsp;<i-button type=\"info\" style=\"margin-top: -3px;\" onclick='vm.updateFinished(" + mkStorePromEntity.getPromId() + ")'>立即结束</i-button>";
+                }*/
+                promPicUrl = mkStorePromEntity.getItemPicUrl();
+            }
+            if(mkStorePromEntity.getPromType().equalsIgnoreCase(Dict.promType.item_10.getItem())){
+                promStat = "浏览量:" + browseNum + "\n支付单数:" + payOrderNum + "\n实收金额:" + actMoney;
+                promInfo = "<span style=\"font-weight: bolder\">" + mkStorePromEntity.getPromName() + "</span>\n"
+                        + mkStorePromEntity.getGoodsName() + "\n推广有效期:"
+                        + inValidDate;
+                /*if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_1.getItem())){
+                    promInfo = promInfo + "&nbsp;&nbsp;&nbsp;&nbsp;<i-button type=\"info\" style=\"margin-top: -3px;\" onclick='vm.updateFinished(" + mkStorePromEntity.getPromId() + ")'>立即结束</i-button>";
+                }
+                if(mkStorePromEntity.getIsFinished().equalsIgnoreCase(Dict.isFinished.item_2.getItem())){
+                    promInfo = promInfo + "&nbsp;&nbsp;&nbsp;&nbsp;<i-button type=\"info\" style=\"margin-top: -3px;\" onclick='vm.updateStarted(" + mkStorePromEntity.getPromId() + ")'>立即开始</i-button>";
+                }*/
+                promPicUrl = mkStorePromEntity.getListPicUrl();
+            }
+            mkStorePromEntity.setPromStat(promStat);
+            mkStorePromEntity.setPromInfo(promInfo);
+            mkStorePromEntity.setPromPicUrl(promPicUrl);
+        }
+        return mkStorePromList;
     }
 
     @Override
@@ -78,11 +119,12 @@ public class MkStorePromServiceImpl implements MkStorePromService {
         return mkStorePromDao.queryTotal(map);
     }
 
+    @Transactional
     @Override
     public int save(MkStorePromEntity mkStoreProm) {
         if(StringUtils.isNotEmpty(String.valueOf(mkStoreProm.getStoreTopicId()))){
             StoreTopicEntity storeTopicEntity = storeTopicDao.queryObject(mkStoreProm.getStoreTopicId());
-            if(storeTopicEntity != null){
+            if(storeTopicEntity != null && storeTopicEntity.getIsValid().equalsIgnoreCase(Dict.isValid.item_0.getItem())){
                 mkStoreProm.setStoreTopicId(storeTopicEntity.getId());
                 MkStorePromTypeEntity typeEntity = mkStorePromTypeDao.queryObject(storeTopicEntity.getPromTypeId());
                 if(typeEntity != null){
@@ -91,7 +133,7 @@ public class MkStorePromServiceImpl implements MkStorePromService {
                     throw new RRException("门店活动类型信息不存在 ");
                 }
             }else{
-                throw new RRException("门店活动信息不存在");
+                throw new RRException("门店活动信息不存在或已失效");
             }
         }
 
@@ -105,14 +147,22 @@ public class MkStorePromServiceImpl implements MkStorePromService {
         mkStoreProm.setModTime(new Date());
         mkStoreProm.setCreaterSn(user.getUsername());
         mkStoreProm.setModerSn(user.getUsername());
+        //开始时间大于当前时间,则结束状态为未开始
+        if(mkStoreProm.getPromBegTime().getTime() > new Date().getTime()){
+            mkStoreProm.setIsFinished(Dict.isFinished.item_2.getItem());
+        }
+        if(mkStoreProm.getPromBegTime().getTime() < new Date().getTime()){
+            mkStoreProm.setIsFinished(Dict.isFinished.item_1.getItem());
+        }
         return mkStorePromDao.save(mkStoreProm);
     }
 
+    @Transactional
     @Override
     public int update(MkStorePromEntity mkStoreProm) {
         if(StringUtils.isNotEmpty(String.valueOf(mkStoreProm.getStoreTopicId()))){
             StoreTopicEntity storeTopicEntity = storeTopicDao.queryObject(mkStoreProm.getStoreTopicId());
-            if(storeTopicEntity != null){
+            if(storeTopicEntity != null && storeTopicEntity.getIsValid().equalsIgnoreCase(Dict.isValid.item_0.getItem())){
                 mkStoreProm.setStoreTopicId(storeTopicEntity.getId());
                 MkStorePromTypeEntity typeEntity = mkStorePromTypeDao.queryObject(storeTopicEntity.getPromTypeId());
                 if(typeEntity != null){
@@ -121,7 +171,7 @@ public class MkStorePromServiceImpl implements MkStorePromService {
                     throw new RRException("门店活动类型信息不存在");
                 }
             }else{
-                throw new RRException("门店活动信息不存在 ");
+                throw new RRException("门店活动信息不存在或已失效 ");
             }
         }
 
@@ -135,6 +185,13 @@ public class MkStorePromServiceImpl implements MkStorePromService {
         mkStoreProm.setModTime(new Date());
         mkStoreProm.setCreaterSn(user.getUsername());
         mkStoreProm.setModerSn(user.getUsername());
+        //开始时间大于当前时间,则结束状态为未开始
+        if(mkStoreProm.getPromBegTime().getTime() > new Date().getTime()){
+            mkStoreProm.setIsFinished(Dict.isFinished.item_2.getItem());
+        }
+        if(mkStoreProm.getPromBegTime().getTime() < new Date().getTime()){
+            mkStoreProm.setIsFinished(Dict.isFinished.item_1.getItem());
+        }
         return mkStorePromDao.update(mkStoreProm);
     }
 
@@ -143,8 +200,22 @@ public class MkStorePromServiceImpl implements MkStorePromService {
         return mkStorePromDao.delete(promId);
     }
 
+    @Transactional
     @Override
-    public int deleteBatch(Integer[]promIds) {
-        return mkStorePromDao.deleteBatch(promIds);
+    public int deleteBatch(Integer[] promIds) {
+        for (int i=0; i<promIds.length; i++){
+            MkStorePromEntity prom = new MkStorePromEntity();
+            prom.setPromId(promIds[i]);
+            prom.setIsValid(Dict.isValid.item_1.getItem());
+            mkStorePromDao.update(prom);
+        }
+        return 1;
+//        return mkStorePromDao.deleteBatch(promIds);
+    }
+
+    @Transactional
+    @Override
+    public int updateStartedOrFinished(MkStorePromEntity mkStoreProm) {
+        return mkStorePromDao.update(mkStoreProm);
     }
 }

+ 23 - 4
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreTicketDiscountServiceImpl.java

@@ -112,7 +112,15 @@ public class MkStoreTicketDiscountServiceImpl implements MkStoreTicketDiscountSe
             mkStoreTicketDiscount.setModTime(new Date());
             mkStoreTicketDiscount.setModerSn(user.getUsername());
             mkStoreTicketDiscount.setStoreTopicId(storeTopicEntity.getId());
-            mkStoreTicketDiscount.setIsPast("0");//未过期
+            mkStoreTicketDiscount.setIsPast(Dict.isPast.item_0.getItem());//未过期
+            /*//开始时间大于当前时间,则结束状态为未开始
+            if(mkStoreTicketDiscount.getFixBegTime().getTime() > new Date().getTime()){
+                mkStoreTicketDiscount.setIsPast(Dict.isPast.item_2.getItem());
+            }
+            //开始时间小于当前时间,则结束状态为进行中
+            if(mkStoreTicketDiscount.getFixBegTime().getTime() < new Date().getTime()){
+                mkStoreTicketDiscount.setIsPast(Dict.isPast.item_0.getItem());
+            }*/
             mkStoreTicketDiscountDao.save(mkStoreTicketDiscount);
             if(tempEntityList.size() > 0){
                 for(MkStoreTicketGoodsTempEntity tempEntity: tempEntityList) {
@@ -206,6 +214,14 @@ public class MkStoreTicketDiscountServiceImpl implements MkStoreTicketDiscountSe
             mkStoreTicketDiscount.setCreaterSn(user.getUsername());
             mkStoreTicketDiscount.setModTime(new Date());
             mkStoreTicketDiscount.setModerSn(user.getUsername());
+            /*//开始时间大于当前时间,则结束状态为未开始
+            if(mkStoreTicketDiscount.getFixBegTime().getTime() > new Date().getTime()){
+                mkStoreTicketDiscount.setIsPast(Dict.isPast.item_2.getItem());
+            }
+            //开始时间小于当前时间,则结束状态为进行中
+            if(mkStoreTicketDiscount.getFixBegTime().getTime() < new Date().getTime()){
+                mkStoreTicketDiscount.setIsPast(Dict.isPast.item_0.getItem());
+            }*/
             mkStoreTicketDiscountDao.update(mkStoreTicketDiscount);
             if(tempEntityList.size() > 0){
                 mkStoreTicketDiscountGoodsDao.deleteByTickDistId(mkStoreTicketDiscount.getTickDiscId());
@@ -307,9 +323,9 @@ public class MkStoreTicketDiscountServiceImpl implements MkStoreTicketDiscountSe
         return mkStoreTicketDiscountDao.delete(tickDiscId);
     }
 
+    @Transactional
     @Override
     public int deleteBatch(Integer[]tickDiscIds) {
-
         if(tickDiscIds != null && tickDiscIds.length > 0) {
             Integer[] storeTopicIds = new Integer[tickDiscIds.length];
             for (int i = 0; i < tickDiscIds.length; i++) {
@@ -328,10 +344,13 @@ public class MkStoreTicketDiscountServiceImpl implements MkStoreTicketDiscountSe
                             throw new RRException("该优惠券【"+discountEntity.getName()+"】已生成"+orderEntityList.size()+"条订单信息,不能删除");
                         }
                     }
+                    StoreTopicEntity storeTopicEntity = new StoreTopicEntity();
+                    storeTopicEntity.setId(discountEntity.getStoreTopicId());
+                    storeTopicEntity.setIsValid(Dict.isValid.item_1.getItem());
+                    storeTopicDao.update(storeTopicEntity);
                 }
             }
-            storeTopicDao.deleteBatch(storeTopicIds);
-
+//            storeTopicDao.deleteBatch(storeTopicIds);
         }
         return mkStoreTicketDiscountDao.deleteBatch(tickDiscIds);
     }

+ 90 - 19
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreTicketGoodsTempServiceImpl.java

@@ -46,21 +46,6 @@ public class MkStoreTicketGoodsTempServiceImpl implements MkStoreTicketGoodsTemp
     }
 
     @Override
-    public List<MkStoreTicketGoodsTempEntity> queryGoodsTempByGuid(String guid) {
-        return mkStoreTicketGoodsTempDao.queryGoodsTempByGuid(guid);
-    }
-
-    @Override
-    public List<MkStoreTicketGoodsTempEntity> queryGoodsTempByIsValid(MkStoreTicketGoodsTempEntity entity) {
-        return mkStoreTicketGoodsTempDao.queryGoodsTempByIsValid(entity);
-    }
-
-    @Override
-    public List<MkStoreTicketGoodsTempEntity> queryGoodsTempByGuidAndIsSubmit(MkStoreTicketGoodsTempEntity entity) {
-        return mkStoreTicketGoodsTempDao.queryGoodsTempByGuidAndIsSubmit(entity);
-    }
-
-    @Override
     public List<MkStoreTicketGoodsTempEntity> queryList(Map<String, Object> map) {
         return mkStoreTicketGoodsTempDao.queryList(map);
     }
@@ -100,13 +85,16 @@ public class MkStoreTicketGoodsTempServiceImpl implements MkStoreTicketGoodsTemp
         return mkStoreTicketGoodsTempDao.deleteBatch(discGoodTempIds);
     }
 
+    /**
+     * 触发优惠券选择商品页面分页按钮时保存数据
+     * @param mkStoreTicketDiscountGoods
+     */
     @Transactional
     @Override
     public void batchSaveDiscountGoods(MkStoreTicketGoodsTempEntity mkStoreTicketDiscountGoods){
         SysUserEntity user = ShiroUtils.getUserEntity();
-        if(mkStoreTicketDiscountGoods.getCheckGoodsList().size() > 0){
-            List<CheckGoodsDto> list = mkStoreTicketDiscountGoods.getCheckGoodsList();
-
+        List<CheckGoodsDto> list = mkStoreTicketDiscountGoods.getCheckGoodsList();
+        if(list.size() > 0){
             //如前端获取选中数组为空,则查询出无效字段进行删除
             MkStoreTicketGoodsTempEntity entity = new MkStoreTicketGoodsTempEntity();
             entity.setStoreId(mkStoreTicketDiscountGoods.getStoreId());
@@ -183,9 +171,13 @@ public class MkStoreTicketGoodsTempServiceImpl implements MkStoreTicketGoodsTemp
         return mkStoreTicketGoodsTempDao.queryGoodsTempIdBy(entity);
     }
 
+    /**
+     * 触发优惠券选择商品页面取消按钮时,将返回失效的商品还原为有效
+     * @param mkStoreTicketGoodsTemp
+     */
     @Transactional
     @Override
-    public void resetIsValidByTemp(MkStoreTicketGoodsTempEntity mkStoreTicketGoodsTemp){
+    public void resetDiscTicketIsValidByTemp(MkStoreTicketGoodsTempEntity mkStoreTicketGoodsTemp){
         if(StringUtils.isNotEmpty(mkStoreTicketGoodsTemp.getGuid())){
             mkStoreTicketGoodsTempDao.deleteByGuid(mkStoreTicketGoodsTemp.getGuid());//删除
         }
@@ -238,4 +230,83 @@ public class MkStoreTicketGoodsTempServiceImpl implements MkStoreTicketGoodsTemp
             }
         }
     }
+
+    /**
+     * 触发门店活动选择商品页面分页按钮时保存数据
+     * @param mkStoreTicketDiscountGoods
+     */
+    @Transactional
+    @Override
+    public void batchSaveStoreTopicGoods(MkStoreTicketGoodsTempEntity mkStoreTicketDiscountGoods){
+        SysUserEntity user = ShiroUtils.getUserEntity();
+        List<CheckGoodsDto> list = mkStoreTicketDiscountGoods.getCheckGoodsList();
+        if(list.size() > 0){
+            //如前端获取选中数组为空,则查询出无效字段进行删除
+            MkStoreTicketGoodsTempEntity entity = new MkStoreTicketGoodsTempEntity();
+            entity.setStoreId(mkStoreTicketDiscountGoods.getStoreId());
+            entity.setApplyType(mkStoreTicketDiscountGoods.getApplyType());
+            // TODO: 2019/6/5 门店活动
+            entity.setStoreTopicId(mkStoreTicketDiscountGoods.getStoreTopicId());
+            entity.setIsValid(Dict.isValid.item_1.getItem());
+            List<MkStoreTicketGoodsTempEntity> tempEntityList = mkStoreTicketGoodsTempDao.queryGoodsTempByIsValid(entity);
+            if(tempEntityList.size() > 0){
+                deleteBatchTemp(tempEntityList);
+            }
+            for(int i=0; i < list.size(); i++){
+                CheckGoodsDto checkGoodsDto = list.get(i);
+                MkStoreTicketGoodsTempEntity ticketGoodsTempEntity = mkStoreTicketGoodsTempDao.queryGoodsTempByRealIdAndTopicId(checkGoodsDto.getStoreRealId(),
+                        mkStoreTicketDiscountGoods.getStoreTopicId());
+                mkStoreTicketDiscountGoods.setCreateTime(new Date());
+                mkStoreTicketDiscountGoods.setModTime(new Date());
+                mkStoreTicketDiscountGoods.setCreaterSn(user.getUsername());
+                mkStoreTicketDiscountGoods.setModerSn(user.getUsername());
+                mkStoreTicketDiscountGoods.setApplyType(checkGoodsDto.getApplyType());
+                mkStoreTicketDiscountGoods.setStoreRelaId(checkGoodsDto.getStoreRealId());
+                mkStoreTicketDiscountGoods.setIsButtonCannel("0");
+                mkStoreTicketDiscountGoods.setStoreTopicId(mkStoreTicketDiscountGoods.getStoreTopicId());
+                if(ticketGoodsTempEntity == null) {
+                    mkStoreTicketDiscountGoods.setIsSubmit(mkStoreTicketDiscountGoods.getIsSubmit());
+                    mkStoreTicketDiscountGoods.setIsValid(Dict.isValid.item_0.getItem());
+                    mkStoreTicketGoodsTempDao.save(mkStoreTicketDiscountGoods);
+                }else{
+                    mkStoreTicketDiscountGoods.setIsValid(Dict.isValid.item_0.getItem());
+                    mkStoreTicketDiscountGoods.setIsSubmit(Dict.isSubmit.item_0.getItem());
+                    mkStoreTicketDiscountGoods.setDiscGoodTempId(ticketGoodsTempEntity.getDiscGoodTempId());
+                    mkStoreTicketGoodsTempDao.update(mkStoreTicketDiscountGoods);
+                }
+            }
+        }else{
+            mkStoreTicketDiscountGoods.setStoreId(mkStoreTicketDiscountGoods.getStoreId());
+            mkStoreTicketDiscountGoods.setApplyType(mkStoreTicketDiscountGoods.getApplyType());
+            // TODO: 2019/6/5 门店活动
+            mkStoreTicketDiscountGoods.setStoreTopicId(mkStoreTicketDiscountGoods.getStoreTopicId());
+            if(mkStoreTicketDiscountGoods.getIsSubmit().equalsIgnoreCase(Dict.isSubmit.item_0.getItem())){//确定按钮
+                //如前端获取选中数组为空,则查询出无效字段进行删除
+                mkStoreTicketDiscountGoods.setIsValid(Dict.isValid.item_1.getItem());
+                List<MkStoreTicketGoodsTempEntity> tempEntityList = mkStoreTicketGoodsTempDao.queryGoodsTempByIsValid(mkStoreTicketDiscountGoods);
+                deleteBatchTemp(tempEntityList);
+            }else{//取消按钮
+                mkStoreTicketDiscountGoods.setIsSubmit(Dict.isSubmit.item_1.getItem());//取消按钮
+                List<MkStoreTicketGoodsTempEntity> tempEntityList = mkStoreTicketGoodsTempDao.queryGoodsTempByGuidAndIsSubmit(mkStoreTicketDiscountGoods);
+                //删除定为弹框取消按钮触发选中的商品
+                deleteBatchTemp(tempEntityList);
+
+                //点击取消按钮,查询无效商品恢复为有效商品
+                mkStoreTicketDiscountGoods.setIsValid(Dict.isValid.item_1.getItem());
+                List<MkStoreTicketGoodsTempEntity> tempByIsValidList = mkStoreTicketGoodsTempDao.queryGoodsTempByIsValid(mkStoreTicketDiscountGoods);
+                for(int i=0; i < tempByIsValidList.size(); i++){
+                    //修改为有效
+                    MkStoreTicketGoodsTempEntity tempEntity = new MkStoreTicketGoodsTempEntity();
+                    tempEntity.setDiscGoodTempId(tempByIsValidList.get(i).getDiscGoodTempId());
+                    tempEntity.setIsValid(Dict.isValid.item_0.getItem());
+                    mkStoreTicketGoodsTempDao.update(tempEntity);
+                }
+            }
+        }
+    }
+
+    @Override
+    public MkStoreTicketGoodsTempEntity queryGoodsTempByRealIdAndTopicId(Integer discGoodTempId, Integer storeTopicId) {
+        return mkStoreTicketGoodsTempDao.queryGoodsTempByRealIdAndTopicId(discGoodTempId, storeTopicId);
+    }
 }

+ 16 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/mk/store/MkStoreTopicStatServiceImpl.java

@@ -1,7 +1,11 @@
 package com.kmall.admin.service.impl.mk.store;
 
+import com.kmall.admin.dao.StoreDao;
 import com.kmall.admin.dao.mk.store.MkStoreTopicStatDao;
+import com.kmall.admin.dao.mk.store.StoreTopicDao;
+import com.kmall.admin.entity.StoreEntity;
 import com.kmall.admin.entity.mk.store.MkStoreTopicStatEntity;
+import com.kmall.admin.entity.mk.store.StoreTopicEntity;
 import com.kmall.admin.service.mk.store.MkStoreTopicStatService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -20,10 +24,21 @@ import java.util.Map;
 public class MkStoreTopicStatServiceImpl implements MkStoreTopicStatService {
     @Autowired
     private MkStoreTopicStatDao mkStoreTopicStatDao;
+    @Autowired
+    private StoreTopicDao storeTopicDao;
+    @Autowired
+    private StoreDao storeDao;
 
     @Override
     public MkStoreTopicStatEntity queryObject(Integer storeTopicStatId) {
-        return mkStoreTopicStatDao.queryObject(storeTopicStatId);
+        MkStoreTopicStatEntity mkStoreTopicStatEntity = mkStoreTopicStatDao.queryObject(storeTopicStatId);
+        if(mkStoreTopicStatEntity != null){
+            StoreEntity storeEntity = storeDao.queryObject(mkStoreTopicStatEntity.getStoreId());
+            mkStoreTopicStatEntity.setStoreName(storeEntity.getStoreName());
+            StoreTopicEntity topicEntity = storeTopicDao.queryObject(mkStoreTopicStatEntity.getStoreTopicId());
+            mkStoreTopicStatEntity.setStoreTopicName(topicEntity.getTitle());
+        }
+        return mkStoreTopicStatEntity;
     }
 
     @Override

+ 90 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreCampMinusGoodsService.java

@@ -0,0 +1,90 @@
+package com.kmall.admin.service.mk.store;
+
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动商品,参与满减活动的商品Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public interface MkStoreCampMinusGoodsService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param minusGoodId 主键
+     * @return 实体
+     */
+    MkStoreCampMinusGoodsEntity queryObject(Integer minusGoodId);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<MkStoreCampMinusGoodsEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 根据满减满折活动id分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<MkStoreCampMinusGoodsEntity> queryCampMinusGoodsByIdList(Map<String, Object> map);
+
+    /**
+     * 根据满减满折活动id分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryCampMinusGoodsByIdTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param mkStoreCampMinusGoods 实体
+     * @return 保存条数
+     */
+    int save(MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param mkStoreCampMinusGoods 实体
+     * @return 更新条数
+     */
+    int update(MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods);
+
+    /**
+     * 根据主键删除
+     *
+     * @param minusGoodId
+     * @return 删除条数
+     */
+    int delete(Integer minusGoodId);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param minusGoodIds
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[] minusGoodIds);
+
+    int batchSaveCampMinusGoods(MkStoreCampMinusGoodsEntity mkStoreCampMinusGoods);
+}

+ 73 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreCampMinusLevelService.java

@@ -0,0 +1,73 @@
+package com.kmall.admin.service.mk.store;
+
+
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动层级表,活动减免类型为00:按满足最高层级减一次时增加的活动层级数据Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:29
+ */
+public interface MkStoreCampMinusLevelService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param campMinusLevelId 主键
+     * @return 实体
+     */
+    MkStoreCampMinusLevelEntity queryObject(Integer campMinusLevelId);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<MkStoreCampMinusLevelEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param mkStoreCampMinusLevel 实体
+     * @return 保存条数
+     */
+    int save(MkStoreCampMinusLevelEntity mkStoreCampMinusLevel);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param mkStoreCampMinusLevel 实体
+     * @return 更新条数
+     */
+    int update(MkStoreCampMinusLevelEntity mkStoreCampMinusLevel);
+
+    /**
+     * 根据主键删除
+     *
+     * @param campMinusLevelId
+     * @return 删除条数
+     */
+    int delete(Integer campMinusLevelId);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param campMinusLevelIds
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[] campMinusLevelIds);
+}

+ 74 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreCampMinusService.java

@@ -0,0 +1,74 @@
+package com.kmall.admin.service.mk.store;
+
+import com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 门店满减活动Service接口
+ *
+ * @author emato
+ * @email admin@qhdswl.com
+ * @date 2019-05-29 14:43:28
+ */
+public interface MkStoreCampMinusService {
+
+    /**
+     * 根据主键查询实体
+     *
+     * @param campMinusId 主键
+     * @return 实体
+     */
+    MkStoreCampMinusEntity queryObject(Integer campMinusId);
+
+    /**
+     * 分页查询
+     *
+     * @param map 参数
+     * @return list
+     */
+    List<MkStoreCampMinusEntity> queryList(Map<String, Object> map);
+
+    /**
+     * 分页统计总数
+     *
+     * @param map 参数
+     * @return 总数
+     */
+    int queryTotal(Map<String, Object> map);
+
+    /**
+     * 保存实体
+     *
+     * @param mkStoreCampMinus 实体
+     * @return 保存条数
+     */
+    int save(MkStoreCampMinusEntity mkStoreCampMinus);
+
+    /**
+     * 根据主键更新实体
+     *
+     * @param mkStoreCampMinus 实体
+     * @return 更新条数
+     */
+    int update(MkStoreCampMinusEntity mkStoreCampMinus);
+
+    /**
+     * 根据主键删除
+     *
+     * @param campMinusId
+     * @return 删除条数
+     */
+    int delete(Integer campMinusId);
+
+    /**
+     * 根据主键批量删除
+     *
+     * @param campMinusIds
+     * @return 删除条数
+     */
+    int deleteBatch(Integer[] campMinusIds);
+
+    int updatePastById(MkStoreCampMinusEntity mkStoreCampMinus);
+}

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStorePromService.java

@@ -69,4 +69,6 @@ public interface MkStorePromService {
      * @return 删除条数
      */
     int deleteBatch(Integer[] promIds);
+
+    int updateStartedOrFinished(MkStorePromEntity mkStoreProm);
 }

+ 17 - 8
kmall-admin/src/main/java/com/kmall/admin/service/mk/store/MkStoreTicketGoodsTempService.java

@@ -23,13 +23,6 @@ public interface MkStoreTicketGoodsTempService {
     MkStoreTicketGoodsTempEntity queryObject(Integer discGoodTempId);
 
     MkStoreTicketGoodsTempEntity queryGoodsTempByRealId(Integer storeRealId, String guid);
-
-    List<MkStoreTicketGoodsTempEntity> queryGoodsTempByGuid(String guid);
-
-    List<MkStoreTicketGoodsTempEntity> queryGoodsTempByIsValid(MkStoreTicketGoodsTempEntity entity);
-
-
-    List<MkStoreTicketGoodsTempEntity> queryGoodsTempByGuidAndIsSubmit(MkStoreTicketGoodsTempEntity entity);
     /**
      * 分页查询
      *
@@ -82,9 +75,25 @@ public interface MkStoreTicketGoodsTempService {
      */
     int deleteBatch(Integer[] discGoodTempIds);
 
+    /**
+     * 触发优惠券选择商品页面分页按钮时保存数据
+     * @param mkStoreTicketDiscountGoods
+     */
     void batchSaveDiscountGoods(MkStoreTicketGoodsTempEntity mkStoreTicketDiscountGoods);
 
     List<MkStoreTicketGoodsTempEntity> queryGoodsTempIdBy(MkStoreTicketGoodsTempEntity entity);
 
-    void resetIsValidByTemp(MkStoreTicketGoodsTempEntity mkStoreTicketGoodsTemp);
+    /**
+     * 触发优惠券选择商品页面取消按钮时,将返回失效的商品还原为有效
+     * @param mkStoreTicketGoodsTemp
+     */
+    void resetDiscTicketIsValidByTemp(MkStoreTicketGoodsTempEntity mkStoreTicketGoodsTemp);
+
+    /**
+     * 触发门店活动选择商品页面分页按钮时保存数据
+     * @param mkStoreTicketDiscountGoods
+     */
+    void batchSaveStoreTopicGoods(MkStoreTicketGoodsTempEntity mkStoreTicketDiscountGoods);
+
+    MkStoreTicketGoodsTempEntity queryGoodsTempByRealIdAndTopicId(Integer storeRealId, Integer storeTopicId);
 }

+ 40 - 0
kmall-admin/src/main/java/com/kmall/admin/utils/ParamUtils.java

@@ -2,6 +2,7 @@ package com.kmall.admin.utils;
 
 import com.kmall.common.constant.Dict;
 import com.kmall.admin.fromcomm.entity.SysUserEntity;
+import com.kmall.common.utils.DateUtils;
 import com.kmall.common.utils.RRException;
 import org.apache.commons.lang3.StringUtils;
 
@@ -11,6 +12,8 @@ import java.util.Map;
  * 参数工具类
  */
 public class ParamUtils {
+    private static String  ISO = "iso-8859-1";
+    private static String  UTF = "utf-8";
 
     /**
      * 根据用户类型设置查询权限
@@ -53,5 +56,42 @@ public class ParamUtils {
             }
         }
     }
+
+    public static void setName(Map params, String nameKey){
+        String name = (String) params.get(nameKey);
+        if(org.apache.commons.lang3.StringUtils.isNotEmpty(name)){
+            try{
+                name = new String(name.trim().getBytes(ISO),UTF);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+            params.put(nameKey, name);
+        }
+    }
+
+    public static Map<String, Object> setTimeMap(Map<String, Object> params){
+        String startTime = (String) params.get("startTime");
+        String endTime = (String) params.get("endTime");
+        if(org.apache.commons.lang.StringUtils.isNotEmpty(startTime)) {
+            try {
+                startTime = new String(startTime.getBytes(ISO), UTF);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            startTime = DateUtils.getDate(startTime);
+            params.put("startTime", startTime + " 00:00:00");
+        }
+        if(org.apache.commons.lang.StringUtils.isNotEmpty(endTime)) {
+            try {
+                endTime = new String(endTime.getBytes(ISO), UTF);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            endTime = DateUtils.getDate(endTime);
+            params.put("endTime", endTime + " 59:59:59");
+        }
+        return params;
+    }
+
 }
 

+ 21 - 0
kmall-admin/src/main/resources/mybatis/mapper/AdDao.xml

@@ -17,6 +17,7 @@
         <result property="enabled" column="enabled"/>
         <result property="sortOrder" column="sort_order"/>
         <result property="tickDiscId" column="tick_disc_id"/>
+        <result property="storeTopicId" column="store_topic_id"/>
     </resultMap>
 
     <select id="queryObject" resultType="com.kmall.admin.entity.AdEntity">
@@ -53,6 +54,23 @@
         from mall_ad
         where tick_disc_id = #{tickDiscId}
     </select>
+    <select id="queryAdByStoreTopicId" resultType="com.kmall.admin.entity.AdEntity">
+        select
+        id,
+        ad_position_id,
+        media_type,
+        name,
+        store_id,
+        merch_sn,
+        link,
+        image_url,
+        sort_order,
+        content,
+        end_time,
+        enabled
+        from mall_ad
+        where store_topic_id = #{storeTopicId}
+    </select>
 
     <select id="queryList" resultType="com.kmall.admin.entity.AdEntity">
         select
@@ -123,6 +141,7 @@
 			`store_id`,
 			`merch_sn`,
 			tick_disc_id,
+			store_topic_id,
 			`link`,
 			`image_url`,
 			`sort_order`,
@@ -136,6 +155,7 @@
 			#{storeId},
 			#{merchSn},
 			#{tickDiscId},
+			#{storeTopicId},
 			#{link},
 			#{imageUrl},
 			#{sortOrder},
@@ -153,6 +173,7 @@
             <if test="storeId != null">`store_id` = #{storeId}, </if>
             <if test="merchSn != null">`merch_sn` = #{merchSn}, </if>
             <if test="tickDiscId != null">`tick_disc_id` = #{tickDiscId}, </if>
+            <if test="storeTopicId != null">`store_topic_id` = #{storeTopicId}, </if>
             <if test="link != null">`link` = #{link},</if>
             <if test="imageUrl != null">`image_url` = #{imageUrl},</if>
             <if test="sortOrder != null">`sort_order` = #{sortOrder},</if>

+ 7 - 1
kmall-admin/src/main/resources/mybatis/mapper/GoodsAttributeDao.xml

@@ -39,6 +39,9 @@
         <if test="goodsId != null and goodsId != ''">
             AND mall_goods_attribute.goods_id = #{goodsId}
         </if>
+        <if test="storeId != null and storeId != ''">
+            AND mall_goods_attribute.store_id = #{storeId}
+        </if>
         <if test="attributeId != null and attributeId != ''">
             AND mall_goods_attribute.attribute_id = #{attributeId}
         </if>
@@ -68,11 +71,13 @@
 
     <insert id="save" parameterType="com.kmall.admin.entity.GoodsAttributeEntity" useGeneratedKeys="true" keyProperty="id">
         insert into mall_goods_attribute(
+        store_id,
         `goods_id`,
         `merch_sn`,
         `attribute_id`,
         `value`)
         values(
+        #{storeId},
         #{goodsId},
         #{merchSn},
         #{attributeId},
@@ -82,6 +87,7 @@
     <update id="update" parameterType="com.kmall.admin.entity.GoodsAttributeEntity">
         update mall_goods_attribute
         <set>
+            <if test="storeId != null">`store_id` = #{storeId},</if>
             <if test="goodsId != null">`goods_id` = #{goodsId},</if>
             <if test="merchSn != null">`merch_sn` = #{merchSn},</if>
             <if test="attributeId != null">`attribute_id` = #{attributeId},</if>
@@ -95,7 +101,7 @@
         <set>
             <if test="value != null">`value` = #{value}</if>
         </set>
-        where goods_id = #{goodsId} AND attribute_id = #{attributeId}
+        where goods_id = #{goodsId} AND attribute_id = #{attributeId} and store_id = #{storeId}
     </update>
 
     <delete id="delete">

+ 84 - 7
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -55,7 +55,7 @@
         <result property="cusDeclEle" column="cus_decl_ele"/>
         <result property="cusRecCode" column="cus_rec_code"/>
         <result property="supplierId" column="supplier_id"/>
-        <result property="stockNums" column="stock_num"/>
+        <result property="stockNum" column="stock_num"/>
         <result property="storeName" column="store_name"/>
         <result property="productId" column="productId"/>
         <result property="storeId" column="storeId"/>
@@ -72,15 +72,69 @@
     <select id="queryObject" resultType="com.kmall.admin.entity.GoodsEntity">
         SELECT
             a.*, CASE
-        when g.id > 0 then 2 else 0 end as goodsType,mb.is_stock_share isStockShare,mb.third_party_merch_code thirdPartyMerchCode
+        when g.id > 0 then 2 else 0 end as goodsType,
+        mb.third_party_merch_code,
+        mb.is_stock_share isStockShare,
+        mb.is_supplier_goods 'isSupplierGoods'
         FROM
             mall_goods a
         LEFT JOIN mall_goods_group g ON g.goods_id = a.id AND g.open_status != 3
-        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 third_merchant_biz mb ON a.third_party_merch_code = mb.third_party_merch_code
         WHERE a.id = #{value}
     </select>
 
+    <select id="queryObjectByStoreId" resultMap="goodsMap">
+        select
+        a.sku,
+        a.id,
+        psr1.category_id,
+        a.goods_sn,
+        a.name,
+        psr1.brand_id,
+        a.goods_number,
+        a.keywords,
+        a.goods_brief,
+        a.is_on_sale,
+        a.add_time,
+        a.sort_order,
+        a.is_delete,
+        psr1.attribute_category,
+        a.counter_price,
+        a.extra_price,
+        a.is_new,
+        a.goods_unit,
+        a.primary_pic_url,
+        a.list_pic_url,
+        psr1.retail_price,
+        psr1.sell_volume,
+        a.primary_product_id,
+        a.unit_price,
+        a.promotion_desc,
+        a.promotion_tag,
+        a.app_exclusive_price,
+        a.is_app_exclusive,
+        a.is_limited,
+        a.is_hot,
+        a.merch_sn,
+        m.merch_name,
+        psr1.store_id,
+        psr1.market_price,
+        psr1.stock_num,
+        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 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>
+
     <select id="queryObjectByProdBarcodeAndBizType" resultType="com.kmall.admin.entity.GoodsEntity">
         SELECT
             a.id,a.sku,a.goods_sn,a.name,a.list_pic_url,a.prod_barcode,r.market_price storeMarketPrice,r.retail_price storeRetailPrice ,r.stock_num,s.store_name,r.product_id,s.id 'storeId'
@@ -173,8 +227,19 @@
         <if test="goodsBizType != null and goodsBizType != ''">
             AND mall_goods.goods_biz_type = #{goodsBizType}
         </if>
+        <if test="id != null and id != ''">
+            AND mall_goods.id = #{id}
+        </if>
         <if test="storeId != null and storeId != ''">
-            AND mall_goods.id not in (select goods_id from mall_product_store_rela where store_id = #{storeId})
+            AND mall_goods.third_party_merch_code = ( SELECT third_party_merch_code FROM mall_store WHERE id = #{storeId} )
+            AND mall_goods.id NOT IN (
+            SELECT
+            goods_id
+            FROM
+            mall_product_store_rela pp
+            WHERE
+            store_id = #{storeId}
+            )
         </if>
 
         <choose>
@@ -253,9 +318,21 @@
             AND mall_goods.goods_biz_type = #{goodsBizType}
         </if>
         <if test="storeId != null and storeId != ''">
-            AND mall_goods.id not in (select goods_id from mall_product_store_rela where store_id = #{storeId})
+            AND mall_goods.third_party_merch_code = ( SELECT third_party_merch_code FROM mall_store WHERE id = #{storeId} )
+            AND mall_goods.id NOT IN (
+            SELECT
+            goods_id
+            FROM
+            mall_product_store_rela pp
+            LEFT JOIN mall_goods gg ON pp.goods_id = gg.id
+            AND pp.merch_sn = gg.merch_sn
+            AND pp.merch_sn
+            LEFT JOIN mall_store s ON pp.store_id = s.id
+            AND s.third_party_merch_code = gg.third_party_merch_code
+            WHERE
+            store_id = #{storeId}
+            )
         </if>
-
     </select>
 
     <insert id="save" parameterType="com.kmall.admin.entity.GoodsEntity" useGeneratedKeys="true" keyProperty="id">

+ 34 - 19
kmall-admin/src/main/resources/mybatis/mapper/OrderDao.xml

@@ -69,6 +69,9 @@
         <result property="brand" column="brand"/>
         <result column="gross_weight" property="grossWeight" />
         <result column="net_weight" property="netWeight" />
+        <result property="fullCutPrice" column="full_cut_price"/>
+        <result property="campMinusId" column="camp_minus_id"/>
+        <result property="campName" column="camp_name"/>
     </resultMap>
 
     <select id="queryObject" resultType="com.kmall.admin.entity.OrderEntity">
@@ -133,7 +136,10 @@
         p.is_payment_send,
         p.is_ele_order_send,
         p.is_customs_send,
-        s.store_name
+        s.store_name,
+        o.full_cut_price,
+        o.camp_minus_id,
+        o.camp_name
         FROM
         mall_order o
         LEFT JOIN mall_user u ON o.user_id = u.id
@@ -149,6 +155,9 @@
         <if test="storeId != null and storeId != ''">
             AND o.store_id = #{storeId}
         </if>
+        <if test="sku != null and sku.trim() != ''">
+            AND o.id IN ( SELECT order_id FROM mall_order_goods g INNER JOIN mall_goods gs ON g.goods_id = gs.id WHERE gs.sku = #{sku} )
+        </if>
         <if test="thirdPartyMerchCode != null and thirdPartyMerchCode.trim() != ''">
             AND s.third_party_merch_code = #{thirdPartyMerchCode}
         </if>
@@ -259,6 +268,9 @@
         <if test="thirdPartyMerchCode != null and thirdPartyMerchCode.trim() != ''">
             AND s.third_party_merch_code = #{thirdPartyMerchCode}
         </if>
+        <if test="sku != null and sku.trim() != ''">
+            AND o.id IN ( SELECT order_id FROM mall_order_goods g INNER JOIN mall_goods gs ON g.goods_id = gs.id WHERE gs.sku = #{sku} )
+        </if>
         <if test="merchOrderSn != null and merchOrderSn.trim() != ''">
             AND o.merch_order_sn = #{merchOrderSn}
         </if>
@@ -323,6 +335,9 @@
         <if test="merchOrderSn != null and merchOrderSn.trim() != ''">
             AND o.merch_order_sn = #{merchOrderSn}
         </if>
+        <if test="sku != null and sku.trim() != ''">
+            AND o.id IN ( SELECT order_id FROM mall_order_goods g INNER JOIN mall_goods gs ON g.goods_id = gs.id WHERE gs.sku = #{sku} )
+        </if>
         <if test="merchSn != null and merchSn.trim() != ''">
             AND o.merch_sn = #{merchSn}
         </if>
@@ -443,7 +458,10 @@
 			`pay_time`, 
 			`freight_price`, 
 			`coupon_id`,
-			`coupon_price`, 
+			`coupon_price`,
+            full_cut_price,
+            camp_minus_id,
+            camp_name,
 			`callback_status`,
 			`order_type`,
 			`store_id`,
@@ -487,7 +505,10 @@
 			#{payTime}, 
 			#{freightPrice}, 
 			#{couponId},
-			#{couponPrice}, 
+			#{couponPrice},
+            #{fullCutPrice},
+            #{campMinusId},
+            #{campName},
 			#{callbackStatus},
 			#{orderType},
 			#{storeId},
@@ -535,6 +556,9 @@
             <if test="freightPrice != null">`freight_price` = #{freightPrice},</if>
             <if test="couponId != null">`coupon_id` = #{couponId},</if>
             <if test="couponPrice != null">`coupon_price` = #{couponPrice},</if>
+            <if test="fullCutPrice != null">`full_cut_price` = #{fullCutPrice},</if>
+            <if test="campMinusId != null">`camp_minus_id` = #{campMinusId},</if>
+            <if test="campName != null">`camp_name` = #{campName},</if>
             <if test="callbackStatus != null">`callback_status` = #{callbackStatus},</if>
             <if test="orderType != null">`order_type` = #{orderType},</if>
             <if test="storeId != null">`store_id` = #{storeId},</if>
@@ -906,7 +930,6 @@
             </if>
     </select>
 
-
     <select id="storeTopicOrderList" resultType="com.kmall.admin.entity.OrderEntity">
         SELECT
         s.title 'storeTopicName',
@@ -919,18 +942,19 @@
         o.actual_price,
         o.freight_price,
         o.activity_id,
+        o.coupon_id,
+        o.coupon_name,
+        o.camp_minus_id,
+        o.camp_name,
         o.order_status,
         o.pay_status,
-        o.coupon_name,
         u.userName userName,
         o.order_price,
         o.add_time,
         o.shipping_status
         FROM
         mall_order o
-        INNER JOIN mall_user_coupon cc ON o.coupon_id = cc.id
-        AND cc.user_id = o.user_id
-        INNER JOIN mall_store_topic s ON cc.store_topic_id = s.id
+        INNER JOIN mall_store_topic s ON o.activity_id = s.id
         LEFT JOIN mk_store_prom_type pt ON s.prom_type_id = pt.prom_type_id
         LEFT JOIN mall_store ss ON o.store_id = ss.id
         LEFT JOIN mall_user u ON o.user_id = u.id
@@ -981,14 +1005,7 @@
         <if test="isOnfiilineOrder != null">
             AND o.is_onffline_order = #{isOnfiilineOrder}
         </if>
-        <choose>
-            <when test="sidx != null and sidx.trim() != ''">
-                order by ${sidx} ${order}
-            </when>
-            <otherwise>
-                order by o.id desc
-            </otherwise>
-        </choose>
+        order by o.id DESC
         <if test="offset != null and limit != null">
             limit #{offset}, #{limit}
         </if>
@@ -999,9 +1016,7 @@
         count(*)
         FROM
         mall_order o
-        INNER JOIN mall_user_coupon cc ON o.coupon_id = cc.id
-        AND cc.user_id = o.user_id
-        INNER JOIN mall_store_topic s ON cc.store_topic_id = s.id
+        INNER JOIN mall_store_topic s ON o.activity_id = s.id
         LEFT JOIN mk_store_prom_type pt ON s.prom_type_id = pt.prom_type_id
         LEFT JOIN mall_store ss ON o.store_id = ss.id
         LEFT JOIN mall_user u ON o.user_id = u.id

+ 87 - 10
kmall-admin/src/main/resources/mybatis/mapper/ProductStoreRelaDao.xml

@@ -31,6 +31,7 @@
         <result column="list_pic_url" property="listPicUrl" />
         <result column="merch_name" property="merchName" />
         <result column="goods_merch_sn" property="goodsMerchSn" />
+        <result column="supplier_third_id" property="supplierThirdId" />
 
         <result column="category_id" property="categoryId" />
         <result column="attribute_category" property="attributeCategory" />
@@ -70,13 +71,14 @@
             a.category_id,
             a.attribute_category,
             a.brand_id,
-            a.freight_id
+            a.freight_id,
+            supplier_third_id
         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
             LEFT JOIN mall_product c ON a.product_id = c.id
             LEFT JOIN mall_category cg ON a.category_id = cg.id
-            LEFT JOIN mall_store s ON a.store_id = s.id
             left join mall_goods_specification gs on gs.goods_id = a.goods_id
 		where a.id = #{id}
 	</select>
@@ -105,13 +107,14 @@
             a.freight_id,
             b.goods_number goodsNumber,
             mb.is_stock_share isStockShare,
-            b.sell_volume goodsSellVolume
+            b.sell_volume goodsSellVolume,
+            supplier_third_id
         from mall_product_store_rela 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_store s on a.store_id = s.id
+        left join third_merchant_biz mb on s.third_party_merch_code = mb.third_party_merch_code
         left join mall_product c on a.product_id = c.id
         LEFT JOIN mall_category cg ON a.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>
 
@@ -131,7 +134,8 @@
             a.category_id,
             a.attribute_category,
             a.brand_id,
-            a.freight_id
+            a.freight_id,
+            supplier_third_id
         from mall_product_store_rela a
         where a.store_id = #{storeId} and a.goods_id = #{goodsId}
     </select>
@@ -148,6 +152,7 @@
         a.`market_price`,
         a.`stock_price`,
         a.`sell_volume`,
+        b.is_on_sale 'isOnSale',
         b.sell_volume 'goodsSellVolume',
         b.sku,a.goods_biz_type, a.creater_sn, a.create_time, a.moder_sn, a.mod_time, a.tstm,
         b.goods_sn goodsSn,
@@ -165,7 +170,7 @@
         b.goods_number goodsNumber,
         b.third_party_merch_code thirdPartyMerchCode,
         mb.is_stock_share isStockShare,
-        b.list_pic_url
+        b.list_pic_url,supplier_third_id
         from mall_product_store_rela a
         left join mall_goods b on a.goods_id = b.id
         left join third_merchant_biz mb on mb.third_party_merch_code = b.third_party_merch_code and mb.merch_sn=b.merch_sn
@@ -250,7 +255,7 @@
         a.category_id,
         a.attribute_category,
         a.brand_id,
-        a.freight_id
+        a.freight_id,supplier_third_id
         from mall_product_store_rela a
         left join mall_goods b on a.goods_id = b.id
         left join mall_product c on a.product_id = c.id
@@ -362,6 +367,7 @@
 			`market_price`,
             `stock_price`,
             `sell_volume`,
+            supplier_third_id,
 
         <if test="sku != null" >
             sku,
@@ -404,6 +410,7 @@
 			#{marketPrice},
 			#{stockPrice},
 			#{sellVolume},
+            #{supplierThirdId},
 
         <if test="sku != null" >
             #{sku,jdbcType=VARCHAR},
@@ -450,6 +457,7 @@
             <if test="marketPrice != null">`market_price` = #{marketPrice},</if>
             <if test="stockPrice != null">`stock_price` = #{stockPrice},</if>
             <if test="sellVolume != null">`sell_volume` = #{sellVolume},</if>
+            <if test="supplierThirdId != null">`supplier_third_id` = #{supplierThirdId},</if>
 
             <if test="sku != null" >
                 sku = #{sku,jdbcType=VARCHAR},
@@ -544,7 +552,7 @@
         gs.list_pic_url
         FROM
         mall_product_store_rela s
-        LEFT JOIN mk_store_ticket_goods_temp g ON s.id = g.store_rela_id AND g.guid = #{guid} and g.is_valid = '0' and g.is_button_cannel = '0'
+        LEFT JOIN mk_store_topic_goods_temp g ON s.id = g.store_rela_id AND g.guid = #{guid} and g.is_valid = '0' and g.is_button_cannel = '0'
         LEFT JOIN mall_goods gs ON s.goods_id = gs.id
         LEFT JOIN mall_store st ON st.id =  s.store_id
         WHERE  1=1 and gs.is_delete = 0
@@ -573,7 +581,7 @@
         select count(*)
         FROM
         mall_product_store_rela s
-        LEFT JOIN mk_store_ticket_goods_temp g ON s.id = g.store_rela_id AND g.guid = #{guid} and g.is_valid = '0' and g.is_button_cannel = '0'
+        LEFT JOIN mk_store_topic_goods_temp g ON s.id = g.store_rela_id AND g.guid = #{guid} and g.is_valid = '0' and g.is_button_cannel = '0'
         LEFT JOIN mall_goods gs ON s.goods_id = gs.id
         LEFT JOIN mall_store st ON st.id =  s.store_id
         WHERE  1=1 and gs.is_delete = 0
@@ -594,4 +602,73 @@
         </if>
     </select>
 
+    <select id="queryGoodsRealListByTopicId" resultType="com.kmall.admin.entity.ProductStoreRelaEntity">
+        SELECT
+        s.id,
+        s.goods_id,
+        s.retail_price,
+        g.store_rela_id 'isCheck',
+        g.apply_type applyType,
+        gs.NAME 'goodsName',
+        g.disc_good_temp_id 'discGoodTempId',
+        g.store_topic_id 'storeTopicId',
+        gs.goods_number goodsNumber,
+        s.stock_num,
+        gs.list_pic_url
+        FROM
+        mall_product_store_rela s
+        LEFT JOIN mk_store_topic_goods_temp g ON s.id = g.store_rela_id and g.is_valid = '0' and g.is_button_cannel = '0'
+        <if test="storeTopicId != null and storeTopicId != '' ">
+            and g.store_topic_id = #{storeTopicId}
+        </if>
+        LEFT JOIN mall_goods gs ON s.goods_id = gs.id
+        WHERE  1=1 and gs.is_delete = 0
+        <if test="storeId != null and storeId != '' ">
+            AND s.store_id = #{storeId}
+        </if>
+        <if test="merchSn != null and merchSn.trim() != '' ">
+            AND s.merch_sn = #{merchSn}
+        </if>
+        <if test="thirdPartyMerchCode != null and thirdPartyMerchCode.trim() != ''">
+            AND st.third_party_merch_code = #{thirdPartyMerchCode}
+        </if>
+        <if test="goodsBizType != null and goodsBizType != '' ">
+            AND gs.goods_biz_type = #{goodsBizType}
+        </if>
+        <if test="goodsName != null and goodsName != '' ">
+            AND gs.name LIKE concat('%',#{goodsName},'%')
+        </if>
+        order by s.id desc
+        <if test="offset != null and limit != null">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+    <select id="queryGoodsRealListByTopicIdTotal" resultType="int">
+        select count(*)
+        FROM
+        mall_product_store_rela s
+        LEFT JOIN mk_store_topic_goods_temp g ON s.id = g.store_rela_id and g.is_valid = '0' and g.is_button_cannel = '0'
+        <if test="storeTopicId != null and storeTopicId != '' ">
+            and g.store_topic_id = #{storeTopicId}
+        </if>
+        LEFT JOIN mall_goods gs ON s.goods_id = gs.id
+        WHERE  1=1 and gs.is_delete = 0
+        <if test="storeId != null and storeId != '' ">
+            AND s.store_id = #{storeId}
+        </if>
+        <if test="merchSn != null and merchSn.trim() != '' ">
+            AND s.merch_sn = #{merchSn}
+        </if>
+        <if test="thirdPartyMerchCode != null and thirdPartyMerchCode.trim() != ''">
+            AND st.third_party_merch_code = #{thirdPartyMerchCode}
+        </if>
+        <if test="goodsBizType != null and goodsBizType != '' ">
+            AND gs.goods_biz_type = #{goodsBizType}
+        </if>
+        <if test="goodsName != null and goodsName != '' ">
+            AND gs.name LIKE concat('%',#{goodsName},'%')
+        </if>
+    </select>
+
 </mapper>

+ 3 - 0
kmall-admin/src/main/resources/mybatis/mapper/StoreDao.xml

@@ -123,6 +123,9 @@
 		<if test="thirdMerchSn != null and thirdMerchSn.trim() != ''">
 			AND t.third_merch_sn = #{thirdMerchSn}
 		</if>
+		<if test="isSupplierGoods != null and isSupplierGoods.trim() != ''">
+			AND t.is_supplier_goods = #{isSupplierGoods}
+		</if>
 		<if test="id != null">
 			AND s.id = #{id}
 		</if>

+ 9 - 1
kmall-admin/src/main/resources/mybatis/mapper/ThirdMerchantBizDao.xml

@@ -18,6 +18,7 @@
         <result property="tstm" column="tstm"/>
 		<result property="isMapShow" column="is_map_show"/>
 		<result property="isDistSellStart" column="is_dist_sell_start"/>
+		<result property="isSupplierGoods" column="is_supplier_goods"/>
 
     </resultMap>
 
@@ -30,6 +31,7 @@
 			`is_valid`,
 			is_stock_share,
 			is_store_user_share,
+			is_supplier_goods,
 			`creater_sn`,
 			`create_time`,
 			`moder_sn`,
@@ -49,6 +51,7 @@
 		`is_valid`,
 		is_stock_share,
 		is_store_user_share,
+		is_supplier_goods,
 		`creater_sn`,
 		`create_time`,
 		`moder_sn`,
@@ -68,6 +71,7 @@
 		`is_valid`,
 		is_stock_share,
 		is_store_user_share,
+		is_supplier_goods,
 		`creater_sn`,
 		`create_time`,
 		`moder_sn`,
@@ -86,7 +90,8 @@
     		`third_party_merch_name`,
     		`is_valid`,
 			is_stock_share,
-		is_store_user_share,
+			is_store_user_share,
+			is_supplier_goods,
     		`creater_sn`,
     		`create_time`,
     		`moder_sn`,
@@ -143,6 +148,7 @@
 			is_store_user_share,
 			is_map_show,
 			is_dist_sell_start,
+			is_supplier_goods,
 			`creater_sn`,
 			`create_time`,
 			`moder_sn`,
@@ -157,6 +163,7 @@
 			#{isStoreUserShare},
 			#{isMapShow},
 			#{isDistSellStart},
+			#{isSupplierGoods},
 			#{createrSn},
 			#{createTime},
 			#{moderSn},
@@ -173,6 +180,7 @@
 			<if test="isValid != null">`is_valid` = #{isValid}, </if>
 			<if test="isStockShare != null">`is_stock_share` = #{isStockShare}, </if>
 			<if test="isStoreUserShare != null">`is_store_user_share` = #{isStoreUserShare}, </if>
+			<if test="isSupplierGoods != null">`is_supplier_goods` = #{isSupplierGoods}, </if>
 			<if test="isMapShow != null">`is_map_show` = #{isMapShow}, </if>
 			<if test="isDistSellStart != null">`is_dist_sell_start` = #{isDistSellStart}, </if>
 			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>

+ 165 - 0
kmall-admin/src/main/resources/mybatis/mapper/UserCampMinusDao.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.admin.dao.UserCampMinusDao">
+
+    <resultMap type="com.kmall.admin.entity.UserCampMinusEntity" 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.admin.entity.UserCampMinusEntity">
+		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.admin.entity.UserCampMinusEntity">
+		select user_camp_id from mall_user_camp_minus where order_id = #{orderId}
+	</select>
+
+	<select id="queryCampByStoreTopicId" resultType="com.kmall.admin.entity.UserCampMinusEntity">
+		select * from mall_user_camp_minus where store_topic_id = #{storeTopicId}
+	</select>
+
+	<update id="cancelUserCampOrder" parameterType="com.kmall.admin.entity.UserCampMinusEntity">
+		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.admin.entity.UserCampMinusEntity">
+		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.admin.entity.UserCampMinusEntity" 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.admin.entity.UserCampMinusEntity">
+		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>

+ 1 - 1
kmall-admin/src/main/resources/mybatis/mapper/mk/MkCenterMenuDao.xml

@@ -125,7 +125,7 @@
                 order by ${sidx} ${order}
             </when>
 			<otherwise>
-                order by a.id desc
+                order by r.id desc
 			</otherwise>
         </choose>
 		<if test="offset != null and limit != null">

+ 232 - 0
kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreCampMinusDao.xml

@@ -0,0 +1,232 @@
+<?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.admin.dao.mk.store.MkStoreCampMinusDao">
+
+    <resultMap type="com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity" 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.admin.entity.mk.store.MkStoreCampMinusEntity">
+		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.admin.entity.mk.store.MkStoreCampMinusEntity">
+		SELECT
+		s.store_name 'storeName',
+		t.submit_order_num 'submitNum',
+		t.browse_num 'browseNum',
+		t.act_money 'actMoney',
+		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
+		LEFT JOIN mall_store s ON m.store_id = s.id
+		LEFT JOIN mk_store_topic_stat t ON t.store_topic_id = m.store_topic_id
+		LEFT JOIN third_merchant_biz tb ON s.third_party_merch_code = tb.third_party_merch_code
+		WHERE 1=1
+		<if test="campName != null and campName.trim() != ''">
+			AND m.camp_name LIKE concat('%',#{campName},'%')
+		</if>
+		<if test="isPast != null and isPast != ''">
+			AND m.is_past = #{isPast}
+		</if>
+		<if test="storeId != null and storeId != ''">
+			AND t.store_id = #{storeId}
+		</if>
+		<if test="thirdMerchSn != null and thirdMerchSn != ''">
+			AND s.third_merch_sn = #{thirdMerchSn}
+		</if>
+		<if test="thirdPartyMerchCode != null and thirdPartyMerchCode != ''">
+			AND tb.third_party_merch_code = #{thirdPartyMerchCode}
+		</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 m
+		LEFT JOIN mall_store s ON m.store_id = s.id
+		LEFT JOIN mk_store_topic_stat t ON t.store_topic_id = m.store_topic_id
+		LEFT JOIN third_merchant_biz tb ON s.third_party_merch_code = tb.third_party_merch_code
+		WHERE 1=1
+		<if test="campName != null and campName.trim() != ''">
+			AND m.camp_name LIKE concat('%',#{campName},'%')
+		</if>
+		<if test="isPast != null and isPast != ''">
+			AND m.is_past = #{isPast}
+		</if>
+		<if test="storeId != null and storeId != ''">
+			AND t.store_id = #{storeId}
+		</if>
+		<if test="thirdMerchSn != null and thirdMerchSn != ''">
+			AND s.third_merch_sn = #{thirdMerchSn}
+		</if>
+		<if test="thirdPartyMerchCode != null and thirdPartyMerchCode != ''">
+			AND tb.third_party_merch_code = #{thirdPartyMerchCode}
+		</if>
+	</select>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity" useGeneratedKeys="true" keyProperty="campMinusId">
+		insert into mk_store_camp_minus(
+			`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`)
+		values(
+			#{campName},
+			#{thirdMerchSn},
+			#{storeId},
+			#{storeTopicId},
+			#{campBegTime},
+			#{campEndTime},
+			#{campMinusType},
+			#{minusMode},
+			#{applyType},
+			#{advImgUrl},
+			#{advDesc},
+			#{isValid},
+			#{isPast},
+			#{isStoreShow},
+			#{note},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm},
+			#{goodsBizType})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.mk.store.MkStoreCampMinusEntity">
+		update mk_store_camp_minus 
+		<set>
+			<if test="campName != null">`camp_name` = #{campName}, </if>
+			<if test="thirdMerchSn != null">`third_merch_sn` = #{thirdMerchSn}, </if>
+			<if test="storeId != null">`store_id` = #{storeId}, </if>
+			<if test="storeTopicId != null">`store_topic_id` = #{storeTopicId}, </if>
+			<if test="campBegTime != null">`camp_beg_time` = #{campBegTime}, </if>
+			<if test="campEndTime != null">`camp_end_time` = #{campEndTime}, </if>
+			<if test="campMinusType != null">`camp_minus_type` = #{campMinusType}, </if>
+			<if test="minusMode != null">`minus_mode` = #{minusMode}, </if>
+			<if test="applyType != null">`apply_type` = #{applyType}, </if>
+			<if test="advImgUrl != null">`adv_img_url` = #{advImgUrl}, </if>
+			<if test="advDesc != null">`adv_desc` = #{advDesc}, </if>
+			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="isPast != null">`is_past` = #{isPast}, </if>
+			<if test="isStoreShow != null">`is_store_show` = #{isStoreShow}, </if>
+			<if test="note != null">`note` = #{note}, </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>
+			<if test="goodsBizType != null">`goods_biz_type` = #{goodsBizType}</if>
+		</set>
+		where camp_minus_id = #{campMinusId}
+	</update>
+	
+	<delete id="delete">
+		delete from mk_store_camp_minus where camp_minus_id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mk_store_camp_minus where camp_minus_id in 
+		<foreach item="campMinusId" collection="array" open="(" separator="," close=")">
+			#{campMinusId}
+		</foreach>
+	</delete>
+
+</mapper>

+ 208 - 0
kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreCampMinusGoodsDao.xml

@@ -0,0 +1,208 @@
+<?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.admin.dao.mk.store.MkStoreCampMinusGoodsDao">
+
+    <resultMap type="com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity" 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>
+
+	<select id="queryObject" resultType="com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity">
+		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.admin.entity.mk.store.MkStoreCampMinusGoodsEntity">
+		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>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity" useGeneratedKeys="true" keyProperty="minusGoodId">
+		insert into mk_store_camp_minus_goods(
+			`camp_minus_id`,
+			`apply_type`,
+			`store_rela_id`,
+			`is_valid`,
+			`note`,
+			`creater_sn`,
+			`create_time`,
+			`moder_sn`,
+			`mod_time`,
+			`tstm`)
+		values(
+			#{campMinusId},
+			#{applyType},
+			#{storeRelaId},
+			#{isValid},
+			#{note},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity">
+		update mk_store_camp_minus_goods 
+		<set>
+			<if test="campMinusId != null">`camp_minus_id` = #{campMinusId}, </if>
+			<if test="applyType != null">`apply_type` = #{applyType}, </if>
+			<if test="storeRelaId != null">`store_rela_id` = #{storeRelaId}, </if>
+			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="note != null">`note` = #{note}, </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 minus_good_id = #{minusGoodId}
+	</update>
+	
+	<delete id="delete">
+		delete from mk_store_camp_minus_goods where minus_good_id = #{value}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mk_store_camp_minus_goods where minus_good_id in 
+		<foreach item="minusGoodId" collection="array" open="(" separator="," close=")">
+			#{minusGoodId}
+		</foreach>
+	</delete>
+
+	<select id="queryCampMinusGoodsByIdList" resultType="com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity">
+		SELECT
+			g.NAME 'goodsName',
+			s.store_name 'storeName',
+			r.retail_price 'retailPrice',
+			r.market_price 'marketPrice',
+			g.is_on_sale 'isOnSale',
+			m.minus_good_id,
+			(
+		SELECT
+			sum( o.actual_price )
+		FROM
+			mall_order o
+			INNER JOIN mall_order_goods og ON o.id = og.order_id
+		WHERE
+			og.goods_id = r.goods_id
+			AND o.store_id = cm.store_id
+			AND o.activity_id = cm.store_topic_id
+			) 'actualTotalPrice'
+		FROM
+			mk_store_camp_minus_goods m
+			LEFT JOIN mk_store_camp_minus cm ON m.camp_minus_id = cm.camp_minus_id
+			LEFT JOIN mall_product_store_rela r ON m.store_rela_id = r.id
+			LEFT JOIN mall_store s ON r.store_id = s.id
+			LEFT JOIN mall_goods g ON r.goods_id = g.id
+			AND s.third_party_merch_code = g.third_party_merch_code
+		WHERE 1=1
+		<if test="goodsName != null and goodsName.trim() != ''">
+			AND g.NAME LIKE concat('%',#{goodsName},'%')
+		</if>
+		<if test="campMinusId != null and campMinusId != ''">
+			AND m.camp_minus_id = #{campMinusId}
+		</if>
+		<if test="offset != null and limit != null">
+			limit #{offset}, #{limit}
+		</if>
+	</select>
+
+	<select id="queryCampMinusGoodsByIdTotal" resultType="int">
+		select count(*) FROM
+		mk_store_camp_minus_goods m
+		LEFT JOIN mk_store_camp_minus cm ON m.camp_minus_id = cm.camp_minus_id
+		LEFT JOIN mall_product_store_rela r ON m.store_rela_id = r.id
+		LEFT JOIN mall_store s ON r.store_id = s.id
+		LEFT JOIN mall_goods g ON r.goods_id = g.id
+		AND s.third_party_merch_code = g.third_party_merch_code
+		WHERE 1=1
+		<if test="goodsName != null and goodsName.trim() != ''">
+			AND g.NAME LIKE concat('%',#{goodsName},'%')
+		</if>
+		<if test="campMinusId != null and campMinusId != ''">
+			AND m.camp_minus_id = #{campMinusId}
+		</if>
+	</select>
+
+	<select id="queryCampMinusStoreTopicById" resultType="com.kmall.admin.entity.mk.store.MkStoreCampMinusGoodsEntity">
+		select
+		g.`minus_good_id`,
+		g.`camp_minus_id`,
+		g.`apply_type`,
+		g.`store_rela_id`,
+		g.`is_valid`,
+		g.`note`,
+		g.`creater_sn`,
+		g.`create_time`,
+		g.`moder_sn`,
+		g.`mod_time`,
+		g.`tstm`,
+		m.store_topic_id 'storeTopicId'
+		FROM
+		`mk_store_camp_minus_goods` g
+		INNER JOIN mk_store_camp_minus m ON g.camp_minus_id = m.camp_minus_id
+		where minus_good_id = #{minusGoodId}
+	</select>
+
+	<delete id="deleteMinusGoodsByMinusId">
+		delete from mk_store_camp_minus_goods where camp_minus_id = #{campMinusId}
+	</delete>
+
+</mapper>

+ 259 - 0
kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreCampMinusLevelDao.xml

@@ -0,0 +1,259 @@
+<?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.admin.dao.mk.store.MkStoreCampMinusLevelDao">
+
+    <resultMap type="com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity" 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.admin.entity.mk.store.MkStoreCampMinusLevelEntity">
+		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="queryLevelByCampMinusId" resultType="com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity">
+		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="queryList" resultType="com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity">
+		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>
+	 
+	<insert id="save" parameterType="com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity" useGeneratedKeys="true" keyProperty="campMinusId">
+		insert into mk_store_camp_minus_level(
+			`camp_minus_id`,
+			`camp_minus_type`,
+			`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`)
+		values(
+			#{campMinusId},
+			#{campMinusType},
+			#{minusMode},
+			#{yuanMinusCond},
+			#{yuanMinusPref},
+			#{pieceMinusConf},
+			#{pieceMinusPref},
+			#{pieceMinusEachDisc},
+			#{yuanDiscCond},
+			#{yuanDiscPref},
+			#{pieceDiscConf},
+			#{pieceDiscPref},
+			#{isValid},
+			#{note},
+			#{createrSn},
+			#{createTime},
+			#{moderSn},
+			#{modTime},
+			#{tstm})
+	</insert>
+	 
+	<update id="update" parameterType="com.kmall.admin.entity.mk.store.MkStoreCampMinusLevelEntity">
+		update mk_store_camp_minus_level 
+		<set>
+			<if test="campMinusId != null">`camp_minus_id` = #{campMinusId}, </if>
+			<if test="campMinusType != null">`camp_minus_type` = #{campMinusType}, </if>
+			<if test="minusMode != null">`minus_mode` = #{minusMode}, </if>
+			<if test="yuanMinusCond != null">`yuan_minus_cond` = #{yuanMinusCond}, </if>
+			<if test="yuanMinusPref != null">`yuan_minus_pref` = #{yuanMinusPref}, </if>
+			<if test="pieceMinusConf != null">`piece_minus_conf` = #{pieceMinusConf}, </if>
+			<if test="pieceMinusPref != null">`piece_minus_pref` = #{pieceMinusPref}, </if>
+			<if test="pieceMinusEachDisc != null">`piece_minus_each_disc` = #{pieceMinusEachDisc}, </if>
+			<if test="yuanDiscCond != null">`yuan_disc_cond` = #{yuanDiscCond}, </if>
+			<if test="yuanDiscPref != null">`yuan_disc_pref` = #{yuanDiscPref}, </if>
+			<if test="pieceDiscConf != null">`piece_disc_conf` = #{pieceDiscConf}, </if>
+			<if test="pieceDiscPref != null">`piece_disc_pref` = #{pieceDiscPref}, </if>
+			<if test="isValid != null">`is_valid` = #{isValid}, </if>
+			<if test="note != null">`note` = #{note}, </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 camp_minus_level_id = #{campMinusLevelId}
+	</update>
+	
+	<delete id="delete">
+		delete from mk_store_camp_minus_level where camp_minus_level_id = #{value}
+	</delete>
+
+	<delete id="deleteByCampMinusId">
+		delete from mk_store_camp_minus_level where camp_minus_id = #{campMinusId}
+	</delete>
+	
+	<delete id="deleteBatch">
+		delete from mk_store_camp_minus_level where camp_minus_level_id in
+		<foreach item="campMinusLevelId" collection="array" open="(" separator="," close=")">
+			#{campMinusLevelId}
+		</foreach>
+	</delete>
+
+	<insert id="saveBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
+		insert into mk_store_camp_minus_level(
+		`camp_minus_id`,
+		`camp_minus_type`,
+		`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`)
+		values
+		<foreach collection="list" index="index" item="storeCampMinusLevel" separator=",">
+			(
+			#{storeCampMinusLevel.campMinusId},
+			#{storeCampMinusLevel.campMinusType},
+			#{storeCampMinusLevel.minusMode},
+			#{storeCampMinusLevel.yuanMinusCond},
+			#{storeCampMinusLevel.yuanMinusPref},
+			#{storeCampMinusLevel.pieceMinusConf},
+			#{storeCampMinusLevel.pieceMinusPref},
+			#{storeCampMinusLevel.pieceMinusEachDisc},
+			#{storeCampMinusLevel.yuanDiscCond},
+			#{storeCampMinusLevel.yuanDiscPref},
+			#{storeCampMinusLevel.pieceDiscConf},
+			#{storeCampMinusLevel.pieceDiscPref},
+			#{storeCampMinusLevel.isValid},
+			#{storeCampMinusLevel.note},
+			#{storeCampMinusLevel.createrSn},
+			#{storeCampMinusLevel.createTime},
+			#{storeCampMinusLevel.moderSn},
+			#{storeCampMinusLevel.modTime},
+			#{storeCampMinusLevel.tstm,jdbcType=TIMESTAMP})
+		</foreach>
+	</insert>
+
+</mapper>

+ 2 - 2
kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStorePromDao.xml

@@ -122,7 +122,7 @@
 		LEFT JOIN mk_store_prom_stat ps ON p.prom_id = ps.prom_id
 		LEFT JOIN mall_store_topic t on p.store_topic_id = t.id
 		left join third_merchant_biz tm on p.third_merch_sn = tm.third_merch_sn
-		WHERE 1=1
+		WHERE 1=1 and p.`is_valid`=0
 		<if test="promName != null and promName.trim() != ''">
 			AND p.prom_name LIKE concat('%',#{promName},'%')
 		</if>
@@ -169,7 +169,7 @@
 		LEFT JOIN mk_store_prom_stat ps ON p.prom_id = ps.prom_id
 		LEFT JOIN mall_store_topic t on p.store_topic_id = t.id
 		left join third_merchant_biz tm on p.third_merch_sn = tm.third_merch_sn
-		WHERE 1=1
+		WHERE 1=1 and p.`is_valid`=0
 		<if test="promName != null and promName.trim() != ''">
 			AND p.prom_name LIKE concat('%',#{promName},'%')
 		</if>

+ 103 - 28
kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreTicketGoodsTempDao.xml

@@ -17,11 +17,14 @@
         <result property="tstm" column="tstm"/>
 		<result property="isSubmit" column="is_submit"/>
 		<result property="isButtonCannel" column="is_button_cannel"/>
+		<result property="storeTopicId" column="store_topic_id"/>
     </resultMap>
 
 	<select id="queryObject" resultType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
 		select
-			`disc_good_temp_id`,guid,is_submit,
+			`disc_good_temp_id`,
+			guid,
+			is_submit,
 			`apply_type`,
 			`store_rela_id`,
 			`is_valid`,
@@ -30,14 +33,17 @@
 			`create_time`,
 			`moder_sn`,
 			`mod_time`,
-			`tstm`,is_button_cannel
-		from mk_store_ticket_goods_temp
+			`tstm`,
+			is_button_cannel,
+			store_topic_id
+		from mk_store_topic_goods_temp
 		where disc_good_temp_id = #{id}
 	</select>
 
 	<select id="queryGoodsTempByRealId" resultType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
 		select
-		`disc_good_temp_id`,guid,is_submit,
+		`disc_good_temp_id`,
+		guid,is_submit,
 		`apply_type`,
 		`store_rela_id`,
 		`is_valid`,
@@ -46,9 +52,11 @@
 		`create_time`,
 		`moder_sn`,
 		`mod_time`,
-		`tstm`,is_button_cannel
-		from mk_store_ticket_goods_temp
-		where store_rela_id = #{storeRealId} and guid = #{guid}
+		`tstm`,
+		is_button_cannel,
+		store_topic_id
+		from mk_store_topic_goods_temp
+		where store_rela_id = #{storeRelaId} and guid = #{guid}
 	</select>
 
 	<select id="queryGoodsTempByGuid" resultType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
@@ -62,8 +70,8 @@
 		`create_time`,
 		`moder_sn`,
 		`mod_time`,
-		`tstm`,is_button_cannel
-		from mk_store_ticket_goods_temp
+		`tstm`,is_button_cannel,store_topic_id
+		from mk_store_topic_goods_temp
 		where guid = #{guid}
 	</select>
 
@@ -74,9 +82,14 @@
 		s.is_submit,
 		s.`apply_type`,
 		s.`store_rela_id`,
-		s.`is_valid`,is_button_cannel
-		from mk_store_ticket_goods_temp s LEFT JOIN mall_product_store_rela r on s.store_rela_id=r.id
-		where guid = #{guid}
+		s.`is_valid`,
+		is_button_cannel,
+		s.store_topic_id
+		from mk_store_topic_goods_temp s LEFT JOIN mall_product_store_rela r on s.store_rela_id=r.id
+		where 1=1
+		<if test="guid != null">
+			AND guid = #{guid}
+		</if>
 		<if test="isValid != null">
 			AND s.is_valid = #{isValid}
 		</if>
@@ -89,16 +102,27 @@
 		<if test="applyType != null and applyType.trim() != ''">
 			AND apply_type = #{applyType}
 		</if>
+		<if test="storeTopicId != null">
+			AND s.store_topic_id = #{storeTopicId}
+		</if>
 	</select>
 
 	<!--暂时无用-->
 	<select id="queryGoodsTempByGuidAndIsSubmit" resultType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
 		select
-		`disc_good_temp_id`,guid,is_submit,
+		`disc_good_temp_id`,
+		guid,is_submit,
 		`apply_type`,
-		`store_rela_id`
-		from mk_store_ticket_goods_temp s LEFT JOIN mall_product_store_rela r on s.store_rela_id=r.id
-		where guid = #{guid}
+		`store_rela_id`,
+		store_topic_id
+		from mk_store_topic_goods_temp s LEFT JOIN mall_product_store_rela r on s.store_rela_id=r.id
+		where  1=1
+		<if test="guid != null">
+			AND guid = #{guid}
+		</if>
+		<if test="storeTopicId != null">
+			AND s.store_topic_id = #{storeTopicId}
+		</if>
 		<if test="isSubmit != null and isSubmit.trim() != ''">
 			AND is_submit = #{isSubmit}
 		</if>
@@ -122,8 +146,9 @@
     		`create_time`,
     		`moder_sn`,
     		`mod_time`,
-    		`tstm`
-		from mk_store_ticket_goods_temp
+    		`tstm`,
+		store_topic_id
+		from mk_store_topic_goods_temp
 		WHERE 1=1
 		<if test="name != null and name.trim() != ''">
 			AND name LIKE concat('%',#{name},'%')
@@ -149,10 +174,11 @@
 			g.store_rela_id 'isCheck',
 			g.apply_type ,
 			gs.name 'goodsName',
-			g.disc_good_temp_id,g.guid
+			g.disc_good_temp_id,g.guid,
+			g.store_topic_id
 		FROM
 			mall_product_store_rela s
-			INNER JOIN mk_store_ticket_goods_temp g ON s.id = g.store_rela_id
+			INNER JOIN mk_store_topic_goods_temp g ON s.id = g.store_rela_id
 			inner join mall_goods gs on s.goods_id = gs.id
 		WHERE 1=1 and gs.is_delete = 0
 			and s.store_id = #{storeId}
@@ -170,7 +196,7 @@
 		select count(*)
 		FROM
 		mall_product_store_rela s
-		INNER JOIN mk_store_ticket_goods_temp g ON s.id = g.store_rela_id
+		INNER JOIN mk_store_topic_goods_temp g ON s.id = g.store_rela_id
 		inner join mall_goods gs on s.goods_id = gs.id
 		WHERE 1=1 and gs.is_delete = 0
 		and s.store_id = #{storeId}
@@ -182,7 +208,7 @@
 	</select>
 	
  	<select id="queryTotal" resultType="int">
-		select count(*) from mk_store_ticket_goods_temp
+		select count(*) from mk_store_topic_goods_temp
 		WHERE 1=1
         <if test="name != null and name.trim() != ''">
             AND name LIKE concat('%',#{name},'%')
@@ -190,10 +216,11 @@
 	</select>
 	 
 	<insert id="save" parameterType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity" useGeneratedKeys="true" keyProperty="discGoodTempId">
-		insert into mk_store_ticket_goods_temp(
+		insert into mk_store_topic_goods_temp(
 			`apply_type`,guid,
 			`store_rela_id`,
 			`is_valid`,is_submit,is_button_cannel,
+			store_topic_id,
 			`note`,
 			`creater_sn`,
 			`create_time`,
@@ -204,6 +231,7 @@
 			#{applyType},#{guid},
 			#{storeRelaId},
 			#{isValid},#{isSubmit},#{isButtonCannel},
+			#{storeTopicId},
 			#{note},
 			#{createrSn},
 			#{createTime},
@@ -213,7 +241,7 @@
 	</insert>
 	 
 	<update id="update" parameterType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
-		update mk_store_ticket_goods_temp 
+		update mk_store_topic_goods_temp
 		<set>
 			<if test="applyType != null">`apply_type` = #{applyType}, </if>
 			<if test="guid != null">guid = #{guid},</if>
@@ -221,6 +249,7 @@
 			<if test="isValid != null">`is_valid` = #{isValid}, </if>
 			<if test="isSubmit != null">`is_submit` = #{isSubmit}, </if>
 			<if test="isButtonCannel != null">`is_button_cannel` = #{isButtonCannel}, </if>
+			<if test="storeTopicId != null">`store_topic_id` = #{storeTopicId}, </if>
 			<if test="note != null">`note` = #{note}, </if>
 			<if test="createrSn != null">`creater_sn` = #{createrSn}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>
@@ -232,18 +261,18 @@
 	</update>
 	
 	<delete id="delete">
-		delete from mk_store_ticket_goods_temp where disc_good_temp_id = #{value}
+		delete from mk_store_topic_goods_temp where disc_good_temp_id = #{value}
 	</delete>
 	
 	<delete id="deleteBatch">
-		delete from mk_store_ticket_goods_temp where disc_good_temp_id in 
+		delete from mk_store_topic_goods_temp where disc_good_temp_id in
 		<foreach item="discGoodTempId" collection="array" open="(" separator="," close=")">
 			#{discGoodTempId}
 		</foreach>
 	</delete>
 
 	<delete id="deleteByGuid">
-		delete from mk_store_ticket_goods_temp where guid = #{guid}
+		delete from mk_store_topic_goods_temp where guid = #{guid}
 	</delete>
 
 	<select id="queryGoodsTempIdBy" resultType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
@@ -251,7 +280,7 @@
 		g.disc_good_temp_id
 		FROM
 		mall_product_store_rela s
-		INNER JOIN mk_store_ticket_goods_temp g ON s.id = g.store_rela_id
+		INNER JOIN mk_store_topic_goods_temp g ON s.id = g.store_rela_id
 		INNER JOIN mall_goods gs ON s.goods_id = gs.id
 		WHERE
 		1 = 1
@@ -271,4 +300,50 @@
 			</foreach></if>
 	</select>
 
+	<select id="queryGoodsTempByRealIdAndTopicId" resultType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
+		select
+		`disc_good_temp_id`,
+		guid,is_submit,
+		`apply_type`,
+		`store_rela_id`,
+		`is_valid`,
+		`note`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`,
+		is_button_cannel,
+		store_topic_id
+		from mk_store_topic_goods_temp
+		where store_rela_id = #{storeRelaId} and store_topic_id = #{storeTopicId}
+	</select>
+
+	<select id="queryGoodsTempByTopicId" resultType="com.kmall.admin.entity.mk.store.MkStoreTicketGoodsTempEntity">
+		select
+		`disc_good_temp_id`,
+		guid,is_submit,
+		`apply_type`,
+		`store_rela_id`,
+		`is_valid`,
+		`note`,
+		`creater_sn`,
+		`create_time`,
+		`moder_sn`,
+		`mod_time`,
+		`tstm`,
+		is_button_cannel,
+		store_topic_id
+		from mk_store_topic_goods_temp
+		where store_topic_id = #{storeTopicId}
+	</select>
+
+	<delete id="deleteByStoreTopicIdAndRealId">
+		delete from mk_store_topic_goods_temp where store_topic_id = #{storeTopicId} and store_rela_id = #{storeRelaId}
+	</delete>
+
+	<delete id="deleteByStoreTopicId">
+		delete from mk_store_topic_goods_temp where store_topic_id = #{storeTopicId}
+	</delete>
+
 </mapper>

+ 1 - 1
kmall-admin/src/main/resources/mybatis/mapper/mk/store/MkStoreTopicStatDao.xml

@@ -100,7 +100,7 @@
 		t.`create_time`,
 		t.`moder_sn`,
 		t.`mod_time`,
-		t.`tstm`,s.store_name 'storeName', p.title 'storeTopicName',pt.prom_type_name 'storeTopicType'
+		t.`tstm`,s.store_name 'storeName', p.title 'storeTopicName',pt.prom_type_name 'storeTopicType',pt.prom_type_id 'promTypeId'
 		FROM mk_store_topic_stat t
 		LEFT JOIN mall_store s ON t.store_id = s.id
 		LEFT JOIN mall_store_topic p ON p.id = t.store_topic_id

+ 860 - 0
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkstorecampminus.html

@@ -0,0 +1,860 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>门店满减活动</title>
+    #parse("sys/header.html")
+
+    <script src="//unpkg.com/iview/dist/locale/en-US.js"></script>
+    <style>
+        .col-sm-3 {
+            width: 25%;
+            float: left;
+        }
+        .goods-item {
+            position: relative;
+            width: 300px;
+            height: 76px;
+            border-radius: 4px;
+            border: 1px solid #e0e0e0;
+            padding: 10px;
+            margin-bottom: 10px;
+            cursor: pointer;
+            margin-right: 10px;
+        }
+        .clearfix {
+            zoom: 1;
+        }
+        .goods-img {
+            position: relative;
+            width: 26%;
+            height: 100%;
+            border-radius: 4px;
+            overflow: hidden;
+            margin-right: 10px;
+        }
+        .fl {
+            float: left;
+        }
+        .goods-info {
+            width: 55%;
+        }
+        .goods-mask {
+            position: absolute;
+            background-color: #000;
+            opacity: .5;
+            width: 100%;
+            height: 100%;
+            top: 0;
+            left: 0;
+            border-radius: 4px;
+            display: none;
+        }
+        .goods-img>.goods-img-wrapper {
+            width: 100%;
+            height: 100%;
+        }
+        .goods-img>.bg-model {
+            position: absolute;
+            display: none;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+        }
+        .goods-img>.bg-model>.bg-model-model {
+            position: absolute;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+            background-color: #000;
+            opacity: .5;
+        }
+        .goods-info>div.goods-intro {
+            display: inline-block;
+            width: 170px;
+            max-height: 40px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            display: -webkit-box;
+            -webkit-box-orient: vertical;
+            -webkit-line-clamp: 2;
+            line-height: 18px;
+        }
+        .goods-info>.goods-price {
+            position: absolute;
+            bottom: 12px;
+        }
+        .goods-item.select {
+            border: 1px solid #2589ff;
+        }
+        .goods-img>.bg-model>img {
+            position: absolute;
+            top: 0;
+            left: 0;
+            width: 100%;
+            z-index: 10;
+        }
+        .tick-color-g{
+            border:3px #206602 solid;
+            border-radius: 5px;
+        }
+        .tick-color-r{
+            border:3px #990033 solid;
+            border-radius: 5px;
+        }
+    </style>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <Card v-show="!showViewList">
+        <p slot="title">满减满折</p>
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.campName" @on-enter="query" placeholder="活动名称"/>
+                </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.isPast" placeholder="过期状态" label-in-value>
+                        <i-option value="1">已结束
+                        </i-option>
+                        <i-option value="0">进行中
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("mkstorecampminus:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                <!--#if($shiro.hasPermission("mkstorecampminus:update"))-->
+                <!--<i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>-->
+                <!--#end-->
+                #if($shiro.hasPermission("mkstorecampminus:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+                <a href="${rc.contextPath}/mk/mkcenter.html">
+                    <i-button type="warning" ><i class="fa"></i>&nbsp;返回营销中心页</i-button>
+                </a>
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </Card>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="mkStoreCampMinus" :rules="ruleValidate" :label-width="140">
+            <Tabs value="name1">
+                <Tab-Pane label="基本信息" name="name1">
+                    <Form-item label="活动名称" prop="campName">
+                        <i-input v-model="mkStoreCampMinus.campName" placeholder="活动名称" style="width: 400px" v-show="!isOperatorShow"></i-input>
+                        <i-input v-model="mkStoreCampMinus.campName" placeholder="活动名称" style="width: 400px" v-show="isOperatorShow" disabled></i-input>
+                    </Form-item>
+                    <!--<Form-item label="活动id" prop="storeTopicId">-->
+                        <!--<i-input v-model="mkStoreCampMinus.storeTopicId" placeholder="活动id"/>-->
+                    <!--</Form-item>-->
+                    <Form-item label="活动起始时间" prop="campBegTime">
+                        <Date-picker type="datetime" format="yyyy-MM-dd HH:mm:ss" v-model="mkStoreCampMinus.campBegTime" placeholder="活动起始时间"
+                                     style="width: 240px" v-show="!isOperatorShow"></Date-picker>
+                        <Date-picker type="datetime" format="yyyy-MM-dd HH:mm:ss" v-model="mkStoreCampMinus.campBegTime" placeholder="活动起始时间"
+                                     style="width: 240px" v-show="isOperatorShow" disabled></Date-picker>
+                    </Form-item>
+                    <Form-item label="活动结束时间" prop="campEndTime">
+                        <Date-picker type="datetime" format="yyyy-MM-dd HH:mm:ss" v-model="mkStoreCampMinus.campEndTime" placeholder="活动结束时间"
+                                     style="width: 240px;"/>
+                    </Form-item>
+                    <Form-item label="减免活动类型" prop="campMinusType">
+                        <!--<i-input v-model="mkStoreCampMinus.campMinusType" placeholder="减免活动类型, 00:满x元减,01:满x件减,10:满x元折,
+                        11:满x件折,减免活动类型为00,01时,减免方式必选"/>-->
+                        <Radio-group v-model="mkStoreCampMinus.campMinusType" id="minusMode" @on-change="chanCampMinusType" v-show="!isOperatorShow">
+                            <Radio label="00">
+                                <span>满x元减</span>
+                            </Radio>
+                            <Radio label="01">
+                                <span>满x件减</span>
+                            </Radio>
+                            <Radio label="10">
+                                <span>满x元折</span>
+                            </Radio>
+                            <Radio label="11">
+                                <span>满x件折</span>
+                            </Radio>
+                        </Radio-group>
+                        <Radio-group v-model="mkStoreCampMinus.campMinusType" id="minusMode" @on-change="chanCampMinusType" v-show="isOperatorShow">
+                            <Radio label="00" disabled>
+                                <span>满x元减</span>
+                            </Radio>
+                            <Radio label="01" disabled>
+                                <span>满x件减</span>
+                            </Radio>
+                            <Radio label="10" disabled>
+                                <span>满x元折</span>
+                            </Radio>
+                            <Radio label="11" disabled>
+                                <span>满x件折</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="减免方式" prop="minusMode" v-show="isMinusShow">
+                        <!--<i-input v-model="mkStoreCampMinus.minusMode" placeholder="减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,
+                        1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。"/>-->
+                        <Radio-group v-model="mkStoreCampMinus.minusMode" id="minusMode" @on-change="chanMinusMode" v-show="!isOperatorShow">
+                            <Radio label="00">
+                                <span>满足最高层级减一次</span>
+                            </Radio>
+                            <Radio label="10">
+                                <span>每满一次减一次</span>
+                            </Radio>
+                        </Radio-group>
+                        <Radio-group v-model="mkStoreCampMinus.minusMode" id="minusMode" @on-change="chanMinusMode" v-show="isOperatorShow">
+                            <Radio label="00" disabled>
+                                <span>满足最高层级减一次</span>
+                            </Radio>
+                            <Radio label="10" disabled>
+                                <span>每满一次减一次</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="优惠内容活动层级">
+                        <!--满元满减-->
+                        <div v-for="(item,index) in minusTypeUnitAttrList" v-show="isUnitAttrShow && item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.yuanMinusCond" @on-keyup="checkCoudByUnitAttr(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于等于0的2位小数</span>
+                                        <span :id="index+'unit'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.yuanMinusPref" @on-keyup="checkYuanMinusPref(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0的2位小数</span>
+                                        <span :id="index+'unit_pref'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <button class="btn red btn-sm" type="button" @click="delAttrRow1(index)" v-show="index>0">
+                                    <i class="fa fa-trash-o"></i>
+                                </button>
+                            </div>
+                        </div>
+                        <!--满件满减-->
+                        <div v-for="(item,index) in minusTypePieceAttrList" v-show="isPieceAttrShow && item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.pieceMinusConf" @on-keyup="checkCoudByPieceAttr(index)"><span slot="append">件</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于等于0的整数</span>
+                                        <span :id="index+'piece_conf'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.pieceMinusPref" @on-keyup="checkPieceMinusPref(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0的2位小数</span>
+                                        <span :id="index+'piece_pref'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                </button>
+                                <button class="btn red btn-sm" type="button" @click="delAttrRow2(index)" v-show="index>0">
+                                    <i class="fa fa-trash-o"></i>
+                                </button>
+                            </div>
+                        </div>
+                        <!--满元满折-->
+                        <div v-for="(item,index) in minusTypeDiscUnitAttrList" v-show="isDiscUnitAttrShow && item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元折条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.yuanDiscCond" @on-keyup="checkYuanDiscCondByDiscUnit(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于等于0的2位小数</span>
+                                        <span :id="index+'disc_unit_cond'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元折优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.yuanDiscPref" @on-keyup="checkYuanDiscPrefByDiscUnit(index)"><span slot="append">折</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0且小于10的1位小数</span>
+                                        <span :id="index+'disc_unit_pref'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <button class="btn red btn-sm" type="button" @click="delAttrRow3(index)" v-show="index>0">
+                                    <i class="fa fa-trash-o"></i>
+                                </button>
+                            </div>
+                        </div>
+                        <!--满件满折-->
+                        <div v-for="(item,index) in minusTypeDiscPieceAttrList" v-show="isDiscPieceAttrShow && item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件折条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.pieceDiscConf" @on-keyup="checkConfByDiscPiece(index)"><span slot="append">件</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于等于0的整数</span>
+                                        <span :id="index+'piece_disc_conf'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件折优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.pieceDiscPref" @on-keyup="checkPrefByDiscPiece(index)"><span slot="append">折</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0且小于10的1位小数</span>
+                                        <span :id="index+'piece_disc_ref'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <button class="btn red btn-sm" type="button" @click="delAttrRow4(index)" v-show="index>0">
+                                    <i class="fa fa-trash-o"></i>
+                                </button>
+                            </div>
+                        </div>
+                        <!--满元满减,且减免类型为每满一次减一次-->
+                        <div v-for="(item,index) in minusTypeUnitMode10List" v-show="isUnitMode10Show">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减条件:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        <i-input type="text" v-model="item.yuanMinusCond" @on-keyup="checkYuanCondByMode(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0的2位小数</span>
+                                        <span :id="index+'unit_mode'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减优惠:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        <i-input type="text" v-model="item.yuanMinusPref" @on-keyup="checkYuanPrefByMode(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0的2位小数</span>
+                                        <span :id="index+'unit_mode_pref'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满减件每人优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.pieceMinusEachDisc" placeholder="填0代表不设置上限" @on-keyup="checkEachDiscByUnitMode(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">填0代表不设置上限</span>
+                                        <span :id="index+'unit_mode_each'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <!--满件满减,且减免类型为每满一次减一次-->
+                        <div v-for="(item,index) in minusTypePieceMode10List" v-show="isPieceMode10Show">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减条件:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        <i-input type="text" v-model="item.pieceMinusConf" @on-keyup="checkPieceConfByMode(index)"><span slot="append">件</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0的整数</span>
+                                        <span :id="index+'piece_mode'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减优惠:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        <i-input type="text" v-model="item.pieceMinusPref" @on-keyup="checkPiecePrefByMode(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">请输入大于0的2位小数</span>
+                                        <span :id="index+'piece_mode_pref'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满减件每人优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        <i-input type="text" v-model="item.pieceMinusEachDisc" placeholder="填0代表不设置上限" @on-keyup="checkEachDiscByPieceMode(index)"><span slot="append">元</span></i-input>
+                                    </div>
+                                    <div class="col-md-5">
+                                        <span style="color: #aaa">填0代表不设置上限</span>
+                                        <span :id="index+'piece_mode_each'" style="color: red;"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div v-show="isUnitAttrShow" style="margin-top: 10px;">
+                            <button class="btn btn-primary btn-sm" type="button" @click="addAttrRow1">
+                                <i class="fa fa-plus">添加活动层级</i>
+                            </button>最多10级,下单时以满足的最高层级优惠
+                        </div>
+                        <div v-show="isPieceAttrShow" style="margin-top: 10px;">
+                            <button class="btn btn-primary btn-sm" type="button" @click="addAttrRow2">
+                                <i class="fa fa-plus">添加活动层级</i>
+                            </button>最多10级,下单时以满足的最高层级优惠
+                        </div>
+                        <div v-show="isDiscUnitAttrShow" style="margin-top: 10px;">
+                            <button class="btn btn-primary btn-sm" type="button" @click="addAttrRow3">
+                                <i class="fa fa-plus">添加活动层级</i>
+                            </button>最多10级,下单时以满足的最高层级优惠
+                        </div>
+                        <div v-show="isDiscPieceAttrShow" style="margin-top: 10px;">
+                            <button class="btn btn-primary btn-sm" type="button" @click="addAttrRow4">
+                                <i class="fa fa-plus">添加活动层级</i>
+                            </button>最多10级,下单时以满足的最高层级优惠
+                        </div>
+                    </Form-item>
+                    <!--<Form-item label="满元减条件(元)" prop="yuanMinusCond" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.yuanMinusCond" style="width: 400px" placeholder="满元减条件(元)"><span slot="append">元</span></i-input>
+                    </Form-item>
+                    <Form-item label="满元减优惠(元)" prop="yuanMinusPref" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.yuanMinusPref" style="width: 400px" placeholder="满元减优惠(元)"><span slot="append">元</span></i-input>
+                    </Form-item>
+                    <Form-item label="满件减条件(件)" prop="pieceMinusConf" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.pieceMinusConf" style="width: 400px" placeholder="满件减条件(件)"><span slot="append">件</span></i-input>
+                    </Form-item>
+                    <Form-item label="满件减优惠(元)" prop="pieceMinusPref" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.pieceMinusPref" style="width: 400px" placeholder="满件减优惠(元)"><span slot="append">元</span></i-input>
+                    </Form-item>
+                    <Form-item label="满减件每人优惠(元)" prop="pieceMinusEachDisc" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.pieceMinusEachDisc" style="width: 400px" placeholder="满减件每人优惠(元),填0代表不设置上限"><span slot="append">元</span></i-input>
+                    </Form-item>
+                    <Form-item label="满元折条件(元)" prop="yuanDiscCond" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.yuanDiscCond" style="width: 400px" placeholder="满元折条件(元),大于等于0的2位小数"><span slot="append">元</span></i-input>
+                    </Form-item>
+                    <Form-item label="满元折优惠(折)" prop="yuanDiscPref" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.yuanDiscPref" style="width: 400px" placeholder="满元折优惠(折),大于0且小于10的1位小数"><span slot="append">折</span></i-input>
+                    </Form-item>
+                    <Form-item label="满件折条件(件)" prop="pieceDiscConf" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.pieceDiscConf" style="width: 400px" placeholder="满件折条件(件),大于等于0的整数"><span slot="append">件</span></i-input>
+                    </Form-item>
+                    <Form-item label="满件折优惠(折)" prop="pieceDiscPref" v-show="isVoucher">
+                        <i-input v-model="mkStoreCampMinus.pieceDiscPref" style="width: 400px" placeholder="满件折优惠(折),大于0且小于10的数,可带1位小数"><span slot="append">折</span></i-input>
+                    </Form-item>-->
+                </Tab-Pane>
+                <Tab-Pane label="优惠规则" name="name2">
+                    <Form-item label="所属三方商户" prop="thirdMerchSn">
+                        <i-select v-model="mkStoreCampMinus.thirdMerchSn" placeholder="所属三方商户" style="width: 268px;" @on-change="changeStore" v-show="!isOperatorShow" label-in-value>
+                            <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdMerchSn" :key="thirdMerchant.thirdMerchSn">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                        </i-select>
+                        <i-select v-model="mkStoreCampMinus.thirdMerchSn" placeholder="所属三方商户" style="width: 268px;" @on-change="changeStore" v-show="isOperatorShow" disabled label-in-value>
+                            <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdMerchSn" :key="thirdMerchant.thirdMerchSn">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="所属门店" prop="storeId">
+                        <i-select v-model="mkStoreCampMinus.storeId" placeholder="所属门店" style="width: 268px;" label-in-value v-show="!isOperatorShow">
+                            <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}
+                            </i-option>
+                        </i-select>
+                        <i-select v-model="mkStoreCampMinus.storeId" placeholder="所属门店" style="width: 268px;" label-in-value v-show="isOperatorShow" disabled>
+                            <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="货品业务类型" prop="goodsBizType" >
+                        <i-select v-model="mkStoreCampMinus.goodsBizType"  placeholder="货品业务类型"
+                                  label-in-value style="width: 268px;" v-show="!isOperatorShow">
+                            <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                            </i-option>
+                        </i-select>
+                        <i-select v-model="mkStoreCampMinus.goodsBizType"  placeholder="货品业务类型"
+                                  label-in-value style="width: 268px;" v-show="isOperatorShow" disabled>
+                            <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                            </i-option>
+                        </i-select>
+                        <div style="float: right;margin-right: 730px;">
+                            <span style="margin-left: 25px;color: red;font-size: 12px;">* 货品业务类型必填,不同业务类型会生成不同订单,订单不能同时使用一个优惠券,会影响清关</span>
+                        </div>
+                    </Form-item>
+                    <Form-item label="适用类型" prop="applyType">
+                        <Radio-group v-model="mkStoreCampMinus.applyType" id="applyType">
+                            <Radio label="00">
+                                <span>全部商品参与</span>
+                            </Radio>
+                            <Radio label="01">
+                                <span>指定商品参与</span>
+                            </Radio>
+                            <Radio label="02">
+                                <span>指定商品不参与</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="图片是否展示在广告栏" prop="isStoreShow">
+                        <Radio-group v-model="mkStoreCampMinus.isStoreShow">
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Row>
+                        <i-col span="16">
+                            <Form-item label="活动图片url(小图)" prop="advImgUrl">
+                                <i-input v-model="mkStoreCampMinus.advImgUrl" placeholder="活动图片url(小图)" readonly/>
+                            </Form-item>
+                        </i-col>
+                        <i-col span="3">
+                            <Form-item :label-width="1">
+                                <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                        max-size="2048"
+                                        :on-success="handleSuccessAdvImgUrl" :on-format-error="handleFormatError"
+                                        :show-upload-list="false"
+                                        :on-exceeded-size="handleMaxSize">
+                                    <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                                </Upload>
+                            </Form-item>
+                        </i-col>
+                        <i-col span="4">
+                            <Form-item :label-width="1">
+                                <i-button icon="eye" @click="eyeImageAdvImgUrl">预览图片</i-button>
+                            </Form-item>
+                        </i-col>
+                    </Row>
+                    <Form-item label="活动说明" prop="advDesc">
+                        <i-input type="textarea" :rows="3" v-model="mkStoreCampMinus.advDesc" placeholder="活动说明" style="width: 400px"></i-input>
+                    </Form-item>
+                    <Form-item label="是否有效" prop="isValid">
+                        <Radio-group v-model="mkStoreCampMinus.isValid">
+                            <Radio label="0">
+                                <span>有效</span>
+                            </Radio>
+                            <Radio label="1">
+                                <span>无效</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <!--<Form-item label="是否过期,0:否,1:是" prop="isPast">-->
+                        <!--<i-input v-model="mkStoreCampMinus.isPast" placeholder="是否过期,0:否,1:是"/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="备注" prop="note">-->
+                        <!--<i-input v-model="mkStoreCampMinus.note" placeholder="备注"/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="创建人编号" prop="createrSn">-->
+                        <!--<i-input v-model="mkStoreCampMinus.createrSn" placeholder="创建人编号"/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="创建时间" prop="createTime">-->
+                        <!--<i-input v-model="mkStoreCampMinus.createTime" placeholder="创建时间"/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="修改人编号" prop="moderSn">-->
+                        <!--<i-input v-model="mkStoreCampMinus.moderSn" placeholder="修改人编号"/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="修改时间" prop="modTime">-->
+                        <!--<i-input v-model="mkStoreCampMinus.modTime" placeholder="修改时间"/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="时间戳" prop="tstm">-->
+                        <!--<i-input v-model="mkStoreCampMinus.tstm" placeholder="时间戳"/>-->
+                    <!--</Form-item>-->
+                </Tab-Pane>
+            </Tabs>
+        </i-form>
+        <div style="padding-left: 20px">
+            <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
+        </div>
+	</Card>
+
+    <Card v-show="!showInfoList">
+        <p slot="title">{{title}}</p>
+        <i-form :label-width="140">
+            <Tabs value="name1">
+                <Tab-Pane label="基本信息" name="name1">
+                    <Form-item label="活动名称">
+                        {{mkStoreCampMinus.campName}}
+                    </Form-item>
+                    <Form-item label="活动时间">
+                        {{mkStoreCampMinus.inValidTime}}
+                    </Form-item>
+                    <Form-item label="减免活动类型">
+                        {{mkStoreCampMinus.campMinusType=='00'?'满x元减':''}}
+                        {{mkStoreCampMinus.campMinusType=='01'?'满x件减':''}}
+                        {{mkStoreCampMinus.campMinusType=='10'?'满x元折':''}}
+                        {{mkStoreCampMinus.campMinusType=='11'?'满x件折':''}}
+                    </Form-item>
+                    <Form-item label="减免方式">
+                        {{mkStoreCampMinus.minusMode=='00'?'满足最高层级减一次':''}}
+                        {{mkStoreCampMinus.minusMode=='10'?'每满一次减一次':''}}
+                    </Form-item>
+                    <Form-item label="优惠内容活动层级">
+                        <!--满元满减-->
+                        <div v-for="(item,index) in minusTypeUnitAttrList" v-if="minusTypeUnitAttrList.length>0" v-show="item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.yuanMinusCond}}元
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.yuanMinusPref}}元
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <!--满件满减-->
+                        <div v-for="(item,index) in minusTypePieceAttrList" v-if="minusTypePieceAttrList.length>0" v-show="item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        {{item.pieceMinusConf}}件
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.pieceMinusPref}}元
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <!--满元满折-->
+                        <div v-for="(item,index) in minusTypeDiscUnitAttrList" v-if="minusTypeDiscUnitAttrList.length>0" v-show="item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元折条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.yuanDiscCond}}元
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元折优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.yuanDiscPref}}折
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <!--满件满折-->
+                        <div v-for="(item,index) in minusTypeDiscPieceAttrList" v-if="minusTypeDiscPieceAttrList.length>0" v-show="item.isDelete==0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件折条件:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        {{item.pieceDiscConf}}件
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件折优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.pieceDiscPref}}折
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <!--满元满减,且减免类型为每满一次减一次-->
+                        <div v-for="(item,index) in minusTypeUnitMode10List" v-if="minusTypeUnitMode10List.length>0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减条件:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        ¥{{item.yuanMinusCond}}元
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满元减优惠:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        ¥{{item.yuanMinusPref}}元
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满减件每人优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.pieceMinusEachDisc}}元
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <!--满件满减,且减免类型为每满一次减一次-->
+                        <div v-for="(item,index) in minusTypePieceMode10List" v-if="minusTypePieceMode10List.length>0" style="margin-top: 10px;">
+                            <div class="row">
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减条件:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        {{item.pieceMinusConf}}件
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满件减优惠:</label>
+                                    <div class="col-md-5 input-icon right" style="margin-left: 23px;">
+                                        ¥{{item.pieceMinusPref}}元
+                                    </div>
+                                </div>
+                                <div class="col-md-8">
+                                    <label class="ivu-form-item-label">满减件每人优惠:</label>
+                                    <div class="col-md-5 input-icon right">
+                                        ¥{{item.pieceMinusEachDisc}}元
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </Form-item>
+                </Tab-Pane>
+                <Tab-Pane label="优惠规则" name="name2">
+                    <!--<Form-item label="所属三方商户">-->
+                        <!--{{mkStoreCampMinus.thirdMerchSn}}-->
+                    <!--</Form-item>-->
+                    <Form-item label="所属门店">
+                        {{mkStoreCampMinus.storeName}}
+                    </Form-item>
+                    <Form-item label="货品业务类型">
+                        {{mkStoreCampMinus.goodsBizType=='00'?'保税备货':''}}
+                        {{mkStoreCampMinus.goodsBizType=='02'?'保税展示补货':''}}
+                        {{mkStoreCampMinus.goodsBizType=='10'?'保税展示跨境':''}}
+                        {{mkStoreCampMinus.goodsBizType=='11'?'普通商品':''}}
+                    </Form-item>
+                    <Form-item label="适用类型">
+                        {{mkStoreCampMinus.applyType=='00'?'全部商品参与':''}}
+                        {{mkStoreCampMinus.applyType=='01'?'指定商品参与':''}}
+                        {{mkStoreCampMinus.applyType=='02'?'指定商品不参与':''}}
+                    </Form-item>
+                    <Form-item label="图片是否展示在广告栏">
+                        {{mkStoreCampMinus.isStoreShow=='0'?'否':'是'}}
+                    </Form-item>
+                    <Form-item label="活动图片url(小图)">
+                        <img :src="mkStoreCampMinus.advImgUrl" style="width: 60px;height: 60px;"/>
+                    </Form-item>
+                    <Form-item label="活动说明">
+                        {{mkStoreCampMinus.advDesc}}
+                    </Form-item>
+                    <Form-item label="是否有效">
+                        {{mkStoreCampMinus.isValid=='0'?'有效':'无效'}}
+                    </Form-item>
+                    <Form-item label="是否过期">
+                        {{mkStoreCampMinus.isPast=='0'?'否':'是'}}
+                    </Form-item>
+                </Tab-Pane>
+            </Tabs>
+        </i-form>
+        <div style="padding-left: 20px">
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+        </div>
+    </Card>
+    <!--<Card v-show="!showGoodsList">
+        <p slot="title">{{title}}</p>
+        <div style="padding-left: 20px">
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+        </div>
+    </Card>-->
+    <Card v-show="!updateGoodsList">
+        <p slot="title">{{title}}</p>
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="g.goodsName" @on-enter="query" placeholder="商品名称"/>
+                </i-col>
+                <i-button @click="queryOrder">查询</i-button>
+                <i-button @click="reloadOrderSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                <!--#if($shiro.hasPermission("goods:save"))-->
+                <i-button type="warning" @click="saveCampMinusGoods" v-show="!isShowGoods">添加商品</i-button>
+                <!--#end-->
+                <i-button type="warning" @click="reload">返回</i-button>
+            </div>
+        </Row>
+
+        <table id="jqGridOrder"></table>
+        <div id="jqGridPagerOrder"></div>
+    </Card>
+    <Card v-show="!showStoreGoodsList">
+        <p slot="title">{{title}}</p>
+        <div class="search-group">
+            <i-col span="4">
+                <i-input v-model="s.goodsName" @on-enter="query" placeholder="名称"/>
+            </i-col>
+            <i-button @click="reloadGoodsByStore">查询</i-button>
+            <i-button @click="reloadGoodsSearch">重置</i-button>
+        </div>
+        <div class="buttons-group">
+            <i-button type="warning" @click="reloadCampGoods">返回管理商品</i-button>
+        </div>
+        <div style="margin-top: 10px; height: 550px">
+            <div v-for="item in goodsList" :item="item" style="padding-left:5px; padding-right:5px; width: 100%" v-show="goodsList.length>0">
+                <div v-show="item.isCheck==0" class="col-sm-3 goods-item clearfix" name="noCheck" @click="selectThisGoods(item)" :id="item.goodsId">
+                    <div class="goods-img fl">
+                        <img :src="item.listPicUrl" style="background-repeat: no-repeat;background-position: center center; background-size: cover;" class="goods-img-wrapper">
+                        <div class="bg-model" :id="item.id" style="display: none;">
+                            <div class="bg-model-model"></div>
+                            <img src="${rc.contextPath}/statics/img/selected.png" alt="" style="width: 30px;height: 30px;
+                                                margin-left: 20px;margin-top: 10px;">
+                        </div>
+                    </div>
+                    <div class="goods-info fl">
+                        <div class="goods-intro ng-binding" :title="item.goodsName">
+                            {{item.goodsName}}
+                        </div>
+                        <p class="goods-price ng-binding">¥ {{item.retailPrice==null?0:item.retailPrice}}</p>
+                    </div>
+                    <div class="goods-mask">
+                        <p style="text-align:center;color: #FFFFFF;">不支持参加此活动</p>
+                    </div>
+                </div>
+
+                <div v-show="item.isCheck==1" class="col-sm-3 goods-item clearfix select" name="noCheck" @click="selectThisGoods(item)" :id="item.goodsId">
+                    <div class="goods-img fl">
+                        <img :src="item.listPicUrl" style="background-repeat: no-repeat;
+                                                background-position: center center; background-size: cover;" class="goods-img-wrapper">
+                        <div class="bg-model" :id="item.id" style="display: block;">
+                            <div class="bg-model-model"></div>
+                            <img src="${rc.contextPath}/statics/img/selected.png" alt="" style="width: 30px;height: 30px;
+                                                margin-left: 10px;margin-top: 10px;">
+                        </div>
+                    </div>
+                    <div class="goods-info fl">
+                        <div class="goods-intro ng-binding" :title="item.goodsName">
+                            {{item.goodsName}}
+                        </div>
+                        <p class="goods-price ng-binding">¥ {{item.retailPrice==null?0:item.retailPrice}}</p>
+                    </div>
+                    <div class="goods-mask">
+                        <p style="text-align:center;color: #FFFFFF;">不支持参加此活动</p>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div style="text-align: right;">
+            <Page :total="totalCount" :current="currentPage" :page-size="limit"  class="page" show-total
+                  placement="top" @on-change="loadGoodsDataByPage" @on-page-size-change='handlePageSize'>
+            </Page>
+        </div>
+        <div style="padding-left: 20px">
+            <i-button type="primary" @click="ok">保存</i-button>
+            <i-button type="warning" @click="cancel" style="margin-left: 8px"/>取消</i-button>
+        </div>
+    </Card>
+</div>
+<div id="qrcode" style="display: none;padding: 10px;">
+    <div id="qrcodeCanvas" style="margin: 20px 0 0 55px"></div>
+</div>
+<div id="qrcImg" style="display:none">
+    <img class="qrcImg align-center" height="300px" width="300px" src="">
+</div>
+
+<script src="${rc.contextPath}/js/mk/mkstorecampminus.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 11 - 8
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkstoreprom.html

@@ -6,7 +6,8 @@
 </head>
 <body>
 <div id="rrapp" v-cloak>
-	<div v-show="!showViewList">
+	<Card v-show="!showViewList">
+        <p slot="title">渠道追踪</p>
         <Row :gutter="16">
             <div class="search-group">
                 <i-col span="3">
@@ -33,7 +34,9 @@
                     </i-select>
                 </i-col>
                 <i-col span="3">
-                    <i-select v-model="q.isFinished" placeholder="结束状态" label-in-value>
+                    <i-select v-model="q.isFinished" placeholder="活动状态" label-in-value>
+                        <i-option value="2">未开始
+                        </i-option>
                         <i-option value="1">进行中
                         </i-option>
                         <i-option value="0">已结束
@@ -47,20 +50,20 @@
                 #if($shiro.hasPermission("mkstoreprom:save"))
                 <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
                 #end
+                <a href="${rc.contextPath}/mk/mkcenter.html">
+                    <i-button type="warning" ><i class="fa"></i>&nbsp;返回营销中心页</i-button>
+                </a>
                 <!--#if($shiro.hasPermission("mkstoreprom:update"))-->
                 <!--<i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>-->
                 <!--#end-->
                 <!--#if($shiro.hasPermission("mkstoreprom:delete"))-->
                 <!--<i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>-->
                 <!--#end-->
-                <a href="${rc.contextPath}/mk/mkcenter.html">
-                    <i-button type="warning" ><i class="fa"></i>&nbsp;返回营销中心页</i-button>
-                </a>
             </div>
         </Row>
 	    <table id="jqGrid"></table>
 	    <div id="jqGridPager"></div>
-    </div>
+    </Card>
 
     <Card v-show="!showList">
         <p slot="title">{{title}}</p>
@@ -165,7 +168,7 @@
                     </Radio>
                 </Radio-group>
             </Form-item>
-            <Form-item label="是否结束" prop="isFinished">
+            <!--<Form-item label="是否结束" prop="isFinished">
                 <Radio-group v-model="mkStoreProm.isFinished" v-show="!isOperatorShow">
                     <Radio label="1">
                         <span>否</span>
@@ -182,7 +185,7 @@
                         <span>是</span>
                     </Radio>
                 </Radio-group>
-            </Form-item>
+            </Form-item>-->
                 <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
                 <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
             </Form-item>

+ 3 - 2
kmall-admin/src/main/webapp/WEB-INF/page/mk/mkstoreticketdiscount.html

@@ -106,7 +106,8 @@
 </style>
 <body>
 <div id="rrapp" v-cloak>
-	<div v-show="!showViewList">
+	<Card v-show="!showViewList">
+        <p slot="title">优惠券</p>
         <Row :gutter="16">
             <div class="search-group">
                 <i-col span="4">
@@ -132,7 +133,7 @@
         </Row>
 	    <table id="jqGrid"></table>
 	    <div id="jqGridPager"></div>
-    </div>
+    </Card>
 
     <Card v-show="!showList">
         <!--<p slot="title">{{title}}</p>-->

+ 1 - 1
kmall-admin/src/main/webapp/WEB-INF/page/shop/attribute.html

@@ -42,7 +42,7 @@
                 </i-select>
             </Form-item>
             <Form-item label="门店" prop="storeId">
-                <i-select v-model="attribute.storeId" filterable placeholder="门店" label-in-value>
+                <i-select v-model="attribute.storeId" filterable placeholder="门店" label-in-value @on-change="getDataChangeStore">
                     <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
                 </i-select>
             </Form-item>

+ 20 - 7
kmall-admin/src/main/webapp/WEB-INF/page/shop/goods.html

@@ -64,6 +64,11 @@
                     </i-select>
                 </i-col>
                 <i-col span="3">
+                    <i-select v-model="q.thirdPartyMerchCode" placeholder="第三方商户" label-in-value>
+                        <i-option v-for="thirdMerchant in thirdMerchantBizViewList" :value="thirdMerchant.thirdPartyMerchCode" :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="3">
                     <i-input v-model="q.goodsSn" @on-enter="query" placeholder="商品编码"/>
                 </i-col>
                 <i-col span="3">
@@ -157,12 +162,18 @@
                 <!--</Row>-->
                 <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
                 <Form-item label="商户" prop="merchSn">
-                        <i-select v-model="goods.merchSn" filterable placeholder="商户" @on-change="showMerchInfo" label-in-value>
-                            <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
-                        </i-select>
+                    <i-select v-model="goods.merchSn" filterable placeholder="商户" @on-change="showMerchInfo" label-in-value v-show="isOperator=='add'">
+                        <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                    </i-select>
+                    <i-select v-model="goods.merchSn" filterable placeholder="商户" @on-change="showMerchInfo" disabled label-in-value v-show="isOperator=='update'">
+                        <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                    </i-select>
                     </Form-item>
                 <Form-item label="第三方商户" prop="thirdPartyMerchCode">
-                    <i-select v-model="goods.thirdPartyMerchCode" placeholder="第三方商户" @on-change="showStockShare" label-in-value>
+                    <i-select v-model="goods.thirdPartyMerchCode" placeholder="第三方商户" @on-change="showStockShare" label-in-value v-show="isOperator=='add'">
+                        <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdPartyMerchCode" :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                    </i-select>
+                    <i-select v-model="goods.thirdPartyMerchCode" placeholder="第三方商户" @on-change="showStockShare" disabled label-in-value v-show="isOperator=='update'" >
                         <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdPartyMerchCode" :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}</i-option>
                     </i-select>
                 </Form-item>
@@ -214,9 +225,11 @@
                     <!--<Form-item label="零售价" prop="retailPrice">-->
                         <!--<Input-number :min="0.01" :step="0.01" v-model="goods.retailPrice" placeholder="零售价" style="width: 268px;"/>-->
                     <!--</Form-item>-->
-                    <Form-item label="商品库存" prop="goodsNumber" v-show="isStockShare">
-                        <!--<i-input v-model="goods.goodsNumber" placeholder="商品库存" style="width: 268px;"/>-->
-                        <Input-number :min="1" :step="1" v-model="goods.goodsNumber" placeholder="商品库存" style="width: 268px;"/>
+                    <!--<Form-item label="商品总库存" prop="goodsNumber" v-show="isStockShare">-->
+                        <!--<Input-number :min="1" :step="1" v-model="goods.goodsNumber" placeholder="商品总库存" style="width: 268px;"/>-->
+                    <!--</Form-item>-->
+                    <Form-item label="商品总库存" prop="goodsNumber">
+                        <Input-number :min="0" :step="1" v-model="goods.goodsNumber" placeholder="商品总库存" style="width: 268px;"/>
                     </Form-item>
                     <Form-item label="商品税率(0.00)" prop="goodsRate">
                         <Input-number :min="0.001" :step="0.001" v-model="goods.goodsRate" placeholder="商品税率" style="width: 268px;"/>

+ 11 - 4
kmall-admin/src/main/webapp/WEB-INF/page/shop/order.html

@@ -22,6 +22,9 @@
                 <i-col span="3">
                     <i-input v-model="q.merchOrderSn" @on-enter="query" placeholder="商户订单号"/>
                 </i-col>
+                <i-col span="3">
+                    <i-input v-model="q.sku" @on-enter="query" placeholder="sku"/>
+                </i-col>
                 <i-col span="2">
                     <i-select v-model="q.orderBizType" placeholder="货品业务类型">
                         <i-option v-for="macro in orderBizTypeList" :value="macro.value" :key="macro.id">{{macro.name}}
@@ -36,7 +39,7 @@
                         <!--<i-option value="402">完成</i-option>-->
                     </i-select>
                 </i-col>
-                <i-col span="3">
+                <i-col span="2">
                     <i-select v-model="q.payStatus" placeholder="支付状态">
                         <i-option v-for="macro in payStatusList" :value="macro.value" :key="macro.id">{{macro.name}}
                         </i-option>
@@ -48,10 +51,10 @@
                         <i-option value="2">团购订单</i-option>
                     </i-select>
                 </i-col>-->
-                <i-col span="3">
+                <i-col span="2">
                     <Date-picker v-model="q.startTime" placeholder="创建订单开始时间"/>
                 </i-col>
-                <i-col span="3">
+                <i-col span="2">
                     <Date-picker v-model="q.endTime" placeholder="创建订单结束时间"/>
                 </i-col>
                 <i-button @click="query">查询</i-button>
@@ -422,7 +425,8 @@
                     <tr>
                         <td style="text-align: left; width: 600px; font-weight: bold;" colspan="2">商品</td>
                         <td style="text-align: center; width: 240px; font-weight: bold;">小计</td>
-                        <td style="text-align: center; width: 240px; font-weight: bold;">优惠抵扣金额(元)</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">优惠券抵扣金额(元)</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">促销满减抵扣金额(元)</td>
                         <td style="text-align: center; width: 240px; font-weight: bold;">应收金额(元)</td>
                         <td style="text-align: center; width: 240px; font-weight: bold;">实收金额(元)</td>
                     </tr>
@@ -440,12 +444,14 @@
                         <td align="center">-</td>
                         <td align="center">-</td>
                         <td align="center">-</td>
+                        <td align="center">-</td>
                     </tr>
                     <tr>
                         <td align="left" style="font-weight: bold;">运费</td>
                         <td align="center">-</td>
                         <td align="center">-</td>
                         <td align="center">-</td>
+                        <td align="center">-</td>
                         <td align="center">¥{{order.freightPrice}}</td>
                         <td align="center">-</td>
                     </tr>
@@ -453,6 +459,7 @@
                         <td align="left" colspan="2" style="font-weight: bold;">总计</td>
                         <td align="center">¥{{order.orderPrice}}</td>
                         <td align="center">¥{{order.couponPrice}}</td>
+                        <td align="center">¥{{order.fullCutPrice}}</td>
                         <td align="center">¥{{order.actualPrice}}</td>
                         <td align="center" v-show="order.payStatus == 0">未付款</td>
                         <td align="center" v-show="order.payStatus == 1">付款中</td>

+ 142 - 14
kmall-admin/src/main/webapp/WEB-INF/page/shop/storeProductStock.html

@@ -48,7 +48,7 @@
 </head>
 <body>
 <div id="rrapp" v-cloak>
-    <div v-show="showList">
+    <div v-show="!showList">
         <Row :gutter="16">
             <div class="search-group">
                 <i-col span="3">
@@ -59,6 +59,12 @@
                     </i-select>
                 </i-col>
                 <i-col span="3">
+                    <i-select v-model="q.thirdPartyMerchCode" placeholder="所属三方商户" filterable >
+                        <i-option v-for="thirdMerchant in thirdMerchantBizShowList" :value="thirdMerchant.thirdPartyMerchCode" :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="3">
                     <i-input v-model="q.goodsName" @on-enter="query" placeholder="名称"/>
                 </i-col>
                 <i-col span="3">
@@ -92,7 +98,7 @@
                 <i-button @click="query">查询</i-button>
                 <i-button @click="reloadSearch">重置</i-button>
             </div>
-            <div class="buttons-group">
+            <div class="buttons-group" style="float: left">
                 <!--#if($shiro.hasPermission("productstorerela:upload"))
                 <i-col style="display: inline-grid;">
                     <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError"
@@ -102,10 +108,16 @@
                 </i-col>
                 #end-->
                 #if($shiro.hasPermission("productstorerela:save"))
-                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                <i-button type="info" @click="add" v-show="!isSupplierShowByThirdSn||roleType"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
                 #end
                 #if($shiro.hasPermission("productstorerela:update"))
-                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                <i-button type="warning" @click="update" v-show="!isSupplierShowByThirdSn||roleType"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("productstorerela:save"))
+                <i-button type="info" @click="addSupplierGoods" v-show="isSupplierShowByThirdSn"><i class="fa fa-plus"></i>&nbsp;新增供货商商品</i-button>
+                #end
+                #if($shiro.hasPermission("productstorerela:update"))
+                <i-button type="warning" @click="updateSupplierGoods" v-show="isSupplierShowByThirdSn"><i class="fa fa-pencil-square-o"></i>&nbsp;修改供货商商品</i-button>
                 #end
                 #if($shiro.hasPermission("productstorerela:delete"))
                 <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
@@ -116,37 +128,37 @@
         <div id="jqGridPager"></div>
     </div>
 
-    <Card v-show="!showList">
+    <Card v-show="!showViewList">
         <p slot="title">{{title}}</p>
         <i-form ref="formValidate" :model="productStoreRela" :rules="ruleValidate" :label-width="80">
             <Form-item label="门店" prop="storeId">
                 <i-select v-model="productStoreRela.storeId" placeholder="门店" filterable @on-change="getGoods"
                           label-in-value v-show="isOperatorShow" disabled>
-                    <i-option v-for="store in stores" :value="store.id"
+                    <i-option v-for="store in storesList" :value="store.id"
                               :key="store.id">{{store.storeName}}
                     </i-option>
                 </i-select>
                 <i-select v-model="productStoreRela.storeId" placeholder="门店" filterable @on-change="getGoods"
                           label-in-value v-show="!isOperatorShow">
-                    <i-option v-for="store in stores" :value="store.id"
+                    <i-option v-for="store in storesList" :value="store.id"
                               :key="store.id">{{store.storeName}}
                     </i-option>
                 </i-select>
             </Form-item>
             <Form-item label="商品" prop="goodsId">
                 <i-select v-model="productStoreRela.goodsId" filterable @on-change="changeGoods" label-in-value  v-show="isOperatorShow" disabled>
-                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                    <i-option v-for="goods in goodsList" :value="goods.id" :key="goods.id">{{goods.name}}({{goods.goodsBizType=='00'?'保税备货':''}}{{goods.goodsBizType=='02'?'保税展示补货':''}}{{goods.goodsBizType=='10'?'门店店提':''}}{{goods.goodsBizType=='11'?'普通货物':''}})</i-option>
                 </i-select>
                 <i-select v-model="productStoreRela.goodsId" filterable @on-change="changeGoods" label-in-value  v-show="!isOperatorShow">
-                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                    <i-option v-for="goods in goodsList" :value="goods.id" :key="goods.id">{{goods.name}}({{goods.goodsBizType=='00'?'保税备货':''}}{{goods.goodsBizType=='02'?'保税展示补货':''}}{{goods.goodsBizType=='10'?'门店店提':''}}{{goods.goodsBizType=='11'?'普通货物':''}})</i-option>
                 </i-select>
             </Form-item>
-            <div v-show="isStockShare"><span style="margin-left: 80px;color: red;font-size: 12px;">* 请先维护第三方商户门店商户是否共享字段,如字段为是则去修改商品库存,设置为否则可修改门店库存</span></div>
+            <div v-show="isStockShare"><span style="margin-left: 80px;color: red;font-size: 12px;">* 该门店商品所选供应商第三方商户是共享库存,门店库存则为商户商品总库存,不需要编辑</span></div>
             <Form-item label="库存" prop="stockNum" v-show="isStockShare"><!--共享-->
                 <Input-number :min="0" :step="1" v-model="productStoreRela.stockNum" placeholder="总库存"
                               style="width: 268px;" disabled/>
             </Form-item>
-            <Form-item label="库存" prop="stockNum" v-show="!isStockShare"><!--不共享-->
+            <Form-item label="库存" prop="stockNum" v-show="!isStockShare && showInput"><!--不共享-->
                 <Input-number :min="0" :step="1" v-model="productStoreRela.stockNum" placeholder="总库存"
                               style="width: 268px;" />
             </Form-item>
@@ -219,9 +231,125 @@
         </i-form>
         <div style="padding-left: 20px;padding-top: 20px">
             <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
-            <i-button type="warning" @click="reload" style="margin-left: 8px"/>
-            返回</i-button>
-            <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
+        </div>
+    </Card>
+
+    <Card v-show="!showSaveSupplierGoods">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="productStoreRela" :rules="ruleValidate" :label-width="120">
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="productStoreRela.storeId" placeholder="门店" filterable  @on-change="getDataChangeStore"
+                          label-in-value v-show="isSupplierOperatorShow" disabled>
+                    <i-option v-for="store in storesBySupplierList" :value="store.id"
+                              :key="store.id">{{store.storeName}}
+                    </i-option>
+                </i-select>
+                <i-select v-model="productStoreRela.storeId" placeholder="门店" filterable
+                          label-in-value v-show="!isSupplierOperatorShow"  @on-change="getDataChangeStore">
+                    <i-option v-for="store in storesBySupplierList" :value="store.id"
+                              :key="store.id">{{store.storeName}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="所属供应商三方商户" prop="supplierThirdId">
+                <i-select v-model="productStoreRela.supplierThirdId" placeholder="所属供应商三方商户" filterable label-in-value @on-change="getGoodsByThirdMerchSn" v-show="isSupplierOperatorShow" disabled>
+                    <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdMerchSn" :key="thirdMerchant.thirdMerchSn">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                </i-select>
+                <i-select v-model="productStoreRela.supplierThirdId" placeholder="所属供应商三方商户" filterable label-in-value @on-change="getGoodsByThirdMerchSn" v-show="!isSupplierOperatorShow">
+                    <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdMerchSn" :key="thirdMerchant.thirdMerchSn">{{thirdMerchant.thirdPartyMerchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="商品" prop="goodsId">
+                <i-select v-model="productStoreRela.goodsId" filterable @on-change="changeSupplerGoods" label-in-value  v-show="isSupplierOperatorShow" disabled>
+                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}({{goods.goodsBizType=='00'?'保税备货':''}}{{goods.goodsBizType=='02'?'保税展示补货':''}}{{goods.goodsBizType=='10'?'门店店提':''}}{{goods.goodsBizType=='11'?'普通货物':''}})</i-option>
+                </i-select>
+                <i-select v-model="productStoreRela.goodsId" filterable @on-change="changeSupplerGoods" label-in-value  v-show="!isSupplierOperatorShow">
+                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}({{goods.goodsBizType=='00'?'保税备货':''}}{{goods.goodsBizType=='02'?'保税展示补货':''}}{{goods.goodsBizType=='10'?'门店店提':''}}{{goods.goodsBizType=='11'?'普通货物':''}})</i-option>
+                </i-select>
+            </Form-item>
+            <div v-show="isStockShare"><span style="margin-left: 80px;color: red;font-size: 12px;">* 该门店商品所选供应商第三方商户是共享库存,门店库存则为商户商品总库存,不需要编辑</span></div>
+            <Form-item label="库存" prop="stockNum" v-show="isSupplierStockShare"><!--共享-->
+                <Input-number :min="0" :step="1" v-model="productStoreRela.stockNum" placeholder="总库存"
+                              style="width: 268px;" disabled/>
+            </Form-item>
+            <Form-item label="库存" prop="stockNum" v-show="!isSupplierStockShare && showInput"><!--不共享-->
+                <Input-number :min="0" :step="1" v-model="productStoreRela.stockNum" placeholder="总库存"
+                              style="width: 268px;" />
+            </Form-item>
+            <Form-item v-if="showInput" label="商品类型" prop="categoryId" style="height: 30px;">
+                <!--<i-input v-model="goods.categoryName" @on-click="categoryTree" icon="eye" readonly="readonly" placeholder="商品类型"/>-->
+                <i-select v-model="productStoreRela.attributeCategory" placeholder="商品分类" @on-change="changeCategories"
+                          label-in-value style="width: 268px;height: 30px;">
+                    <i-option v-for="category in categories" :value="category.id"
+                              :key="category.id">{{category.name}}
+                    </i-option>
+                </i-select>
+                <i-select v-model="productStoreRela.categoryId" placeholder="商品二级分类" @on-change="getAttributes"
+                          label-in-value style="width: 268px;height: 30px;">
+                    <i-option v-for="category in categoriesTwo" :value="category.id"
+                              :key="category.id">{{category.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item v-if="showInput" label="品牌" prop="brandId">
+                <i-select v-model="productStoreRela.brandId" placeholder="品牌"
+                          label-in-value style="width: 268px;">
+                    <i-option v-for="brand in brands" :value="brand.id" :key="brand.id">{{brand.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item v-if="showInput" label="运费模版" prop="freightId">
+                <i-select v-model="productStoreRela.freightId" placeholder="运费模版"
+                          label-in-value style="width: 268px;">
+                    <i-option v-for="freight in freights" :value="freight.id" :key="freight.id">{{freight.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item v-if="showInputSpecification" label="规格" prop="specification">
+                <i-input v-model="productStoreRela.specification" placeholder="规格" style="width: 268px;" v-show="isSupplierOperatorShow" disabled></i-input>
+                <i-input v-model="productStoreRela.specification" placeholder="规格" style="width: 268px;" v-show="!isSupplierOperatorShow"></i-input>
+            </Form-item>
+            <Form-item  v-if="showInput" label="零售价" prop="retailPrice">
+                <Input-number :min="0.01" :step="0.01" v-model="productStoreRela.retailPrice" placeholder="零售价格"
+                              style="width: 268px;"/>
+            </Form-item>
+            <Form-item v-if="showInput" label="市场价" prop="marketPrice">
+                <Input-number :min="0.01" :step="0.01" v-model="productStoreRela.marketPrice" placeholder="市场价"
+                              style="width: 268px;"/>
+            </Form-item>
+            <div v-if="showInput" v-for="(item,index) in attributeEntityList" v-show="item.isDelete==0" style="margin-left: 16px;">
+                <div class="row">
+                    <div class="col-md-3">
+                        <label class="ivu-form-item-label">属性:</label>
+                        <div class="col-md-7 input-icon right">
+                            <i-select v-model="item.attributeId" filterable>
+                                <i-option v-for="attribute in attributes" :value="attribute.id"
+                                          :key="attribute.id">{{attribute.name}}
+                                </i-option>
+                            </i-select>
+                        </div>
+                    </div>
+                    <div class="col-md-3">
+                        <label class="ivu-form-item-label">属性值:</label>
+                        <div class="col-md-7 input-icon right">
+                            <i-input type="text" v-model="item.value"/>
+                        </div>
+                    </div>
+                    <button v-if="index == 0" class="btn btn-primary btn-sm" type="button" @click="addAttrRow">
+                        <i class="fa fa-plus"></i>
+                    </button>
+                    <button class="btn red btn-sm" type="button" @click="delAttrRow(index)">
+                        <i class="fa fa-trash-o"></i>
+                    </button>
+                </div>
+            </div>
+        </i-form>
+        <div style="padding-left: 20px;padding-top: 20px">
+            <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
         </div>
     </Card>
 </div>

+ 10 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/thirdmerchantbiz.html

@@ -90,6 +90,16 @@
                     <!--</Radio>-->
                 <!--</Radio-group>-->
             <!--</Form-item>-->
+            <Form-item label="供应商模式商品是否启用" prop="isSupplierGoods" v-show="isOperate">
+                <Radio-group v-model="thirdMerchantBiz.isSupplierGoods">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
 
             <Form-item label="是否有效" prop="isValid">
                 <Radio-group v-model="thirdMerchantBiz.isValid">

+ 28 - 28
kmall-admin/src/main/webapp/WEB-INF/page/statis/mkstoretopicstat.html

@@ -57,11 +57,11 @@
     <Card v-show="!statInfoList">
         <p slot="title">{{title}}</p>
         <i-form :model="mkStoreTopicStat" :label-width="100">
-            <Form-item label="活动id" prop="storeTopicId">
-                {{mkStoreTopicStat.storeTopicId}}
+            <Form-item label="所属活动">
+                {{mkStoreTopicStat.storeTopicName}}
             </Form-item>
-            <Form-item label="门店id" prop="storeId">
-                {{mkStoreTopicStat.storeId}}
+            <Form-item label="所属门店">
+                {{mkStoreTopicStat.storeName}}
             </Form-item>
             <Form-item label="浏览数" prop="browseNum">
                 {{mkStoreTopicStat.browseNum}}
@@ -78,9 +78,9 @@
             <Form-item label="页面访问深度" prop="visitPageDeep">
                 {{mkStoreTopicStat.visitPageDeep}}
             </Form-item>
-            <Form-item label="转发访客量" prop="transVisitorNum">
-                {{mkStoreTopicStat.transVisitorNum}}
-            </Form-item>
+            <!--<Form-item label="转发访客量" prop="transVisitorNum">-->
+                <!--{{mkStoreTopicStat.transVisitorNum}}-->
+            <!--</Form-item>-->
             <Form-item label="下单单数" prop="submitOrderNum">
                 {{mkStoreTopicStat.submitOrderNum}}
             </Form-item>
@@ -90,36 +90,36 @@
             <Form-item label="支付单数" prop="payOrderNum">
                 {{mkStoreTopicStat.payOrderNum}}
             </Form-item>
-            <Form-item label="连带支付单数" prop="relaPayOrderNum">
-                {{mkStoreTopicStat.relaPayOrderNum}}
-            </Form-item>
+            <!--<Form-item label="连带支付单数" prop="relaPayOrderNum">-->
+                <!--{{mkStoreTopicStat.relaPayOrderNum}}-->
+            <!--</Form-item>-->
             <Form-item label="支付人数" prop="payerNum">
                 {{mkStoreTopicStat.payerNum}}
             </Form-item>
-            <Form-item label="连带支付人数" prop="relaPayerNum">
-                {{mkStoreTopicStat.relaPayerNum}}
-            </Form-item>
+            <!--<Form-item label="连带支付人数" prop="relaPayerNum">-->
+                <!--{{mkStoreTopicStat.relaPayerNum}}-->
+            <!--</Form-item>-->
             <Form-item label="支付件数" prop="payCaseNum">
                 {{mkStoreTopicStat.payCaseNum}}
             </Form-item>
-            <Form-item label="连带支付件数" prop="relaPayCaseNum">
-                {{mkStoreTopicStat.relaPayCaseNum}}
-            </Form-item>
+            <!--<Form-item label="连带支付件数" prop="relaPayCaseNum">-->
+                <!--{{mkStoreTopicStat.relaPayCaseNum}}-->
+            <!--</Form-item>-->
             <Form-item label="应收金额" prop="receivMoney">
-                ¥{{mkStoreTopicStat.receivMoney}}
-            </Form-item>
-            <Form-item label="连带应收金额" prop="relaReceivMoney">
-                ¥{{mkStoreTopicStat.relaReceivMoney}}
+                {{mkStoreTopicStat.receivMoney==null?'':'¥'+mkStoreTopicStat.receivMoney}}
             </Form-item>
+            <!--<Form-item label="连带应收金额" prop="relaReceivMoney">-->
+                <!--¥{{mkStoreTopicStat.relaReceivMoney}}-->
+            <!--</Form-item>-->
             <Form-item label="实收金额" prop="actMoney">
-                ¥{{mkStoreTopicStat.actMoney}}
-            </Form-item>
-            <Form-item label="连带实收金额" prop="relaActMoney">
-                ¥{{mkStoreTopicStat.relaActMoney}}
-            </Form-item>
-            <Form-item label="备注" prop="note">
-                {{mkStoreTopicStat.note}}
-            </Form-item>
+                {{mkStoreTopicStat.actMoney==null?'':'¥'+mkStoreTopicStat.actMoney}}
+            </Form-item>
+            <!--<Form-item label="连带实收金额" prop="relaActMoney">-->
+                <!--¥{{mkStoreTopicStat.relaActMoney}}-->
+            <!--</Form-item>-->
+            <!--<Form-item label="备注" prop="note">-->
+                <!--{{mkStoreTopicStat.note}}-->
+            <!--</Form-item>-->
             <Form-item>
                 <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
             </Form-item>

+ 10 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/thirdmerchswitch.html

@@ -84,6 +84,16 @@
                     </Radio>
                 </Radio-group>
             </Form-item>
+            <Form-item label="供应商模式商品是否启用" prop="isSupplierGoods">
+                <Radio-group v-model="thirdMerchantBiz.isSupplierGoods">
+                    <Radio label="1" disabled>
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0" disabled>
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
             <Form-item>
                 <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
                 <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkcentermenu.js

@@ -42,7 +42,7 @@ $(function () {
 
             ],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkdist.js

@@ -32,7 +32,7 @@ $(function () {
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }}],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkdistchnl.js

@@ -40,7 +40,7 @@ $(function () {
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }}],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkdistsellallocation.js

@@ -42,7 +42,7 @@ $(function () {
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }}],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkdistsellstatis.js

@@ -56,7 +56,7 @@ $(function () {
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }}],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 1775 - 0
kmall-admin/src/main/webapp/js/mk/mkstorecampminus.js

@@ -0,0 +1,1775 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../mkstorecampminus/list',
+        datatype: "json",
+        colModel: [
+			{label: 'campMinusId', name: 'campMinusId', index: 'camp_minus_id', key: true, hidden: true},
+            {
+                label: '活动图片', name: 'advImgUrl', index: 'advImgUrl', align: 'center', width: 30,
+                formatter: function (value) {
+                    return transImg(value);
+                }
+            },
+			{label: '活动名称', name: 'campName', index: 'camp_name', width: 60, align: 'center'},
+            {label: '减免活动类型', name: 'campMinusType', index: 'camp_minus_type', width: 50, align: 'center',
+                formatter: function (value) {
+                    if (value == '00') {
+                        return '满x元减';
+                    } else if (value == '01') {
+                        return '满x件减';
+                    } else if (value == '10') {
+                        return '满x元折';
+                    } else if (value == '11') {
+                        return '满x件折';
+                    }
+                    return '';
+                }},
+			// {label: '第三方商户id', name: 'thirdMerchSn', index: 'third_merch_sn', width: 80},
+            {label: '所属门店', name: 'storeName', index: 'storeName', width: 60, align: 'center'},
+			// {label: '活动id', name: 'storeTopicId', index: 'store_topic_id', width: 80},
+			{label: '活动时间', name: 'inValidTime', index: 'inValidTime', width: 110, align: 'center'},
+			// {label: '减免方式【minus_mode,00:满足最高层级减一次,10:每满一次减一次】,1、减免方式选择10时,满件、满元每人最多项必填;2、减免方式为00,如设置每满100(2件)减10元,满200(4件)减20元....等; 按最高层级优惠满减,仅减一次。', name: 'minusMode', index: 'minus_mode', width: 80},
+			// {label: '满元减条件(元)', name: 'yuanMinusCond', index: 'yuan_minus_cond', width: 80},
+			// {label: '满元减优惠(元)', name: 'yuanMinusPref', index: 'yuan_minus_pref', width: 80},
+			// {label: '满件减条件(件)', name: 'pieceMinusConf', index: 'piece_minus_conf', width: 80},
+			// {label: '满件减优惠(元)', name: 'pieceMinusPref', index: 'piece_minus_pref', width: 80},
+			// {label: '满减件每人优惠(元),填0代表不设置上限,减免活动类型为10,且减免方式选择10时,满件每人最多项必填。', name: 'pieceMinusEachDisc', index: 'piece_minus_each_disc', width: 80},
+			// {label: '满元折条件(元),大于等于0的2位小数', name: 'yuanDiscCond', index: 'yuan_disc_cond', width: 80},
+			// {label: '满元折优惠(折),大于0且小于10的1位小数。', name: 'yuanDiscPref', index: 'yuan_disc_pref', width: 80},
+			// {label: '满件折条件(件),大于等于0的整数', name: 'pieceDiscConf', index: 'piece_disc_conf', width: 80},
+			// {label: '满件折优惠(折),大于0且小于10的数,可带1位小数。', name: 'pieceDiscPref', index: 'piece_disc_pref', width: 80},
+			// {label: '适用类型,【apply_type,00:全部商品参与,01:指定商品参与,02:指定商品不参与】', name: 'applyType', index: 'apply_type', width: 80},
+			{label: '是否有效', name: 'isValid', index: 'is_valid', width: 50, align: 'center',
+                formatter: function (value) {
+                    if (value == '0') {
+                        return '有效';
+                    } else if (value == '1') {
+                        return '无效';
+                    }
+                    return '';
+                }},
+			{label: '活动状态', name: 'isPast', index: 'is_past', width: 50, align: 'center',
+                formatter: function (value) {
+                    if (value == '0') {
+                        return '<span style="font-weight: bolder;background: #58d44d;color: white">进行中</span>';
+                    } else if (value == '1') {
+                        return '<span style="font-weight: bolder;background: #B2AEBC;color: white;">已结束</span>';
+                    }else if (value == '2') {
+                        return '<span style="font-weight: bolder;background: red;color: white">未开始</span>';
+                    }
+                    return '';
+                }},
+            {label: '统计', name: 'minusStat', index: 'promStat', width: 70, align: 'center'},
+            {label: '操作', width: 150, align: 'center', sortable: false,
+                formatter: function (value, col, row) {
+                    let htmlStr = '';
+                    if ((row.isPast == '1' || row.isValid == 1) && row.applyType != '00') {//已结束
+                        htmlStr = "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.showInfo(" + row.campMinusId + ")'>活动详情</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.showGoods(" + row.campMinusId + ")'>查看商品</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.delById(" + row.campMinusId + ")'>删除活动</button>";
+                    }
+                    if ((row.isPast == '0' && row.isValid == 0) && row.applyType != '00') {//进行中
+                        htmlStr = "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateById(" + row.campMinusId + ")'>编辑活动</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updatePastById(" + row.campMinusId + ")'>结束活动</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateGoods("+row.storeId+",\""+row.goodsBizType+"\","+row.campMinusId+",\""+row.applyType+"\","+row.storeTopicId+")'>管理商品</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.putOn(" + row.campMinusId + ")'>投放</button>";
+                    }
+                    if ((row.isPast == '2' && row.isValid == 0) && row.applyType != '00') {//未开始
+                        htmlStr = "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateById(" + row.campMinusId + ")'>编辑活动</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateStartPastById(" + row.campMinusId + ")'>立即开始</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateGoods("+row.storeId+",\""+row.goodsBizType+"\","+row.campMinusId+",\""+row.applyType+"\","+row.storeTopicId+")'>管理商品</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.putOn(" + row.campMinusId + ")'>投放</button>";
+                    }
+                    if ((row.isPast == '1' || row.isValid == 1) && row.applyType == '00') {//已结束
+                        htmlStr = "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.showInfo(" + row.campMinusId + ")'>活动详情</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.delById(" + row.campMinusId + ")'>删除活动</button>";
+                    }
+                    if ((row.isPast == '0' && row.isValid == 0) && row.applyType == '00') {//进行中
+                        htmlStr = "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateById(" + row.campMinusId + ")'>编辑活动</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updatePastById(" + row.campMinusId + ")'>结束活动</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.putOn(" + row.campMinusId + ")'>投放</button>";
+                    }
+                    if ((row.isPast == '2' && row.isValid == 0) && row.applyType == '00') {//未开始
+                        htmlStr = "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateById(" + row.campMinusId + ")'>编辑活动</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.updateStartPastById(" + row.campMinusId + ")'>立即开始</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                            "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.putOn(" + row.campMinusId + ")'>投放</button>";
+                    }
+                    return htmlStr;
+                }
+            }
+        ],
+		viewrecords: true,
+        height: 580,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+
+    $("#jqGridOrder").jqGrid({
+        url: '../mkstorecampminusgoods/queryCampMinusGoodsByIdList',
+        datatype: "json",
+        colModel: [
+            {label: '所属门店', name: 'storeName', index: 'storeName', width: 80, align: 'center'},
+            {label: '商品名称', name: 'goodsName', index: 'goodsName', width: 80, align: 'center'},
+            {label: '销售价', name: 'retailPrice', index: 'retailPrice', width: 60, align: 'center'},
+            {label: '成本价', name: 'marketPrice', index: 'marketPrice', width: 120, align: 'center'},
+            {label: '实际销量', name: 'actualTotalPrice', index: 'actualTotalPrice', width: 120, align: 'center',
+                formatter: function (value) {
+                    if (value == null) {
+                        return '0';
+                    }
+                    return value;
+                }},
+            {label: '商品状态', name: 'isOnSale', index: 'isOnSale', width: 120, align: 'center',
+                formatter: function (value) {
+                    if (value == '0') {
+                        return '下架';
+                    } else if (value == '1') {
+                        return '上架';
+                    }
+                    return value;
+                }
+            },
+            {label: '操作', width: 130, align: 'center', sortable: false,
+                formatter: function (value, col, row) {
+                    let htmlStr = "-" ;
+                    if(!vm.isShowGoods){
+                        htmlStr = "<button class='btn btn-outline btn-primary' " +
+                            "onclick='vm.delCheckGoods(" + row.minusGoodId + ")'>移除</button>" ;
+                    }
+                    return htmlStr;
+                }
+            }
+        ],
+        viewrecords: true,
+        height: 550,
+        width:1680,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: false,
+        multiselect: true,
+        pager: "#jqGridPagerOrder",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGridOrder").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        title: null,
+		mkStoreCampMinus: {},
+		ruleValidate: {
+			name: [
+				{required: true, message: '名称不能为空', trigger: 'blur'}
+			]
+		},
+		q: {
+            campName: '',
+            isPast:''
+		},
+
+        isOperatorShow: false,
+        thirdMerchantBizList: [],
+        storeList: [],
+        showList: true,//新增修改活动框
+        showViewList: false,//查询页面框
+        showInfoList: true,//查询明细框
+        isShowGoods: true,//为true在查看商品页则不能操作【添加商品】,为false则在管理商品页可以操作【添加商品】
+        updateGoodsList: true,//管理商品框
+        showStoreGoodsList: true,//添加活动商品框
+        macros: [],
+        minusTypeUnitAttrList: [{'yuanMinusCond': '', 'yuanMinusPref': '', 'isDelete': 0}],//满元满减
+        minusTypePieceAttrList: [{'pieceMinusConf': '', 'pieceMinusPref': '', 'isDelete': 0}],//满件满减
+        minusTypeDiscUnitAttrList: [{'yuanDiscCond': '', 'yuanDiscPref': '', 'isDelete': 0}],//满元满折
+        minusTypeDiscPieceAttrList: [{'pieceDiscConf': '', 'pieceDiscPref': '', 'isDelete': 0}],//满件满折
+        minusTypeUnitMode10List: [{'yuanMinusCond': '', 'yuanMinusPref': '', 'pieceMinusEachDisc': '', 'isDelete': 0}],//满元满减,且减免类型为每满一次减一次
+        minusTypePieceMode10List: [{'pieceMinusConf': '', 'pieceMinusPref': '', 'pieceMinusEachDisc': '', 'isDelete': 0}],//满件满减,且减免类型为每满一次减一次
+        isMinusShow: false,
+        isUnitAttrShow: false,//满元满减
+        isPieceAttrShow: false,//满件满减
+        isDiscUnitAttrShow: false,//满元满折
+        isDiscPieceAttrShow: false,//满件满折
+        isUnitMode10Show: false,//满元满减,且减免类型为每满一次减一次
+        isPieceMode10Show: false,//满件满减,且减免类型为每满一次减一次
+        minusModeType: '',
+        campMinusType:'',
+        isValidationByUnit: true,
+        isValidationByPiece: true,
+        isValidationByDiscUnit: true,
+        isValidationByDiscPiece: true,
+        isValidationByUnitMode: true,
+        isValidationByPieceMode: true,
+        g:{
+            goodsName:''
+        },
+        campMinusId: '',
+        storeId: '',
+        goodsBizType: '',
+        applyType: '',
+        storeTopicId: '',
+        currentPage: 1,
+        limit: 30,
+        totalPage:'',
+        totalCount:'',
+        goodsList: [],
+        s:{
+            goodsName:''
+        },
+        checkGoodsByHtmlList:[],//选择商品前端储存的数组
+        mkStoreTicketDiscountGoods:{checkGoodsList:[]},
+        mkStoreCampMinusGoodsEntity:{}
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		add: function () {
+			vm.showList = false;
+            vm.showViewList = true;
+            vm.showInfoList = true;
+            vm.showGoodsList = true;
+            vm.updateGoodsList = true;
+            vm.showStoreGoodsList = true;
+            vm.mkStoreCampMinus = {isValid:'0',isStoreShow:'0',applyType:'00',campMinusType:'00',minusMode:'00',advImgUrl:''};
+            vm.isMinusShow = true;
+            vm.minusModeType = '00';
+            vm.chanCampMinusType('00');
+            vm.chanMinusMode('00');
+			vm.title = "新增满减满折活动";
+            vm.thirdMerchantBizList = [];
+            vm.storeList = [];
+            vm.minusTypeUnitAttrList = [{'yuanMinusCond': '', 'yuanMinusPref': '', 'isDelete': 0}];
+            vm.minusTypePieceAttrList = [{'pieceMinusConf': '', 'pieceMinusPref': '', 'isDelete': 0}];
+            vm.minusTypeDiscUnitAttrList = [{'yuanDiscCond': '', 'yuanDiscPref': '', 'isDelete': 0}];
+            vm.minusTypeDiscPieceAttrList = [{'pieceDiscConf': '', 'pieceDiscPref': '', 'isDelete': 0}];
+            vm.minusTypeUnitMode10List = [{'yuanMinusCond': '', 'yuanMinusPref': '', 'pieceMinusEachDisc': '', 'isDelete': 0}];
+            vm.minusTypePieceMode10List = [{'pieceMinusConf': '', 'pieceMinusPref': '', 'pieceMinusEachDisc': '', 'isDelete': 0}];
+            vm.getThirdMerchantBizList();
+            vm.isOperatorShow = false;
+		},
+		update: function (event) {
+            let campMinusId = getSelectedRow();
+			if (campMinusId == null) {
+				return;
+			}
+            vm.showList = false;
+            vm.showViewList = true;
+            vm.showInfoList = true;
+            vm.showGoodsList = true;
+            vm.updateGoodsList = true;
+            vm.showStoreGoodsList = true;
+            vm.title = "修改满减满折活动";
+            vm.isOperatorShow = true;
+            vm.getThirdMerchantBizList();
+            vm.getInfo(campMinusId)
+		},
+        updateById: function (campMinusId) {
+            if (campMinusId == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.showViewList = true;
+            vm.showInfoList = true;
+            vm.showGoodsList = true;
+            vm.updateGoodsList = true;
+            vm.showStoreGoodsList = true;
+            vm.isMinusShow = true;
+            vm.title = "修改满减满折活动";
+            vm.getThirdMerchantBizList();
+            vm.getInfo(campMinusId);
+            vm.isOperatorShow = true;
+        },
+        showInfo: function(campMinusId){
+            if(campMinusId == null){
+                return;
+            }
+            vm.title = "查看满减满折信息";
+            vm.showList = true;
+            vm.showViewList = true;
+            vm.showInfoList = false;
+            vm.showGoodsList = true;
+            vm.updateGoodsList = true;
+            vm.showStoreGoodsList = true;
+            vm.getShowInfo(campMinusId);
+        },
+        showGoods: function (campMinusId) {
+            if(campMinusId == null){
+                return;
+            }
+            vm.title = "查看商品";
+            vm.showList = true;
+            vm.showViewList = true;
+            vm.showInfoList = true;
+            vm.updateGoodsList = false;
+            vm.isShowGoods = true;//为true则不可以添加商品
+            vm.showStoreGoodsList = true;
+            vm.reloadOrder();
+        },
+        updateGoods: function (storeId,goodsBizType,campMinusId,applyType,storeTopicId) {
+            if(storeId == null || goodsBizType == null || campMinusId == null || applyType == null || storeTopicId == null){
+                return;
+            }
+            vm.campMinusId = campMinusId;
+            vm.storeId = storeId;
+            vm.goodsBizType = goodsBizType;
+            vm.applyType = applyType;
+            vm.storeTopicId = storeTopicId;
+            vm.title = "管理商品";
+            vm.showList = true;
+            vm.showViewList = true;
+            vm.showInfoList = true;
+            vm.updateGoodsList = false;
+            vm.isShowGoods = false;//为false则可以添加商品
+            vm.showStoreGoodsList = true;
+
+            vm.reloadOrder();
+        },
+        queryOrder: function () {
+            vm.reloadOrder();
+        },
+        reloadOrderSearch: function() {
+            vm.g = {
+                goodsName: ''
+            }
+            vm.reloadOrder();
+        },
+        reloadOrder: function () {
+            let page = $("#jqGridOrder").jqGrid('getGridParam', 'page');
+            $("#jqGridOrder").jqGrid('setGridParam', {
+                postData: {'goodsName': vm.g.goodsName, 'campMinusId': vm.campMinusId},
+                page: page
+            }).trigger("reloadGrid");
+        },
+        saveCampMinusGoods: function () {
+            if(vm.storeId == null || vm.goodsBizType == null || vm.storeTopicId == null){
+                return;
+            }
+            vm.title = "添加活动商品";
+            vm.showList = true;
+            vm.showViewList = true;
+            vm.showInfoList = true;
+            vm.updateGoodsList = true;
+            vm.showStoreGoodsList = false;
+            //查询门店业务类型下的商品列表
+            vm.getGoodsList(vm.storeId,vm.goodsBizType);
+        },
+        /**
+         * 选择商品参数查询
+         */
+        reloadGoodsByStore: function (){
+            vm.getGoodsList(vm.storeId,vm.goodsBizType);
+        },
+        /**
+         * 选择商品重置参数查询
+         */
+        reloadGoodsSearch: function (){
+            vm.s.goodsName='';
+            vm.getGoodsList(vm.storeId,vm.goodsBizType);
+        },
+        /**
+         * 返回管理商品
+         */
+        reloadCampGoods: function () {
+            vm.showList = true;
+            vm.showViewList = true;
+            vm.showInfoList = true;
+            vm.updateGoodsList = false;
+            vm.isShowGoods = false;//为false则可以添加商品
+            vm.showStoreGoodsList = true;
+            vm.reloadOrder();
+        },
+        /**
+         * 商品选中
+         * @param item 商品信息
+         */
+        selectThisGoods: function (item) {
+            if(item.isCheck==0){
+                for(var i = 0; i < vm.goodsList.length; i++){
+                    if(vm.goodsList[i].goodsId == item.goodsId){
+                        vm.goodsList[i].isCheck = 1;
+                    }
+                }
+                vm.checkGoodsByHtmlList.push({goodsId: item.goodsId, storeRealId: item.id, goodsName: item.goodsName, applyType: vm.applyType, discGoodTempId:item.discGoodTempId});
+            }else{
+                for(var i = 0; i < vm.goodsList.length; i++){
+                    if(vm.goodsList[i].goodsId == item.goodsId){
+                        vm.goodsList[i].isCheck = 0;
+                    }
+                }
+                for (var g = 0; g < vm.checkGoodsByHtmlList.length; g++) {
+                    if(item.goodsId == vm.checkGoodsByHtmlList[g].goodsId){
+                        vm.checkGoodsByHtmlList.remove(vm.checkGoodsByHtmlList[g]);
+                    }
+                }
+                //删除取消选中的商品
+                vm.mkStoreTicketDiscountGoods.storeRelaId=item.id;
+                $.ajax({
+                    type: "POST",
+                    url: '../mkstoreticketgoodstemp/updateTempByStoreTopicIsValid',
+                    contentType: "application/json",
+                    data: JSON.stringify(vm.mkStoreTicketDiscountGoods),
+                    success: function (r) {
+                    }
+                });
+            }
+
+        },
+        /**
+         * 选择指定商品保存按钮
+         */
+        ok : function () {
+            vm.checkGoodsDataList =[];
+            vm.mkStoreTicketDiscountGoods.checkGoodsList = vm.checkGoodsByHtmlList;
+            vm.mkStoreTicketDiscountGoods.isSubmit = 0;//ok按钮提交的数据则为0
+            vm.mkStoreTicketDiscountGoods.storeTopicId = vm.storeTopicId;
+            $.ajax({
+                type: "POST",
+                url: '../mkstoreticketgoodstemp/batchSaveStoreTopicGoods',
+                contentType: "application/json",
+                data: JSON.stringify(vm.mkStoreTicketDiscountGoods),
+                success: function (r) {
+                    if (r.code === 0) {
+                        vm.mkStoreCampMinusGoodsEntity.storeTopicId = vm.storeTopicId;
+                        vm.mkStoreCampMinusGoodsEntity.campMinusId = vm.campMinusId;
+                        $.ajax({
+                            type: "POST",
+                            url: '../mkstorecampminusgoods/batchSaveCampMinusGoods',
+                            contentType: "application/json",
+                            data: JSON.stringify(vm.mkStoreCampMinusGoodsEntity),
+                            success: function (r) {
+                                if (r.code === 0) {
+                                    vm.reloadCampGoods();
+                                } else {
+                                    alert(r.msg);
+                                }
+                            }
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        /**
+         * 选择指定商品取消按钮
+         */
+        cancel: function () {
+            vm.checkGoodsByHtmlList =[];
+            // console.log(vm.checkGoodsByHtmlList);
+            //点击取消按钮如有分页记录的数据就删除
+            vm.mkStoreTicketDiscountGoods.checkGoodsList=vm.checkGoodsByHtmlList;
+            vm.mkStoreTicketDiscountGoods.isSubmit = 1;//cancel按钮提交的数据则为1
+            $.ajax({
+                type: "POST",
+                url: '../mkstoreticketgoodstemp/batchSaveStoreTopicGoods',
+                contentType: "application/json",
+                data: JSON.stringify(vm.mkStoreTicketDiscountGoods),
+                success: function (r) {
+                    if (r.code === 0) {
+                        vm.reloadCampGoods();
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        /**
+         * 指定商品分页,分页则将当前页选中的商品保存
+         */
+        loadGoodsDataByPage: function (value) {
+            vm.currentPage = value;
+            vm.mkStoreTicketDiscountGoods.checkGoodsList=vm.checkGoodsByHtmlList;//选择商品前端储存的数组
+            vm.mkStoreTicketDiscountGoods.isSubmit = 1;//分页记录的数据则为1
+            vm.mkStoreTicketDiscountGoods.storeTopicId = vm.storeTopicId;
+            $.ajax({
+                type: "POST",
+                url: '../mkstoreticketgoodstemp/batchSaveStoreTopicGoods',
+                contentType: "application/json",
+                data: JSON.stringify(vm.mkStoreTicketDiscountGoods),
+                success: function (r) {
+                    if (r.code === 0) {
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+            vm.getGoodsList(vm.storeId, vm.goodsBizType);
+        },
+        handlePageSize: function (value) {
+            vm.limit = value;
+            vm.currentPage = 1;
+            vm.getGoodsList(vm.storeId);
+        },
+        /**
+         * 删除已选中商品
+         * @param minusGoodId
+         */
+        delCheckGoods: function (minusGoodId) {
+            var minusGoodIds = [minusGoodId];
+            if (minusGoodIds == null){
+                return;
+            }
+
+            confirm('所选中的商品移除后,将不再参加此活动', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../mkstorecampminusgoods/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(minusGoodIds),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                vm.reloadOrder();
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        /**
+         * 查询选择商品分页
+         * @param storeId
+         */
+        getGoodsList: function(storeId,goodsBizType){
+            if(vm.storeId == null || vm.goodsBizType == null || vm.storeTopicId == null){
+                return;
+            }
+            $.get("../productstorerela/queryGoodsRealListByTopicId?storeId=" + storeId +"&goodsName="+vm.s.goodsName+"&applyType="+vm.applyType+"&goodsBizType="+goodsBizType
+                +"&storeTopicId="+vm.storeTopicId+"&page="+1+"&limit="+vm.limit, function (r) {
+                if(r.code == 0){
+                    vm.goodsList = r.page.list;
+                    vm.totalPage = r.page.totalPage;
+                    vm.totalCount = r.page.totalCount;
+                    vm.currentPage = r.page.currPage;
+                    vm.limit = r.page.pageSize;
+                }
+            });
+        },
+        putOn: function (campMinusId) {
+            if (campMinusId == null) {
+                return;
+            }
+            $("#qrcodeCanvas").html("");
+            $.get("../mkstorecampminus/qrcodeCanvasByCampMinus/" + campMinusId, function (r) {
+                var qrcSrc = r.url;
+                $("#qrcImg .qrcImg").attr("src", qrcSrc);
+
+                $("#qrcodeCanvas").html($("#qrcImg").html());
+
+                openWindow({
+                    title: "二维码",
+                    area: ['450px', '450px'],
+                    content: jQuery("#qrcode"),
+                    btn1: function (index) {
+                        $("#qrcImg").show();
+                        $("#qrcImg").hide();
+                        layer.close(index);
+                    }
+                });
+            });
+
+            $("#qrcImg").hide();
+        },
+		saveOrUpdate: function (event) {
+            let url = vm.mkStoreCampMinus.campMinusId == null ? "../mkstorecampminus/save" : "../mkstorecampminus/update";
+            vm.mkStoreCampMinus.minusTypeUnitAttrList = vm.minusTypeUnitAttrList;
+            vm.mkStoreCampMinus.minusTypePieceAttrList = vm.minusTypePieceAttrList;
+            vm.mkStoreCampMinus.minusTypeDiscUnitAttrList = vm.minusTypeDiscUnitAttrList;
+            vm.mkStoreCampMinus.minusTypeDiscPieceAttrList = vm.minusTypeDiscPieceAttrList;
+            vm.mkStoreCampMinus.minusTypeUnitMode10List = vm.minusTypeUnitMode10List;
+            vm.mkStoreCampMinus.minusTypePieceMode10List = vm.minusTypePieceMode10List;
+            if(vm.mkStoreCampMinus.campMinusType=='00' && vm.mkStoreCampMinus.minusMode=='00'){
+                if(!vm.isValidationByUnit){
+                    alert('优惠内容活动层级信息错误,请根据错误提示修改正确');
+                    return;
+                }
+            }
+            if(vm.mkStoreCampMinus.campMinusType=='00' && vm.mkStoreCampMinus.minusMode=='10'){
+                if(!vm.isValidationByUnitMode){
+                    alert('优惠内容活动层级信息错误,请根据错误提示修改正确');
+                    return;
+                }
+            }
+            if(vm.mkStoreCampMinus.campMinusType=='01' && vm.mkStoreCampMinus.minusMode=='00'){
+                if(!vm.isValidationByPiece){
+                    alert('优惠内容活动层级信息错误,请根据错误提示修改正确');
+                    return;
+                }
+            }
+            if(vm.mkStoreCampMinus.campMinusType=='01' && vm.mkStoreCampMinus.minusMode=='10'){
+                if(!vm.isValidationByPieceMode){
+                    alert('优惠内容活动层级信息错误,请根据错误提示修改正确');
+                    return;
+                }
+            }
+            if(vm.mkStoreCampMinus.campMinusType=='10'){
+                if(!vm.isValidationByDiscUnit){
+                    alert('优惠内容活动层级信息错误,请根据错误提示修改正确');
+                    return;
+                }
+            }
+            if(vm.mkStoreCampMinus.campMinusType=='11'){
+                if(!vm.isValidationByDiscPiece){
+                    alert('优惠内容活动层级信息错误,请根据错误提示修改正确');
+                    return;
+                }
+            }
+			$.ajax({
+				type: "POST",
+			    url: url,
+			    contentType: "application/json",
+			    data: JSON.stringify(vm.mkStoreCampMinus),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+			});
+		},
+		del: function (event) {
+            let campMinusIds = getSelectedRows();
+			if (campMinusIds == null){
+				return;
+			}
+
+			confirm('确定要删除选中的记录?', function () {
+				$.ajax({
+					type: "POST",
+				    url: "../mkstorecampminus/delete",
+				    contentType: "application/json",
+				    data: JSON.stringify(campMinusIds),
+				    success: function (r) {
+						if (r.code == 0) {
+							alert('操作成功', function (index) {
+								$("#jqGrid").trigger("reloadGrid");
+							});
+						} else {
+							alert(r.msg);
+						}
+					}
+				});
+			});
+		},
+        delById: function (campMinusId) {
+            if (campMinusId == null){
+                return;
+            }
+            let campMinusIds = [campMinusId];
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../mkstorecampminus/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(campMinusIds),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        updatePastById: function (campMinusId) {
+            if (campMinusId == null){
+                return;
+            }
+            confirm('结束进行中的活动会影响用户正常购买,建议您提前告知或说明,确定要结束活动吗?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../mkstorecampminus/updatePastById",
+                    contentType: "application/json",
+                    data: JSON.stringify(campMinusId),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        updateStartPastById: function (campMinusId) {
+            if (campMinusId == null){
+                return;
+            }
+            confirm('开始后,活动立即生效,确定要开始活动吗?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../mkstorecampminus/updateStartPastById",
+                    contentType: "application/json",
+                    data: JSON.stringify(campMinusId),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+		getInfo: function(campMinusId){
+			$.get("../mkstorecampminus/info/"+campMinusId, function (r) {
+                vm.mkStoreCampMinus = r.mkStoreCampMinus;
+                vm.minusModeType = r.mkStoreCampMinus.minusModeType;
+                vm.minusMode = r.mkStoreCampMinus.minusMode;
+                vm.chanCampMinusType(r.mkStoreCampMinus.campMinusType);
+                vm.chanMinusMode(r.mkStoreCampMinus.minusMode);
+                if (r.mkStoreCampMinus.minusTypeUnitAttrList.length > 0) {
+                    vm.minusTypeUnitAttrList = r.mkStoreCampMinus.minusTypeUnitAttrList;
+                    for(var i=0; i<r.mkStoreCampMinus.minusTypeUnitAttrList.length; i++){
+                        $("#"+(i+'unit')).html('');
+                        $("#"+(i+'unit_pref')).html('');
+                    }
+                } else {
+                    vm.minusTypeUnitAttrList = [{'yuanMinusCond': '', 'yuanMinusPref': '', 'isDelete': 0}];
+                }
+
+                if (r.mkStoreCampMinus.minusTypePieceAttrList.length > 0) {
+                    vm.minusTypePieceAttrList = r.mkStoreCampMinus.minusTypePieceAttrList;
+                    for(var i=0; i<r.mkStoreCampMinus.minusTypePieceAttrList.length; i++){
+                        $("#"+(i+'piece_conf')).html('');
+                        $("#"+(i+'piece_pref')).html('');
+                    }
+                } else {
+                    vm.minusTypePieceAttrList = [{'pieceMinusConf': '', 'pieceMinusPref': '', 'isDelete': 0}];
+                }
+
+                if (r.mkStoreCampMinus.minusTypeDiscUnitAttrList.length > 0) {
+                    vm.minusTypeDiscUnitAttrList = r.mkStoreCampMinus.minusTypeDiscUnitAttrList;
+                    for(var i=0; i<r.mkStoreCampMinus.minusTypeDiscUnitAttrList.length; i++){
+                        $("#"+(i+'disc_unit_cond')).html('');
+                        $("#"+(i+'disc_unit_pref')).html('');
+                    }
+                } else {
+                    vm.minusTypeDiscUnitAttrList = [{'yuanDiscCond': '', 'yuanDiscPref': '', 'isDelete': 0}];
+                }
+
+                if (r.mkStoreCampMinus.minusTypeDiscPieceAttrList.length > 0) {
+                    vm.minusTypeDiscPieceAttrList = r.mkStoreCampMinus.minusTypeDiscPieceAttrList;
+                    for(var i=0; i<r.mkStoreCampMinus.minusTypeDiscPieceAttrList.length; i++){
+                        $("#"+(i+'piece_disc_conf')).html('');
+                        $("#"+(i+'piece_disc_ref')).html('');
+                    }
+                } else {
+                    vm.minusTypeDiscPieceAttrList = [{'pieceDiscConf': '', 'pieceDiscPref': '', 'isDelete': 0}];
+                }
+
+                if (r.mkStoreCampMinus.minusTypeUnitMode10List.length > 0) {
+                    vm.minusTypeUnitMode10List = r.mkStoreCampMinus.minusTypeUnitMode10List;
+                    for(var i=0; i<r.mkStoreCampMinus.minusTypeUnitMode10List.length; i++){
+                        $("#"+(i+'unit_mode')).html('');
+                        $("#"+(i+'unit_mode_pref')).html('');
+                        $("#"+(i+'unit_mode_each')).html('');
+                    }
+                } else {
+                    vm.minusTypeUnitMode10List = [{'yuanMinusCond': '', 'yuanMinusPref': '', 'pieceMinusEachDisc': '', 'isDelete': 0}];
+                }
+
+                if (r.mkStoreCampMinus.minusTypePieceMode10List.length > 0) {
+                    vm.minusTypePieceMode10List = r.mkStoreCampMinus.minusTypePieceMode10List;
+                    for(var i=0; i<r.mkStoreCampMinus.minusTypePieceMode10List.length; i++){
+                        $("#"+(i+'piece_mode')).html('');
+                        $("#"+(i+'piece_mode_pref')).html('');
+                        $("#"+(i+'piece_mode_each')).html('');
+                    }
+                } else {
+                    vm.minusTypePieceMode10List = [{'pieceMinusConf': '', 'pieceMinusPref': '', 'pieceMinusEachDisc': '', 'isDelete': 0}];
+                }
+            });
+		},
+        getShowInfo: function(campMinusId){
+            $.get("../mkstorecampminus/info/"+campMinusId, function (r) {
+                vm.mkStoreCampMinus = r.mkStoreCampMinus;
+                if (r.mkStoreCampMinus.minusTypeUnitAttrList.length > 0) {
+                    vm.minusTypeUnitAttrList = r.mkStoreCampMinus.minusTypeUnitAttrList;
+                } else {
+                    vm.minusTypeUnitAttrList = [];
+                }
+
+                if (r.mkStoreCampMinus.minusTypePieceAttrList.length > 0) {
+                    vm.minusTypePieceAttrList = r.mkStoreCampMinus.minusTypePieceAttrList;
+                } else {
+                    vm.minusTypePieceAttrList = [];
+                }
+
+                if (r.mkStoreCampMinus.minusTypeDiscUnitAttrList.length > 0) {
+                    vm.minusTypeDiscUnitAttrList = r.mkStoreCampMinus.minusTypeDiscUnitAttrList;
+                } else {
+                    vm.minusTypeDiscUnitAttrList = [];
+                }
+
+                if (r.mkStoreCampMinus.minusTypeDiscPieceAttrList.length > 0) {
+                    vm.minusTypeDiscPieceAttrList = r.mkStoreCampMinus.minusTypeDiscPieceAttrList;
+                } else {
+                    vm.minusTypeDiscPieceAttrList = [];
+                }
+
+                if (r.mkStoreCampMinus.minusTypeUnitMode10List.length > 0) {
+                    vm.minusTypeUnitMode10List = r.mkStoreCampMinus.minusTypeUnitMode10List;
+                } else {
+                    vm.minusTypeUnitMode10List = [];
+                }
+
+                if (r.mkStoreCampMinus.minusTypePieceMode10List.length > 0) {
+                    vm.minusTypePieceMode10List = r.mkStoreCampMinus.minusTypePieceMode10List;
+                } else {
+                    vm.minusTypePieceMode10List = [];
+                }
+            });
+        },
+        getThirdMerchantBizList: function() {
+            $.get("../thirdmerchantbiz/queryAll", function (r) {
+                vm.thirdMerchantBizList = r.list;
+            });
+        },
+        changeStore: function (option) {
+            var thirdMerchSn = option.value;
+            if(thirdMerchSn){
+                vm.getStoreList(thirdMerchSn);
+            }
+        },
+        getStoreList: function(thirdMerchSn){
+            $.get("../store/queryAll?thirdMerchSn=" + thirdMerchSn, function (r) {
+                vm.storeList = r.list;
+            });
+        },
+        reloadSearch: function() {
+            vm.q = {
+                campName: '',
+                isPast:''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+            vm.showList = true;
+            vm.showViewList = false;
+            vm.showInfoList = true;
+            vm.updateGoodsList = true;
+            vm.showStoreGoodsList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'campName': vm.q.campName,"isPast":vm.q.isPast},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        /**
+         * 详情页返回
+         * @param event
+         */
+        reloadInfoBack: function (event) {
+            vm.showList = true;
+            vm.showViewList = false;
+            vm.showInfoList = true;
+            vm.updateGoodsList = true;
+            vm.showStoreGoodsList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'campName': vm.q.campName,"isPast":vm.q.isPast},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        handleSuccessAdvImgUrl: function (res, file) {
+            vm.mkStoreCampMinus.advImgUrl = file.response.url;
+        },
+        handleFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
+            });
+        },
+        handleMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
+            });
+        },
+        eyeImageAdvImgUrl: function () {
+            var url = vm.mkStoreCampMinus.advImgUrl;
+            eyeImage(url);
+        },
+        /**
+         * 减免活动类型联动 00:满x元减,01:满x件减,10:满x元折,11:满x件折,减免活动类型为00,01时,减免方式必选
+         * @param value
+         */
+        chanCampMinusType: function (value) {
+            if(value == '00'){
+                vm.campMinusType = '00';
+                vm.isMinusShow = true;
+                vm.isUnitAttrShow = true;
+                vm.isPieceAttrShow = false;
+                vm.isDiscUnitAttrShow = false;
+                vm.isDiscPieceAttrShow = false;
+                vm.isUnitMode10Show = false;
+                vm.isPieceMode10Show = false;
+                if(!vm.isOperatorShow){
+                    vm.mkStoreCampMinus.minusMode='00';
+                }
+            }
+            if(value == '01'){
+                vm.campMinusType = '01';
+                vm.isMinusShow = true;
+                vm.isUnitAttrShow = false;
+                vm.isPieceAttrShow = true;
+                vm.isDiscUnitAttrShow = false;
+                vm.isDiscPieceAttrShow = false;
+                vm.isUnitMode10Show = false;
+                vm.isPieceMode10Show = false;
+                if(!vm.isOperatorShow){
+                    vm.mkStoreCampMinus.minusMode='00';
+                }
+            }
+            if(value == '10'){
+                vm.campMinusType = '10';
+                vm.isMinusShow = false;
+                vm.isUnitAttrShow = false;
+                vm.isPieceAttrShow = false;
+                vm.isDiscUnitAttrShow = true;
+                vm.isDiscPieceAttrShow = false;
+                vm.isUnitMode10Show = false;
+                vm.isPieceMode10Show = false;
+            }
+            if(value == '11'){
+                vm.campMinusType = '11';
+                vm.isMinusShow = false;
+                vm.isUnitAttrShow = false;
+                vm.isPieceAttrShow = false;
+                vm.isDiscUnitAttrShow = false;
+                vm.isDiscPieceAttrShow = true;
+                vm.isUnitMode10Show = false;
+                vm.isPieceMode10Show = false;
+            }
+        },
+        /**
+         * 减免方式联动 00:满足最高层级减一次,10:每满一次减一次
+         * @param value
+         */
+        chanMinusMode: function (value) {
+            //满x元减,满足最高层级减一次
+            if(value == '00' && vm.campMinusType == '00'){
+                vm.minusModeType = '00';
+                vm.isMinusShow = true;
+                vm.isUnitAttrShow = true;
+                vm.isPieceAttrShow = false;
+                vm.isDiscUnitAttrShow = false;
+                vm.isDiscPieceAttrShow = false;
+                vm.isUnitMode10Show = false;
+                vm.isPieceMode10Show = false;
+            }
+            if(value == '00' && vm.campMinusType == '01'){
+                vm.minusModeType = '00';
+                vm.isMinusShow = true;
+                vm.isUnitAttrShow = false;
+                vm.isPieceAttrShow = true;
+                vm.isDiscUnitAttrShow = false;
+                vm.isDiscPieceAttrShow = false;
+                vm.isUnitMode10Show = false;
+                vm.isPieceMode10Show = false;
+            }
+            if(value == '10' && vm.campMinusType == '00'){
+                vm.minusModeType = '10';
+                vm.isMinusShow = true;
+                vm.isUnitAttrShow = false;
+                vm.isPieceAttrShow = false;
+                vm.isDiscUnitAttrShow = false;
+                vm.isDiscPieceAttrShow = false;
+                vm.isUnitMode10Show = true;
+                vm.isPieceMode10Show = false;
+            }
+            if(value == '10' && vm.campMinusType == '01'){
+                vm.minusModeType = '10';
+                vm.isMinusShow = true;
+                vm.isUnitAttrShow = false;
+                vm.isPieceAttrShow = false;
+                vm.isDiscUnitAttrShow = false;
+                vm.isDiscPieceAttrShow = false;
+                vm.isUnitMode10Show = false;
+                vm.isPieceMode10Show = true;
+            }
+        },
+        addAttrRow1: function () {
+            if(vm.minusTypeUnitAttrList.length <10){
+                vm.minusTypeUnitAttrList.push({'yuanMinusCond': '', 'yuanMinusPref': '', 'isDelete': 0});
+            }
+        },
+        delAttrRow1: function (index) {
+            //最后一行时禁止删除
+            if (vm.minusTypeUnitAttrList.length == 1) {
+                return;
+            }
+            vm.minusTypeUnitAttrList[index].isDelete = 1;
+            var minusTypeUnitAttrList = [];
+            for(var i=0;i<vm.minusTypeUnitAttrList.length;i++){
+                if(vm.minusTypeUnitAttrList[i].isDelete == 0){
+                    minusTypeUnitAttrList.push(vm.minusTypeUnitAttrList[i]);
+                }
+            }
+            vm.minusTypeUnitAttrList = minusTypeUnitAttrList;
+        },
+        addAttrRow2: function () {
+            if(vm.minusTypePieceAttrList.length <10) {
+                vm.minusTypePieceAttrList.push({'pieceMinusConf': '', 'pieceMinusPref': '', 'isDelete': 0});
+            }
+        },
+        delAttrRow2: function (index) {
+            //最后一行时禁止删除
+            if (vm.minusTypePieceAttrList.length == 1) {
+                return;
+            }
+            vm.minusTypePieceAttrList[index].isDelete = 1;
+            var minusTypePieceAttrList = [];
+            for(var i=0;i<vm.minusTypePieceAttrList.length;i++){
+                if(vm.minusTypePieceAttrList[i].isDelete == 0){
+                    minusTypePieceAttrList.push(vm.minusTypePieceAttrList[i]);
+                }
+            }
+            vm.minusTypePieceAttrList = minusTypePieceAttrList;
+        },
+        addAttrRow3: function () {
+            if(vm.minusTypeDiscUnitAttrList.length <10) {
+                vm.minusTypeDiscUnitAttrList.push({'yuanDiscCond': '', 'yuanDiscPref': '', 'isDelete': 0});
+            }
+        },
+        delAttrRow3: function (index) {
+            //最后一行时禁止删除
+            if (vm.minusTypeDiscUnitAttrList.length == 1) {
+                return;
+            }
+            vm.minusTypeDiscUnitAttrList[index].isDelete = 1;
+            var minusTypeDiscUnitAttrList = [];
+            for(var i=0;i<vm.minusTypeDiscUnitAttrList.length;i++){
+                if(vm.minusTypeDiscUnitAttrList[i].isDelete == 0){
+                    minusTypeDiscUnitAttrList.push(vm.minusTypeDiscUnitAttrList[i]);
+                }
+            }
+            vm.minusTypeDiscUnitAttrList = minusTypeDiscUnitAttrList;
+        },
+        addAttrRow4: function () {
+            if(vm.minusTypeDiscPieceAttrList.length <10) {
+                vm.minusTypeDiscPieceAttrList.push({'pieceDiscConf': '', 'pieceDiscPref': '', 'isDelete': 0});
+            }
+        },
+        delAttrRow4: function (index) {
+            //最后一行时禁止删除
+            if (vm.minusTypeDiscPieceAttrList.length == 1) {
+                return;
+            }
+            vm.minusTypeDiscPieceAttrList[index].isDelete = 1;
+            var minusTypeDiscUnitAttrList = [];
+            for(var i=0;i<vm.minusTypeDiscPieceAttrList.length;i++){
+                if(vm.minusTypeDiscPieceAttrList[i].isDelete == 0){
+                    minusTypeDiscUnitAttrList.push(vm.minusTypeDiscPieceAttrList[i]);
+                }
+            }
+            vm.minusTypeDiscPieceAttrList = minusTypeDiscPieceAttrList;
+        },
+        checkNumber: function(value) {
+            var re = /^\d+(\.\d{1,2})?$/;
+            if (value != "") {
+                if (!re.test(value)) {
+                    return false;
+                }
+            }
+            return true;
+        },
+        checkList: function (list, value) {
+            for(var i=0; i < list.length; i++){
+                if(list[i] != null && list[i] != undefined && list[i] != ''){
+                    if(value >= list[i]){
+                        return false;
+                    }
+                }
+            }
+            return true;
+        },
+        /**
+         * 满元满减,校验【满元减条件】
+         * @param index 当前编辑的活动层级条件
+         */
+        checkCoudByUnitAttr: function (index) {
+            var minusTypeUnitAttrList = vm.minusTypeUnitAttrList;
+            var inputY = parseFloat(minusTypeUnitAttrList[index].yuanMinusCond);
+            if(minusTypeUnitAttrList[index].yuanMinusCond == ''){
+                $("#"+(index+'unit')).html('* 不能为空');
+                vm.isValidationByUnit = false;
+                return;
+            }else {
+                //先把非数字的都替换掉,除了数字和.
+                minusTypeUnitAttrList[index].yuanMinusCond = minusTypeUnitAttrList[index].yuanMinusCond.replace(/[^\d.]/g,"");
+                //必须保证第一个为数字而不是.
+                minusTypeUnitAttrList[index].yuanMinusCond = minusTypeUnitAttrList[index].yuanMinusCond.replace(/^\./g,"");
+                //保证只有出现一个.而没有多个.
+                minusTypeUnitAttrList[index].yuanMinusCond = minusTypeUnitAttrList[index].yuanMinusCond.replace(/\.{2,}/g,".");
+                //保证.只出现一次,而不能出现两次以上
+                minusTypeUnitAttrList[index].yuanMinusCond = minusTypeUnitAttrList[index].yuanMinusCond.replace(".","$#$").replace(/\./g,"").replace("$#$",".");
+
+                minusTypeUnitAttrList[index].yuanMinusCond = minusTypeUnitAttrList[index].yuanMinusCond.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');//只能输入两个小数
+                if(minusTypeUnitAttrList[index].yuanMinusCond.indexOf(".")< 0 && minusTypeUnitAttrList[index].yuanMinusCond !=""){//以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额
+                    minusTypeUnitAttrList[index].yuanMinusCond= parseFloat(minusTypeUnitAttrList[index].yuanMinusCond)+'';
+                }
+                var re = /^\d+(\.\d{1,2})?$/
+                if (!re.test(vm.minusTypeUnitAttrList[index].yuanMinusCond)) {
+                    $("#"+(index+'unit')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByUnit = false;
+                    return;
+                }else{
+                    $("#"+(index+'unit')).html('');
+                    vm.isValidationByUnit = true;
+                }
+            }
+            if(minusTypeUnitAttrList[0].yuanMinusCond != null){
+                for (var i = 0; i < minusTypeUnitAttrList.length; i++) {
+                    if(minusTypeUnitAttrList[i].yuanMinusCond != ''){
+                        //下层比较
+                        if(index<i){
+                            // console.log(index+"<="+i+";输入:"+inputY+"<比较"+minusTypeUnitAttrList[i].yuanMinusCond);
+                            if(inputY >= minusTypeUnitAttrList[i].yuanMinusCond && minusTypeUnitAttrList[i].yuanMinusCond != ''){
+                                // console.log("下层比较,不满足条件1:"+(index+10));
+                                $("#"+(index+'unit')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'unit')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByUnit = false;
+                            }
+                            if(inputY < minusTypeUnitAttrList[i].yuanMinusCond && minusTypeUnitAttrList[i].yuanMinusCond != ''){
+                                if(minusTypeUnitAttrList.length > 1){
+                                    var yuanMinusCond = '';
+                                    if((i+1) == minusTypeUnitAttrList.length){
+                                        yuanMinusCond = '';
+                                    }else{
+                                        yuanMinusCond = minusTypeUnitAttrList[i+1].yuanMinusCond;
+                                    }
+                                    // console.log("下层比较,"+minusTypeUnitAttrList[i].yuanMinusCond+">"+(i+1)+"层比较:"+yuanMinusCond);
+                                    if(yuanMinusCond != '' && minusTypeUnitAttrList[i].yuanMinusCond >= parseFloat(yuanMinusCond)){
+                                        // console.log("下层比较,不满足条件1:"+(i+10));
+                                        $("#"+(i+'unit')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'unit')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByUnit = false;
+                                    }else {
+                                        // console.log("下层比较,满足条件1:"+(i+10));
+                                        $("#"+(i+'unit')).html('');
+                                        $("#"+(index+'unit')).html('');
+                                        vm.isValidationByUnit = true;
+                                    }
+                                }else{
+                                    // console.log("下层比较,满足条件1:"+(i+10));
+                                    $("#"+(i+'unit')).html('');
+                                    $("#"+(index+'unit')).html('');
+                                    vm.isValidationByUnit = true;
+                                }
+                            }
+                        }
+                        //上层比较
+                        if(index>i){
+                            // console.log(index+">"+i+";输入:"+inputY+">比较"+minusTypeUnitAttrList[i].yuanMinusCond);
+                            if(inputY <= minusTypeUnitAttrList[i].yuanMinusCond && minusTypeUnitAttrList[i].yuanMinusCond != ''){
+                                // console.log("上层比较,不满足条件2:"+(index+10));
+                                $("#"+(index+'unit')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'unit')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByUnit = false;
+                            }
+                            if(inputY > minusTypeUnitAttrList[i].yuanMinusCond && minusTypeUnitAttrList[i].yuanMinusCond != ''){
+                                if(minusTypeUnitAttrList.length > 1){
+                                    var yuanMinusCond = '';
+                                    if((i+1) == minusTypeUnitAttrList.length){
+                                        yuanMinusCond = '';
+                                    }else{
+                                        yuanMinusCond = minusTypeUnitAttrList[i+1].yuanMinusCond;
+                                    }
+                                    // console.log("上层比较,"+minusTypeUnitAttrList[i].yuanMinusCond+">"+(i+1)+"层比较:"+yuanMinusCond);
+                                    if(yuanMinusCond != '' && minusTypeUnitAttrList[i].yuanMinusCond >= parseFloat(yuanMinusCond)){
+                                        // console.log("上层比较,不满足条件1:"+(i+10));
+                                        $("#"+(i+'unit')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'unit')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByUnit = false;
+                                    }else {
+                                        // console.log("上层比较,满足条件2:"+(i+10));
+                                        $("#"+(i+'unit')).html('');
+                                        $("#"+(index+'unit')).html('');
+                                        vm.isValidationByUnit = true;
+                                    }
+                                }else{
+                                    // console.log("上层比较,满足条件2:"+(i+10));
+                                    $("#"+(i+'unit')).html('');
+                                    $("#"+(index+'unit')).html('');
+                                    vm.isValidationByUnit = true;
+                                }
+                            }
+                        }
+                    }else{
+                        $("#"+(index+'unit')).html('');
+                        vm.isValidationByUnit = true;
+                    }
+                }
+            }
+        },
+        /**
+         * 满元满减,校验【满元减优惠】
+         * @param index
+         */
+        checkYuanMinusPref: function (index) {
+            //先把非数字的都替换掉,除了数字和.
+            vm.minusTypeUnitAttrList[index].yuanMinusPref = vm.minusTypeUnitAttrList[index].yuanMinusPref.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/;
+            if (vm.minusTypeUnitAttrList[index].yuanMinusPref != '') {
+                if (!re.test(vm.minusTypeUnitAttrList[index].yuanMinusPref)) {
+                    $("#"+(index+'unit_pref')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByUnit = false;
+                }else if (vm.minusTypeUnitAttrList[index].yuanMinusPref<= 0) {
+                    $("#"+(index+'unit_pref')).html('* 不能小于等于0');
+                    vm.isValidationByUnit = false;
+                }else{
+                    $("#"+(index+'unit_pref')).html('');
+                    vm.isValidationByUnit = true;
+                }
+            }
+        },
+        /**
+         * 满件满减,校验【满件减条件】
+         * @param index 当前编辑的活动层级条件
+         */
+        checkCoudByPieceAttr: function (index) {
+            vm.minusTypePieceAttrList[index].pieceMinusConf = vm.minusTypePieceAttrList[index].pieceMinusConf.replace(/[^\d]/g,"");
+            var re = /^[+]{0,1}(\d+)$/;
+            if (vm.minusTypePieceAttrList[index].pieceMinusConf != '') {
+                if (!re.test(vm.minusTypePieceAttrList[index].pieceMinusConf)) {
+                    $("#"+(index+'piece_conf')).html('* 只允许输入大于等于0的整数');
+                    vm.isValidationByPiece = false;
+                }else if(vm.minusTypePieceAttrList[index].pieceMinusConf < 0){
+                    $("#"+(index+'piece_conf')).html('* 只允许输入大于等于0的整数');
+                    vm.isValidationByPiece = false;
+                }else{
+                    $("#"+(index+'piece_conf')).html('');
+                    vm.isValidationByPiece = true;
+                }
+
+                var minusTypePieceAttrList = vm.minusTypePieceAttrList;
+                var inputY = parseInt(minusTypePieceAttrList[index].pieceMinusConf);
+                for (var i = 0; i < minusTypePieceAttrList.length; i++) {
+                    if(minusTypePieceAttrList[i].pieceMinusConf != ''){
+                        //下层比较
+                        if(index<i){
+                            if(inputY >= minusTypePieceAttrList[i].pieceMinusConf && minusTypePieceAttrList[i].pieceMinusConf != ''){
+                                $("#"+(index+'piece_conf')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'piece_conf')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByPiece = false;
+                            }
+                            if(inputY < minusTypePieceAttrList[i].pieceMinusConf && minusTypePieceAttrList[i].pieceMinusConf != ''){
+                                if(minusTypePieceAttrList.length > 1){
+                                    var pieceMinusConf = '';
+                                    if((i+1) == minusTypePieceAttrList.length){
+                                        pieceMinusConf = '';
+                                    }else{
+                                        pieceMinusConf = minusTypePieceAttrList[i+1].pieceMinusConf;
+                                    }
+                                    if(pieceMinusConf != '' && minusTypePieceAttrList[i].pieceMinusConf >= parseInt(pieceMinusConf)){
+                                        $("#"+(i+'piece_conf')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'piece_conf')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByPiece = false;
+                                    }else {
+                                        $("#"+(i+'piece_conf')).html('');
+                                        $("#"+(index+'piece_conf')).html('');
+                                        vm.isValidationByPiece = true;
+                                    }
+                                }else{
+                                    $("#"+(i+'piece_conf')).html('');
+                                    $("#"+(index+'piece_conf')).html('');
+                                    vm.isValidationByPiece = true;
+                                }
+                            }
+                        }
+                        //上层比较
+                        if(index>i){
+                            if(inputY <= minusTypePieceAttrList[i].pieceMinusConf && minusTypePieceAttrList[i].pieceMinusConf != ''){
+                                $("#"+(index+'piece_conf')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'piece_conf')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByPiece = false;
+                            }
+                            if(inputY > minusTypePieceAttrList[i].pieceMinusConf && minusTypePieceAttrList[i].pieceMinusConf != ''){
+                                if(minusTypePieceAttrList.length > 1){
+                                    var pieceMinusConf = '';
+                                    if((i+1) == minusTypePieceAttrList.length){
+                                        pieceMinusConf = '';
+                                    }else{
+                                        pieceMinusConf = minusTypePieceAttrList[i+1].pieceMinusConf;
+                                    }
+                                    if(pieceMinusConf != '' && minusTypePieceAttrList[i].pieceMinusConf >= parseInt(pieceMinusConf)){
+                                        $("#"+(i+'piece_conf')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'piece_conf')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByPiece = false;
+                                    }else {
+                                        $("#"+(i+'piece_conf')).html('');
+                                        $("#"+(index+'piece_conf')).html('');
+                                        vm.isValidationByPiece = true;
+                                    }
+                                }else{
+                                    $("#"+(i+'piece_conf')).html('');
+                                    $("#"+(index+'piece_conf')).html('');
+                                    vm.isValidationByPiece = true;
+                                }
+                            }
+                        }
+                    }else{
+                        $("#"+(index+'piece_conf')).html('');
+                        vm.isValidationByPiece = true;
+                    }
+                }
+            }
+        },
+        /**
+         * 满件满减,校验【满件减优惠】
+         * @param index
+         */
+        checkPieceMinusPref: function (index) {
+            vm.minusTypePieceAttrList[index].pieceMinusPref = vm.minusTypePieceAttrList[index].pieceMinusPref.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/
+            if (vm.minusTypePieceAttrList[index].pieceMinusPref != '') {
+                if (!re.test(vm.minusTypePieceAttrList[index].pieceMinusPref)) {
+                    $("#"+(index+'piece_pref')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByPiece = false;
+                }else if (vm.minusTypePieceAttrList[index].pieceMinusPref<= 0) {
+                    $("#"+(index+'piece_pref')).html('* 不能小于等于0');
+                    vm.isValidationByPiece = false;
+                }else{
+                    $("#"+(index+'piece_pref')).html('');
+                    vm.isValidationByPiece = true;
+                }
+            }
+        },
+        /**
+         * 满元满折,校验【满元折条件】
+         * @param index
+         */
+        checkYuanDiscCondByDiscUnit: function (index) {
+            vm.minusTypeDiscUnitAttrList[index].yuanDiscCond = vm.minusTypeDiscUnitAttrList[index].yuanDiscCond.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/
+            if (vm.minusTypeDiscUnitAttrList[index].yuanDiscCond != '') {
+                if (!re.test(vm.minusTypeDiscUnitAttrList[index].yuanDiscCond)) {
+                    $("#"+(index+'disc_unit_cond')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByDiscUnit = false;
+                }else if (vm.minusTypeDiscUnitAttrList[index].yuanDiscCond< 0) {
+                    $("#"+(index+'disc_unit_cond')).html('* 不能小于0');
+                    vm.isValidationByDiscUnit = false;
+                }else{
+                    $("#"+(index+'disc_unit_cond')).html('');
+                    vm.isValidationByDiscUnit = true;
+                }
+
+                var minusTypeDiscUnitAttrList = vm.minusTypeDiscUnitAttrList;
+                var inputY = parseFloat(minusTypeDiscUnitAttrList[index].yuanDiscCond);
+                for (var i = 0; i < minusTypeDiscUnitAttrList.length; i++) {
+                    if(minusTypeDiscUnitAttrList[i].yuanDiscCond != ''){
+                        //下层比较
+                        if(index<i){
+                            if(inputY >= minusTypeDiscUnitAttrList[i].yuanDiscCond && minusTypeDiscUnitAttrList[i].yuanDiscCond != ''){
+                                $("#"+(index+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByDiscUnit = false;
+                            }
+                            if(inputY < minusTypeDiscUnitAttrList[i].yuanDiscCond && minusTypeDiscUnitAttrList[i].yuanDiscCond != ''){
+                                if(minusTypeDiscUnitAttrList.length > 1){
+                                    var yuanDiscCond = '';
+                                    if((i+1) == minusTypeDiscUnitAttrList.length){
+                                        yuanDiscCond = '';
+                                    }else{
+                                        yuanDiscCond = minusTypeDiscUnitAttrList[i+1].yuanDiscCond;
+                                    }
+                                    if(yuanDiscCond != '' && minusTypeDiscUnitAttrList[i].yuanDiscCond >= parseFloat(yuanDiscCond)){
+                                        $("#"+(i+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByDiscUnit = false;
+                                    }else {
+                                        $("#"+(i+'disc_unit_cond')).html('');
+                                        $("#"+(index+'disc_unit_cond')).html('');
+                                        vm.isValidationByDiscUnit = true;
+                                    }
+                                }else{
+                                    $("#"+(i+'disc_unit_cond')).html('');
+                                    $("#"+(index+'disc_unit_cond')).html('');
+                                    vm.isValidationByDiscUnit = true;
+                                }
+                            }
+                        }
+                        //上层比较
+                        if(index>i){
+                            if(inputY <= minusTypeDiscUnitAttrList[i].yuanDiscCond && minusTypeDiscUnitAttrList[i].yuanDiscCond != ''){
+                                $("#"+(index+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByDiscUnit = false;
+                            }
+                            if(inputY > minusTypeDiscUnitAttrList[i].yuanDiscCond && minusTypeDiscUnitAttrList[i].yuanDiscCond != ''){
+                                if(minusTypeDiscUnitAttrList.length > 1){
+                                    var yuanDiscCond = '';
+                                    if((i+1) == minusTypeDiscUnitAttrList.length){
+                                        yuanDiscCond = '';
+                                    }else{
+                                        yuanDiscCond = minusTypeDiscUnitAttrList[i+1].yuanDiscCond;
+                                    }
+                                    if(yuanDiscCond != '' && minusTypeDiscUnitAttrList[i].yuanDiscCond >= parseFloat(yuanDiscCond)){
+                                        $("#"+(i+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'disc_unit_cond')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByDiscUnit = false;
+                                    }else {
+                                        $("#"+(i+'disc_unit_cond')).html('');
+                                        $("#"+(index+'disc_unit_cond')).html('');
+                                        vm.isValidationByDiscUnit = true;
+                                    }
+                                }else{
+                                    $("#"+(i+'disc_unit_cond')).html('');
+                                    $("#"+(index+'disc_unit_cond')).html('');
+                                    vm.isValidationByDiscUnit = true;
+                                }
+                            }
+                        }
+                    }else{
+                        $("#"+(index+'disc_unit_cond')).html('');
+                        vm.isValidationByDiscUnit = true;
+                    }
+                }
+            }
+        },
+        /**
+         * 满元满折,校验【满元折优惠】
+         * @param index
+         */
+        checkYuanDiscPrefByDiscUnit: function (index) {
+            vm.minusTypeDiscUnitAttrList[index].yuanDiscPref = vm.minusTypeDiscUnitAttrList[index].yuanDiscPref.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,1})?$/
+            if (vm.minusTypeDiscUnitAttrList[index].yuanDiscPref != '') {
+                if (!re.test(vm.minusTypeDiscUnitAttrList[index].yuanDiscPref)) {
+                    $("#"+(index+'disc_unit_pref')).html('* 最多只保留小数点后1位的正数');
+                    vm.isValidationByDiscUnit = false;
+                }else if(vm.minusTypeDiscUnitAttrList[index].yuanDiscPref > 10){
+                    $("#"+(index+'disc_unit_pref')).html('* 请输入不大于 10 的数值');
+                    vm.isValidationByDiscUnit = false;
+                }else if(vm.minusTypeDiscUnitAttrList[index].yuanDiscPref <= 0){
+                    $("#"+(index+'disc_unit_pref')).html('* 数值不能小于等于0');
+                    vm.isValidationByDiscUnit = false;
+                }else{
+                    $("#"+(index+'disc_unit_pref')).html('');
+                    vm.isValidationByDiscUnit = true;
+                }
+            }
+        },
+        /**
+         * 满件满折,校验【满件折条件】
+         * @param index
+         */
+        checkConfByDiscPiece: function (index) {
+            vm.minusTypeDiscPieceAttrList[index].pieceDiscConf = vm.minusTypeDiscPieceAttrList[index].pieceDiscConf.replace(/[^\d]/g,"");
+            var re = /^[+]{0,1}(\d+)$/;
+            if (vm.minusTypeDiscPieceAttrList[index].pieceDiscConf != '') {
+                if (!re.test(vm.minusTypeDiscPieceAttrList[index].pieceDiscConf)) {
+                    $("#"+(index+'piece_disc_conf')).html('* 只允许输入大于等于0的整数');
+                    vm.isValidationByDiscPiece = false;
+                }else if(vm.minusTypeDiscPieceAttrList[index].pieceDiscConf < 0){
+                    $("#"+(index+'piece_disc_conf')).html('* 只允许输入大于等于0的整数');
+                    vm.isValidationByDiscPiece = false;
+                }else{
+                    $("#"+(index+'piece_disc_conf')).html('');
+                    vm.isValidationByDiscPiece = true;
+                }
+
+                var minusTypeDiscPieceAttrList = vm.minusTypeDiscPieceAttrList;
+                var inputY = parseInt(minusTypeDiscPieceAttrList[index].pieceDiscConf);
+                for (var i = 0; i < minusTypeDiscPieceAttrList.length; i++) {
+                    if(minusTypeDiscPieceAttrList[i].pieceDiscConf != ''){
+                        //下层比较
+                        if(index<i){
+                            if(inputY >= minusTypeDiscPieceAttrList[i].pieceDiscConf && minusTypeDiscPieceAttrList[i].pieceDiscConf != ''){
+                                $("#"+(index+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByDiscPiece = false;
+                            }
+                            if(inputY < minusTypeDiscPieceAttrList[i].pieceDiscConf && minusTypeDiscPieceAttrList[i].pieceDiscConf != ''){
+                                if(minusTypeDiscPieceAttrList.length > 1){
+                                    var pieceDiscConf = '';
+                                    if((i+1) == minusTypeDiscPieceAttrList.length){
+                                        pieceDiscConf = '';
+                                    }else{
+                                        pieceDiscConf = minusTypeDiscPieceAttrList[i+1].pieceDiscConf;
+                                    }
+                                    if(pieceDiscConf != '' && minusTypeDiscPieceAttrList[i].pieceDiscConf >= parseInt(pieceDiscConf)){
+                                        $("#"+(i+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByDiscPiece = false;
+                                    }else {
+                                        $("#"+(i+'piece_disc_conf')).html('');
+                                        $("#"+(index+'piece_disc_conf')).html('');
+                                        vm.isValidationByDiscPiece = true;
+                                    }
+                                }else{
+                                    $("#"+(i+'piece_disc_conf')).html('');
+                                    $("#"+(index+'piece_disc_conf')).html('');
+                                    vm.isValidationByDiscPiece = true;
+                                }
+                            }
+                        }
+                        //上层比较
+                        if(index>i){
+                            if(inputY <= minusTypeDiscPieceAttrList[i].pieceDiscConf && minusTypeDiscPieceAttrList[i].pieceDiscConf != ''){
+                                $("#"+(index+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                $("#"+(i+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                vm.isValidationByDiscPiece = false;
+                            }
+                            if(inputY > minusTypeDiscPieceAttrList[i].pieceDiscConf && minusTypeDiscPieceAttrList[i].pieceDiscConf != ''){
+                                if(minusTypeDiscPieceAttrList.length > 1){
+                                    var pieceDiscConf = '';
+                                    if((i+1) == minusTypeDiscPieceAttrList.length){
+                                        pieceDiscConf = '';
+                                    }else{
+                                        pieceDiscConf = minusTypeDiscPieceAttrList[i+1].pieceDiscConf;
+                                    }
+                                    if(pieceDiscConf != '' && minusTypeDiscPieceAttrList[i].pieceDiscConf >= parseInt(pieceDiscConf)){
+                                        $("#"+(i+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                        $("#"+(index+'piece_disc_conf')).html('* 层级必须递增且不可相同');
+                                        vm.isValidationByDiscPiece = false;
+                                    }else {
+                                        $("#"+(i+'piece_disc_conf')).html('');
+                                        $("#"+(index+'piece_disc_conf')).html('');
+                                        vm.isValidationByDiscPiece = true;
+                                    }
+                                }else{
+                                    $("#"+(i+'piece_disc_conf')).html('');
+                                    $("#"+(index+'piece_disc_conf')).html('');
+                                    vm.isValidationByDiscPiece = true;
+                                }
+                            }
+                        }
+                    }else{
+                        $("#"+(index+'piece_disc_conf')).html('');
+                        vm.isValidationByDiscPiece = true;
+                    }
+                }
+
+            }else {
+                $("#"+(index+'piece_disc_conf')).html('* 不能为空');
+                vm.isValidationByDiscPiece = false;
+            }
+        },
+        /**
+         * 满件满折,校验【满件折优惠】
+         * @param index
+         */
+        checkPrefByDiscPiece: function (index) {
+            vm.minusTypeDiscPieceAttrList[index].pieceDiscPref = vm.minusTypeDiscPieceAttrList[index].pieceDiscPref.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,1})?$/
+            if (vm.minusTypeDiscPieceAttrList[index].pieceDiscPref != '') {
+                if (!re.test(vm.minusTypeDiscPieceAttrList[index].pieceDiscPref)) {
+                    $("#"+(index+'piece_disc_ref')).html('* 最多只保留小数点后1位的正数');
+                    vm.isValidationByDiscPiece = false;
+                }else if(vm.minusTypeDiscPieceAttrList[index].pieceDiscPref > 10){
+                    $("#"+(index+'piece_disc_ref')).html('* 请输入不大于 10 的数值');
+                    vm.isValidationByDiscPiece = false;
+                }else if(vm.minusTypeDiscPieceAttrList[index].pieceDiscPref <= 0){
+                    $("#"+(index+'piece_disc_ref')).html('* 数值不能小于等于0');
+                    vm.isValidationByDiscPiece = false;
+                }else{
+                    $("#"+(index+'piece_disc_ref')).html('');
+                    vm.isValidationByDiscPiece = true;
+                }
+            }
+        },
+        /**
+         * 满元满减,且减免类型为每满一次减一次,校验【满元减条件】
+         * @param index
+         */
+        checkYuanCondByMode: function (index) {
+            vm.minusTypeUnitMode10List[index].yuanMinusCond = vm.minusTypeUnitMode10List[index].yuanMinusCond.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/
+            if (vm.minusTypeUnitMode10List[index].yuanMinusCond != '') {
+                if (!re.test(vm.minusTypeUnitMode10List[index].yuanMinusCond)) {
+                    $("#"+(index+'unit_mode')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByUnitMode = false;
+                }else if (vm.minusTypeUnitMode10List[index].yuanMinusCond<= 0) {
+                    $("#"+(index+'unit_mode')).html('* 不能小于等于0');
+                    vm.isValidationByUnitMode = false;
+                }else{
+                    $("#"+(index+'unit_mode')).html('');
+                    vm.isValidationByUnitMode = true;
+                }
+            }
+        },
+        /**
+         * 满元满减,且减免类型为每满一次减一次,校验【满元减优惠】
+         * @param index
+         */
+        checkYuanPrefByMode: function (index) {
+            vm.minusTypeUnitMode10List[index].yuanMinusPref = vm.minusTypeUnitMode10List[index].yuanMinusPref.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/
+            if (vm.minusTypeUnitMode10List[index].yuanMinusPref != '') {
+                if (!re.test(vm.minusTypeUnitMode10List[index].yuanMinusPref)) {
+                    $("#"+(index+'unit_mode_pref')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByUnitMode = false;
+                }else if (vm.minusTypeUnitMode10List[index].yuanMinusPref<= 0) {
+                    $("#"+(index+'unit_mode_pref')).html('* 不能小于等于0');
+                    vm.isValidationByUnitMode = false;
+                }else{
+                    $("#"+(index+'unit_mode_pref')).html('');
+                    vm.isValidationByUnitMode = true;
+                }
+            }
+        },
+        /**
+         * 满元满减,且减免类型为每满一次减一次,校验【每人最多】
+         * @param index
+         */
+        checkEachDiscByUnitMode: function (index) {
+            vm.minusTypeUnitMode10List[index].pieceMinusEachDisc = vm.minusTypeUnitMode10List[index].pieceMinusEachDisc.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/
+            if (vm.minusTypeUnitMode10List[index].pieceMinusEachDisc != '') {
+                if (!re.test(vm.minusTypeUnitMode10List[index].pieceMinusEachDisc)) {
+                    $("#"+(index+'unit_mode_each')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByUnitMode = false;
+                }else if (vm.minusTypeUnitMode10List[index].pieceMinusEachDisc< 0) {
+                    $("#"+(index+'unit_mode_each')).html('* 不能小于0');
+                    vm.isValidationByUnitMode = false;
+                }else{
+                    $("#"+(index+'unit_mode_each')).html('');
+                    vm.isValidationByUnitMode = true;
+                }
+            }
+        },
+        /**
+         * 满件满减,且减免类型为每满一次减一次,校验【满件减条件】
+         * @param index
+         */
+        checkPieceConfByMode: function (index) {
+            vm.minusTypePieceMode10List[index].pieceMinusConf = vm.minusTypePieceMode10List[index].pieceMinusConf.replace(/[^\d]/g,"");
+            var re = /^[+]{0,1}(\d+)$/;
+            if (vm.minusTypePieceMode10List[index].pieceMinusConf != '') {
+                if (!re.test(vm.minusTypePieceMode10List[index].pieceMinusConf)) {
+                    $("#"+(index+'piece_mode')).html('* 只允许输入大于0的整数');
+                    vm.isValidationByPieceMode = false;
+                }else if(vm.minusTypePieceMode10List[index].pieceMinusConf <= 0){
+                    $("#"+(index+'piece_mode')).html('* 只允许输入大于0的整数');
+                    vm.isValidationByPieceMode = false;
+                }else{
+                    $("#"+(index+'piece_mode')).html('');
+                    vm.isValidationByPieceMode = true;
+                }
+            }
+        },
+        /**
+         * 满件满减,且减免类型为每满一次减一次,校验【满件减优惠】
+         * @param index
+         */
+        checkPiecePrefByMode: function (index) {
+            vm.minusTypePieceMode10List[index].pieceMinusPref = vm.minusTypePieceMode10List[index].pieceMinusPref.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/
+            if (vm.minusTypePieceMode10List[index].pieceMinusPref != '') {
+                if (!re.test(vm.minusTypePieceMode10List[index].pieceMinusPref)) {
+                    $("#"+(index+'piece_mode_pref')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByPieceMode = false;
+                }else if (vm.minusTypePieceMode10List[index].pieceMinusPref<= 0) {
+                    $("#"+(index+'piece_mode_pref')).html('* 不能小于等于0');
+                    vm.isValidationByPieceMode = false;
+                }else{
+                    $("#"+(index+'piece_mode_pref')).html('');
+                    vm.isValidationByPieceMode = true;
+                }
+            }
+        },
+        /**
+         * 满件满减,且减免类型为每满一次减一次,校验【每人最多】
+         * @param index
+         */
+        checkEachDiscByPieceMode: function (index) {
+            vm.minusTypePieceMode10List[index].pieceMinusEachDisc = vm.minusTypePieceMode10List[index].pieceMinusEachDisc.replace(/[^\d.]/g,"");
+            var re = /^\d+(\.\d{1,2})?$/
+            if (vm.minusTypePieceMode10List[index].pieceMinusEachDisc != '') {
+                if (!re.test(vm.minusTypePieceMode10List[index].pieceMinusEachDisc)) {
+                    $("#"+(index+'piece_mode_each')).html('* 最多只保留小数点后2位的正数');
+                    vm.isValidationByPieceMode = false;
+                }else if (vm.minusTypePieceMode10List[index].pieceMinusEachDisc< 0) {
+                    $("#"+(index+'piece_mode_each')).html('* 不能小于0');
+                    vm.isValidationByPieceMode = false;
+                }else{
+                    $("#"+(index+'piece_mode_each')).html('');
+                    vm.isValidationByPieceMode = true;
+                }
+            }
+        },
+	},
+    mounted() {
+        $.get("../sys/macro/queryMacrosByValue?value=goodsBizType", function (r) {
+            vm.macros = r.list;
+        });
+
+    }
+});

+ 41 - 10
kmall-admin/src/main/webapp/js/mk/mkstoreprom.js

@@ -11,22 +11,24 @@ $(function () {
         url: '../mkstoreprom/list',
         datatype: "json",
         colModel: [
-            {label: '是否结束', name: 'isFinished', index: 'is_finished', width: 40, align: 'center',
+            {label: '活动状态', name: 'isFinished', index: 'is_finished', width: 40, align: 'center',
                 formatter: function (value) {
                     if (value == '0') {
                         return '<span style="font-weight: bolder;background: #B2AEBC;color: white;">已结束</span>';
                     } else if (value == '1') {
                         return '<span style="font-weight: bolder;background: #58d44d;color: white">进行中</span>';
+                    } else if (value == '2') {
+                        return '<span style="font-weight: bolder;background: red;color: white">未开始</span>';
                     }
                     return '';
                 }},
             {
-                label: '活动图片', name: 'promPicUrl', index: 'promPicUrl', width: 60,
+                label: '活动图片', name: 'promPicUrl', index: 'promPicUrl', width: 40, align: 'center',
                 formatter: function (value) {
-                    return transImgBy100(value);
+                    return transImg(value);
                 }
             },
-			{label: '推广信息', name: 'promInfo', width: 210, align: 'left'},
+			{label: '推广信息', name: 'promInfo', width: 160, align: 'left'},
             {label: '推广ID', name: 'promId', index: 'prom_id', key: true, width: 40, align: 'center'},
             {label: '所属门店', name: 'storeName', index: 'storeName', width: 70, align: 'center'},
 			{label: '推广分类', name: 'promType', index: 'prom_type', width: 80, align: 'center',
@@ -39,9 +41,9 @@ $(function () {
                     return '';
                 }},
 			{label: '推广渠道', name: 'promChnName', index: 'promChnName', width: 80, align: 'center'},
-            {label: '统计', name: 'promStat', index: 'promStat', width: 100, align: 'center'},
+            {label: '统计', name: 'promStat', index: 'promStat', width: 130, align: 'center'},
             {
-                label: '操作', width: 80, align: 'center', sortable: false, formatter: function (value, col, row) {
+                label: '操作', width: 120, align: 'center', sortable: false, formatter: function (value, col, row) {
                 let htmlStr = '';
                 if (row.isFinished == '0') {//已结束
                     htmlStr = "<button class='btn btn-outline btn-primary' " +
@@ -50,11 +52,17 @@ $(function () {
                         "onclick='vm.delById(" + row.promId + ")'><i class='fa fa-qrcode'></i>删除</button>";
                 }
                 if (row.isFinished == '1') {//进行中
-                    // htmlStr = "<button class='btn btn-outline btn-primary' " +
-                    //     "onclick='vm.qrcodeCanvas(" + row.goodsId + ",\""+ row.storeId +"\",\""+row.goodsMerchSn+"\",\""+row.merchSn+"\")'><i class='fa fa-qrcode'></i>二维码</button>";
                     htmlStr = "<button class='btn btn-outline btn-primary' " +
                         "onclick='vm.putOn(" + row.promId + ")'><i class='fa fa-qrcode'></i>投放</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
                         "<button class='btn btn-outline btn-primary' " +
+                        "onclick='vm.updateFinished(" + row.promId + ")'><i class='fa fa-qrcode'></i>立即结束</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                        "<button class='btn btn-outline btn-primary' " +
+                        "onclick='vm.updateById(" + row.promId + ")'><i class='fa fa-qrcode'></i>编辑</button>";
+                }
+                if (row.isFinished == '2') {//未开始
+                    htmlStr = "<button class='btn btn-outline btn-primary' " +
+                        "onclick='vm.updateStarted(" + row.promId + ")'><i class='fa fa-qrcode'></i>立即开始</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
+                        "<button class='btn btn-outline btn-primary' " +
                         "onclick='vm.updateById(" + row.promId + ")'><i class='fa fa-qrcode'></i>编辑</button>";
                 }
                 return htmlStr;
@@ -98,7 +106,7 @@ $(function () {
             //     }}
             ],
 		viewrecords: true,
-        height: 670,
+        height: 580,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,
@@ -175,7 +183,7 @@ let vm = new Vue({
             vm.thirdMerchantBizList = [];
             vm.storeList = [];
             vm.goodsList = [];
-			vm.mkStoreProm = {isPut:1,isFinished:1};
+			vm.mkStoreProm = {isPut:1};
             vm.isOperatorShow = false;
 			vm.getThirdMerchantBizList();
 		},
@@ -337,6 +345,29 @@ let vm = new Vue({
                 });
             });
         },
+        updateStarted: function (promId) {
+            if (promId == null){
+                return;
+            }
+
+            confirm('开始后,活动立即生效,确定要开始活动吗?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../mkstoreprom/updateStarted",
+                    contentType: "application/json",
+                    data: JSON.stringify(promId),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
         showInfo: function(promId){
 		    if(promId == null){
 		        return;

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkstorepromtype.js

@@ -15,7 +15,7 @@ $(function () {
 			{label: '修改时间', name: 'modTime', index: 'mod_time', width: 80},
 			{label: '时间戳', name: 'tstm', index: 'tstm', width: 80}],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 14 - 18
kmall-admin/src/main/webapp/js/mk/mkstoreticketdiscount.js

@@ -40,9 +40,11 @@ $(function () {
             {label: '状态', name: 'isPast', index: 'isPast', width: 60, align: 'center',
                 formatter: function (value) {
                     if (value == '0') {
-                        return '未过期';
+                        return '<span style="font-weight: bolder;background: #58d44d;color: white">进行中</span>';
                     } else if (value == '1') {
-                        return '已过期';
+                        return '<span style="font-weight: bolder;background: #B2AEBC;color: white;">已结束</span>';
+                    } else if (value == '2') {
+                        return '<span style="font-weight: bolder;background: red;color: white">未开始</span>';
                     }
                     return '';
                 }},
@@ -75,7 +77,7 @@ $(function () {
                 label: '操作', width: 180, align: 'center', sortable: false, formatter: function (value, col, row) {
                     let htmlStr = "";
                 // if (hasPermission('order:refund')) {}
-                    if(row.isPast == 0 && row.isValid == 0){
+                    if(row.isPast != 1 && row.isValid == 0){
                         htmlStr = "<button class='btn btn-outline btn-primary' " +
                             "onclick='vm.showInfo(" + row.tickDiscId + ")'><i class='fa fa-qrcode'></i>详情</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
                             "<button class='btn btn-outline btn-primary' " +
@@ -123,7 +125,7 @@ $(function () {
 			// {label: '发放方式 0:按订单发放 1:按用户发放(通用优惠券,用户点击领取) 2:商品转发送券 3:按商品发放 4:新用户注册 5:线下发放 6评价好评红包(固定或随机红包) 7包邮(不入会员优惠券表)', name: 'sendType', index: 'send_type', width: 80}
 			],
 		viewrecords: true,
-        height: 600,
+        height: 580,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,
@@ -155,36 +157,31 @@ $(function () {
             {label: '所属门店', name: 'storeName', index: 'storeName', width: 80, align: 'center'},
             {label: '优惠券码', name: 'couponNumber', index: 'couponNumber', width: 80, align: 'center'},
             {label: '领取人', name: 'nickname', index: 'nickname', width: 60, align: 'center'},
-            {
-                label: '领取时间', name: 'addTime', index: 'add_time', width: 120, align: 'center',
+            {label: '领取时间', name: 'addTime', index: 'add_time', width: 120, align: 'center',
                 formatter: function (value) {
                     // console.log(value);
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }
             },
-            {
-                label: '生效时间', name: 'validTime', index: 'validTime', width: 120, align: 'center',
+            {label: '生效时间', name: 'validTime', index: 'validTime', width: 120, align: 'center',
                 formatter: function (value) {
                     // console.log(value);
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }
             },
-            {
-                label: '更新时间', name: 'modTime', index: 'modTime', width: 120, align: 'center',
+            {label: '更新时间', name: 'modTime', index: 'modTime', width: 120, align: 'center',
                 formatter: function (value) {
                     // console.log(value);
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }
             },
-            {
-                label: '失效时间', name: 'endTime', index: 'endTime', width: 120, align: 'center',
+            {label: '失效时间', name: 'endTime', index: 'endTime', width: 120, align: 'center',
                 formatter: function (value) {
                     // console.log(value);
                     return transDate(value, 'yyyy-MM-dd hh:mm:ss');
                 }
             },
-            {
-                label: '状态', name: 'isUsed', index: 'isUsed', width: 60, align: 'center',
+            {label: '状态', name: 'isUsed', index: 'isUsed', width: 60, align: 'center',
                 formatter: function (value) {
                     if (value == '0') {
                         return '未使用';
@@ -552,7 +549,7 @@ let vm = new Vue({
         getGoodsList: function(storeId,goodsBizType){
             if(storeId){
                 $.get("../productstorerela/queryGoodsRealListByDiscountTid?storeId=" + storeId+"&goodsName="+vm.g.goodsName+"&guid="+vm.tid+"&applyType="+vm.applyType+"&goodsBizType="+goodsBizType
-                    +"&page="+1+"&limit="+vm.limit, function (r) {
+                    +"&promTypeId="+6+"&page="+1+"&limit="+vm.limit, function (r) {
                     // console.log(r)
                     if(r.code == 0){
                         vm.goodsList = r.page.list;
@@ -710,7 +707,6 @@ let vm = new Vue({
                 vm.showInfoList = true;
                 vm.tickDiscId = tickDiscId;
                 vm.showOrderList = false;
-                console.log(vm.tickDiscId)
                 let page = $("#jqGridOrder").jqGrid('getGridParam', 'page');
                 $("#jqGridOrder").jqGrid('setGridParam', {
                     postData: {'isUsed': vm.c.isUsed, 'tickDiscId': tickDiscId},
@@ -722,8 +718,8 @@ let vm = new Vue({
             vm.reloadOrder();
         },
         reloadOrderSearch: function() {
-            vm.o = {
-                orderStatus: ''
+            vm.c = {
+                isUsed: ''
             }
             vm.reloadOrder();
         },

+ 1 - 1
kmall-admin/src/main/webapp/js/mk/mkstoreticketdiscountgoods.js

@@ -15,7 +15,7 @@ $(function () {
 			{label: '修改时间', name: 'modTime', index: 'mod_time', width: 80},
 			{label: '时间戳', name: 'tstm', index: 'tstm', width: 80}],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 9 - 4
kmall-admin/src/main/webapp/js/mk/storetopic.js

@@ -25,12 +25,17 @@ $(function () {
             },
 			{label: '备注', name: 'note', index: 'note', width: 80},
 			{label: '创建人编号', name: 'createrSn', index: 'creater_sn', width: 80},
-			{label: '创建时间', name: 'createTime', index: 'create_time', width: 80},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 80,
+                formatter: function (value) {
+                    return transDate(value, 'yyyy-MM-dd hh:mm:ss');
+                }},
 			{label: '修改人编号', name: 'moderSn', index: 'moder_sn', width: 80},
-			{label: '修改时间', name: 'modTime', index: 'mod_time', width: 80},
-			{label: '时间戳', name: 'tstm', index: 'tstm', width: 80}],
+			{label: '修改时间', name: 'modTime', index: 'mod_time', width: 80,
+                formatter: function (value) {
+                    return transDate(value, 'yyyy-MM-dd hh:mm:ss');
+                }}],
 		viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

+ 1 - 1
kmall-admin/src/main/webapp/js/shop/ad.js

@@ -27,7 +27,7 @@ $(function () {
             }
             }],
         viewrecords: true,
-        height: 385,
+        height: 550,
         rowNum: 10,
         rowList: [10, 30, 50],
         rownumbers: true,

Some files were not shown because too many files changed in this diff