‘linchangsheng’ 1 день тому
батько
коміт
cca9cdaaaf

+ 47 - 0
src/main/java/com/gree/mall/contest/bean/activity/CustomSecSpecBean.java

@@ -0,0 +1,47 @@
+package com.gree.mall.contest.bean.activity;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class CustomSecSpecBean {
+
+    @Schema(description ="秒杀商品规格id")
+    private String secKillSpecId;
+
+    @Schema(description ="商品名称")
+    private String goodsName;
+
+    @Schema(description ="秒杀图片链接")
+    private String imgUrl;
+
+    @Schema(description ="划线价")
+    private String orgPrice;
+
+    @Schema(description ="已售数量")
+    private Long soldNum;
+
+    @Schema(description ="秒杀价格")
+    private BigDecimal price;
+
+    @Schema(description ="分账金额")
+    private BigDecimal amount;
+
+    @Schema(description ="秒杀开始时间")
+    private Date startTime;
+
+    @Schema(description ="秒杀结束时间")
+    private Date endTime;
+
+    @Schema(description  = "分销比例")
+    private Double sharePercent;
+
+    @Schema(description ="秒杀状态,0全部,1未开始,2进行中,3已结束,4已关闭")
+    private Integer status;
+
+
+}

+ 3 - 0
src/main/java/com/gree/mall/contest/bean/coupon/CouponBean.java

@@ -2,6 +2,7 @@ package com.gree.mall.contest.bean.coupon;
 
 import com.gree.mall.contest.plus.entity.Coupon;
 import com.gree.mall.contest.plus.entity.CouponGoods;
+import com.gree.mall.contest.plus.entity.CouponTag;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -18,5 +19,7 @@ public class CouponBean extends Coupon {
     @Schema(description = "待发券用户列表")
     private List<CouponUserTypeBean> userList;
 
+    @Schema(description = "待发券标签列表")
+    private List<CouponTag> tagList;
 
 }

+ 3 - 0
src/main/java/com/gree/mall/contest/commonmapper/CouponDateMapper.java

@@ -19,6 +19,9 @@ public interface CouponDateMapper {
     CouponDataBean data(@Param("couponId")String couponId);
 
     @InterceptorIgnore(tenantLine = "true")
+    List<CouponTagBean> couponTagDetail(@Param("couponId")String couponId);
+
+    @InterceptorIgnore(tenantLine = "true")
     List<CouponUserBean> couponTagUser(@Param("couponId")String couponId);
 
     @InterceptorIgnore(tenantLine = "true")

+ 22 - 0
src/main/java/com/gree/mall/contest/commonmapper/SecKillMapper.java

@@ -0,0 +1,22 @@
+package com.gree.mall.contest.commonmapper;
+
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.bean.activity.CustomSecSpecBean;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+@Mapper
+public interface SecKillMapper {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    IPage<CustomSecSpecBean> querySpecListforCoupon(Page<CustomSecSpecBean> objectPage, @Param("companyWechatIds") List<String> companyWechatIds,
+                                                    @Param("categoryId")String categoryId, @Param("keyword")String keyword);
+
+}

+ 22 - 0
src/main/java/com/gree/mall/contest/commonmapper/WxCustomerMapper.java

@@ -0,0 +1,22 @@
+package com.gree.mall.contest.commonmapper;
+
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.gree.mall.contest.plus.entity.CouponTag;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+@Mapper
+public interface WxCustomerMapper {
+
+    /**
+     * 查询指定企业下 与 指定标签绑定的 用户id
+     */
+    @InterceptorIgnore(tenantLine = "true")
+    List<String> queryTagUserIdList(@Param("companyWechatId")String companyWechatId, @Param("couponTags")List<CouponTag> couponTags);
+
+
+}

+ 158 - 0
src/main/java/com/gree/mall/contest/controller/pc/coupon/CouponController.java

@@ -0,0 +1,158 @@
+package com.gree.mall.contest.controller.pc.coupon;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.contest.bean.coupon.*;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.coupon.CouponLogic;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.Date;
+
+@Slf4j
+@RestController
+@Tag(name = "优惠券管理", description ="优惠券管理" )
+@RequestMapping(value = "/coupon", produces = "application/json; charset=utf-8")
+public class CouponController {
+
+    @Resource
+    CouponLogic couponLogic;
+
+    @GetMapping("/list/page")
+     @Schema(description = "优惠券列表")
+    public ResponseHelper<IPage<CouponPageBean>> page(
+            @Parameter(description = "券名称") @RequestParam(required = false) String couponName,
+            @Parameter(description = "券类型") @RequestParam(required = false) String couponType,
+            @Parameter(description = "券标志") @RequestParam(required = false) String flag,
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize,
+            HttpServletRequest request
+    ) throws RemoteServiceException {
+        IPage<CouponPageBean> page = couponLogic.page(couponName, couponType, flag, pageNum, pageSize,request);
+        return ResponseHelper.success(page);
+    }
+
+    @GetMapping("/detail")
+     @Schema(description = "券详情")
+    public ResponseHelper<CouponDetailBean> detail(
+            @Parameter(description = "id",required = true) @RequestParam String couponId
+    ) throws RemoteServiceException {
+        CouponDetailBean detail = couponLogic.detail(couponId);
+        return ResponseHelper.success(detail);
+    }
+
+    @PostMapping("/add")
+     @Schema(description = "新增券")
+    public ResponseHelper add(
+            HttpServletRequest request,
+            @Parameter(description = "object",required = true) @RequestBody CouponBean couponBean)
+            throws RemoteServiceException {
+        couponLogic.add(request, couponBean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/update")
+     @Schema(description = "修改券")
+    public ResponseHelper update(
+            HttpServletRequest request,
+            @Parameter(description = "object",required = true) @RequestBody CouponBean couponBean)
+            throws RemoteServiceException {
+        couponLogic.update(request, couponBean);
+        return ResponseHelper.success();
+    }
+
+
+    @PostMapping("/reissue")
+     @Schema(description = "补发业务员券")
+    public ResponseHelper reissueCoupon(
+            HttpServletRequest request,
+            @Parameter(description = "object",required = true) @RequestBody ReissueCouponBean reissueCouponBean)
+            throws RemoteServiceException {
+        couponLogic.reissueCoupon(request, reissueCouponBean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/change/flag")
+     @Schema(description = "券标志")
+    public ResponseHelper change(
+            @Parameter(description = "券id",required = true) @RequestParam String couponId,
+            @Parameter(description = "开始时间") @RequestParam(required = false) String startDate,
+            @Parameter(description = "结束时间") @RequestParam(required = false) String endDate,
+            @Parameter(description = "券标志:START=进行中 CANCEL=取消",required = true) @RequestParam String flag
+    ) throws RemoteServiceException {
+        couponLogic.updateFlag(couponId, startDate, endDate, flag);
+        return ResponseHelper.success();
+    }
+
+    @GetMapping("/data")
+     @Schema(description = "券数据")
+    public ResponseHelper<CouponBean> data(
+            @Parameter(description = "id",required = true) @RequestParam String couponId
+    ) throws RemoteServiceException {
+        CouponDataBean data = couponLogic.data(couponId);
+        return ResponseHelper.success(data);
+    }
+
+    @GetMapping("/userCouponDetail/query")
+     @Schema(description = "用户领取优惠券明细")
+    public ResponseHelper<IPage<UserCouponBean>> receiveCouponDetail(
+            @Parameter(description = "我的优惠券id",required = true) @RequestParam String userCouponId,
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNo,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize
+            )throws RemoteServiceException{
+        return ResponseHelper.success(couponLogic.receiveCouponDetail(userCouponId,pageNo,pageSize));
+    }
+
+    @GetMapping("/user/page")
+     @Schema(description = "获取领取优惠券用户列表")
+    public ResponseHelper<CouponBean> user(
+            HttpServletRequest request,
+            @Parameter(description = "手机号",required = false) @RequestParam(required = false) String tel,
+            @Parameter(description = "注册时间",required = false) @RequestParam(required = false) Date registerTime,
+            @Parameter(description = "keyword",required = false) @RequestParam(required = false)String keyword,
+            @Parameter(description = "角色 GENERAL=普通用户 SERVICE=业务员",required = false) @RequestParam(required = false)String type,
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNo,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize
+    ) throws RemoteServiceException {
+        return ResponseHelper.success(couponLogic.userList(request, tel,registerTime,keyword,type,pageNo,pageSize));
+    }
+
+
+    @GetMapping("/list/spec/select")
+     @Schema(description = "优惠券选择活动商品列表")
+    public ResponseHelper pageSpecGoods(
+            HttpServletRequest request,
+            @Parameter(description = "商品名称") @RequestParam(required = false) String keyword,
+            @Parameter(description = "商品分类id") @RequestParam(required = false) String categoryId,
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize
+    ) throws Exception {
+        return ResponseHelper.success(couponLogic.goodsSpecList(request, categoryId,keyword,pageNum, pageSize));
+    }
+
+
+    @GetMapping("/list/export")
+     @Schema(description = "优惠券导出")
+    public void export(HttpServletRequest request, HttpServletResponse response,
+                                                        @Parameter(description = "券名称") @RequestParam(required = false) String couponName,
+                                                        @Parameter(description = "券类型") @RequestParam(required = false) String couponType,
+                                                        @Parameter(description = "券标志") @RequestParam(required = false) String flag
+    ) throws Exception {
+        couponLogic.export(request,response,couponName, couponType, flag);
+    }
+
+
+
+
+}

+ 82 - 25
src/main/java/com/gree/mall/contest/logic/coupon/CouponLogic.java

@@ -1,18 +1,18 @@
 package com.gree.mall.contest.logic.coupon;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
 import com.gree.mall.contest.bean.ExcelData;
+import com.gree.mall.contest.bean.activity.CustomSecSpecBean;
 import com.gree.mall.contest.bean.admin.AdminUserCom;
 import com.gree.mall.contest.bean.coupon.*;
 import com.gree.mall.contest.bean.user.CurrentCompanyWechat;
 import com.gree.mall.contest.bean.user.UserCouponCountBean;
-import com.gree.mall.contest.commonmapper.CouponDateMapper;
-import com.gree.mall.contest.commonmapper.CoustomUserCouponMapper;
-import com.gree.mall.contest.commonmapper.CustomCoupouMapper;
+import com.gree.mall.contest.commonmapper.*;
 import com.gree.mall.contest.constant.Constant;
 import com.gree.mall.contest.enums.QrCodeEnum;
 import com.gree.mall.contest.enums.UserTypeEnum;
@@ -27,12 +27,15 @@ import com.gree.mall.contest.logic.user.UserLogic;
 import com.gree.mall.contest.plus.entity.*;
 import com.gree.mall.contest.plus.service.*;
 import com.gree.mall.contest.utils.CommonUtils;
+import com.gree.mall.contest.utils.DateUtils;
 import com.gree.mall.contest.utils.excel.ExcelUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -61,6 +64,9 @@ public class CouponLogic {
     private final CustomCoupouMapper customCoupouMapper;
     private final WechatLogic wechatLogic;
     private final CoustomUserCouponMapper coustomUserCouponMapper;
+    private final SecKillMapper secKillMapper;
+    private final CouponTagService couponTagService;
+    private final WxCustomerMapper wxCustomerMapper;
 
     /**
      * 优惠券列表
@@ -83,7 +89,7 @@ public class CouponLogic {
 //            couponExportBeans.addAll(couponSelfBeans);
 //        }
 
-        String[] titles = {"优惠券名称", "发放数量", "领取数量", "使用数量", "优惠券金额", "领取来源-网点名称", "领取来源-业务员昵称", "领取来源-业务员电话", "优惠券状态", "领券客户昵称", "领券客户电话",
+        String[] titles = {"优惠券名称","发放数量","领取数量","使用数量","优惠券金额", "领取来源-网点名称", "领取来源-业务员昵称", "领取来源-业务员电话", "优惠券状态", "领券客户昵称", "领券客户电话",
                 "用券时间", "订单号", "订单实付金额"};
         ExcelData excelData = new ExcelData();
         List<List<Object>> rows = new ArrayList<>();
@@ -124,6 +130,8 @@ public class CouponLogic {
         CouponDetailBean couponBean = new CouponDetailBean();
         BeanUtils.copyProperties(coupon, couponBean);
         couponBean.setGoodsList(couponGoodsService.lambdaQuery().eq(CouponGoods::getCouponId, couponId).list());
+        couponBean.setTagList(couponDateMapper.couponTagDetail(couponId));
+        couponBean.setUserList(couponDateMapper.couponTagUser(couponId));
         return couponBean;
     }
 
@@ -132,6 +140,7 @@ public class CouponLogic {
      *
      * @param couponBean
      */
+//    @Async
     @Transactional(rollbackFor = Exception.class)
     public void add(HttpServletRequest request, CouponBean couponBean) throws RemoteServiceException {
         AdminUserCom adminUser = commonLogic.getAdminUser(request);
@@ -149,7 +158,7 @@ public class CouponLogic {
         couponBean.setCreateTime(new Date());
         couponBean.setCompanyWechatId(adminUser.getLoginCompanyWechatId());
         couponBean.setCompanyName(adminUser.getLoginCompanyName());
-        couponBean.setActiveType(couponBean.getActiveDay() != null ? 2 : 1);
+        couponBean.setActiveType(couponBean.getActiveDay() != null ? 2:1);
         couponService.save(couponBean);
         String couponId = couponBean.getCouponId();
         if (couponBean.getCouponType().trim().equals(CouponTypeEnum.GOODS.getName()) && couponBean.getGoodsList() != null) {
@@ -163,6 +172,31 @@ public class CouponLogic {
             }
             couponGoodsService.saveBatch(couponGoodsList);
         }
+        //指定标签
+        if (couponBean.getReceiveCrowd() == CouponCrowdEnum.TAG.getFlag() && couponBean.getTagList() != null) {
+            List<String> userIds = wxCustomerMapper.queryTagUserIdList(adminUser.getLoginCompanyWechatId(), couponBean.getTagList());
+            List<CouponTag> couponTagList = new ArrayList<>();
+            for (CouponTag couponTag : couponBean.getTagList()) {
+                couponTag.setCouponId(couponId);
+                couponTag.setCreateTime(new Date());
+                couponTag.setCompanyId(adminUser.getLoginCompanyWechatId());
+                couponTag.setCompanyName(adminUser.getLoginCompanyName());
+                couponTagList.add(couponTag);
+            }
+            couponTagService.saveBatch(couponTagList);
+
+            List<CouponUser> couponUserList = new ArrayList<>();
+            CouponUser couponUser = new CouponUser();
+            for (String userId : userIds) {
+                couponUser.setCouponId(couponId);
+                couponUser.setUserId(userId);
+                couponUser.setCreateTime(new Date());
+                couponUser.setCouponUserId(adminUser.getLoginCompanyWechatId());
+                couponUser.setCompanyName(adminUser.getAdminCompanyWechat().getCompanyName());
+                couponUserList.add(couponUser);
+            }
+            couponUserService.saveBatch(couponUserList);
+        }
 
         //指定会员
         if (couponBean.getReceiveCrowd().equals(CouponCrowdEnum.SPECIFY.getFlag()) && couponBean.getUserList() != null) {
@@ -219,7 +253,7 @@ public class CouponLogic {
             }
         }
         //全部普通用户
-        if (couponBean.getReceiveCrowd().equals(CouponCrowdEnum.ALL_GENRERAL.getFlag())) {
+        if (couponBean.getReceiveCrowd() == CouponCrowdEnum.ALL_GENRERAL.getFlag()) {
             List<CouponUser> couponUserList = new ArrayList<>();
             List<User> userList = userService.lambdaQuery()
                     .eq(User::getType, UserTypeEnum.GENERAL.toString())
@@ -244,7 +278,7 @@ public class CouponLogic {
     }
 
 
-    private UserCoupon assignCoupon(AdminUserCom adminUserCom, CouponBean couponBean, String userId) {
+    private UserCoupon assignCoupon(AdminUserCom adminUserCom,CouponBean couponBean, String userId) {
         UserCoupon userCoupon = new UserCoupon();
         userCoupon.setCompanyWechatId(adminUserCom.getLoginCompanyWechatId());
         userCoupon.setCouponName(adminUserCom.getLoginCompanyName());
@@ -261,19 +295,19 @@ public class CouponLogic {
         if (couponBean.getActiveDay() == null) {
             couponBean.setActiveDay(0);
         }
-        if (couponBean.getActiveType().equals(CouponActiveTypeEnum.COMMON.getActiveType())) {
+        if (couponBean.getActiveType() == CouponActiveTypeEnum.COMMON.getActiveType()) {
             userCoupon.setActiveStartTime(couponBean.getActiveStartTime());
             userCoupon.setActiveEndTime(couponBean.getActiveEndTime());
         }
         //当日起多少天
-        if (couponBean.getActiveType().equals(CouponActiveTypeEnum.TODAY.getActiveType())) {
-            userCoupon.setActiveStartTime(DateUtil.parseTime(DateUtil.formatDate(DateUtil.date()) + " 00:00:00"));
-            userCoupon.setActiveEndTime(DateUtil.parseTime(DateUtil.formatDate(DateUtil.offsetDay(DateUtil.date(), couponBean.getActiveDay())) + " 23:59:59"));
+        if (couponBean.getActiveType() == CouponActiveTypeEnum.TODAY.getActiveType()) {
+            userCoupon.setActiveStartTime(DateUtils.getStartTime());
+            userCoupon.setActiveEndTime(DateUtils.getStartTimeByDay(couponBean.getActiveDay()));
         }
         //次日起多少天
-        if (couponBean.getActiveType().equals(CouponActiveTypeEnum.NEXTDAY.getActiveType())) {
-            userCoupon.setActiveStartTime(DateUtil.parseTime(DateUtil.formatDate(DateUtil.offsetDay(DateUtil.date(), 1)) + " 00:00:00"));
-            userCoupon.setActiveEndTime(DateUtil.parseTime(DateUtil.formatDate(DateUtil.offsetDay(DateUtil.date(), couponBean.getActiveDay() + 1)) + " 23:59:59"));
+        if (couponBean.getActiveType() == CouponActiveTypeEnum.NEXTDAY.getActiveType()) {
+            userCoupon.setActiveStartTime(DateUtils.getStartTimeByDay(1));
+            userCoupon.setActiveEndTime(DateUtils.getStartTimeByDay(couponBean.getActiveDay() + 1));
         }
         userCoupon.setState(new Date().before(couponBean.getActiveEndTime()) && new Date().after(couponBean.getActiveStartTime()));
         return userCoupon;
@@ -295,8 +329,8 @@ public class CouponLogic {
             throw new RemoteServiceException("优惠券超过领取时间");
         }
         List<CouponUserTypeBean> userIds = reissueCouponBean.getUserIds();
-        if (CollectionUtil.isEmpty(userIds)) {
-            userIds = couponDateMapper.reissueCouponUser(loginCompanyWechatId, coupon.getCouponId());
+        if (CollectionUtils.isEmpty(userIds)) {
+            userIds = couponDateMapper.reissueCouponUser(loginCompanyWechatId,coupon.getCouponId());
         }
         List<CouponUser> couponUserList = new ArrayList<>();
         List<UserCoupon> userCouponList = new ArrayList<>();
@@ -354,6 +388,19 @@ public class CouponLogic {
                     couponGoodsService.save(couponGoods);
                 }
             }
+            //清除会员
+            if (couponBean.getTagList() != null && couponBean.getTagList().size() > 0) {
+                couponTagService.lambdaUpdate()
+                        .eq(CouponTag::getCouponId, couponBean.getCouponId())
+                        .remove();
+                for (CouponTag couponTag : couponBean.getTagList()) {
+                    couponTag.setCouponId(couponBean.getCouponId());
+                    couponTag.setCreateTime(now);
+                    couponTag.setCompanyId(loginCompanyWechatId);
+                    couponTag.setCompanyName(loginCompanyName);
+                    couponTagService.save(couponTag);
+                }
+            }
 
             if (couponBean.getUserList() != null && couponBean.getUserList().size() > 0) {
                 couponUserService.lambdaUpdate()
@@ -480,13 +527,14 @@ public class CouponLogic {
 
     /**
      * 领取优惠券明细
-     *
      * @param userCouponId
      * @param pageNo
      * @param pageSize
      * @return
      */
-    public IPage<UserCouponBean> receiveCouponDetail(String userCouponId, Integer pageNo, Integer pageSize) {
+    public IPage<UserCouponBean> receiveCouponDetail(String userCouponId,Integer pageNo,Integer pageSize){
+
+        //UserCoupon uc = userCouponService.getById(userCouponId);
 
         IPage page = userCouponService.lambdaQuery()
                 .eq(UserCoupon::getTransferor, userCouponId)
@@ -495,10 +543,10 @@ public class CouponLogic {
                 .page(new Page<>(pageNo, pageSize));
 
         List<UserCouponBean> list = new ArrayList<>();
-        for (Object o : page.getRecords()) {
-            UserCoupon userCoupon = (UserCoupon) o;
+        for(Object o : page.getRecords()){
+            UserCoupon userCoupon = (UserCoupon)o;
             UserCouponBean couponUser = new UserCouponBean();
-            BeanUtils.copyProperties(userCoupon, couponUser);
+            BeanUtils.copyProperties(userCoupon,couponUser);
             User user = userService.getById(userCoupon.getUserId());
             couponUser.setUserName(user.getNickName());
             couponUser.setMobile(user.getMobile());
@@ -516,7 +564,7 @@ public class CouponLogic {
         List<String> companyWechatIds = adminUser.getCompanyWechatIds();
 
         return userService.lambdaQuery()
-                .in(CollectionUtil.isNotEmpty(companyWechatIds), User::getCompanyWechatId, companyWechatIds)
+                .in(CollectionUtils.isNotEmpty(companyWechatIds), User::getCompanyWechatId, companyWechatIds)
                 .eq(StringUtils.isNotEmpty(type), User::getType, type)
                 .ge(registerTime != null, User::getCreateTime, registerTime)
                 .like(StringUtils.isNotEmpty(tel), User::getMobile, tel.trim())
@@ -525,12 +573,21 @@ public class CouponLogic {
                 .page(new Page<>(pageNo, pageSize));
     }
 
+    public IPage<CustomSecSpecBean> goodsSpecList(HttpServletRequest request, String categoryId, String keyword, Integer pageNum, Integer pageSize) {
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+
+        return secKillMapper.querySpecListforCoupon(new Page<>(pageNum, pageSize), adminUser.getCompanyWechatIds(), categoryId, keyword);
+    }
+
+
+
+
     /**
      * 订单取消,恢复优惠券
      */
     @Transactional
     public void refundCoupon(String userCouponId) {
-        if (StringUtils.isEmpty(userCouponId)) {
+        if(StringUtils.isEmpty(userCouponId)){
             return;
         }
         userCouponService.lambdaUpdate()
@@ -544,7 +601,7 @@ public class CouponLogic {
         }
         log.info("订单取消,恢复用户优惠券id{}", userCouponId);
         UserCoupon userCoupon = userCouponService.getById(userCouponId);
-        if (userCoupon.getTransferType() != null && userCoupon.getTransferType()) {
+        if(userCoupon.getTransferType() != null && userCoupon.getTransferType()){
             userCoupon.setLeftShareTimes(userCoupon.getLeftShareTimes() + 1);
             userCoupon.updateById();
         }

+ 596 - 0
src/main/java/com/gree/mall/contest/utils/DateUtils.java

@@ -0,0 +1,596 @@
+package com.gree.mall.contest.utils;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class DateUtils {
+
+
+    public static Date parseDate(String date) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.parse(date);
+    }
+    public static Date parseDate1(String date) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.parse(date);
+    }
+
+    public static Date parseDate3(String date) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return sdf.parse(date);
+    }
+
+    public static Date parseDate2(String date) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        return sdf.parse(date);
+    }
+
+    public static String formatDate(Date date) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            return sdf.format(date);
+        }catch(Exception e){
+            return "";
+        }
+    }
+
+    public static String formatDate1(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(date);
+    }
+
+    public static String formatDateHm(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+        return sdf.format(date);
+    }
+
+    public static String formatDateByCl(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        return sdf.format(date);
+    }
+
+    public static String formatDate2(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
+        return sdf.format(date);
+    }
+
+    public static String formatDate3(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
+        return sdf.format(date);
+    }
+
+    /*
+     * 获取当前时间天数
+     * */
+    public static Date getTimeByDay(Integer day) {
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.DATE, day);
+        c.set(Calendar.HOUR_OF_DAY, 23);
+        c.set(Calendar.MINUTE, 59);
+        c.set(Calendar.SECOND, 59);
+        c.set(Calendar.MILLISECOND, 0);
+        return c.getTime();
+    }
+
+    /*
+     * 获取当前时间天数
+     * */
+    public static Date getTimeByMin(Date dt,Integer min) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar rightNow = Calendar.getInstance();
+        rightNow.setTime(dt);
+        rightNow.add(Calendar.MINUTE, min);
+        Date dt1 = rightNow.getTime();
+        return dt1;
+    }
+
+    public static String getTimeByMonth(Date dt,Integer month) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar rightNow = Calendar.getInstance();
+        rightNow.setTime(dt);
+        rightNow.add(Calendar.MONTH, month);
+        Date dt1 = rightNow.getTime();
+        String reStr = sdf.format(dt1);
+        return reStr;
+    }
+
+    /**
+     * 获取本月第一天的开始时间
+     */
+    public static Date getStartMonth() {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar calendar = Calendar.getInstance();
+        Date theDate = calendar.getTime();
+        GregorianCalendar gcLast = (GregorianCalendar) Calendar.getInstance();
+        gcLast.setTime(theDate);
+        //设置为第一天
+        gcLast.set(Calendar.DAY_OF_MONTH, 1);
+        gcLast.set(Calendar.HOUR_OF_DAY, 0);
+        gcLast.set(Calendar.MINUTE, 0);
+        gcLast.set(Calendar.SECOND, 0);
+        gcLast.set(Calendar.MILLISECOND, 0);
+        //     String day_first=sf.format(gcLast.getTime());
+        //打印本月第一天
+        //     System.out.println(day_first);
+        return gcLast.getTime();
+    }
+
+    /**
+     * 获取本月的最后一天的结束时间
+     */
+
+    public static Date getEndMonth() {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        return calendar.getTime();
+    }
+
+    /**
+     * 获取当前的开始时间
+     *
+     * @return
+     */
+
+    public static Date getStartTime() {
+        Calendar todayStart = Calendar.getInstance();
+        todayStart.set(Calendar.HOUR_OF_DAY, 0);
+        todayStart.set(Calendar.MINUTE, 0);
+        todayStart.set(Calendar.SECOND, 0);
+        todayStart.set(Calendar.MILLISECOND, 0);
+        return todayStart.getTime();
+    }
+
+    public static Date getStartTimeByDay(int day) {
+        Calendar todayStart = Calendar.getInstance();
+        todayStart.add(Calendar.DAY_OF_MONTH,day);
+        todayStart.set(Calendar.HOUR_OF_DAY, 0);
+        todayStart.set(Calendar.MINUTE, 0);
+        todayStart.set(Calendar.SECOND, 0);
+        todayStart.set(Calendar.MILLISECOND, 0);
+        return todayStart.getTime();
+    }
+
+    /**
+     * 获取当前的结束时间
+     *
+     * @return
+     */
+    public static Date getEndTime() {
+        Calendar todayEnd = Calendar.getInstance();
+        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
+        todayEnd.set(Calendar.MINUTE, 59);
+        todayEnd.set(Calendar.SECOND, 59);
+        todayEnd.set(Calendar.MILLISECOND, 999);
+        return todayEnd.getTime();
+    }
+
+    public static Date getEndTimeByDay(int num) {
+        Calendar todayEnd = Calendar.getInstance();
+        todayEnd.add(Calendar.DAY_OF_MONTH,num);
+        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
+        todayEnd.set(Calendar.MINUTE, 59);
+        todayEnd.set(Calendar.SECOND, 59);
+        todayEnd.set(Calendar.MILLISECOND, 999);
+        return todayEnd.getTime();
+    }
+
+    /**
+     * 获取昨天的开始时间
+     *
+     * @return
+     */
+    public static Date getBeginDayOfYesterday() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getStartTime());
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+    /**
+     * 获取昨天的结束时间
+     *
+     * @return
+     */
+
+    public static Date getEndDayOfYesterDay() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getEndTime());
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+
+    /**
+     * 日期转周几
+     *
+     * @param datetime
+     * @return
+     */
+    public static String dateToWeek(String datetime) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        Date parse = sdf.parse(datetime);
+
+        return dateToWeek(parse);
+    }
+
+    /**
+     * 日期转周几
+     *
+     * @param datetime
+     * @return
+     */
+    public static int dateToWeek1(String datetime) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        Date parse = sdf.parse(datetime);
+
+        return dateToWeek1(parse);
+    }
+
+    /**
+     * 日期转周几
+     *
+     * @param datetime
+     * @return
+     */
+    public static String dateToWeek(Date datetime) {
+        String[] weekDays = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
+        Calendar cal = Calendar.getInstance(); // 获得一个日历
+
+        cal.setTime(datetime);
+
+        int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
+        if (w < 0)
+            w = 0;
+        return weekDays[w];
+    }
+
+    /**
+     * 日期转周几
+     *
+     * @param datetime
+     * @return
+     */
+    public static int dateToWeek1(Date datetime) {
+        Calendar cal = Calendar.getInstance(); // 获得一个日历
+
+        cal.setTime(datetime);
+
+        int w = cal.get(Calendar.DAY_OF_WEEK); // 指示一个星期中的某天。
+        if (w < 0)
+            w = 0;
+        return w;
+    }
+
+    /**
+     * 获取前5分钟的时间
+     * @return
+     */
+    public static Date getBefore5Minute(){
+        Calendar beforeTime = Calendar.getInstance();
+        beforeTime.add(Calendar.MINUTE, -5);// 5分钟之前的时间
+        Date beforeD = beforeTime.getTime();
+        return beforeD;
+    }
+
+
+
+    /**
+     * 获取前一小时的开始时间
+     */
+
+    public static Date getStartHour() {
+
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String date = format.format(new Date());
+        Calendar c = Calendar.getInstance();
+        String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY) - 1);
+        String startTime = date + " " + hour + ":00:00";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date data = null;
+        try {
+            data = sdf.parse(startTime);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return data;
+    }
+
+    /**
+     * 获取前一小时的结束时间
+     */
+
+    public static Date getEndHour() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String date = format.format(new Date());
+        Calendar c = Calendar.getInstance();
+        String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY) - 1);
+        String endTime = date + " " + hour + ":59:59";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date data = null;
+        try {
+            data = sdf.parse(endTime);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return data;
+    }
+
+    /**
+     * 获取上个月的开始时间
+     *
+     * @return
+     */
+
+    public static Date getStartLastMonth() {
+        Calendar c = Calendar.getInstance();
+        c.set(Calendar.MONTH, c.get(Calendar.MONTH) - 1);
+        c.set(Calendar.DAY_OF_MONTH, 1);
+        c.set(Calendar.HOUR_OF_DAY, 0);
+        c.set(Calendar.MINUTE, 0);
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        return c.getTime();
+    }
+
+    /**
+     * 获取上个月的结束时间
+     *
+     * @return
+     */
+
+    public static Date getEndLastMonth() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.MONTH, -1);
+        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        return calendar.getTime();
+    }
+
+    /**
+     * 获取近七天的开始时间
+     */
+
+    public static Date geStartSevenDays() {
+
+        //    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.DATE, -7);
+        c.set(Calendar.HOUR_OF_DAY, 0);
+        c.set(Calendar.MINUTE, 0);
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+        //      Date monday = c.getTime();
+        //       String preMonday = sdf.format(monday);
+        return c.getTime();
+    }
+
+    /**
+     * 获取近七天的结束时间
+     *
+     * @return
+     */
+
+    public static Date getEndSevenDays() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getEndTime());
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+    /**
+     * 获取每个月的天数
+     */
+    public static int getDaysOfMonth(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+    }
+
+    /**
+     * 获取前天开始时间
+     *
+     * @return
+     */
+    public static Date getStartTakeDay() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getBeginDayOfYesterday());
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+    /**
+     * 获取前天结束时间
+     *
+     * @return
+     */
+
+    public static Date getEndTakeDay() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getEndDayOfYesterDay());
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+    /**
+     * 根据身份编号获取年龄
+     *
+     * @param birthDay yyyy-MM-dd
+     * @return 年龄
+     */
+    public static int getAgeByDate(String birthDay) {
+        String year = birthDay.substring(0, 4);
+        Calendar cal = Calendar.getInstance();
+        int iCurrYear = cal.get(Calendar.YEAR);
+        int iAge = iCurrYear - Integer.valueOf(year);
+        return iAge;
+    }
+
+    /**
+     * 当前日期加上天数后的日期
+     *
+     * @param num 为增加的天数
+     * @return
+     */
+    public static String DateAddDay(int num) {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar ca = Calendar.getInstance();
+        // num为增加的天数,可以改变的
+        ca.add(Calendar.DATE, num);
+        Date d = ca.getTime();
+        String enddate = format.format(d);
+        return enddate;
+    }
+
+    /*
+    判读时间差距,两个时间相差多少天,时,分,秒
+     */
+    public static Long getDay(String date) {
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Long days = null;
+        try {
+            Date currentTime = dateFormat.parse(dateFormat.format(new Date()));//现在系统当前时间
+            Date pastTime = dateFormat.parse(date);//过去时间
+            long diff = currentTime.getTime() - pastTime.getTime();
+            days = diff / (1000 * 60 * 60 * 24);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return days;
+    }
+
+
+    /**
+     * 通过时间秒毫秒数判断两个时间的间隔
+     * @return
+     */
+    public static int differentDaysByMillisecond(String date2) throws ParseException {
+        date2 = date2+" 00:00:00";
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+        Date newDate = new Date();
+        String date1 = format1.format(newDate)+" 00:00:00";
+        int days = (int) ((format.parse(date2).getTime() - format.parse(date1).getTime()) / (1000*3600*24));
+        return days;
+    }
+
+
+    /**
+     * 计算时间
+     * @param startTime : 开始时间
+     * @param endTime  : 结束时间
+     * @return
+     */
+    public static int DateSubOfDay(Date startTime,Date endTime) {
+
+        Long l = 0L;
+
+        long ts = startTime.getTime();
+        long ts1 = endTime.getTime();
+
+        l = (ts - ts1) / (1000 * 60 * 60 * 24);
+
+        return l.intValue();
+    }
+
+
+    /**
+     * 计算 时间 + 几天  或者 - 几天
+     * @param date
+     * @param dayNum
+     * @return
+     */
+    public static Date getTimeByDay(Date date,int dayNum) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DAY_OF_MONTH, dayNum);
+        date = calendar.getTime();
+        return date;
+    }
+
+    /**
+     * 计算 时间 + 几年  或者 - 几年
+     * @param date
+     * @param year
+     * @return
+     */
+    public static Date getTimeByYear(Date date,int year) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.YEAR, year);//+1今天的时间加一天
+        date = calendar.getTime();
+        return date;
+    }
+
+    /**
+     * 返回今天是周几,星期天等于1,星期一等于2.....星期六等于7
+     * @return
+     */
+    public static int getWeekDay(){
+        Calendar calendar = Calendar.getInstance();
+        int day = calendar.get(Calendar.DAY_OF_WEEK);
+        return day;
+    }
+
+    /**
+     * 获取两个时间中的每一天,不包括结束时间
+     * @param bigtimeStr 开始时间 yyyy-MM-dd
+     * @param endTimeStr 结束时间 yyyy-MM-dd
+     * @return
+     * @throws ParseException
+     */
+    public static List<String> getFormatDays(String bigtimeStr, String endTimeStr) throws ParseException {
+        Date bigtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(bigtimeStr + " 00:00:00");
+        Date endtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(endTimeStr + " 00:00:00");
+        //定义一个接受时间的集合
+        List<Date> lDate = new ArrayList<>();
+        lDate.add(bigtime);
+        Calendar calBegin = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calBegin.setTime(bigtime);
+        Calendar calEnd = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calEnd.setTime(endtime);
+        // 测试此日期是否在指定日期之后
+        while (endtime.after(calBegin.getTime()))  {
+            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+            calBegin.add(Calendar.DAY_OF_MONTH, 1);
+            lDate.add(calBegin.getTime());
+        }
+        List<String> datas = new LinkedList<>();
+        for (Date date : lDate) {
+            datas.add(new SimpleDateFormat("yyyy-MM-dd").format(date));
+        }
+        datas.remove(datas.size()-1);
+        return datas;
+    }
+
+    /**
+     * 获取当前日期的前后几天 +1day  -1day
+     * @return
+     */
+    public static Date getCurDateWithMinTimeByDay(int day) {
+
+        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date=new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DAY_OF_MONTH, day);
+        date = calendar.getTime();
+        return date;
+    }
+
+
+
+}

+ 12 - 0
src/main/resources/mapper/CouponDateMapper.xml

@@ -207,6 +207,18 @@
             and uc.user_id = ur.user_id
         )
     </select>
+    <select id="couponTagDetail" resultType="com.gree.mall.contest.bean.coupon.CouponTagBean">
+                SELECT ct.coupon_tag_id,
+               tg.`name`,
+               tg.tag_id         AS tagId,
+               gr.tag_group_name AS groupName,
+               gr.tag_group_id   AS groupId
+        FROM coupon_tag ct
+                 LEFT JOIN tag tg ON tg.tag_id = ct.tag_id
+                 LEFT JOIN tag_group gr ON tg.group_id = gr.tag_group_id
+        WHERE ct.coupon_id = #{couponId}
+        ORDER BY ct.create_time ASC
+    </select>
 
 
 </mapper>

+ 28 - 0
src/main/resources/mapper/SecKillMapper.xml

@@ -0,0 +1,28 @@
+<?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.gree.mall.contest.commonmapper.SecKillMapper">
+
+    <select id="querySpecListforCoupon" resultType="com.gree.mall.contest.bean.activity.CustomSecSpecBean">
+        select gs.goods_id,gs.goods_spec_id,gds.goods_name, gs.price as goodsPrice,gs.stock_num,gs.name,gs.spec_value,gs.img_url,gs.share_amount as amount
+        from goods_spec gs left join goods gds on gs.goods_id=gds.goods_id
+        where gs.del=0 and  gds.del = 0 and gds.status=1
+        <if test="keyword != null and keyword !=''">
+            and gds.goods_name like concat('%',#{keyword,jdbcType=VARCHAR},'%')
+        </if>
+        <if test="categoryId != null and categoryId !=''">
+            and gds.category_id = #{categoryId}
+        </if>
+        <if test="companyWechatIds != null and companyWechatIds.size > 0">
+            and gs.company_wechat_id in
+            <foreach item="item" index="index" collection="companyWechatIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        group by gds.goods_id
+        order by gds.create_time
+    </select>
+
+
+
+
+</mapper>

+ 20 - 0
src/main/resources/mapper/WxCustomerMapper.xml

@@ -0,0 +1,20 @@
+<?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.gree.mall.contest.commonmapper.WxCustomerMapper">
+
+
+    <select id="queryTagUserIdList" resultType="java.lang.String">
+        select ur.user_id
+        from user_tag ut
+        left JOIN user ur on ut.union_id = ur.union_id
+        WHERE
+        ur.company_wechat_id = #{companyWechatId}
+        and ut.tag_id in
+        <foreach item="item" index="index" collection="couponTags" open="(" separator="," close=")">
+            #{item.tagId}
+        </foreach>
+        GROUP BY ur.user_id
+    </select>
+
+
+</mapper>