Bläddra i källkod

B分支进度

chao 4 år sedan
förälder
incheckning
54b3d516b2
48 ändrade filer med 6129 tillägg och 37 borttagningar
  1. 2 2
      README.md
  2. 7 0
      src/main/java/com/caimei/modules/order/dao/NewOrderDao.java
  3. 18 0
      src/main/java/com/caimei/modules/order/entity/NewOrder.java
  4. 9 4
      src/main/java/com/caimei/modules/order/service/NewOrderService.java
  5. 5 4
      src/main/java/com/caimei/modules/order/web/NewOrderController.java
  6. 18 0
      src/main/java/com/caimei/modules/product/entity/Product.java
  7. 0 3
      src/main/java/com/caimei/modules/user/web/newUser/AgencyController.java
  8. 17 0
      src/main/java/com/caimei/modules/weisha/dao/CmMallOrganizeDao.java
  9. 16 0
      src/main/java/com/caimei/modules/weisha/dao/CmOrganizeBuyerDao.java
  10. 63 0
      src/main/java/com/caimei/modules/weisha/dao/CmOrganizeProductDao.java
  11. 100 0
      src/main/java/com/caimei/modules/weisha/dao/CmOrganizePromotionDao.java
  12. 140 0
      src/main/java/com/caimei/modules/weisha/entity/CmMallOrganize.java
  13. 161 0
      src/main/java/com/caimei/modules/weisha/entity/CmOrganizeBuyer.java
  14. 211 0
      src/main/java/com/caimei/modules/weisha/entity/CmOrganizeProduct.java
  15. 412 0
      src/main/java/com/caimei/modules/weisha/entity/CmOrganizePromotion.java
  16. 52 0
      src/main/java/com/caimei/modules/weisha/entity/OrganizeProductLadderPrice.java
  17. 47 0
      src/main/java/com/caimei/modules/weisha/service/CmMallOrganizeService.java
  18. 132 0
      src/main/java/com/caimei/modules/weisha/service/CmOrganizeBuyerService.java
  19. 139 0
      src/main/java/com/caimei/modules/weisha/service/CmOrganizeProductService.java
  20. 357 0
      src/main/java/com/caimei/modules/weisha/service/CmOrganizePromotionService.java
  21. 74 0
      src/main/java/com/caimei/modules/weisha/web/CmMallOrganizeController.java
  22. 103 0
      src/main/java/com/caimei/modules/weisha/web/CmOrganizeBuyerController.java
  23. 199 0
      src/main/java/com/caimei/modules/weisha/web/CmOrganizeClubController.java
  24. 133 0
      src/main/java/com/caimei/modules/weisha/web/CmOrganizeProductController.java
  25. 439 0
      src/main/java/com/caimei/modules/weisha/web/CmOrganizePromotionController.java
  26. 1 1
      src/main/resources/mappings/modules/bulkpurchase/PurchaseProductMapper.xml
  27. 14 0
      src/main/resources/mappings/modules/order/OrderMapper.xml
  28. 1 1
      src/main/resources/mappings/modules/user/CmUserOrganizeMapper.xml
  29. 1 3
      src/main/resources/mappings/modules/user/NewCmClubMapper.xml
  30. 134 0
      src/main/resources/mappings/modules/weisha/CmMallOrganizeMapper.xml
  31. 137 0
      src/main/resources/mappings/modules/weisha/CmOrganizeBuyerMapper.xml
  32. 199 0
      src/main/resources/mappings/modules/weisha/CmOrganizeProductMapper.xml
  33. 432 0
      src/main/resources/mappings/modules/weisha/CmOrganizePromotionMapper.xml
  34. 0 10
      src/main/webapp/WEB-INF/views/modules/applets/setHomePage.jsp
  35. 12 0
      src/main/webapp/WEB-INF/views/modules/order/newOrderList.jsp
  36. 0 9
      src/main/webapp/WEB-INF/views/modules/userNew/cmAgencyList.jsp
  37. 118 0
      src/main/webapp/WEB-INF/views/modules/weisha/addClubUserForm.jsp
  38. 69 0
      src/main/webapp/WEB-INF/views/modules/weisha/cmMallOrganizeForm.jsp
  39. 172 0
      src/main/webapp/WEB-INF/views/modules/weisha/cmMallOrganizeList.jsp
  40. 71 0
      src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeBuyerForm.jsp
  41. 127 0
      src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeBuyerList.jsp
  42. 484 0
      src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeProductForm.jsp
  43. 200 0
      src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeProductList.jsp
  44. 126 0
      src/main/webapp/WEB-INF/views/modules/weisha/findOrganizeProduct.jsp
  45. 128 0
      src/main/webapp/WEB-INF/views/modules/weisha/findPromotionSingleProduct.jsp
  46. 108 0
      src/main/webapp/WEB-INF/views/modules/weisha/organizeClubList.jsp
  47. 542 0
      src/main/webapp/WEB-INF/views/modules/weisha/organizeSinglePromotionForm.jsp
  48. 199 0
      src/main/webapp/WEB-INF/views/modules/weisha/organizeSinglePromotionList.jsp

+ 2 - 2
README.md

@@ -1,3 +1,3 @@
-# caimei-caimei365-manager
+# caimei-manager
 
-采美后台管理
+caimei-manager

+ 7 - 0
src/main/java/com/caimei/modules/order/dao/NewOrderDao.java

@@ -2,6 +2,7 @@ package com.caimei.modules.order.dao;
 
 import com.caimei.modules.order.entity.NewOrder;
 import com.caimei.modules.product.entity.CmPromotion;
+import com.caimei.modules.user.entity.NewCmSp;
 import com.thinkgem.jeesite.common.persistence.CrudDao;
 import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
 import org.apache.ibatis.annotations.Param;
@@ -47,4 +48,10 @@ public interface NewOrderDao extends CrudDao<NewOrder> {
      * @param newOrder
      */
     void updateOrderStatus(NewOrder newOrder);
+
+    /**
+     * 获取上线协销人员,排除采美默认协销经理
+     * @return ServiceProvider
+     */
+    List<NewCmSp> findServiceProviderList();
 }

+ 18 - 0
src/main/java/com/caimei/modules/order/entity/NewOrder.java

@@ -105,7 +105,9 @@ public class NewOrder extends DataEntity<NewOrder> {
     private String returnedPurchaseStatus;//1审核中,0不是审核中
     private String applyReturnedPurchaseFlag;//0不可以申请,1可以申请(此标记只用于是否存在审核中或者审核不通过记录,存在记录则不可以申请)
     private String spName;
+    private Integer serviceProviderId;  //协销Id
 
+    private String productName;     //商品名称(根据商品名称筛选订单)
     private List<NewOrderProduct> orderProduct;// 订单内的商品集合
     // 促销
     private List<CmPromotion> promotions;
@@ -969,5 +971,21 @@ public class NewOrder extends DataEntity<NewOrder> {
     public void setReturnedFreightFlag(Boolean returnedFreightFlag) {
         this.returnedFreightFlag = returnedFreightFlag;
     }
+
+    public Integer getServiceProviderId() {
+        return serviceProviderId;
+    }
+
+    public void setServiceProviderId(Integer serviceProviderId) {
+        this.serviceProviderId = serviceProviderId;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
 }
 

+ 9 - 4
src/main/java/com/caimei/modules/order/service/NewOrderService.java

@@ -21,10 +21,7 @@ import com.caimei.modules.product.entity.Product;
 import com.caimei.modules.user.dao.CmUserDao;
 import com.caimei.modules.user.dao.NewCmClubDao;
 import com.caimei.modules.user.dao.NewCmShopDao;
-import com.caimei.modules.user.entity.CmUser;
-import com.caimei.modules.user.entity.CmUserBalanceRecord;
-import com.caimei.modules.user.entity.NewCmClub;
-import com.caimei.modules.user.entity.NewCmShop;
+import com.caimei.modules.user.entity.*;
 import com.caimei.modules.user.service.CmUserBalanceRecordService;
 import com.caimei.modules.user.service.CmUserService;
 import com.caimei.modules.user.utils.ReturnedPurchaseStatus;
@@ -1907,5 +1904,13 @@ public class NewOrderService extends CrudService<NewOrderDao, NewOrder> {
     public void updatePayStatus(NewOrder newOrder) {
         newOrderDao.updateOrderStatus(newOrder);
     }
+
+    /**
+     * 获取上线协销人员,排除采美默认协销经理
+     * @return NewCmSp
+     */
+    public List<NewCmSp> findServiceProviderList() {
+        return newOrderDao.findServiceProviderList();
+    }
 }
 

+ 5 - 4
src/main/java/com/caimei/modules/order/web/NewOrderController.java

@@ -30,16 +30,14 @@ import com.caimei.modules.project.dao.ClubDao;
 import com.caimei.modules.project.model.ClubModel;
 import com.caimei.modules.sys.utils.UploadImageUtils;
 import com.caimei.modules.user.dao.CmUserDao;
-import com.caimei.modules.user.entity.CmMessage;
-import com.caimei.modules.user.entity.CmUser;
-import com.caimei.modules.user.entity.CmUserOrganize;
-import com.caimei.modules.user.entity.NewCmShop;
+import com.caimei.modules.user.entity.*;
 import com.caimei.modules.user.service.CmMessageService;
 import com.caimei.modules.user.service.CmUserOrganizeService;
 import com.caimei.modules.user.service.CmUserService;
 import com.caimei.modules.user.service.NewCmShopService;
 import com.caimei.modules.user.utils.UserType;
 import com.caimei.po.ProductLadderPrice;
+import com.caimei.po.ServiceProvider;
 import com.caimei.utils.AppKeys;
 import com.caimei.utils.AppUtils;
 import com.caimei.utils.MathUtil;
@@ -189,6 +187,9 @@ public class NewOrderController extends BaseController {
         //获取组织列表
         List<CmUserOrganize> cmUserOrganizeList = cmUserOrganizeService.findOrganize();
         model.addAttribute("cmUserOrganizeList", cmUserOrganizeList);
+        //获取上线协销人员,排除采美默认协销经理
+        List<NewCmSp> serviceProviderList = newOrderService.findServiceProviderList();
+        model.addAttribute("serviceProviderList", serviceProviderList);
         model.addAttribute("page", page);
         return "modules/order/newOrderList";
     }

+ 18 - 0
src/main/java/com/caimei/modules/product/entity/Product.java

@@ -177,6 +177,8 @@ public class Product extends DataEntity<Product> {
     private String onLineDate;//到期时间
     private String publisher;//后台二手商品发布人员名称
     private String commodityType;//商品属性:1产品,2仪器
+    private Integer organizeId; //组织Id
+    private String productIdStr;//商品Id字符串格式
 
     //以下参数是搜索回显参数
     private String searchName;
@@ -1818,4 +1820,20 @@ public class Product extends DataEntity<Product> {
     public void setSource(String source) {
         this.source = source;
     }
+
+    public Integer getOrganizeId() {
+        return organizeId;
+    }
+
+    public void setOrganizeId(Integer organizeId) {
+        this.organizeId = organizeId;
+    }
+
+    public String getProductIdStr() {
+        return productIdStr;
+    }
+
+    public void setProductIdStr(String productIdStr) {
+        this.productIdStr = productIdStr;
+    }
 }

+ 0 - 3
src/main/java/com/caimei/modules/user/web/newUser/AgencyController.java

@@ -128,9 +128,6 @@ public class AgencyController extends BaseController {
         }
 
         Page<NewCmClub> page = newCmClubService.findPage(new Page<NewCmClub>(request, response, 20), newCmClub);
-        //获取组织列表
-        List<CmUserOrganize> cmUserOrganizeList = cmUserOrganizeService.findOrganize();
-        model.addAttribute("cmUserOrganizeList", cmUserOrganizeList);
         model.addAttribute("newCmClub", newCmClub);
         model.addAttribute("page", page);
         return "modules/userNew/cmAgencyList";

+ 17 - 0
src/main/java/com/caimei/modules/weisha/dao/CmMallOrganizeDao.java

@@ -0,0 +1,17 @@
+package com.caimei.modules.weisha.dao;
+
+import com.thinkgem.jeesite.common.persistence.CrudDao;
+import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
+import com.caimei.modules.weisha.entity.CmMallOrganize;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 组织列表DAO接口
+ * @author plf
+ * @version 2021-03-18
+ */
+@MyBatisDao
+public interface CmMallOrganizeDao extends CrudDao<CmMallOrganize> {
+
+    void updateByStatus(@Param("organizeId") Integer organizeId,@Param("status") String status);
+}

+ 16 - 0
src/main/java/com/caimei/modules/weisha/dao/CmOrganizeBuyerDao.java

@@ -0,0 +1,16 @@
+package com.caimei.modules.weisha.dao;
+
+import com.thinkgem.jeesite.common.persistence.CrudDao;
+import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
+import com.caimei.modules.weisha.entity.CmOrganizeBuyer;
+
+/**
+ * 采购人员DAO接口
+ * @author plf
+ * @version 2021-03-19
+ */
+@MyBatisDao
+public interface CmOrganizeBuyerDao extends CrudDao<CmOrganizeBuyer> {
+
+    CmOrganizeBuyer findByMobile(String mobile);
+}

+ 63 - 0
src/main/java/com/caimei/modules/weisha/dao/CmOrganizeProductDao.java

@@ -0,0 +1,63 @@
+package com.caimei.modules.weisha.dao;
+
+import com.caimei.modules.product.entity.Product;
+import com.caimei.modules.weisha.entity.OrganizeProductLadderPrice;
+import com.thinkgem.jeesite.common.persistence.CrudDao;
+import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
+import com.caimei.modules.weisha.entity.CmOrganizeProduct;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 采美组织商品DAO接口
+ * @author Aslee
+ * @version 2021-03-19
+ */
+@MyBatisDao
+public interface CmOrganizeProductDao extends CrudDao<CmOrganizeProduct> {
+
+    /**
+     * 查询组织商品列表
+     * @return
+     * @param product
+     */
+    List<Product> findProductList(Product product);
+
+    /**
+     * 根据商品Id查询商品信息
+     * @param productId
+     */
+    CmOrganizeProduct findProductByProductId(String productId);
+
+
+    /**
+     * 更新商品上架状态
+     * @param id
+     * @param status
+     */
+    void updateStatus(@Param("id")Integer id, @Param("status")Integer status);
+
+    /**
+     * 获取商品阶梯价格列表
+     * @param productId
+     * @return
+     */
+    List<OrganizeProductLadderPrice> findLadderPrice(String productId);
+
+    /**
+     * 更新商品阶梯价格
+     * @param organizeProductLadderPrice
+     */
+    void updateLadderPrice(OrganizeProductLadderPrice organizeProductLadderPrice);
+    /**
+     * 插入商品阶梯价格
+     * @param organizeProductLadderPrice
+     */
+    void insertLadderPrice(OrganizeProductLadderPrice organizeProductLadderPrice);
+    /**
+     * 删除商品阶梯价格
+     * @param ladderId
+     */
+    void deleteLadderPriceById(String ladderId);
+}

+ 100 - 0
src/main/java/com/caimei/modules/weisha/dao/CmOrganizePromotionDao.java

@@ -0,0 +1,100 @@
+package com.caimei.modules.weisha.dao;
+
+import com.caimei.modules.bulkpurchase.entity.PurchaseProduct;
+import com.caimei.modules.cibe.entity.Shop;
+import com.caimei.modules.product.entity.Product;
+import com.caimei.modules.weisha.entity.CmOrganizePromotion;
+import com.thinkgem.jeesite.common.persistence.CrudDao;
+import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+@MyBatisDao
+public interface CmOrganizePromotionDao extends CrudDao<CmOrganizePromotion> {
+    /**
+     * 查询促销活动的活动产品
+     */
+    List<Product> findPromotionProduct(CmOrganizePromotion cmOrganizePromotion);
+
+    /**
+     * 查询促销活动的活动赠品
+     */
+    List<Product> findGiftProduct(String id);
+
+    /**
+     * 根据促销活动id查询促销赠品(订单)
+     */
+    List<PurchaseProduct> findGiftPurchaseProduct(String id);
+    /**
+     * 查询促销活动的活动商店
+     */
+    List<Shop> findPromotionShops(CmOrganizePromotion cmOrganizePromotion);
+
+    /**
+     * 删除促销活动的活动产品和店铺
+     */
+    void deleteAllPromotionProductsAndShops(String promotionId);
+
+    /**
+     * 删除促销活动的活动赠品
+     */
+    void deleteAllPromotionGifts(String promotionId);
+
+    /**
+     * 查询所有可用的活动产品
+     */
+    List<Product> findAllProduct(Product product);
+
+    /**
+     * 查询所有可用的活动商店
+     */
+    List<Shop> findAllShop(Shop shop);
+
+    /**
+     * 添加促销产品
+     */
+    void insertPromotionProduct(@Param("promotionId") String promotionId, @Param("productId") String productId);
+
+    /**
+     * 添加促销赠品
+     */
+    void insertGiftProduct(@Param("promotionId") String promotionId, @Param("giftId") String giftId, @Param("number") Integer number);
+
+    /**
+     * 添加促销店铺
+     */
+    void insertPromotionShop(@Param("promotionId") String promotionId, @Param("shopId") String shopId);
+
+    /**
+     * 添加促销店铺
+     */
+    Shop findShop(String shopId);
+
+    /**
+     * 获取赠品的促销信息
+     */
+    CmOrganizePromotion findProductPromotionsGift(Integer productId);
+
+    /**
+     * 根据商品和店铺id获取促销活动
+     */
+    CmOrganizePromotion findProductPromotion(@Param("shopId") String shopId, @Param("productId") Long productId);
+
+    /**
+     * 查询订单促销活动
+     * @param orderPromotionsId
+     * @return
+     */
+    CmOrganizePromotion findOrderPromotions(@Param("orderPromotionsId") Integer orderPromotionsId);
+
+    /**
+     * 根据商品id获取促销活动
+     */
+    CmOrganizePromotion findPromotionsByProductId(@Param("productId") Integer productId);
+
+    Double getPresentPriceById(@Param("productId") Integer productId);
+
+    Product getProductByProductId(String productId);
+}

+ 140 - 0
src/main/java/com/caimei/modules/weisha/entity/CmMallOrganize.java

@@ -0,0 +1,140 @@
+package com.caimei.modules.weisha.entity;
+
+import org.hibernate.validator.constraints.Length;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.thinkgem.jeesite.common.persistence.DataEntity;
+
+/**
+ * 组织列表Entity
+ * @author plf
+ * @version 2021-03-18
+ */
+public class CmMallOrganize extends DataEntity<CmMallOrganize> {
+	
+	private static final long serialVersionUID = 1L;
+	private String organizeName;		// 组织名称
+	private String organizeLinkName;		// 组织联系人
+	private String mobile;		// 手机号码
+	private String status;		//状态:1已上线,2已下线
+	private String contactNumber;		// 联系我们,手机或者座机号码
+	private String systemName;		// 后台系统名称
+	private String systemImage;		// 后台系统图标
+	private String introduction;		// 关于我们:组织介绍信息
+	private String afterSale;		// 售后无忧
+	private String shoppingNotes;		// 购物须知
+	private Date updateTime;		// 更新时间
+	private Date addTime;		// 添加时间
+	
+	public CmMallOrganize() {
+		super();
+	}
+
+	public CmMallOrganize(String id){
+		super(id);
+	}
+
+	@Length(min=0, max=50, message="组织名称长度必须介于 0 和 50 之间")
+	public String getOrganizeName() {
+		return organizeName;
+	}
+
+	public void setOrganizeName(String organizeName) {
+		this.organizeName = organizeName;
+	}
+	
+	@Length(min=0, max=50, message="组织联系人长度必须介于 0 和 50 之间")
+	public String getOrganizeLinkName() {
+		return organizeLinkName;
+	}
+
+	public void setOrganizeLinkName(String organizeLinkName) {
+		this.organizeLinkName = organizeLinkName;
+	}
+	
+	@Length(min=0, max=20, message="手机号码长度必须介于 0 和 20 之间")
+	public String getMobile() {
+		return mobile;
+	}
+
+	public void setMobile(String mobile) {
+		this.mobile = mobile;
+	}
+	
+	@Length(min=0, max=20, message="联系我们,手机或者座机号码长度必须介于 0 和 20 之间")
+	public String getContactNumber() {
+		return contactNumber;
+	}
+
+	public void setContactNumber(String contactNumber) {
+		this.contactNumber = contactNumber;
+	}
+	
+	@Length(min=0, max=20, message="后台系统名称长度必须介于 0 和 20 之间")
+	public String getSystemName() {
+		return systemName;
+	}
+
+	public void setSystemName(String systemName) {
+		this.systemName = systemName;
+	}
+	
+	public String getSystemImage() {
+		return systemImage;
+	}
+
+	public void setSystemImage(String systemImage) {
+		this.systemImage = systemImage;
+	}
+	
+	public String getIntroduction() {
+		return introduction;
+	}
+
+	public void setIntroduction(String introduction) {
+		this.introduction = introduction;
+	}
+	
+	public String getAfterSale() {
+		return afterSale;
+	}
+
+	public void setAfterSale(String afterSale) {
+		this.afterSale = afterSale;
+	}
+	
+	public String getShoppingNotes() {
+		return shoppingNotes;
+	}
+
+	public void setShoppingNotes(String shoppingNotes) {
+		this.shoppingNotes = shoppingNotes;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getAddTime() {
+		return addTime;
+	}
+
+	public void setAddTime(Date addTime) {
+		this.addTime = addTime;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+}

+ 161 - 0
src/main/java/com/caimei/modules/weisha/entity/CmOrganizeBuyer.java

@@ -0,0 +1,161 @@
+package com.caimei.modules.weisha.entity;
+
+import org.hibernate.validator.constraints.Length;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.thinkgem.jeesite.common.persistence.DataEntity;
+
+/**
+ * 采购人员Entity
+ * @author plf
+ * @version 2021-03-19
+ */
+public class CmOrganizeBuyer extends DataEntity<CmOrganizeBuyer> {
+	
+	private static final long serialVersionUID = 1L;
+	private String organizeId;		// 组织id
+	private String name;		// 采购员名称
+	private String mobile;		// 手机号
+	private String invitationCode;		// 邀请码
+	private String status;		// 1未绑定,2已绑定
+	private String nickName;		// 微信昵称
+	private String openid;		// 小程序openid
+	private Date addTime;		// 添加时间
+	private Date invitationCodeTime;		// 邀请码有效截止时间
+	private Date bindTime;		// 绑定时间
+	private Date updateTime;		// 更新时间
+	private Date startTime;		//开始时间
+	private Date endTime;		//结束时间
+	private String effectiveState;		//有效状态:1已使用,2失效,3有效
+
+	public CmOrganizeBuyer() {
+		super();
+	}
+
+	public CmOrganizeBuyer(String id){
+		super(id);
+	}
+
+	public String getOrganizeId() {
+		return organizeId;
+	}
+
+	public void setOrganizeId(String organizeId) {
+		this.organizeId = organizeId;
+	}
+	
+	@Length(min=0, max=50, message="采购员名称长度必须介于 0 和 50 之间")
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@Length(min=0, max=20, message="手机号长度必须介于 0 和 20 之间")
+	public String getMobile() {
+		return mobile;
+	}
+
+	public void setMobile(String mobile) {
+		this.mobile = mobile;
+	}
+	
+	@Length(min=0, max=20, message="邀请码长度必须介于 0 和 20 之间")
+	public String getInvitationCode() {
+		return invitationCode;
+	}
+
+	public void setInvitationCode(String invitationCode) {
+		this.invitationCode = invitationCode;
+	}
+	
+	@Length(min=0, max=1, message="1未绑定,2已绑定长度必须介于 0 和 1 之间")
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@Length(min=0, max=32, message="微信昵称长度必须介于 0 和 32 之间")
+	public String getNickName() {
+		return nickName;
+	}
+
+	public void setNickName(String nickName) {
+		this.nickName = nickName;
+	}
+	
+	@Length(min=0, max=32, message="小程序openid长度必须介于 0 和 32 之间")
+	public String getOpenid() {
+		return openid;
+	}
+
+	public void setOpenid(String openid) {
+		this.openid = openid;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getAddTime() {
+		return addTime;
+	}
+
+	public void setAddTime(Date addTime) {
+		this.addTime = addTime;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getInvitationCodeTime() {
+		return invitationCodeTime;
+	}
+
+	public void setInvitationCodeTime(Date invitationCodeTime) {
+		this.invitationCodeTime = invitationCodeTime;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getBindTime() {
+		return bindTime;
+	}
+
+	public void setBindTime(Date bindTime) {
+		this.bindTime = bindTime;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public Date getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(Date startTime) {
+		this.startTime = startTime;
+	}
+
+	public Date getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(Date endTime) {
+		this.endTime = endTime;
+	}
+
+	public String getEffectiveState() {
+		return effectiveState;
+	}
+
+	public void setEffectiveState(String effectiveState) {
+		this.effectiveState = effectiveState;
+	}
+}

+ 211 - 0
src/main/java/com/caimei/modules/weisha/entity/CmOrganizeProduct.java

@@ -0,0 +1,211 @@
+package com.caimei.modules.weisha.entity;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.thinkgem.jeesite.common.persistence.DataEntity;
+
+/**
+ * 采美组织商品Entity
+ * @author Aslee
+ * @version 2021-03-19
+ */
+public class CmOrganizeProduct extends DataEntity<CmOrganizeProduct> {
+	
+	private static final long serialVersionUID = 1L;
+	private Integer organizeId;		// 组织Id
+	private Integer productId;		// 商品Id
+	private Integer ladderPriceFlag;		// 启用阶梯价格标识 0否 1是
+	private Double price;		// 机构价
+	private Integer includedTax;		// 是否含税   0不含税,1含税,2未知
+	private Integer invoiceType;		// 发票类型(基于是否含税基础)   1增值税专用发票,2增值税普通发票, 3不能开票
+	private Double	clubTaxPoint;	//机构税率 :增值税默认13%,普通票6%取值范围[0-100]
+	private Double shopTaxPoint;	//供应商税率:增值专用发票默认13%,增值税普通发票6%取值范围[0-100]
+	private Integer minBuyNumber;		// 最小起订量
+	private Integer costType;		// 成本价类型:1固定成本 2比例成本
+	private Double costPrice;		// 成本价
+	private Double costProportional;		// 比例成本百分比
+	private Integer postageType;		// 是否包邮 0包邮 1到付 2默认(遵循运费规则)
+	private Integer status;		// 商品状态:0已下架,1已上架
+	private Date addTime;		// 添加时间
+
+
+	private String productName;		//商品名称
+	private String productImage;	//商品图片
+	private String shopName;		//供应商名称
+	private String unit;			//规格
+	private List<OrganizeProductLadderPrice> ladderPriceList;	//阶梯价格列表
+
+	public CmOrganizeProduct() {
+		super();
+	}
+
+	public CmOrganizeProduct(String id){
+		super(id);
+	}
+
+	public Integer getOrganizeId() {
+		return organizeId;
+	}
+
+	public void setOrganizeId(Integer organizeId) {
+		this.organizeId = organizeId;
+	}
+	
+	public Integer getProductId() {
+		return productId;
+	}
+
+	public void setProductId(Integer productId) {
+		this.productId = productId;
+	}
+	
+	public Integer getLadderPriceFlag() {
+		return ladderPriceFlag;
+	}
+
+	public void setLadderPriceFlag(Integer ladderPriceFlag) {
+		this.ladderPriceFlag = ladderPriceFlag;
+	}
+	
+	public Double getPrice() {
+		return price;
+	}
+
+	public void setPrice(Double price) {
+		this.price = price;
+	}
+	
+	public Integer getIncludedTax() {
+		return includedTax;
+	}
+
+	public void setIncludedTax(Integer includedTax) {
+		this.includedTax = includedTax;
+	}
+	
+	public Integer getInvoiceType() {
+		return invoiceType;
+	}
+
+	public void setInvoiceType(Integer invoiceType) {
+		this.invoiceType = invoiceType;
+	}
+	
+	public Integer getMinBuyNumber() {
+		return minBuyNumber;
+	}
+
+	public void setMinBuyNumber(Integer minBuyNumber) {
+		this.minBuyNumber = minBuyNumber;
+	}
+	
+	public Integer getCostType() {
+		return costType;
+	}
+
+	public void setCostType(Integer costType) {
+		this.costType = costType;
+	}
+	
+	public Double getCostPrice() {
+		return costPrice;
+	}
+
+	public void setCostPrice(Double costPrice) {
+		this.costPrice = costPrice;
+	}
+	
+	public Double getCostProportional() {
+		return costProportional;
+	}
+
+	public void setCostProportional(Double costProportional) {
+		this.costProportional = costProportional;
+	}
+	
+	public Integer getPostageType() {
+		return postageType;
+	}
+
+	public void setPostageType(Integer postageType) {
+		this.postageType = postageType;
+	}
+	
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getAddTime() {
+		return addTime;
+	}
+
+	public void setAddTime(Date addTime) {
+		this.addTime = addTime;
+	}
+
+	public String getProductName() {
+		return productName;
+	}
+
+	public void setProductName(String productName) {
+		this.productName = productName;
+	}
+
+	public String getProductImage() {
+		return productImage;
+	}
+
+	public void setProductImage(String productImage) {
+		this.productImage = productImage;
+	}
+
+	public String getShopName() {
+		return shopName;
+	}
+
+	public void setShopName(String shopName) {
+		this.shopName = shopName;
+	}
+
+	public Double getClubTaxPoint() {
+		return clubTaxPoint;
+	}
+
+	public void setClubTaxPoint(Double clubTaxPoint) {
+		this.clubTaxPoint = clubTaxPoint;
+	}
+
+	public Double getShopTaxPoint() {
+		return shopTaxPoint;
+	}
+
+	public void setShopTaxPoint(Double shopTaxPoint) {
+		this.shopTaxPoint = shopTaxPoint;
+	}
+
+	public void setLadderPriceList(List<OrganizeProductLadderPrice> ladderPriceList) {
+		this.ladderPriceList = ladderPriceList;
+	}
+
+	public List<OrganizeProductLadderPrice> getLadderPriceList() {
+		return ladderPriceList;
+	}
+
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
+
+}

+ 412 - 0
src/main/java/com/caimei/modules/weisha/entity/CmOrganizePromotion.java

@@ -0,0 +1,412 @@
+package com.caimei.modules.weisha.entity;
+
+import com.caimei.modules.cibe.entity.Shop;
+import com.caimei.modules.product.entity.Product;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.thinkgem.jeesite.common.persistence.DataEntity;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+import java.util.List;
+
+public class CmOrganizePromotion extends DataEntity<CmOrganizePromotion> {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 组织Id
+     */
+    private Integer organizeId;
+    /**
+     *  促销名称
+     */
+    private String name;
+    /**
+     * 促销描述
+     */
+    private String description;
+    /**
+     * 分类: 1单品促销,2凑单促销,3店铺促销
+     */
+    private String type;
+    /**
+     * 促销方式:1优惠,2满减,3满赠
+     */
+    private String mode;
+    /**
+     * 优惠价格/满减/满赠的设定价格(如满999赠商品)
+     */
+    private Double touchPrice;
+    /**
+     * 减免价格
+     */
+    private Double reducedPrice;
+    /**
+     * 开始时间
+     */
+    private Date beginTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 创建时间
+     */
+    private Date addTime;
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+    /**
+     * 时效:1永久,2区间过期,其它无效
+     */
+    private String status;
+    /**
+     * 状态:0正常状态(未开始,进行中,已结束),1已关闭,2.已删除
+     */
+    private String delFlag1;
+    /**
+     * 主订单id【订单用】
+     */
+    private Integer orderId;
+    /**
+     *  促销活动id【订单用】
+     */
+    private Integer promotionsId;
+    /**
+     * 促销商品
+     */
+    private List<Product> promotionProducts;
+    /**
+     *促销赠品
+     */
+    private List<Product> giftProducts;
+    /**
+     *促销店铺
+     */
+    private List<Shop> promotionShops;
+    /**
+     * 商品id
+     */
+    private String productIds;
+    /**
+     * 赠品id
+     */
+    private String giftIds;
+    /**
+     * 供应商id
+     */
+    private String shopIds;
+    /**
+     * 删除的商品id
+     */
+    private String delProductIds;
+    /**
+     * 删除的供应商id
+     */
+    private String delShopIds;
+    /**
+     * 删除的赠品id
+     */
+    private String delGiftIds;
+    /**
+     *赠品数量
+     */
+    private Integer giftNumber;
+    /**
+     *赠品类型数量
+     */
+    private Integer giftTypeNumber;
+    /**
+     * 查询用商品名
+     */
+    private String productName;
+    /**
+     * 查询用供应商名
+     */
+    private String shopName;
+    /**
+     *满赠优惠价
+     */
+    private Double touchPrice1;
+    /**
+     *满减设定价
+     */
+    private Double touchPrice2;
+    /**
+     *满赠设定价
+     */
+    private Double touchPrice3;
+
+    /**
+     * 是否查询数据库促销商品标志
+     */
+    private String searchDbFlag;
+
+    public CmOrganizePromotion(){
+        super();
+    }
+
+    public CmOrganizePromotion(String id) {
+        super(id);
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getPromotionsId() {
+        return promotionsId;
+    }
+
+    public void setPromotionsId(Integer promotionsId) {
+        this.promotionsId = promotionsId;
+    }
+
+    @Length(min = 0, max = 30, message = "活动名称长度必须介于 0 和 30 之间")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getMode() {
+        return mode;
+    }
+
+    public void setMode(String mode) {
+        this.mode = mode;
+    }
+
+    public Double getTouchPrice() {
+        return touchPrice;
+    }
+
+    public void setTouchPrice(Double touchPrice) {
+        this.touchPrice = touchPrice;
+    }
+
+    public Double getReducedPrice() {
+        return reducedPrice;
+    }
+
+    public void setReducedPrice(Double reducedPrice) {
+        this.reducedPrice = reducedPrice;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getDelFlag1() {
+        return delFlag1;
+    }
+
+    public void setDelFlag1(String delFlag1) {
+        this.delFlag1 = delFlag1;
+    }
+
+    public List<Product> getPromotionProducts() {
+        return promotionProducts;
+    }
+
+    public void setPromotionProducts(List<Product> promotionProducts) {
+        this.promotionProducts = promotionProducts;
+    }
+
+    public List<Product> getGiftProducts() {
+        return giftProducts;
+    }
+
+    public List<Shop> getPromotionShops() {
+        return promotionShops;
+    }
+
+    public void setPromotionShops(List<Shop> promotionShops) {
+        this.promotionShops = promotionShops;
+    }
+
+    public void setGiftProducts(List<Product> giftProducts) {
+        this.giftProducts = giftProducts;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public String getProductIds() {
+        return productIds;
+    }
+
+    public void setProductIds(String productIds) {
+        this.productIds = productIds;
+    }
+
+    public String getGiftIds() {
+        return giftIds;
+    }
+
+    public void setGiftIds(String giftIds) {
+        this.giftIds = giftIds;
+    }
+
+    public String getShopIds() {
+        return shopIds;
+    }
+
+    public void setShopIds(String shopIds) {
+        this.shopIds = shopIds;
+    }
+
+    public String getDelProductIds() {
+        return delProductIds;
+    }
+
+    public void setDelProductIds(String delProductIds) {
+        this.delProductIds = delProductIds;
+    }
+
+    public String getDelGiftIds() {
+        return delGiftIds;
+    }
+
+    public void setDelGiftIds(String delGiftIds) {
+        this.delGiftIds = delGiftIds;
+    }
+
+    public String getDelShopIds() {
+        return delShopIds;
+    }
+
+    public void setDelShopIds(String delShopIds) {
+        this.delShopIds = delShopIds;
+    }
+
+    public Integer getGiftNumber() {
+        return giftNumber;
+    }
+
+    public void setGiftNumber(Integer giftNumber) {
+        this.giftNumber = giftNumber;
+    }
+
+    public Integer getGiftTypeNumber() {
+        return giftTypeNumber;
+    }
+
+    public void setGiftTypeNumber(Integer giftTypeNumber) {
+        this.giftTypeNumber = giftTypeNumber;
+    }
+
+    public Double getTouchPrice1() {
+        return touchPrice1;
+    }
+
+    public void setTouchPrice1(Double touchPrice1) {
+        this.touchPrice1 = touchPrice1;
+    }
+
+    public Double getTouchPrice2() {
+        return touchPrice2;
+    }
+
+    public void setTouchPrice2(Double touchPrice2) {
+        this.touchPrice2 = touchPrice2;
+    }
+
+    public Double getTouchPrice3() {
+        return touchPrice3;
+    }
+
+    public void setTouchPrice3(Double touchPrice3) {
+        this.touchPrice3 = touchPrice3;
+    }
+
+    public String getSearchDbFlag() {
+        return searchDbFlag;
+    }
+
+    public void setSearchDbFlag(String searchDbFlag) {
+        this.searchDbFlag = searchDbFlag;
+    }
+
+    public Integer getOrganizeId() {
+        return organizeId;
+    }
+
+    public void setOrganizeId(Integer organizeId) {
+        this.organizeId = organizeId;
+    }
+}

+ 52 - 0
src/main/java/com/caimei/modules/weisha/entity/OrganizeProductLadderPrice.java

@@ -0,0 +1,52 @@
+package com.caimei.modules.weisha.entity;
+
+import com.thinkgem.jeesite.common.persistence.DataEntity;
+
+import java.util.Date;
+
+/**
+ * 采美组织商品阶梯价格表
+ * @author Aslee
+ * @version 2021-03-19
+ */
+public class OrganizeProductLadderPrice extends DataEntity<OrganizeProductLadderPrice> {
+    private static final long serialVersionUID = 1L;
+    private Integer productId;		// 组织商品Id
+    private Integer ladderNum;		// 第几阶梯
+    private Integer buyNum;		// 购买数量
+    private Double buyPrice;		// 购买价格
+
+
+    public Integer getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Integer productId) {
+        this.productId = productId;
+    }
+
+    public Integer getLadderNum() {
+        return ladderNum;
+    }
+
+    public void setLadderNum(Integer ladderNum) {
+        this.ladderNum = ladderNum;
+    }
+
+    public Integer getBuyNum() {
+        return buyNum;
+    }
+
+    public void setBuyNum(Integer buyNum) {
+        this.buyNum = buyNum;
+    }
+
+    public Double getBuyPrice() {
+        return buyPrice;
+    }
+
+    public void setBuyPrice(Double buyPrice) {
+        this.buyPrice = buyPrice;
+    }
+
+}

+ 47 - 0
src/main/java/com/caimei/modules/weisha/service/CmMallOrganizeService.java

@@ -0,0 +1,47 @@
+package com.caimei.modules.weisha.service;
+
+import com.caimei.modules.weisha.dao.CmMallOrganizeDao;
+import com.caimei.modules.weisha.entity.CmMallOrganize;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.service.CrudService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 组织列表Service
+ *
+ * @author plf
+ * @version 2021-03-18
+ */
+@Service
+@Transactional(readOnly = true)
+public class CmMallOrganizeService extends CrudService<CmMallOrganizeDao, CmMallOrganize> {
+
+    @Autowired
+    private CmMallOrganizeDao organizeDao;
+
+    public CmMallOrganize get(String id) {
+        return super.get(id);
+    }
+
+    public List<CmMallOrganize> findList(CmMallOrganize cmMallOrganize) {
+        return super.findList(cmMallOrganize);
+    }
+
+    public Page<CmMallOrganize> findPage(Page<CmMallOrganize> page, CmMallOrganize cmMallOrganize) {
+        return super.findPage(page, cmMallOrganize);
+    }
+
+    @Transactional(readOnly = false)
+    public void save(CmMallOrganize cmMallOrganize) {
+        super.save(cmMallOrganize);
+    }
+
+    @Transactional(readOnly = false)
+    public void onlineAndOffline(Integer organizeId, String status) {
+        organizeDao.updateByStatus(organizeId, status);
+    }
+}

+ 132 - 0
src/main/java/com/caimei/modules/weisha/service/CmOrganizeBuyerService.java

@@ -0,0 +1,132 @@
+package com.caimei.modules.weisha.service;
+
+import com.caimei.modules.sys.utils.SMSUtils;
+import com.caimei.modules.weisha.dao.CmOrganizeBuyerDao;
+import com.caimei.modules.weisha.entity.CmOrganizeBuyer;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.service.CrudService;
+import com.thinkgem.jeesite.common.utils.StringUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * 采购人员Service
+ *
+ * @author plf
+ * @version 2021-03-19
+ */
+@Service
+@Transactional(readOnly = true)
+public class CmOrganizeBuyerService extends CrudService<CmOrganizeBuyerDao, CmOrganizeBuyer> {
+    @Autowired
+    private CmOrganizeBuyerDao organizeBuyerDao;
+
+    public CmOrganizeBuyer get(String id) {
+        return super.get(id);
+    }
+
+    public List<CmOrganizeBuyer> findList(CmOrganizeBuyer cmOrganizeBuyer) {
+        return super.findList(cmOrganizeBuyer);
+    }
+
+    public Page<CmOrganizeBuyer> findPage(Page<CmOrganizeBuyer> page, CmOrganizeBuyer cmOrganizeBuyer) {
+        Page<CmOrganizeBuyer> buyerPage = super.findPage(page, cmOrganizeBuyer);
+        List<CmOrganizeBuyer> buyerList = buyerPage.getList();
+        Date date = new Date();
+        buyerList.forEach(b -> {
+            if ("2".equals(b.getStatus())) {
+                //已使用
+                b.setEffectiveState("1");
+            } else if (date.compareTo(b.getInvitationCodeTime()) > 0) {
+                //已失效
+                b.setEffectiveState("2");
+            } else {
+                //有效
+                b.setEffectiveState("3");
+            }
+        });
+        return buyerPage;
+    }
+
+    @Transactional(readOnly = false)
+    public void save(CmOrganizeBuyer cmOrganizeBuyer) {
+        Date date = new Date();
+        if (StringUtils.isBlank(cmOrganizeBuyer.getId())) {
+            //保存生成邀请码
+            Integer flag = getInvitationCode();
+            cmOrganizeBuyer.setInvitationCode(String.valueOf(flag));
+            cmOrganizeBuyer.setAddTime(date);
+            cmOrganizeBuyer.setStatus("1");
+            cmOrganizeBuyer.setDelFlag("0");
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            calendar.add(Calendar.DATE, 30);
+            cmOrganizeBuyer.setInvitationCodeTime(calendar.getTime());
+            //发送短信
+            String mobile = cmOrganizeBuyer.getMobile();
+            if (StringUtils.isNotEmpty(mobile)) {
+                SMSUtils.sendSms(mobile, "您的邀请码为:" + flag + ",在微信搜索“维沙采购商城”小程序,使用邀请码进行登录后,即可开始采购");
+            }
+        }
+        cmOrganizeBuyer.setUpdateTime(date);
+        super.save(cmOrganizeBuyer);
+    }
+
+    public CmOrganizeBuyer findByMobileOnly(String mobile) {
+        return organizeBuyerDao.findByMobile(mobile);
+    }
+
+    /**
+     * 验证获取不重复的邀请码
+     */
+    public Integer getInvitationCode() {
+        int flag = new Random().nextInt(999999);
+        if (flag < 100000) {
+            flag += 100000;
+        }
+        //判断生成随机码是否和数据库有重复
+        CmOrganizeBuyer buyer = new CmOrganizeBuyer();
+        buyer.setInvitationCode(String.valueOf(flag));
+        List<CmOrganizeBuyer> organizeBuyers = organizeBuyerDao.findList(buyer);
+        if (CollectionUtils.isNotEmpty(organizeBuyers) && organizeBuyers.size() > 0) {//存在邀请码重新获取
+            getInvitationCode();
+        }
+        return flag;
+    }
+
+
+    @Transactional(readOnly = false)
+    public void updateInvitationCode(CmOrganizeBuyer cmOrganizeBuyer) {
+        if (!StringUtils.equals("2", cmOrganizeBuyer.getStatus())) {//如果已绑定则不更新
+            //生成随机码6位
+            int flag = getInvitationCode();
+            cmOrganizeBuyer.setInvitationCode(String.valueOf(flag));
+            Calendar calendar = Calendar.getInstance();
+            Date date = new Date();
+            calendar.setTime(date);
+            calendar.add(Calendar.DATE, 30);
+            cmOrganizeBuyer.setInvitationCodeTime(calendar.getTime());
+            cmOrganizeBuyer.setStatus("1");
+            //发送短信
+            String mobile = cmOrganizeBuyer.getMobile();
+            if (StringUtils.isNotEmpty(mobile)) {
+                SMSUtils.sendSms(mobile, "您的邀请码为:" + flag + ",在微信搜索“维沙采购商城”小程序,使用邀请码进行登录后,即可开始采购");
+            }
+            cmOrganizeBuyer.setUpdateTime(date);
+            organizeBuyerDao.update(cmOrganizeBuyer);
+        }
+    }
+
+    @Transactional(readOnly = false)
+    public void untieBuyer(CmOrganizeBuyer cmOrganizeBuyer) {
+        cmOrganizeBuyer.setDelFlag("1");
+        organizeBuyerDao.update(cmOrganizeBuyer);
+    }
+}

+ 139 - 0
src/main/java/com/caimei/modules/weisha/service/CmOrganizeProductService.java

@@ -0,0 +1,139 @@
+package com.caimei.modules.weisha.service;
+
+import java.text.DecimalFormat;
+import java.util.Date;
+import java.util.List;
+
+import com.caimei.modules.product.entity.Product;
+import com.caimei.modules.weisha.entity.OrganizeProductLadderPrice;
+import com.caimei.utils.AppUtils;
+import com.caimei.utils.StringUtils;
+import com.thinkgem.jeesite.common.config.Global;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.service.CrudService;
+import com.caimei.modules.weisha.entity.CmOrganizeProduct;
+import com.caimei.modules.weisha.dao.CmOrganizeProductDao;
+
+import javax.annotation.Resource;
+
+/**
+ * 采美组织商品Service
+ * @author Aslee
+ * @version 2021-03-19
+ */
+@Service
+@Transactional(readOnly = true)
+public class CmOrganizeProductService extends CrudService<CmOrganizeProductDao, CmOrganizeProduct> {
+	@Resource
+	private CmOrganizeProductDao cmOrganizeProductDao;
+
+	public CmOrganizeProduct get(String id) {
+		return super.get(id);
+	}
+	
+	public List<CmOrganizeProduct> findList(CmOrganizeProduct cmOrganizeProduct) {
+		return super.findList(cmOrganizeProduct);
+	}
+	
+	public Page<CmOrganizeProduct> findPage(Page<CmOrganizeProduct> page, CmOrganizeProduct cmOrganizeProduct) {
+		cmOrganizeProduct.setPage(page);
+		List<CmOrganizeProduct> productList = cmOrganizeProductDao.findList(cmOrganizeProduct);
+		DecimalFormat decimalFormat = new DecimalFormat("0000");
+		productList.forEach(product->{
+			//格式化组织商品Id
+			product.setId(decimalFormat.format(Integer.parseInt(product.getId())));
+			//比例成本价加上机构税费处理
+			//若为含税,则成本为:售价*比例
+			//若为不含税,则成本为:(售价+售价*机构税率)*比例
+			//若为未知,则成本为:售价*比例
+			if (2 == product.getCostType()) {
+				if (0 == product.getIncludedTax()) {
+					product.setCostPrice((product.getPrice()+product.getPrice()*product.getClubTaxPoint()*0.01)*product.getCostProportional()*0.01);
+				} else {
+					product.setCostPrice(product.getPrice()*product.getCostProportional());
+				}
+			}
+		});
+		page.setList(productList);
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(CmOrganizeProduct cmOrganizeProduct) {
+		super.save(cmOrganizeProduct);
+		//保存阶梯价格列表
+		List<OrganizeProductLadderPrice> ladderPriceList = cmOrganizeProduct.getLadderPriceList();
+		if (1 == cmOrganizeProduct.getLadderPriceFlag()) {
+			for (int i = 0; i < ladderPriceList.size(); i++) {
+				Integer buyNum = ladderPriceList.get(i).getBuyNum();
+				Double buyPrice = ladderPriceList.get(i).getBuyPrice();
+				String ladderId = ladderPriceList.get(i).getId();
+				String delFlag = ladderPriceList.get(i).getDelFlag();
+				if ("0".equals(delFlag) && null != buyNum && null != buyPrice && !"".equals(buyPrice)) {
+					ladderPriceList.get(i).setProductId(Integer.parseInt(cmOrganizeProduct.getId()));
+					ladderPriceList.get(i).setLadderNum(i + 1);
+					if (StringUtils.isNotBlank(ladderId)) {
+						cmOrganizeProductDao.updateLadderPrice(ladderPriceList.get(i));
+					} else {
+						cmOrganizeProductDao.insertLadderPrice(ladderPriceList.get(i));
+					}
+				} else {
+					if (StringUtils.isNotBlank(ladderId)) {
+						cmOrganizeProductDao.deleteLadderPriceById(ladderId);
+					} else {
+						break;
+					}
+				}
+			}
+		}
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(CmOrganizeProduct cmOrganizeProduct) {
+		super.delete(cmOrganizeProduct);
+	}
+
+    public Page findProductPage(Page<Product> productPage, Product product) {
+		product.setPage(productPage);
+		List<Product> productList = cmOrganizeProductDao.findProductList(product);
+		String wwwServer = Global.getConfig("wwwServer");
+		productList.forEach(item ->{
+			item.setMainImage(AppUtils.getImageURL("product", item.getMainImage(), 0, wwwServer));
+		});
+		productPage.setList(productList);
+		return productPage;
+	}
+
+	@Transactional(readOnly = false)
+	public void addProducts(Integer organizeId, String productIds) {
+		String[] productIdArr = productIds.split(",");
+		for (String productId : productIdArr) {
+			if (StringUtils.isNotBlank(productId)) {
+				CmOrganizeProduct cmOrganizeProduct = cmOrganizeProductDao.findProductByProductId(productId);
+				cmOrganizeProduct.setProductId(Integer.parseInt(productId));
+				cmOrganizeProduct.setOrganizeId(organizeId);
+				cmOrganizeProduct.setAddTime(new Date());
+				cmOrganizeProductDao.insert(cmOrganizeProduct);
+			}
+		}
+
+	}
+
+	@Transactional(readOnly = false)
+	public void updateStatus(Integer id, Integer status) {
+		cmOrganizeProductDao.updateStatus(id, status);
+	}
+
+	public List<OrganizeProductLadderPrice> findLadderPrice(String id) {
+		List<OrganizeProductLadderPrice> ladderPriceList = cmOrganizeProductDao.findLadderPrice(id);
+		if (ladderPriceList != null) {
+			ladderPriceList.forEach(ladderPrice->{
+				ladderPrice.setDelFlag("0");
+			});
+		}
+		return ladderPriceList;
+	}
+}

+ 357 - 0
src/main/java/com/caimei/modules/weisha/service/CmOrganizePromotionService.java

@@ -0,0 +1,357 @@
+package com.caimei.modules.weisha.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.caimei.modules.bulkpurchase.entity.PurchaseProduct;
+import com.caimei.modules.cibe.entity.Shop;
+import com.caimei.modules.product.entity.Product;
+import com.caimei.modules.weisha.dao.CmOrganizePromotionDao;
+import com.caimei.modules.weisha.entity.CmOrganizePromotion;
+import com.caimei.utils.AppUtils;
+import com.caimei.utils.MathUtil;
+import com.caimei.utils.StringUtils;
+import com.foxinmy.weixin4j.util.StringUtil;
+import com.thinkgem.jeesite.common.config.Global;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.service.CrudService;
+import com.thinkgem.jeesite.common.utils.DateUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+@Service
+@Transactional(readOnly = true)
+public class CmOrganizePromotionService extends CrudService<CmOrganizePromotionDao, CmOrganizePromotion> {
+    @Autowired
+    private CmOrganizePromotionDao cmOrganizePromotionDao;
+
+    @Override
+    public CmOrganizePromotion get(String id) {
+        return super.get(id);
+    }
+
+    /**
+     * 促销活动列表
+     */
+    @Override
+    public Page<CmOrganizePromotion> findPage(Page<CmOrganizePromotion> page, CmOrganizePromotion cmOrganizePromotion) {
+        Page<CmOrganizePromotion> promotionPage = super.findPage(page, cmOrganizePromotion);
+        List<CmOrganizePromotion> promotionList = promotionPage.getList();
+        List<Product> promotionProducts = new ArrayList<>();
+        List<Product> giftProducts = new ArrayList<>();
+        List<Shop> promotionShops = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(promotionList)) {
+            for (CmOrganizePromotion promotion : promotionList
+            ) {
+                if (StringUtils.isNotBlank(cmOrganizePromotion.getProductName())) {
+                    promotion.setProductName(cmOrganizePromotion.getProductName());
+                }
+                if (StringUtils.isNotBlank(cmOrganizePromotion.getShopName())) {
+                    promotion.setShopName(cmOrganizePromotion.getShopName());
+                }
+                //未关闭
+                if ("0".equals(promotion.getDelFlag1())) {
+                    //永久活动设置为进行中
+                    if ("1".equals(promotion.getStatus())) {
+                        promotion.setDelFlag1("2");
+                    } else {
+                        Date nowTime = new Date();
+                        if (null != promotion.getBeginTime() && null != promotion.getEndTime()) {
+                            boolean effectiveDate = DateUtils.isEffectiveDate(nowTime, promotion.getBeginTime(), promotion.getEndTime());
+                            if (effectiveDate) {
+                                //进行中
+                                promotion.setDelFlag1("2");
+                            } else if (nowTime.compareTo(promotion.getEndTime()) > 0) {
+                                //已结束
+                                promotion.setDelFlag1("3");
+                            } else {
+                                //未开始
+                                promotion.setDelFlag1("1");
+                            }
+                        }else {
+                            promotion.setDelFlag1("0");
+                        }
+                    }
+                }else if("1".equals(promotion.getDelFlag1())){
+                    promotion.setDelFlag1("0");
+                }else if("2".equals(promotion.getDelFlag1())){
+                    promotion.setDelFlag1("4");
+                }
+                //非店铺促销下设置促销产品
+                if (!"3".equals(promotion.getType())) {
+                    //根据促销id和商品名查询
+                    promotionProducts = findPromotionProduct(promotion);
+                    promotion.setPromotionProducts(promotionProducts);
+                }else {
+                    promotionShops = findPromotionShops(promotion);
+                    promotion.setPromotionShops(promotionShops);
+                }
+                //赠品模式下设置赠品
+                if ("3".equals(promotion.getMode())) {
+                    giftProducts = findGiftProduct(promotion.getId());
+                    Integer giftNumber = 0;
+                    Integer giftTypeNumber = 0;
+                    for (Product product : giftProducts) {
+                        giftNumber += product.getGiftNumber();
+                        giftTypeNumber++;
+                    }
+                    promotion.setGiftProducts(giftProducts);
+                    promotion.setGiftNumber(giftNumber);
+                    promotion.setGiftTypeNumber(giftTypeNumber);
+                }
+            }
+        }
+        return promotionPage;
+    }
+
+    /**
+     * 根据促销活动id查询促销供应商
+     */
+    public List<Shop> findPromotionShops(CmOrganizePromotion cmOrganizePromotion) {
+        List<Shop> shops = cmOrganizePromotionDao.findPromotionShops(cmOrganizePromotion);
+        for (Shop shop : shops) {
+            if (shop != null) {
+                shop.setStoreStatus(true);
+            }
+        }
+        return shops;
+    }
+
+    /**
+     * 根据促销活动id查询促销商品
+     */
+    public List<Product> findPromotionProduct(CmOrganizePromotion cmOrganizePromotion) {
+        List<Product> products = cmOrganizePromotionDao.findPromotionProduct(cmOrganizePromotion);
+        String wwwServer = Global.getConfig("wwwServer");
+        for (Product product : products) {
+            if (product != null) {
+                product.setStoreStatus(true);
+                product.setMainImage(AppUtils.getImageURL("product", product.getMainImage(), 0, wwwServer));
+            }
+        }
+        return products;
+    }
+
+    /**
+     * 根据促销活动id查询促销赠品
+     */
+    public List<Product> findGiftProduct(String id) {
+        List<Product> products = cmOrganizePromotionDao.findGiftProduct(id);
+        String wwwServer = Global.getConfig("wwwServer");
+        for (Product product : products) {
+            if (product != null) {
+                product.setStoreStatus(true);
+                product.setMainImage(AppUtils.getImageURL("product", product.getMainImage(), 0, wwwServer));
+            }
+        }
+        return products;
+    }
+
+    /**
+     * 根据促销活动id查询促销赠品(订单)
+     */
+    public List<PurchaseProduct> findGiftPurchaseProduct(String id){
+        List<PurchaseProduct> list = cmOrganizePromotionDao.findGiftPurchaseProduct(id);
+        for (PurchaseProduct p : list) {
+            if (p != null) {
+                //1固定成本 2比例成
+                String costCheckFlag = p.getCostCheckFlag();
+                //固定成本价
+                if (com.thinkgem.jeesite.common.utils.StringUtils.equals("1", costCheckFlag)) {
+                    String costPrice = p.getCostPrice();
+                    //只有固定成本,应付供应商的金额=添加商品时的成本价
+                    p.setShopFee1(costPrice);
+                }
+                //比例成本价
+                if (com.thinkgem.jeesite.common.utils.StringUtils.equals("2", costCheckFlag)) {
+                    String costProportional = p.getCostProportional();
+                    String price = p.getPrice();
+                    if (com.thinkgem.jeesite.common.utils.StringUtils.isNotEmpty(costProportional)) {
+                        BigDecimal shopFee1 = (MathUtil.div(MathUtil.mul(costProportional, price), 100)).setScale(2, BigDecimal.ROUND_UP);
+                        p.setShopFee1(String.valueOf(shopFee1));
+                    }
+                }
+                BigDecimal shopFee = MathUtil.mul(p.getNum(), p.getShopFee1());
+                p.setShopFee(shopFee.toString());
+            }
+        }
+        return list;
+    }
+    /**
+     * 查询促销可用商品
+     */
+    public Page findProductPage(Page<Product> productPage, Product product) {
+        product.setPage(productPage);
+        List<Integer> list = new ArrayList<>();
+        //已添加的商品id不能被查询到
+        if (StringUtil.isNotBlank(product.getProductIds())) {
+            if (product.getProductIds().contains(",")) {
+                String[] split = product.getProductIds().split(",");
+                for (String productId : split) {
+                    if (StringUtil.isNotBlank(productId)) {
+                        list.add(Integer.valueOf(productId));
+                    }
+                }
+            } else {
+                list.add(Integer.valueOf(product.getProductIds()));
+            }
+        }
+        product.setIds(list);
+        //已删除的商品id能被查询到
+        List<Integer> delList = new ArrayList<>();
+        if (StringUtils.isNotBlank(product.getDelProductIds())) {
+            if (product.getDelProductIds().contains(",")) {
+                String split[] = product.getDelProductIds().split(",");
+                for (String productId : split) {
+                    if (StringUtils.isNotBlank(productId)) {
+                        delList.add(Integer.parseInt(productId));
+                    }
+                }
+            }else {
+                delList.add(Integer.parseInt(product.getDelProductIds()));
+            }
+        }
+        product.setDelIdList(delList);
+        List<Product> productList = new ArrayList<>();
+        //当选择促销商品时,需要排除掉相同促销类型下已参与促销的商品
+        productList = cmOrganizePromotionDao.findAllProduct(product);
+        String wwwServer = Global.getConfig("wwwServer");
+        DecimalFormat decimalFormat = new DecimalFormat("0000");
+        productList.forEach(item ->{
+            //图片处理
+            item.setMainImage(AppUtils.getImageURL("product", item.getMainImage(), 0, wwwServer));
+            //格式化组织商品Id
+            item.setProductIdStr(decimalFormat.format(item.getProductID()));
+        });
+        productPage.setList(productList);
+        return productPage;
+    }
+
+    /**
+     * 查询促销可用供应商
+     */
+    public Page findShopPage(Page<Shop> shopPage, Shop shop) {
+        shop.setPage(shopPage);
+        List<Integer> list = new ArrayList<>();
+        if (StringUtil.isNotBlank(shop.getShopIds()) ) {
+            if (shop.getShopIds().contains(",")) {
+                String[] split = shop.getShopIds().split(",");
+                for (String shopId : split) {
+                    if (StringUtil.isNotBlank(shopId)) {
+                        list.add(Integer.valueOf(shopId));
+                    }
+                }
+            } else {
+                list.add(Integer.valueOf(shop.getShopIds()));
+            }
+        }
+        shop.setIds(list);
+        List<Integer> delIdlist = new ArrayList<>();
+        if (StringUtils.isNotBlank(shop.getDelShopIds())) {
+            String[] split = shop.getDelShopIds().split(",");
+            for (String delShopId : split) {
+                if (StringUtil.isNotBlank(delShopId)) {
+                    delIdlist.add(Integer.valueOf(delShopId));
+                }
+            }
+        }
+        shop.setDelShopIdList(delIdlist);
+        List<Shop> shopList = new ArrayList<>();
+        shopList = cmOrganizePromotionDao.findAllShop(shop);
+        shopPage.setList(shopList);
+        return shopPage;
+    }
+
+    /**
+     * 保存促销活动
+     */
+    @Transactional(readOnly = false)
+    @Override
+    public void save(CmOrganizePromotion cmOrganizePromotion) {
+        if (StringUtil.isBlank(cmOrganizePromotion.getId())) {
+            cmOrganizePromotion.setAddTime(new Date());
+            cmOrganizePromotion.setDelFlag("0");
+        }
+        cmOrganizePromotion.setUpdateTime(new Date());
+        if (StringUtils.isNotBlank(cmOrganizePromotion.getType()) && StringUtils.isNotBlank(cmOrganizePromotion.getMode())) {
+            if ("1".equals(cmOrganizePromotion.getType()) && "1".equals(cmOrganizePromotion.getMode())){
+                // 优惠价
+                cmOrganizePromotion.setName("优惠价");
+            }else{
+                String type = "1".equals(cmOrganizePromotion.getType()) ? "单品" : "2".equals(cmOrganizePromotion.getType()) ? "凑单" : "3".equals(cmOrganizePromotion.getType()) ? "店铺" : "优惠";
+                String mode = "2".equals(cmOrganizePromotion.getMode()) ? "满减" : "3".equals(cmOrganizePromotion.getMode()) ? "满赠" : "优惠";
+                cmOrganizePromotion.setName(type + mode);
+            }
+        }
+        if (cmOrganizePromotion.getIsNewRecord()){
+            cmOrganizePromotion.preInsert();
+            cmOrganizePromotionDao.insert(cmOrganizePromotion);
+        }else{
+            cmOrganizePromotion.preUpdate();
+            cmOrganizePromotionDao.update(cmOrganizePromotion);
+        }
+        String promotionId = cmOrganizePromotion.getId();
+        //删除数据库中该促销活动原来的商品、赠品和商店
+        cmOrganizePromotionDao.deleteAllPromotionProductsAndShops(promotionId);
+        cmOrganizePromotionDao.deleteAllPromotionGifts(promotionId);
+
+        if (StringUtil.isNotBlank(cmOrganizePromotion.getProductIds())) {
+            List<HashMap> list = JSONArray.parseArray(cmOrganizePromotion.getProductIds(), HashMap.class);
+            for (HashMap map : list) {
+                String productId = (String) map.get("productId");
+                cmOrganizePromotionDao.insertPromotionProduct(promotionId, productId);
+            }
+        }
+        if (StringUtil.isNotBlank(cmOrganizePromotion.getGiftIds())) {
+            List<HashMap> list = JSONArray.parseArray(cmOrganizePromotion.getGiftIds(), HashMap.class);
+            for (HashMap map : list) {
+                String giftId = (String) map.get("productId");
+                Integer number = Integer.parseInt(map.get("number").toString());
+                cmOrganizePromotionDao.insertGiftProduct(promotionId, giftId, number);
+            }
+        }
+        if (StringUtil.isNotBlank(cmOrganizePromotion.getShopIds())) {
+            cmOrganizePromotionDao.insertPromotionShop(promotionId, cmOrganizePromotion.getShopIds());
+        }
+    }
+
+    /**
+     * 更新促销活动
+     */
+    @Transactional(readOnly = false)
+    public void update(CmOrganizePromotion cmOrganizePromotion) {
+        cmOrganizePromotion.setUpdateTime(new Date());
+        cmOrganizePromotion.preUpdate();
+        cmOrganizePromotionDao.update(cmOrganizePromotion);
+    }
+
+    /**
+     * 查询供应商信息
+     */
+    public Shop findShop(String shopId) {
+       return cmOrganizePromotionDao.findShop(shopId);
+    }
+
+    /**
+     * 查询产品对应的促销活动
+     */
+    public CmOrganizePromotion findProductPromotion(String shopId, Long productId) {
+         return cmOrganizePromotionDao.findProductPromotion(shopId, productId);
+    }
+
+    /**
+     * 获取组织商品信息
+     * @param productId
+     * @return
+     */
+    public Product getProduct(String productId) {
+        return cmOrganizePromotionDao.getProductByProductId(productId);
+    }
+}

+ 74 - 0
src/main/java/com/caimei/modules/weisha/web/CmMallOrganizeController.java

@@ -0,0 +1,74 @@
+package com.caimei.modules.weisha.web;
+
+import com.caimei.modules.weisha.entity.CmMallOrganize;
+import com.caimei.modules.weisha.service.CmMallOrganizeService;
+import com.thinkgem.jeesite.common.config.Global;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.utils.StringUtils;
+import com.thinkgem.jeesite.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 组织列表Controller
+ *
+ * @author plf
+ * @version 2021-03-18
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/weisha/cmMallOrganize")
+public class CmMallOrganizeController extends BaseController {
+
+    @Autowired
+    private CmMallOrganizeService cmMallOrganizeService;
+
+    @ModelAttribute
+    public CmMallOrganize get(@RequestParam(required = false) String id) {
+        CmMallOrganize entity = null;
+        if (StringUtils.isNotBlank(id)) {
+            entity = cmMallOrganizeService.get(id);
+        }
+        if (entity == null) {
+            entity = new CmMallOrganize();
+        }
+        return entity;
+    }
+
+    @RequestMapping(value = {"list", ""})
+    public String list(CmMallOrganize cmMallOrganize, HttpServletRequest request, HttpServletResponse response, Model model) {
+        Page<CmMallOrganize> page = cmMallOrganizeService.findPage(new Page<CmMallOrganize>(request, response), cmMallOrganize);
+        model.addAttribute("page", page);
+        return "modules/weisha/cmMallOrganizeList";
+    }
+
+    @RequestMapping(value = "form")
+    public String form(CmMallOrganize cmMallOrganize, Model model) {
+        model.addAttribute("cmMallOrganize", cmMallOrganize);
+        return "modules/weisha/cmMallOrganizeForm";
+    }
+
+    @RequestMapping(value = "save")
+    public String save(CmMallOrganize cmMallOrganize, Model model, RedirectAttributes redirectAttributes) {
+        if (!beanValidator(model, cmMallOrganize)) {
+            return form(cmMallOrganize, model);
+        }
+        cmMallOrganizeService.save(cmMallOrganize);
+        addMessage(redirectAttributes, "保存组织成功");
+        return "redirect:" + Global.getAdminPath() + "/weisha/cmMallOrganize/?repage";
+    }
+
+    @RequestMapping(value = "onlineAndOffline")
+    public String onlineAndOffline(Integer organizeId, String status) {
+        cmMallOrganizeService.onlineAndOffline(organizeId, status);
+        return "redirect:" + Global.getAdminPath() + "/weisha/cmMallOrganize/?repage";
+    }
+
+}

+ 103 - 0
src/main/java/com/caimei/modules/weisha/web/CmOrganizeBuyerController.java

@@ -0,0 +1,103 @@
+package com.caimei.modules.weisha.web;
+
+import com.caimei.modules.weisha.entity.CmMallOrganize;
+import com.caimei.modules.weisha.entity.CmOrganizeBuyer;
+import com.caimei.modules.weisha.service.CmMallOrganizeService;
+import com.caimei.modules.weisha.service.CmOrganizeBuyerService;
+import com.thinkgem.jeesite.common.config.Global;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.utils.StringUtils;
+import com.thinkgem.jeesite.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 采购人员Controller
+ *
+ * @author plf
+ * @version 2021-03-19
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/weisha/cmOrganizeBuyer")
+public class CmOrganizeBuyerController extends BaseController {
+
+    @Autowired
+    private CmOrganizeBuyerService cmOrganizeBuyerService;
+
+    @Autowired
+    private CmMallOrganizeService cmMallOrganizeService;
+
+    @ModelAttribute
+    public CmOrganizeBuyer get(@RequestParam(required = false) String id) {
+        CmOrganizeBuyer entity = null;
+        if (StringUtils.isNotBlank(id)) {
+            entity = cmOrganizeBuyerService.get(id);
+        }
+        if (entity == null) {
+            entity = new CmOrganizeBuyer();
+        }
+        return entity;
+    }
+
+    @RequestMapping(value = {"list", ""})
+    public String list(CmOrganizeBuyer cmOrganizeBuyer, HttpServletRequest request, HttpServletResponse response, Model model) {
+        Page<CmOrganizeBuyer> page = cmOrganizeBuyerService.findPage(new Page<CmOrganizeBuyer>(request, response), cmOrganizeBuyer);
+        CmMallOrganize mallOrganize = cmMallOrganizeService.get(cmOrganizeBuyer.getOrganizeId());
+        model.addAttribute("page", page);
+        model.addAttribute("mallOrganize", mallOrganize);
+        return "modules/weisha/cmOrganizeBuyerList";
+    }
+
+    @RequestMapping(value = "form")
+    public String form(CmOrganizeBuyer cmOrganizeBuyer, Model model) {
+        model.addAttribute("cmOrganizeBuyer", cmOrganizeBuyer);
+        return "modules/weisha/cmOrganizeBuyerForm";
+    }
+
+    @RequestMapping(value = "save")
+    public String save(CmOrganizeBuyer cmOrganizeBuyer, Model model, RedirectAttributes redirectAttributes) {
+        if (!beanValidator(model, cmOrganizeBuyer)) {
+            return form(cmOrganizeBuyer, model);
+        }
+        //判断该采购员手机号是否唯一
+        CmOrganizeBuyer buyer = cmOrganizeBuyerService.findByMobileOnly(cmOrganizeBuyer.getMobile());
+        if (buyer != null && StringUtils.isNotBlank(cmOrganizeBuyer.getId()) && !cmOrganizeBuyer.getId().equals(buyer.getId())) {
+            addMessage(model, "手机号重复,请更换手机号");
+            return form(cmOrganizeBuyer, model);
+        }
+        cmOrganizeBuyerService.save(cmOrganizeBuyer);
+        addMessage(redirectAttributes, "保存采购员成功");
+        return "redirect:" + Global.getAdminPath() + "/weisha/cmOrganizeBuyer/?organizeId=" + cmOrganizeBuyer.getOrganizeId();
+    }
+
+    /**
+     * 更新邀请码
+     */
+    @RequestMapping(value = "updateInvitationCode")
+    public String updateInvitationCode(CmOrganizeBuyer cmOrganizeBuyer, RedirectAttributes redirectAttributes) {
+        cmOrganizeBuyerService.updateInvitationCode(cmOrganizeBuyer);
+        addMessage(redirectAttributes, "更新邀请码成功");
+        return "redirect:" + Global.getAdminPath() + "/weisha/cmOrganizeBuyer/?organizeId=" + cmOrganizeBuyer.getOrganizeId();
+    }
+
+    /**
+     * 解绑
+     */
+    @RequestMapping("untieBuyer")
+    public String untieBuyer(CmOrganizeBuyer cmOrganizeBuyer, RedirectAttributes redirectAttributes) {
+        if ("2".equals(cmOrganizeBuyer.getStatus())) {
+            cmOrganizeBuyerService.untieBuyer(cmOrganizeBuyer);
+        }
+        addMessage(redirectAttributes, "解绑成功");
+        return "redirect:" + Global.getAdminPath() + "/weisha/cmOrganizeBuyer/?organizeId=" + cmOrganizeBuyer.getOrganizeId();
+    }
+
+}

+ 199 - 0
src/main/java/com/caimei/modules/weisha/web/CmOrganizeClubController.java

@@ -0,0 +1,199 @@
+package com.caimei.modules.weisha.web;
+
+import com.caimei.modules.common.dao.AreaDao;
+import com.caimei.modules.common.entity.City;
+import com.caimei.modules.common.entity.Province;
+import com.caimei.modules.common.entity.Town;
+import com.caimei.modules.user.dao.CmUserDao;
+import com.caimei.modules.user.entity.CmUser;
+import com.caimei.modules.user.entity.CmUserOrganize;
+import com.caimei.modules.user.entity.NewCmClub;
+import com.caimei.modules.user.service.CmUserService;
+import com.caimei.modules.user.service.NewCmClubService;
+import com.caimei.modules.weisha.entity.CmMallOrganize;
+import com.caimei.modules.weisha.service.CmMallOrganizeService;
+import com.caimei.utils.AppKeys;
+import com.caimei.utils.RandomCodeGenerator;
+import com.thinkgem.jeesite.common.config.Global;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.web.BaseController;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 组织机构Controller
+ *
+ * @author : plf
+ * @date : 2021/3/22
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/weisha/user")
+public class CmOrganizeClubController extends BaseController {
+
+    @Autowired
+    private CmUserDao cmUserDao;
+
+    @Autowired
+    private NewCmClubService newCmClubService;
+
+    @Autowired
+    private AreaDao areaDao;
+
+    @Autowired
+    private CmUserService cmUserService;
+
+    @Autowired
+    private CmMallOrganizeService cmMallOrganizeService;
+
+    /**
+     * 组织机构列表
+     */
+    @RequestMapping(value = "organizeClubList")
+    public String organizeClubList(CmUser cmUser, Page<CmUser> page, Model model) {
+        if (0 == page.getPageSize() || -1 == page.getPageSize()) {
+            page.setPageSize(30);
+        }
+        cmUser.setPage(page);
+        List<CmUser> cmUserList = cmUserDao.findListBuyUserInfo(cmUser);
+        page.setList(cmUserList);
+        CmMallOrganize mallOrganize = cmMallOrganizeService.get(cmUser.getUserOrganizeID().toString());
+        model.addAttribute("mallOrganize", mallOrganize);
+        model.addAttribute("cmUserClub", cmUserList);
+        model.addAttribute("startTime", cmUser.getStartTime());
+        model.addAttribute("endTime", cmUser.getEndTime());
+        return "modules/weisha/organizeClubList";
+    }
+
+    /**
+     * 上线机构(添加,编辑)
+     */
+    @RequestMapping(value = "addClubUser")
+    public String addClubUser(CmUserOrganize cmUserOrganize, NewCmClub newCmClub, Model model) {
+        model.addAttribute("userOrganizeID", cmUserOrganize.getId());
+        if (null != newCmClub.getClubID()) {
+            newCmClub = newCmClubService.findClubById(newCmClub.getClubID());
+        }
+        Integer provinceID = newCmClub.getProvinceID();
+        Integer townID = newCmClub.getTownID();
+        Integer cityID = newCmClub.getCityID();
+        //控制编辑异常时候的会显地址下拉框
+        if (null != provinceID && provinceID > 0) {
+            Province province = areaDao.loadProvinceById(provinceID);
+            newCmClub.setProvince(province.getName());
+        }
+        if (null != cityID && cityID > 0) {
+            City city = areaDao.loadCityById(cityID);
+            newCmClub.setCity(city.getName());
+        }
+        if (null != townID && townID > 0) {
+            Town town = areaDao.loadTownByID(townID);
+            newCmClub.setTown(town.getName());
+        }
+        model.addAttribute("newCmClub", newCmClub);
+        return "modules/weisha/addClubUserForm";
+    }
+
+    /**
+     * 保存上线机构信息
+     */
+    @RequestMapping(value = "saveAddClubUser")
+    @Transactional
+    public String saveAddClubUser(CmUserOrganize cmUserOrganize, Page<CmUser> page, NewCmClub newCmClub, CmUser cmUser, Model model) throws Exception {
+        String contractMobile = newCmClub.getContractMobile();
+        Integer userID = newCmClub.getUserID();
+        Integer clubID = newCmClub.getClubID();
+        cmUser.setUserOrganizeID(Integer.parseInt(cmUserOrganize.getId()));
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String currentDate = sdf.format(new Date());
+        //判断该会所手机号是否已存在
+        cmUser.setBindMobile(contractMobile);
+        List<CmUser> listBuyBindMobile = cmUserService.findListBuyBindMobile(cmUser);
+        if (CollectionUtils.isNotEmpty(listBuyBindMobile) && listBuyBindMobile.size() > 0) {
+            addMessage(model, "手机号重复,请更换手机号");
+            return addClubUser(cmUserOrganize, newCmClub, model);
+        }
+
+        //添加用户信息(新增或修改通用)
+        cmUser.setName(newCmClub.getName());
+        cmUser.setUserName(newCmClub.getName());
+        cmUser.setRealName(newCmClub.getName());
+        //添加用户新增信息
+        if (null == userID) {//新增
+            cmUser.setClubStatus("90");
+            cmUser.setRegisterUserTypeID("4");//设置为会所
+            cmUser.setUserIdentity(4);
+            cmUser.setServiceProviderStatus("90");//设置默认协销状态
+            cmUser.setServiceProviderID("1342");
+            cmUser.setAuditTime(currentDate);
+            cmUser.setAuditStatus("1");//审核通过
+            cmUser.setAuditNote("后台添加用户系统默认审核通过");
+            cmUser.setRegisterTime(currentDate);
+            cmUser.setLoginTime(currentDate);
+            cmUser.setAccount(newCmClub.getContractMobile() + RandomCodeGenerator.generateAccount(2));
+            cmUser.setPassword("weisha");
+            cmUser.setBindMobile(newCmClub.getContractMobile());
+            cmUser.setUserName(newCmClub.getName());
+            cmUser.setUserMoney(0d);
+            cmUser.setAbleUserMoney(0d);
+            cmUser.setValidFlag("1");
+            cmUser.setAgreeFlag("1");
+            cmUser.setUserLevelID("1");
+            cmUser.setUserPermission(5);
+            cmUserService.insert(cmUser);//插入新的用户数据
+        }
+        //添加会所表信息
+        newCmClub.setSname(newCmClub.getName());
+        if (null == clubID) {
+            newCmClub.setStatus(90);
+            newCmClub.setUserID(cmUser.getUserID());
+            newCmClub.setDefaultServiceProviderID(AppKeys.DEFAULT_SPID);
+            newCmClub.setSpID(AppKeys.DEFAULT_SPID);
+            newCmClub.setMainServiceProviderID(AppKeys.DEFAULT_SPID);
+            newCmClub.setAddTime(currentDate);
+            newCmClub.setLinkMan1(newCmClub.getLinkMan());
+            newCmClub.setContractMobile1(newCmClub.getContractMobile());
+            newCmClub.setLevel(0d);
+            newCmClub.setSubClubCount(0);
+            newCmClub.setFavoriteTimes(0);
+            newCmClub.setClubTypeID(1);
+            newCmClub.setDefaultServiceProviderUpdTime(currentDate);
+            newCmClubService.insert(newCmClub);
+
+            //更新用户绑定关系
+            cmUser.setClubID(String.valueOf(newCmClub.getClubID()));
+            String nick = cmUser.getUserID() + "_" + RandomCodeGenerator.generateCodeString(4).toLowerCase();
+            cmUser.setNick(nick);
+            cmUser.setCompanyUserID(cmUser.getUserID());
+
+            //更新会所绑定关系
+            newCmClub.setUserID(cmUser.getUserID());
+        }
+        cmUserService.update(cmUser);//更新用户表数据(编辑数据,或新增数据更新)
+
+        newCmClubService.update(newCmClub);//更新会所表数据(编辑数据,或新增数据更新)
+        return "redirect:" + Global.getAdminPath() + "/weisha/user/organizeClubList?userOrganizeID=" + cmUserOrganize.getId();
+    }
+
+    /**
+     * 机构上下线
+     */
+    @RequestMapping(value = "onlineAndOffline")
+    public String onlineAndOffline(CmUser cmUser) {
+        cmUserService.update(cmUser);//更新用户表数据
+        NewCmClub newCmClub = new NewCmClub();
+        newCmClub.setClubID(Integer.parseInt(cmUser.getClubID()));
+        newCmClub.setUserID(cmUser.getUserID());
+        newCmClub.setStatus(Integer.valueOf(cmUser.getClubStatus()));
+        newCmClubService.update(newCmClub);//更新会所表数据
+        return "redirect:" + Global.getAdminPath() + "/weisha/user/organizeClubList?userOrganizeID=" + cmUser.getUserOrganizeID();
+    }
+
+}

+ 133 - 0
src/main/java/com/caimei/modules/weisha/web/CmOrganizeProductController.java

@@ -0,0 +1,133 @@
+package com.caimei.modules.weisha.web;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.caimei.modules.product.entity.Product;
+import com.caimei.modules.product.entity.ProductDetailInfo;
+import com.caimei.modules.weisha.entity.OrganizeProductLadderPrice;
+import com.caimei.po.ProductLadderPrice;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.apache.shiro.crypto.hash.Hash;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.thinkgem.jeesite.common.config.Global;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.web.BaseController;
+import com.thinkgem.jeesite.common.utils.StringUtils;
+import com.caimei.modules.weisha.entity.CmOrganizeProduct;
+import com.caimei.modules.weisha.service.CmOrganizeProductService;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 采美组织商品Controller
+ * @author Aslee
+ * @version 2021-03-19
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/weisha/cmOrganizeProduct")
+public class CmOrganizeProductController extends BaseController {
+
+	@Autowired
+	private CmOrganizeProductService cmOrganizeProductService;
+	
+	@ModelAttribute
+	public CmOrganizeProduct get(@RequestParam(required=false) String id) {
+		CmOrganizeProduct entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = cmOrganizeProductService.get(id);
+		}
+		if (entity == null){
+			entity = new CmOrganizeProduct();
+		}
+		return entity;
+	}
+	
+	@RequestMapping(value = {"list", ""})
+	public String list(CmOrganizeProduct cmOrganizeProduct, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<CmOrganizeProduct> page = cmOrganizeProductService.findPage(new Page<CmOrganizeProduct>(request, response), cmOrganizeProduct); 
+		model.addAttribute("page", page);
+		model.addAttribute("organizeId", cmOrganizeProduct.getOrganizeId());
+		return "modules/weisha/cmOrganizeProductList";
+	}
+
+	@RequestMapping(value = "form")
+	public String form(CmOrganizeProduct cmOrganizeProduct, Model model) {
+		if (null != cmOrganizeProduct.getId()) {
+			List<OrganizeProductLadderPrice> ladderPriceList = cmOrganizeProductService.findLadderPrice(cmOrganizeProduct.getId());
+			cmOrganizeProduct.setLadderPriceList(ladderPriceList);
+		}
+		model.addAttribute("cmOrganizeProduct", cmOrganizeProduct);
+		return "modules/weisha/cmOrganizeProductForm";
+	}
+
+	@RequestMapping(value = "save")
+	public String save(CmOrganizeProduct cmOrganizeProduct, Model model, RedirectAttributes redirectAttributes) {
+			if (!beanValidator(model, cmOrganizeProduct)){
+			return form(cmOrganizeProduct, model);
+		}
+		cmOrganizeProductService.save(cmOrganizeProduct);
+		addMessage(redirectAttributes, "保存组织商品成功");
+		return "redirect:"+Global.getAdminPath()+"/weisha/cmOrganizeProduct/?repage";
+	}
+	
+	@RequestMapping(value = "delete")
+	public String delete(CmOrganizeProduct cmOrganizeProduct, RedirectAttributes redirectAttributes) {
+		cmOrganizeProductService.delete(cmOrganizeProduct);
+		addMessage(redirectAttributes, "删除组织商品成功");
+		return "redirect:" + Global.getAdminPath() + "/weisha/cmOrganizeProduct/?repage&organizeId=" + cmOrganizeProduct.getOrganizeId();
+	}
+
+    /**
+     * 添加商品页面
+     * @param product
+     * @param model
+     * @param request
+     * @param response
+     * @return
+     */
+	@RequestMapping(value = "findProductPage")
+	public String findProductPage(Product product, Model model, HttpServletRequest request, HttpServletResponse response) {
+		Page page = cmOrganizeProductService.findProductPage(new Page<Product>(request, response), product);
+		model.addAttribute("page", page);
+		model.addAttribute("organizeId", product.getOrganizeId());
+		return "modules/weisha/findOrganizeProduct";
+	}
+
+    /**
+     * 添加商品
+     *
+     * @return
+     */
+    @RequestMapping(value = "addProducts")
+	@ResponseBody
+    public Map<String,Object> addProducts(Integer organizeId, String productIds, RedirectAttributes redirectAttributes) {
+        cmOrganizeProductService.addProducts(organizeId, productIds);
+		HashMap<String,Object> map = new HashMap<>(2);
+		map.put("success", true);
+		map.put("info", "添加组织商品成功");
+		return map;
+	}
+
+	/**
+	 * 修改商品上架状态
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "updateStatus")
+	public String addProducts(Integer organizeId, Integer id, Integer status, RedirectAttributes redirectAttributes) {
+		cmOrganizeProductService.updateStatus(id, status);
+		addMessage(redirectAttributes, (status == 1 ? "上架" : "下架") + "组织商品成功");
+		return "redirect:" + Global.getAdminPath() + "/weisha/cmOrganizeProduct/?repage&organizeId=" + organizeId;
+	}
+}

+ 439 - 0
src/main/java/com/caimei/modules/weisha/web/CmOrganizePromotionController.java

@@ -0,0 +1,439 @@
+package com.caimei.modules.weisha.web;
+
+import com.caimei.modules.bulkpurchase.entity.PurchaseProduct;
+import com.caimei.modules.cibe.entity.Shop;
+import com.caimei.modules.product.entity.Product;
+import com.caimei.modules.product.service.ProductService;
+import com.caimei.modules.weisha.entity.CmOrganizePromotion;
+import com.caimei.modules.weisha.service.CmOrganizePromotionService;
+import com.caimei.utils.AppUtils;
+import com.foxinmy.weixin4j.util.StringUtil;
+import com.thinkgem.jeesite.common.config.Global;
+import com.thinkgem.jeesite.common.persistence.Page;
+import com.thinkgem.jeesite.common.utils.DateUtils;
+import com.thinkgem.jeesite.common.utils.StringUtils;
+import com.thinkgem.jeesite.common.web.BaseController;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+
+/**
+ * 促销活动列表Controller
+ *
+ * @author Aslee
+ * @version 2020-08-21
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/weisha/cmOrganizePromotions")
+public class CmOrganizePromotionController extends BaseController {
+    @Autowired
+    private CmOrganizePromotionService cmOrganizePromotionService;
+    @Autowired
+    private ProductService productService;
+
+
+
+    @ModelAttribute
+    public CmOrganizePromotion get(@RequestParam(required = false) String id) {
+        CmOrganizePromotion entity = null;
+        if (StringUtils.isNotBlank(id)) {
+            entity = cmOrganizePromotionService.get(id);
+            if (entity != null) {
+                //正常状态
+                if ("0".equals(entity.getDelFlag1())) {
+                    if ("1".equals(entity.getStatus())) {
+                        entity.setDelFlag1("2");
+                    }else {
+                        Date now = new Date();
+                        if (null != entity.getBeginTime() && null != entity.getEndTime()) {
+                            boolean effectiveDate = DateUtils.isEffectiveDate(now, entity.getBeginTime(), entity.getEndTime());
+                            if (effectiveDate) {
+                                entity.setDelFlag1("2");
+                            } else if (now.before(entity.getBeginTime())) {
+                                entity.setDelFlag1("1");
+                            } else {
+                                entity.setDelFlag1("3");
+                            }
+                        }else {
+                            entity.setDelFlag1("0");
+                        }
+                    }
+                }else {
+                    //关闭或删除
+                    entity.setDelFlag1("0");
+                }
+                if ("1".equals(entity.getMode())) {
+                    entity.setTouchPrice1(entity.getTouchPrice());
+                } else if ("2".equals(entity.getMode())) {
+                    entity.setTouchPrice2(entity.getTouchPrice());
+                }else if ("3".equals(entity.getMode())) {
+                    entity.setTouchPrice3(entity.getTouchPrice());
+                }
+            }
+        }
+        if (entity == null) {
+            entity = new CmOrganizePromotion();
+        }
+        return entity;
+    }
+
+    /**
+     * 活动列表
+     */
+    @RequiresPermissions("product:product:view")
+    @RequestMapping(value = {"list", ""})
+    public String list(CmOrganizePromotion cmOrganizePromotion, HttpServletRequest request, HttpServletResponse response, Model model) {
+        Page<CmOrganizePromotion> page = cmOrganizePromotionService.findPage(new Page<CmOrganizePromotion>(request, response), cmOrganizePromotion);
+        model.addAttribute("page", page);
+        if ("1".equals(cmOrganizePromotion.getType())) {
+            //单品促销活动页
+            return "modules/weisha/organizeSinglePromotionList";
+        } else if ("2".equals(cmOrganizePromotion.getType())) {
+            //凑单促销活动页
+            return "modules/product-new/multiPromotionList";
+        } else {
+            //店铺促销活动页
+            return "modules/product-new/shopPromotionList";
+        }
+    }
+
+    /**
+     * 新增/编辑表单回显
+     */
+    @RequiresPermissions("product:product:view")
+    @RequestMapping(value = "form")
+    public String form(CmOrganizePromotion cmOrganizePromotion, Model model) {
+        if (cmOrganizePromotion != null) {
+            //表单选择商品或供应商后刷新时设置促销状态
+            if ("close".equals(cmOrganizePromotion.getDelFlag1())) {
+                cmOrganizePromotion.setDelFlag1("0");
+            } else if ("undefined".equals(cmOrganizePromotion.getDelFlag1())) {
+                if ("1".equals(cmOrganizePromotion.getStatus())) {
+                    cmOrganizePromotion.setDelFlag1("2");
+                } else {
+                    Date nowTime = new Date();
+                    if (cmOrganizePromotion.getBeginTime() != null && cmOrganizePromotion.getEndTime() != null) {
+                        boolean effectiveDate = DateUtils.isEffectiveDate(nowTime, cmOrganizePromotion.getBeginTime(), cmOrganizePromotion.getEndTime());
+                        if (effectiveDate) {
+                            //进行中
+                            cmOrganizePromotion.setDelFlag1("2");
+                        } else if (nowTime.compareTo(cmOrganizePromotion.getEndTime()) > 0) {
+                            //已结束
+                            cmOrganizePromotion.setDelFlag1("3");
+                        } else {
+                            //未开始
+                            cmOrganizePromotion.setDelFlag1("1");
+                        }
+                    }else {
+                        cmOrganizePromotion.setDelFlag1("0");
+                    }
+                }
+            }
+            List<Product> promotionProducts = new ArrayList<>();
+            List<Product> giftProducts = new ArrayList<>();
+            List<Shop> promotionShops = new ArrayList<>();
+            //添加表单新增的产品、赠品、供应商
+            if (StringUtil.isNotBlank(cmOrganizePromotion.getProductIds())) {
+                if (cmOrganizePromotion.getProductIds().contains(",")) {
+                    String[] split = cmOrganizePromotion.getProductIds().split(",");
+                    for (String productId : split) {
+                        if (StringUtil.isNotBlank(productId)) {
+                            Product product = cmOrganizePromotionService.getProduct(productId);
+                            promotionProducts.add(product);
+                        }
+                    }
+                }else {
+                    Product product = cmOrganizePromotionService.getProduct(cmOrganizePromotion.getProductIds());
+                    promotionProducts.add(product);
+                }
+            }
+            if (StringUtil.isNotBlank(cmOrganizePromotion.getGiftIds())) {
+                if (cmOrganizePromotion.getGiftIds().contains(",")) {
+                    String[] split = cmOrganizePromotion.getGiftIds().split(",");
+                    for (String giftId : split) {
+                        if (StringUtil.isNotBlank(giftId)) {
+                            Product product = cmOrganizePromotionService.getProduct(giftId);
+                            giftProducts.add(product);
+                        }
+                    }
+                }else {
+                    Product product = cmOrganizePromotionService.getProduct(cmOrganizePromotion.getGiftIds());
+                    giftProducts.add(product);
+                }
+            }
+            if (StringUtil.isNotBlank(cmOrganizePromotion.getShopIds())) {
+                if (cmOrganizePromotion.getShopIds().contains(",")) {
+                    String[] split = cmOrganizePromotion.getShopIds().split(",");
+                    for (String shopId : split) {
+                        if (StringUtil.isNotBlank(shopId)) {
+                            Shop shop = cmOrganizePromotionService.findShop(shopId);
+                            promotionShops.add(shop);
+                        }
+                    }
+                }else {
+                    Shop shop = cmOrganizePromotionService.findShop(cmOrganizePromotion.getShopIds());
+                    promotionShops.add(shop);
+                }
+            }
+            //添加数据库中商品、赠品、供应商(排除掉表单中被删除掉的)
+            String delProductIds = cmOrganizePromotion.getDelProductIds();
+            String delGiftIds = cmOrganizePromotion.getDelGiftIds();
+            String delShopIds = cmOrganizePromotion.getDelShopIds();
+            if (StringUtil.isNotBlank(cmOrganizePromotion.getId())) {
+                //非店铺促销下添加促销商品
+                if (!"3".equals(cmOrganizePromotion.getType())) {
+                    //单品促销时,若添加了新商品或者删除了商品,则不需要从数据库中查询促销商品
+                    if (!"0".equals(cmOrganizePromotion.getSearchDbFlag())){
+                        if (StringUtil.isNotBlank(delProductIds)) {
+                            List<Product> promotionProduct = cmOrganizePromotionService.findPromotionProduct(cmOrganizePromotion);
+                            List<String> delProductIdList = new ArrayList<>();
+                            if (delProductIds.contains(",")) {
+                                String[] split = delProductIds.split(",");
+                                delProductIdList = Arrays.asList(split);
+                            }else {
+                                delProductIdList.add(delProductIds);
+                            }
+                            ListIterator<Product> productListIterator = promotionProduct.listIterator();
+                            while (productListIterator.hasNext()) {
+                                Product next = productListIterator.next();
+                                if (delProductIdList.contains(next.getProductID().toString())) {
+                                    productListIterator.remove();
+                                }
+                            }
+                            promotionProducts.addAll(promotionProduct);
+                        } else {
+                            promotionProducts.addAll(cmOrganizePromotionService.findPromotionProduct(cmOrganizePromotion));
+                        }
+                    } else if (StringUtils.isBlank(cmOrganizePromotion.getDelProductIds())) {
+                        //将原有的促销商品id加入delProductIds,使得添加促销商品时能够找到
+                        List<Product> promotionProduct = cmOrganizePromotionService.findPromotionProduct(cmOrganizePromotion);
+                        cmOrganizePromotion.setDelProductIds(promotionProduct.size()>0?promotionProduct.get(0).getProductID().toString():"");
+                    }
+                    //店铺促销
+                }else if ("3".equals(cmOrganizePromotion.getType())){
+                    //店铺促销时,若添加了新店铺或者删除了店铺,则不需要从数据库中查询促销店铺
+                    if (!"0".equals(cmOrganizePromotion.getSearchDbFlag())){
+                        if (StringUtil.isNotBlank(delShopIds)) {
+                            List<Shop> promotionShop = cmOrganizePromotionService.findPromotionShops(cmOrganizePromotion);
+                            List<String> delShopIdList = new ArrayList<>();
+                            if (delShopIds.contains(",")) {
+                                String[] split = delShopIds.split(",");
+                                delShopIdList = Arrays.asList(split);
+                            }else {
+                                delShopIdList.add(delShopIds);
+                            }
+                            ListIterator<Shop> shopListIterator = promotionShop.listIterator();
+                            while (shopListIterator.hasNext()) {
+                                Shop next = shopListIterator.next();
+                                if (delShopIdList.contains(next.getShopID().toString())) {
+                                    shopListIterator.remove();
+                                }
+                            }
+                            promotionShops.addAll(promotionShop);
+                        } else {
+                            promotionShops.addAll(cmOrganizePromotionService.findPromotionShops(cmOrganizePromotion));
+                        }
+                    } else if (StringUtils.isBlank(cmOrganizePromotion.getDelShopIds())) {
+                        //将原有的促销店铺id加入delProductIds,使得添加促销店铺时能够找到
+                        List<Shop> promotionShop = cmOrganizePromotionService.findPromotionShops(cmOrganizePromotion);
+                        cmOrganizePromotion.setDelShopIds(promotionShop.size()>0?promotionShop.get(0).getShopID().toString():"");
+                    }
+
+                }
+                if ("3".equals(cmOrganizePromotion.getMode())) {
+                    if (StringUtil.isNotBlank(delGiftIds)) {
+                        List<Product> giftProduct = cmOrganizePromotionService.findGiftProduct(cmOrganizePromotion.getId());
+                        List<String> delGiftIdList = new ArrayList<>();
+                        if (delGiftIds.contains(",")) {
+                            String[] split = delGiftIds.split(",");
+                            delGiftIdList = Arrays.asList(split);
+                        }else {
+                            delGiftIdList.add(delGiftIds);
+                        }
+                        ListIterator<Product> giftListIterator = giftProduct.listIterator();
+                        while (giftListIterator.hasNext()) {
+                            Product next = giftListIterator.next();
+                            if (delGiftIdList.contains(next.getProductID().toString())) {
+                                giftListIterator.remove();
+                            }
+                        }
+                        giftProducts.addAll(giftProduct);
+                    } else {
+                        giftProducts.addAll(cmOrganizePromotionService.findGiftProduct(cmOrganizePromotion.getId()));
+                    }
+                }
+            }
+            String wwwServer = Global.getConfig("wwwServer");
+            //设置图片路径
+            promotionProducts.forEach(product -> {
+                if (product != null) {
+                    product.setMainImage(AppUtils.getImageURL("product", product.getMainImage(), 0, wwwServer));
+                }
+            });
+            giftProducts.forEach(product -> {
+                if (product != null) {
+                    product.setMainImage(AppUtils.getImageURL("product", product.getMainImage(), 0, wwwServer));
+                }
+            });
+            cmOrganizePromotion.setPromotionProducts(promotionProducts);
+            cmOrganizePromotion.setGiftProducts(giftProducts);
+            cmOrganizePromotion.setPromotionShops(promotionShops);
+            model.addAttribute("cmOrganizePromotion", cmOrganizePromotion);
+            if (cmOrganizePromotion.getPromotionProducts().size() > 0) {
+                model.addAttribute("price1", cmOrganizePromotion.getPromotionProducts().get(0).getPrice1());
+            } else {
+                model.addAttribute("price1", 0);
+            }
+            if ("1".equals(cmOrganizePromotion.getType())) {
+                return "modules/weisha/organizeSinglePromotionForm";
+            } else if ("2".equals(cmOrganizePromotion.getType())) {
+                return "modules/product-new/multiPromotionForm";
+            }else {
+                return "modules/product-new/shopPromotionForm";
+            }
+        } else {
+            return null;
+        }
+
+    }
+
+    /**
+     * 修改促销活动状态
+     */
+    @RequiresPermissions("product:product:view")
+    @RequestMapping(value = "updateStatus")
+    @ResponseBody
+    public Map<String, Object> updateStatus( String id,String flag, RedirectAttributes redirectAttributes) {
+        Map<String, Object> map = new HashMap<>();
+        if (StringUtils.isNotBlank(id)) {
+            CmOrganizePromotion cmOrganizePromotion = cmOrganizePromotionService.get(id);
+            if (cmOrganizePromotion == null) {
+                map.put("success", false);
+                map.put("msg", "该促销活动不存在");
+                return map;
+            }
+            //关闭活动
+            if ("close".equals(flag)) {
+                //关闭活动
+                map.put("msg", "关闭成功");
+                cmOrganizePromotion.setDelFlag1("1");
+            } else if("open".equals(flag)){
+                //开启活动
+                map.put("msg", "开启成功");
+                if ("1".equals(cmOrganizePromotion.getStatus())) {
+                    cmOrganizePromotion.setDelFlag1("0");
+                } else {
+                    if (cmOrganizePromotion.getBeginTime() != null && cmOrganizePromotion.getEndTime() != null) {
+                        cmOrganizePromotion.setDelFlag1("0");
+                    }else {
+                        map.put("success", false);
+                        map.put("msg", "促销活动开始时间和结束时间不能为空,请编辑该活动");
+                        return map;
+                    }
+                }
+            }else if ("delete".equals(flag)){
+                //删除活动
+                map.put("msg", "删除成功");
+                cmOrganizePromotion.setDelFlag1("2");
+            }
+            cmOrganizePromotion.setUpdateTime(new Date());
+            cmOrganizePromotionService.update(cmOrganizePromotion);
+            map.put("success", true);
+        } else {
+            map.put("success", false);
+            map.put("msg", "促销活动id不能为空");
+        }
+        return map;
+    }
+
+    /**
+     * 添加商品/赠品数据
+     */
+    @RequiresPermissions("product:product:view")
+    @RequestMapping(value = "findProductPage")
+    public String findProductPage(Product product, Model model, HttpServletRequest request, HttpServletResponse response) {
+        Page page = cmOrganizePromotionService.findProductPage(new Page<Product>(request, response), product);
+        model.addAttribute("page", page);
+        model.addAttribute("promotionType", product.getPromotionType());
+        model.addAttribute("ids", product.getIds());
+        model.addAttribute("delProductIds", product.getDelProductIds());
+        if ("1".equals(product.getPromotionType())) {
+            return "modules/weisha/findPromotionSingleProduct";
+        }else {
+            return "modules/product-new/promotionSelectProducts";
+        }
+    }
+
+    /**
+     * 添加供应商数据
+     */
+    @RequiresPermissions("product:product:view")
+    @RequestMapping(value = "findSupplierPage")
+    public String findSupplierPage(Shop shop, Model model, HttpServletRequest request, HttpServletResponse response) {
+        Page page = cmOrganizePromotionService.findShopPage(new Page<Shop>(request, response), shop);
+        model.addAttribute("page", page);
+        model.addAttribute("shopIds", shop.getShopIds());
+        model.addAttribute("delShopIds", shop.getDelShopIds());
+        return "modules/product-new/promotionSelectShop";
+    }
+
+    /**
+     * 保存促销列表
+     */
+    @RequiresPermissions("product:product:view")
+    @RequestMapping(value = "save")
+    public String save(CmOrganizePromotion cmOrganizePromotion, Model model, RedirectAttributes redirectAttributes) {
+        if ("1".equals(cmOrganizePromotion.getMode())) {
+            cmOrganizePromotion.setTouchPrice(cmOrganizePromotion.getTouchPrice1());
+        }else if ("2".equals(cmOrganizePromotion.getMode())) {
+            cmOrganizePromotion.setTouchPrice(cmOrganizePromotion.getTouchPrice2());
+        }else if ("3".equals(cmOrganizePromotion.getMode())) {
+            cmOrganizePromotion.setTouchPrice(cmOrganizePromotion.getTouchPrice3());
+        }
+        if ("close".equals(cmOrganizePromotion.getDelFlag1())) {
+            cmOrganizePromotion.setDelFlag1("1");
+        }else if (cmOrganizePromotion.getDelFlag1() == null || "undefined".equals(cmOrganizePromotion.getDelFlag1())){
+            if ("1".equals(cmOrganizePromotion.getStatus())) {
+                //永久开启
+                cmOrganizePromotion.setDelFlag1("0");
+            } else {
+                //区间有效判断起止时间是否为空
+                if (null != cmOrganizePromotion.getBeginTime() && null != cmOrganizePromotion.getEndTime()) {
+                    cmOrganizePromotion.setDelFlag1("0");
+                }else {
+                    cmOrganizePromotion.setDelFlag1("1");
+                }
+            }
+        } else {
+            cmOrganizePromotion.setDelFlag1("0");
+        }
+        if (!beanValidator(model, cmOrganizePromotion)) {
+            return form(cmOrganizePromotion, model);
+        }
+        cmOrganizePromotionService.save(cmOrganizePromotion);
+        addMessage(redirectAttributes, "保存促销列表成功");
+        return "redirect:" + Global.getAdminPath() + "/weisha/cmOrganizePromotions/?type=" + cmOrganizePromotion.getType()
+                + "&organizeId=" + cmOrganizePromotion.getOrganizeId();
+    }
+
+    /**
+     * 获取赠品接口
+     */
+    @RequiresPermissions("product:product:view")
+    @RequestMapping(value = "getGifts")
+    @ResponseBody
+    public List<PurchaseProduct> getGifts(String id) {
+        return cmOrganizePromotionService.findGiftPurchaseProduct(id);
+    }
+}

+ 1 - 1
src/main/resources/mappings/modules/bulkpurchase/PurchaseProductMapper.xml

@@ -87,7 +87,7 @@
 			<if test="shopName != null and shopName != ''">
 				AND b.name  like concat('%',#{shopName},'%')
 			</if>
-				and a.validFlag=2
+				and (a.validFlag=2 or a.validFlag = 9)
 			    AND a.productID != 999
 			    and a.productCategory  = 1
 		</where>

+ 14 - 0
src/main/resources/mappings/modules/order/OrderMapper.xml

@@ -122,6 +122,10 @@
         FROM cm_order co
         LEFT JOIN bp_order_userinfo bou ON bou.orderId = co.orderID
         LEFT JOIN user u ON u.userID = co.userID
+		LEFT JOIN club c ON u.userID = c.userID
+		LEFT JOIN serviceprovider sp ON c.spID = sp.serviceProviderID and sp.status = 90
+		LEFT JOIN cm_order_product cop ON co.orderID = cop.orderID
+	    LEFT JOIN product p ON cop.productID = p.productID
         <where>
             <if test="orderID != null and orderID != ''">
                 AND co.orderID = #{orderID}
@@ -251,6 +255,13 @@
 				and c1.delFlag = '0'
 				and cdr.receiptStatus = '2'))
 			</if>
+		    <if test="serviceProviderId != null and serviceProviderId != 0">
+				and (co.spID = #{serviceProviderId}
+				or sp.serviceProviderID = #{serviceProviderId})
+			</if>
+			<if test="productName != null and productName != ''">
+				and p.name like CONCAT('%',#{productName},'%')
+			</if>
 			AND co.delFlag = 0
         </where>
         <choose>
@@ -707,6 +718,9 @@
 		select * from cm_promotions_order
 		where promotionsId=#{promotionsId} and orderId=#{orderId}
 	</select>
+	<select id="findServiceProviderList" resultType="com.caimei.modules.user.entity.NewCmSp">
+		select serviceProviderID,linkMan1 from serviceprovider where status = 90 and serviceProviderID != 1342
+	</select>
 	<insert id="insertPromotionsRecord" parameterType="com.caimei.modules.product.entity.CmPromotion" keyProperty="id" useGeneratedKeys="true">
 		INSERT INTO cm_promotions_order(
 			orderId,

+ 1 - 1
src/main/resources/mappings/modules/user/CmUserOrganizeMapper.xml

@@ -241,7 +241,7 @@
 	</select>
 
 	<select id="findOrganize" resultType="com.caimei.modules.user.entity.CmUserOrganize">
-		SELECT * FROM cm_mall_organize WHERE delFlag='0' AND id != 2
+		SELECT * FROM cm_mall_organize WHERE delFlag='0' AND id <![CDATA[ > ]]> 2
 	</select>
 
 	<select id="findAllList" resultType="CmUserOrganize">

+ 1 - 3
src/main/resources/mappings/modules/user/NewCmClubMapper.xml

@@ -177,12 +177,10 @@
 			<if test="endTime != null and endTime != ''">
 				AND (u.registerTime &lt; #{endTime} OR  u.registerTime = #{endTime})
 			</if>
-			<if test="userOrganizeID != null and userOrganizeID != ''">
-				AND u.userOrganizeID = #{userOrganizeID}
-			</if>
 			<if test="userIdentity != null and userIdentity != ''">
 				AND u.userIdentity = #{userIdentity}
 			</if>
+			AND u.userOrganizeID IN(0,1)
 		</where>
 		<choose>
 			<when test="page !=null and page.orderBy != null and page.orderBy != ''">

+ 134 - 0
src/main/resources/mappings/modules/weisha/CmMallOrganizeMapper.xml

@@ -0,0 +1,134 @@
+<?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.caimei.modules.weisha.dao.CmMallOrganizeDao">
+    
+	<sql id="cmMallOrganizeColumns">
+		a.id AS "id",
+		a.organizeName AS "organizeName",
+		a.organizeLinkName AS "organizeLinkName",
+		a.mobile AS "mobile",
+		a.status AS "status",
+		a.contactNumber AS "contactNumber",
+		a.systemName AS "systemName",
+		a.systemImage AS "systemImage",
+		a.introduction AS "introduction",
+		a.afterSale AS "afterSale",
+		a.shoppingNotes AS "shoppingNotes",
+		a.updateTime AS "updateTime",
+		a.addTime AS "addTime",
+		a.delFlag AS "delFlag"
+	</sql>
+	
+	<sql id="cmMallOrganizeJoins">
+	</sql>
+    
+	<select id="get" resultType="CmMallOrganize">
+		SELECT 
+			<include refid="cmMallOrganizeColumns"/>
+		FROM cm_mall_organize a
+		<include refid="cmMallOrganizeJoins"/>
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="CmMallOrganize">
+		SELECT 
+			<include refid="cmMallOrganizeColumns"/>
+		FROM cm_mall_organize a
+		<include refid="cmMallOrganizeJoins"/>
+		<where>
+			id > 2
+			<if test="organizeName != null and organizeName != ''">
+				AND a.organizeName = #{organizeName}
+			</if>
+			<if test="organizeLinkName != null and organizeLinkName != ''">
+				AND a.organizeLinkName = #{organizeLinkName}
+			</if>
+			<if test="mobile != null and mobile != ''">
+				AND a.mobile = #{mobile}
+			</if>
+			<if test="status != null and status != ''">
+				AND a.status = #{status}
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="CmMallOrganize">
+		SELECT 
+			<include refid="cmMallOrganizeColumns"/>
+		FROM cm_mall_organize a
+		<include refid="cmMallOrganizeJoins"/>
+		<where>
+			
+		</where>		
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+			</otherwise>
+		</choose>
+	</select>
+	
+	<insert id="insert" parameterType="CmMallOrganize"  keyProperty="id" useGeneratedKeys="true">
+		INSERT INTO cm_mall_organize(
+			organizeName,
+			organizeLinkName,
+			mobile,
+			status,
+			contactNumber,
+			systemName,
+			systemImage,
+			introduction,
+			afterSale,
+			shoppingNotes,
+			updateTime,
+			addTime,
+			delFlag
+		) VALUES (
+			#{organizeName},
+			#{organizeLinkName},
+			#{mobile},
+			#{status},
+			#{contactNumber},
+			#{systemName},
+			#{systemImage},
+			#{introduction},
+			#{afterSale},
+			#{shoppingNotes},
+			NOW(),
+			NOW(),
+			0
+		)
+	</insert>
+	
+	<update id="update">
+		UPDATE cm_mall_organize SET 	
+			organizeName = #{organizeName},
+			organizeLinkName = #{organizeLinkName},
+			mobile = #{mobile},
+			status = #{status},
+			contactNumber = #{contactNumber},
+			systemName = #{systemName},
+			systemImage = #{systemImage},
+			introduction = #{introduction},
+			afterSale = #{afterSale},
+			shoppingNotes = #{shoppingNotes},
+			updateTime = NOW()
+		WHERE id = #{id}
+	</update>
+
+	<update id="updateByStatus">
+		UPDATE cm_mall_organize SET
+			status = #{status},
+			updateTime = NOW()
+		WHERE id = #{organizeId}
+	</update>
+	
+</mapper>

+ 137 - 0
src/main/resources/mappings/modules/weisha/CmOrganizeBuyerMapper.xml

@@ -0,0 +1,137 @@
+<?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.caimei.modules.weisha.dao.CmOrganizeBuyerDao">
+    
+	<sql id="cmOrganizeBuyerColumns">
+		a.id AS "id",
+		a.organizeId AS "organizeId",
+		a.name AS "name",
+		a.mobile AS "mobile",
+		a.invitationCode AS "invitationCode",
+		a.status AS "status",
+		a.nickName AS "nickName",
+		a.openid AS "openid",
+		a.addTime AS "addTime",
+		a.invitationCodeTime AS "invitationCodeTime",
+		a.bindTime AS "bindTime",
+		a.updateTime AS "updateTime",
+		a.delFlag AS "delFlag"
+	</sql>
+	
+	<sql id="cmOrganizeBuyerJoins">
+	</sql>
+    
+	<select id="get" resultType="CmOrganizeBuyer">
+		SELECT 
+			<include refid="cmOrganizeBuyerColumns"/>
+		FROM cm_organize_buyer a
+		<include refid="cmOrganizeBuyerJoins"/>
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="CmOrganizeBuyer">
+		SELECT 
+			<include refid="cmOrganizeBuyerColumns"/>
+		FROM cm_organize_buyer a
+		<where>
+			a.delFlag = 0
+			<if test="name != null and name != ''">
+				AND a.name LIKE 
+					<if test="dbName == 'oracle'">'%'||#{name}||'%'</if>
+					<if test="dbName == 'mysql'">concat('%',#{name},'%')</if>
+			</if>
+			<if test="mobile != null and mobile != ''">
+				AND a.mobile = #{mobile}
+			</if>
+			<if test="status != null and status != ''">
+				AND a.status = #{status}
+			</if>
+			<if test="startTime != null">
+				AND a.addTime <![CDATA[ > ]]> #{startTime}
+			</if>
+			<if test="endTime != null">
+				AND a.addTime <![CDATA[ < ]]> #{endTime}
+			</if>
+			<if test="invitationCode != null and invitationCode != ''">
+				AND a.invitationCode = #{invitationCode}
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="CmOrganizeBuyer">
+		SELECT 
+			<include refid="cmOrganizeBuyerColumns"/>
+		FROM cm_organize_buyer a
+		<include refid="cmOrganizeBuyerJoins"/>
+		<where>
+			
+		</where>		
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+			</otherwise>
+		</choose>
+	</select>
+	
+	<insert id="insert" parameterType="CmOrganizeBuyer"  keyProperty="id" useGeneratedKeys="true">
+		INSERT INTO cm_organize_buyer(
+			organizeId,
+			name,
+			mobile,
+			invitationCode,
+			status,
+			nickName,
+			openid,
+			addTime,
+			invitationCodeTime,
+			bindTime,
+			updateTime,
+			delFlag
+		) VALUES (
+			#{organizeId},
+			#{name},
+			#{mobile},
+			#{invitationCode},
+			#{status},
+			#{nickName},
+			#{openid},
+			#{addTime},
+			#{invitationCodeTime},
+			#{bindTime},
+			#{updateTime},
+			#{delFlag}
+		)
+	</insert>
+	
+	<update id="update">
+		UPDATE cm_organize_buyer SET
+			name = #{name},
+			mobile = #{mobile},
+			invitationCode = #{invitationCode},
+			status = #{status},
+			nickName = #{nickName},
+			openid = #{openid},
+			invitationCodeTime = #{invitationCodeTime},
+			bindTime = #{bindTime},
+			updateTime = #{updateTime},
+			delFlag = #{delFlag}
+		WHERE id = #{id}
+	</update>
+
+	<select id="findByMobile" resultType="com.caimei.modules.weisha.entity.CmOrganizeBuyer">
+		SELECT
+			<include refid="cmOrganizeBuyerColumns"/>
+		FROM cm_organize_buyer a
+		WHERE a.mobile = #{mobile} AND delFlag = 0
+	</select>
+	
+</mapper>

+ 199 - 0
src/main/resources/mappings/modules/weisha/CmOrganizeProductMapper.xml

@@ -0,0 +1,199 @@
+<?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.caimei.modules.weisha.dao.CmOrganizeProductDao">
+    
+	<sql id="cmOrganizeProductColumns">
+		a.id AS "id",
+		a.organizeId AS "organizeId",
+		a.productId AS "productId",
+		a.ladderPriceFlag AS "ladderPriceFlag",
+		a.price AS "price",
+		a.includedTax AS "includedTax",
+		a.invoiceType AS "invoiceType",
+		a.clubTaxPoint,
+		a.shopTaxPoint,
+		a.minBuyNumber AS "minBuyNumber",
+		a.costType AS "costType",
+		a.costPrice AS "costPrice",
+		a.costProportional AS "costProportional",
+		a.postageType AS "postageType",
+		a.status AS "status",
+		a.addTime AS "addTime",
+		a.delFlag AS "delFlag",
+		p.name AS "productName",
+		p.mainImage AS "productImage",
+		p.unit,
+		s.name AS "shopName"
+	</sql>
+	
+	<sql id="cmOrganizeProductJoins">
+		left join product p on a.productId = p.productID
+		left join shop s on p.shopID = s.shopID
+	</sql>
+    
+	<select id="get" resultType="CmOrganizeProduct">
+		SELECT 
+			<include refid="cmOrganizeProductColumns"/>
+		FROM cm_organize_product a
+		<include refid="cmOrganizeProductJoins"/>
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="CmOrganizeProduct">
+		SELECT 
+			<include refid="cmOrganizeProductColumns"/>
+		FROM cm_organize_product a
+		<include refid="cmOrganizeProductJoins"/>
+		<where>
+			a.delFlag = 0
+			and p.productCategory = 1
+			<if test="id != null and id != ''">
+				AND a.id = #{id}
+			</if>
+			<if test="productName != null and productName != ''">
+				and p.name like concat('%',#{productName},'%')
+			</if>
+			<if test="shopName != null and shopName != ''">
+				and s.name like concat('%',#{shopName},'%')
+			</if>
+			<if test="includedTax != null">
+				AND a.includedTax = #{includedTax}
+			</if>
+			<if test="invoiceType != null">
+				AND a.invoiceType = #{invoiceType}
+			</if>
+			<if test="status != null">
+				AND a.status = #{status}
+			</if>
+			<if test="organizeId != null">
+				AND a.organizeId = #{organizeId}
+			</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="CmOrganizeProduct">
+		SELECT 
+			<include refid="cmOrganizeProductColumns"/>
+		FROM cm_organize_product a
+		<include refid="cmOrganizeProductJoins"/>
+		<where>
+			
+		</where>		
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+			</otherwise>
+		</choose>
+	</select>
+	<select id="findProductList" resultType="com.caimei.modules.product.entity.Product">
+		select p.productID, p.mainImage, p.name, p.price1, s.name as shopName, IF(cop.productId is not null, 0, 1) as validFlag
+		from product p
+				 left join cm_organize_product cop on p.productID = cop.productId and cop.organizeId = #{organizeId} and cop.delFlag = 0
+				 left join shop s on p.shopID = s.shopID
+		<where>
+			<if test="productID != null">
+				AND p.productID = #{productID}
+			</if>
+			<if test="name != null and name != ''">
+				AND p.name LIKE concat('%',#{name},'%')
+			</if>
+			<if test="shopName != null and shopName != ''">
+				AND s.name LIKE concat('%',#{shopName},'%')
+			</if>
+		</where>
+	</select>
+	<select id="findProductByProductId" resultType="com.caimei.modules.weisha.entity.CmOrganizeProduct">
+		select productID as productId, ladderPriceFlag,price1 as price,includedTax,invoiceType,taxPoint as clubTaxPoing,supplierTaxPoint as shopTaxPoint,minBuyNumber,costCheckFlag as costType,
+		       costPrice,costProportional,freePostFlag as postageType
+		from product
+		where productID = #{productId}
+	</select>
+	<select id="findLadderPrice" resultType="com.caimei.modules.weisha.entity.OrganizeProductLadderPrice">
+		select * from organize_product_ladder_price where productId = #{productId}
+	</select>
+
+	<insert id="insert" parameterType="CmOrganizeProduct"  keyProperty="id" useGeneratedKeys="true">
+		INSERT INTO cm_organize_product(
+			organizeId,
+			productId,
+			ladderPriceFlag,
+			price,
+			includedTax,
+			invoiceType,
+			clubTaxPoint,
+			shopTaxPoint,
+			minBuyNumber,
+			costType,
+			costPrice,
+			costProportional,
+			postageType,
+			addTime
+		) VALUES (
+			#{organizeId},
+			#{productId},
+			#{ladderPriceFlag},
+			#{price},
+			#{includedTax},
+			#{invoiceType},
+		    #{clubTaxPoint},
+		    #{shopTaxPoint},
+			#{minBuyNumber},
+			#{costType},
+			#{costPrice},
+			#{costProportional},
+			#{postageType},
+			#{addTime}
+		)
+	</insert>
+	<insert id="insertLadderPrice">
+		insert into organize_product_ladder_price(
+		    productId, ladderNum, buyNum, buyPrice
+		) values (#{productId},#{ladderNum},#{buyNum},#{buyPrice})
+
+	</insert>
+
+	<update id="update">
+		UPDATE cm_organize_product SET 	
+			ladderPriceFlag = #{ladderPriceFlag},
+			price = #{price},
+			includedTax = #{includedTax},
+			invoiceType = #{invoiceType},
+			minBuyNumber = #{minBuyNumber},
+			costType = #{costType},
+			costPrice = #{costPrice},
+			costProportional = #{costProportional},
+			postageType = #{postageType},
+			status = #{status},
+			addTime = #{addTime},
+			delFlag = #{delFlag}
+		WHERE id = #{id}
+	</update>
+
+	<update id="updateStatus">
+		UPDATE cm_organize_product SET
+			status = #{status}
+		WHERE id = #{id}
+	</update>
+	<update id="updateLadderPrice">
+		update organize_product_ladder_price
+		set productId = #{productId},ladderNum = #{ladderNum},buyNum=#{buyNum},buyPrice=#{buyPrice}
+		where id = #{id}
+	</update>
+
+	<delete id="delete">
+		UPDATE cm_organize_product set delFlag = 1 where id = #{id}
+	</delete>
+	<delete id="deleteLadderPriceById">
+		delete from organize_product_ladder_price where id = #{ladderId}
+	</delete>
+
+</mapper>

+ 432 - 0
src/main/resources/mappings/modules/weisha/CmOrganizePromotionMapper.xml

@@ -0,0 +1,432 @@
+<?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.caimei.modules.weisha.dao.CmOrganizePromotionDao">
+
+    <sql id="cmOrganizePromotionColumns">
+		cp.id AS "id",
+		cp.name AS "name",
+		cp.description AS "description",
+		cp.type AS "type",
+		cp.mode AS "mode",
+		cp.touchPrice AS "touchPrice",
+		cp.reducedPrice AS "reducedPrice",
+		cp.beginTime AS "beginTime",
+		cp.endTime AS "endTime",
+		cp.addTime AS "addTime",
+		cp.updateTime AS "updateTime",
+		cp.status AS "status",
+		cp.delFlag AS "delFlag1"
+	</sql>
+
+    <select id="get" resultType="CmOrganizePromotion">
+        SELECT
+        <include refid="cmOrganizePromotionColumns"/>
+        FROM cm_organize_promotions cp
+        WHERE cp.id = #{id}
+        and cp.delFlag != '2'
+    </select>
+
+    <select id="findList" resultType="CmOrganizePromotion">
+        SELECT
+        <include refid="cmOrganizePromotionColumns"/>
+        FROM cm_organize_promotions cp
+        LEFT JOIN cm_organize_promotions_product cpp ON cp.id = cpp.promotionsId
+        LEFT JOIN product p ON cpp.productId = p.productID
+        LEFT JOIN shop s ON p.shopID = s.shopID OR cpp.supplierId=s.shopID
+        <where>
+            cp.delFlag != 2
+            <if test="organizeId != null">
+                AND cp.organizeId = #{organizeId,jdbcType=INTEGER}
+            </if>
+            <if test="type != null and type != ''">
+                AND cp.type = #{type,jdbcType=INTEGER}
+            </if>
+            <if test="name != null and name != ''">
+                AND cp.name LIKE CONCAT('%',#{name,jdbcType=VARCHAR},'%')
+            </if>
+            <if test="description != null and description != ''">
+                AND cp.description LIKE CONCAT('%',#{description,jdbcType=VARCHAR},'%')
+            </if>
+            <if test="productName != null and productName != ''">
+                AND p.name LIKE CONCAT('%',#{productName,jdbcType=VARCHAR},'%')
+            </if>
+            <if test="shopName != null and shopName != ''">
+                AND s.name LIKE CONCAT('%',#{shopName,jdbcType=VARCHAR},'%')
+            </if>
+            <if test="mode != null and mode != ''">
+                AND cp.mode = #{mode,jdbcType=VARCHAR}
+            </if>
+            <if test="status != null and status != ''">
+                AND cp.status = #{status,jdbcType=VARCHAR}
+            </if>
+            <if test="delFlag1 != null and delFlag1 != ''">
+                <choose>
+                    <when test="delFlag1 == 1">
+                        AND NOW() <![CDATA[ < ]]> cp.beginTime
+                        AND cp.status != 1
+                        AND cp.delFlag != '1'
+                    </when>
+                    <when test="delFlag1 == 2">
+                        AND (NOW() between cp.beginTime AND cp.endTime
+                        OR cp.status = 1)
+                        AND cp.delFlag != '1'
+                    </when>
+                    <when test="delFlag1 == 3">
+                        AND NOW() <![CDATA[ > ]]> cp.endTime
+                        AND cp.status != 1
+                        AND cp.delFlag != '1'
+                    </when>
+                    <when test="delFlag1 == 0">
+                        AND cp.delFlag = '1'
+                    </when>
+                    <otherwise>
+                        AND cp.delFlag = null
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        group by cp.id
+        <choose>
+            <when test="page !=null and page.orderBy != null and page.orderBy != ''">
+                ORDER BY ${page.orderBy,jdbcType=VARCHAR}
+            </when>
+            <otherwise>
+                ORDER BY cp.addTime DESC
+            </otherwise>
+        </choose>
+    </select>
+
+    <select id="findPromotionProduct" resultType="com.caimei.modules.product.entity.Product">
+        SELECT
+        cop.id as productID,p.mainImage,p.name,cop.price as price1,
+        cp.reducedPrice AS "reducedPrice",
+        s.name AS "shopName"
+        FROM
+        cm_organize_promotions cp
+        LEFT JOIN cm_organize_promotions_product cpp ON cp.id = cpp.promotionsId
+        LEFT JOIN cm_organize_product cop ON cpp.productId = cop.id
+        LEFT JOIN product p ON cop.productId = p.productID
+        LEFT JOIN shop s ON s.shopID = p.shopID
+        WHERE
+            cp.id = #{id}
+        and p.productCategory = 1
+    </select>
+
+    <select id="findGiftProduct" resultType="com.caimei.modules.product.entity.Product">
+           SELECT
+                cop.id as productID,p.mainImage,p.name,cop.price as price1,
+                cp.reducedPrice AS "reducedPrice",
+                s.name AS "shopName",
+                cpg.number AS "giftNumber"
+           FROM
+             cm_organize_promotions cp
+             LEFT JOIN cm_organize_promotions_gift cpg ON cp.id = cpg.promotionsId
+             LEFT JOIN cm_organize_product cop ON cpg.productId = cop.id
+             LEFT JOIN product p ON cop.productId = p.productID
+             LEFT JOIN shop s ON s.shopID = p.shopID
+           WHERE
+             cp.id = #{id}
+             and p.productCategory = 1
+    </select>
+
+    <select id="findGiftPurchaseProduct" resultType="com.caimei.modules.bulkpurchase.entity.PurchaseProduct">
+		SELECT p.name name,s.name shopName ,s.`shopID` shopId,p.name purchaseProductName,
+		cop.`price` price,cop.`productId` productId,p.productCode productNo,p.mainImage image
+		,cop.costType costCheckFlag,cop.costPrice costPrice,cop.costProportional costProportional, p.price0 AS normalPrice,
+        cpg.number AS num
+           FROM
+             cm_organize_promotions cp
+             LEFT JOIN cm_organize_promotions_gift cpg ON cp.id = cpg.promotionsId
+             LEFT JOIN cm_organize_product cop ON cpg.productId = cop.productId
+             LEFT JOIN product p ON cop.productId = p.productID
+             LEFT JOIN shop s ON s.shopID = p.shopID
+           WHERE
+             cp.id = #{id}
+             and p.productCategory = 1
+    </select>
+
+    <select id="findPromotionShops" resultType="com.caimei.modules.cibe.entity.Shop">
+        SELECT
+        s.*
+        FROM
+        cm_organize_promotions_product cpp
+        LEFT JOIN shop s ON cpp.supplierId = s.shopID
+        WHERE
+            cpp.promotionsId = #{id}
+    </select>
+
+    <select id="findAllProduct" resultType="com.caimei.modules.product.entity.Product">
+        SELECT
+        cop.id AS productID,cop.price AS price1,
+        p.mainImage,p.name,
+        s.name AS "shopName"
+        FROM
+        cm_organize_product cop
+        LEFT JOIN product p ON cop.productId = p.productID
+        LEFT JOIN shop s ON s.shopID = p.shopID
+        <where>
+            cop.delFlag = 0
+            and cop.status = 1
+            <if test="productID != null">
+                AND cop.productId = #{productID}
+            </if>
+            <if test="name != null and name != ''">
+                AND p.name LIKE concat('%',#{name},'%')
+            </if>
+            <if test="shopName != null and shopName != ''">
+                AND s.name LIKE concat('%',#{shopName},'%')
+            </if>
+            <if test="ids != null and ids.size > 0">
+                AND cop.productId NOT IN
+                <foreach collection="ids" open="(" close=")" item="id" separator=",">
+                    #{id}
+                </foreach>
+            </if>
+            <if test="promotionType == 1 or promotionType == 2">
+                AND cop.productId NOT IN
+                (SELECT cpp.productId
+                FROM cm_organize_promotions_product cpp
+                LEFT JOIN cm_organize_promotions cp on cpp.promotionsId = cp.id
+                <where>
+                    cp.type = #{promotionType}
+                    AND cp.delFlag != '2'
+                    AND cpp.productId != 0
+                    <if test="delIdList != null and delIdList.size > 0">
+                        AND cpp.productId NOT IN
+                        <foreach collection="delIdList" open="(" close=")" item="delId" separator=",">
+                            #{delId}
+                        </foreach>
+                    </if>
+                </where>
+                )
+            </if>
+        </where>
+    </select>
+
+    <select id="findAllShop" resultType="com.caimei.modules.cibe.entity.Shop">
+        SELECT
+        s.*
+        FROM
+        shop s
+        <where>
+            s.status = 90
+            AND s.shopID NOT IN
+            (SELECT supplierId
+            FROM cm_organize_promotions_product cpp
+            LEFT JOIN cm_organize_promotions cp on cpp.promotionsId = cp.id
+            <where>
+                supplierId != 0
+                AND cp.delFlag != '2'
+                <if test="delShopIdList!=null and delShopIdList.size > 0">
+                    AND cpp.supplierId NOT IN
+                    <foreach collection="delShopIdList" open="(" close=")" item="delShopId" separator=",">
+                        #{delShopId}
+                    </foreach>
+
+                </if>
+            </where>
+            )
+            <if test="shopID != null">
+                AND s.shopID = #{shopID}
+            </if>
+            <if test="name != null and name != ''">
+                AND s.name LIKE concat('%',#{name},'%')
+            </if>
+            <if test="sname != null and sname != ''">
+                AND s.sname LIKE concat('%',#{sname},'%')
+            </if>
+            <if test="ids != null and ids.size > 0">
+                AND s.shopID NOT IN
+                <foreach collection="ids" open="(" close=")" item="id" separator=",">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <delete id="deleteAllPromotionProductsAndShops">
+		DELETE FROM cm_organize_promotions_product
+		WHERE promotionsId = #{id}
+	</delete>
+
+    <delete id="deleteAllPromotionGifts">
+		DELETE FROM cm_organize_promotions_gift
+		WHERE promotionsId = #{id}
+	</delete>
+
+    <insert id="insertPromotionProduct">
+		INSERT INTO cm_organize_promotions_product(
+			promotionsId,
+            productId,
+            addTime
+		) VALUES (
+			#{promotionId},
+			#{productId},
+			now()
+		)
+	</insert>
+
+    <insert id="insertGiftProduct">
+		INSERT INTO cm_organize_promotions_gift(
+			promotionsId,
+            productId,
+            number,
+            addTime
+		) VALUES (
+			#{promotionId},
+			#{giftId},
+			#{number},
+			now()
+		)
+	</insert>
+
+    <insert id="insertPromotionShop">
+		INSERT INTO cm_organize_promotions_product(
+			promotionsId,
+            supplierId,
+            productId,
+            addTime
+		) VALUES (
+			#{promotionId},
+			#{shopId},
+			0,
+			now()
+		)
+	</insert>
+
+    <insert id="insert" parameterType="CmOrganizePromotion" keyProperty="id" useGeneratedKeys="true">
+        INSERT INTO cm_organize_promotions(
+            organizeId,
+            name,
+            description,
+            type,
+            mode,
+            touchPrice,
+            reducedPrice,
+            beginTime,
+            endTime,
+            addTime,
+            updateTime,
+            status,
+            delFlag
+        ) VALUES (
+            #{organizeId},
+            #{name},
+            #{description},
+            #{type},
+            #{mode},
+            #{touchPrice},
+            #{reducedPrice},
+            #{beginTime},
+            #{endTime},
+            #{addTime},
+            #{updateTime},
+            #{status},
+            #{delFlag1}
+        )
+    </insert>
+
+
+    <update id="update">
+        UPDATE cm_organize_promotions
+        SET name = #{name},
+        description = #{description},
+        type = #{type},
+        mode = #{mode},
+        touchPrice = #{touchPrice},
+        reducedPrice = #{reducedPrice},
+        beginTime = #{beginTime},
+        endTime = #{endTime},
+        updateTime = #{updateTime},
+        status = #{status},
+        delFlag = #{delFlag1}
+        WHERE id = #{id}
+    </update>
+
+    <select id="findShop" resultType="com.caimei.modules.cibe.entity.Shop">
+        SELECT * from shop where shopID = #{id}
+    </select>
+
+    <select id="findProductPromotion" resultType="com.caimei.modules.weisha.entity.CmOrganizePromotion">
+        select  pr.id,
+                pr.name,
+                pr.type,
+                pr.mode,
+                pr.touchPrice,
+                pr.reducedPrice,
+                pr.beginTime,
+                pr.endTime,
+                pr.status,
+                prp.productId,
+                prp.supplierId
+        from cm_organize_promotions pr
+        left join cm_organize_promotions_product prp on pr.id = prp.promotionsId
+        where (prp.productId = #{productId}
+        or prp.supplierId = #{shopId})
+        and (pr.status = 1 or ( pr.status = 2 and (NOW() between pr.beginTime and pr.endTime)))
+        and pr.delFlag not in ('1','2')
+        order by pr.type desc
+        limit 1
+    </select>
+
+    <select id="findProductPromotionsGift" resultType="com.caimei.modules.weisha.entity.CmOrganizePromotion">
+        SELECT DISTINCT  pr.id,
+        pr.name,
+        pr.type,
+        pr.mode,
+        pr.touchPrice,
+        pr.reducedPrice,
+        pr.beginTime,
+        pr.endTime,
+        pr.status
+        FROM cm_organize_promotions_gift cpg
+        LEFT JOIN cm_organize_promotions pr ON pr.id = cpg.promotionsId
+        WHERE cpg.productId = #{productId}
+        AND (pr.status = 1 OR ( pr.status = 2 AND (NOW() BETWEEN pr.beginTime AND pr.endTime)))
+        AND pr.mode = 3
+        AND pr.delFlag not in ('1','2')
+        ORDER BY pr.type DESC
+        LIMIT 1
+    </select>
+
+    <select id="findOrderPromotions" resultType="com.caimei.modules.weisha.entity.CmOrganizePromotion">
+        SELECT * FROM cm_organize_promotions_order WHERE id = #{orderPromotionsId}
+    </select>
+
+    <select id="findPromotionsByProductId" resultType="com.caimei.modules.weisha.entity.CmOrganizePromotion">
+        select pr.id,
+               pr.name,
+               pr.description,
+               pr.type,
+               pr.mode,
+               pr.touchPrice,
+               pr.reducedPrice,
+               pr.beginTime,
+               pr.endTime,
+               pr.status,
+               prp.productId,
+               prp.supplierId
+        from cm_organize_promotions pr
+                 left join cm_organize_promotions_product prp on pr.id = prp.promotionsId
+        where (prp.productId = #{productId} or
+               prp.supplierId = (select p.shopID from product p where p.productID = #{productId})
+            )
+          and (pr.status = 1 or (pr.status = 2 and (NOW() between pr.beginTime and pr.endTime)))
+          and pr.delFlag not in (1,2)
+        order by pr.type desc
+        limit 1
+    </select>
+    <select id="getPresentPriceById" resultType="java.lang.Double">
+        select price1 from product where productID=#{productId}
+    </select>
+    <select id="getProductByProductId" resultType="com.caimei.modules.product.entity.Product">
+        select
+            cop.id AS productID,cop.price AS price1,
+            p.mainImage,p.name,
+            s.name AS "shopName"
+        from cm_organize_product cop
+            left join product p on cop.productId = p.productID
+            left join shop s on p.shopID = s.shopID
+        where cop.id = #{productId}
+    </select>
+</mapper>

+ 0 - 10
src/main/webapp/WEB-INF/views/modules/applets/setHomePage.jsp

@@ -110,16 +110,6 @@
 				<form:input path="thirdModulesName" htmlEscape="false" maxlength="5" class="input-xlarge required" placeholder="最多输入5个字"/>
 			</div>
 		</div>
-		<%--<div class="control-group">
-			<label class="control-label"><b><font color="red">*</font>组织:</b></label>
-			<div class="controls">
-				<form:select path="organizeID" class="input-medium  required">
-					<form:option value="" label="请选择"/>
-					<form:options items="${cmUserOrganizeList}" itemLabel="organizeName" itemValue="id"
-								  htmlEscape="false"/>
-				</form:select>
-			</div>
-		</div>--%>
 		<div class="form-actions" style="margin-top: 95px;">
 			<shiro:hasPermission name="user:cmUserOrganize:edit"><input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;</shiro:hasPermission>
 			<input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>

+ 12 - 0
src/main/webapp/WEB-INF/views/modules/order/newOrderList.jsp

@@ -706,6 +706,10 @@
                 <label>收货人:</label>
                 <form:input path="receiver" maxlength="20" class="input-medium"/>
             </div>
+            <div class="item">
+                <label>商品名称:</label>
+                <form:input path="productName" class="input-large"/>
+            </div>
             <div class="item">
                 <label>发货状态:</label>
                 <form:select path="sendOutStatus" class="select-ele input-medium required">
@@ -771,6 +775,14 @@
                                   htmlEscape="false"/>
                 </form:select>
             </div>
+            <div class="item">
+                <label>协销人员:</label>
+                <form:select path="serviceProviderId" class="select-ele input-medium required">
+                    <form:option value="" label="所有"/>
+                    <form:options items="${serviceProviderList}" itemLabel="linkMan1" itemValue="serviceProviderID"
+                                  htmlEscape="false"/>
+                </form:select>
+            </div>
             <div class="item">
                 <label>返佣订单:</label>
                 <form:select path="rebateOrder" class="select-ele input-medium required">

+ 0 - 9
src/main/webapp/WEB-INF/views/modules/userNew/cmAgencyList.jsp

@@ -274,15 +274,6 @@
             <label>邮箱:</label>
             <form:input path="searchEmail" htmlEscape="false" maxlength="50" class="input-medium"/>
         </div>
-        <div class="item">
-            <label>组织:</label>
-            <form:select path="searchUserOrganizeID" class="input-medium">
-                <form:option value="" label="请选择"/>
-                <form:option value="0" label="采美365网"/>
-                <form:options items="${cmUserOrganizeList}" itemLabel="organizeName" itemValue="id"
-                              htmlEscape="false"/>
-            </form:select>
-        </div>
         <div class="item">
             <label> 状态:</label>
             <form:select path="searchStatus" class="input-medium">

+ 118 - 0
src/main/webapp/WEB-INF/views/modules/weisha/addClubUserForm.jsp

@@ -0,0 +1,118 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>采美商城组织管理</title>
+	<meta name="decorator" content="default"/>
+	<script src="/static/modules/bulkpurchase/loadAddressById.js"></script>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			//$("#name").focus();
+			$("#inputForm").validate({
+                ignore:"",
+				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);
+					}
+				}
+			});
+		});
+
+
+        function onlyNumOrLetter(obj) {
+            var reg = /^[0-9a-zA-Z]+$/;
+            var str = document.getElementById("socialCreditCode").value;
+            if(!reg.test(str)){
+                alertx("营业执照编号格式不正确");
+                $("#socialCreditCode").val("");
+            }
+        }
+
+        /**
+         * @param obj
+         * jquery控制input只能输入数字
+         */
+        function mobileVerification(obj) {
+            var reg = /^1\d{10}$/;
+            var contractMobile = document.getElementById("contractMobile").value;
+            if(!reg.test(contractMobile)){
+                alertx("手机号格式不正确");
+                $("#contractMobile").val("");
+            }
+        }
+
+        /**
+         * @param obj
+         * jquery控制input只能输入数字
+         */
+        function onlynum(obj) {
+            obj.value = obj.value.replace(/[^\d]/g, ""); //清除"数字"以外的字符
+        }
+	</script>
+</head>
+<body>
+	<ul class="nav nav-tabs">
+		<li><a href="${ctx}/weisha/cmMallOrganize">组织列表</a></li>
+		<li><a href="${ctx}/weisha/user/organizeClubList?userOrganizeID=${userOrganizeID}">机构列表</a></li>
+		<c:if test="${not empty newCmClub.clubID && not empty newCmClub.userID}">
+			<li class="active"><a href="${ctx}/user/cmUserOrganize/toAddClubUser?id=${userOrganizeID}&clubID=${newCmClub.clubID}&userID=${newCmClub.userID}">上线会所</a></li>
+		</c:if>
+		<c:if test="${empty newCmClub.clubID &&  empty newCmClub.userID}">
+		<li class="active"><a href="${ctx}/weisha/user/addClubUser?id=${userOrganizeID}">上线会所</a></li>
+		</c:if>
+	</ul><br/>
+	<form:form id="inputForm" modelAttribute="newCmClub" action="${ctx}/weisha/user/saveAddClubUser?id=${userOrganizeID}&clubID=${newCmClub.clubID}&userID=${newCmClub.userID}" method="post" class="form-horizontal">
+		<input type="hidden" id="curProvince" name="curProvince" value="${newCmClub.province }" disabled="disabled">
+		<input type="hidden" id="curCity" name="curCity" value="${newCmClub.city }" disabled="disabled">
+		<input type="hidden" id="curTown" name="curTown" value="${newCmClub.town }" disabled="disabled">
+		<sys:message content="${message}"/>		
+		<div class="control-group">
+			<label class="control-label"><b><font color="red">*</font>机构名称:</b></label>
+			<div class="controls">
+				<form:input path="name" htmlEscape="false" maxlength="30" class="input-xlarge required"  placeholder="最多输入30个汉字"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label"><b><font color="red">*</font>联系人:</b></label>
+			<div class="controls">
+				<form:input path="linkMan" htmlEscape="false" maxlength="15" class="input-xlarge required"   placeholder="最多输入15个汉字"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label"><b><font color="red">*</font>手机号:</b></label>
+			<div class="controls">
+				<form:input path="contractMobile" htmlEscape="false" maxlength="11" class="input-xlarge required" onchange="mobileVerification(this)"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label"><b><font color="red">*</font>地址:</b></label>
+			<div class="controls">
+				<form:select path="provinceID" class="input-xlarge required" id="province"
+							 onchange="loadCity()" style="width:100px;">
+					<form:option value="" label="省" provinceId=""/>
+				</form:select>
+				<form:select path="cityID" class="input-xlarge required" id="city" onchange="loadTown()"
+							 style="width:100px;">
+					<form:option value="" label="市" cityId=""/>
+				</form:select>
+				<form:select path="townID" class="input-xlarge required" id="town" style="width:100px;">
+					<form:option value="" label="区"/>
+				</form:select>
+				<form:input path="address" class="input-xlarge userAddress required" width="20px" maxlength="60" placeholder="请填写机构详细的地址" />
+			</div>
+		</div>
+		<div class="form-actions">
+			<shiro:hasPermission name="user:cmUserOrganize:edit"><input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;</shiro:hasPermission>
+			<input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
+		</div>
+	</form:form>
+</body>
+</html>

+ 69 - 0
src/main/webapp/WEB-INF/views/modules/weisha/cmMallOrganizeForm.jsp

@@ -0,0 +1,69 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>组织列表管理</title>
+	<meta name="decorator" content="default"/>
+	<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}/weisha/cmMallOrganize/">组织列表</a></li>
+		<li class="active"><a href="${ctx}/weisha/cmMallOrganize/form?id=${cmMallOrganize.id}">组织${not empty cmMallOrganize.id?'编辑':'添加'}</a></li>
+	</ul><br/>
+	<form:form id="inputForm" modelAttribute="cmMallOrganize" action="${ctx}/weisha/cmMallOrganize/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<sys:message content="${message}"/>		
+		<div class="control-group">
+			<label class="control-label"><font color="red">*</font>组织名称:</label>
+			<div class="controls">
+				<form:input path="organizeName" placeholder="最多输入30个汉字" htmlEscape="false" maxlength="30" class="input-xlarge required"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label"><font color="red">*</font>联系人:</label>
+			<div class="controls">
+				<form:input path="organizeLinkName" placeholder="最多输入15个汉字" htmlEscape="false" maxlength="15" class="input-xlarge required"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label"><font color="red">*</font>手机号:</label>
+			<div class="controls">
+				<form:input path="mobile" htmlEscape="false" maxlength="20" class="input-xlarge required"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label"><font color="red">*</font>状态:</label>
+			<div class="controls">
+				<form:select path="status" class="input-xlarge required">
+					<form:option value="1" label="已上线"/>
+					<form:option value="2" label="已下线"/>
+				</form:select>
+			</div>
+		</div>
+		<div class="form-actions">
+			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;
+			<input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
+		</div>
+	</form:form>
+</body>
+</html>

+ 172 - 0
src/main/webapp/WEB-INF/views/modules/weisha/cmMallOrganizeList.jsp

@@ -0,0 +1,172 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>组织管理</title>
+	<meta name="decorator" content="default"/>
+	<style type="text/css">
+		.table th{text-align: center;}
+		.table td{text-align: center;}
+		.more-btn-wrapper {
+			position: relative;
+		}
+		.show-more-btn {
+			position: relative;
+			cursor: pointer;
+			color: #2fa4e7;
+			display: inline-block;
+		}
+		.more-btn-block {
+			padding: 10px;
+			background: #fff;
+			position: absolute;
+			border-radius: 5px;
+			border: 1px solid #eee;
+			z-index: 99;
+			display: none;
+		}
+		.more-btn-block a {
+			display: block;
+			padding: 3px;
+			white-space: nowrap;
+		}
+	</style>
+	<script type="text/javascript">
+		$(document).ready(function() {
+
+		});
+		function page(n,s){
+			$("#pageNo").val(n);
+			$("#pageSize").val(s);
+			$("#searchForm").submit();
+			return false;
+		}
+		/**
+		 * @param obj
+		 * jquery控制input只能输入数字
+		 */
+		function onlynum(obj) {
+			obj.value = obj.value.replace(/[^\d]/g, ""); //清除"数字"以外的字符
+		}
+
+	</script>
+</head>
+<body>
+<ul class="nav nav-tabs">
+	<li class="active"><a href="${ctx}/weisha/cmMallOrganize">组织列表</a></li>
+</ul>
+<form:form id="searchForm" modelAttribute="cmMallOrganize" action="${ctx}/weisha/cmMallOrganize" method="post" class="breadcrumb form-search">
+	<input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+	<input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+	<div class="ul-form">
+		<label>组织名称:</label>
+		<form:input path="organizeName" htmlEscape="false" maxlength="20" class="input-medium"/>
+		<label>联系人:</label>
+		<form:input path="organizeLinkName" htmlEscape="false" maxlength="20" class="input-medium"/>
+		<label>手机号:</label>
+		<form:input path="mobile" htmlEscape="false" maxlength="11" class="input-medium" onchange="onlynum(this)"/>
+		<label>状态:</label>
+		<form:select path="status" class="input-medium">
+			<form:option value="" label="请选择"/>
+			<form:option value="1" label="已上线"/>
+			<form:option value="2" label="已下线"/>
+		</form:select>
+		&nbsp;&nbsp;<input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/>
+		&nbsp;&nbsp;<input class="btn btn-primary" style="width: 80px" onclick="window.location='${ctx}/weisha/cmMallOrganize/form'" value="添加组织"/>
+		<div class="clearfix"></div>
+	</div>
+</form:form>
+<sys:message content="${message}"/>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+	<thead>
+	<tr>
+		<th>组织名称</th>
+		<th>组织联系人</th>
+		<th>联系人手机</th>
+		<th>状态</th>
+		<th>添加时间</th>
+		<th>操作</th>
+	</tr>
+	</thead>
+	<tbody>
+	<c:if test="${not empty page.list}">
+		<c:forEach items="${page.list}" var="cmUserOrganize" varStatus="statusIndex">
+			<tr class="organize-tr">
+				<td>
+						${cmUserOrganize.organizeName}
+				</td>
+				<td>
+						${cmUserOrganize.organizeLinkName}
+				</td>
+				<td>
+						${cmUserOrganize.mobile}
+				</td>
+				<td>
+					<c:if test="${cmUserOrganize.status eq 1}">
+						<font color="green">已上线</font>&nbsp;&nbsp;
+						<a href="javascript:void(0)" onclick="offline(${cmUserOrganize.id})">下线</a>
+					</c:if>
+					<c:if test="${cmUserOrganize.status eq 2}">
+						<font color="red">已下线</font>&nbsp;&nbsp;
+						<a href="javascript:void(0)" onclick="online(${cmUserOrganize.id})">上线</a>
+					</c:if>
+				</td>
+				<td>
+					<fmt:formatDate value="${cmUserOrganize.addTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+				</td>
+					<td>
+						<a href="${ctx}/weisha/cmMallOrganize/form?id=${cmUserOrganize.id}">编辑</a>
+						<a href="${ctx}/weisha/cmOrganizeBuyer?organizeId=${cmUserOrganize.id}">采购员</a>
+						<a href="${ctx}/weisha/user/organizeClubList?userOrganizeID=${cmUserOrganize.id}">机构列表</a>
+						<a href="${ctx}/weisha/cmOrganizeProduct/list?organizeId=${cmUserOrganize.id}">商品列表</a>
+						<a href="${ctx}/weisha/cmOrganizePromotions/list?organizeId=${cmUserOrganize.id}&type=1">促销活动</a>
+					</td>
+			</tr>
+		</c:forEach>
+	</c:if>
+	</tbody>
+</table>
+<c:if test="${empty page.list}"><p style="text-align: center;"><font  color="#1e90ff">暂无数据……</font></p>
+</c:if>
+<div class="pagination">${page}</div>
+
+<script>
+	$(document).ready(function() {
+		$(document).click(function(e){
+			var btn = $('.show-more-btn'); //设置空白以外的目标区域
+			if(!btn.is(e.target) && btn.has(e.target).length === 0){
+				//写你需要做的事件
+				$('.more-btn-block').hide();
+			}
+		})
+
+		$('body').on('click', '.show-more-btn', function() {
+			var wrapper = $(this).closest('.organize-tr'),
+					$block = wrapper.find('.more-btn-block');
+			$('.more-btn-block').hide();
+			if($block.css('display') === 'block') {
+				$block.hide();
+			} else {
+				$block.show();
+			}
+		})
+	});
+
+	function offline(organizeId) {
+		$.jBox.confirm("确定下线该组织吗?", "提示", function (v, h, f) {
+			if (v === 1) {
+				window.location.href = "${ctx}/weisha/cmMallOrganize/onlineAndOffline?status=2&organizeId=" + organizeId;
+			}
+		}, {buttons: {'确定': 1, '取消': 2}});
+	}
+
+	function online(organizeId) {
+		$.jBox.confirm("确定上线该组织吗?", "提示", function (v, h, f) {
+			if (v === 1) {
+				window.location.href = "${ctx}/weisha/cmMallOrganize/onlineAndOffline?status=1&organizeId=" + organizeId;
+			}
+		}, {buttons: {'确定': 1, '取消': 2}});
+	}
+</script>
+</body>
+</html>

+ 71 - 0
src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeBuyerForm.jsp

@@ -0,0 +1,71 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>采购人员管理</title>
+	<meta name="decorator" content="default"/>
+	<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}/weisha/cmMallOrganize">组织列表</a></li>
+		<li><a href="${ctx}/weisha/cmOrganizeBuyer/">采购员列表</a></li>
+		<li class="active"><a href="${ctx}/weisha/cmOrganizeBuyer/form?id=${cmOrganizeBuyer.id}">${not empty cmOrganizeBuyer.id?'编辑':'添加'}</a></li>
+	</ul><br/>
+	<form:form id="inputForm" modelAttribute="cmOrganizeBuyer" action="${ctx}/weisha/cmOrganizeBuyer/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<form:hidden path="organizeId"/>
+		<sys:message content="${message}"/>
+		<div class="control-group">
+			<label class="control-label"><font color="red">*</font>姓名:</label>
+			<div class="controls">
+				<form:input path="name" htmlEscape="false" placeholder="最多输入15个汉字" maxlength="15" class="input-xlarge required"/>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label"><font color="red">*</font>手机号:</label>
+			<div class="controls">
+				<form:input path="mobile" htmlEscape="false" maxlength="11" onchange="mobileVerification(this)" class="input-xlarge required"/>
+			</div>
+		</div>
+		<div class="form-actions">
+			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;
+			<input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
+		</div>
+	</form:form>
+
+	<script>
+		/**
+		 * @param obj
+		 * jquery控制input只能输入数字
+		 */
+		function mobileVerification(obj) {
+			var reg = /^1\d{10}$/;
+			var mobile = document.getElementById("mobile").value;
+			if(!reg.test(mobile)){
+				alertx("手机号格式不正确");
+				$("#mobile").val("");
+			}
+		}
+	</script>
+</body>
+</html>

+ 127 - 0
src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeBuyerList.jsp

@@ -0,0 +1,127 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>采购人员管理</title>
+	<meta name="decorator" content="default"/>
+	<style type="text/css">
+		.table th{text-align: center;}
+		.table td{text-align: center;}
+	</style>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			
+		});
+		function page(n,s){
+			$("#pageNo").val(n);
+			$("#pageSize").val(s);
+			$("#searchForm").submit();
+        	return false;
+        }
+	</script>
+</head>
+<body>
+	<ul class="nav nav-tabs">
+		<li><a href="${ctx}/weisha/cmMallOrganize">组织列表</a></li>
+		<li class="active"><a href="${ctx}/weisha/cmOrganizeBuyer?organizeId=${cmOrganizeBuyer.organizeId}">采购员列表</a></li>
+	</ul>
+	<form:form id="searchForm" modelAttribute="cmOrganizeBuyer" action="${ctx}/weisha/cmOrganizeBuyer/" method="post" class="breadcrumb form-search">
+		<input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+		<input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+		<form:hidden path="organizeId"/>
+		<div class="ul-form">
+			 <label>姓名:</label>
+				<form:input path="name" htmlEscape="false" maxlength="50" class="input-medium"/>
+			 <label>手机号:</label>
+				<form:input path="mobile" htmlEscape="false" maxlength="20" class="input-medium"/>
+			 <label>状态:</label>
+				<form:select path="status" class="input-medium">
+					<form:option value="" label="请选择"/>
+					<form:option value="1" label="未绑定"/>
+					<form:option value="2" label="已绑定"/>
+				</form:select>
+			 <label>添加时间:</label>
+			<input name="startTime" type="text" maxlength="20" class="input-mini Wdate"
+				   value="<fmt:formatDate value="${cmOrganizeBuyer.startTime}" pattern="yyyy-MM-dd"/>"
+				   onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/> 至
+			<input name="endTime" type="text" maxlength="20" class="input-mini Wdate"
+				   value="<fmt:formatDate value="${cmOrganizeBuyer.endTime}" pattern="yyyy-MM-dd"/>"
+				   onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/>
+			&nbsp;&nbsp;<input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/>
+			&nbsp;&nbsp;<input class="btn btn-primary" style="width: 80px" onclick="window.location='${ctx}/weisha/cmOrganizeBuyer/form?organizeId=${cmOrganizeBuyer.organizeId}'" value="添加采购员"/>
+			<div class="clearfix"></div>
+		</div>
+	</form:form>
+	<sys:message content="${message}"/>
+	<font color="blue">当前组织:${mallOrganize.organizeName}</font>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>姓名</th>
+				<th>手机号</th>
+				<th>邀请码</th>
+				<th>状态</th>
+				<th>微信昵称</th>
+				<th>openID</th>
+				<th>添加时间</th>
+				<th>绑定时间</th>
+				<th>操作</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${page.list}" var="cmOrganizeBuyer">
+			<tr>
+				<td>
+					${cmOrganizeBuyer.name}
+				</td>
+				<td>
+					${cmOrganizeBuyer.mobile}
+				</td>
+				<td>
+					${cmOrganizeBuyer.invitationCode}<br>
+						<c:if test="${cmOrganizeBuyer.effectiveState eq 1}">
+							<font color="green">已使用</font>
+						</c:if>
+						<c:if test="${cmOrganizeBuyer.effectiveState eq 2}">
+							<font color="red">已失效</font>
+						</c:if>
+						<c:if test="${cmOrganizeBuyer.effectiveState eq 3}">
+							<font color="blue">有效</font>
+						</c:if>
+				</td>
+				<td>
+					<c:if test="${cmOrganizeBuyer.status eq 1}">
+						<font color="red">未绑定</font>
+					</c:if>
+					<c:if test="${cmOrganizeBuyer.status eq 2}">
+						<font color="green">已绑定</font>
+					</c:if>
+				</td>
+				<td>
+					${cmOrganizeBuyer.nickName}
+				</td>
+				<td>
+					${cmOrganizeBuyer.openid}
+				</td>
+				<td>
+					<fmt:formatDate value="${cmOrganizeBuyer.addTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+				</td>
+				<td>
+					<fmt:formatDate value="${cmOrganizeBuyer.bindTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+				</td>
+				<td>
+    				<a href="${ctx}/weisha/cmOrganizeBuyer/form?id=${cmOrganizeBuyer.id}">编辑</a>
+					<c:if test="${cmOrganizeBuyer.status ne 2}">
+						<a href="${ctx}/weisha/cmOrganizeBuyer/updateInvitationCode?id=${cmOrganizeBuyer.id}" onclick="return confirmx('确定更新邀请码吗?更新后将会短信通知采购员', this.href)">更新邀请码</a>
+					</c:if>
+					<c:if test="${cmOrganizeBuyer.status eq 2}">
+						<a href="${ctx}/weisha/cmOrganizeBuyer/untieBuyer?id=${cmOrganizeBuyer.id}" onclick="return confirmx('确定解绑该采购员吗?解绑后需要重新添加', this.href)">解绑</a>
+					</c:if>
+				</td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	<div class="pagination">${page}</div>
+</body>
+</html>

+ 484 - 0
src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeProductForm.jsp

@@ -0,0 +1,484 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>组织商品管理</title>
+	<meta name="decorator" content="default"/>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			//$("#name").focus();
+			$("#inputForm").validate({
+				submitHandler: function(form){
+					var costType = $("input[name='costType']:checked").val();
+					if(costType*1===1){
+						if ($("#costPrice").val() == '') {
+							alertx("请输入成本价");
+							return false;
+						};
+					}else{
+						if ($("#costProportional").val() == '') {
+							alertx("请输入成本比例");
+							return false;
+						};
+					}
+					if ($('#minBuyNumber:visible').length>0){
+						var minBuyNumber = $('#minBuyNumber').val();
+						if(minBuyNumber<=0 || minBuyNumber == ''){
+							alertx("请输入起订量");
+							return false;
+						}
+					}
+					if ($('input[name="ladderPriceList[0].buyNum"]:visible').length>0){
+						var buyNum = $('input[name="ladderPriceList[0].buyNum"]').val();
+						var buyPrice = $('input[name="ladderPriceList[0].buyPrice"]').val();
+						if(buyNum<=0 || buyNum == '' || buyPrice<=0 || buyPrice == ''){
+							alertx("请输入正确的阶梯价格");
+							return false;
+						}
+					}
+					if ($('input[name="ladderPriceList[1].buyNum"]:visible').length>0){
+						var buyNum1 = $('input[name="ladderPriceList[1].buyNum"]').val();
+						var buyPrice1 = $('input[name="ladderPriceList[1].buyPrice"]').val();
+						if(buyNum1<=0 || buyNum1 == '' || buyPrice1<=0 || buyPrice1 == ''){
+							alertx("请输入正确的阶梯价格");
+							return false;
+						}
+					}
+					if ($('input[name="ladderPriceList[2].buyNum"]:visible').length>0){
+						var buyNum2 = $('input[name="ladderPriceList[2].buyNum"]').val();
+						var buyPrice2 = $('input[name="ladderPriceList[2].buyPrice"]').val();
+						if(buyNum2<=0 || buyNum2 == '' || buyPrice2<=0 || buyPrice2 == ''){
+							alertx("请输入正确的阶梯价格");
+							return false;
+						}
+					}
+					var includedTax = $("input[name='includedTax']:checked").val();
+					if(includedTax == '' || includedTax == null){
+						alertx("请选择是否含税");
+						return false;
+					}
+					var invoiceType = $("input[name='invoiceType']:checked").val();
+					if ((includedTax == 0 || includedTax == 1) && (invoiceType == 1 || invoiceType == 2)) {
+						var clubTaxPoint = $("#clubTaxPoint").val();
+						var shopTaxPoint = $("#shopTaxPoint").val();
+						if (clubTaxPoint == '' || clubTaxPoint == null) {
+							alertx("请输入机构税率");
+							return false;
+						}
+						if (shopTaxPoint == '' || shopTaxPoint == null) {
+							alertx("请输入供应商税率");
+							return false;
+						}
+					}
+					if (includedTax != ${cmOrganizeProduct.includedTax} || invoiceType != ${cmOrganizeProduct.invoiceType}) {
+						top.$.jBox.confirm("目前含税信息为:${cmOrganizeProduct.includedTax eq 0?'不含税':cmOrganizeProduct.includedTax eq 1?'含税':'未知'}${cmOrganizeProduct.includedTax eq 2?'':cmOrganizeProduct.invoiceType eq 1?'-开增值税专用发票':cmOrganizeProduct.invoiceType eq 2?'-开增值税普通发票':'不开发票'},确定修改为:" + (includedTax == 0 ? '不含税' : includedTax == 1 ? '含税' : '未知') + (includedTax == 2 ? '' : invoiceType == 1 ? '-开增值税专用发票' : invoiceType == 2 ? '-开增值税普通发票' : '-不能开票') + "吗?", '保存商品提示', function (v, h, f) {
+							if (v == 'ok') {
+								// 提交订单
+								loading('正在提交,请稍等...');
+								form.submit();
+							}
+						}, {
+							buttonsFocus: 1, closed: function () {
+								if (typeof closed == 'function') {
+									closed();
+								}
+							}
+						});
+					} else {
+						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>
+	<style>
+		.line{margin:0 15px;}
+	</style>
+</head>
+<body>
+	<ul class="nav nav-tabs">
+		<li><a href="${ctx}/weisha/cmOrganizeProduct/">组织商品列表</a></li>
+		<li class="active"><a href="${ctx}/weisha/cmOrganizeProduct/form?id=${cmOrganizeProduct.id}">组织商品<shiro:hasPermission name="weisha:cmOrganizeProduct:edit">${not empty cmOrganizeProduct.id?'编辑':'添加'}</shiro:hasPermission><shiro:lacksPermission name="weisha:cmOrganizeProduct:edit">查看</shiro:lacksPermission></a></li>
+	</ul><br/>
+	<form:form id="inputForm" modelAttribute="cmOrganizeProduct" action="${ctx}/weisha/cmOrganizeProduct/save" method="post" class="form-horizontal">
+		<form:hidden path="id"/>
+		<form:hidden path="organizeId"/>
+		<sys:message content="${message}"/>
+		<div class="control-group">
+			<label class="control-label">商品名称:</label>
+			<div class="controls">${cmOrganizeProduct.productName}</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">商品展示价格:</label>
+			<div class="controls">
+				<form:radiobutton path="ladderPriceFlag" value="0" label="不使用阶梯价格" onclick="changeLadderPrice()" class="required" /><b class="line">|</b>
+				<form:radiobutton path="ladderPriceFlag" value="1" label="使用阶梯价格" onclick="changeLadderPrice()" class="required" />
+			</div>
+
+		</div>
+		<div class="control-group">
+			<label class="control-label">机构价:</label>
+			<div class="controls">
+				<form:input path="price" id="price" type="number" maxlength="11" class="short required" /> 元
+			</div>
+			<div class="controls" id="ladderPriceBox">
+				<div id="ladderPrice1">
+					起订量:<form:input path="ladderPriceList[0].buyNum" min="1" type="number" maxlength="11" class="short number" onblur="checkBuyNum(this, 0)"/>(${cmOrganizeProduct.unit})及以上,
+					<form:input path="ladderPriceList[0].buyPrice" type="number" maxlength="11" class="short price" onblur="checkBuyPrice(this, 0)" />元/(${cmOrganizeProduct.unit})
+					<span class="showBtn ${null != cmOrganizeProduct.ladderPriceList[1] && null != cmOrganizeProduct.ladderPriceList[1].buyNum ? "hide" : ""}">
+                                <a class="addBtn" href="javascript:;">添加</a>
+                                <form:hidden path="ladderPriceList[0].id"/>
+                                <form:hidden path="ladderPriceList[0].delFlag" id="delFlag1"/>
+                            </span>
+				</div>
+				<div id="ladderPrice2" ${null == cmOrganizeProduct.ladderPriceList[1] && null == cmOrganizeProduct.ladderPriceList[1].buyNum ? "class='hide'" : ""}>
+					起订量:<form:input path="ladderPriceList[1].buyNum" type="number" maxlength="11" class="short number" onblur="checkBuyNum(this, 1)" />(${cmOrganizeProduct.unit})及以上,
+					<form:input path="ladderPriceList[1].buyPrice" type="number" maxlength="11" class="short price" onblur="checkBuyPrice(this, 1)"/>元/(${cmOrganizeProduct.unit})
+					<span class="showBtn ${null != cmOrganizeProduct.ladderPriceList[2] && null != cmOrganizeProduct.ladderPriceList[2].buyNum ? "hide" : ""}">
+                                <a class="delBtn" href="javascript:;">删除</a> / <a class="addBtn" href="javascript:;">添加</a>
+                                <form:hidden path="ladderPriceList[1].id"/>
+                                <form:hidden path="ladderPriceList[1].delFlag" id="delFlag2"/>
+                            </span>
+				</div>
+				<div  id="ladderPrice3" ${null == cmOrganizeProduct.ladderPriceList[2] && null == cmOrganizeProduct.ladderPriceList[2].buyNum ? "class='hide'" : ""}>
+					起订量:<form:input path="ladderPriceList[2].buyNum" type="number" maxlength="11" class="short number" onblur="checkBuyNum(this, 2)" />(${cmOrganizeProduct.unit})及以上,
+					<form:input path="ladderPriceList[2].buyPrice" type="number" maxlength="11" class="short price" onblur="checkBuyPrice(this, 2)"/>元/(${cmOrganizeProduct.unit})
+					<span class="showBtn"><a class="delBtn" href="javascript:;">删除</a></span>
+					<form:hidden path="ladderPriceList[2].id"/>
+					<form:hidden path="ladderPriceList[2].delFlag" id="delFlag3"/>
+				</div>
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">是否含税:</label>
+			<div class="controls">
+				<form:radiobutton path="includedTax" value="1" label="含税" onclick="changeIncludedTax(${cmOrganizeProduct.clubTaxPoint})" class="required"/><b class="line">|</b>
+				<form:radiobutton path="includedTax" value="0" label="不含税" onclick="changeIncludedTax(${cmOrganizeProduct.clubTaxPoint})" class="required" /><b class="line">|</b>
+				<form:radiobutton path="includedTax" value="2" label="未知" onclick="changeIncludedTax(${cmOrganizeProduct.clubTaxPoint})" class="required" />
+			</div>
+		</div>
+		<div class="control-group" id="invoiceItem">
+			<label class="control-label">发票类型:</label>
+			<div class="controls">
+				<span class="invoice">
+					<form:radiobutton path="invoiceType" value="1" label="开增值税专用发票" onclick="changeIncludedTax()" class="required" /><b class="line">|</b>
+					<form:radiobutton path="invoiceType" value="2" label="开增值税普通发票" onclick="changeIncludedTax()" class="required" />
+				</span>
+				<span class="notInvoice">
+					<b class="line">|</b>
+					<form:radiobutton path="invoiceType" value="3" label="不能开票" onclick="changeIncludedTax()" class="required" />
+				</span>
+			</div>
+		</div>
+		<div class="control-group" id="clubTaxPointDiv">
+			<label class="control-label">机构税率:</label>
+			<div class="controls">
+				<form:input path="clubTaxPoint" maxlength="5" cssStyle="width: 35PX" class="number" onchange="setTwoNumberDecimal(this)"  />%
+			</div>
+		</div>
+		<div class="control-group" id="shopTaxPointDiv">
+			<label class="control-label">供应商税率:</label>
+			<div class="controls">
+				<form:input path="shopTaxPoint" maxlength="5" cssStyle="width: 35PX" class="number" onchange="setTwoNumberDecimal(this)" />%
+			</div>
+		</div>
+		<div class="control-group" id="priceMinNumber">
+			<label class="control-label">起订量:</label>
+			<div class="controls">
+				<form:input path="minBuyNumber" htmlEscape="false" class="short  digits" />
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">成本:</label>
+			<div class="controls">
+				<form:radiobutton path="costType" value="1" label="固定成本" onchange="changeCostPriceShow()" class="required" /><b class="line">|</b>
+				<form:radiobutton path="costType" value="2" label="比例成本" onchange="changeCostPriceShow()" class="required" />
+			</div>
+		</div>
+		<div class="control-group" id="costPriceShow">
+			<label class="control-label">成本价:</label>
+			<div class="controls">
+				<form:input path="costPrice" htmlEscape="false" maxlength="11" class="short  number"/>
+			</div>
+		</div>
+		<div class="control-group" id="costPropShow">
+			<label class="control-label">比例成本百分比:</label>
+			<div class="controls">
+				<form:input path="costProportional" htmlEscape="false"  maxlength="11" class="short  number" /> %
+			</div>
+		</div>
+		<div class="control-group">
+			<label class="control-label">运费:</label>
+			<div class="controls">
+				<form:radiobutton path="postageType" value="1" label="默认(遵循运费规则)" class="required" /><b class="line">|</b>
+				<form:radiobutton path="postageType" value="2" label="包邮" class="required" /><b class="line">|</b>
+				<form:radiobutton path="postageType" value="3" label="到付" class="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>
+
+	<script type="text/javascript">
+		var ladderPriceFlag = ${cmOrganizeProduct.ladderPriceFlag};
+		$(function () {
+			//初始化含税信息
+			var includedTax = $("input[name='includedTax']:checked").val();
+			var invoiceType = $("input[name='invoiceType']:checked").val();
+			var clubTaxPoint = $("#clubTaxPoint").val();
+			//1含税,0不含税
+			if(includedTax == 1){
+				$("#invoiceItem").show().find(".invoice").show().siblings(".notInvoice").hide();
+				$("#clubTaxPointDiv").show();
+				$("#shopTaxPointDiv").show();
+			}
+			if(includedTax == 0){
+				$("#invoiceItem").show().find(".invoice").show().siblings(".notInvoice").show();
+				// 选择增值税且不为不开发票
+				if(invoiceType == 3){
+					$("#clubTaxPointDiv").hide();
+					$("#shopTaxPointDiv").hide();
+				}else{
+					$("#clubTaxPointDiv").show();
+					$("#shopTaxPointDiv").show();
+				}
+			}
+			if(includedTax == 2){
+				$("#invoiceItem").hide();
+				$("#clubTaxPointDiv").hide();
+				$("#shopTaxPointDiv").hide();
+			}
+			if(includedTax == "" || includedTax == null){
+				$("#invoiceItem").hide();
+				$("#clubTaxPointDiv").hide();
+				$("#shopTaxPointDiv").hide();
+			}
+
+			//发票初始化
+			if(includedTax == 0 && (invoiceType == 1 || invoiceType == 2)){
+				$("#clubTaxPointDiv").show();
+				$("#shopTaxPointDiv").show();
+			}
+
+			if(includedTax == 1){//含税
+				// 一个都没选中默认选中增值税
+				if(invoiceType != 1 && invoiceType != 2){
+					$("input[name='invoiceType']:eq(0)").attr("checked",'checked');
+				}
+			}else if (includedTax == 0){//不含税
+				// 一个都没选中默认选中增值税
+				if(invoiceType != 1 && invoiceType != 2 && invoiceType != 3){
+					$("input[name='invoiceType']:eq(0)").attr("checked",'checked');
+				}
+				if(invoiceType == 1){//增值税
+					// 如果税点为空,如果选择的是1(增值:默认13%)、2(普通:6%)
+					if(clubTaxPoint == null || clubTaxPoint == ""){
+						$("#clubTaxPoint").val(13);
+					}
+				}else if(invoiceType == 2){//普通发票
+					// 如果税点为空,如果选择的是1(增值:默认13%)、2(普通:6%)
+					if(clubTaxPoint == null || clubTaxPoint == ""){
+						$("#clubTaxPoint").val(6);
+					}
+				}
+			}
+			//初始化成本信息
+			changeCostPriceShow();
+			//初始化阶梯价格
+			if(ladderPriceFlag*1>0){
+				$("#ladderPriceBox").show();
+				$("#priceMinNumber").hide();
+			}else{
+				$("#ladderPriceBox").hide();
+				$("#priceMinNumber").show();
+			}
+		});
+
+		//修改含税类型
+		function changeIncludedTax(clubTaxPoint) {
+			//修改选择项
+			var includedTax = $("input[name='includedTax']:checked").val();
+			var invoiceType = $("input[name='invoiceType']:checked").val();
+			var clubTaxPoint = clubTaxPoint;
+			//1含税,0不含税,2未知
+			if(includedTax == 1){
+				$("#invoiceItem").show().find(".invoice").show().siblings(".notInvoice").hide();
+				$("#clubTaxPointDiv").show();
+				$("#shopTaxPointDiv").show();
+			}
+			if(includedTax == 0){
+				$("#invoiceItem").show().find(".invoice").show().siblings(".notInvoice").show();
+				// 选择增值税且不为不开发票
+				if(invoiceType == 3){
+					$("#clubTaxPointDiv").hide();
+					$("#shopTaxPointDiv").hide();
+				}else{
+					$("#clubTaxPointDiv").show();
+					$("#shopTaxPointDiv").show();
+				}
+			}
+			if(includedTax == 2){
+				$("#invoiceItem").hide();
+				$("#clubTaxPointDiv").hide();
+				$("#shopTaxPointDiv").hide();
+			}
+			if(includedTax == "" || includedTax == null){
+				$("#invoiceItem").hide();
+				$("#clubTaxPointDiv").hide();
+				$("#shopTaxPointDiv").hide();
+			}
+
+			if(includedTax == 1){//含税
+				// 一个都没选中默认选中增值税
+				if(invoiceType != 1 && invoiceType != 2){
+					$("input[name='invoiceType']:eq(0)").attr("checked",'checked');
+				}
+			}else if (includedTax == 0){//不含税
+				// 一个都没选中默认选中增值税
+				if(invoiceType != 1 && invoiceType != 2 && invoiceType != 3){
+					$("input[name='invoiceType']:eq(0)").attr("checked",'checked');
+				}
+			}
+			invoiceType = $("input[name='invoiceType']:checked").val();
+			if(invoiceType == 1){//增值税
+				// 如果税点为空,如果选择的是1(增值:默认13%)、2(普通:6%)
+				if(clubTaxPoint == null || clubTaxPoint == ""){
+					$("#clubTaxPoint").val(13);
+					$("#shopTaxPoint").val(13);
+				}
+			}else if(invoiceType == 2){//普通发票
+				// 如果税点为空,如果选择的是1(增值:默认13%)、2(普通:6%)
+				if(clubTaxPoint == null || clubTaxPoint == ""){
+					$("#clubTaxPoint").val(6);
+					$("#shopTaxPoint").val(6);
+				}
+			}
+		}
+
+		//选择发票类型
+		function changeInvoiceType(clubTaxPoint) {
+			var clubTaxPoint = clubTaxPoint;
+			var includedTax = $("input[name='includedTax']:checked").val();
+			//选择发票类型:1增值税票,2普通票, 3不能开票
+			var invoiceType = $("input[name='invoiceType']:checked").val();
+			//只有在选择了不含税才使用税点,不含税里面的
+			if( (includedTax == 0 || includedTax == 1)  && (invoiceType == 1 || invoiceType == 2)){
+				$("#clubTaxPointDiv").show();
+				$("#shopTaxPointDiv").show();
+			}else{
+				$("#clubTaxPointDiv").hide();
+				$("#shopTaxPointDiv").hide();
+			}
+
+			if(invoiceType == 1){//增值税
+				// 如果税点为空,如果选择的是1(增值:默认13%)、2(普通:6%)
+				if(clubTaxPoint == null || clubTaxPoint == ""){
+					$("#clubTaxPoint").val(13);
+					$("#shopTaxPoint").val(13);
+				}
+			}else if(invoiceType == 2){//普通发票
+				// 如果税点为空,如果选择的是1(增值:默认13%)、2(普通:6%)
+				if(clubTaxPoint == null || clubTaxPoint == ""){
+					$("#clubTaxPoint").val(6);
+					$("#shopTaxPoint").val(6);
+				}
+			}
+
+		}
+		//限制输入两位小数
+		function setTwoNumberDecimal(that) {
+			var n = parseFloat(that.value);
+			that.value = n.toFixed(2)
+		}
+		// 是否固定成本
+		function changeCostPriceShow() {
+			var costType = $("input[name='costType']:checked").val();
+			if(costType*1===1){
+				$("#costPriceShow").show();
+				$("#costPropShow").hide();
+			}else{
+				$("#costPriceShow").hide();
+				$("#costPropShow").show();
+			}
+		}
+
+		// 是否使用阶梯价格
+		function changeLadderPrice(){
+			var ladderPriceFlag = $("input[name='ladderPriceFlag']:checked").val();
+			if(ladderPriceFlag*1>0){
+				$("#ladderPriceBox").show();
+				$("#priceMinNumber").hide();
+				$("#delFlag1").val("0");
+				$('input[name="ladderPriceList[0].buyNum"]').val($('#minBuyNumber').val()*1);
+			}else{
+				$("#ladderPriceBox").hide();
+				$("#priceMinNumber").show();
+			}
+		}
+
+		// 检查阶梯数量
+		function checkBuyNum(input, index) {
+			if(index>0){
+				var beforeNum = $('input[name="ladderPriceList['+(index-1)+'].buyNum"]').val()*1;
+				if(input.value*1 <= beforeNum){
+					alertx("请输入大于上一阶起订量的值");
+					$(input).val(input.value*1+beforeNum);
+				}
+			} else {
+				var minNum = $('input[name="ladderPriceList[0].buyNum"]').val()*1;
+				$('#minBuyNumber').val(minNum);
+			}
+		}
+		// 检查阶梯价格
+		function checkBuyPrice(input, index) {
+			if (index > 0) {
+				var beforePrice = $('input[name="ladderPriceList['+(index-1)+'].buyPrice"]').val()*1;
+				if(input.value*1 > beforePrice){
+					$(input).val('');
+					alertx("请输入小于前一个价格的值");
+				}
+			} else {
+				var price1 = $('#price1').val();
+				if(input.value*1 > price1){
+					$(input).val('');
+					alertx("第一个阶梯价格不能大于机构价");
+				}
+			}
+		}
+		// 阶梯价格点击事件
+		$("#ladderPrice1").on("click", ".addBtn", function(){
+			$("#ladderPrice2").removeClass("hide");
+			$("#delFlag2").val("0");
+			$("#ladderPrice1").find(".showBtn").addClass("hide");
+		});
+		$("#ladderPrice2").on("click", ".addBtn", function(){
+			$("#ladderPrice3").removeClass("hide");
+			$("#delFlag3").val("0");
+			$("#ladderPrice2").find(".showBtn").addClass("hide");
+		}).on("click", ".delBtn", function(){
+			$("#ladderPrice2").addClass("hide");
+			$("#ladderPrice1").find(".showBtn").removeClass("hide");
+			$("#delFlag2").val("1");
+		});
+		$("#ladderPrice3").on("click", ".delBtn", function(){
+			$("#ladderPrice3").addClass("hide");
+			$("#ladderPrice2").find(".showBtn").removeClass("hide");
+			$("#delFlag3").val("1");
+		});
+	</script>
+
+</body>
+
+</html>

+ 200 - 0
src/main/webapp/WEB-INF/views/modules/weisha/cmOrganizeProductList.jsp

@@ -0,0 +1,200 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>组织商品管理</title>
+	<meta name="decorator" content="default"/>
+	<style type="text/css">
+		.table th{text-align: center;}
+		.table td{text-align: center;}
+		.optionHide{
+			display: none !important;
+		}
+	</style>
+	<script type="text/javascript">
+		$(document).ready(function() {
+
+		});
+		function page(n,s){
+			$("#pageNo").val(n);
+			$("#pageSize").val(s);
+			$("#searchForm").submit();
+        	return false;
+        }
+
+
+		//选择添加商品
+		function showSelect() {
+			debugger
+			var organizeId = $("#organizeId").val();
+			var url = "${ctx}/weisha/cmOrganizeProduct/findProductPage?organizeId=" + organizeId;
+			var title = "选择商品";
+			top.$.jBox("iframe:"+url, {
+				iframeScrolling: 'yes',
+				width: $(top.document).width() - 400,
+				height: $(top.document).height() - 160,
+				persistent: true,
+				title: title,
+				buttons: {"确定": '1', "关闭": '-1'},
+				submit: function (v, h, f) {
+					//确定
+					var $jboxFrame = top.$('#jbox-iframe');
+					var $mainFrame = top.$('#mainFrame');
+					if ('1' == v && 1 == $jboxFrame.size() && 1 == $mainFrame.size()) {
+						var items = $jboxFrame[0].contentWindow.getCheckedItems(0);
+						if (items.length > 0) {
+							//添加数据
+							$.post("${ctx}/weisha/cmOrganizeProduct/addProducts?organizeId="+organizeId+"&productIds="+items, function (data) {
+								if (true == data.success) {
+									$.jBox.tip(data.info, 'info');
+									setTimeout(function () {
+										window.location.href = "${ctx}/weisha/cmOrganizeProduct/?organizeId=" + organizeId
+									}, 1300);
+								} else {
+									$.jBox.tip(data.info, 'error');
+								}
+							}, "JSON");//这里返回的类型有:json,html,xml,text
+							return true;
+						} else {
+							top.$.jBox.tip("请先勾选商品...");
+							return false;
+						}
+					}
+					return true;
+				}
+			});
+		}
+
+		$(function () {
+			changeIncludedTax(false);
+		})
+
+		function changeIncludedTax(changeFlag) {
+			var includedTax = $("#includedTax").val();
+			var invoiceSelect=$("#invoiceType option");
+			if (includedTax == "" || includedTax == 2 ) {
+				$("#invoiceTypeDiv").hide();
+			}else if (includedTax == 0){
+				$("#invoiceTypeDiv").show();
+				invoiceSelect.each(function (i,el) {
+					if($(el).val()==3){
+						$(el).removeClass("optionHide");
+					}
+				})
+			}else {
+				$("#invoiceTypeDiv").show();
+				invoiceSelect.each(function (i,el) {
+					if($(el).val()==3){
+						$(el).addClass("optionHide");
+					}
+				})
+			}
+			if (changeFlag) {
+				$("#invoiceType").val("");
+				$("#s2id_invoiceType .select2-chosen").text("请选择")
+			}
+		}
+
+	</script>
+</head>
+<body>
+	<ul class="nav nav-tabs">
+		<li class="active"><a href="${ctx}/weisha/cmOrganizeProduct/?organizeId=${organizeId}">组织商品列表</a></li>
+		<shiro:hasPermission name="weisha:cmOrganizeProduct:edit"><li><a href="${ctx}/weisha/cmOrganizeProduct/form">组织商品添加</a></li></shiro:hasPermission>
+	</ul>
+	<form:form id="searchForm" modelAttribute="cmOrganizeProduct" action="${ctx}/weisha/cmOrganizeProduct/" method="post" class="breadcrumb form-search">
+		<form:hidden path="organizeId"/>
+		<input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+		<input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+		<div class="ul-form">
+			 <label>商品ID:</label>
+				<form:input path="id" htmlEscape="false" class="input-medium"/>
+			<label>商品名称:</label>
+				<form:input path="productName" htmlEscape="false" class="input-large"/>
+			<label>供应商名称:</label>
+				<form:input path="shopName" htmlEscape="false" class="input-large"/>
+			<label>商品状态:</label>
+				<form:select path="status" class="input-small">
+					<form:option value="" label="请选择"/>
+					<form:option value="1" label="已上架"/>
+					<form:option value="0" label="已下架"/>
+				</form:select>
+			<label>是否含税:</label>
+				<form:select path="includedTax" onchange="changeIncludedTax(true)" class="input-small">
+					<form:option value="" label="请选择"/>
+					<form:option value="1" label="含税"/>
+					<form:option value="0" label="不含税"/>
+					<form:option value="2" label="未知"/>
+				</form:select>
+			<div id="invoiceTypeDiv" style="display: inline" class="hide">
+				<label>发票:</label>
+				<form:select path="invoiceType" class="input-medium">
+					<form:option value="" label="请选择"/>
+					<form:option value="1" label="开增值税专用发票"/>
+					<form:option value="2" label="开增值税普通发票"/>
+					<form:option value="3" label="不能开票"/>
+				</form:select>
+			</div>
+
+
+			&nbsp;&nbsp;<input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/>
+			&nbsp;&nbsp;<input type="button" class="btn btn-primary" onclick="showSelect()" value="添加商品"></input>
+			<div class="clearfix"></div>
+		</div>
+
+	</form:form>
+	<sys:message content="${message}"/>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>商品ID</th>
+				<th>商品图片</th>
+				<th>商品名称</th>
+				<th>供应商名称</th>
+				<th>售价</th>
+				<th>是否含税</th>
+				<th>商品状态</th>
+				<th>添加时间</th>
+				<th>操作</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${page.list}" var="cmOrganizeProduct">
+			<tr>
+				<td>
+					${cmOrganizeProduct.id}
+				</td>
+				<td>
+					<img src="${cmOrganizeProduct.productImage}" width="50px" height="50px">
+				</td>
+				<td>
+					${cmOrganizeProduct.productName}
+				</td>
+				<td>
+					${cmOrganizeProduct.shopName}
+				</td>
+				<td>
+					${cmOrganizeProduct.price}
+				</td>
+				<td>
+					${cmOrganizeProduct.includedTax eq 0?'不含税-':cmOrganizeProduct.includedTax eq 1?'含税-':'未知'}
+					${cmOrganizeProduct.includedTax eq 2?'':cmOrganizeProduct.invoiceType eq 1?'开增值税专用发票':cmOrganizeProduct.invoiceType eq 2?'开增值税普通发票':'未知'}
+				</td>
+				<td style="color: ${cmOrganizeProduct.status eq 1?'green':'red'}">
+					${cmOrganizeProduct.status eq 1?'已上架':'已下架'}
+				</td>
+				<td>
+					<fmt:formatDate value="${cmOrganizeProduct.addTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+				</td>
+				<td>
+    				<a href="${ctx}/weisha/cmOrganizeProduct/form?id=${cmOrganizeProduct.id}">编辑</a>
+    				<a href="${ctx}/weisha/cmOrganizeProduct/updateStatus?organizeId=${organizeId}&id=${cmOrganizeProduct.id}&status=${cmOrganizeProduct.status eq 1?0:1}">${cmOrganizeProduct.status eq 1?'下架':'上架'}</a>
+					<a href="${ctx}/weisha/cmOrganizeProduct/delete?id=${cmOrganizeProduct.id}" onclick="return confirmx('确认要删除该商品吗?删除后需要重新添加', this.href)">删除</a>
+				</td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	<div class="pagination">${page}</div>
+</body>
+</html>

+ 126 - 0
src/main/webapp/WEB-INF/views/modules/weisha/findOrganizeProduct.jsp

@@ -0,0 +1,126 @@
+<%--
+  Created by IntelliJ IDEA.
+  User: Administrator
+  Date: 2020/4/9
+  Time: 19:54
+  To change this template use File | Settings | File Templates.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title>选择商品</title>
+    <meta name="decorator" content="default"/>
+    <style type="text/css">
+        .table td i {
+            margin: 0 2px;
+        }
+    </style>
+
+    <script type="text/javascript">
+        $(document).ready(function () {
+            $("#searchForm").validate({
+                submitHandler: function (form) {
+                    var isSubMitFlag = true;
+                    var productID = $("#productID").val();
+                    if (isNaN(productID) || productID.indexOf('0') == 0 ) {
+                        alertx("请输入正确的商品ID");
+                        isSubMitFlag = false;
+                        return false;
+                    }
+                    if (isSubMitFlag) {
+                        form.submit();
+                    }
+                }
+            })
+        });
+    </script>
+</head>
+<body>
+<form:form id="searchForm" modelAttribute="product" action="${ctx}/weisha/cmOrganizeProduct/findProductPage" method="post"
+           class="breadcrumb form-search">
+    <input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+    <input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+    <form:hidden path="organizeId"/>
+    <div class="ul-form">
+        <label>商品ID:</label>
+        <form:input path="productID" id="productID" htmlEscape="false" maxlength="8" class="input-mini" onkeyup="onlynum(this)"/>
+        <label>商品名称:</label>
+        <form:input path="name" htmlEscape="false" class="input-medium" maxlength="20"/>
+        <label>供应商名称:</label>
+        <form:input path="shopName" htmlEscape="false" class="input-medium" maxlength="20"/>
+        &nbsp;&nbsp;<input id="btnSubmit" class="btn btn-primary" type="submit" value="搜索"/>
+        <div class="clearfix"></div>
+    </div>
+</form:form>
+<sys:message content="${message}"/>
+<table class="table table-striped table-bordered table-condensed table-hover">
+    <tr>
+        <th style="width:20px;"></th>
+        <th>商品ID</th>
+        <th>商品图片</th>
+        <th>商品名称</th>
+        <th>供应商名称</th>
+        <th>机构价</th>
+    </tr>
+    <tbody>
+    <c:if test="${not empty page.list}">
+        <c:forEach items="${page.list}" var="item">
+            <tr id="${item.productID}" class="itemtr">
+                <th>
+                    <input class="check-item" type="checkbox" ${item.validFlag eq 0?'disabled="true"':''} name="info" value='${item.productID}'/>
+
+                </th>
+                <td>${item.productID}</td>
+                <td><img src="${item.mainImage}" width="50px" height="50px"></td>
+                <td>${item.name}</td>
+                <td>${item.shopName}</td>
+                <td>${item.price1}</td>
+            </tr>
+        </c:forEach>
+    </c:if>
+    </tbody>
+</table>
+<c:if test="${empty  page.list}">
+    <p style="text-align: center;"><font color="#1e90ff">暂无数据……</font></p>
+</c:if>
+<div class="pagination">${page}</div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        //弹出框去滚动条
+        top.$('#jbox-content').css("overflow-y", "hidden");
+        show_title(30);
+    });
+
+    function page(n, s) {
+        $("#pageNo").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function getCheckedItems() {
+        var items = new Array();
+        var $items = $('.check-item:checked');
+        $items.each(function () {
+            items.push($(this).val());
+        });
+        return items;
+    }
+
+    function clickAllSelect(ckb) {
+        var isChecked = ckb.checked;
+        $(".check-item").attr('checked', isChecked);
+    }
+
+    /**
+     * @param obj
+     * jquery控制input只能输入数字
+     */
+    function onlynum(obj) {
+        obj.value = obj.value.replace(/[^\d]/g, ""); //清除"数字"以外的字符
+    }
+</script>
+</body>
+</html>
+

+ 128 - 0
src/main/webapp/WEB-INF/views/modules/weisha/findPromotionSingleProduct.jsp

@@ -0,0 +1,128 @@
+<%--
+  Created by IntelliJ IDEA.
+  User: Administrator
+  Date: 2020/4/9
+  Time: 19:54
+  To change this template use File | Settings | File Templates.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title>选择商品</title>
+    <meta name="decorator" content="default"/>
+    <style type="text/css">
+        .table td i {
+            margin: 0 2px;
+        }
+    </style>
+
+    <script type="text/javascript">
+        $(document).ready(function () {
+            $("#searchForm").validate({
+                submitHandler: function (form) {
+                    var isSubMitFlag = true;
+                    var productID = $("#productID").val();
+                    if (isNaN(productID) || productID.indexOf('0') == 0 ) {
+                        alertx("请输入正确的商品ID");
+                        isSubMitFlag = false;
+                        return false;
+                    }
+                    if (isSubMitFlag) {
+                        form.submit();
+                    }
+                }
+            })
+        });
+    </script>
+</head>
+<body>
+<form:form id="searchForm" modelAttribute="product" action="${ctx}/weisha/cmOrganizePromotions/findProductPage" method="post"
+           class="breadcrumb form-search">
+    <input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+    <input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+    <form:hidden path="productIds"/>
+    <form:hidden path="promotionType"/>
+    <form:hidden path="ids"/>
+    <form:hidden path="delProductIds"/>
+    <div class="ul-form">
+        <label>商品ID:</label>
+        <form:input path="productID" id="productID" htmlEscape="false" maxlength="8" class="input-mini" onkeyup="onlynum(this)"/>
+        <label>商品名称:</label>
+        <form:input path="name" htmlEscape="false" class="input-medium" maxlength="20"/>
+        <label>供应商名称:</label>
+        <form:input path="shopName" htmlEscape="false" class="input-medium" maxlength="20"/>
+    &nbsp;&nbsp;  <input id="btnSubmit" class="btn btn-primary" type="submit" value="搜索"/>
+        <div class="clearfix"></div>
+    </div>
+</form:form>
+<sys:message content="${message}"/>
+<table class="table table-striped table-bordered table-condensed table-hover">
+    <tr>
+        <th style="width:20px;"></th>
+        <th>商品ID</th>
+        <th>商品图片</th>
+        <th>商品名称</th>
+        <th>供应商名称</th>
+        <th>机构价</th>
+    </tr>
+    <tbody>
+    <c:if test="${not empty page.list}">
+        <c:forEach items="${page.list}" var="item">
+            <tr id="${item.productID}" class="itemtr">
+                <th>
+                    <input class="check-item" type="radio" name="info" value='${item.productID}'/>
+                </th>
+                <td>${item.productIdStr}</td>
+                <td><img src="${item.mainImage}" width="50px" height="50px"></td>
+                <td>${item.name}</td>
+                <td>${item.shopName}</td>
+                <td>${item.price1}</td>
+            </tr>
+        </c:forEach>
+    </c:if>
+    </tbody>
+</table>
+<c:if test="${empty  page.list}">
+    <p style="text-align: center;"><font color="#1e90ff">暂无数据……</font></p>
+</c:if>
+<div class="pagination">${page}</div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        //弹出框去滚动条
+        top.$('#jbox-content').css("overflow-y", "hidden");
+        show_title(30);
+    });
+
+    function page(n, s) {
+        $("#pageNo").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function getCheckedItems() {
+        var items = new Array();
+        var $items = $('.check-item:checked');
+        $items.each(function () {
+            items.push($(this).val());
+        });
+        return items;
+    }
+
+    function clickAllSelect(ckb) {
+        var isChecked = ckb.checked;
+        $(".check-item").attr('checked', isChecked);
+    }
+
+    /**
+     * @param obj
+     * jquery控制input只能输入数字
+     */
+    function onlynum(obj) {
+        obj.value = obj.value.replace(/[^\d]/g, ""); //清除"数字"以外的字符
+    }
+</script>
+</body>
+</html>
+

+ 108 - 0
src/main/webapp/WEB-INF/views/modules/weisha/organizeClubList.jsp

@@ -0,0 +1,108 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>组织管理</title>
+	<meta name="decorator" content="default"/>
+	<style type="text/css">
+		.table th{text-align: center;}
+		.table td{text-align: center;}
+	</style>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			
+		});
+		function page(n,s){
+			$("#pageNo").val(n);
+			$("#pageSize").val(s);
+			$("#searchForm").submit();
+        	return false;
+        }
+	</script>
+</head>
+<body>
+	<ul class="nav nav-tabs">
+		<li><a href="${ctx}/weisha/cmMallOrganize">组织列表</a></li>
+		<li class="active"><a href="${ctx}/weisha/user/organizeClubList?userOrganizeID=${mallOrganize.id}">机构列表</a></li>
+	</ul>
+	<form:form id="searchForm" modelAttribute="cmUser" action="${ctx}/weisha/user/organizeClubList?userOrganizeID=${mallOrganize.id}" method="post" class="breadcrumb form-search">
+		<input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+		<input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+		<div class="ul-form">
+			 <label>机构名称:</label>
+				<form:input path="userName" htmlEscape="false" maxlength="20" class="input-medium"/>
+			<label>联系人:</label>
+			<form:input path="linkMan" htmlEscape="false" maxlength="10" class="input-medium"/>
+			 <label>手机号:</label>
+				<form:input path="bindMobile" htmlEscape="false" maxlength="11" class="input-medium"/>
+			<label>上线状态:</label>
+			<form:select path="clubStatus" class="input-mini">
+				<form:option value="" label="请选择"/>
+				<form:option value="90" label="已上线"/>
+				<form:option value="91" label="已下线"/>
+			</form:select>
+			<label>添加时间:</label>
+			<input name="startTime" type="text" readonly="readonly" maxlength="15" class="input-mini Wdate"
+				   value="${startTime}"
+				   onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/> -
+			<input name="endTime" type="text" readonly="readonly" maxlength="15" class="input-mini Wdate"
+				   value="${endTime}"
+				   onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/>
+			&nbsp;&nbsp;<input id="btnSubmit" class="btn btn-primary" type="submit" value="搜索"/>
+			&nbsp;&nbsp;<input id="btnSubmit1" class="btn btn-primary" style="width: 64px" onclick="window.location='${ctx}/weisha/user/addClubUser?id=${mallOrganize.id}'" value="上线机构"/>
+			<div class="clearfix"></div>
+		</div>
+	</form:form>
+	<sys:message content="${message}"/>
+	<font color="blue">当前组织:${mallOrganize.organizeName}</font>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>机构名称</th>
+				<th>联系人</th>
+				<th>手机号</th>
+				<th>状态</th>
+				<th>添加时间</th>
+				<th>操作</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:if test="${not empty cmUserClub}">
+			<c:forEach items="${cmUserClub}" var="cmUserClub" varStatus="statusIndex">
+				<tr>
+					<td>
+						${cmUserClub.name}
+					</td>
+					<td>
+						${cmUserClub.linkMan}
+					</td>
+					<td>
+						${cmUserClub.bindMobile}
+					</td>
+					<td>
+						<c:if test="${cmUserClub.clubStatus eq 90}">
+							<font color="green">已上线</font>
+							<a href="${ctx}/weisha/user/onlineAndOffline?userOrganizeID=${mallOrganize.id}&clubID=${cmUserClub.clubID}&userID=${cmUserClub.userID}&clubStatus=91"   onclick="return confirmx('确定下线该子机构吗?', this.href)">下线</a>
+						</c:if>
+						<c:if test="${cmUserClub.clubStatus eq 91}">
+							<font color="red">已下线</font>
+							<a href="${ctx}/weisha/user/onlineAndOffline?userOrganizeID=${mallOrganize.id}&clubID=${cmUserClub.clubID}&userID=${cmUserClub.userID}&clubStatus=90"   onclick="return confirmx('确定上线该子机构吗?', this.href)" >上线</a>
+						</c:if>
+					</td>
+					<td>
+							${cmUserClub.registerTime}
+					</td>
+					<td>
+						<a href="${ctx}/weisha/user/addClubUser?id=${mallOrganize.id}&clubID=${cmUserClub.clubID}&userID=${cmUserClub.userID}">编辑</a>
+					</td>
+				</tr>
+			</c:forEach>
+		</c:if>
+		</tbody>
+	</table>
+	<c:if test="${empty cmUserClub}">
+		<p style="text-align: center;"><font  color="#1e90ff">暂无数据……</font></p>
+	</c:if>
+	<div class="pagination">${page}</div>
+</body>
+</html>

+ 542 - 0
src/main/webapp/WEB-INF/views/modules/weisha/organizeSinglePromotionForm.jsp

@@ -0,0 +1,542 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page import="java.util.*"%>
+<%@ page import="java.text.*"%>
+<%
+    String datetime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()); //获取系统时间
+    request.setAttribute("currentTime",datetime);
+%>
+<html>
+<head>
+    <title>促销活动管理</title>
+    <meta name="decorator" content="default"/>
+    <script type="text/javascript">
+        $(document).ready(function() {
+            //$("#name").focus();
+            $("#inputForm").validate({
+                submitHandler: function(form){
+                    var isSubMitFlag = true, addProductArray = [], addGiftArray = [];
+                    var mode = $("input[name='mode']:checked").val();
+                    var status = $("input[name='status']:checked").val();
+                    if (${cmOrganizePromotion.promotionProducts==null or cmOrganizePromotion.promotionProducts.size()==0}) {
+                        alertx("请选择促销商品");
+                        isSubMitFlag = false;
+                        return false;
+                    }
+                    if (${cmOrganizePromotion.promotionProducts.size()>1}) {
+                        alertx("只能选择一种商品,请删除多出的商品");
+                        isSubMitFlag = false;
+                        return false;
+                    }
+                    if (mode == "1") {
+                        if ($("#touchPrice1").val() == '') {
+                            alertx("请输入优惠价");
+                            isSubMitFlag = false;
+                            return false;
+                        }else if(isNaN($("#touchPrice1").val())||$("#touchPrice1").val().indexOf('0')==0){
+                            alertx('请输入正确的优惠价!');
+                            isSubMitFlag = false;
+                            return false;
+                        }else {
+                            var price1 = $("#price1").val();
+                            if (parseFloat($("#touchPrice1").val()) >= parseFloat(price1)) {
+                                alertx('优惠价必须小于机构价'+price1);
+                                isSubMitFlag = false;
+                                return false;
+                            }
+                        }
+                    }else if (mode == "2") {
+                        debugger
+                        if ($("#touchPrice2").val() == '') {
+                            alertx("请输入满减设定价");
+                            isSubMitFlag = false;
+                            return false;
+                        }else if(isNaN($("#touchPrice2").val())||$("#touchPrice2").val().indexOf('0')==0){
+                            alertx('请输入正确的满减设定价!');
+                            isSubMitFlag = false;
+                            return false;
+                        }else {
+                            var price1 = $("#price1").val();
+                            if (parseFloat($("#touchPrice2").val()) <parseFloat(price1)) {
+                                alertx('满减设定价需大于或等于商品机构价'+price1);
+                                isSubMitFlag = false;
+                                return false;
+                            }
+                        }
+                        if ($("#reducedPrice").val() == '') {
+                            alertx("请输入减免价格");
+                            isSubMitFlag = false;
+                            return false;
+                        }else if(isNaN($("#reducedPrice").val())||$("#reducedPrice").val().indexOf('0')==0){
+                            alertx('请输入正确的减免价格!');
+                            isSubMitFlag = false;
+                            return false;
+                        }
+                        if (parseFloat($("#reducedPrice").val()) > parseFloat($("#touchPrice2").val())) {
+                            alertx("减免价格必须小于满减设定价")
+                            isSubMitFlag = false;
+                            return false;
+                        }
+                    }else if (mode == "3") {
+                        if ($("#touchPrice3").val() == '') {
+                            alertx("请输入满赠设定价");
+                            isSubMitFlag = false;
+                            return false;
+                        }else if(isNaN($("#touchPrice3").val())||$("#touchPrice3").val().indexOf('0')==0){
+                            alertx('请输入正确的满赠设定价!');
+                            isSubMitFlag = false;
+                            return false;
+                        }else {
+                            var price1 = $("#price1").val();
+                            if (parseFloat($("#touchPrice3").val()) < parseFloat(price1)) {
+                                alertx('满赠设定价需大于或等于商品机构价'+price1);
+                                isSubMitFlag = false;
+                                return false;
+                            }
+                        }
+                    }
+                    if (mode=="3" &&( ${cmOrganizePromotion.giftProducts==null or cmOrganizePromotion.giftProducts.size()==0})) {
+                        alertx("请至少选择1个赠送的商品");
+                        isSubMitFlag = false;
+                        return false;
+                    }
+                    //将促销商品和赠品信息填充进数组
+                    $('#contentTbody tr').each(function (index, item) {
+                        var $this = $(this);
+                        var $itemProductID = $this.find('input[name="info"]').val();
+                        var obj = {
+                            productId: $itemProductID,
+                        }
+                        addProductArray.push(obj)
+                    });
+                    $('#contentTbody1 tr').each(function (index, item) {
+                        var $this = $(this);
+                        var $itemProductID = $this.find('input[name="gift"]').val();
+                        var $giftNumber = $this.find('input[name="giftNumber"]').val();
+                        if ($giftNumber == null || $giftNumber == '' ) {
+                            alertx("请输入赠品数量");
+                            isSubMitFlag = false;
+                            return false;
+                        }
+                        if ( $giftNumber <= 0 ) {
+                            alertx("赠品数量必须大于0");
+                            isSubMitFlag = false;
+                            return false;
+                        }
+                        var obj = {
+                            productId: $itemProductID,
+                            number: $giftNumber
+                        };
+                        addGiftArray.push(obj)
+                    })
+                    if (status == "2") {
+                        var $beginTime = $("#beginTime").val();
+                        var $endTime = $("#endTime").val();
+                        if ($beginTime >= $endTime) {
+                            alertx("结束时间不能早于开始时间");
+                            isSubMitFlag = false;
+                            return false;
+                        }
+                    }
+                    if (isSubMitFlag) {
+                        var productItems = JSON.stringify(addProductArray);
+                        var giftItems = JSON.stringify(addGiftArray);
+                        $("#productIds").val(productItems);
+                        $("#giftIds").val(giftItems)
+                        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);
+                    }
+                }
+            });
+        });
+        //选择添加商品
+        function showSelect(type) {
+            var showSelectProductID = '';
+            var url = '';
+            var title = '';
+            var delProductIds = $("#delProductIds").val();
+            if (type == 1) {
+                $('#contentTbody tr').each(function (index, item) {
+                    var $this = $(this);
+                    var $itemProductID = $this.find('input[name="info"]').val();
+                    showSelectProductID += $itemProductID + ',';
+                });
+                url = "${ctx}/weisha/cmOrganizePromotions/findProductPage?productIds=" + showSelectProductID + "&promotionType=1&delProductIds=" + delProductIds;
+                title = "选择促销单品";
+            } else {
+                $('#contentTbody1 tr').each(function (index, item) {
+                    var $this = $(this);
+                    var $itemProductID = $this.find('input[name="gift"]').val();
+                    showSelectProductID += $itemProductID + ',';
+                });
+                url ="${ctx}/weisha/cmOrganizePromotions/findProductPage?productIds=" + showSelectProductID
+                title = "选择促销赠品";
+            }
+            showSelectProductID = showSelectProductID.slice(0, -1)
+            console.log(showSelectProductID);
+            top.$.jBox("iframe:"+url, {
+                iframeScrolling: 'yes',
+                width: $(top.document).width() - 400,
+                height: $(top.document).height() - 160,
+                persistent: true,
+                title: title,
+                buttons: {"确定": '1', "关闭": '-1'},
+                submit: function (v, h, f) {
+                    //确定
+                    var $jboxFrame = top.$('#jbox-iframe');
+                    var $mainFrame = top.$('#mainFrame');
+                    if ('1' == v && 1 == $jboxFrame.size() && 1 == $mainFrame.size()) {
+                        var items = $jboxFrame[0].contentWindow.getCheckedItems(0);
+                        var items1 = "";
+                        var stringify = JSON.stringify(items);
+                        if (items.length > 0) {
+                            //添加数据
+                            $.post("${ctx}/product/activity/saveTemp", function (data) {
+                                if (true == data.success) {
+                                    var productIds = $("#productIds").val();
+                                    var giftIds = $("#giftIds").val();
+                                    var mode = $("input[name='mode']:checked").val();
+                                    var reducedPrice = $("#reducedPrice").val();
+                                    var touchPrice1 = $("#touchPrice1").val();
+                                    var touchPrice2 = $("#touchPrice2").val();
+                                    var touchPrice3 = $("#touchPrice3").val();
+                                    var status = $("input[name='status']:checked").val();
+                                    var beginTime = $("#beginTime").val();
+                                    var endTime = $("#endTime").val();
+                                    var delFlag1 = $("input[name='delFlag1']:checked").val();
+                                    var delProductIds = $("#delProductIds").val();
+                                    var delGiftIds = $("#delGiftIds").val();
+                                    var organizeId = $("#organizeId").val();
+                                    //将选中商品id与原来的促销商品或赠品id拼接
+                                    if (type == 1 ) {
+                                        items = items;
+                                        if (giftIds != '') {
+                                            items1 = giftIds;
+                                        }
+                                        window.location.href = "${ctx}/weisha/cmOrganizePromotions/form?type=1&productIds=" + items + "&giftIds=" + items1 + "&mode=" + mode +
+                                            "&delProductIds=" + delProductIds + "&delGiftIds=" + delGiftIds +
+                                            "&reducedPrice=" + reducedPrice + "&touchPrice1=" + touchPrice1 + "&touchPrice2=" + touchPrice2 + "&touchPrice3=" + touchPrice3 +
+                                            "&status=" + status + "&beginTime=" + beginTime + "&endTime=" + endTime + "&delFlag1=" + delFlag1 + "&id=${cmOrganizePromotion.id}" +
+                                            "&searchDbFlag=0&organizeId=" + organizeId;
+                                    }
+                                    if (type == 2) {
+                                        if (giftIds != '') {
+                                            items = items + ',' + giftIds;
+                                        }
+                                        if (productIds != '') {
+                                            items1 = productIds;
+                                        }
+                                        window.location.href = "${ctx}/weisha/cmOrganizePromotions/form?type=1&productIds=" + items1 + "&giftIds=" + items + "&mode=" + mode +
+                                            "&delProductIds="+delProductIds+"&delGiftIds="+delGiftIds+
+                                            "&reducedPrice=" + reducedPrice + "&touchPrice1=" + touchPrice1 + "&touchPrice2=" + touchPrice2 + "&touchPrice3=" + touchPrice3 +
+                                            "&status=" + status + "&beginTime=" + beginTime + "&endTime=" + endTime + "&delFlag1=" + delFlag1 + "&id=${cmOrganizePromotion.id}&organizeId=" + organizeId;
+                                    }
+                                    $.jBox.tip(data.msg, 'info');
+                                } else {
+                                    $.jBox.tip(data.msg, 'error');
+                                }
+                            }, "JSON");//这里返回的类型有:json,html,xml,text
+                            return true;
+                        } else {
+                            top.$.jBox.tip("请先勾选商品...");
+                            return false;
+                        }
+                    }
+                    return true;
+                }
+            });
+        }
+
+        function deleteProduct(obj, storeStatus,type) {
+            //将该行数据取消勾选,若存在数据库中则将其删除
+            $(".check-item[value=" + obj + "]").prop("checked", false);
+            var delProductIds = $("#delProductIds").val();
+            var delGiftIds = $("#delGiftIds").val();
+            if (storeStatus && type == 1) {
+                if (delProductIds != '') {
+                    delProductIds = delProductIds + "," + obj;
+                }else delProductIds = obj;
+            }
+            if (storeStatus && type == 2) {
+                if (delGiftIds != '') {
+                    delGiftIds = delGiftIds + "," + obj;
+                }else delGiftIds = obj;
+            }
+            window.setTimeout(function () {
+                var productItems = getCheckedItems(1);
+                var giftItems = getCheckedItems(2);
+                var mode = $("input[name='mode']:checked").val();
+                var reducedPrice = $("#reducedPrice").val();
+                var touchPrice1 = $("#touchPrice1").val();
+                var touchPrice2 = $("#touchPrice2").val();
+                var touchPrice3 = $("#touchPrice3").val();
+                var status = $("input[name='status']:checked").val();
+                var beginTime = $("#beginTime").val();
+                var endTime = $("#endTime").val();
+                var delFlag1 = $("input[name='delFlag1']:checked").val();
+                var organizeId = $("#organizeId").val();
+                window.location.href = "${ctx}/weisha/cmOrganizePromotions/form?type=1&productIds=" + productItems + "&giftIds=" + giftItems +
+                    "&delProductIds="+delProductIds+"&delGiftIds="+delGiftIds+ "&mode=" + mode +
+                    "&reducedPrice=" + reducedPrice + "&touchPrice1=" + touchPrice1 + "&touchPrice2=" + touchPrice2 + "&touchPrice3=" + touchPrice3 +
+                    "&status=" + status + "&beginTime=" + beginTime + "&endTime=" + endTime + "&delFlag1=" + delFlag1 + "&id=${cmOrganizePromotion.id}" +
+                    "&searchDbFlag=0&organizeId=" + organizeId;
+            },100)
+        }
+
+        function getCheckedItems(type) {
+            var items = new Array();
+            var $items = type==0? $('.check-item:checked'):type==1?$("#productCheckItem:checked"):$("#giftCheckItem:checked");
+            $items.each(function () {
+                items.push($(this).val());
+            });
+            return items;
+        }
+
+    </script>
+</head>
+<body>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/weisha/cmOrganizeProduct/?organizeId=${organizeId}">组织商品列表</a></li>
+    <li><a href="${ctx}/weisha/cmOrganizePromotions/list?type=1&organizeId=${cmOrganizePromotion.organizeId}">单品促销</a></li>
+    <li class="active"><a href="${ctx}/weisha/cmOrganizePromotions/form?id=${cmOrganizePromotion.id}&type=1&organizeId=${cmOrganizePromotion.organizeId}">${not empty cmOrganizePromotion.id?'编辑':'添加'}单品促销</a></li>
+</ul><br/>
+<input hidden="hidden" id="price1" value="${price1}">
+<form:form id="inputForm" modelAttribute="cmOrganizePromotion" action="${ctx}/weisha/cmOrganizePromotions/save" method="post" class="form-horizontal">
+    <form:hidden path="id"/>
+    <form:hidden path="organizeId"/>
+    <form:hidden path="type"/>
+    <form:hidden path="productIds" id="productIds"/>
+    <form:hidden path="giftIds" id="giftIds"/>
+    <form:hidden path="shopIds" id="shopIds"/>
+    <form:hidden path="delProductIds" id="delProductIds"/>
+    <form:hidden path="delGiftIds" id="delGiftIds"/>
+    <form:hidden path="searchDbFlag" id="searchDbFlag"/>
+    <sys:message content="${message}"/>
+    <div class="control-group">
+        <label><label style="color: red">*</label>促销商品:</label>
+        <label><a href="JavaScript:;" onclick="showSelect(1)">请选择促销单品</a></label>
+        <c:if test="${cmOrganizePromotion.promotionProducts !=null and cmOrganizePromotion.promotionProducts.size()>0}">
+            <table id="contentTable" class="table table-striped table-bordered table-condensed">
+                <thead>
+                <th style="width:20px;" class="hide"></th>
+                <th>商品图片</th>
+                <th>商品名称</th>
+                <th>供应商</th>
+                <th>机构价</th>
+                <th>操作</th>
+                </thead>
+                <tbody id="contentTbody">
+                <c:forEach items="${cmOrganizePromotion.promotionProducts}" var="product">
+                    <tr>
+                        <th class="hide"><input class="check-item" type="checkbox" id="productCheckItem"
+                                   name="info" ${product.storeStatus?'':'checked'}
+                                   value='${product.productID}'/></th>
+                        <td><img src="${product.mainImage}" width="50px" height="50px"></td>
+                        <td>${product.name}</td>
+                        <td>${product.shopName}</td>
+                        <td>${product.price1}</td>
+                        <td>
+                            <a href="javaScript:;"
+                               onclick="deleteProduct('${product.productID}',${product.storeStatus},1)">删除</a>
+                        </td>
+                    </tr>
+                </c:forEach>
+                </tbody>
+            </table>
+        </c:if>
+    </div>
+
+    <div class="control-group" id="promotionType">
+        <label>促销方式:</label>
+        <input type="radio"  id="promotionType1" name="mode" value="1" ${cmOrganizePromotion.mode == null ? "checked" : cmOrganizePromotion.mode == "1"?"checked":""} />优惠价
+        <input type="radio"  id="promotionType2" name="mode" value="2" ${cmOrganizePromotion.mode == "2" ? "checked" : ""} />满减
+        <input type="radio" id="promotionType3"  name="mode" value="3" ${cmOrganizePromotion.mode == "3" ? "checked" : ""} />满赠
+    </div>
+
+    <div class="control-group">
+        <label style="display: inline"><label style="color: red">*</label>优惠内容:</label>
+        <div id="discountContent1" style="display: ${cmOrganizePromotion.mode == null ? "inline" : cmOrganizePromotion.mode == "1"?"inline":"none"}" >
+            <label><font color="red">优惠价</font></label>
+            <form:input path="touchPrice1" id="touchPrice1" htmlEscape="false" maxlength="7" class="input-xlarge " onkeyup="onlynum(this)"/>
+        </div>
+        <div id="discountContent2" style="display: ${cmOrganizePromotion.mode == "2" ? "inline" : "none"}">
+            <label><font color="red">满</font></label>
+            <form:input path="touchPrice2" id="touchPrice2" htmlEscape="false" maxlength="7" class="input-xlarge " onkeyup="onlynum(this)"/>
+            <label><font color="red">减</font></label>
+            <form:input path="reducedPrice" id="reducedPrice" htmlEscape="false" maxlength="7" class="input-xlarge " onkeyup="onlynum(this)"/>
+        </div>
+        <div id="discountContent3" style="display: ${cmOrganizePromotion.mode == "3" ? "inline" : "none"}">
+            <label><font color="red">满</font></label>
+            <form:input path="touchPrice3" id="touchPrice3" htmlEscape="false" maxlength="7" class="input-xlarge" onkeyup="onlynum(this)"/>
+            <label><a href="JavaScript:;" onclick="showSelect(2)">请选择赠品</a></label>
+            <c:if test="${cmOrganizePromotion.giftProducts !=null and cmOrganizePromotion.giftProducts.size()>0}">
+                <table id="contentTable" class="table table-striped table-bordered table-condensed">
+                    <thead>
+                    <th style="width:20px;" class="hide"></th>
+                    <th></th>
+                    <th>商品图片</th>
+                    <th>商品名称</th>
+                    <th>供应商</th>
+                    <th>数量</th>
+                    <th>操作</th>
+                    </thead>
+                    <tbody id="contentTbody1">
+                    <c:forEach items="${cmOrganizePromotion.giftProducts}" var="product">
+                        <tr>
+                            <td>赠</td>
+                            <th class="hide"><input class="check-item" type="checkbox" id="giftCheckItem"
+                                                    name="gift" ${product.storeStatus?'':'checked'}
+                                                    value='${product.productID}'/></th>
+                            <td><img src="${product.mainImage}" width="50px" height="50px"></td>
+                            <td>${product.name}</td>
+                            <td>${product.shopName}</td>
+                            <td><input id="actPrice1" name="giftNumber" style="width:50px;"
+                                       value="${product.giftNumber}" type="number" maxlength="7" step="1"></td>
+                            <td>
+                                <a href="javaScript:;"
+                                   onclick="deleteProduct('${product.productID}',${product.storeStatus},2)">删除</a>
+                            </td>
+                        </tr>
+                    </c:forEach>
+                    </tbody>
+                </table>
+            </c:if>
+        </div>
+
+    </div>
+
+    <div class="control-group">
+        <label>促销时效:</label>
+        <input type="radio" name="status" value="1" ${cmOrganizePromotion.status == null ? "checked" : cmOrganizePromotion.status == "1"?"checked":""} />永久
+        <input type="radio" name="status" value="2" ${cmOrganizePromotion.status == "2" ? "checked" : ""} />区间有效
+    </div>
+
+    <div class="control-group" id="begin" style="display: ${cmOrganizePromotion.status == null ? "none" : cmOrganizePromotion.status == "1"?"none":""}" >
+        <label>开始时间:</label>
+        <input name="beginTime" type="text" readonly="readonly" maxlength="20"
+               class="input-medium Wdate required" id="beginTime"
+               value="<fmt:formatDate value="${cmOrganizePromotion.beginTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"
+               onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:false});"/>
+    </div>
+
+    <div class="control-group" id="end" style="display: ${cmOrganizePromotion.status == null ? "none" : cmOrganizePromotion.status == "1"?"none":""}" >
+        <label>结束时间:</label>
+        <input name="endTime" type="text" readonly="readonly" maxlength="20" class="input-medium Wdate required"
+               id="endTime"
+               value="<fmt:formatDate value="${cmOrganizePromotion.endTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"
+               onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:false});"/>
+    </div>
+
+    <div class="control-group">
+        <label style="display: inline" id="testStatus">促销状态:</label>
+        <label style="display: inline;color: ${cmOrganizePromotion.delFlag1 == null || cmOrganizePromotion.delFlag1 == '' ?"green":cmOrganizePromotion.delFlag1 == "0"?"red":cmOrganizePromotion.delFlag1 == "1"?"purple":cmOrganizePromotion.delFlag1 == "2"?"green":"orange"}" id="promotionStatus" >${cmOrganizePromotion.delFlag1 == null || cmOrganizePromotion.delFlag1 == '' ?"进行中":cmOrganizePromotion.delFlag1 == "0"?"已关闭":cmOrganizePromotion.delFlag1 == "1"?"未开始":cmOrganizePromotion.delFlag1 == "2"?"进行中":"已结束"}</label>
+        <input type="checkbox" id="delFlag1" name="delFlag1" value="close" ${cmOrganizePromotion.delFlag1 == null?"":cmOrganizePromotion.delFlag1 == "0" ? "checked" : ""} />关闭
+    </div>
+
+    <div class="form-actions">
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
+        <a href="${ctx}/weisha/cmOrganizePromotions/?type=1"><input id="btnCancel" class="btn" type="button" value="返 回" /></a>
+    </div>
+</form:form>
+<script type="text/javascript">
+    $(function () {
+    })
+
+    //促销方式修改
+    $("input:radio[name='mode']").click(function () {
+        var promotionType = $("input[name='mode']:checked").val();
+        if ("1" == promotionType) {
+            $("#discountContent1").attr("style","display:inline");
+            $("#discountContent2").attr("style","display:none");
+            $("#discountContent3").attr("style","display:none");
+        }else if ("2" == promotionType) {
+            $("#discountContent1").attr("style","display:none");
+            $("#discountContent2").attr("style","display:inline");
+            $("#discountContent3").attr("style","display:none");
+        } else {
+            $("#discountContent1").attr("style","display:none");
+            $("#discountContent2").attr("style","display:none");
+            $("#discountContent3").attr("style","display:inline");
+        }
+    })
+    //促销时效修改
+    $("input:radio[name='status']").click(function () {
+        var promotionStatus = $("input[name='status']:checked").val();
+        var promotiondelFlag1 = $("input[name='delFlag1']:checked").val();
+        if ("1" == promotionStatus) {
+            $("#begin").attr("style","display:none");
+            $("#end").attr("style","display:none");
+            if (null == promotiondelFlag1) {
+                $("#promotionStatus").text("进行中");
+                $("#promotionStatus").attr("style", "display: inline;color:green");
+            }
+        }else if ("2" == promotionStatus) {
+            $("#begin").attr("style","");
+            $("#end").attr("style","");
+            if (null == promotiondelFlag1) {
+                updateStatus();
+            }
+        }
+    })
+    //促销日期修改
+    $("#beginTime").blur(function () {
+        var promotiondelFlag1 = $("input[name='delFlag1']:checked").val();
+        if (null == promotiondelFlag1) updateStatus()
+    });
+    $("#endTime").blur(function () {
+        var promotiondelFlag1 = $("input[name='delFlag1']:checked").val();
+        if (null == promotiondelFlag1) updateStatus()
+    });
+    //促销状态修改
+    $("input:checkbox[name='delFlag1']").click(function () {
+        var promotiondelFlag1 = $("input[name='delFlag1']:checked").val();
+
+        if (promotiondelFlag1 != null) {
+            $("#promotionStatus").text("已关闭");
+            $("#promotionStatus").attr("style", "display: inline;color:red");
+        }else {
+            var promotionStatus = $("input[name='status']:checked").val();
+            if ("1" == promotionStatus) {
+                $("#promotionStatus").text("进行中");
+                $("#promotionStatus").attr("style", "display: inline;color:green");
+            } else updateStatus()
+        }
+    })
+
+    function updateStatus() {
+        var beginTime = $("#beginTime").val();
+        var beginMs = new Date(beginTime).getTime();
+        var endTime = $("#endTime").val();
+        var endMs = new Date(endTime).getTime();
+        var nowMs = new Date().getTime();
+        if (nowMs < beginMs) {
+            $("#promotionStatus").text("未开始");
+            $("#promotionStatus").attr("style", "display: inline;color:purple");
+        } else if (nowMs > endMs) {
+            $("#promotionStatus").text("已结束");
+            $("#promotionStatus").attr("style", "display: inline;color:orange");
+        } else {
+            $("#promotionStatus").text("进行中");
+            $("#promotionStatus").attr("style", "display: inline;color:green");
+        }
+    }
+
+    /**
+     * @param obj
+     * jquery控制input只能输入数字
+     */
+    function onlynum(obj) {
+        obj.value = obj.value.replace(/[^\d]/g, ""); //清除"数字"以外的字符
+    }
+</script>
+</body>
+</html>

+ 199 - 0
src/main/webapp/WEB-INF/views/modules/weisha/organizeSinglePromotionList.jsp

@@ -0,0 +1,199 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title>促销活动列表管理</title>
+    <meta name="decorator" content="default"/>
+    <style type="text/css">
+        .table th {
+            text-align: center;
+        }
+
+        .table td {
+            text-align: center;
+        }
+    </style>
+    <script type="text/javascript">
+        $(document).ready(function () {
+
+        });
+
+        function page(n, s) {
+            $("#pageNo").val(n);
+            $("#pageSize").val(s);
+            $("#searchForm").submit();
+            return false;
+        }
+    </script>
+</head>
+<body>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/weisha/cmOrganizeProduct/?organizeId=${organizeId}">组织商品列表</a></li>
+    <li class="active"><a href="${ctx}/weisha/cmOrganizePromotions/list?type=1&organizeId=${cmOrganizePromotion.organizeId}">单品促销</a></li>
+</ul>
+<form:form id="searchForm" modelAttribute="cmOrganizePromotion" action="${ctx}/weisha/cmOrganizePromotions/list?type=1" method="post"
+           class="breadcrumb form-search">
+    <input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
+    <input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
+    <div class="ul-form">
+        <label>商品名称:</label>
+        <form:input path="productName" htmlEscape="false" maxlength="30" class="input-medium"/>
+        <label>促销方式:</label>
+        <form:select path="mode" class="input-medium required" style="width:130px">
+            <form:option value="" label="所有"/>
+            <form:option value="1" label="优惠价"/>
+            <form:option value="2" label="满减"/>
+            <form:option value="3" label="满赠"/>
+        </form:select>
+        <label>促销时效:</label>
+        <form:select path="status" class="input-medium required" style="width:130px">
+            <form:option value="" label="所有"/>
+            <form:option value="1" label="永久"/>
+            <form:option value="2" label="区间有效"/>
+        </form:select>
+        <label>促销状态:</label>
+        <form:select path="delFlag1" class="input-medium required" style="width:130px">
+            <form:option value="" label="所有"/>
+            <form:option value="1" label="未开始"/>
+            <form:option value="2" label="进行中"/>
+            <form:option value="3" label="已结束"/>
+            <form:option value="0" label="已关闭"/>
+        </form:select>
+        &nbsp;&nbsp;<input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/>
+        &nbsp;&nbsp;&nbsp;&nbsp;<input class="btn btn-primary" style="width: 90px"
+                                       onclick="window.location='${ctx}/weisha/cmOrganizePromotions/form?type=1&organizeId=${cmOrganizePromotion.organizeId}'" value="新增单品促销"/>
+        <div class="clearfix"></div>
+    </div>
+</form:form>
+<sys:message content="${message}"/>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>ID</th>
+        <th>促销方式</th>
+        <th>优惠内容</th>
+        <th>促销时效</th>
+        <th>开始时间</th>
+        <th>结束时间</th>
+        <th>促销状态</th>
+        <th>修改时间</th>
+        <th>操作</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${page.list}" var="cmOrganizePromotion">
+        <tr>
+            <td rowspan="2">
+                    ${cmOrganizePromotion.id}
+            </td>
+            <td style="color: ${cmOrganizePromotion.mode eq 1?"green":cmOrganizePromotion.mode eq 2?"orange":"purple"}">
+                ${cmOrganizePromotion.mode eq 1?"优惠价":cmOrganizePromotion.mode eq 2?"满减":"满赠"}
+            </td>
+            <td>
+                <c:if test="${cmOrganizePromotion.mode eq 1}">
+                    优惠价:<fmt:formatNumber value="${cmOrganizePromotion.touchPrice}" pattern="#,##0.00" maxFractionDigits="2"/>
+                </c:if>
+                <c:if test="${cmOrganizePromotion.mode eq 2}">
+                    满<fmt:formatNumber value="${cmOrganizePromotion.touchPrice}" pattern="#,##0.00" maxFractionDigits="2"/>
+                    ,减<fmt:formatNumber value="${cmOrganizePromotion.reducedPrice}" pattern="#,##0.00" maxFractionDigits="2"/>
+                </c:if>
+                <c:if test="${cmOrganizePromotion.mode eq 3}">
+                    满<fmt:formatNumber value="${cmOrganizePromotion.touchPrice}" pattern="#,##0.00" maxFractionDigits="2"/>,赠品:<c:if test="${cmOrganizePromotion.giftTypeNumber > 1}">${cmOrganizePromotion.giftTypeNumber}类</c:if>${cmOrganizePromotion.giftNumber}个,详见下表
+                </c:if>
+            </td>
+            <td>
+                ${cmOrganizePromotion.status eq 1?"永久":"区间有效"}
+            </td>
+            <td>
+                <c:if test="${cmOrganizePromotion.status eq 2}">
+                    <fmt:formatDate value="${cmOrganizePromotion.beginTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+                </c:if>
+            </td>
+            <td>
+                <c:if test="${cmOrganizePromotion.status eq 2}">
+                    <fmt:formatDate value="${cmOrganizePromotion.endTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+                </c:if>
+            </td>
+            <td style="color: ${cmOrganizePromotion.delFlag1 eq 1?"purple":cmOrganizePromotion.delFlag1 eq 2?"green":cmOrganizePromotion.delFlag1 eq 3?"orange":cmOrganizePromotion.delFlag1 eq 0?"red":"black"}">
+                ${cmOrganizePromotion.delFlag1 eq 1?"未开始":cmOrganizePromotion.delFlag1 eq 2?"进行中":cmOrganizePromotion.delFlag1 eq 3?"已结束":cmOrganizePromotion.delFlag1 eq 0?"已关闭":"未知"}
+            </td>
+            <td>
+                <fmt:formatDate value="${cmOrganizePromotion.updateTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
+            </td>
+            <td>
+                <c:if test="${cmOrganizePromotion.delFlag1 eq 0}">
+                    <a href="javascript:void(0);" onclick="updateStatus(${cmOrganizePromotion.id},'open')">开启</a>
+                </c:if>
+                <c:if test="${cmOrganizePromotion.delFlag1 ne 0}">
+                    <a href="javascript:void(0);" onclick="updateStatus(${cmOrganizePromotion.id},'close')">关闭</a>
+                </c:if>
+                <a href="${ctx}/weisha/cmOrganizePromotions/form?id=${cmOrganizePromotion.id}">编辑</a>
+                <a href="javascript:void(0);" onclick="updateStatus(${cmOrganizePromotion.id},'delete')">删除</a>
+            </td>
+        </tr>
+        <tr>
+            <td colspan="8" style="text-align: left">
+                <c:if test="${cmOrganizePromotion.promotionProducts.size()>0}">
+                    <p>促销商品:</p >
+                    <c:forEach items="${cmOrganizePromotion.promotionProducts}" var="promotionProduct">
+                        <p>
+                            <img src="${promotionProduct.mainImage}" alt="图片" width="50px" height="50px">
+                            <span style="position: absolute; left: 120px;width: 550px">商品名称:${promotionProduct.name}</span>
+                            <span style="position: absolute; left: 670px;width: 430px">供应商:${promotionProduct.shopName}</span>
+                            <span style="position: absolute; left: 1100px">机构价:${promotionProduct.price1}</span>
+                        </p>
+                    </c:forEach>
+                </c:if>
+                <c:if test="${cmOrganizePromotion.giftProducts.size()>0}">
+                    <p>赠送商品:</p>
+                    <c:forEach items="${cmOrganizePromotion.giftProducts}" var="giftProduct">
+                        <p>
+                            <img src="${giftProduct.mainImage}" alt="图片" width="50px" height="50px">
+                            <span style="position: absolute; left: 120px;width: 550px">商品名称:${giftProduct.name}</span>
+                            <span style="position: absolute; left: 670px;width: 430px">供应商:${giftProduct.shopName}</span>
+                            <span style="position: absolute; left: 1100px">数量:${giftProduct.giftNumber}</span>
+                        </p>
+                    </c:forEach>
+                </c:if>
+            </td>
+        </tr>
+        <%--<c:forEach items="${cmOrganizePromotion.promotionProducts}" var="promotionProduct">
+            <tr>
+                <td><img src="${promotionProduct.mainImage}" alt="图片" width="50px" height="50px"></td>
+                <td>商品名称:${promotionProduct.name}</td>
+                <td>供应商:${promotionProduct.shopName}</td>
+                <td>机构价:${promotionProduct.price1}</td>
+            </tr>
+        </c:forEach>--%>
+        <c:forEach items="${page.list}" var="cmOrganizePromotion"></c:forEach>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${page}</div>
+<script type="text/javascript">
+    function updateStatus(id,flag) {
+        var msg = "提示信息";
+        if(flag == 'close'){
+            msg = "确定关闭该促销活动吗";
+        }else if(flag == 'open'){
+            msg = "确定开启该促销活动吗?";
+        }else if(flag == 'delete'){
+            msg = "确定删除该促销活动吗?";
+        }
+        top.$.jBox.confirm(msg,'系统提示',function(v,h,f){
+            if(v=='ok'){
+                $.post("${ctx}/weisha/cmOrganizePromotions/updateStatus",{'id': id,'flag': flag}, function(data) {
+                    if(true==data.success){
+                        $.jBox.tip(data.msg, 'info');
+                        $("#searchForm").submit();
+                    } else {
+                        $.jBox.tip(data.msg,'error');
+                    }
+                },"JSON");//这里返回的类型有:json,html,xml,text
+            }
+            return;
+        },{buttonsFocus:1,persistent: true});
+    }
+</script>
+</body>
+</html>