Bladeren bron

超级会员优惠加入sku

zhijiezhao 2 jaren geleden
bovenliggende
commit
d557f62b28

+ 19 - 1
src/main/java/com/caimei/modules/product/entity/CmSku.java

@@ -26,8 +26,26 @@ public class CmSku extends DataEntity<CmSku> {
     private Integer ladderPriceFlag;        // 启用阶梯价格标识 0否 1是
     private Integer minBuyNumber;        // 无阶梯价起订量
     private Double collagePrice;   //拼团价
-    private Double discountPrice;  //限时特价
+    private Double discountPrice;  //限时特价(在采美超级会员商品中指超级会员价)
     private List<CmLadderPrice> ladderPriceList;
+    private Double discount;       //超级会员会员折扣
+    private Integer priceType;     //超级会员价类型:1折扣,2优惠价
+
+    public Integer getPriceType() {
+        return priceType;
+    }
+
+    public void setPriceType(Integer priceType) {
+        this.priceType = priceType;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
 
     public Double getCollagePrice() {
         return collagePrice;

+ 9 - 0
src/main/java/com/caimei/modules/svip/dao/CmSvipProductDao.java

@@ -1,5 +1,6 @@
 package com.caimei.modules.svip.dao;
 
+import com.caimei.modules.product.entity.CmSku;
 import com.caimei.modules.product.entity.Product;
 import com.caimei.modules.svip.entity.CmSvipProductAdsImage;
 import com.thinkgem.jeesite.common.persistence.CrudDao;
@@ -26,4 +27,12 @@ public interface CmSvipProductDao extends CrudDao<CmSvipProduct> {
     CmSvipProductAdsImage getAdsImage();
 
     void saveAdsImage(CmSvipProductAdsImage adsImage);
+
+    void insertSkuPrice(CmSku s);
+
+    void deleteByProductId(Integer productId);
+
+    void deleteById(String id);
+
+    CmSku getSvipSku(Integer skuId);
 }

+ 22 - 1
src/main/java/com/caimei/modules/svip/entity/CmSvipProduct.java

@@ -2,6 +2,9 @@ package com.caimei.modules.svip.entity;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
+
+import com.caimei.modules.product.entity.CmSku;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
 import com.thinkgem.jeesite.common.persistence.DataEntity;
@@ -33,7 +36,25 @@ public class CmSvipProduct extends DataEntity<CmSvipProduct> {
 	private String costProportional;        // 比例成本百分比
 	private String costCheckFlag;        // 成本价选中标志:1固定成本 2比例成
 	private Integer svipPriceFlag;		//超级会员价标识
-	
+	private Integer status;            // 优惠状态 1已下架 0已上架
+	private List<CmSku> skus;        //商品sku
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public List<CmSku> getSkus() {
+		return skus;
+	}
+
+	public void setSkus(List<CmSku> skus) {
+		this.skus = skus;
+	}
+
 	public CmSvipProduct() {
 		super();
 	}

+ 21 - 2
src/main/java/com/caimei/modules/svip/service/CmSvipProductService.java

@@ -72,16 +72,31 @@ public class CmSvipProductService extends CrudService<CmSvipProductDao, CmSvipPr
 
     @Transactional(readOnly = false)
     public void save(CmSvipProduct cmSvipProduct) {
+        //保存/修改同步处理cm_svip_product_sku表数据
         if (cmSvipProduct.getIsNewRecord()) {
-            Integer priceType = null == cmSvipProduct.getDiscount() ? 2 : 1;
-            cmSvipProduct.setPriceType(priceType);
             cmSvipProduct.setSort(1);
+            cmSvipProduct.setStatus(1);
+        } else {
+            //删除旧sku价格,插入新的
+            cmSvipProductDao.deleteByProductId(cmSvipProduct.getProductId());
+        }
+        //保存不同sku的优惠折扣
+        List<CmSku> skus = cmSvipProduct.getSkus();
+        if(null!=skus&&skus.size()>0){
+            skus.forEach(s -> {
+                Integer priceType = null == s.getDiscount() ? 2 : 1;
+                s.setPriceType(priceType);
+                s.setProductId(cmSvipProduct.getProductId());
+                cmSvipProductDao.insertSkuPrice(s);
+            });
         }
         super.save(cmSvipProduct);
     }
 
     @Transactional(readOnly = false)
     public void delete(CmSvipProduct cmSvipProduct) {
+        //同时删除sku价格
+        cmSvipProductDao.deleteById(cmSvipProduct.getId());
         super.delete(cmSvipProduct);
     }
 
@@ -120,4 +135,8 @@ public class CmSvipProductService extends CrudService<CmSvipProductDao, CmSvipPr
     public void saveAdsImage(CmSvipProductAdsImage adsImage) {
         cmSvipProductDao.saveAdsImage(adsImage);
     }
+
+    public CmSku getSvipSku(Integer skuId) {
+        return cmSvipProductDao.getSvipSku(skuId);
+    }
 }

+ 145 - 124
src/main/java/com/caimei/modules/svip/web/CmSvipProductController.java

@@ -5,7 +5,10 @@ import javax.servlet.http.HttpServletResponse;
 
 import com.caimei.modules.live.entity.NewPageLiveAdvertisingImage;
 import com.caimei.modules.miniprogram.utils.UploadPicUtils;
+import com.caimei.modules.product.entity.CmSku;
 import com.caimei.modules.product.entity.Product;
+import com.caimei.modules.product.service.ProductService;
+import com.caimei.modules.svip.dao.CmSvipProductDao;
 import com.caimei.modules.svip.entity.CmSvipProductAdsImage;
 import com.caimei.utils.MathUtil;
 import com.google.common.collect.Maps;
@@ -27,12 +30,14 @@ import com.caimei.modules.svip.entity.CmSvipProduct;
 import com.caimei.modules.svip.service.CmSvipProductService;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 
 import static com.caimei.modules.newhome.web.NewPageQualitySupplierController.isInteger;
 
 /**
  * 超级会员优惠商品Controller
+ *
  * @author Aslee
  * @version 2021-09-23
  */
@@ -40,128 +45,144 @@ import static com.caimei.modules.newhome.web.NewPageQualitySupplierController.is
 @RequestMapping(value = "${adminPath}/svip/cmSvipProduct")
 public class CmSvipProductController extends BaseController {
 
-	@Autowired
-	private CmSvipProductService cmSvipProductService;
-	
-	@ModelAttribute
-	public CmSvipProduct get(@RequestParam(required=false) String id) {
-		CmSvipProduct entity = null;
-		if (StringUtils.isNotBlank(id)){
-			entity = cmSvipProductService.get(id);
-		}
-		if (entity == null){
-			entity = new CmSvipProduct();
-		}
-		return entity;
-	}
-
-	@RequestMapping(value = {"list", ""})
-	public String list(CmSvipProduct cmSvipProduct, HttpServletRequest request, HttpServletResponse response, Model model) {
-		Page<CmSvipProduct> page = cmSvipProductService.findPage(new Page<CmSvipProduct>(request, response), cmSvipProduct); 
-		model.addAttribute("page", page);
-		return "modules/svip/cmSvipProductList";
-	}
-
-	@RequestMapping(value = "form")
-	public String form(CmSvipProduct cmSvipProduct, Model model) {
-		model.addAttribute("cmSvipProduct", cmSvipProduct);
-		if ("2".equals(cmSvipProduct.getCostCheckFlag())) {
-			BigDecimal mul = MathUtil.mul(cmSvipProduct.getPrice(), new BigDecimal(cmSvipProduct.getCostProportional()));
-			cmSvipProduct.setCostPrice(MathUtil.mul(mul, new BigDecimal(0.01d)).toString());
-		}
-		return "modules/svip/cmSvipProductForm";
-	}
-
-	@RequestMapping(value = "save")
-	public String save(CmSvipProduct cmSvipProduct, Model model, RedirectAttributes redirectAttributes) {
-		if (!beanValidator(model, cmSvipProduct)){
-			return form(cmSvipProduct, model);
-		}
-		cmSvipProductService.save(cmSvipProduct);
-		addMessage(redirectAttributes, "保存商品成功");
-		return "redirect:"+Global.getAdminPath()+"/svip/cmSvipProduct/?repage";
-	}
-	
-	@RequestMapping(value = "delete")
-	public String delete(CmSvipProduct cmSvipProduct, RedirectAttributes redirectAttributes) {
-		cmSvipProductService.delete(cmSvipProduct);
-		addMessage(redirectAttributes, "删除商品成功");
-		return "redirect:"+Global.getAdminPath()+"/svip/cmSvipProduct/?repage";
-	}
-
-	@RequestMapping(value = "findProductPage")
-	public String findProductPage(Product product, Model model, HttpServletRequest request, HttpServletResponse response) {
-		Page<Product> page = cmSvipProductService.findProductPage(new Page<Product>(request, response), product);
-		model.addAttribute("page", page);
-		model.addAttribute("ids", product.getIds());
-		return "modules/svip/svipAddProduct";
-	}
-
-	/**
-	 * 批量更新排序值
-	 */
-	@RequestMapping(value = "batchSaveSort")
-	@ResponseBody
-	public Map<String, Object> batchSaveSort(String sortList) {
-		Map<String, Object> map = Maps.newLinkedHashMap();
-		try {
-			String[] svipProductList = sortList.split(",");
-			for (String list : svipProductList) {
-				String[] split = list.split("-");
-				if (split.length == 1 || split.length < 1) {
-					String id = split[0];
-					String sort = null;
-					cmSvipProductService.saveSort(sort, id);
-				} else {
-					String id = split[0];
-					String sort = split[1];
-					if (isInteger(sort)) {
-						if (StringUtils.equals("0", sort)) {
-							map.put("success", false);
-							map.put("msg", "排序值只能填写大于等于1的整数");
-							return map;
-						}
-						cmSvipProductService.saveSort(sort, id);
-					} else {
-						map.put("success", false);
-						map.put("msg", "排序值只能为数字");
-						return map;
-					}
-				}
-			}
-			map.put("success", true);
-			map.put("msg", "更新排序成功");
-			return map;
-		} catch (Exception e) {
-			e.printStackTrace();
-			map.put("success", false);
-			map.put("msg", "更新排序失败");
-			return map;
-		}
-	}
-
-	@RequestMapping(value = "adsImageForm")
-	public String adsImageForm(Model model){
-		CmSvipProductAdsImage cmSvipProductAdsImage = cmSvipProductService.getAdsImage();
-		model.addAttribute("adsImage", cmSvipProductAdsImage);
-		return "modules/svip/cmSvipProductAdsImageForm";
-	}
-
-	@RequestMapping(value = "saveAdsImage")
-	public String saveAdsImage(CmSvipProductAdsImage adsImage, Model model, RedirectAttributes redirectAttributes) {
-		if (StringUtils.isEmpty(adsImage.getPcImage())) {
-			model.addAttribute("errorMsg", "请上传PC端宣传图");
-			return adsImageForm(model);
-		} else if (StringUtils.isEmpty(adsImage.getAppletsImage())) {
-			model.addAttribute("errorMsg", "请上传小程序端宣传图");
-			return adsImageForm(model);
-		}
-		String pcImageUrl = UploadPicUtils.saveImageToServer(adsImage.getPcImage());
-		String appletsImageUrl = UploadPicUtils.saveImageToServer(adsImage.getAppletsImage());
-		adsImage.setPcImage(pcImageUrl);
-		adsImage.setAppletsImage(appletsImageUrl);
-		cmSvipProductService.saveAdsImage(adsImage);
-		addMessage(redirectAttributes, "保存成功");
-		return "redirect:"+Global.getAdminPath()+"/svip/cmSvipProduct/?repage";
-	}
+    @Autowired
+    private CmSvipProductService cmSvipProductService;
+
+    @Autowired
+    private ProductService productService;
+
+    @Autowired
+    private CmSvipProductDao vipDao;
+
+    @ModelAttribute
+    public CmSvipProduct get(@RequestParam(required = false) String id) {
+        CmSvipProduct entity = null;
+        if (StringUtils.isNotBlank(id)) {
+            entity = cmSvipProductService.get(id);
+        }
+        if (entity == null) {
+            entity = new CmSvipProduct();
+        }
+        return entity;
+    }
+
+    @RequestMapping(value = {"list", ""})
+    public String list(CmSvipProduct cmSvipProduct, HttpServletRequest request, HttpServletResponse response, Model model) {
+        Page<CmSvipProduct> page = cmSvipProductService.findPage(new Page<CmSvipProduct>(request, response), cmSvipProduct);
+        model.addAttribute("page", page);
+        return "modules/svip/cmSvipProductList";
+    }
+
+    @RequestMapping(value = "form")
+    public String form(CmSvipProduct cmSvipProduct, Model model) {
+        List<CmSku> skuList = productService.findSkuList(cmSvipProduct.getProductId());
+        if (null != skuList && skuList.size() > 0) {
+            skuList.forEach(s -> {
+                CmSku svipSku = cmSvipProductService.getSvipSku(s.getSkuId());
+                s.setDiscount(s.getDiscount());
+                s.setDiscountPrice(s.getDiscountPrice());
+                s.setPriceType(s.getPriceType());
+            });
+        }
+        cmSvipProduct.setSkus(skuList);
+        model.addAttribute("cmSvipProduct", cmSvipProduct);
+        if ("2".equals(cmSvipProduct.getCostCheckFlag())) {
+            BigDecimal mul = MathUtil.mul(cmSvipProduct.getPrice(), new BigDecimal(cmSvipProduct.getCostProportional()));
+            cmSvipProduct.setCostPrice(MathUtil.mul(mul, new BigDecimal(0.01d)).toString());
+        }
+        return "modules/svip/cmSvipProductForm";
+    }
+
+    @RequestMapping(value = "save")
+    public String save(CmSvipProduct cmSvipProduct, Model model, RedirectAttributes redirectAttributes) {
+        if (!beanValidator(model, cmSvipProduct)) {
+            return form(cmSvipProduct, model);
+        }
+        cmSvipProductService.save(cmSvipProduct);
+        addMessage(redirectAttributes, "保存商品成功");
+        return "redirect:" + Global.getAdminPath() + "/svip/cmSvipProduct/?repage";
+    }
+
+    @RequestMapping(value = "delete")
+    public String delete(CmSvipProduct cmSvipProduct, RedirectAttributes redirectAttributes) {
+        cmSvipProductService.delete(cmSvipProduct);
+        addMessage(redirectAttributes, "删除商品成功");
+        return "redirect:" + Global.getAdminPath() + "/svip/cmSvipProduct/?repage";
+    }
+
+    @RequestMapping(value = "findProductPage")
+    public String findProductPage(Product product, Model model, HttpServletRequest request, HttpServletResponse response) {
+        Page<Product> page = cmSvipProductService.findProductPage(new Page<Product>(request, response), product);
+        model.addAttribute("page", page);
+        model.addAttribute("ids", product.getIds());
+        return "modules/svip/svipAddProduct";
+    }
+
+    /**
+     * 批量更新排序值
+     */
+    @RequestMapping(value = "batchSaveSort")
+    @ResponseBody
+    public Map<String, Object> batchSaveSort(String sortList) {
+        Map<String, Object> map = Maps.newLinkedHashMap();
+        try {
+            String[] svipProductList = sortList.split(",");
+            for (String list : svipProductList) {
+                String[] split = list.split("-");
+                if (split.length == 1 || split.length < 1) {
+                    String id = split[0];
+                    String sort = null;
+                    cmSvipProductService.saveSort(sort, id);
+                } else {
+                    String id = split[0];
+                    String sort = split[1];
+                    if (isInteger(sort)) {
+                        if (StringUtils.equals("0", sort)) {
+                            map.put("success", false);
+                            map.put("msg", "排序值只能填写大于等于1的整数");
+                            return map;
+                        }
+                        cmSvipProductService.saveSort(sort, id);
+                    } else {
+                        map.put("success", false);
+                        map.put("msg", "排序值只能为数字");
+                        return map;
+                    }
+                }
+            }
+            map.put("success", true);
+            map.put("msg", "更新排序成功");
+            return map;
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("success", false);
+            map.put("msg", "更新排序失败");
+            return map;
+        }
+    }
+
+    @RequestMapping(value = "adsImageForm")
+    public String adsImageForm(Model model) {
+        CmSvipProductAdsImage cmSvipProductAdsImage = cmSvipProductService.getAdsImage();
+        model.addAttribute("adsImage", cmSvipProductAdsImage);
+        return "modules/svip/cmSvipProductAdsImageForm";
+    }
+
+    @RequestMapping(value = "saveAdsImage")
+    public String saveAdsImage(CmSvipProductAdsImage adsImage, Model model, RedirectAttributes redirectAttributes) {
+        if (StringUtils.isEmpty(adsImage.getPcImage())) {
+            model.addAttribute("errorMsg", "请上传PC端宣传图");
+            return adsImageForm(model);
+        } else if (StringUtils.isEmpty(adsImage.getAppletsImage())) {
+            model.addAttribute("errorMsg", "请上传小程序端宣传图");
+            return adsImageForm(model);
+        }
+        String pcImageUrl = UploadPicUtils.saveImageToServer(adsImage.getPcImage());
+        String appletsImageUrl = UploadPicUtils.saveImageToServer(adsImage.getAppletsImage());
+        adsImage.setPcImage(pcImageUrl);
+        adsImage.setAppletsImage(appletsImageUrl);
+        cmSvipProductService.saveAdsImage(adsImage);
+        addMessage(redirectAttributes, "保存成功");
+        return "redirect:" + Global.getAdminPath() + "/svip/cmSvipProduct/?repage";
+    }
 }

+ 52 - 23
src/main/resources/mappings/modules/svip/CmSvipProductMapper.xml

@@ -5,11 +5,12 @@
     <sql id="cmSvipProductColumns">
         a.id AS "id",
 		a.productId AS "productId",
-		a.priceType AS "priceType",
-		a.discount AS "discount",
-		a.discountPrice AS "discountPrice",
+		csps.priceType AS "priceType",
+		csps.discount AS "discount",
+		csps.discountPrice AS "discountPrice",
 		a.sort AS "sort",
 		a.addTime AS "addTime",
+        a.status as "status",
         p.mainImage as "productImage",
         p.name as "productName",
 		s.name as "shopName",
@@ -21,8 +22,9 @@
 
     <sql id="cmSvipProductJoins">
         left join product p on a.productId = p.productID
+        left join cm_svip_product_sku csps on a.productId=csps.productId
 		left join shop s on s.shopID = p.shopID
-	</sql>
+    </sql>
 
     <select id="get" resultType="CmSvipProduct">
         SELECT
@@ -74,10 +76,12 @@
             </otherwise>
         </choose>
     </select>
+
     <select id="findSvipProductIds" resultType="java.lang.Integer">
         select productId
         from cm_svip_product;
     </select>
+
     <select id="findAllProduct" resultType="com.caimei.modules.product.entity.Product">
         SELECT
         a.productId,a.mainImage,a.name,s.name AS "shopName"
@@ -85,7 +89,7 @@
         LEFT JOIN shop s on s.shopID = a.shopID
         <where>
             a.validFlag = '2' and a.productCategory = '1'
-             and a.productID not in (
+            and a.productID not in (
             select productId from cm_promotions_product cpp left join
             cm_promotions cp on cpp.promotionsId = cp.id where cp.delFlag != '2')
             and priceFlag != '1'
@@ -115,38 +119,51 @@
             </otherwise>
         </choose>
     </select>
+
     <select id="getAdsImage" resultType="com.caimei.modules.svip.entity.CmSvipProductAdsImage">
-        select id,pcImage,appletsImage from cm_svip_product_adsimage limit 1
+        select id, pcImage, appletsImage
+        from cm_svip_product_adsimage
+        limit 1
+    </select>
+
+    <select id="getSvipSku" resultType="com.caimei.modules.product.entity.CmSku">
+        SELECT csps.skuId,
+               ifnull(csps.priceType, 0)     as "priceType",
+               ifnull(csps.discount, 0)      as "discount",
+               ifnull(csps.discountPrice, 0) as "discountPrice"
+        FROM cm_svip_product_sku csps
+        where csps.skuId = #{skuId}
     </select>
 
     <insert id="insert" parameterType="CmSvipProduct" keyProperty="id" useGeneratedKeys="true">
         INSERT INTO cm_svip_product(productId,
-                                    priceType,
-                                    discount,
-                                    discountPrice,
                                     sort,
-                                    addTime)
+                                    addTime,
+                                    status)
         VALUES (#{productId},
-                #{priceType},
-                #{discount},
-                #{discountPrice},
                 #{sort},
-                now())
+                now(),
+                #{status})
+    </insert>
+
+    <insert id="insertSkuPrice">
+        insert into cm_svip_product_sku(skuId, productId, priceType, discount, discountPrice)
+        values (#{skuId}, #{productId}, #{priceType}, #{discount}, #{discountPrice})
     </insert>
 
     <update id="update">
         UPDATE cm_svip_product
-        SET priceType     = #{priceType},
-            discount      = #{discount},
-            discountPrice = #{discountPrice},
-            sort          = #{sort}
+        SET sort   = #{sort},
+            status = #{status}
         WHERE id = #{id}
     </update>
-	<update id="saveSort">
-		UPDATE cm_svip_product SET
-			sort = #{sort}
-		WHERE id = #{id}
-	</update>
+
+    <update id="saveSort">
+        UPDATE cm_svip_product
+        SET sort = #{sort}
+        WHERE id = #{id}
+    </update>
+
     <update id="saveAdsImage">
         update cm_svip_product_adsimage
         set pcImage      = #{pcImage},
@@ -160,4 +177,16 @@
         WHERE id = #{id}
     </delete>
 
+    <delete id="deleteByProductId">
+        delete
+        from cm_svip_product_sku
+        where productId = #{productId}
+    </delete>
+
+    <delete id="deleteById">
+        delete
+        from cm_svip_product_sku
+        where productId = (select productId from cm_svip_product where id = #{id})
+    </delete>
+
 </mapper>

+ 259 - 179
src/main/webapp/WEB-INF/views/modules/svip/cmSvipProductForm.jsp

@@ -1,190 +1,270 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>商品管理</title>
-	<meta name="decorator" content="default"/>
-	<style>
-		.showLabel{
-			margin-top:3px
-		}
-	</style>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			//$("#name").focus();
-			$("#inputForm").validate({
-				submitHandler: function(form){
-					loading('正在提交,请稍等...');
-					form.submit();
-				},
-				errorContainer: "#messageBox",
-				errorPlacement: function(error, element) {
-					$("#messageBox").text("输入有误,请先更正。");
-					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
-					} else {
-						error.insertAfter(element);
-					}
-				}
-			});
-		});
-	</script>
+    <title>商品管理</title>
+    <meta name="decorator" content="default"/>
+    <style>
+        .showLabel {
+            margin-top: 3px
+        }
+    </style>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            //$("#name").focus();
+            $("#inputForm").validate({
+                submitHandler: function (form) {
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function (error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+        });
+    </script>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li><a href="${ctx}/svip/cmSvipProduct/">商品列表</a></li>
-		<li class="active"><a href="${ctx}/svip/cmSvipProduct/form?id=${cmSvipProduct.id}">商品${not empty cmSvipProduct.id?'编辑':'添加'}</a></li>
-	</ul><br/>
-	<form:form id="inputForm" modelAttribute="cmSvipProduct" action="${ctx}/svip/cmSvipProduct/save" method="post" class="form-horizontal">
-		<form:hidden path="id"/>
-		<sys:message content="${message}"/>
-		<div class="control-group">
-			<label class="control-label">商品ID:</label>
-			<div class="controls">
-				<label class="showLabel">${cmSvipProduct.productId}</label>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">商品名称:</label>
-			<div class="controls">
-				<label class="showLabel">${cmSvipProduct.productName}</label>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">供应商:</label>
-			<div class="controls">
-				<label class="showLabel">${cmSvipProduct.shopName}</label>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">机构价:</label>
-			<div class="controls">
-				<label class="showLabel">¥${cmSvipProduct.price}</label>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">是否含税:</label>
-			<div class="controls">
-				<label class="showLabel">${cmSvipProduct.includedTax == '1'?'含税':(cmSvipProduct.includedTax == '0'?'不含税':'未知')}
-                        ${cmSvipProduct.includedTax == '2'?'':(cmSvipProduct.invoiceType == '1'?'-开增值税专用发票':(cmSvipProduct.invoiceType == '2'?'-开增值税普通发票':'-不能开票'))}</label>
-			</div>
-		</div>
-		<div class="control-group" style="display: ${cmSvipProduct.includedTax == '2'?'none':''}">
-			<label class="control-label">机构税率:</label>
-			<div class="controls">
-                <label class="showLabel">${cmSvipProduct.taxPoint}%</label>
-            </div>
-		</div>
-		<div class="control-group" style="display: ${cmSvipProduct.includedTax == '2'?'none':''}">
-			<label class="control-label">供应商税率:</label>
-			<div class="controls">
-                <label class="showLabel">${cmSvipProduct.supplierTaxPoint}%</label>
-            </div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">成本:</label>
-			<div class="controls">
-                <label class="showLabel">${cmSvipProduct.costCheckFlag eq '1'?'固定成本':'比例成本'}</label>
-            </div>
-		</div>
-		<div class="control-group" style="display: ${cmSvipProduct.costCheckFlag eq '1'?'none':''}">
-			<label class="control-label">比例成本百分比:</label>
-			<div class="controls">
-                <label class="showLabel">${cmSvipProduct.costProportional}%</label>
-            </div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">成本价:</label>
-			<div class="controls">
-				<label class="showLabel">
-					<fmt:formatNumber value="${cmSvipProduct.costPrice}" type="number" pattern="#0.00"/>
-				</label>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label"><font color="red">*</font>会员价:</label>
-			<div class="controls">
-                <form:radiobutton path="priceType" onchange="changePriceType(1)" value="1" label="折扣价"/>
-                <form:radiobutton path="priceType" onchange="changePriceType(2)" value="2" label="直接优惠价"/>
-			</div>
-		</div>
-		<div class="control-group discountInput" hidden>
-			<div class="controls">
-				<form:input path="discount" htmlEscape="false" onchange="changeDiscount(this,1)" class="input-medium required"/> %
-			</div>
-		</div>
-		<div class="control-group discountPriceInput" hidden>
-			<div class="controls">
-				<form:input path="discountPrice" htmlEscape="false" onchange="changeDiscount(this,2)" class="input-medium required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label"><font color="red">*</font>排序值:</label>
-			<div class="controls">
-				<form:input path="sort" htmlEscape="false" placeholder="请填写排序值" class="input-xlarge required"/>
-			</div>
-		</div>
-		<div class="form-actions">
-			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
-			<input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
-		</div>
-	</form:form>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/svip/cmSvipProduct/">商品列表</a></li>
+    <li class="active"><a
+            href="${ctx}/svip/cmSvipProduct/form?id=${cmSvipProduct.id}">商品${not empty cmSvipProduct.id?'编辑':'添加'}</a>
+    </li>
+</ul>
+<br/>
+<form:form id="inputForm" modelAttribute="cmSvipProduct" action="${ctx}/svip/cmSvipProduct/save" method="post"
+           class="form-horizontal">
+    <form:hidden path="id"/>
+    <sys:message content="${message}"/>
+    <div class="control-group">
+        <label class="control-label">商品ID:</label>
+        <div class="controls">
+            <label class="showLabel">${cmSvipProduct.productId}</label>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">商品名称:</label>
+        <div class="controls">
+            <label class="showLabel">${cmSvipProduct.productName}</label>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">供应商:</label>
+        <div class="controls">
+            <label class="showLabel">${cmSvipProduct.shopName}</label>
+        </div>
+    </div>
+    <%--		<div class="control-group">--%>
+    <%--			<label class="control-label">机构价:</label>--%>
+    <%--			<div class="controls">--%>
+    <%--				<label class="showLabel">¥${cmSvipProduct.price}</label>--%>
+    <%--			</div>--%>
+    <%--		</div>--%>
+    <%--		<div class="control-group">--%>
+    <%--			<label class="control-label">是否含税:</label>--%>
+    <%--			<div class="controls">--%>
+    <%--				<label class="showLabel">${cmSvipProduct.includedTax == '1'?'含税':(cmSvipProduct.includedTax == '0'?'不含税':'未知')}--%>
+    <%--                        ${cmSvipProduct.includedTax == '2'?'':(cmSvipProduct.invoiceType == '1'?'-开增值税专用发票':(cmSvipProduct.invoiceType == '2'?'-开增值税普通发票':'-不能开票'))}</label>--%>
+    <%--			</div>--%>
+    <%--		</div>--%>
+    <div class="control-group" style="display: ${cmSvipProduct.includedTax == '2'?'none':''}">
+        <label class="control-label">机构税率:</label>
+        <div class="controls">
+            <label class="showLabel">${cmSvipProduct.taxPoint}%</label>
+        </div>
+    </div>
+    <div class="control-group" style="display: ${cmSvipProduct.includedTax == '2'?'none':''}">
+        <label class="control-label">供应商税率:</label>
+        <div class="controls">
+            <label class="showLabel">${cmSvipProduct.supplierTaxPoint}%</label>
+        </div>
+    </div>
+    <%--		<div class="control-group">--%>
+    <%--			<label class="control-label">成本:</label>--%>
+    <%--			<div class="controls">--%>
+    <%--                <label class="showLabel">${cmSvipProduct.costCheckFlag eq '1'?'固定成本':'比例成本'}</label>--%>
+    <%--            </div>--%>
+    <%--		</div>--%>
+    <%--		<div class="control-group" style="display: ${cmSvipProduct.costCheckFlag eq '1'?'none':''}">--%>
+    <%--			<label class="control-label">比例成本百分比:</label>--%>
+    <%--			<div class="controls">--%>
+    <%--                <label class="showLabel">${cmSvipProduct.costProportional}%</label>--%>
+    <%--            </div>--%>
+    <%--		</div>--%>
+    <%--		<div class="control-group">--%>
+    <%--			<label class="control-label">成本价:</label>--%>
+    <%--			<div class="controls">--%>
+    <%--				<label class="showLabel">--%>
+    <%--					<fmt:formatNumber value="${cmSvipProduct.costPrice}" type="number" pattern="#0.00"/>--%>
+    <%--				</label>--%>
+    <%--			</div>--%>
+    <%--		</div>--%>
+    <%--		<div class="control-group">--%>
+    <%--			<label class="control-label"><font color="red">*</font>会员价:</label>--%>
+    <%--			<div class="controls">--%>
+    <%--                <form:radiobutton path="priceType" onchange="changePriceType(1)" value="1" label="折扣价"/>--%>
+    <%--                <form:radiobutton path="priceType" onchange="changePriceType(2)" value="2" label="直接优惠价"/>--%>
+    <%--			</div>--%>
+    <%--		</div>--%>
+    <%--		<div class="control-group discountInput" hidden>--%>
+    <%--			<div class="controls">--%>
+    <%--				<form:input path="discount" htmlEscape="false" onchange="changeDiscount(this,1)" class="input-medium required"/> %--%>
+    <%--			</div>--%>
+    <%--		</div>--%>
+    <%--		<div class="control-group discountPriceInput" hidden>--%>
+    <%--			<div class="controls">--%>
+    <%--				<form:input path="discountPrice" htmlEscape="false" onchange="changeDiscount(this,2)" class="input-medium required"/>--%>
+    <%--			</div>--%>
+    <%--		</div>--%>
+    <div class="control-group">
+        <label class="control-label"><font color="red">*</font>排序值:</label>
+        <div class="controls">
+            <form:input path="sort" htmlEscape="false" placeholder="请填写排序值" class="input-xlarge required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label"><font color="red">*</font>优惠状态:</label>
+        <div class="controls">
+            <select name="status" id="vipStatus" class="input-medium">
+                <c:choose>
+                    <c:when test="${cmSvipProduct.status eq 1}">
+                        <option value="1">已下架</option>
+                        <option value="0">已上架</option>
+                    </c:when>
+                    <c:otherwise>
+                        <option value="0">已上架</option>
+                        <option value="1">已下架</option>
+                    </c:otherwise>
+                </c:choose>
+            </select>
+        </div>
+    </div>
+    <div class="control-group">
+        <table id="refundTable" class="table table-striped table-bordered table-condensed">
+            <tr>
+                <th>商品规格</th>
+                <th>机构价</th>
+                <th>成本类型</th>
+                <th>成本价/成本比例</th>
+                <th>会员折扣(%)</th>
+                <th>会员价</th>
+            </tr>
+            <c:forEach items="${cmSvipProduct.skus}" var="sku" varStatus="s">
+                <tr>
+                    <td hidden><input name="skus[${s.index}].skuId" value="${sku.skuId}"/></td>
+                    <td>${sku.unit}</td>
+                    <td>${sku.price}</td>
+                    <td>${1 eq sku.costCheckFlag?"固定成本":"比例成本"}</td>
+                    <td>${1 eq sku.costCheckFlag?sku.costPrice:sku.costProportional}</td>
+                    <td><input class="discount" id="discount${sku.skuId}${s.index}" name="skus[${s.index}].discount"
+                               onchange="changeDiscount(${sku.skuId},1,${s.index})" type="number" maxlength="11"
+                               style="width: 100px"> %
+                    </td>
+                    <td><input class="discountPrice" id="discountPrice${sku.skuId}${s.index}"
+                               name="skus[${s.index}].discountPrice"
+                               onchange="changeDiscount(${sku.skuId},2,${s.index})" type="number" maxlength="11"
+                               style="width: 100px"></td>
+                </tr>
+            </c:forEach>
+        </table>
+    </div>
+    <div class="form-actions">
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
+        <input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
+    </div>
+</form:form>
 <script>
-	$(function () {
-		var priceType = ${cmSvipProduct.priceType}
-		if (priceType == 1) {
-			$(".discountInput").show();
-		} else {
-			$(".discountPriceInput").show();
-		}
-	})
-	function changePriceType(priceType) {
-		if (priceType == 1) {
-			$(".discountInput").show();
-			$(".discountPriceInput").hide();
-		} else {
-			$(".discountInput").hide();
-			$(".discountPriceInput").show();
-		}
-	}
+    $(function () {
+        debugger
+        var priceType = '${cmSvipProduct.priceType}';
+        if (priceType == '2') {
+            $(".discount").prop('disabled',true);
+        } else if(priceType == '1'){
+            $(".discountPrice").prop('disabled',true);
+        }
 
-	/**
-	 * @param obj
-	 * jquery控制input只能输入数字
-	 */
-	function onlynum(obj) {
-		obj.value = obj.value.replace(/[^\d]/g, ""); //清除"数字"以外的字符
-	}
+    })
 
-	/**
-	 * 更改折扣/折扣价
-	 */
-	function changeDiscount(obj,priceType) {
-		var val = obj.value;
-		var number = Number(val).toFixed(2);
-		if (priceType == 1) {
-			if (val > 100 || val <= 0) {
-				$.jBox.tip("请输入0-100之间的数字", 'info');
-				obj.value = '';
-			}else {
-				if (number == 'NaN') {
-					$.jBox.tip("请输入正确的数字", 'info');
-					obj.value = '';
-				} else {
-					obj.value = number;
-				}
-			}
-		} else {
-			if (val != '' && val != undefined) {
-				if (number == 'NaN') {
-					$.jBox.tip("请输入正确的数字", 'info');
-					obj.value = '';
-				} else {
-					obj.value = number;
-				}
-			}
-		}
-	}
+    function changePriceType(priceType) {
+        if (priceType == 1) {
+            $(".discountInput").show();
+            $(".discountPriceInput").hide();
+        } else {
+            $(".discountInput").hide();
+            $(".discountPriceInput").show();
+        }
+    }
+
+    function changeDiscount(skuId, priceType, ind) {
+        var cd = skuId + "" + ind;
+        if (priceType == 1) {
+            var val = $("#discount" + cd).val();
+            if (val == '') {
+                $("#discountPrice" + cd).removeAttr('readonly');
+            } else if (val > 100 || val <= 0) {
+                $.jBox.tip("请输入0-100之间的数字", 'info');
+                $("#discount" + cd).val('');
+                $("#discountPrice" + cd).removeAttr('readonly');
+            } else {
+                val = Number(val).toFixed(2);
+                $("#discount" + cd).val(val);
+                $("#discountPrice" + cd).attr('readonly', 'readonly');
+            }
+        } else {
+            var val = $("#discountPrice" + cd).val();
+            if (val != '' && val != undefined) {
+                val = Number(val).toFixed(2);
+                $("#discountPrice" + cd).val(val);
+                $("#discount" + cd).attr('readonly', 'readonly');
+            } else {
+                $("#discount" + cd).removeAttr('readonly');
+            }
+        }
+    }
+
+    /**
+     * @param obj
+     * jquery控制input只能输入数字
+     */
+    function onlynum(obj) {
+        obj.value = obj.value.replace(/[^\d]/g, ""); //清除"数字"以外的字符
+    }
+
+    /**
+     * 更改折扣/折扣价
+     */
+    // function changeDiscount(obj,priceType) {
+    // 	var val = obj.value;
+    // 	var number = Number(val).toFixed(2);
+    // 	if (priceType == 1) {
+    // 		if (val > 100 || val <= 0) {
+    // 			$.jBox.tip("请输入0-100之间的数字", 'info');
+    // 			obj.value = '';
+    // 		}else {
+    // 			if (number == 'NaN') {
+    // 				$.jBox.tip("请输入正确的数字", 'info');
+    // 				obj.value = '';
+    // 			} else {
+    // 				obj.value = number;
+    // 			}
+    // 		}
+    // 	} else {
+    // 		if (val != '' && val != undefined) {
+    // 			if (number == 'NaN') {
+    // 				$.jBox.tip("请输入正确的数字", 'info');
+    // 				obj.value = '';
+    // 			} else {
+    // 				obj.value = number;
+    // 			}
+    // 		}
+    // 	}
+    // }
 </script>
 </body>
 </html>

+ 3 - 1
src/main/webapp/WEB-INF/views/modules/svip/cmSvipProductList.jsp

@@ -67,6 +67,7 @@
 				<th>会员折扣</th>
 				<th>会员价</th>
 				<th>排序值</th>
+				<th>优惠状态</th>
 				<th>添加时间</th>
 				<th>操作</th>
 			</tr>
@@ -101,6 +102,7 @@
 					<input id="sort" name="sort" style="width:50px;" value="${cmSvipProduct.sort}" onkeyup="onlynum(this)"
 						   onchange="changeSort(${cmSvipProduct.id},this)">
 				</td>
+				<td><font color="${cmSvipProduct.status eq 1?"red":"green"}">${cmSvipProduct.status eq 1?"已下架":"已上架"}</font></td>
 				<td>
 					<fmt:formatDate value="${cmSvipProduct.addTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
 				</td>
@@ -166,7 +168,7 @@
 						//添加数据
 						for (var i = 0; i < items.length; i++) {
 							var item = items[i];
-							$.post("${ctx}/svip/cmSvipProduct/save?productId=" + item.productId + "&discount=" + item.discount + "&discountPrice=" + item.discountPrice);
+							$.post("${ctx}/svip/cmSvipProduct/save?productId=" + item.productId);
 						}
 					} else {
 						top.$.jBox.tip("请先勾选商品...");

+ 4 - 4
src/main/webapp/WEB-INF/views/modules/svip/svipAddProduct.jsp

@@ -59,8 +59,8 @@
         <th>商品名称</th>
         <th>供应商</th>
         <th>机构价</th>
-        <th style="width: 140px !important;">会员折扣</th>
-        <th style="width: 140px !important;">会员价</th>
+<%--        <th style="width: 140px !important;">会员折扣</th>--%>
+<%--        <th style="width: 140px !important;">会员价</th>--%>
     </tr>
     <tbody>
     <c:if test="${not empty page.list}">
@@ -74,8 +74,8 @@
                 <td class="productName">${item.name}</td>
                 <td>${item.shopName}</td>
                 <td>¥${item.price}</td>
-                <td><input class="discount" id="discount${item.productID}" onchange="changeDiscount(${item.productID},1)" type="number" maxlength="11" style="width: 100px"> %</td>
-                <td><input class="discountPrice" id="discountPrice${item.productID}" onchange="changeDiscount(${item.productID},2)" type="number" maxlength="11" style="width: 100px"></td>
+<%--                <td><input class="discount" id="discount${item.productID}" onchange="changeDiscount(${item.productID},1)" type="number" maxlength="11" style="width: 100px"> %</td>--%>
+<%--                <td><input class="discountPrice" id="discountPrice${item.productID}" onchange="changeDiscount(${item.productID},2)" type="number" maxlength="11" style="width: 100px"></td>--%>
             </tr>
         </c:forEach>
     </c:if>